homelab infrastructure services
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"