#!/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-snapshot 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-snapshot"

# sources.list setting for vivaldi-snapshot updates.
REPOCONFIG="deb http://repo.vivaldi.com/snapshot/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 (EFB20B23), 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 EFB20B23; then
      "$APT_KEY" del EFB20B23 >/dev/null 2>&1
    fi
  fi
}

# Install the repository/package signing key (4A3AA3D6), 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 4A3AA3D6; then
      "$APT_KEY" add - >/dev/null 2>&1 <<KEYDATA
-----BEGIN PGP PUBLIC KEY BLOCK-----

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

# Install another key (B69735B2), 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 B69735B2; then
      "$APT_KEY" add - >/dev/null 2>&1 <<KEYDATA
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
IPbk1c1Bi2zzh6OM15cMvH2ZaAaY1n28PmCcDJM=
=M6aM
-----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-snapshot.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-snapshot.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-snapshot.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-snapshot.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-snapshot"
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
