Showing 5 changed files with 475 additions and 513 deletions
+17 -0
CHANGELOG.md
@@ -1,5 +1,11 @@
1 1
 # AutoNAS - Change Log
2 2
 
3
+## [v3.1.2] - 2026-03-07
4
+
5
+### Fixed
6
+- motivatie: topologiile AutoNAS self-hosted pot monta exportul local inapoi ca storage Proxmox, iar shutdown-ul devenea dependent de o cursa implicita intre `umount.nfs4` si oprirea `nfs-server.service`
7
+- solutie: installerul genereaza acum un drop-in pentru `nfs-server.service` care ordoneaza explicit mount-urile Proxmox self-hosted identificate din `storage.cfg` inaintea opririi providerului NFS [ISSUE-2026-002]
8
+
3 9
 ## [v3.1.1] - 2026-03-07
4 10
 
5 11
 ### Fixed
@@ -10,6 +16,17 @@
10 16
 - this does not remove all self-hosted NFS edge cases; it only prevents the provider side from stopping before the client-side unmount phase finishes
11 17
 - PBS availability loss during `pgs suspend` on `ebony` remains expected while VM `301 is-anjohibe` is intentionally suspended
12 18
 
19
+## [v3.1.0] - 2026-03-06
20
+
21
+### Standardized Install Layout
22
+- standardized runtime under `/usr/local/lib/xdev/autonas`
23
+- moved the operator-facing command to `/usr/local/sbin/autonas`
24
+- standardized canonical uninstall path to `/usr/local/lib/xdev/autonas/uninstall.sh`
25
+- added `/etc/default/xdev-autonas` as the namespaced defaults location
26
+- added installed documentation under `/usr/local/share/doc/xdev/autonas`
27
+- updated systemd units and udev rules to use the namespaced runtime path
28
+- preserved cluster-shared config in `/etc/pve/autonas`
29
+- preserved `/mnt/autonas` and NFS export references as explicit uninstall exceptions
13 30
 
14 31
 ## [v3.0.1] - 2026-03-02
15 32
 
