custom-nas/src/db/config_gen.ts

78 lines
3.0 KiB
TypeScript

export interface NasConfigOptions {
serial_number: string;
hostname: string;
domain: string;
pool_name: string;
raid_level: "raidz1" | "raidz2" | "mirror" | "stripe";
drive_bays: number; // 4 to 8
enable_spire: boolean;
enable_supercap_daemon: boolean;
fan_profile: "silent" | "balanced" | "performance";
}
export function generateZfsProvisioningScript(opts: NasConfigOptions): string {
const baysCount = Math.max(1, Math.min(8, isNaN(opts.drive_bays) ? 8 : opts.drive_bays));
const drives = Array.from({ length: baysCount }, (_, i) => `/dev/disk/by-path/pci-0000:01:00.0-sas-phy${i}-lun-0`).join(" ");
const cleanSerial = (opts.serial_number || "NAS-6U-2026-0001").replace(/["$`\\]/g, "");
const cleanHostname = (opts.hostname || "nas-core").replace(/["$`\\]/g, "");
const cleanDomain = (opts.domain || "atyg.org").replace(/["$`\\]/g, "");
const cleanPool = (opts.pool_name || "tank0").replace(/["$`\\]/g, "");
return `#!/usr/bin/env bash
# ==============================================================================
# Open-Source 6U Tri-Mode Storage Array — Automated Provisioning Script
# Chassis Serial: ${cleanSerial}
# Hostname: ${cleanHostname}.${cleanDomain}
# Target Environment: TrueNAS SCALE / Debian 12 (Kernel 6.6+ LTS)
# ==============================================================================
set -euo pipefail
echo "🚀 Provisioning 6U Tri-Mode Storage Array [${cleanSerial}]..."
# 1. System Hostname & Identity
hostnamectl set-hostname "${cleanHostname}.${cleanDomain}"
# 2. RP2040 OpenBMC UART Initialization
echo "🔧 Configuring RP2040 UART Telemetry on /dev/ttyS2 (115200 baud)..."
stty -F /dev/ttyS2 115200 raw -echo
cat << 'RP2040_CONF' > /etc/systemd/system/rp2040-bmc.service
[Unit]
Description=RP2040 OpenBMC Supervisor & Fan PID Daemon
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/rp2040-bmc-daemon --port /dev/ttyS2 --profile ${opts.fan_profile || "balanced"} --supercap-plp=${opts.enable_supercap_daemon ?? true}
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
RP2040_CONF
systemctl daemon-reload
systemctl enable --now rp2040-bmc.service || true
# 3. ZFS Pool Creation & Universal U.3 Tri-Mode Allocation
echo "💾 Initializing ZFS Pool [${cleanPool}] (${opts.raid_level || "raidz2"} across ${baysCount} U.3 bays)..."
zpool create -f -o ashift=12 \\
-O compression=zstd \\
-O atime=off \\
-O xattr=sa \\
-O acltype=posixacl \\
"${cleanPool}" ${opts.raid_level || "raidz2"} ${drives}
# 4. Supercapacitor PLP Emergency Flush Watchdog
if [ "${opts.enable_supercap_daemon ?? true}" = "true" ]; then
echo "⚡ Enabling LTC3350 Emergency Supercapacitor Flush Watchdog..."
cat << 'PLP_CONF' > /etc/udev/rules.d/99-ltc3350-plp.rules
# LTC3350 PFI Power-Fail Interrupt on GPIO4_C2
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="change", RUN+="/usr/local/bin/emergency-sync-flush.sh"
PLP_CONF
udevadm control --reload-rules || true
fi
echo "✅ Provisioning Complete for [${cleanSerial}]! Array is ONLINE."
`;
}