netgescon-day0/scripts/ai/bootstrap_docs_lan_share.sh

137 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
MODE="${1:-}"
usage() {
cat >&2 <<'EOF'
Uso:
server: bootstrap_docs_lan_share.sh server /percorso/day0 192.168.0.0/24 [share_dir] [modules_csv]
client: bootstrap_docs_lan_share.sh client host:/export/path /mount/point /workspace/path
EOF
exit 1
}
require_cmd() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "Comando richiesto non trovato: $1" >&2
exit 1
fi
}
copy_tree() {
local src="$1"
local dst="$2"
mkdir -p "$dst"
if command -v rsync >/dev/null 2>&1; then
rsync -a --delete "$src/" "$dst/"
else
rm -rf "$dst"
mkdir -p "$dst"
cp -a "$src/." "$dst/"
fi
}
server_mode() {
local day0_root="${2:-}"
local network_cidr="${3:-}"
local share_dir="${4:-/srv/netgescon/shared-docs}"
local modules_csv="${5:-docs,scripts/ai}"
local -a module_paths=()
local module
[[ -n "$day0_root" && -n "$network_cidr" ]] || usage
[[ -d "$day0_root/docs" ]] || { echo "docs/ non trovata in $day0_root" >&2; exit 1; }
[[ -d "$day0_root/scripts/ai" ]] || { echo "scripts/ai non trovata in $day0_root" >&2; exit 1; }
mkdir -p "$share_dir/scripts" "$share_dir/exchange" "$share_dir/modules"
copy_tree "$day0_root/docs" "$share_dir/docs"
copy_tree "$day0_root/scripts/ai" "$share_dir/scripts/ai"
IFS=',' read -r -a module_paths <<< "$modules_csv"
for module in "${module_paths[@]}"; do
module="${module#./}"
module="${module%/}"
[[ -n "$module" ]] || continue
[[ "$module" == "docs" || "$module" == "scripts/ai" ]] && continue
if [[ -d "$day0_root/$module" ]]; then
mkdir -p "$share_dir/modules/$(dirname "$module")"
copy_tree "$day0_root/$module" "$share_dir/modules/$module"
fi
done
cat <<EOF
SERVER_SHARE_DIR=$share_dir
SERVER_EXPORT_LINE=$share_dir $network_cidr(ro,sync,no_subtree_check)
Comandi lato server:
sudo mkdir -p $share_dir
echo '$share_dir $network_cidr(ro,sync,no_subtree_check)' | sudo tee /etc/exports.d/netgescon-docs.exports
sudo exportfs -rav
sudo systemctl enable --now nfs-server
Contenuto pronto:
$share_dir/docs
$share_dir/scripts/ai
$share_dir/exchange
$share_dir/modules
Nota moduli:
moduli richiesti = $modules_csv
i moduli presenti vengono copiati sotto $share_dir/modules/
EOF
}
client_mode() {
local remote_export="${2:-}"
local mount_point="${3:-}"
local workspace_dir="${4:-}"
[[ -n "$remote_export" && -n "$mount_point" && -n "$workspace_dir" ]] || usage
require_cmd ln
mkdir -p "$mount_point"
mkdir -p "$workspace_dir/scripts" "$workspace_dir/modules"
mkdir -p "$workspace_dir/notes"
ln -sfn "$mount_point/docs" "$workspace_dir/docs"
ln -sfn "$mount_point/scripts/ai" "$workspace_dir/scripts/ai"
ln -sfn "$mount_point/exchange" "$workspace_dir/exchange"
ln -sfn "$mount_point/modules" "$workspace_dir/modules/shared"
cat <<EOF
CLIENT_REMOTE_EXPORT=$remote_export
CLIENT_MOUNT_POINT=$mount_point
CLIENT_WORKSPACE_DIR=$workspace_dir
Comando mount manuale:
sudo mount -t nfs $remote_export $mount_point
Riga suggerita per /etc/fstab:
$remote_export $mount_point nfs defaults,_netdev 0 0
Workspace pronto:
$workspace_dir
$workspace_dir/docs -> $mount_point/docs
$workspace_dir/scripts/ai -> $mount_point/scripts/ai
$workspace_dir/exchange -> $mount_point/exchange
$workspace_dir/modules/shared -> $mount_point/modules
EOF
}
case "$MODE" in
server)
server_mode "$@"
;;
client)
client_mode "$@"
;;
*)
usage
;;
esac