homelab infrastructure services
at main 172 lines 5.5 kB view raw
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"