homelab infrastructure services
1#!/bin/bash
2# tin sheet rm - Remove sheet and all its machines
3
4set -euo pipefail
5
6# Get tinsnip root and source libraries
7SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8TINSNIP_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
9source "$TINSNIP_ROOT/lib/core.sh"
10source "$TINSNIP_ROOT/lib/uid.sh"
11source "$TINSNIP_ROOT/lib/registry.sh"
12
13# Remove sheet and cascade to machines
14remove_sheet() {
15 local sheet="$1"
16 local delete_data="${2:-false}"
17
18 log_with_prefix "Sheet Remove" "Removing sheet: $sheet"
19 echo
20
21 # Check if sheet exists
22 local sheet_num
23 if ! sheet_num=$(get_sheet_number "$sheet" 2>/dev/null); then
24 error_with_prefix "Sheet Remove" "Sheet '$sheet' is not registered"
25 echo "Available sheets:" >&2
26 list_sheets | while IFS='=' read -r name number; do
27 echo " $name (sheet $number)" >&2
28 done
29 exit 1
30 fi
31
32 echo "Sheet Details:"
33 echo " Name: $sheet"
34 echo " Number: $sheet_num"
35 echo
36
37 # Find all machines on this sheet
38 local machines=()
39 for user_entry in $(getent passwd | grep "^[^:]*:[^:]*:[0-9]\{5\}:"); do
40 local username=$(echo "$user_entry" | cut -d: -f1)
41 local uid=$(echo "$user_entry" | cut -d: -f3)
42
43 # Extract sheet number from UID (first digit)
44 local user_sheet_num="${uid:0:1}"
45
46 # Check if this user belongs to this sheet
47 if [[ "$user_sheet_num" == "$sheet_num" ]]; then
48 machines+=("$username")
49 fi
50 done
51
52 if [[ ${#machines[@]} -gt 0 ]]; then
53 echo "WARNING: Found ${#machines[@]} machine(s) on this sheet:"
54 for machine in "${machines[@]}"; do
55 echo " - $machine"
56 done
57 echo
58 read -p "Remove all machines first? [Y/n]: " remove_machines
59 case "${remove_machines:-y}" in
60 [Yy]*|"")
61 for machine in "${machines[@]}"; do
62 log_with_prefix "Sheet Remove" "Removing machine: $machine"
63 if [[ "$delete_data" == "true" ]]; then
64 # Use --no-confirm to skip prompts but keep stdin as terminal for NAS deletion
65 "$TINSNIP_ROOT/cmd/machine/rm.sh" "$machine" --delete-data --no-confirm
66 else
67 "$TINSNIP_ROOT/cmd/machine/rm.sh" "$machine" --no-confirm
68 fi
69 done
70 echo
71 ;;
72 *)
73 log_with_prefix "Sheet Remove" "Removal cancelled"
74 exit 0
75 ;;
76 esac
77 fi
78
79 # Remove sheet from registry
80 echo
81 log_with_prefix "Sheet Remove" "Removing from sheet registry..."
82
83 # Check if we're removing topsheet
84 if [[ "$sheet" == "topsheet" ]]; then
85 error_with_prefix "Sheet Remove" "Cannot remove topsheet (infrastructure sheet)"
86 echo "The topsheet contains the station machine and registry." >&2
87 exit 1
88 fi
89
90 # Remove from station registry (as station-prod)
91 if [[ -f "$SHEET_REGISTRY" ]]; then
92 sudo -u station-prod sed -i "/^${sheet}=/d" "$SHEET_REGISTRY"
93 echo " SUCCESS: Removed from sheet registry"
94 fi
95
96 # Remove per-sheet machine registry file (as station-prod)
97 local machine_registry="$MACHINE_REGISTRY_DIR/$sheet"
98 if [[ -f "$machine_registry" ]]; then
99 log_with_prefix "Sheet Remove" "Removing machine registry for sheet..."
100 sudo -u station-prod rm -f "$machine_registry"
101 echo " SUCCESS: Removed machine registry"
102 fi
103
104 echo
105 log_with_prefix "Sheet Remove" "SUCCESS: Sheet '$sheet' removed successfully"
106 if [[ "$delete_data" != "true" ]]; then
107 echo
108 echo "NAS data preserved. To restore:"
109 echo " tin sheet create $sheet"
110 echo " tin machine create <machine> <env> <nas-server>"
111 fi
112}
113
114show_help() {
115 cat << EOF
116tin sheet rm - Remove sheet and all its machines
117
118USAGE:
119 tin sheet rm <sheet-name> [--delete-data]
120
121DESCRIPTION:
122 Remove a sheet including all its machines and catalog services.
123 By default, NAS data is PRESERVED for recovery.
124 Automatically removes all machines (which cascade to catalog services).
125
126ARGUMENTS:
127 <sheet-name> Sheet to remove (e.g., infrastructure)
128
129OPTIONS:
130 --delete-data Also delete ALL data on NAS for this sheet (DANGEROUS!)
131
132EXAMPLES:
133 tin sheet rm infrastructure # Remove sheet, keep NAS data
134 tin sheet rm infrastructure --delete-data # Remove sheet AND delete ALL NAS data
135
136NOTES:
137 - Automatically removes all machines on the sheet (with confirmation)
138 - Each machine removal cascades to its catalog services
139 - Default behavior preserves NAS data (CD-friendly)
140 - Sheet can be recreated and machines restored from preserved data
141 - Use --delete-data only when permanently decommissioning entire sheet
142
143WARNING:
144 --delete-data will PERMANENTLY DELETE all data for all catalog services on this sheet!
145 Cannot remove 'topsheet' (infrastructure sheet containing station registry)
146
147EOF
148}
149
150# Handle help flags
151case "${1:-}" in
152 --help|-h|help)
153 show_help
154 exit 0
155 ;;
156esac
157
158# Main execution
159if [[ $# -eq 0 ]]; then
160 error_with_prefix "Sheet Remove" "Sheet name required"
161 echo "Usage: tin sheet rm <sheet-name> [--delete-data]" >&2
162 exit 1
163fi
164
165sheet="$1"
166delete_data="false"
167
168if [[ "${2:-}" == "--delete-data" ]]; then
169 delete_data="true"
170fi
171
172remove_sheet "$sheet" "$delete_data"