#!/bin/sh

set -e

systemctl_stop() {
    unit="$1"

    echo "Stopping unit $unit"
    systemctl stop -q "$unit" || true

    for i in $(seq 20); do
        echo "Waiting until unit $unit is stopped [attempt $i]"
        if ! systemctl is-active -q "$unit"; then
            echo "$unit is stopped."
            return
        fi
        sleep .1
    done
}

if [ "$1" = "purge" ]; then
    # undo any bind mount to /snap that resulted from LP:#1668659
    # (that bug can't happen in trusty -- and doing this would mess up snap.mount.service there)
    if grep -q "/snap /snap" /proc/self/mountinfo; then
        umount -l /snap || true
    fi

    units=$(systemctl list-unit-files --full | grep '^snap[-.]' | cut -f1 -d ' ' | grep -vF snap.mount.service || true)
    mounts=$(echo "$units" | grep '^snap[-.].*\.mount$' || true)
    services=$(echo "$units" | grep '^snap[-.].*\.service$' || true)

    for unit in $services $mounts; do
        # ensure its really a snap mount unit or systemd unit
        if ! grep -q 'What=/var/lib/snapd/snaps/' "/etc/systemd/system/$unit" && ! grep -q 'X-Snappy=yes' "/etc/systemd/system/$unit"; then
            echo "Skipping non-snapd systemd unit $unit"
            continue
        fi

        echo "Stopping $unit"
        systemctl_stop "$unit"

        # if it is a mount unit, we can find the snap name in the mount
        # unit (we just ignore unit files)
        snap=$(grep 'Where=/snap/' "/etc/systemd/system/$unit"|cut -f3 -d/)
        rev=$(grep 'Where=/snap/' "/etc/systemd/system/$unit"|cut -f4 -d/)
        if [ -n "$snap" ]; then
            echo "Removing snap $snap and revision $rev"
            # aliases
            if [ -d /snap/bin ]; then
                find /snap/bin -maxdepth 1 -lname "$snap" -delete
                find /snap/bin -maxdepth 1 -lname "$snap.*" -delete
            fi
            # generated binaries
            rm -f "/snap/bin/$snap"
            rm -f "/snap/bin/$snap".*
            # snap mount dir
            # we pass -d (clean up loopback devices) for trusty compatibility
            umount -d -l "/snap/$snap/$rev" 2> /dev/null || true
            rm -rf "/snap/$snap/$rev"
            rm -f "/snap/$snap/current"
            # snap data dir
            rm -rf "/var/snap/$snap/$rev"
            rm -rf "/var/snap/$snap/common"
            rm -f "/var/snap/$snap/current"
            # opportunistic remove (may fail if there are still revisions left
            for d in "/snap/$snap" "/var/snap/$snap"; do
                if [ -d "$d" ]; then
                    rmdir --ignore-fail-on-non-empty "$d" || true
                fi
            done
            # udev rules
            find /etc/udev/rules.d -name "*-snap.${snap}.rules" -execdir rm -f "{}" \;
            # dbus policy files
            find /etc/dbus-1/system.d -name "snap.${snap}.*.conf" -execdir rm -f "{}" \;
            # timer files
            find /etc/systemd/system -name "snap.${snap}.*.timer" | while read -r f; do
                systemctl_stop "$(basename $f)"
                rm -f "$f"
            done
        fi

        echo "Removing $unit"
        rm -f "/etc/systemd/system/$unit"
        rm -f "/etc/systemd/system/multi-user.target.wants/$unit"
    done

    # generated readme files
    rm -f "/snap/README"

    echo "Final directory cleanup"
    for d in "/snap/bin" "/snap" "/var/snap"; do
        # Force remove due to directories for old revisions could still exist
        rm -rf "$d"
        if [ -d "$d" ]; then
            echo "Cannot remove directory $d"
        fi
    done

    echo "Discarding preserved snap namespaces"
    # opportunistic as those might not be actually mounted
    if [ -d /run/snapd/ns ]; then
        if [ $(ls /run/snapd/ns/*.mnt | wc -l) -gt 0 ]; then
            for mnt in /run/snapd/ns/*.mnt; do
                umount -l "$mnt" || true
                rm -f "$mnt"
            done
        fi
        if [ $(ls /run/snapd/ns/*.fstab | wc -l) -gt 0 ]; then
            for fstab in /run/snapd/ns/*.fstab; do
                rm -f "$fstab"
            done
        fi
        umount -l /run/snapd/ns/ || true
    fi

    echo "Removing extra snap-confine apparmor rules"
    rm -f /etc/apparmor.d/snap.core.*.usr.lib.snapd.snap-confine

    echo "Removing snapd cache"
    rm -f /var/cache/snapd/*

    echo "Removing snapd state"
    rm -rf /var/lib/snapd
fi

# Automatically added by dh_installdeb
dpkg-maintscript-helper rm_conffile /etc/apparmor.d/usr.lib.snapd.snap-confine 2.23.6~ -- "$@"
# End automatically added section
# Automatically added by dh_installdeb
dpkg-maintscript-helper rm_conffile /etc/ld.so.conf.d/snappy.conf 2.0.7~ -- "$@"
# End automatically added section
# Automatically added by dh_installdeb
dpkg-maintscript-helper rm_conffile /etc/grub.d/09_snappy 1.7.3ubuntu1 -- "$@"
# End automatically added section
# Automatically added by dh_apparmor
if [ "$1" = "purge" ] && ! [ -e "/etc/apparmor.d/usr.lib.snapd.snap-confine.real" ] ; then
    rm -f "/etc/apparmor.d/disable/usr.lib.snapd.snap-confine.real" || true
    rm -f "/etc/apparmor.d/force-complain/usr.lib.snapd.snap-confine.real" || true
    rm -f "/etc/apparmor.d/local/usr.lib.snapd.snap-confine.real" || true
    rmdir /etc/apparmor.d/disable 2>/dev/null || true
    rmdir /etc/apparmor.d/local   2>/dev/null || true
    rmdir /etc/apparmor.d         2>/dev/null || true
fi
# End automatically added section
# Automatically added by dh_systemd_start
if [ -d /run/systemd/system ]; then
	systemctl --system daemon-reload >/dev/null || true
fi
# End automatically added section
# Automatically added by dh_systemd_enable
if [ "$1" = "remove" ]; then
	if [ -x "/usr/bin/deb-systemd-helper" ]; then
		deb-systemd-helper mask snapd.autoimport.service snapd.core-fixup.service snapd.seeded.service snapd.service snapd.snap-repair.timer snapd.socket snapd.system-shutdown.service >/dev/null
	fi
fi

if [ "$1" = "purge" ]; then
	if [ -x "/usr/bin/deb-systemd-helper" ]; then
		deb-systemd-helper purge snapd.autoimport.service snapd.core-fixup.service snapd.seeded.service snapd.service snapd.snap-repair.timer snapd.socket snapd.system-shutdown.service >/dev/null
		deb-systemd-helper unmask snapd.autoimport.service snapd.core-fixup.service snapd.seeded.service snapd.service snapd.snap-repair.timer snapd.socket snapd.system-shutdown.service >/dev/null
	fi
fi
# End automatically added section

