#!/bin/bash # Registry management functions for tinsnip # Source core functions LIB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$LIB_DIR/core.sh" # Registry paths TINSNIP_STATION_DATA="/mnt/station-prod/data" SHEET_REGISTRY="$TINSNIP_STATION_DATA/sheets" MACHINE_REGISTRY_DIR="$TINSNIP_STATION_DATA/machines" NAS_CREDENTIALS_DIR="$TINSNIP_STATION_DATA/nas-credentials" # Check if tinsnip.station-prod is available check_tinsnip_station() { if [[ ! -d "$TINSNIP_STATION_DATA" ]]; then error_with_prefix "Registry" "tinsnip.station-prod not found at $TINSNIP_STATION_DATA" error_with_prefix "Registry" "Run: TIN_SHEET=topsheet tin machine station prod " return 1 fi return 0 } # Sheet registry functions list_sheets() { check_tinsnip_station || return 1 if [[ -f "$SHEET_REGISTRY" ]]; then grep -v '^#' "$SHEET_REGISTRY" | grep -v '^$' fi } get_sheet_from_registry() { local sheet="$1" check_tinsnip_station || return 1 if [[ -f "$SHEET_REGISTRY" ]]; then grep "^${sheet}=" "$SHEET_REGISTRY" | cut -d= -f2 fi } register_sheet_in_registry() { local sheet="$1" local number="$2" check_tinsnip_station || return 1 # Check if already registered if get_sheet_from_registry "$sheet" >/dev/null 2>&1; then error_with_prefix "Sheet Registry" "Sheet '$sheet' already registered" return 1 fi # Check if number already used if grep -q "=${number}$" "$SHEET_REGISTRY" 2>/dev/null; then error_with_prefix "Sheet Registry" "Sheet number '$number' already in use" return 1 fi # Add to registry (must write as station-prod user) echo "${sheet}=${number}" | sudo -u station-prod tee -a "$SHEET_REGISTRY" > /dev/null log_with_prefix "Sheet Registry" "Registered sheet: $sheet = $number" } find_next_sheet_number() { check_tinsnip_station || return 1 # Create registry if it doesn't exist if [[ ! -f "$SHEET_REGISTRY" ]]; then cat > "$SHEET_REGISTRY" << EOF # Sheet Registry # Format: sheet_name=sheet_number # Sheet 5 (topsheet) is reserved for platform services # User sheets use numbers 1-4 topsheet=5 EOF fi # Find next available number (1-4) for num in {1..4}; do if ! grep -q "=${num}$" "$SHEET_REGISTRY" 2>/dev/null; then echo "$num" return 0 fi done # No available numbers error_with_prefix "Sheet Registry" "Sheet registry full (range 1-4, 5 reserved for topsheet)" return 1 } # Machine registry functions list_machines() { local sheet="${1:-topsheet}" local machine_registry="$MACHINE_REGISTRY_DIR/$sheet/registry" if [[ -f "$machine_registry" ]]; then grep -v '^#' "$machine_registry" | grep -v '^$' else # Return empty - no machines registered yet for this sheet return 0 fi } get_machine_number() { local machine="$1" local sheet="${2:-topsheet}" local machine_registry="$MACHINE_REGISTRY_DIR/$sheet/registry" if [[ -f "$machine_registry" ]]; then grep "^${machine}=" "$machine_registry" | cut -d= -f2 fi } register_machine() { local machine="$1" local machine_number="$2" local sheet="${3:-${TIN_SHEET:-topsheet}}" local machine_registry="$MACHINE_REGISTRY_DIR/$sheet/registry" check_tinsnip_station || return 1 # Create sheet directory if needed (as station-prod) sudo -u station-prod mkdir -p "$MACHINE_REGISTRY_DIR/$sheet" # Create registry file if needed (as station-prod) if [[ ! -f "$machine_registry" ]]; then cat << EOF | sudo -u station-prod tee "$machine_registry" > /dev/null # Machine Registry for sheet: $sheet # Format: machine_name=machine_number # Machine numbers are 2-digit (00-99) and used in UID calculation EOF fi # Add or update machine entry (as station-prod) if grep -q "^${machine}=" "$machine_registry" 2>/dev/null; then sudo -u station-prod sed -i "s/^${machine}=.*/${machine}=${machine_number}/" "$machine_registry" else echo "${machine}=${machine_number}" | sudo -u station-prod tee -a "$machine_registry" > /dev/null fi log_with_prefix "Machine Registry" "Registered $machine = $machine_number (sheet: $sheet)" } unregister_machine() { local machine="$1" local sheet="${2:-${TIN_SHEET:-topsheet}}" local machine_registry="$MACHINE_REGISTRY_DIR/$sheet/registry" check_tinsnip_station || return 1 if [[ ! -f "$machine_registry" ]]; then return 1 fi # Remove machine entry (as station-prod) sudo -u station-prod sed -i "/^${machine}=/d" "$machine_registry" log_with_prefix "Machine Registry" "Unregistered $machine (sheet: $sheet)" } # NAS credential functions list_nas_servers() { check_tinsnip_station || return 1 if [[ -f "$NAS_CREDENTIALS_DIR/nas-servers" ]]; then grep -v '^#' "$NAS_CREDENTIALS_DIR/nas-servers" | grep -v '^$' fi } get_nas_server() { local sheet="$1" check_tinsnip_station || return 1 if [[ -f "$NAS_CREDENTIALS_DIR/nas-servers" ]]; then grep "^${sheet}=" "$NAS_CREDENTIALS_DIR/nas-servers" | cut -d= -f2 fi } register_nas_server() { local sheet="$1" local nas_server="$2" check_tinsnip_station || return 1 # Create nas-servers file if it doesn't exist (as station-prod) local nas_servers_file="$NAS_CREDENTIALS_DIR/nas-servers" sudo -u station-prod mkdir -p "$NAS_CREDENTIALS_DIR" if [[ ! -f "$nas_servers_file" ]]; then cat << EOF | sudo -u station-prod tee "$nas_servers_file" > /dev/null # NAS Server Registry # Format: sheet=nas_server_hostname # Used for automatic NAS discovery during machine setup EOF fi # Update or add entry (as station-prod) if grep -q "^${sheet}=" "$nas_servers_file" 2>/dev/null; then sudo -u station-prod sed -i "s/^${sheet}=.*/${sheet}=${nas_server}/" "$nas_servers_file" log_with_prefix "NAS Registry" "Updated NAS server for $sheet: $nas_server" else echo "${sheet}=${nas_server}" | sudo -u station-prod tee -a "$nas_servers_file" > /dev/null log_with_prefix "NAS Registry" "Registered NAS server for $sheet: $nas_server" fi } # Auto-discover NAS server for a sheet discover_nas_server() { local sheet="$1" check_tinsnip_station || return 1 # First check if explicitly registered for this sheet local nas_server=$(get_nas_server "$sheet") if [[ -n "$nas_server" ]]; then echo "$nas_server" return 0 fi # Fall back to default sheet server if no specific entry nas_server=$(get_nas_server "default") if [[ -n "$nas_server" ]]; then echo "$nas_server" return 0 fi # No NAS server found return 1 } # SSH key management functions has_nas_key() { local nas_server="$1" check_tinsnip_station || return 1 [[ -f "$NAS_CREDENTIALS_DIR/${nas_server}.key" ]] } get_nas_key_path() { local nas_server="$1" check_tinsnip_station || return 1 echo "$NAS_CREDENTIALS_DIR/${nas_server}.key" } # Usage examples show_registry_usage() { cat << EOF Registry Management Functions Sheet Registry: list_sheets # Show all registered sheets get_sheet_from_registry # Get number for sheet register_sheet_in_registry # Register new sheet find_next_sheet_number # Find next available sheet number Machine Registry: list_machines [sheet] # Show machines in sheet get_machine_number [sheet] # Get machine number NAS Management: list_nas_servers # Show registered NAS servers get_nas_server # Get NAS server for sheet register_nas_server # Register NAS server discover_nas_server # Auto-discover NAS server SSH Keys: has_nas_key # Check if SSH key exists get_nas_key_path # Get path to SSH key Example Usage: source "\$TINSNIP_ROOT/lib/registry.sh" list_sheets register_sheet_in_registry infrastructure 2 register_nas_server infrastructure DS412plus.local EOF }