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 "$@"