autoNAS / scripts / install.sh
Newer Older
5b5a565 3 months ago History
385 lines | 14.197kb
Bogdan Timofte authored 3 months ago
1
#!/bin/bash
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
8

            
9
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
11
CONFIG_DIR="/etc/pve/autonas"
12

            
13
# Script names
14
UNIFIED_SCRIPT="autonas.sh"
15
SCRIPT_NAME="autonas-disk-handler.sh"
16
WRAPPER_NAME="autonas-udev-wrapper.sh"
17
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"
21
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"
25

            
26
require_root() {
27
    if [ "$EUID" -ne 0 ]; then
28
        echo "❌ This action must be run as root (use sudo)" >&2
29
        exit 1
30
    fi
31
}
32

            
33
# Verifică dacă un pachet este instalat
34
is_package_installed() {
35
    local package="$1"
36
    dpkg -l "$package" 2>/dev/null | grep -q "^ii"
37
}
38

            
39
# Verifică dependințele necesare
40
check_dependencies() {
41
    local missing_packages=()
42
    local required_packages=("nfs-kernel-server" "autofs" "udev" "libimage-exiftool-perl")
43

            
44
    echo "🔍 Verificare dependințe AutoNAS..."
45

            
46
    for package in "${required_packages[@]}"; do
47
        if is_package_installed "$package"; then
48
            echo "✓ $package - instalat"
49
        else
50
            echo "❌ $package - LIPSĂ"
51
            missing_packages+=("$package")
52
        fi
53
    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[*]}"
62
        echo ""
63
        echo "Sau utilizați comanda 'install-deps' pentru instalare automată:"
64
        echo "   $0 install-deps"
65
        echo ""
66
        return 1
67
    else
68
        echo "✅ Toate dependințele sunt instalate"
69
        return 0
70
    fi
71
}
72

            
73
# Instalează doar dependințele lipsă
74
install_dependencies() {
75
    require_root
76
    echo "📦 Instalare dependințe AutoNAS..."
77

            
78
    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"
81
        exit 1
82
    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
88
    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"
93
    else
94
        echo "❌ Eroare la instalarea dependințelor"
95
        exit 1
96
    fi
97
}
98

            
99
do_start() {
100
    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
104
    udevadm control --reload-rules || true
105
    udevadm trigger --subsystem-match=block --action=add || true
106
    echo "✓ Start complete"
107
}
108

            
109
do_restart() {
110
    require_root
111
    echo "Restarting AutoNAS services..."
112
    systemctl restart nfs-kernel-server || true
113
    udevadm control --reload-rules || true
114
    udevadm trigger --subsystem-match=block --action=add || true
115
    echo "✓ Restart complete"
116
}
117

            
118
do_stop() {
119
    require_root
120
    echo "Stopping AutoNAS services..."
121
    systemctl stop nfs-kernel-server || true
122
    echo "✓ Stop complete"
123
}
124

            
125
do_status() {
126
    echo "=== Status Servicii ==="
127
    systemctl status nfs-kernel-server --no-pager -l || true
128
    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ă"
134
    echo ""
135
    echo "=== Configurație Diskuri ==="
136
    cat "$CONFIG_DIR/disks.conf" 2>/dev/null || echo "Fișier configurație nu există"
137
    echo ""
138
    echo "=== Procese AutoNAS ==="
139
    ps aux | grep autonas | grep -v grep || true
140
}
141

            
142
do_install() {
143
    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

            
154
    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"
347
}
348

            
349
cmd="${1:-install}"
350
case "$cmd" in
351
    install)
352
        do_install
353
        ;;
354
    install-deps)
355
        install_dependencies
356
        ;;
357
    check-deps)
358
        check_dependencies
359
        ;;
360
    start)
361
        do_start
362
        ;;
363
    restart)
364
        do_restart
365
        ;;
366
    stop)
367
        do_stop
368
        ;;
369
    status)
370
        do_status
371
        ;;
372
    *)
373
        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
        exit 2
384
        ;;
385
esac