#!/bin/bash # TrueNAS Share Setup Script for DevMatrix (Idempotent) # Run this on TrueNAS as root # This script checks if resources exist before creating them set -e # Configuration DATASET_NAME="NAS2" SHARE_PREFIX="devmatrix" NETWORK_ALLOW="192.168.5.0/24" echo "☁️ Setting up TrueNAS shares for DevMatrix..." echo " Dataset: $DATASET_NAME" echo " Network: $NETWORK_ALLOW" echo "" # ============================================ # CREATE DATASET STRUCTURE (Skip if exists) # ============================================ echo "📁 Checking datasets..." # Main dataset main_dataset="$DATASET_NAME/$SHARE_PREFIX" if zfs list "$main_dataset" >/dev/null 2>&1; then echo "✓ Dataset exists: $main_dataset" else zfs create "$main_dataset" echo "✓ Created: $main_dataset" fi # Sub-datasets for subdir in projects backups iso-archive shared; do dataset_path="$DATASET_NAME/$SHARE_PREFIX/$subdir" if zfs list "$dataset_path" >/dev/null 2>&1; then echo "✓ Dataset exists: $dataset_path" else zfs create "$dataset_path" echo "✓ Created: $dataset_path" fi done # ============================================ # SET PERMISSIONS (Always ensure correct) # ============================================ echo "" echo "🔐 Setting permissions..." mountpoint_base=$(zfs get -H -o value mountpoint "$DATASET_NAME") for subdir in projects backups iso-archive shared; do mountpath="$mountpoint_base/$SHARE_PREFIX/$subdir" chown -R nobody:nogroup "$mountpath" chmod -R 777 "$mountpath" echo "✓ Permissions set: $subdir" done # ============================================ # ENABLE NFS SERVICE (Skip if running) # ============================================ echo "" echo "🚀 Checking NFS service..." nfs_status=$(midclt call service.query '[["service","=","nfs"]]' 2>/dev/null | grep -o '"state": "[^"]*"' | cut -d'"' -f4) if [ "$nfs_status" = "RUNNING" ]; then echo "✓ NFS service already running" else 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 # ============================================ # CREATE NFS SHARES (Skip if exists) # ============================================ echo "" echo "🔗 Checking NFS shares..." # 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 NFS shares for share in projects backups iso-archive shared; do path="$mountpoint_base/$SHARE_PREFIX/$share" if check_nfs_share "$path"; then echo "✓ NFS share exists: $share" else 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 done # ============================================ # ENABLE SMB SERVICE (Skip if running) # ============================================ echo "" echo "🖥️ Checking SMB service..." smb_status=$(midclt call service.query '[["service","=","cifs"]]' 2>/dev/null | grep -o '"state": "[^"]*"' | cut -d'"' -f4) if [ "$smb_status" = "RUNNING" ]; then 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" fi # ============================================ # CREATE SMB SHARES (Skip if exists) # ============================================ echo "" echo "🔗 Checking SMB shares..." # Function to check if SMB share exists check_smb_share() { local path=$1 midclt call sharing.smb.query "[[\"path\",\"=\",\"$path\"]]" 2>/dev/null | grep -q "$path" } # Create SMB shares (no iso-archive for SMB) for share in projects backups shared; do path="$mountpoint_base/$SHARE_PREFIX/$share" 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 # ============================================ echo "" echo "╔════════════════════════════════════════════════════════╗" echo "║ TRUENAS SETUP COMPLETE ║" echo "╠════════════════════════════════════════════════════════╣" echo "║ ║" echo "║ Datasets: ║" echo "║ ✓ $DATASET_NAME/$SHARE_PREFIX ║" echo "║ ✓ .../projects ║" echo "║ ✓ .../backups ║" echo "║ ✓ .../iso-archive ║" echo "║ ✓ .../shared ║" echo "║ ║" echo "║ NFS Shares (Linux VMs): ║" echo "║ ✓ /mnt/$DATASET_NAME/$SHARE_PREFIX/projects ║" echo "║ ✓ /mnt/$DATASET_NAME/$SHARE_PREFIX/backups ║" echo "║ ✓ /mnt/$DATASET_NAME/$SHARE_PREFIX/iso-archive ║" echo "║ ✓ /mnt/$DATASET_NAME/$SHARE_PREFIX/shared ║" echo "║ ║" 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 "Run this script again anytime to add missing resources!"