aboutsummaryrefslogtreecommitdiff
path: root/remove-machine
blob: 71c1fc1cf8a85e5f330b95e9d93b7ddde6f8849e (plain)
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
#! /usr/bin/env bash

# Remove machine from a Build OS build host.
#
# Note that this removes the entire machine directory with all the subvolumes,
# etc., rather than a specific machine subvolume.
#
# <host>        - build host to upload to (as user 'build')
# <machine>     - machine name including version
#
usage="usage: $0 <host> <machine>"

machines=/build/machines/default

owd="$(pwd)"
trap "{ cd '$owd'; exit 1; }" ERR
set -o errtrace # Trap in functions.

function info () { echo "$*" 1>&2; }
function error () { info "$*"; exit 1; }

while [ "$#" -gt 0 ]; do
  case "$1" in
    -*)
      error "unknown option: $1"
      ;;
    *)
      break
      ;;
  esac
done

host="$1"
machine="${2%/}"

if [ -z "$host" -o -z "$machine" ]; then
  error "$usage"
fi

# Get the machine link (<name>-<P>) and name.
#
mlink="$(sed -n -re 's/^(.+-[0-9]+)\.[0-9]+$/\1/p' <<<"$machine")"
mname="$(sed -n -re 's/^(.+)-[0-9]+$/\1/p' <<<"$mlink")"

if [ -z "$mlink" -o -z "$mname" ]; then
  error "unable to extract machine link/name from '$machine'"
fi

host="build@$host"

# Make sure the machine exists.
#
if ! ssh "$host" test -d "$machines/$mname"; then
  error "$machines/$mname does not exist on $host"
fi

set -x

# Remove the current machine symlink, if any.
#
ssh "$host" rm -f "$machines/$mname/$mlink"

# Wait for all the <name>-<toolchain>-<xxx> subvolumes to disappear.
#
{ set +x; } 2>/dev/null

sv=($(ssh "$host" "shopt -s nullglob; echo $machines/$mname/$mname-*-*/"))

for d in "${sv[@]}"; do
  while ssh "$host" test -d "$d"; do
    echo "waiting for $d to disappear..."
    sleep 10
  done
done

set -x

# Remove the initial and bootstrapped machine subvolume(s).
#
{ set +x; } 2>/dev/null

sv=($(ssh "$host" "shopt -s nullglob; echo $machines/$mname/$mname-*/"))

for d in "${sv[@]}"; do
  set -x
  ssh "$host" btrfs property set -ts "$d" ro false
  ssh "$host" btrfs subvolume delete "$d"
  { set +x; } 2>/dev/null
done

set -x

# Finally remove the machine directory (which should be empty).
#
ssh "$host" rmdir "$machines/$mname"