#!/bin/sh
#
# Copyright (c) 2009 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This script is part of the vivaldi package.
#
# It creates the repository configuration file for package updates, and it
# monitors that config to see if it has been disabled by the overly aggressive
# distro upgrade process (e.g.  intrepid -> jaunty). When this situation is
# detected, the respository will be re-enabled. If the respository is disabled
# for any other reason, this won't re-enable it.
#
# This functionality can be controlled by creating the $DEFAULTS_FILE and
# setting "repo_add_once" and/or "repo_reenable_on_distupgrade" to "true" or
# "false" as desired. An empty $DEFAULTS_FILE is the same as setting both values
# to "false".

# System-wide package configuration.
DEFAULTS_FILE="/etc/default/vivaldi"

# sources.list setting for vivaldi updates.
REPOCONFIG="deb http://repo.vivaldi.com/stable/deb/ stable main"
REPOCONFIGREGEX="deb (\[arch=[^]]*\bamd64\b[^]]*\][[:space:]]*) https?://repo.vivaldi.com/archive/deb/ stable main"

APT_GET="`which apt-get 2> /dev/null`"
APT_CONFIG="`which apt-config 2> /dev/null`"

SOURCES_PREAMBLE="### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# You may comment out this entry, but any other modifications may be lost.\n"

# Parse apt configuration and return requested variable value.
apt_config_val() {
  APTVAR="$1"
  if [ -x "$APT_CONFIG" ]; then
    "$APT_CONFIG" dump | sed -e "/^$APTVAR /"'!d' -e "s/^$APTVAR \"\(.*\)\".*/\1/"
  fi
}

# Remove expired repository/package signing key (C3401E12), if present.
remove_old_key() {
  APT_KEY="`which apt-key 2>/dev/null`"
  if [ -x "$APT_KEY" ]; then
    if "$APT_KEY" list 2>/dev/null | grep -qF C3401E12; then
      "$APT_KEY" del C3401E12 >/dev/null 2>&1
    fi
  fi
}

# Install the repository/package signing key (EFB20B23), if it isn't already.
install_key() {
  APT_KEY="`which apt-key 2>/dev/null`"
  if [ -x "$APT_KEY" ]; then
    if ! "$APT_KEY" list 2>/dev/null | grep -qF EFB20B23; then
      "$APT_KEY" add - >/dev/null 2>&1 <<KEYDATA
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

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
=/TZJ
-----END PGP PUBLIC KEY BLOCK-----
KEYDATA
    fi
  fi
}

# Install another key (4A3AA3D6), if it isn't already, for future use.
install_future_key() {
  APT_KEY="`which apt-key 2>/dev/null`"
  if [ -x "$APT_KEY" ]; then
    if ! "$APT_KEY" list 2>/dev/null | grep -qF 4A3AA3D6; then
      "$APT_KEY" add - >/dev/null 2>&1 <<KEYDATA
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

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
=plXO
-----END PGP PUBLIC KEY BLOCK-----
KEYDATA
    fi
  fi
}

# Set variables for the locations of the apt sources lists.
find_apt_sources() {
  eval $("$APT_CONFIG" shell APT_SOURCESDIR 'Dir::Etc::sourceparts/d')
}

# Update the Google repository if it's not set correctly.
# Note: this doesn't necessarily enable the repository, it just makes sure the
# correct settings are available in the sources list.
# Returns:
# 0 - no update necessary
# 2 - error
update_bad_sources() {
  if [ ! "$REPOCONFIG" ]; then
    return 0
  fi

  find_apt_sources

  SOURCELIST="$APT_SOURCESDIR/vivaldi.list"
  # Don't do anything if the file isn't there, since that probably means the
  # user disabled it.
  if [ ! -r "$SOURCELIST" ]; then
    return 0
  fi

  # Basic check for active configurations (non-blank, non-comment lines).
  ACTIVECONFIGS=$(grep -v "^[[:space:]]*\(#.*\)\?$" "$SOURCELIST" 2>/dev/null)

  # Check if the correct repository configuration is in there.
  REPOMATCH=$(grep -E "^[[:space:]#]*\b$REPOCONFIGREGEX\b" "$SOURCELIST" \
    2>/dev/null)

  # Check if the correct repository is disabled.
  MATCH_DISABLED=$(echo "$REPOMATCH" | grep "^[[:space:]]*#" 2>/dev/null)

  # Now figure out if we need to fix things.
  BADCONFIG=1
  if [ "$REPOMATCH" ]; then
    # If it's there and active, that's ideal, so nothing to do.
    if [ ! "$MATCH_DISABLED" ]; then
      BADCONFIG=0
    else
      # If it's not active, but neither is anything else, that's fine too.
      if [ ! "$ACTIVECONFIGS" ]; then
        BADCONFIG=0
      fi
    fi
  fi

  if [ $BADCONFIG -eq 0 ]; then
    return 0
  fi

  # At this point, either the correct configuration is completely missing, or
  # the wrong configuration is active. In that case, just abandon the mess and
  # recreate the file with the correct configuration. If there were no active
  # configurations before, create the new configuration disabled.
  DISABLE=""
  if [ ! "$ACTIVECONFIGS" ]; then
    DISABLE="#"
  fi
  printf "$SOURCES_PREAMBLE" > "$SOURCELIST"
  printf "$DISABLE$REPOCONFIG\n" >> "$SOURCELIST"
  if [ $? -eq 0 ]; then
    return 0
  fi
  return 2
}

