File: snaps.cleanup

package info (click to toggle)
snapd 2.72-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 80,412 kB
  • sloc: sh: 16,506; ansic: 16,211; python: 11,213; makefile: 1,919; exp: 190; awk: 58; xml: 22
file content (98 lines) | stat: -rwxr-xr-x 3,188 bytes parent folder | download | duplicates (2)
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
#!/bin/bash -e

show_help() {
    echo "usage: snaps.cleanup [--skip <SNAP_NAME>]"
    echo
    echo "cleanup the snaps installed in the current system"
}

cleanup() {
    snap_mount_dir="$(os.paths snap-mount-dir)"
    remove_bases=""
    skip_bases=""

    gadget_name="$(snaps.name gadget)"
    kernel_name="$(snaps.name kernel)"
    core_name="$(snaps.name core)"

    # remove first snapcraft to avoid reinstallation of lxd triggered by
    # snapcraft remove hook.
    [ -d "$snap_mount_dir"/snapcraft ] && snap remove --purge snapcraft

    # 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.
                local keep=0
                # shellcheck disable=SC2068
                for skip_snap in $@; do
                    if [ "$snap" = "$skip_snap" ]; then
                        # Skip the snap base removal as well
                        snap_base=$(grep "base:" "$snap_mount_dir/$snap/current/meta/snap.yaml" | awk '{ print $2 }')
                        if [ -n "$snap_base" ]; then
                            skip_bases="$skip_bases $snap_base"
                        fi
                        keep=1
                        break
                    fi
                done
                if [ "$keep" -eq 0 ]; then
                    # remove regular snaps right away; collect base snaps for removal in the second step below?
                    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
    # skip the base snaps for the 
    if [ -n "$remove_bases" ]; then
        for base in $remove_bases; do
            if ! [[ $skip_bases =~ (^|[[:space:]])$base($|[[:space:]]) ]]; then
                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
            fi
        done
    fi
}

main() {
    local skip
    skip=""
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)
                show_help
                exit 0
                ;;
            --skip)
                skip="$skip $2"
                shift 2
                ;;
            *)
                echo "snaps.cleanup: unknown subcommand $1" >&2
                show_help
                exit 1
                ;;
        esac
    done
    cleanup "$skip"
}

main "$@"