#!/bin/bash
# @FLAGS@ placeholder for flags
LIBCARE_ENABLED=1
# echo @@ $DPKG_MAINTSCRIPT_NAME $DPKG_MAINTSCRIPT_PACKAGE $1 $2

KCARE_LIST=/etc/apt/sources.list.d/kcare.list
SIGSUFFIX=sig202505  # changed when we rotate repo signature keys

# TODO a helper function to parse os-release file (maybe source it in a subshell)
DISTRO_ID=$(awk -F'=' '/^ID=/ {print $2}' /etc/os-release | cut -d '=' -f2)
DISTRO_VERSION=$(grep -w 'VERSION_ID' /etc/os-release | cut -d'=' -f2 | tr -d '"')

if [ "$DISTRO_ID" == 'ubuntu' ] && [ "$DISTRO_VERSION" == '14.04' ]; then
  # ubuntu14 uses debian8 repo
  DISTRO_ID=debian
  DISTRO_VERSION=8
fi

if [ "$DISTRO_ID" == 'ubuntu' ]; then
  CODENAME=$(grep -w 'VERSION_CODENAME' /etc/os-release | cut -d'=' -f2 | tr -d '"')
else
  CODENAME=kcare
fi

function set_repo_opts() {
  # insert arch=amd64,arm64 repo option
  # user can use local repo which doesn't support arch and signed-by definition
  sed -Ei "s|\[.*signed-by=(.*)\]|\[arch=amd64,arm64 signed-by=\1\]|" "$KCARE_LIST"
}

function set_repo_url() {
  # Transform kcare.list according to the latest repo urls format
  # Capture folder and everything after it and replace
  # The existing url could be prepended with /repo prefix if the agent was integrated with eportal using set-kernelcare-repo script
  # we should preserve it.
  #
  # The idea is that we should process any possible url layout in kcare.list but transform it to the new scheme
  #
  # supported cases:
  # 1) old repo urls without kernelcare/ folder:
  # https://repo.cloudlinux.com/kernelcare-debian/8
  # 2) old repo urls with kernelcare/ folder:
  # https://repo.cloudlinux.com/kernelcare/kernelcare-debian/8
  # 3) debian urls from kernelcare-debian folder used for ubuntu distros (they were separated later)
  # 4) old dedicated urls for ubuntu:
  # https://repo.cloudlinux.com/kernelcare-ubuntu/20.04
  # 5) new-style layout with sigsuffix like -sig202505:
  # https://repo.cloudlinux.com/kernelcare/debian-sig202505/12
  # https://repo.cloudlinux.com/kernelcare/ubuntu-sig202505/20.04

  local repofolder_pattern="/(kernelcare/)?(kernelcare-[a-z]+|[a-zA-Z0-9]+[_-]sig[0-9]+)"
  sed -Ei "s@$repofolder_pattern/.*@/kernelcare/$DISTRO_ID-$SIGSUFFIX/$DISTRO_VERSION $CODENAME main@" "$KCARE_LIST"
}

