homelab infrastructure services
at main 139 lines 4.4 kB view raw
1#!/bin/bash 2# tin sheet create - Create/register new sheet 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/registry.sh" 11 12# Register a new sheet (interactive) 13register_sheet_interactive() { 14 local sheet="$1" 15 16 log_with_prefix "Sheet Registration" "Registering sheet: $sheet" 17 echo 18 19 # Check if topsheet.station-prod is available 20 if ! check_tinsnip_station; then 21 error_with_prefix "Sheet Registration" "Cannot register sheets without topsheet.station-prod" 22 fi 23 24 # Check if sheet already registered 25 if get_sheet_from_registry "$sheet" >/dev/null 2>&1; then 26 local existing_number=$(get_sheet_from_registry "$sheet") 27 log_with_prefix "Sheet Registration" "Sheet '$sheet' already registered with number $existing_number" 28 return 0 29 fi 30 31 # Find next available number 32 local next_number 33 if ! next_number=$(find_next_sheet_number); then 34 error_with_prefix "Sheet Registration" "No available sheet numbers (range 1-4 full)" 35 fi 36 37 log_with_prefix "Sheet Registration" "Assigning sheet number: $next_number" 38 39 # Register the sheet 40 register_sheet_in_registry "$sheet" "$next_number" 41 42 # Create initial machine registry directory and file for this sheet 43 local machine_registry_dir="/mnt/station-prod/data/machines/$sheet" 44 local machine_registry="$machine_registry_dir/registry" 45 46 # Create directory if it doesn't exist 47 if [[ ! -d "$machine_registry_dir" ]]; then 48 sudo -u station-prod mkdir -p "$machine_registry_dir" 49 fi 50 51 # Create registry file if it doesn't exist 52 if [[ ! -f "$machine_registry" ]]; then 53 cat << EOF | sudo -u station-prod tee "$machine_registry" > /dev/null 54# Machine Registry for sheet: $sheet 55# Format: machine_name=machine_number 56# Machine numbers are 2-digit (00-99) and used in UID calculation 57EOF 58 log_with_prefix "Sheet Registration" "Created machine registry for sheet" 59 fi 60 61 echo 62 log_with_prefix "Sheet Registration" "✅ Sheet '$sheet' registered successfully" 63 64 # Show current sheets 65 echo 66 echo "Registered sheets:" 67 list_sheets | while IFS='=' read -r name number; do 68 echo " $name = $number" 69 done 70 71 echo 72 log_with_prefix "Next Steps" "Create machines on this sheet:" 73 echo " TIN_SHEET=$sheet tin machine create <machine> <env> <nas-server>" 74} 75 76show_help() { 77 cat << EOF 78tin sheet create - Create/register new sheet 79 80USAGE: 81 tin sheet create <name> 82 tin sheet <name> # Shorthand 83 84DESCRIPTION: 85 Register a new sheet for isolating machines. Each sheet gets a unique 86 number and separate storage paths. Sheets enable multi-tenant deployments. 87 88ARGUMENTS: 89 <name> Sheet name (lowercase alphanumeric with hyphens and dots) 90 91EXAMPLES: 92 tin sheet create infrastructure # Register 'infrastructure' sheet 93 tin sheet mycompany.com # Register domain-based sheet 94 tin sheet mycompany # Shorthand to register 'mycompany' 95 96NOTES: 97 - Sheet names can include domain names (e.g., example.com) 98 - Allowed characters: lowercase letters, numbers, hyphens, dots 99 - Sheet 'topsheet' is reserved for platform services 100 - Each sheet gets a unique number (1-4) for UID/port allocation 101 102EOF 103} 104 105# Main execution 106if [[ $# -eq 0 ]]; then 107 error_with_prefix "Sheet Create" "Sheet name required" 108 echo "Usage: tin sheet create <name>" >&2 109 exit 1 110fi 111 112# Handle help flags 113case "${1:-}" in 114 --help|-h|help) 115 show_help 116 exit 0 117 ;; 118esac 119 120sheet="$1" 121 122# Reject flags as sheet names 123if [[ "$sheet" =~ ^-- ]]; then 124 error_with_prefix "Sheet Create" "Sheet name cannot start with '--' (looks like a flag)" 125 echo "Usage: tin sheet create <name>" >&2 126 exit 1 127fi 128 129# Validate sheet name (lowercase alphanumeric with hyphens and dots for domain names) 130if [[ ! "$sheet" =~ ^[a-z0-9.-]+$ ]]; then 131 error_with_prefix "Sheet Create" "Sheet name must be lowercase alphanumeric with hyphens and dots only" 132fi 133 134# Cannot register topsheet (reserved) 135if [[ "$sheet" == "topsheet" ]]; then 136 error_with_prefix "Sheet Create" "Cannot register 'topsheet' - reserved for platform services" 137fi 138 139register_sheet_interactive "$sheet"