+128 -0
scripts/autonas-sync-systemd-ordering.sh
@@ -0,0 +1,128 @@
1
+#!/bin/bash
2
+
3
+set -euo pipefail
4
+
5
+CONFIG_FILE="${AUTONAS_CONFIG_FILE:-/etc/pve/autonas/disks.conf}"
6
+STORAGE_CFG="${AUTONAS_STORAGE_CFG:-/etc/pve/storage.cfg}"
7
+DROPIN_DIR="/etc/systemd/system/nfs-server.service.d"
8
+DROPIN_FILE="${DROPIN_DIR}/50-autonas-self-hosted-proxmox.conf"
9
+
10
+require_root() {
11
+    if [[ "${EUID}" -ne 0 ]]; then
12
+        echo "ERROR: this action must be run as root" >&2
13
+        exit 1
14
+    fi
15
+}
16
+
17
+collect_local_autonas_ips() {
18
+    [[ -f "${CONFIG_FILE}" ]] || return 0
19
+
20
+    local -A current_ip_map=()
21
+    local current_ip=""
22
+    while IFS= read -r current_ip; do
23
+        [[ -n "${current_ip}" ]] && current_ip_map["${current_ip}"]=1
24
+    done < <(ip -o -4 addr show up scope global | awk '{print $4}' | cut -d/ -f1 | sort -u)
25
+
26
+    [[ "${#current_ip_map[@]}" -gt 0 ]] || return 0
27
+
28
+    local cfg_ip=""
29
+    while IFS=: read -r _ _ cfg_ip _ _ _; do
30
+        [[ -z "${cfg_ip}" || "${cfg_ip}" == "LOCAL" || "${cfg_ip}" == "IMPORT" ]] && continue
31
+        [[ -n "${current_ip_map[${cfg_ip}]:-}" ]] && echo "${cfg_ip}"
32
+    done < <(grep -v '^[[:space:]]*#' "${CONFIG_FILE}" || true)
33
+}
34
+
35
+collect_self_hosted_mount_units() {
36
+    [[ -f "${STORAGE_CFG}" ]] || return 0
37
+
38
+    local -A local_ip_map=()
39
+    local ip=""
40
+    while IFS= read -r ip; do
41
+        [[ -n "${ip}" ]] && local_ip_map["${ip}"]=1
42
+    done < <(collect_local_autonas_ips)
43
+
44
+    [[ "${#local_ip_map[@]}" -gt 0 ]] || return 0
45
+
46
+    local -A mount_unit_map=()
47
+    local server=""
48
+    local path=""
49
+    local type=""
50
+    local line=""
51
+
52
+    emit_candidate() {
53
+        if [[ "${type}" == "nfs" && -n "${server}" && -n "${path}" && -n "${local_ip_map[${server}]:-}" ]]; then
54
+            mount_unit_map["$(systemd-escape --path --suffix=mount "${path}")"]=1
55
+        fi
56
+    }
57
+
58
+    while IFS= read -r line || [[ -n "${line}" ]]; do
59
+        if [[ "${line}" =~ ^[[:space:]]*# ]]; then
60
+            continue
61
+        fi
62
+
63
+        if [[ "${line}" =~ ^[[:space:]]*$ ]]; then
64
+            emit_candidate
65
+            type=""
66
+            server=""
67
+            path=""
68
+            continue
69
+        fi
70
+
71
+        if [[ ! "${line}" =~ ^[[:space:]] ]]; then
72
+            emit_candidate
73
+            type="${line%%:*}"
74
+            server=""
75
+            path=""
76
+            continue
77
+        fi
78
+
79
+        if [[ "${line}" =~ ^[[:space:]]*server[[:space:]]+(.+)$ ]]; then
80
+            server="${BASH_REMATCH[1]}"
81
+            continue
82
+        fi
83
+
84
+        if [[ "${line}" =~ ^[[:space:]]*path[[:space:]]+(.+)$ ]]; then
85
+            path="${BASH_REMATCH[1]}"
86
+            continue
87
+        fi
88
+    done < "${STORAGE_CFG}"
89
+
90
+    emit_candidate
91
+
92
+    printf '%s\n' "${!mount_unit_map[@]}" | sort
93
+}
94
+
95
+write_dropin() {
96
+    local units=("$@")
97
+
98
+    if [[ "${#units[@]}" -eq 0 ]]; then
99
+        rm -f "${DROPIN_FILE}"
100
+        rmdir "${DROPIN_DIR}" 2>/dev/null || true
101
+        return 0
102
+    fi
103
+
104
+    mkdir -p "${DROPIN_DIR}"
105
+    {
106
+        echo "# Managed by AutoNAS."
107
+        echo "# Keep self-hosted Proxmox NFS client mounts ordered before nfs-server shutdown."
108
+        echo "[Unit]"
109
+        printf 'Before='
110
+        printf '%s ' "${units[@]}"
111
+        printf '\n'
112
+    } > "${DROPIN_FILE}"
113
+}
114
+
115
+main() {
116
+    require_root
117
+
118
+    local units=()
119
+    local unit=""
120
+    while IFS= read -r unit; do
121
+        [[ -n "${unit}" ]] && units+=("${unit}")
122
+    done < <(collect_self_hosted_mount_units)
123
+
124
+    write_dropin "${units[@]}"
125
+    systemctl daemon-reload
126
+}
127
+
128
+main "$@"
+103 -212
scripts/autonas-uninstall.sh 1000644 → 1000755
@@ -1,225 +1,116 @@
1 1
 #!/bin/bash
2 2
 
3
-# AutoNAS Uninstall Script
4
-# This script is installed on each cluster node for version-specific removal
5
-# Executed by deploy.sh or can be run directly on node: /usr/local/lib/autonas/autonas-uninstall.sh
6
-
7
-# Global configuration
8
-LOG_TAG="autonas-uninstall"
9
-
10
-set -e  # Exit on any error
3
+set -euo pipefail
4
+
5
+PROJECT_ID="autonas"
6
+ORG_ID="xdev"
7
+RUNTIME_DIR="/usr/local/lib/${ORG_ID}/${PROJECT_ID}"
8
+LEGACY_RUNTIME_DIR="/usr/local/lib/autonas"
9
+COMMAND_PATH="/usr/local/sbin/autonas"
10
+UNINSTALL_WRAPPER="/usr/local/sbin/${ORG_ID}-${PROJECT_ID}-uninstall"
11
+DOC_DIR="/usr/local/share/doc/${ORG_ID}/${PROJECT_ID}"
12
+DEFAULTS_PATH="/etc/default/${ORG_ID}-${PROJECT_ID}"
13
+CONFIG_DIR="/etc/pve/autonas"
14
+ATTACH_UNIT="autonas-attach@.service"
15
+MAIN_UNIT="autonas.service"
16
+BOOT_SCAN_UNIT="autonas-boot-scan.service"
17
+DISK_RULES="99-autonas-disk.rules"
18
+INTERFACE_RULES="98-autonas-interfaces.rules"
19
+NFS_DROPIN_DIR="/etc/systemd/system/nfs-server.service.d"
20
+NFS_DROPIN_FILE="${NFS_DROPIN_DIR}/50-autonas-self-hosted-proxmox.conf"
11 21
 
12
-# Check for force flag for silent cleanup
13
-FORCE_MODE=false
14
-if [ "$1" = "--force" ]; then
15
-    FORCE_MODE=true
16
-fi
22
+FORCE_MODE=0
17 23
 
18
-# Helper function for conditional logging
19 24
 log_message() {
20
-    if [ "$FORCE_MODE" = false ]; then
21
-        echo "$1"
25
+    if [[ "${FORCE_MODE}" -eq 0 ]]; then
26
+        echo "$@"
22 27
     fi
23 28
 }
24 29
 
25
-CONFIG_DIR="/etc/pve/autonas"
26
-SCRIPT_NAME="autonas-disk-handler.sh"
27
-WRAPPER_NAME="autonas-udev-wrapper.sh"
28
-BOOT_SCAN_SCRIPT="autonas-boot-scan.sh"
29
-CAMERA_IMPORT_SCRIPT="autonas-media-importer.sh"
30
-INTERFACE_HANDLER_SCRIPT="autonas-network-handler.sh"
31
-UNIFIED_SCRIPT="autonas.sh"
32
-UDEV_RULES="99-autonas-disk.rules"
33
-SYSTEMD_SERVICE="autonas-attach@.service"
34
-MAIN_SERVICE="autonas.service"
35
-BOOT_SCAN_SERVICE="autonas-boot-scan.service"
36
-
37
-if [ "$FORCE_MODE" = false ]; then
38
-    echo "=== AutoNAS Uninstall Script ==="
39
-    echo ""
40
-fi
41
-
42
-# Check if running as root
43
-if [ "$EUID" -ne 0 ]; then
44
-    if [ "$FORCE_MODE" = false ]; then
45
-        echo "❌ This script must be run as root (use sudo)"
30
+require_root() {
31
+    if [[ "${EUID}" -ne 0 ]]; then
32
+        echo "ERROR: this script must be run as root" >&2
33
+        exit 1
46 34
     fi
47
-    exit 1
48
-fi
49
-
50
-log_message "🗑️  Uninstalling AutoNAS..."
51
-log_message ""
52
-
53
-# Remove scripts
54
-log_message "Removing AutoNAS scripts..."
55
-if [ -f "/usr/local/bin/$SCRIPT_NAME" ]; then
56
-    rm "/usr/local/bin/$SCRIPT_NAME"
57
-    log_message "✓ Manager script removed"
58
-fi
59
-
60
-if [ -f "/usr/local/bin/$WRAPPER_NAME" ]; then
61
-    rm "/usr/local/bin/$WRAPPER_NAME"
62
-    log_message "✓ Wrapper script removed"
63
-fi
64
-
65
-if [ -f "/usr/local/bin/$BOOT_SCAN_SCRIPT" ]; then
66
-    rm "/usr/local/bin/$BOOT_SCAN_SCRIPT"
67
-    log_message "✓ Boot scan script removed"
68
-fi
69
-
70
-if [ -f "/usr/local/bin/$CAMERA_IMPORT_SCRIPT" ]; then
71
-    rm "/usr/local/bin/$CAMERA_IMPORT_SCRIPT"
72
-    log_message "✓ Camera import script removed"
73
-fi
74
-
75
-if [ -f "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT" ]; then
76
-    rm "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT"
77
-    log_message "✓ Interface handler script removed"
78
-fi
79
-
80
-if [ -f "/usr/local/bin/$UNIFIED_SCRIPT" ]; then
81
-    rm "/usr/local/bin/$UNIFIED_SCRIPT"
82
-    log_message "✓ Unified AutoNAS script removed"
83
-fi
84
-
85
-# Remove symlink
86
-if [ -L "/usr/local/bin/autonas" ]; then
87
-    rm "/usr/local/bin/autonas"
88
-    log_message "✓ AutoNAS symlink removed"
89
-fi
90
-
91
-# Remove internal scripts directory
92
-if [ -d "/usr/local/lib/autonas" ]; then
93
-    rm -rf "/usr/local/lib/autonas"
94
-    log_message "✓ AutoNAS internal scripts directory removed"
95
-fi
96
-
97
-# Aggressive cleanup for orphaned files from previous versions
98
-log_message "Cleaning up orphaned files from previous versions..."
99
-for orphan_file in "autonas-interface-debug.sh" "autonas-test-interface-stability.sh"; do
100
-    if [ -f "/usr/local/bin/$orphan_file" ]; then
101
-        rm "/usr/local/bin/$orphan_file"
102
-        log_message "✓ Orphaned file removed: $orphan_file"
103
-    fi
104
-done
105
-
106
-# Remove udev rules
107
-log_message "Removing udev rules..."
108
-if [ -f "/etc/udev/rules.d/$UDEV_RULES" ]; then
109
-    rm "/etc/udev/rules.d/$UDEV_RULES"
110
-    udevadm control --reload-rules
111
-    log_message "✓ Udev rules removed"
112
-fi
113
-
114
-# Remove systemd service
115
-log_message "Removing systemd service..."
116
-if [ -f "/etc/systemd/system/$SYSTEMD_SERVICE" ]; then
117
-    systemctl stop autonas-attach@*.service 2>/dev/null || true
118
-    systemctl disable autonas-attach@*.service 2>/dev/null || true
119
-    rm "/etc/systemd/system/$SYSTEMD_SERVICE"
120
-    systemctl daemon-reload
121
-    log_message "✓ Systemd service removed"
122
-fi
123
-
124
-# Remove main service
125
-log_message "Removing main AutoNAS service..."
126
-if [ -f "/etc/systemd/system/$MAIN_SERVICE" ]; then
127
-    systemctl stop autonas.service 2>/dev/null || true
128
-    systemctl disable autonas.service 2>/dev/null || true
129
-    rm "/etc/systemd/system/$MAIN_SERVICE"
130
-    systemctl daemon-reload
131
-    log_message "✓ Main AutoNAS service removed"
132
-fi
133
-
134
-# Remove boot scan service
135
-log_message "Removing boot scan service..."
136
-if [ -f "/etc/systemd/system/$BOOT_SCAN_SERVICE" ]; then
137
-    systemctl stop autonas-boot-scan.service 2>/dev/null || true
138
-    systemctl disable autonas-boot-scan.service 2>/dev/null || true
139
-    rm "/etc/systemd/system/$BOOT_SCAN_SERVICE"
35
+}
36
+
37
+main() {
38
+    while [[ $# -gt 0 ]]; do
39
+        case "$1" in
40
+            --force)
41
+                FORCE_MODE=1
42
+                shift
43
+                ;;
44
+            -h|--help)
45
+                echo "Usage: $0 [--force]"
46
+                exit 0
47
+                ;;
48
+            *)
49
+                echo "ERROR: unknown option: $1" >&2
50
+                exit 1
51
+                ;;
52
+        esac
53
+    done
54
+
55
+    require_root
56
+
57
+    log_message "=== Uninstalling AutoNAS ==="
58
+
59
+    systemctl disable --now autonas-boot-scan.service >/dev/null 2>&1 || true
60
+    systemctl disable --now autonas.service >/dev/null 2>&1 || true
61
+    systemctl stop "autonas-attach@*.service" >/dev/null 2>&1 || true
62
+    systemctl disable "autonas-attach@*.service" >/dev/null 2>&1 || true
63
+
64
+    rm -f "/etc/systemd/system/${ATTACH_UNIT}"
65
+    rm -f "/etc/systemd/system/${MAIN_UNIT}"
66
+    rm -f "/etc/systemd/system/${BOOT_SCAN_UNIT}"
67
+    rm -f "${NFS_DROPIN_FILE}"
68
+    rmdir "${NFS_DROPIN_DIR}" 2>/dev/null || true
140 69
     systemctl daemon-reload
141
-    log_message "✓ Boot scan service removed"
142
-fi
143
-
144
-# Handle configuration and data preservation
145
-log_message ""
146
-log_message "📁 Handling user data..."
147
-
148
-# Check if configuration exists and has user data
149
-if [ -f "$CONFIG_DIR/disks.conf" ]; then
150
-    if grep -v '^#' "$CONFIG_DIR/disks.conf" | grep -v '^$' | grep -q ':'; then
151
-        log_message "⚠️  User configurations detected in $CONFIG_DIR/disks.conf"
152
-        log_message "   Configuration file preserved for manual cleanup"
153
-        log_message "   Remove manually with: sudo rm -rf $CONFIG_DIR"
154
-    else
155
-        log_message "ℹ️  Configuration file contains only template - removing"
156
-        rm "$CONFIG_DIR/disks.conf"
157
-        rmdir "$CONFIG_DIR" 2>/dev/null || true
70
+
71
+    rm -f "/etc/udev/rules.d/${DISK_RULES}"
72
+    rm -f "/etc/udev/rules.d/${INTERFACE_RULES}"
73
+    udevadm control --reload-rules >/dev/null 2>&1 || true
74
+
75
+    rm -f "${UNINSTALL_WRAPPER}"
76
+    rm -f "${COMMAND_PATH}"
77
+    rm -f "${DEFAULTS_PATH}"
78
+    rm -rf "${DOC_DIR}"
79
+    rm -rf "${RUNTIME_DIR}"
80
+
81
+    rm -f /usr/local/bin/autonas
82
+    rm -f /usr/local/bin/autonas.sh
83
+    rm -f /usr/local/bin/autonas-core.sh
84
+    rm -f /usr/local/bin/autonas-disk-handler.sh
85
+    rm -f /usr/local/bin/autonas-udev-wrapper.sh
86
+    rm -f /usr/local/bin/autonas-boot-scan.sh
87
+    rm -f /usr/local/bin/autonas-network-handler.sh
88
+    rm -f /usr/local/bin/autonas-media-importer.sh
89
+    rm -f /usr/local/bin/autonas-uninstall.sh
90
+    rm -f /usr/local/bin/autonas-interface-debug.sh
91
+    rm -f /usr/local/bin/autonas-test-interface-stability.sh
92
+    rm -rf "${LEGACY_RUNTIME_DIR}"
93
+
94
+    rmdir "/usr/local/lib/${ORG_ID}" 2>/dev/null || true
95
+    rmdir "/usr/local/share/doc/${ORG_ID}" 2>/dev/null || true
96
+
97
+    log_message "Preserved cluster-shared config:"
98
+    log_message "  - ${CONFIG_DIR}/"
99
+    if [[ -f "${CONFIG_DIR}/disks.conf" ]]; then
100
+        log_message "  - ${CONFIG_DIR}/disks.conf"
158 101
     fi
159
-else
160
-    log_message "ℹ️  No configuration file found"
161
-    rmdir "$CONFIG_DIR" 2>/dev/null || true
162
-fi
163
-
164
-# Check for mounted AutoNAS disks
165
-log_message ""
166
-log_message "💾 Checking for mounted AutoNAS disks..."
167
-mounted_autonas=$(mount | grep "/mnt/autonas/" | wc -l)
168
-if [ $mounted_autonas -gt 0 ]; then
169
-    log_message "⚠️  Found $mounted_autonas mounted AutoNAS disk(s):"
170
-    if [ "$FORCE_MODE" = false ]; then
171
-        mount | grep "/mnt/autonas/" | while read line; do
172
-            echo "   $line"
173
-        done
102
+
103
+    if mount | grep -q "/mnt/autonas/"; then
104
+        log_message "Preserved mounted data paths under /mnt/autonas/"
105
+    elif [[ -d "/mnt/autonas" ]] && [[ -z "$(ls -A /mnt/autonas 2>/dev/null)" ]]; then
106
+        rmdir /mnt/autonas 2>/dev/null || true
174 107
     fi
175
-    log_message ""
176
-    log_message "   These disks are still mounted and in use."
177
-    log_message "   Mount points preserved: /mnt/autonas/"
178
-    log_message "   Unmount manually if needed: sudo umount /mnt/autonas/*"
179
-else
180
-    log_message "ℹ️  No AutoNAS disks currently mounted"
181
-    if [ -d "/mnt/autonas" ]; then
182
-        # Only remove if empty
183
-        if [ -z "$(ls -A /mnt/autonas)" ]; then
184
-            rmdir "/mnt/autonas"
185
-            log_message "✓ Empty AutoNAS mount directory removed"
186
-        else
187
-            log_message "⚠️  AutoNAS mount directory contains files - preserved"
188
-        fi
108
+
109
+    if [[ -f /etc/exports ]] && grep -q "/mnt/autonas/" /etc/exports 2>/dev/null; then
110
+        log_message "NFS exports referencing /mnt/autonas/ were preserved for manual review."
189 111
     fi
190
-fi
191
-
192
-# Check NFS exports
193
-log_message ""
194
-log_message "🌐 Checking NFS exports..."
195
-if [ -f "/etc/exports" ] && grep -q "/mnt/autonas/" "/etc/exports" 2>/dev/null; then
196
-    log_message "⚠️  AutoNAS NFS exports found in /etc/exports"
197
-    log_message "   Please manually remove AutoNAS entries from /etc/exports"
198
-    log_message "   And reload NFS exports: sudo exportfs -ra"
199
-else
200
-    log_message "ℹ️  No AutoNAS NFS exports found"
201
-fi
202
-
203
-log_message ""
204
-log_message "🎉 AutoNAS core components removed successfully!"
205
-
206
-if [ "$FORCE_MODE" = false ]; then
207
-    echo ""
208
-    echo "📋 Summary:"
209
-    echo "✓ Scripts removed from /usr/local/bin/"
210
-    echo "✓ Udev rules removed"
211
-    echo "✓ Systemd services removed"
212
-    echo ""
213
-    echo "⚠️  Preserved (manual cleanup required if desired):"
214
-    echo "• User configurations: $CONFIG_DIR/ (if contains user data)"
215
-    echo "• Mount points: /mnt/autonas/ (if contains data)"
216
-    echo "• NFS exports: /etc/exports (manual edit required)"
217
-    echo ""
218
-    echo "📝 To completely remove all AutoNAS data:"
219
-    echo "sudo rm -rf $CONFIG_DIR"
220
-    echo "sudo rm -rf /mnt/autonas"
221
-    echo "sudo nano /etc/exports  # Remove AutoNAS entries manually"
222
-    echo "sudo exportfs -ra"
223
-fi
224
-echo ""
225
-echo "🔄 To reinstall AutoNAS later, run: sudo bash scripts/install.sh"
112
+
113
+    log_message "Uninstall complete."
114
+}
115
+
116
+main "$@"
+27 -16
scripts/autonas.sh
@@ -5,10 +5,15 @@
5 5
 # Usage: autonas <command> [options]
6 6
 
7 7
 # Load core AutoNAS library
8
-if [[ -f "/usr/local/bin/autonas-core.sh" ]]; then
9
-    source "/usr/local/bin/autonas-core.sh"
8
+AUTONAS_RUNTIME_DIR="${AUTONAS_RUNTIME_DIR:-/usr/local/lib/xdev/autonas}"
9
+AUTONAS_CORE_LIB="${AUTONAS_CORE_LIB:-${AUTONAS_RUNTIME_DIR}/autonas-core.sh}"
10
+AUTONAS_DEFAULTS_FILE="${AUTONAS_DEFAULTS_FILE:-/etc/default/xdev-autonas}"
11
+AUTONAS_MEDIA_IMPORTER="${AUTONAS_MEDIA_IMPORTER:-${AUTONAS_RUNTIME_DIR}/autonas-media-importer.sh}"
12
+
13
+if [[ -f "${AUTONAS_CORE_LIB}" ]]; then
14
+    source "${AUTONAS_CORE_LIB}"
10 15
 else
11
-    echo "Error: AutoNAS core library not found at /usr/local/bin/autonas-core.sh" >&2
16
+    echo "Error: AutoNAS core library not found at ${AUTONAS_CORE_LIB}" >&2
12 17
     exit 1
13 18
 fi
14 19
 
@@ -142,6 +147,12 @@ handle_reload() {
142 147
     
143 148
     log_message "Reloading NFS exports"
144 149
     exportfs -ra || log_message "Warning: Failed to reload NFS exports" "warning"
150
+
151
+    local sync_script="${AUTONAS_RUNTIME_DIR}/autonas-sync-systemd-ordering.sh"
152
+    if [[ -x "${sync_script}" ]]; then
153
+        log_message "Refreshing self-hosted Proxmox shutdown ordering"
154
+        "${sync_script}" || log_message "Warning: Failed to refresh self-hosted Proxmox shutdown ordering" "warning"
155
+    fi
145 156
     
146 157
     log_message "Reloading systemd daemon"
147 158
     systemctl daemon-reload || log_message "Warning: Failed to reload systemd daemon" "warning"
@@ -332,7 +343,7 @@ list_disks() {
332 343
         elif [[ "$ip" == "IMPORT" && "$interface" == "IMPORT" ]]; then
333 344
             echo "Type: 📷 Camera Import (mount, import, unmount)"
334 345
             echo "Import Destination: $nfs_options"
335
-            echo "Import Script: /usr/local/bin/autonas-media-importer.sh (built-in, non-configurable)"
346
+            echo "Import Script: ${AUTONAS_MEDIA_IMPORTER} (built-in, non-configurable)"
336 347
             echo "Temp Mount Point: $mount_point"
337 348
         else
338 349
             echo "Type: 🌐 NFS Network Share"
@@ -706,7 +717,7 @@ configure_import_disk() {
706 717
     echo "Name: $name"
707 718
     echo "Type: Camera Import (mount, import, unmount)"
708 719
     echo "Import destination: $destination_path"
709
-    echo "Import script: /usr/local/bin/autonas-media-importer.sh (built-in, non-configurable)"
720
+    echo "Import script: ${AUTONAS_MEDIA_IMPORTER} (built-in, non-configurable)"
710 721
     echo "Temp mount point: $temp_mount_point"
711 722
     echo ""
712 723
     
@@ -901,11 +912,11 @@ test_config() {
901 912
         fi
902 913
         
903 914
         # Test import script
904
-        if [[ -x "/usr/local/bin/autonas-media-importer.sh" ]]; then
915
+        if [[ -x "${AUTONAS_MEDIA_IMPORTER}" ]]; then
905 916
             echo "✅ Media import script is available and executable"
906 917
         else
907 918
             echo "❌ Media import script not found or not executable"
908
-            echo "   Expected: /usr/local/bin/autonas-media-importer.sh"
919
+            echo "   Expected: ${AUTONAS_MEDIA_IMPORTER}"
909 920
             return 1
910 921
         fi
911 922
         echo ""
@@ -992,28 +1003,28 @@ case "${1:-}" in
992 1003
     "debug")
993 1004
         case "${2:-}" in
994 1005
             "enable")
995
-                if [ -f "/etc/default/autonas" ]; then
996
-                    sed -i 's/AUTONAS_DEBUG="false"/AUTONAS_DEBUG="true"/' /etc/default/autonas
1006
+                if [ -f "${AUTONAS_DEFAULTS_FILE}" ]; then
1007
+                    sed -i 's/AUTONAS_DEBUG="false"/AUTONAS_DEBUG="true"/' "${AUTONAS_DEFAULTS_FILE}"
997 1008
                     echo "✓ Debug mode enabled - verbose logging is now active"
998 1009
                     echo "  All AutoNAS operations will produce detailed debug output"
999 1010
                 else
1000
-                    echo "Error: Configuration file /etc/default/autonas not found"
1011
+                    echo "Error: Configuration file ${AUTONAS_DEFAULTS_FILE} not found"
1001 1012
                     exit 1
1002 1013
                 fi
1003 1014
                 ;;
1004 1015
             "disable")
1005
-                if [ -f "/etc/default/autonas" ]; then
1006
-                    sed -i 's/AUTONAS_DEBUG="true"/AUTONAS_DEBUG="false"/' /etc/default/autonas
1016
+                if [ -f "${AUTONAS_DEFAULTS_FILE}" ]; then
1017
+                    sed -i 's/AUTONAS_DEBUG="true"/AUTONAS_DEBUG="false"/' "${AUTONAS_DEFAULTS_FILE}"
1007 1018
                     echo "✓ Debug mode disabled - normal logging restored"
1008 1019
                 else
1009
-                    echo "Error: Configuration file /etc/default/autonas not found"
1020
+                    echo "Error: Configuration file ${AUTONAS_DEFAULTS_FILE} not found"
1010 1021
                     exit 1
1011 1022
                 fi
1012 1023
                 ;;
1013 1024
             "status")
1014
-                if [ -f "/etc/default/autonas" ]; then
1025
+                if [ -f "${AUTONAS_DEFAULTS_FILE}" ]; then
1015 1026
                     echo "=== AutoNAS Debug Configuration ==="
1016
-                    source /etc/default/autonas
1027
+                    source "${AUTONAS_DEFAULTS_FILE}"
1017 1028
                     echo "Debug mode: ${AUTONAS_DEBUG:-false}"
1018 1029
                     echo "Log level: ${AUTONAS_LOG_LEVEL:-info}"
1019 1030
                     if [ "$AUTONAS_DEBUG" = "true" ]; then
@@ -1025,7 +1036,7 @@ case "${1:-}" in
1025 1036
                         echo "  - Only normal info/warning/error messages will appear"
1026 1037
                     fi
1027 1038
                 else
1028
-                    echo "Error: Configuration file /etc/default/autonas not found"
1039
+                    echo "Error: Configuration file ${AUTONAS_DEFAULTS_FILE} not found"
1029 1040
                     exit 1
1030 1041
                 fi
1031 1042
                 ;;
+200 -285
scripts/install.sh 1000644 → 1000755
@@ -1,353 +1,277 @@
1 1
 #!/bin/bash
2 2
 
3
-# AutoNAS Installation & Node Admin Script
4
-# Executed on target nodes; deploy.sh invokes this with subcommands.
5
-# Usage: install.sh [install|start|restart|stop|status]
6
-
7
-set -e  # Exit on any error
3
+set -euo pipefail
8 4
 
9 5
 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10 6
 PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
7
+PROJECT_ID="autonas"
8
+ORG_ID="xdev"
9
+RUNTIME_DIR="/usr/local/lib/${ORG_ID}/${PROJECT_ID}"
10
+DOC_DIR="/usr/local/share/doc/${ORG_ID}/${PROJECT_ID}"
11
+COMMAND_PATH="/usr/local/sbin/autonas"
12
+UNINSTALL_PATH="${RUNTIME_DIR}/uninstall.sh"
13
+UNINSTALL_WRAPPER="/usr/local/sbin/${ORG_ID}-${PROJECT_ID}-uninstall"
14
+DEFAULTS_PATH="/etc/default/${ORG_ID}-${PROJECT_ID}"
11 15
 CONFIG_DIR="/etc/pve/autonas"
16
+CONFIG_FILE="${CONFIG_DIR}/disks.conf"
17
+MOUNT_BASE="/mnt/autonas"
12 18
 
13
-# Script names
14 19
 UNIFIED_SCRIPT="autonas.sh"
15
-SCRIPT_NAME="autonas-disk-handler.sh"
16
-WRAPPER_NAME="autonas-udev-wrapper.sh"
20
+CORE_SCRIPT="autonas-core.sh"
21
+DISK_HANDLER_SCRIPT="autonas-disk-handler.sh"
22
+UDEV_WRAPPER_SCRIPT="autonas-udev-wrapper.sh"
17 23
 BOOT_SCAN_SCRIPT="autonas-boot-scan.sh"
18
-INTERFACE_HANDLER_SCRIPT="autonas-network-handler.sh"
19
-CAMERA_IMPORT_SCRIPT="autonas-media-importer.sh"
20
-UDEV_RULES="99-autonas-disk.rules"
24
+NETWORK_HANDLER_SCRIPT="autonas-network-handler.sh"
25
+MEDIA_IMPORTER_SCRIPT="autonas-media-importer.sh"
26
+SYNC_ORDERING_SCRIPT="autonas-sync-systemd-ordering.sh"
27
+DISK_RULES="99-autonas-disk.rules"
21 28
 INTERFACE_RULES="98-autonas-interfaces.rules"
22
-SYSTEMD_SERVICE="autonas-attach@.service"
23
-MAIN_SERVICE="autonas.service"
24
-BOOT_SCAN_SERVICE="autonas-boot-scan.service"
29
+ATTACH_UNIT="autonas-attach@.service"
30
+MAIN_UNIT="autonas.service"
31
+BOOT_SCAN_UNIT="autonas-boot-scan.service"
25 32
 
26 33
 require_root() {
27
-    if [ "$EUID" -ne 0 ]; then
28
-        echo "❌ This action must be run as root (use sudo)" >&2
34
+    if [[ "${EUID}" -ne 0 ]]; then
35
+        echo "ERROR: this action must be run as root" >&2
29 36
         exit 1
30 37
     fi
31 38
 }
32 39
 
33
-# Verifică dacă un pachet este instalat
34 40
 is_package_installed() {
35 41
     local package="$1"
36 42
     dpkg -l "$package" 2>/dev/null | grep -q "^ii"
37 43
 }
38 44
 
39
-# Verifică dependințele necesare
40 45
 check_dependencies() {
41 46
     local missing_packages=()
42 47
     local required_packages=("nfs-kernel-server" "autofs" "udev" "libimage-exiftool-perl")
43
-    
44
-    echo "🔍 Verificare dependințe AutoNAS..."
45
-    
48
+    local package=""
49
+
50
+    echo "Checking AutoNAS dependencies..."
51
+
46 52
     for package in "${required_packages[@]}"; do
47
-        if is_package_installed "$package"; then
48
-            echo "✓ $package - instalat"
53
+        if is_package_installed "${package}"; then
54
+            echo "✓ ${package}"
49 55
         else
50
-            echo "❌ $package - LIPSĂ"
51
-            missing_packages+=("$package")
56
+            echo "✗ ${package}"
57
+            missing_packages+=("${package}")
52 58
         fi
53 59
     done
54
-    
55
-    if [ ${#missing_packages[@]} -gt 0 ]; then
56
-        echo ""
57
-        echo "⚠️  DEPENDINȚE LIPSĂ DETECTATE:"
58
-        printf "   %s\n" "${missing_packages[@]}"
59
-        echo ""
60
-        echo "Pentru a instala dependințele lipsă, rulați:"
61
-        echo "   apt update && apt install -y ${missing_packages[*]}"
60
+
61
+    if [[ ${#missing_packages[@]} -gt 0 ]]; then
62 62
         echo ""
63
-        echo "Sau utilizați comanda 'install-deps' pentru instalare automată:"
64
-        echo "   $0 install-deps"
63
+        echo "Missing packages detected:"
64
+        printf "  %s\n" "${missing_packages[@]}"
65 65
         echo ""
66
+        echo "Run:"
67
+        echo "  $0 install-deps"
66 68
         return 1
67
-    else
68
-        echo "✅ Toate dependințele sunt instalate"
69
-        return 0
70 69
     fi
70
+
71
+    echo "✓ All dependencies are installed"
71 72
 }
72 73
 
73
-# Instalează doar dependințele lipsă
74 74
 install_dependencies() {
75 75
     require_root
76
-    echo "📦 Instalare dependințe AutoNAS..."
77
-    
76
+
78 77
     if ! command -v apt >/dev/null 2>&1; then
79
-        echo "❌ Sistemul nu folosește apt - instalarea automată nu este suportată"
80
-        echo "Instalați manual pachetele: nfs-kernel-server autofs udev libimage-exiftool-perl"
78
+        echo "ERROR: automatic dependency installation requires apt" >&2
81 79
         exit 1
82 80
     fi
83
-    
84
-    echo "Actualizare lista de pachete..."
85
-    if ! apt update; then
86
-        echo "❌ Nu s-a putut actualiza lista de pachete - verificați conectivitatea la internet"
87
-        exit 1
81
+
82
+    apt update
83
+    apt install -y nfs-kernel-server autofs udev libimage-exiftool-perl
84
+}
85
+
86
+run_existing_uninstall() {
87
+    if [[ -x "${UNINSTALL_PATH}" ]]; then
88
+        "${UNINSTALL_PATH}" --force || true
89
+    elif [[ -x "/usr/local/lib/autonas/autonas-uninstall.sh" ]]; then
90
+        bash /usr/local/lib/autonas/autonas-uninstall.sh --force || true
91
+    elif [[ -x "/usr/local/bin/autonas-uninstall.sh" ]]; then
92
+        bash /usr/local/bin/autonas-uninstall.sh --force || true
88 93
     fi
89
-    
90
-    echo "Instalare pachete necesare..."
91
-    if apt install -y nfs-kernel-server autofs udev libimage-exiftool-perl; then
92
-        echo "✅ Dependințele au fost instalate cu succes"
94
+}
95
+
96
+install_runtime() {
97
+    mkdir -p "${RUNTIME_DIR}" "${DOC_DIR}" "${CONFIG_DIR}" "${MOUNT_BASE}" /usr/local/sbin /etc/default
98
+
99
+    install -m 0755 "${SCRIPT_DIR}/${UNIFIED_SCRIPT}" "${COMMAND_PATH}"
100
+    install -m 0755 "${SCRIPT_DIR}/${CORE_SCRIPT}" "${RUNTIME_DIR}/${CORE_SCRIPT}"
101
+    install -m 0755 "${SCRIPT_DIR}/${DISK_HANDLER_SCRIPT}" "${RUNTIME_DIR}/${DISK_HANDLER_SCRIPT}"
102
+    install -m 0755 "${SCRIPT_DIR}/${UDEV_WRAPPER_SCRIPT}" "${RUNTIME_DIR}/${UDEV_WRAPPER_SCRIPT}"
103
+    install -m 0755 "${SCRIPT_DIR}/${BOOT_SCAN_SCRIPT}" "${RUNTIME_DIR}/${BOOT_SCAN_SCRIPT}"
104
+    install -m 0755 "${SCRIPT_DIR}/${NETWORK_HANDLER_SCRIPT}" "${RUNTIME_DIR}/${NETWORK_HANDLER_SCRIPT}"
105
+    install -m 0755 "${SCRIPT_DIR}/${MEDIA_IMPORTER_SCRIPT}" "${RUNTIME_DIR}/${MEDIA_IMPORTER_SCRIPT}"
106
+    install -m 0755 "${SCRIPT_DIR}/${SYNC_ORDERING_SCRIPT}" "${RUNTIME_DIR}/${SYNC_ORDERING_SCRIPT}"
107
+    install -m 0755 "${SCRIPT_DIR}/autonas-uninstall.sh" "${UNINSTALL_PATH}"
108
+    ln -sfn "${UNINSTALL_PATH}" "${UNINSTALL_WRAPPER}"
109
+
110
+    if [[ ! -f "${DEFAULTS_PATH}" ]]; then
111
+        install -m 0644 "${PROJECT_DIR}/config/autonas" "${DEFAULTS_PATH}"
93 112
     else
94
-        echo "❌ Eroare la instalarea dependințelor"
95
-        exit 1
113
+        echo "Preserving existing defaults: ${DEFAULTS_PATH}"
96 114
     fi
97 115
 }
98 116
 
117
+cleanup_legacy_paths() {
118
+    rm -f /usr/local/bin/autonas
119
+    rm -f /usr/local/bin/autonas.sh
120
+    rm -f /usr/local/bin/autonas-core.sh
121
+    rm -f /usr/local/bin/autonas-disk-handler.sh
122
+    rm -f /usr/local/bin/autonas-udev-wrapper.sh
123
+    rm -f /usr/local/bin/autonas-boot-scan.sh
124
+    rm -f /usr/local/bin/autonas-network-handler.sh
125
+    rm -f /usr/local/bin/autonas-media-importer.sh
126
+    rm -f /usr/local/bin/autonas-uninstall.sh
127
+}
128
+
129
+install_system_integration() {
130
+    install -m 0644 "${PROJECT_DIR}/config/${DISK_RULES}" "/etc/udev/rules.d/${DISK_RULES}"
131
+    install -m 0644 "${PROJECT_DIR}/config/${INTERFACE_RULES}" "/etc/udev/rules.d/${INTERFACE_RULES}"
132
+    install -m 0644 "${PROJECT_DIR}/config/${ATTACH_UNIT}" "/etc/systemd/system/${ATTACH_UNIT}"
133
+    install -m 0644 "${PROJECT_DIR}/config/${MAIN_UNIT}" "/etc/systemd/system/${MAIN_UNIT}"
134
+    install -m 0644 "${PROJECT_DIR}/config/${BOOT_SCAN_UNIT}" "/etc/systemd/system/${BOOT_SCAN_UNIT}"
135
+}
136
+
137
+install_config() {
138
+    if [[ ! -f "${CONFIG_FILE}" ]]; then
139
+        install -m 0644 "${PROJECT_DIR}/config/disks.conf" "${CONFIG_FILE}"
140
+        echo "Installed initial config template: ${CONFIG_FILE}"
141
+    else
142
+        echo "Preserving existing configuration: ${CONFIG_FILE}"
143
+    fi
144
+
145
+    if [[ ! -f /etc/exports ]]; then
146
+        touch /etc/exports
147
+    fi
148
+}
149
+
150
+install_docs() {
151
+    rm -rf "${DOC_DIR}"
152
+    mkdir -p "${DOC_DIR}"
153
+    cp "${PROJECT_DIR}/README.md" "${DOC_DIR}/README.md"
154
+    cp "${PROJECT_DIR}/DEVELOPMENT.md" "${DOC_DIR}/DEVELOPMENT.md"
155
+    cp "${PROJECT_DIR}/CHANGELOG.md" "${DOC_DIR}/CHANGELOG.md"
156
+    cp "${PROJECT_DIR}/INSTALL.md" "${DOC_DIR}/INSTALL.md"
157
+}
158
+
159
+activate_installation() {
160
+    "${RUNTIME_DIR}/${SYNC_ORDERING_SCRIPT}"
161
+    systemctl daemon-reload
162
+    systemctl enable --now nfs-kernel-server >/dev/null 2>&1 || true
163
+    systemctl enable --now autonas.service >/dev/null 2>&1 || true
164
+    systemctl enable --now autonas-boot-scan.service >/dev/null 2>&1 || true
165
+    udevadm control --reload-rules || true
166
+    udevadm trigger --subsystem-match=block --action=add || true
167
+}
168
+
169
+verify_installation() {
170
+    local required_paths=(
171
+        "${COMMAND_PATH}"
172
+        "${RUNTIME_DIR}/${CORE_SCRIPT}"
173
+        "${RUNTIME_DIR}/${DISK_HANDLER_SCRIPT}"
174
+        "${RUNTIME_DIR}/${UDEV_WRAPPER_SCRIPT}"
175
+        "${RUNTIME_DIR}/${BOOT_SCAN_SCRIPT}"
176
+        "${RUNTIME_DIR}/${NETWORK_HANDLER_SCRIPT}"
177
+        "${RUNTIME_DIR}/${MEDIA_IMPORTER_SCRIPT}"
178
+        "${RUNTIME_DIR}/${SYNC_ORDERING_SCRIPT}"
179
+        "${UNINSTALL_PATH}"
180
+        "${DOC_DIR}"
181
+        "${DEFAULTS_PATH}"
182
+        "/etc/udev/rules.d/${DISK_RULES}"
183
+        "/etc/udev/rules.d/${INTERFACE_RULES}"
184
+        "/etc/systemd/system/${ATTACH_UNIT}"
185
+        "/etc/systemd/system/${MAIN_UNIT}"
186
+        "/etc/systemd/system/${BOOT_SCAN_UNIT}"
187
+        "${CONFIG_FILE}"
188
+    )
189
+    local path=""
190
+
191
+    for path in "${required_paths[@]}"; do
192
+        if [[ ! -e "${path}" ]]; then
193
+            echo "ERROR: expected installed path missing: ${path}" >&2
194
+            exit 1
195
+        fi
196
+    done
197
+}
198
+
99 199
 do_start() {
100 200
     require_root
101
-    echo "Starting AutoNAS services..."
102
-    systemctl enable nfs-kernel-server >/dev/null 2>&1 || true
103
-    systemctl start nfs-kernel-server || true
201
+    "${RUNTIME_DIR}/${SYNC_ORDERING_SCRIPT}"
202
+    systemctl enable --now nfs-kernel-server >/dev/null 2>&1 || true
203
+    systemctl enable --now autonas.service >/dev/null 2>&1 || true
204
+    systemctl enable --now autonas-boot-scan.service >/dev/null 2>&1 || true
104 205
     udevadm control --reload-rules || true
105 206
     udevadm trigger --subsystem-match=block --action=add || true
106
-    echo "✓ Start complete"
207
+    echo "AutoNAS started."
107 208
 }
108 209
 
109 210
 do_restart() {
110 211
     require_root
111
-    echo "Restarting AutoNAS services..."
212
+    "${RUNTIME_DIR}/${SYNC_ORDERING_SCRIPT}"
112 213
     systemctl restart nfs-kernel-server || true
214
+    systemctl restart autonas.service || true
215
+    systemctl restart autonas-boot-scan.service || true
113 216
     udevadm control --reload-rules || true
114 217
     udevadm trigger --subsystem-match=block --action=add || true
115
-    echo "✓ Restart complete"
218
+    echo "AutoNAS restarted."
116 219
 }
117 220
 
118 221
 do_stop() {
119 222
     require_root
120
-    echo "Stopping AutoNAS services..."
223
+    systemctl stop autonas-boot-scan.service || true
224
+    systemctl stop autonas.service || true
121 225
     systemctl stop nfs-kernel-server || true
122
-    echo "✓ Stop complete"
226
+    echo "AutoNAS stopped."
123 227
 }
124 228
 
125 229
 do_status() {
126
-    echo "=== Status Servicii ==="
230
+    echo "=== Services ==="
127 231
     systemctl status nfs-kernel-server --no-pager -l || true
232
+    systemctl status autonas.service --no-pager -l || true
233
+    systemctl status autonas-boot-scan.service --no-pager -l || true
128 234
     echo ""
129
-    echo "=== Exports NFS ==="
130
-    cat /etc/exports 2>/dev/null || echo "Fișier /etc/exports nu există"
131
-    echo ""
132
-    echo "=== Mount Points AutoNAS ==="
133
-    ls -la /mnt/autonas/ 2>/dev/null || echo "Director /mnt/autonas nu există"
235
+    echo "=== Config ==="
236
+    cat "${CONFIG_FILE}" 2>/dev/null || echo "No config found"
134 237
     echo ""
135
-    echo "=== Configurație Diskuri ==="
136
-    cat "$CONFIG_DIR/disks.conf" 2>/dev/null || echo "Fișier configurație nu există"
238
+    echo "=== Mount Points ==="
239
+    ls -la "${MOUNT_BASE}/" 2>/dev/null || echo "No AutoNAS mount base"
137 240
     echo ""
138
-    echo "=== Procese AutoNAS ==="
139
-    ps aux | grep autonas | grep -v grep || true
241
+    echo "=== Paths ==="
242
+    [ -x "${COMMAND_PATH}" ] && echo "✓ ${COMMAND_PATH}"
243
+    [ -d "${RUNTIME_DIR}" ] && echo "✓ ${RUNTIME_DIR}"
244
+    [ -x "${UNINSTALL_PATH}" ] && echo "✓ ${UNINSTALL_PATH}"
140 245
 }
141 246
 
142 247
 do_install() {
143 248
     require_root
144
-    echo "=== AutoNAS Installation Script ==="
145
-    echo ""
146
-    
147
-    # Verifică dependințele mai întâi
148
-    if ! check_dependencies; then
149
-        echo "❌ Instalarea nu poate continua - dependințe lipsă"
150
-        echo "Rulați mai întâi: $0 install-deps"
151
-        exit 1
152
-    fi
153
-    
249
+    echo "=== Installing AutoNAS ==="
250
+    check_dependencies
251
+    run_existing_uninstall
252
+    install_runtime
253
+    cleanup_legacy_paths
254
+    install_system_integration
255
+    install_config
256
+    install_docs
257
+    activate_installation
258
+    verify_installation
259
+
260
+    echo "Installed paths:"
261
+    echo "  command: ${COMMAND_PATH}"
262
+    echo "  runtime: ${RUNTIME_DIR}"
263
+    echo "  uninstall: ${UNINSTALL_PATH}"
264
+    echo "  defaults: ${DEFAULTS_PATH}"
265
+    echo "  docs: ${DOC_DIR}"
266
+    echo "  config: ${CONFIG_FILE} (cluster-shared exception)"
267
+    echo "  mounts: ${MOUNT_BASE} (operational data exception)"
268
+    echo "  services: enabled and started"
154 269
     echo ""
155
-    echo "Installing AutoNAS..."
156
-
157
-    echo "🧹 Cleanup previous installation to prevent orphan files..."
158
-    if [ -f "/usr/local/lib/autonas/autonas-uninstall.sh" ]; then
159
-        echo "Previous AutoNAS installation detected. Running uninstall first..."
160
-        bash /usr/local/lib/autonas/autonas-uninstall.sh --force >/dev/null 2>&1 || true
161
-        echo "Previous installation cleaned up."
162
-    fi
163
-
164
-    echo "📁 Creating directories..."
165
-    mkdir -p "$CONFIG_DIR"
166
-    mkdir -p "/mnt/autonas"
167
-    echo "✓ Directories created"
168
-
169
-    echo "Installing AutoNAS scripts..."
170
-    mkdir -p "/usr/local/lib/autonas"
171
-
172
-    if [ -f "$SCRIPT_DIR/$UNIFIED_SCRIPT" ]; then
173
-        cp "$SCRIPT_DIR/$UNIFIED_SCRIPT" "/usr/local/bin/"
174
-        chmod +x "/usr/local/bin/$UNIFIED_SCRIPT"
175
-        echo "✓ Unified AutoNAS script installed"
176
-        ln -sf "/usr/local/bin/$UNIFIED_SCRIPT" "/usr/local/bin/autonas"
177
-        echo "✓ Created 'autonas' command symlink"
178
-    fi
179
-
180
-    if [ -f "$SCRIPT_DIR/autonas-core.sh" ]; then
181
-        cp "$SCRIPT_DIR/autonas-core.sh" "/usr/local/bin/"
182
-        chmod +x "/usr/local/bin/autonas-core.sh"
183
-        echo "✓ Core library installed"
184
-    fi
185
-
186
-    cp "$SCRIPT_DIR/$SCRIPT_NAME" "/usr/local/bin/"
187
-    chmod +x "/usr/local/bin/$SCRIPT_NAME"
188
-    echo "✓ autonas-disk-handler.sh installed"
189
-
190
-    cp "$SCRIPT_DIR/$WRAPPER_NAME" "/usr/local/bin/"
191
-    chmod +x "/usr/local/bin/$WRAPPER_NAME"
192
-    echo "✓ autonas-udev-wrapper.sh installed"
193
-
194
-    if [ -f "$SCRIPT_DIR/$BOOT_SCAN_SCRIPT" ]; then
195
-        cp "$SCRIPT_DIR/$BOOT_SCAN_SCRIPT" "/usr/local/bin/"
196
-        chmod +x "/usr/local/bin/$BOOT_SCAN_SCRIPT"
197
-        echo "✓ Boot scan script installed"
198
-    fi
199
-
200
-    if [ -f "$SCRIPT_DIR/$INTERFACE_HANDLER_SCRIPT" ]; then
201
-        cp "$SCRIPT_DIR/$INTERFACE_HANDLER_SCRIPT" "/usr/local/bin/"
202
-        chmod +x "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT"
203
-        echo "✓ Interface handler script installed"
204
-    fi
205
-
206
-    if [ -f "$SCRIPT_DIR/$CAMERA_IMPORT_SCRIPT" ]; then
207
-        cp "$SCRIPT_DIR/$CAMERA_IMPORT_SCRIPT" "/usr/local/bin/"
208
-        chmod +x "/usr/local/bin/$CAMERA_IMPORT_SCRIPT"
209
-        echo "✓ Camera import script installed"
210
-    fi
211
-
212
-    echo "Installing udev rules..."
213
-    cp "$PROJECT_DIR/config/$UDEV_RULES" "/etc/udev/rules.d/"
214
-    if [ -f "$PROJECT_DIR/config/$INTERFACE_RULES" ]; then
215
-        cp "$PROJECT_DIR/config/$INTERFACE_RULES" "/etc/udev/rules.d/"
216
-        echo "✓ Interface monitoring udev rules installed"
217
-    fi
218
-    udevadm control --reload-rules
219
-    echo "✓ Udev rules installed"
220
-
221
-    echo "Installing systemd services..."
222
-    cp "$PROJECT_DIR/config/$SYSTEMD_SERVICE" "/etc/systemd/system/"
223
-    systemctl daemon-reload
224
-    echo "✓ Systemd service installed"
225
-
226
-    echo "Installing main AutoNAS service..."
227
-    cp "$PROJECT_DIR/config/$MAIN_SERVICE" "/etc/systemd/system/"
228
-    systemctl daemon-reload
229
-    systemctl enable autonas.service
230
-    echo "✓ Main AutoNAS service installed and enabled"
231
-
232
-    echo "Installing boot scan service..."
233
-    cp "$PROJECT_DIR/config/$BOOT_SCAN_SERVICE" "/etc/systemd/system/"
234
-    systemctl daemon-reload
235
-    systemctl enable autonas-boot-scan.service
236
-    echo "✓ Boot scan service installed and enabled"
237
-
238
-    echo "Setting up configuration..."
239
-    if [ ! -f "$CONFIG_DIR/disks.conf" ]; then
240
-        cp "$PROJECT_DIR/config/disks.conf" "$CONFIG_DIR/"
241
-        echo "✓ Configuration template installed"
242
-    else
243
-        echo "⚠️  Configuration file already exists, preserving user settings"
244
-        echo "   Existing file: $CONFIG_DIR/disks.conf"
245
-        echo "   Template available at: $PROJECT_DIR/config/disks.conf"
246
-        if grep -v '^#' "$CONFIG_DIR/disks.conf" | grep -v '^$' | grep -q ':'; then
247
-            echo "✓ User configurations detected in existing file - preserving"
248
-        else
249
-            echo "ℹ️  Existing file appears to be template only"
250
-        fi
251
-    fi
252
-
253
-    echo "Starting services..."
254
-    systemctl enable nfs-kernel-server
255
-    systemctl start nfs-kernel-server
256
-    if [ ! -f /etc/exports ]; then
257
-        touch /etc/exports
258
-    fi
259
-
260
-    echo "🔐 Setting permissions..."
261
-    if [ -f "/usr/local/bin/$UNIFIED_SCRIPT" ]; then
262
-        chown root:root "/usr/local/bin/$UNIFIED_SCRIPT"
263
-        chmod 755 "/usr/local/bin/$UNIFIED_SCRIPT"
264
-    fi
265
-    chown root:root "/usr/local/bin/$SCRIPT_NAME"
266
-    chown root:root "/usr/local/bin/$WRAPPER_NAME"
267
-    if [ -f "/usr/local/bin/$CONFIG_SCRIPT" ]; then
268
-        chown root:root "/usr/local/bin/$CONFIG_SCRIPT"
269
-    fi
270
-    if [ -f "/usr/local/bin/$BOOT_SCAN_SCRIPT" ]; then
271
-        chown root:root "/usr/local/bin/$BOOT_SCAN_SCRIPT"
272
-    fi
273
-    if [ -f "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT" ]; then
274
-        chown root:root "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT"
275
-    fi
276
-    if [ -f "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT" ]; then
277
-        chown root:root "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT"
278
-    fi
279
-    chmod 755 "/usr/local/bin/$SCRIPT_NAME"
280
-    chmod 755 "/usr/local/bin/$WRAPPER_NAME"
281
-    if [ -f "/usr/local/bin/$UNIFIED_SCRIPT" ]; then
282
-        chmod 755 "/usr/local/bin/$UNIFIED_SCRIPT"
283
-    fi
284
-    if [ -f "/usr/local/bin/$CONFIG_SCRIPT" ]; then
285
-        chmod 755 "/usr/local/bin/$CONFIG_SCRIPT"
286
-    fi
287
-    if [ -f "/usr/local/bin/$BOOT_SCAN_SCRIPT" ]; then
288
-        chmod 755 "/usr/local/bin/$BOOT_SCAN_SCRIPT"
289
-    fi
290
-    if [ -f "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT" ]; then
291
-        chmod 755 "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT"
292
-    fi
293
-    if [ -f "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT" ]; then
294
-        chmod 755 "/usr/local/bin/$INTERFACE_HANDLER_SCRIPT"
295
-    fi
296
-    echo "✓ Permissions set"
297
-
298
-    echo "📁 Verifying installation..."
299
-    [ -f "/usr/local/bin/$SCRIPT_NAME" ] && echo "✓ Manager script: /usr/local/bin/$SCRIPT_NAME"
300
-    [ -f "/usr/local/bin/$WRAPPER_NAME" ] && echo "✓ Wrapper script: /usr/local/bin/$WRAPPER_NAME"
301
-    [ -f "/usr/local/bin/$UNIFIED_SCRIPT" ] && echo "✓ Unified script: /usr/local/bin/$UNIFIED_SCRIPT"
302
-    [ -f "/usr/local/bin/$CONFIG_SCRIPT" ] && echo "✓ Configuration script: /usr/local/bin/$CONFIG_SCRIPT"
303
-    [ -f "/usr/local/bin/$BOOT_SCAN_SCRIPT" ] && echo "✓ Boot scan script: /usr/local/bin/$BOOT_SCAN_SCRIPT"
304
-    [ -f "/etc/udev/rules.d/$UDEV_RULES" ] && echo "✓ Udev rules: /etc/udev/rules.d/$UDEV_RULES"
305
-    [ -f "/etc/systemd/system/$SYSTEMD_SERVICE" ] && echo "✓ Systemd service: /etc/systemd/system/$SYSTEMD_SERVICE"
306
-    [ -f "/etc/systemd/system/$MAIN_SERVICE" ] && echo "✓ Main AutoNAS service: /etc/systemd/system/$MAIN_SERVICE"
307
-    [ -f "/etc/systemd/system/$BOOT_SCAN_SERVICE" ] && echo "✓ Boot scan service: /etc/systemd/system/$BOOT_SCAN_SERVICE"
308
-    [ -f "$CONFIG_DIR/disks.conf" ] && echo "✓ Configuration file: $CONFIG_DIR/disks.conf"
309
-
310
-    echo "Installing uninstall script for future upgrades..."
311
-    if [ -f "$SCRIPT_DIR/autonas-uninstall.sh" ]; then
312
-        cp "$SCRIPT_DIR/autonas-uninstall.sh" "/usr/local/lib/autonas/autonas-uninstall.sh"
313
-        chmod +x "/usr/local/lib/autonas/autonas-uninstall.sh"
314
-        chown root:root "/usr/local/lib/autonas/autonas-uninstall.sh"
315
-        echo "✓ Uninstall script: /usr/local/lib/autonas/autonas-uninstall.sh"
316
-    else
317
-        echo "⚠️  Uninstall script not found - manual cleanup may be required for future reinstalls"
318
-    fi
319
-
320
-    echo ""
321
-    echo "🎉 AutoNAS installation completed successfully!"
322
-    echo ""
323
-    echo "🔄 Starting services..."
324
-    if [ -n "${INTERFACE_MONITOR_SCRIPT:-}" ] && [ -f "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT" ]; then
325
-        echo "🔄 Running initial interface IP restore..."
326
-        "/usr/local/bin/$INTERFACE_MONITOR_SCRIPT" restore || true
327
-        echo "✓ Initial interface restore completed"
328
-    fi
329
-
330
-    echo ""
331
-    echo "📝 Next steps:"
332
-    echo "1. Connect your external disks to test auto-detection"
333
-    echo "2. Use 'autonas add <UUID>' to configure detected disks"
334
-    echo "3. Monitor with: journalctl -t autonas -t autonas-wrapper -f"
335
-    echo ""
336
-    echo "🔧 Configuration commands:"
337
-    echo "  autonas add [UUID]     - Add new disk configuration"
338
-    echo "  autonas list           - List configured disks"
339
-    echo "  autonas test [UUID]    - Test disk configuration"
340
-    echo "  autonas remove         - Remove disk configuration"
341
-    echo ""
342
-    echo "📋 Example disk configuration:"
343
-    echo "12345678-1234-1234-1234-123456789abc:storage1:192.168.1.100:eth0:/mnt/autonas/storage1:*(rw,all_squash,insecure,async,no_subtree_check,anonuid=0,anongid=0)"
344
-    echo ""
345
-    echo "✅ AutoNAS is ready to use!"
346
-    echo "🔍 Interface monitoring is handled automatically by udev events"
270
+    echo "Installation completed."
347 271
 }
348 272
 
349 273
 cmd="${1:-install}"
350
-case "$cmd" in
274
+case "${cmd}" in
351 275
     install)
352 276
         do_install
353 277
         ;;
@@ -371,15 +295,6 @@ case "$cmd" in
371 295
         ;;
372 296
     *)
373 297
         echo "Usage: $0 [install|install-deps|check-deps|start|restart|stop|status]" >&2
374
-        echo ""
375
-        echo "Commands:"
376
-        echo "  install     - Install AutoNAS (requires dependencies)"
377
-        echo "  install-deps- Install only the required dependencies"
378
-        echo "  check-deps  - Check if dependencies are installed"
379
-        echo "  start       - Start AutoNAS services"
380
-        echo "  restart     - Restart AutoNAS services"
381
-        echo "  stop        - Stop AutoNAS services"
382
-        echo "  status      - Show AutoNAS status"
383 298
         exit 2
384 299
         ;;
385
-esac
300
+esac