# Add the Google repository to the apt sources.
# Returns:
# 0 - sources list was created
# 2 - error
create_sources_lists() {
  if [ ! "$REPOCONFIG" ]; then
    return 0
  fi

  find_apt_sources

  SOURCELIST="$APT_SOURCESDIR/vivaldi.list"
  if [ -d "$APT_SOURCESDIR" ]; then
    printf "$SOURCES_PREAMBLE" > "$SOURCELIST"
    printf "$REPOCONFIG\n" >> "$SOURCELIST"
    if [ $? -eq 0 ]; then
      return 0
    fi
  fi
  return 2
}

# Remove our custom sources list file.
# Returns:
# 0 - successfully removed, or not configured
# !0 - failed to remove
clean_sources_lists() {
  if [ ! "$REPOCONFIG" ]; then
    return 0
  fi

  find_apt_sources

  rm -f "$APT_SOURCESDIR/vivaldi.list"
}

# Detect if the repo config was disabled by distro upgrade and enable if
# necessary.
handle_distro_upgrade() {
  if [ ! "$REPOCONFIG" ]; then
    return 0
  fi

  find_apt_sources
  SOURCELIST="$APT_SOURCESDIR/vivaldi.list"
  if [ -r "$SOURCELIST" ]; then
    REPOLINE=$(grep -E "^[[:space:]]*#[[:space:]]*$REPOCONFIGREGEX[[:space:]]*# disabled on upgrade to .*" "$SOURCELIST")
    if [ $? -eq 0 ]; then
      sed -i -e "s,^[[:space:]]*#[[:space:]]*\(.*\)[[:space:]]*# disabled on upgrade to .*,\1," \
        "$SOURCELIST"
      LOGGER=$(which logger 2> /dev/null)
      if [ "$LOGGER" ]; then
        "$LOGGER" -t "$0" "Reverted repository modification: $REPOLINE."
      fi
    fi
  fi
}

DEFAULT_ARCH="amd64"

get_lib_dir() {
  if [ "$DEFAULT_ARCH" = "i386" ]; then
    LIBDIR=lib/i386-linux-gnu
  elif [ "$DEFAULT_ARCH" = "amd64" ]; then
    LIBDIR=lib/x86_64-linux-gnu
  elif [ "$DEFAULT_ARCH" = "armhf" ]; then
    LIBDIR=lib/arm-linux-gnueabihf
  elif [ "$DEFAULT_ARCH" = "arm64" ]; then
    LIBDIR=lib/aarch64-linux-gnu
  elif [ "$DEFAULT_ARCH" = "mipsel" ]; then
    LIBDIR=lib/mipsel-linux-gnu
  elif [ "$DEFAULT_ARCH" = "mips64el" ]; then
    LIBDIR=lib/mips64el-linux-gnuabi64
  else
    echo Unknown CPU Architecture: "$DEFAULT_ARCH"
    exit 1
  fi
}

## MAIN ##
DEFAULTS_FILE="/etc/default/vivaldi"
if [ -r "$DEFAULTS_FILE" ]; then
  . "$DEFAULTS_FILE"
fi

remove_old_key
install_key
install_future_key

if [ "$repo_add_once" = "true" ]; then
  create_sources_lists
  RES=$?
  # Sources creation succeeded, so stop trying.
  if [ $RES -ne 2 ]; then
    sed -i -e 's/[[:space:]]*repo_add_once=.*/repo_add_once="false"/' "$DEFAULTS_FILE"
  fi
else
  update_bad_sources
fi

if [ "$repo_reenable_on_distupgrade" = "true" ]; then
  handle_distro_upgrade
fi
