#!/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 (BF1700F8), 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 BF1700F8; then
      "$APT_KEY" del BF1700F8 >/dev/null 2>&1
    fi
  fi
}

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

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

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

mQINBFh9700BEACfjuPRKbTaFB1y2yPlCMYfA9sw+Mu19g2AEpO4kXsqZPA1mfU0
nGpZEBanbKbWaZNknr+4Gp0KrkSKL4ZywFeCMhEUXDsMU9dBCInVrhP9jzVJV4oP
TfNY1fgcwiWNaOJFRt4rot9NNiEOWRRguCPki2285biGfl6bS5a5UqFyA8XQn0dv
EyyuFQ1mSDJqSw7yYpHFuLsp1hUO1WtmezE6Cqkh1m50eXJmuB5jG8wM1NkGk8lk
t2DgC/bMDwNIijJBsvBTuh9mdqH/u4TF3mysomMDy+vU8m9Uq5eSEoMKh9Bttai2
brxPFfxw2u6OTSYbKdw0KmXCe4pNcyrK6jPKUTLaplhhn8vRnzVilQVeTIJPHM1O
8bsio1LDTQl3K7AQtpqnu2N2nKRLtnTyOyDtfVC+PBS7Jvj4yDoImzqaiOaMcFKO
DpeO8NudVBUunmgPWwUw4lv4rZyY5+6Rq9fHQGoh+dVnTjSyXVjBppD438RpPCRx
MUlUddmpZmPsCYqdjnAV1J3kYlSyYOBu7PtssK9TwkzLP3xaMQFJrSRQw48Bc/Q/
CgaXAYER5pVfQg78thj4gDT3yi1u5ozTmw1hkvaTu9RAJmo4svgWoCClfKJusfo3
AwCxrgPcFqRWoyahUkpNNS/yKlbDtB6LLmFoO9SJuQ7CmKOXtP8AkGemywARAQAB
tDVWaXZhbGRpIFBhY2thZ2UgQ29tcG9zZXIgS0VZMDMgPHBhY2thZ2VyQHZpdmFs
ZGkuY29tPokCPgQTAQIAKAUCWH3vTQIbAwUJA8JnAAYLCQgHAwIGFQgCCQoLBBYC
AwECHgECF4AACgkQbTeJ7cNAHhK6vQ//YFN3EmodDZL4mPZ5I2gyadFHqKKf79yV
XiAPC2LOLBKMHGzxMlHDN6MVgCnkPSiGGiS1aJzozucNmg06g0H0DQA4WEg2iBPZ
SnaCt72ONsPyDrrA7FJimHXCS7wrU4XD1shnnVi+ToV6mYWGiCwiwA6EpJlEYqRs
ZDJuXAfJYPI85nAvhnysdCGFSEXYICxXhlRZvS234FkV81AmMukelJyZ8O44Ayvm
ypYIYESBDGrj7wnJJvOE6+IIg7Hl/7XIa60MsN2t7Uo4b4En0yW0NRwwZ4uNUN8L
tTxcjx20/IdoAEQrNe+UCieaWpUKDQHBOxerBT/PLAnPlpESqMYoAZ07V6VdjD5I
LoD/iB3jYV4wT9nfWQqMcoyi2gm8HO3w7Nubq9OO3ao9Kd4n1B3S/uKkOZGOE5u9
VdzvX+c4aBwU5A4nxpMTpE24WWfkHdgj6C/E7eZAfr41pAi9zStecLscqGB5shmX
5odBk1qAHzvjPk+/zmlh3hEXTaCk5Qi0me8BHiLJC5SMr0XgkQTBC4aSa2Jsbthq
xcX4oAdb4wbXEiDSatiZjA/hge87OCNsHP6E/5mctran9JsX4kFY/bL/gdsgQ7Zg
AOa0rSKXeI7vboaveZzst53mN1+8yItV2UQpB5f51/QGLcGy8LnkZgp8UJ4kjpmd
m2DRBz/IWeC5Ag0EWH3vTQEQAOXfpNZh2Rq5frcawVacN1e4ahorOspOQ6xZZQdl
iq8EM6YDwZMVSv3ssPMMvcas6ROmCyT+8eeVuiLtlUEAPfgH7Ro8S3tXltS5Zxtp
4z+yBaKVQw1IrmKTANMsRO+7gu5IHpvUgGhDWi3J4OriIJw2o/Lznf3pBOmnO1pk
Qgx1bDCDzcauqtQoWrmPikgq010gNU2wdDWTJkgn5BeYrn8gp3tyY5qSFL6Dth2U
KoYEGwom5QDN9bA/oKRedY9hHdOkqlGedsIAXBIdwp89Cnot/fSUDCOqjZjUHbAb
lNagPylWsJMne2m2hdWief5YXhsvc/CgSiy3XHkIJkNkpSABzDEV7ulsdVPjr1KL
AA1ffynx+kSwKNEV10xAIwWhGc1f43z20dAQGEyo2+Wt2sX1RTLe6HCa/0nryVOc
6YlMI8kPpq15mRPdN1mvwqz+mQtHbOF4mxKjt+lW1NRm7tWwZKU50nzqy1j+aujL
Q/+Y99SGaXbZbjPffe6HFAG5bEvhJAtfLNW0QZJNavZdwqslmhdyEnC1NPjedubr
8Ct8hzKxtHOnKYZqACBkkkUCZI32pHbG8JJiLzEPJOivpWlrLt9063gHsgtuVLEk
FY+qsrCSCQL1g8KBhvhw0WwGuqOhNGCccgZTYZSngshfm1YlXsKAgqGVWC2vMBz6
ockRABEBAAGJAiUEGAECAA8FAlh9700CGwwFCQPCZwAACgkQbTeJ7cNAHhI1xQ//
QZwfWqpB9Fl6UlwbCsikxb/yeye3LMQjeJaVkDxa4op15+LBlnOby/rBA8WtGfBq
KqjH76uAvgaefleOJjJFTwTAGUIt/Db5PvhKztAzdNJeUIGBEz1QlmC16/9hhlgJ
e1UCXRgd+z59bRY8acV113BxdIV26KU6rbK24Z442LIx07FneNJuoXgfN9Fm+/8T
FeRD6+kMxzF9i1dVU+/EIufyUbFMA08KnlaevT6umDwHArGPIYjoJ5xVQl04x8dd
RPrX2FpEHffFla8veKIM8x/T2yQwJeyXbLOsdVVvvGEHStinmePlkX6JV9A243/P
IAtYo6GK1s8vqVV5kIJhkdsFG6nFVv4Zymhk5LUD9aRVY+wdelsrbOxWSf+TQz7n
37Or9Tu3LeAlx1wlym8NO+RFo2haCN53PAIqOOWMYZVM9JAq9FxkCF7uLIe9afd2
ErzEbAPt2yax2at6QvS+CBXlPh7qZ0xzuqDAtHJuZ41Umjr1vo2fXUwn+9dr+EtF
0KgR8nB31mEerr6wg+d1JoAKPnQ8Ja1xvlHakMa/WswzhtVwL63Z2G9VhAhN0jWv
4X3uu8Y3gXeQFQoiHHX0zxMKNdv2ujyqG8UQWqENOpgjfcv5TtsaWJrpW267BE61
R6o2nS+jYNBfJ1GD07srhQQtdgjDLgb8u197g8MhI1I=
=iQPH
-----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
  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
