autoNAS / scripts / install.sh
Newer Older
5bf8614 3 months ago History
300 lines | 9.847kb
Bogdan Timofte authored 3 months ago
1
#!/bin/bash
2

            
Bogdan Timofte authored 3 months ago
3
set -euo pipefail
Bogdan Timofte authored 3 months ago
4

            
5
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
Bogdan Timofte authored 3 months ago
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}"
Bogdan Timofte authored 3 months ago
15
CONFIG_DIR="/etc/pve/autonas"
Bogdan Timofte authored 3 months ago
16
CONFIG_FILE="${CONFIG_DIR}/disks.conf"
17
MOUNT_BASE="/mnt/autonas"
Bogdan Timofte authored 3 months ago
18

            
19
UNIFIED_SCRIPT="autonas.sh"
Bogdan Timofte authored 3 months ago
20
CORE_SCRIPT="autonas-core.sh"
21
DISK_HANDLER_SCRIPT="autonas-disk-handler.sh"
22
UDEV_WRAPPER_SCRIPT="autonas-udev-wrapper.sh"
Bogdan Timofte authored 3 months ago
23
BOOT_SCAN_SCRIPT="autonas-boot-scan.sh"
Bogdan Timofte authored 3 months ago
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"
Bogdan Timofte authored 3 months ago
28
INTERFACE_RULES="98-autonas-interfaces.rules"
Bogdan Timofte authored 3 months ago
29
ATTACH_UNIT="autonas-attach@.service"
30
MAIN_UNIT="autonas.service"
31
BOOT_SCAN_UNIT="autonas-boot-scan.service"
Bogdan Timofte authored 3 months ago
32

            
33
require_root() {
Bogdan Timofte authored 3 months ago
34
    if [[ "${EUID}" -ne 0 ]]; then
35
        echo "ERROR: this action must be run as root" >&2
Bogdan Timofte authored 3 months ago
36
        exit 1
37
    fi
38
}
39

            
40
is_package_installed() {
41
    local package="$1"
42
    dpkg -l "$package" 2>/dev/null | grep -q "^ii"
43
}
44

            
45
check_dependencies() {
46
    local missing_packages=()
47
    local required_packages=("nfs-kernel-server" "autofs" "udev" "libimage-exiftool-perl")
Bogdan Timofte authored 3 months ago
48
    local package=""
49

            
50
    echo "Checking AutoNAS dependencies..."
51

            
Bogdan Timofte authored 3 months ago
52
    for package in "${required_packages[@]}"; do
Bogdan Timofte authored 3 months ago
53
        if is_package_installed "${package}"; then
54
            echo "✓ ${package}"
Bogdan Timofte authored 3 months ago
55
        else
Bogdan Timofte authored 3 months ago
56
            echo "✗ ${package}"
57
            missing_packages+=("${package}")
Bogdan Timofte authored 3 months ago
58
        fi
59
    done
Bogdan Timofte authored 3 months ago
60

            
61
    if [[ ${#missing_packages[@]} -gt 0 ]]; then
Bogdan Timofte authored 3 months ago
62
        echo ""
Bogdan Timofte authored 3 months ago
63
        echo "Missing packages detected:"
64
        printf "  %s\n" "${missing_packages[@]}"
Bogdan Timofte authored 3 months ago
65
        echo ""
Bogdan Timofte authored 3 months ago
66
        echo "Run:"
67
        echo "  $0 install-deps"
Bogdan Timofte authored 3 months ago
68
        return 1
69
    fi
Bogdan Timofte authored 3 months ago
70

            
71
    echo "✓ All dependencies are installed"
Bogdan Timofte authored 3 months ago
72
}
73

            
74
install_dependencies() {
75
    require_root
Bogdan Timofte authored 3 months ago
76

            
Bogdan Timofte authored 3 months ago
77
    if ! command -v apt >/dev/null 2>&1; then
Bogdan Timofte authored 3 months ago
78
        echo "ERROR: automatic dependency installation requires apt" >&2
Bogdan Timofte authored 3 months ago
79
        exit 1
80
    fi
Bogdan Timofte authored 3 months ago
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
Bogdan Timofte authored 3 months ago
93
    fi
Bogdan Timofte authored 3 months ago
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}"
Bogdan Timofte authored 3 months ago
112
    else
Bogdan Timofte authored 3 months ago
113
        echo "Preserving existing defaults: ${DEFAULTS_PATH}"
Bogdan Timofte authored 3 months ago
114
    fi
115
}
116

            
Bogdan Timofte authored 3 months ago
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

            
Bogdan Timofte authored 3 months ago
199
do_start() {
200
    require_root
Bogdan Timofte authored 3 months ago
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
Bogdan Timofte authored 3 months ago
205
    udevadm control --reload-rules || true
206
    udevadm trigger --subsystem-match=block --action=add || true
Bogdan Timofte authored 3 months ago
207
    echo "AutoNAS started."
Bogdan Timofte authored 3 months ago
208
}
209

            
210
do_restart() {
211
    require_root
Bogdan Timofte authored 3 months ago
212
    "${RUNTIME_DIR}/${SYNC_ORDERING_SCRIPT}"
Bogdan Timofte authored 3 months ago
213
    systemctl restart nfs-kernel-server || true
Bogdan Timofte authored 3 months ago
214
    systemctl restart autonas.service || true
215
    systemctl restart autonas-boot-scan.service || true
Bogdan Timofte authored 3 months ago
216
    udevadm control --reload-rules || true
217
    udevadm trigger --subsystem-match=block --action=add || true
Bogdan Timofte authored 3 months ago
218
    echo "AutoNAS restarted."
Bogdan Timofte authored 3 months ago
219
}
220

            
221
do_stop() {
222
    require_root
Bogdan Timofte authored 3 months ago
223
    systemctl stop autonas-boot-scan.service || true
224
    systemctl stop autonas.service || true
Bogdan Timofte authored 3 months ago
225
    systemctl stop nfs-kernel-server || true
Bogdan Timofte authored 3 months ago
226
    echo "AutoNAS stopped."
Bogdan Timofte authored 3 months ago
227
}
228

            
229
do_status() {
Bogdan Timofte authored 3 months ago
230
    echo "=== Services ==="
Bogdan Timofte authored 3 months ago
231
    systemctl status nfs-kernel-server --no-pager -l || true
Bogdan Timofte authored 3 months ago
232
    systemctl status autonas.service --no-pager -l || true
233
    systemctl status autonas-boot-scan.service --no-pager -l || true
Bogdan Timofte authored 3 months ago
234
    echo ""
Bogdan Timofte authored 3 months ago
235
    echo "=== Config ==="
236
    cat "${CONFIG_FILE}" 2>/dev/null || echo "No config found"
Bogdan Timofte authored 3 months ago
237
    echo ""
Bogdan Timofte authored 3 months ago
238
    echo "=== Mount Points ==="
239
    ls -la "${MOUNT_BASE}/" 2>/dev/null || echo "No AutoNAS mount base"
Bogdan Timofte authored 3 months ago
240
    echo ""
Bogdan Timofte authored 3 months ago
241
    echo "=== Paths ==="
242
    [ -x "${COMMAND_PATH}" ] && echo "✓ ${COMMAND_PATH}"
243
    [ -d "${RUNTIME_DIR}" ] && echo "✓ ${RUNTIME_DIR}"
244
    [ -x "${UNINSTALL_PATH}" ] && echo "✓ ${UNINSTALL_PATH}"
Bogdan Timofte authored 3 months ago
245
}
246

            
247
do_install() {
248
    require_root
Bogdan Timofte authored 3 months ago
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"
Bogdan Timofte authored 3 months ago
269
    echo ""
Bogdan Timofte authored 3 months ago
270
    echo "Installation completed."
Bogdan Timofte authored 3 months ago
271
}
272

            
273
cmd="${1:-install}"
Bogdan Timofte authored 3 months ago
274
case "${cmd}" in
Bogdan Timofte authored 3 months ago
275
    install)
276
        do_install
277
        ;;
278
    install-deps)
279
        install_dependencies
280
        ;;
281
    check-deps)
282
        check_dependencies
283
        ;;
284
    start)
285
        do_start
286
        ;;
287
    restart)
288
        do_restart
289
        ;;
290
    stop)
291
        do_stop
292
        ;;
293
    status)
294
        do_status
295
        ;;
296
    *)
297
        echo "Usage: $0 [install|install-deps|check-deps|start|restart|stop|status]" >&2
298
        exit 2
299
        ;;
Bogdan Timofte authored 3 months ago
300
esac