devmatrix-scripts/setup_truenas_shares.sh

186 lines
6.9 KiB
Bash

#!/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!"