feat: Make script idempotent - check before creating
This commit is contained in:
parent
5fa67c6ed3
commit
1878ff9c77
|
|
@ -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 share exists: $name"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create share using midclt (TrueNAS API)
|
|
||||||
midclt call sharing.nfs.create "{
|
|
||||||
\"path\": \"$path\",
|
|
||||||
\"comment\": \"DevMatrix $name\",
|
|
||||||
\"hosts\": [\"$NETWORK_ALLOW\"],
|
|
||||||
\"ro\": $options,
|
|
||||||
\"maproot_user\": \"root\",
|
|
||||||
\"maproot_group\": \"root\",
|
|
||||||
\"mapall_user\": \"\",
|
|
||||||
\"mapall_group\": \"\",
|
|
||||||
\"security\": ["SYS"]
|
|
||||||
}" > /dev/null
|
|
||||||
|
|
||||||
echo "✓ Created NFS share: $name ($path)"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create shares
|
|
||||||
mountpoint_base=$(zfs get -H -o value mountpoint "$DATASET_NAME")
|
|
||||||
|
|
||||||
create_nfs_share "projects" "$mountpoint_base/$SHARE_PREFIX/projects" "false"
|
|
||||||
create_nfs_share "backups" "$mountpoint_base/$SHARE_PREFIX/backups" "false"
|
|
||||||
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
|
|
||||||
echo "✓ NFS service already running"
|
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
|
fi
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# CREATE SMB SHARES (Optional - for Windows access)
|
# CREATE NFS SHARES (Skip if exists)
|
||||||
# ============================================
|
# ============================================
|
||||||
echo ""
|
echo ""
|
||||||
echo "🖥️ Creating SMB shares (for Windows access)..."
|
echo "🔗 Checking NFS shares..."
|
||||||
|
|
||||||
# Enable SMB if not already
|
# Function to check if NFS share exists
|
||||||
if ! midclt call service.query "[[\"service\",\"=\",\"cifs\"]]" | grep -q '"state": "RUNNING"'; then
|
check_nfs_share() {
|
||||||
midclt call service.start "cifs" > /dev/null
|
local path=$1
|
||||||
midclt call service.update "cifs" '{"enable": true}' > /dev/null
|
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"
|
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!"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue