1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
|
#!/bin/bash
# shellcheck source=tests/lib/dirs.sh
. "$TESTSLIB/dirs.sh"
# shellcheck source=tests/lib/state.sh
. "$TESTSLIB/state.sh"
# shellcheck source=tests/lib/systemd.sh
. "$TESTSLIB/systemd.sh"
reset_classic() {
# Reload all service units as in some situations the unit might
# have changed on the disk.
systemctl daemon-reload
systemd_stop_units snapd.service snapd.socket
case "$SPREAD_SYSTEM" in
ubuntu-*|debian-*)
sh -x "${SPREAD_PATH}/debian/snapd.prerm" remove
sh -x "${SPREAD_PATH}/debian/snapd.postrm" purge
;;
fedora-*|opensuse-*|arch-*|amazon-*|centos-*)
# We don't know if snap-mgmt was built, so call the *.in file
# directly and pass arguments that will override the placeholders
sh -x "${SPREAD_PATH}/cmd/snap-mgmt/snap-mgmt.sh.in" \
--snap-mount-dir="$SNAP_MOUNT_DIR" \
--purge
# The script above doesn't remove the snapd directory as this
# is normally done by the rpm packaging system.
rm -rf /var/lib/snapd
;;
*)
echo "don't know how to reset $SPREAD_SYSTEM"
exit 1
;;
esac
# purge has removed units, reload the state now
systemctl daemon-reload
# extra purge
rm -rvf /var/snap "${SNAP_MOUNT_DIR:?}/bin"
mkdir -p "$SNAP_MOUNT_DIR" /var/snap /var/lib/snapd
if [ "$(find "$SNAP_MOUNT_DIR" /var/snap -mindepth 1 -print -quit)" ]; then
echo "postinst purge failed"
ls -lR "$SNAP_MOUNT_DIR"/ /var/snap/
exit 1
fi
rm -rf /tmp/snap-private-tmp
case "$SPREAD_SYSTEM" in
fedora-*|centos-*)
# On systems running SELinux we need to restore the context of the
# directories we just recreated. Otherwise, the entries created
# inside will be incorrectly labeled.
restorecon -F -v -R "$SNAP_MOUNT_DIR" /var/snap /var/lib/snapd
;;
esac
# systemd retains the failed state of service units, even after they are
# removed, we need to reset their 'failed state'
systemctl --plain --failed --no-legend --full | awk '/^ *snap\..*\.service +(error|not-found) +failed/ {print $1}' | while read -r unit; do
systemctl reset-failed "$unit" || true
done
if os.query is-trusty; then
systemctl start snap.mount.service
fi
rm -rf /root/.snap/gnupg
rm -f /tmp/core* /tmp/ubuntu-core*
if [ "$1" = "--reuse-core" ]; then
# Restore snapd state and start systemd service units
restore_snapd_state
escaped_snap_mount_dir="$(systemd-escape --path "$SNAP_MOUNT_DIR")"
mounts="$(systemctl list-unit-files --full | grep "^${escaped_snap_mount_dir}[-.].*\\.mount" | cut -f1 -d ' ')"
services="$(systemctl list-unit-files --full | grep "^${escaped_snap_mount_dir}[-.].*\\.service" | cut -f1 -d ' ')"
systemctl daemon-reload # Workaround for http://paste.ubuntu.com/17735820/
for unit in $mounts $services; do
systemctl start "$unit"
done
# force all profiles to be re-generated
rm -f /var/lib/snapd/system-key
fi
if [ "$1" != "--keep-stopped" ]; then
systemctl start snapd.socket
# wait for snapd listening
EXTRA_NC_ARGS="-q 1"
case "$SPREAD_SYSTEM" in
fedora-*|amazon-*|centos-*)
EXTRA_NC_ARGS=""
;;
esac
# shellcheck disable=SC2086
while ! printf 'GET / HTTP/1.0\r\n\r\n' | nc -U $EXTRA_NC_ARGS /run/snapd.socket; do sleep 0.5; done
fi
}
reset_all_snap() {
# remove all leftover snaps
# make sure snapd is running before we attempt to remove snaps, in case a test stopped it
if ! systemctl status snapd.service snapd.socket >/dev/null; then
systemctl start snapd.service snapd.socket
fi
# shellcheck source=tests/lib/names.sh
. "$TESTSLIB/names.sh"
remove_bases=""
# remove all app snaps first
for snap in "$SNAP_MOUNT_DIR"/*; do
snap="${snap:6}"
case "$snap" in
"bin" | "$gadget_name" | "$kernel_name" | "$core_name" | "snapd" |README)
;;
*)
# Check if a snap should be kept, there's a list of those in spread.yaml.
keep=0
for precious_snap in $SKIP_REMOVE_SNAPS; do
if [ "$snap" = "$precious_snap" ]; then
keep=1
break
fi
done
if [ "$keep" -eq 0 ]; then
if snap info --verbose "$snap" | grep -E '^type: +(base|core)'; then
if [ -z "$remove_bases" ]; then
remove_bases="$snap"
else
remove_bases="$remove_bases $snap"
fi
else
snap remove --purge "$snap"
fi
fi
;;
esac
done
# remove all base/os snaps at the end
if [ -n "$remove_bases" ]; then
for base in $remove_bases; do
snap remove --purge "$base"
if [ -d "$SNAP_MOUNT_DIR/$base" ]; then
echo "Error: removing base $base has unexpected leftover dir $SNAP_MOUNT_DIR/$base"
ls -al "$SNAP_MOUNT_DIR"
ls -al "$SNAP_MOUNT_DIR/$base"
exit 1
fi
done
fi
# ensure we have the same state as initially
systemctl stop snapd.service snapd.socket
restore_snapd_state
rm -rf /root/.snap
rm -rf /tmp/snap-private-tmp/snap.*
if [ "$1" != "--keep-stopped" ]; then
systemctl start snapd.service snapd.socket
fi
# Exit in case there is a snap in broken state after restoring the snapd state
if snap list | grep -E "broken$"; then
echo "snap in broken state"
exit 1
fi
}
# When the variable REUSE_SNAPD is set to 1, we don't remove and purge snapd.
# In that case we just cleanup the environment by removing installed snaps as
# it is done for core systems.
if os.query is-core || [ "$REUSE_SNAPD" = 1 ]; then
reset_all_snap "$@"
else
reset_classic "$@"
fi
# Discard all mount namespaces and active mount profiles.
# This is duplicating logic in snap-discard-ns but it doesn't
# support --all switch yet so we cannot use it.
if [ -d /run/snapd/ns ]; then
for mnt in /run/snapd/ns/*.mnt; do
umount -l "$mnt" || true
rm -f "$mnt"
done
find /run/snapd/ns/ \( -name '*.fstab' -o -name '*.user-fstab' -o -name '*.info' \) -delete
fi
if [ "$REMOTE_STORE" = staging ] && [ "$1" = "--store" ]; then
# shellcheck source=tests/lib/store.sh
. "$TESTSLIB"/store.sh
teardown_staging_store
fi
|