#!/bin/sh

set -e

# This script can be called in the following ways:
#
# After the package was installed:
#	<postinst> configure <old-version>
#
#
# If prerm fails during upgrade or fails on failed upgrade:
#	<old-postinst> abort-upgrade <new-version>
#
# If prerm fails during deconfiguration of a package:
#	<postinst> abort-deconfigure in-favour <new-package> <version>
#	           removing <old-package> <version>
#
# If prerm fails during replacement due to conflict:
#	<postinst> abort-remove in-favour <new-package> <version>

case "$1" in
    configure)
        update-rc.d -f NetworkManager remove >/dev/null

        if [ -x "/etc/init.d/dbus" ]; then
            invoke-rc.d dbus force-reload || true
        fi

        # This directory can contain sensitive data and should not be world-readable
        chmod 0700 /var/lib/NetworkManager

        NIF=/etc/network/interfaces
        if [ -z "$2" ] && [ -f $NIF ]; then
            ifaces=`grep -v '^#' $NIF | awk '/iface/ {print $2}' | sort -u | sed -e 's/lo//' -e '/^$/d' -e 's/^/- /'`
            if [ -n "$ifaces" ]; then
                echo "" 1>&2
                echo "The following network interfaces were found in $NIF" 1>&2
                echo "which means they are currently configured by ifupdown:" 1>&2
                echo "$ifaces" 1>&2
                echo "If you want to manage those interfaces with NetworkManager instead" 1>&2
                echo "remove their configuration from $NIF." 1>&2
                echo "" 1>&2
            fi
        fi

        if dpkg --compare-versions "$2" lt-nl "1.35.91-1"; then
            deb-systemd-helper purge "nm-priv-helper.service" || true
        fi
        ;;

    abort-upgrade|abort-deconfigure|abort-remove)
        ;;

    *)
        echo "$0 called with unknown argument \`$1'" 1>&2
        exit 1
        ;;
esac

#DEBHELPER#

# Run "Netplan Everywhere" migration after debhelper (re-)started
# NetworkManager.service for us. On every package upgrade.
DIR="/etc/NetworkManager/system-connections"
if [ "$1" = "configure" ] && [ -d "$DIR" ]; then
    mkdir -p /run/netplan/nm-migrate
    for CON in /etc/NetworkManager/system-connections/*; do
        TYPE=$(file -bi "$CON" | cut -s -d ";" -f 1)
        [ "$TYPE" = "text/plain" ] || continue # skip non-keyfiles
        UUID=$(grep "^uuid=" "$CON" | cut -c 6-)
        if [ -n "$UUID" ]
        then
            # Wait for NetworkManager startup to complete,
            # so we can safely use nmcli. Wait in every interation to handle
            # a crashed NetworkManager in the previous migraiton step.
            if ! nm-online -qs; then
                echo "SKIP: NetworkManager is not ready ..." 1>&2
                continue
            fi
            BACKUP="/run/netplan/nm-migrate/"$(basename "$CON")
            ORIG_NAME=$(nmcli --get-values connection.id con show "$UUID") || \
                { echo "SKIP: $(basename "$CON") ($UUID) unknown to NetworkManager." 1>&2 && \
                  continue; }
            cp "$CON" "$BACKUP"
            echo "Migrating $ORIG_NAME ($UUID) to /etc/netplan" 1>&2
            # Touch the connection's ID (con-name) to trigger its migration.
            # The Netplan integration will translate the original NM keyfile from
            # /etc/NetworkManager/system-connections/* to a YAML file located in
            # /etc/netplan/90-NM-*.yaml and re-generate a corresponding keyfile in
            # /run/NetworkManager/system-connections/netplan-NM-*.nmconnection
            nmcli con mod "$UUID" con-name "$ORIG_NAME" || \
                (echo "FAILED. Restoring backup ..." 1>&2 && mv "$BACKUP" "$CON" && \
                 rm -f "/etc/netplan/90-NM-$UUID"*.yaml)
            rm -f "$BACKUP" # clear backup (if it still exists)
       fi
    done
    rm -rf /run/netplan/nm-migrate # cleanup after ourselves
    (nm-online -qs && nmcli con reload) || echo "WARNING: NetworkManager could not reload connections ..." 1>&2
fi
