github.com/canonical/ubuntu-image@v0.0.0-20240430122802-2202fe98b290/tests/lib/external/snapd-testing-tools/tools/snaps.cleanup (about) 1 #!/bin/bash -e 2 3 show_help() { 4 echo "usage: snaps.cleanup [--skip <SNAP_NAME>]" 5 echo 6 echo "cleanup the snaps installed in the current system" 7 } 8 9 cleanup() { 10 snap_mount_dir="$(os.paths snap-mount-dir)" 11 remove_bases="" 12 skip_bases="" 13 14 gadget_name="$(snaps.name gadget)" 15 kernel_name="$(snaps.name kernel)" 16 core_name="$(snaps.name core)" 17 18 # remove all app snaps first 19 for snap in "$snap_mount_dir"/*; do 20 snap="${snap:6}" 21 case "$snap" in 22 "bin" | "$gadget_name" | "$kernel_name" | "$core_name" | "snapd" |README) 23 ;; 24 *) 25 # Check if a snap should be kept, there's a list of those in spread.yaml. 26 local keep=0 27 # shellcheck disable=SC2068 28 for skip_snap in $@; do 29 if [ "$snap" = "$skip_snap" ]; then 30 # Skip the snap base removal as well 31 snap_base=$(grep "base:" "$snap_mount_dir/$snap/current/meta/snap.yaml" | awk '{ print $2 }') 32 if [ -n "$snap_base" ]; then 33 skip_bases="$skip_bases $snap_base" 34 fi 35 keep=1 36 break 37 fi 38 done 39 if [ "$keep" -eq 0 ]; then 40 # remove regular snaps right away; collect base snaps for removal in the second step below? 41 if snap info --verbose "$snap" | grep -E '^type: +(base|core)'; then 42 if [ -z "$remove_bases" ]; then 43 remove_bases="$snap" 44 else 45 remove_bases="$remove_bases $snap" 46 fi 47 else 48 snap remove --purge "$snap" 49 fi 50 fi 51 ;; 52 esac 53 done 54 # remove all base/os snaps at the end 55 # skip the base snaps for the 56 if [ -n "$remove_bases" ]; then 57 for base in $remove_bases; do 58 if ! [[ $skip_bases =~ (^|[[:space:]])$base($|[[:space:]]) ]]; then 59 snap remove --purge "$base" 60 if [ -d "$snap_mount_dir/$base" ]; then 61 echo "Error: removing base $base has unexpected leftover dir $snap_mount_dir/$base" 62 ls -al "$snap_mount_dir" 63 ls -al "$snap_mount_dir/$base" 64 exit 1 65 fi 66 fi 67 done 68 fi 69 } 70 71 main() { 72 local skip 73 skip="" 74 while [ $# -gt 0 ]; do 75 case "$1" in 76 -h|--help) 77 show_help 78 exit 0 79 ;; 80 --skip) 81 skip="$skip $2" 82 shift 2 83 ;; 84 *) 85 echo "snaps.cleanup: unknown subcommand $1" >&2 86 show_help 87 exit 1 88 ;; 89 esac 90 done 91 cleanup "$skip" 92 } 93 94 main "$@"