case "$1" in
  configure)
    mkdir -p /etc/pki/kcare-gpg
    chmod 700 /etc/pki/kcare-gpg
    chown root:root /etc/pki/kcare-gpg
    if [ -n "$KCARE_SCANNER_USER" ]; then
        kcare-scanner-interface init "${KCARE_SCANNER_USER}"
    fi

    # Fix KPT-900 for old versions
    # shellcheck disable=SC2016  # Acknowledge single quotes
    [[ -f /etc/profile.d/kernelcare.sh ]] && sed -i 's/ ${CURRENT_USER} / "${CURRENT_USER}" /g' /etc/profile.d/kernelcare.sh
    # shellcheck disable=SC2016  # Acknowledge single quotes
    [[ -f /etc/profile.d/kernelcare.sh ]] && sed -i 's/$(logname)/$(logname 2>\/dev\/null)/g' /etc/profile.d/kernelcare.sh

    # Remove old audit rules
    [[ -f /etc/audit/rules.d/kernelcare.rules ]] && rm /etc/audit/rules.d/kernelcare.rules

    if [ -n "$KCARE_PATCH_SERVER" ]; then
        sed -i '/PATCH_SERVER/d' /etc/sysconfig/kcare/kcare.conf
        echo "PATCH_SERVER=$KCARE_PATCH_SERVER" >> /etc/sysconfig/kcare/kcare.conf
    fi
    if [ -n "$KCARE_REGISTRATION_URL" ]; then
        sed -i '/REGISTRATION_URL/d' /etc/sysconfig/kcare/kcare.conf
        echo "REGISTRATION_URL=$KCARE_REGISTRATION_URL" >> /etc/sysconfig/kcare/kcare.conf
    fi

    if [ ! -f "$KCARE_LIST" ]; then
        cp /usr/share/kcare/kcare.list "$KCARE_LIST"
    fi

    hash systemctl 2>/dev/null && systemctl daemon-reload

    # KPT-3597: remove SysVinit scripts
    if [ -x "/etc/init.d/kcare" ]; then
        if hash invoke-rc.d 2>/dev/null; then
            invoke-rc.d kcare stop
        else
            /etc/init.d/kcare stop
        fi

        update-rc.d kcare remove || true
        rm -f /etc/init.d/kcare

        # re-enable kcare
        systemctl enable kcare.service
    fi

    KCARE_CRONFILE=/etc/cron.d/kcare-cron
    KCARE_CRONFILE_OLD=${KCARE_CRONFILE}.old

    mkdir -p /etc/cron.d
    touch $KCARE_CRONFILE
    if ! [[ -s $KCARE_CRONFILE ]] && [[ -z "$KCARE_KEEP_CRON_INTACT" ]]; then
        echo "Creating kcare-cron"
        if [[ -n "$KCARE_MAILTO" ]]; then
          echo "MAILTO=\"$KCARE_MAILTO\"" > $KCARE_CRONFILE
        fi
        # hours will be randomized by migrate-cron-hour-randomize.sh below
        echo "$(( RANDOM % 60 )) */4  * * * root /usr/bin/kcarectl -q --auto-update" >> $KCARE_CRONFILE
    elif [[ -s $KCARE_CRONFILE_OLD ]] && [[ -n "$KCARE_KEEP_CRON_INTACT" ]]; then
        echo "Restoring old kcare-cron"
        mv -f $KCARE_CRONFILE_OLD $KCARE_CRONFILE
    fi

    rm -f $KCARE_CRONFILE_OLD

    if [ -z "$2" ]; then  # install only
      systemctl enable kcare.service
    else  # upgrade
      depmod
      KCARE_OLD=/etc/sysconfig/kcare
      if [[ -f $KCARE_OLD ]]; then
        mv $KCARE_OLD $KCARE_OLD.old
        mkdir -p $KCARE_OLD
        mv $KCARE_OLD.old $KCARE_OLD/kcare.conf
      fi
    fi

    # Old cron file migrations
    # Gradual rollout is abandoned
    sed -i 's/--gradual-rollout=auto//' ${KCARE_CRONFILE}

    # Randomize auto-update hour
    bash /usr/libexec/kcare/migrations/migrate-cron-hour-randomize.sh

    if hash systemctl 2>/dev/null && [ -n "$LIBCARE_ENABLED" ]; then
        bash /usr/libexec/kcare/migrations/migrate-libcare-override.sh

        rm -f /var/lib/libcare/libcare-plugin.sig.so /var/lib/libcare/libcare-plugin.sig.so.staging

        systemctl stop libcare.service
        systemctl enable libcare.socket
        systemctl restart libcare.socket
    fi
    if [ -n "$LIBCARE_ENABLED" ]; then
        cp -f /var/lib/libcare/blacklist /etc/sysconfig/kcare/libcare-blacklist
    fi

    # remove old configs (were moved to other locations)
    rm -f /etc/logrotate.d/libcare \
        /etc/pki/kcare-gpg/kcare_pub.key \
        /etc/pki/kcare-gpg/root-keys.json

    set_repo_opts
    set_repo_url
    ;;

  triggered)
    grep -q "^# deb" "$KCARE_LIST" && sed -i "s|^# deb|deb|" "$KCARE_LIST"

    set_repo_opts
    set_repo_url
    ;;
esac

exit 0
