#!/bin/sh
#
# Copyright (c) 2009 The Chromium Authors. All rights reserved.
# Copyright (c) 2020 Mantas Kriaučiūnas <baltix@gmail.com>. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the Chromium LICENSE file.
#
# 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/baltix"

# sources.list setting for Baltix GNU/Linux updates.
LSB_RELEASE="`which lsb_release 2> /dev/null`"
if [ ! -x "$LSB_RELEASE" ]; then
  DISTR_CODENAME=$(grep ^DISTRIB_CODENAME /etc/lsb-release | cut -d= -f2 | tr -d '.' 2>/dev/null)
else
  DISTR_CODENAME=$("$LSB_RELEASE" -s -c 2>/dev/null)
fi

REPOCONFIG="deb http://ppa.launchpad.net/baltix/ppa/ubuntu $DISTR_CODENAME main"
REPOCONFIGREGEX="deb([[:space:]]*)https?://ppa.launchpad.net/baltix/ppa/ubuntu([[:space:]]*$DISTR_CODENAME[[:space:]]*)main"

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

SOURCES_PREAMBLE="### THIS FILE IS AUTOMATICALLY CONFIGURED for Baltix GNU/Linux - baltix.eu ###
# You may comment out this entry, but any other modifications may be lost.\n"

# Install the repository/package signing keys, if they aren't already.
# (see also: https://launchpad.net/~baltix/+archive )
install_key() {
  APT_KEY="`which apt-key 2> /dev/null`"
  if [ ! -x "$APT_KEY" ]; then
    return
  fi

  NEED_KEYS=0

  # ppa:baltix-members key
  "$APT_KEY" export XXXXXXXX 2>&1 | \
    grep -q -- "-----BEGIN PGP PUBLIC KEY BLOCK-----"
  if [ $? -ne 0 ]; then
    NEED_KEYS=1
  fi

  # ppa:baltix key
  "$APT_KEY" export XXXXXXXX 2>&1 | \
    grep -q -- "-----BEGIN PGP PUBLIC KEY BLOCK-----"
  if [ $? -ne 0 ]; then
    NEED_KEYS=1
  fi

  if [ $NEED_KEYS -eq 1 ]; then
    "$APT_KEY" add - >/dev/null 2>&1 <<KEYDATA
-----BEGIN PGP PUBLIC KEY BLOCK-----
Here will be ppa:baltix key
-----END PGP PUBLIC KEY BLOCK-----
KEYDATA
  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 Baltix 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/*baltix*.list"

  # Don't do anything if the file isn't there, since that probably means the
  # user disabled it.
# This doesn't work if there are * in $SOURCELIST
#  if [ ! -r "$SOURCELIST" ]; then
#    return 0
#  fi

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

  # Now figure out if we need to fix things.
  BADCONFIG=1

  if [ "$REPOMATCH" ]; then
    # Basic check for active configurations (non-blank, non-comment, non deb-src lines).
    ACTIVECONFIGS=$(grep --files-with-matches -E "^[[:space:]]*\b$REPOCONFIGREGEX\b" $SOURCELIST 2>/dev/null)
    # Old way to check ACTIVECONFIGS works bad if there are several matching files in $SOURCELIST :
    # grep --no-filename -v "^[[:space:]]*\(#.*\)\?$" $SOURCELIST |grep -v "^deb-src" |grep -v ":deb-src" |grep -v "/baltix-members/ppa" 2>/dev/null)
    if [ ! $ACTIVECONFIGS ]; then
        MATCH_DISABLED=$(grep --files-with-matches -E "^[[:space:]]*#[[:space:]]*\b$REPOCONFIGREGEX\b" $SOURCELIST | head -n1 2>/dev/null)
        SOURCELIST=$MATCH_DISABLED
        BADCONFIG=0
    else
      # No need to check if the correct repository is disabled.
      #MATCH_DISABLED=$(echo "$REPOMATCH" | grep "^[[:space:]]*#" 2>/dev/null)
      BADCONFIG=0
    fi
  else
    SOURCELIST="$APT_SOURCESDIR/baltix-ubuntu-ppa-$DISTR_CODENAME.list"
  fi


#  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.
  printf "$SOURCES_PREAMBLE" >> "$SOURCELIST"
#  printf "$DISABLE$REPOCONFIG\n" >> "$SOURCELIST"
  "$APT_ADD_REPOSITORY" --yes ppa:baltix
  if [ $? -eq 0 ]; then
    return 0
  fi
  return 2
}

# Add the Baltix repository to the apt sources.
# Returns:
# 0 - sources list was created
# 2 - error
create_sources_lists() {
  if [ -x "$APT_ADD_REPOSITORY" ]; then
    "$APT_ADD_REPOSITORY" --yes ppa:baltix
    return 0
  else
    if [ ! "$REPOCONFIG" ]; then
      return 0
    fi
    find_apt_sources

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

# 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 -vf "$APT_SOURCESDIR/baltix-ubuntu-ppa-$DISTR_CODENAME.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/*baltix*.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/baltix"

if [ -r "$DEFAULTS_FILE" ]; then
  . "$DEFAULTS_FILE"
fi

#install_key

# TODO: think how to quickly check if work-around for apt-get 
# error when PPA decription is changed is needed
#apt-get -qq --allow-releaseinfo-change update

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
