78 lines
3.0 KiB
TypeScript
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."
|
|
`;
|
|
}
|