feat: Make script idempotent - check before creating

This commit is contained in:
devmatrix 2026-02-16 14:00:21 +00:00
parent 5fa67c6ed3
commit 1878ff9c77
1 changed files with 118 additions and 110 deletions

View File

@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
# TrueNAS Share Setup Script for DevMatrix # TrueNAS Share Setup Script for DevMatrix (Idempotent)
# Run this on TrueNAS (192.168.5.195) as root # Run this on TrueNAS as root
# This script checks if resources exist before creating them
set -e set -e
@ -15,141 +16,141 @@ echo " Network: $NETWORK_ALLOW"
echo "" echo ""
# ============================================ # ============================================
# CREATE DATASET STRUCTURE # CREATE DATASET STRUCTURE (Skip if exists)
# ============================================ # ============================================
echo "📁 Creating dataset structure..." echo "📁 Checking datasets..."
# Main dataset (if not exists) # Main dataset
if ! zfs list "$DATASET_NAME/$SHARE_PREFIX" >/dev/null 2>&1; then main_dataset="$DATASET_NAME/$SHARE_PREFIX"
zfs create "$DATASET_NAME/$SHARE_PREFIX" if zfs list "$main_dataset" >/dev/null 2>&1; then
echo "Created: $DATASET_NAME/$SHARE_PREFIX" echo "Dataset exists: $main_dataset"
else else
echo "✓ Exists: $DATASET_NAME/$SHARE_PREFIX" zfs create "$main_dataset"
echo "✓ Created: $main_dataset"
fi fi
# Sub-datasets # Sub-datasets
for subdir in projects backups iso-archive shared; do for subdir in projects backups iso-archive shared; do
dataset_path="$DATASET_NAME/$SHARE_PREFIX/$subdir" dataset_path="$DATASET_NAME/$SHARE_PREFIX/$subdir"
if ! zfs list "$dataset_path" >/dev/null 2>&1; then if zfs list "$dataset_path" >/dev/null 2>&1; then
echo "✓ Dataset exists: $dataset_path"
else
zfs create "$dataset_path" zfs create "$dataset_path"
echo "✓ Created: $dataset_path" echo "✓ Created: $dataset_path"
else
echo "✓ Exists: $dataset_path"
fi fi
done done
# ============================================ # ============================================
# SET PERMISSIONS # SET PERMISSIONS (Always ensure correct)
# ============================================ # ============================================
echo "" echo ""
echo "🔐 Setting permissions..." echo "🔐 Setting permissions..."
# Set ownership (nobody:nogroup for NFS) mountpoint_base=$(zfs get -H -o value mountpoint "$DATASET_NAME")
for subdir in projects backups iso-archive shared; do for subdir in projects backups iso-archive shared; do
mountpoint=$(zfs get -H -o value mountpoint "$DATASET_NAME/$SHARE_PREFIX/$subdir") mountpath="$mountpoint_base/$SHARE_PREFIX/$subdir"
chown -R nobody:nogroup "$mountpoint" chown -R nobody:nogroup "$mountpath"
chmod -R 777 "$mountpoint" chmod -R 777 "$mountpath"
echo "✓ Permissions set for: $subdir" echo "✓ Permissions set: $subdir"
done done
# ============================================ # ============================================
# CREATE NFS SHARES # ENABLE NFS SERVICE (Skip if running)
# ============================================ # ============================================
echo "" echo ""
echo "🔗 Creating NFS shares..." echo "🚀 Checking NFS service..."
# Function to create NFS share nfs_status=$(midclt call service.query '[["service","=","nfs"]]' 2>/dev/null | grep -o '"state": "[^"]*"' | cut -d'"' -f4)
create_nfs_share() {
local name=$1
local path=$2
local options=$3
# Check if share already exists if [ "$nfs_status" = "RUNNING" ]; then
if midclt call sharing.nfs.query "[[\"path\",\"=\",\"$path\"]]" | grep -q "$path"; then echo "✓ NFS service already running"
echo "✓ NFS share exists: $name" else
return midclt call service.start "nfs" >/dev/null 2>&1 || true
midclt call service.update "nfs" '{"enable": true}' >/dev/null 2>&1 || true
echo "✓ NFS service started and enabled"
fi fi
# Create share using midclt (TrueNAS API) # ============================================
midclt call sharing.nfs.create "{ # CREATE NFS SHARES (Skip if exists)
\"path\": \"$path\", # ============================================
\"comment\": \"DevMatrix $name\", echo ""
\"hosts\": [\"$NETWORK_ALLOW\"], echo "🔗 Checking NFS shares..."
\"ro\": $options,
\"maproot_user\": \"root\",
\"maproot_group\": \"root\",
\"mapall_user\": \"\",
\"mapall_group\": \"\",
\"security\": ["SYS"]
}" > /dev/null
echo "✓ Created NFS share: $name ($path)" # Function to check if NFS share exists
check_nfs_share() {
local path=$1
midclt call sharing.nfs.query "[[\"path\",\"=\",\"$path\"]]" 2>/dev/null | grep -q "$path"
} }
# Create shares # Create NFS shares
mountpoint_base=$(zfs get -H -o value mountpoint "$DATASET_NAME") for share in projects backups iso-archive shared; do
path="$mountpoint_base/$SHARE_PREFIX/$share"
create_nfs_share "projects" "$mountpoint_base/$SHARE_PREFIX/projects" "false" if check_nfs_share "$path"; then
create_nfs_share "backups" "$mountpoint_base/$SHARE_PREFIX/backups" "false" echo "✓ NFS share exists: $share"
create_nfs_share "iso-archive" "$mountpoint_base/$SHARE_PREFIX/iso-archive" "false"
create_nfs_share "shared" "$mountpoint_base/$SHARE_PREFIX/shared" "false"
# ============================================
# ENABLE NFS SERVICE
# ============================================
echo ""
echo "🚀 Enabling NFS service..."
# Check if NFS is running
if ! midclt call service.query "[[\"service\",\"=\",\"nfs\"]]" | grep -q '"state": "RUNNING"'; then
midclt call service.start "nfs" > /dev/null
midclt call service.update "nfs" '{"enable": true}' > /dev/null
echo "✓ NFS service started and enabled"
else else
echo "✓ NFS service already running" echo " Creating NFS share: $share..."
midclt call sharing.nfs.create "{
\"path\": \"$path\",
\"comment\": \"DevMatrix $share\",
\"hosts\": [\"$NETWORK_ALLOW\"],
\"ro\": false,
\"maproot_user\": \"root\",
\"maproot_group\": \"root\",
\"security\": [\"SYS\"]
}" >/dev/null 2>&1
echo "✓ Created NFS share: $share"
fi fi
done
# ============================================ # ============================================
# CREATE SMB SHARES (Optional - for Windows access) # ENABLE SMB SERVICE (Skip if running)
# ============================================ # ============================================
echo "" echo ""
echo "🖥️ Creating SMB shares (for Windows access)..." echo "🖥️ Checking SMB service..."
# Enable SMB if not already smb_status=$(midclt call service.query '[["service","=","cifs"]]' 2>/dev/null | grep -o '"state": "[^"]*"' | cut -d'"' -f4)
if ! midclt call service.query "[[\"service\",\"=\",\"cifs\"]]" | grep -q '"state": "RUNNING"'; then
midclt call service.start "cifs" > /dev/null if [ "$smb_status" = "RUNNING" ]; then
midclt call service.update "cifs" '{"enable": true}' > /dev/null echo "✓ SMB service already running"
else
midclt call service.start "cifs" >/dev/null 2>&1 || true
midclt call service.update "cifs" '{"enable": true}' >/dev/null 2>&1 || true
echo "✓ SMB service started and enabled" echo "✓ SMB service started and enabled"
fi fi
# Function to create SMB share # ============================================
create_smb_share() { # CREATE SMB SHARES (Skip if exists)
local name=$1 # ============================================
local path=$2 echo ""
echo "🔗 Checking SMB shares..."
# Check if exists # Function to check if SMB share exists
if midclt call sharing.smb.query "[[\"path\",\"=\",\"$path\"]]" | grep -q "$path"; then check_smb_share() {
echo "✓ SMB share exists: $name" local path=$1
return midclt call sharing.smb.query "[[\"path\",\"=\",\"$path\"]]" 2>/dev/null | grep -q "$path"
fi
midclt call sharing.smb.create "{
\"path\": \"$path\",
\"name\": \"devmatrix-$name\",
\"comment\": \"DevMatrix $name\",
\"browseable\": true,
\"readonly\": false,
\"guestok\": true,
\"afp\": false
}" > /dev/null
echo "✓ Created SMB share: devmatrix-$name"
} }
# Create SMB shares # Create SMB shares (no iso-archive for SMB)
create_smb_share "projects" "$mountpoint_base/$SHARE_PREFIX/projects" for share in projects backups shared; do
create_smb_share "backups" "$mountpoint_base/$SHARE_PREFIX/backups" path="$mountpoint_base/$SHARE_PREFIX/$share"
create_smb_share "shared" "$mountpoint_base/$SHARE_PREFIX/shared" share_name="devmatrix-$share"
if check_smb_share "$path"; then
echo "✓ SMB share exists: $share_name"
else
echo " Creating SMB share: $share_name..."
midclt call sharing.smb.create "{
\"path\": \"$path\",
\"name\": \"$share_name\",
\"comment\": \"DevMatrix $share\",
\"browseable\": true,
\"readonly\": false,
\"guestok\": true
}" >/dev/null 2>&1
echo "✓ Created SMB share: $share_name"
fi
done
# ============================================ # ============================================
# SUMMARY # SUMMARY
@ -159,19 +160,26 @@ echo "╔═══════════════════════
echo "║ TRUENAS SETUP COMPLETE ║" echo "║ TRUENAS SETUP COMPLETE ║"
echo "╠════════════════════════════════════════════════════════╣" echo "╠════════════════════════════════════════════════════════╣"
echo "║ ║" echo "║ ║"
echo "║ NFS Shares (for Linux VMs): ║" echo "║ Datasets: ║"
echo "$mountpoint_base/$SHARE_PREFIX/projects ║" echo "║ ✓ $DATASET_NAME/$SHARE_PREFIX"
echo "$mountpoint_base/$SHARE_PREFIX/backups ║" echo "║ ✓ .../projects ║"
echo "$mountpoint_base/$SHARE_PREFIX/iso-archive ║" echo "║ ✓ .../backups ║"
echo "$mountpoint_base/$SHARE_PREFIX/shared ║" echo "║ ✓ .../iso-archive ║"
echo "║ ✓ .../shared ║"
echo "║ ║" echo "║ ║"
echo "║ SMB Shares (for Windows): ║" echo "║ NFS Shares (Linux VMs): ║"
echo "║ \\$(hostname)\\devmatrix-projects ║" echo "║ ✓ /mnt/$DATASET_NAME/$SHARE_PREFIX/projects ║"
echo "║ \\$(hostname)\\devmatrix-backups ║" echo "║ ✓ /mnt/$DATASET_NAME/$SHARE_PREFIX/backups ║"
echo "║ \\$(hostname)\\devmatrix-shared ║" echo "║ ✓ /mnt/$DATASET_NAME/$SHARE_PREFIX/iso-archive ║"
echo "║ ✓ /mnt/$DATASET_NAME/$SHARE_PREFIX/shared ║"
echo "║ ║" echo "║ ║"
echo "║ Access from: $NETWORK_ALLOW" echo "║ SMB Shares (Windows): ║"
echo "║ ✓ \\truenas\devmatrix-projects ║"
echo "║ ✓ \\truenas\devmatrix-backups ║"
echo "║ ✓ \\truenas\devmatrix-shared ║"
echo "║ ║"
echo "║ Access: $NETWORK_ALLOW"
echo "║ ║" echo "║ ║"
echo "╚════════════════════════════════════════════════════════╝" echo "╚════════════════════════════════════════════════════════╝"
echo "" echo ""
echo "Next: Run 'setup_truenas.sh' inside VM 300 to mount these shares" echo "Run this script again anytime to add missing resources!"