Newer Older
f16725e 3 months ago History
130 lines | 3.543kb
Bogdan Timofte authored 3 months ago
1
#!/bin/bash
2

            
3
set -euo pipefail
4

            
5
PROJECT_ID="pve-net-hang-watchdog"
6
ORG_ID="xdev"
7
INSTALL_DIR="/usr/local/lib/${ORG_ID}/${PROJECT_ID}"
8
DOC_DIR="/usr/local/share/doc/${ORG_ID}/${PROJECT_ID}"
9
COMMAND_PATH="/usr/local/sbin/pve-net-hang-watchdog.sh"
10
UNINSTALL_PATH="${INSTALL_DIR}/uninstall.sh"
11
UNINSTALL_WRAPPER="/usr/local/sbin/${ORG_ID}-${PROJECT_ID}-uninstall"
12
CONFIG_PATH="/etc/default/${ORG_ID}-${PROJECT_ID}"
13
UNIT_PATH="/etc/systemd/system/${PROJECT_ID}.service"
14

            
15
SOURCE_DIR=""
16

            
17
usage() {
18
    cat <<EOF
19
Usage: $0 [--source-dir <path>]
20

            
21
Install ${PROJECT_ID} on the current host.
22
EOF
23
}
24

            
25
require_root() {
26
    if [[ "${EUID}" -ne 0 ]]; then
27
        echo "ERROR: this script must be run as root" >&2
28
        exit 1
29
    fi
30
}
31

            
32
resolve_source_dir() {
33
    if [[ -n "${SOURCE_DIR}" ]]; then
34
        SOURCE_DIR="$(cd "${SOURCE_DIR}" && pwd)"
35
    else
36
        SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
37
    fi
38
}
39

            
40
validate_source_tree() {
41
    local required_files=(
42
        "${SOURCE_DIR}/bin/pve-net-hang-watchdog.sh"
43
        "${SOURCE_DIR}/systemd/pve-net-hang-watchdog.service"
44
        "${SOURCE_DIR}/config/xdev-pve-net-hang-watchdog"
45
        "${SOURCE_DIR}/scripts/uninstall.sh"
46
        "${SOURCE_DIR}/README.md"
47
        "${SOURCE_DIR}/INSTALL.md"
48
        "${SOURCE_DIR}/CHANGELOG.md"
49
    )
50
    local file=""
51
    for file in "${required_files[@]}"; do
52
        if [[ ! -f "${file}" ]]; then
53
            echo "ERROR: missing required source file: ${file}" >&2
54
            exit 1
55
        fi
56
    done
57
}
58

            
59
run_existing_uninstall() {
60
    if [[ -x "${UNINSTALL_PATH}" ]]; then
61
        echo "Existing installation detected. Running canonical uninstall first..."
62
        "${UNINSTALL_PATH}" --force || true
63
    else
64
        bash "${SOURCE_DIR}/scripts/uninstall.sh" --force || true
65
    fi
66
}
67

            
68
install_docs() {
69
    mkdir -p "${DOC_DIR}"
70
    cp "${SOURCE_DIR}/README.md" "${DOC_DIR}/"
71
    cp "${SOURCE_DIR}/INSTALL.md" "${DOC_DIR}/"
72
    cp "${SOURCE_DIR}/CHANGELOG.md" "${DOC_DIR}/"
73
}
74

            
75
main() {
76
    while [[ $# -gt 0 ]]; do
77
        case "$1" in
78
            --source-dir)
79
                SOURCE_DIR="$2"
80
                shift 2
81
                ;;
82
            -h|--help)
83
                usage
84
                exit 0
85
                ;;
86
            *)
87
                echo "ERROR: unknown option: $1" >&2
88
                usage
89
                exit 1
90
                ;;
91
        esac
92
    done
93

            
94
    require_root
95
    resolve_source_dir
96
    validate_source_tree
97

            
98
    echo "=== Installing ${PROJECT_ID} ==="
99
    run_existing_uninstall
100

            
101
    mkdir -p "${INSTALL_DIR}" "${DOC_DIR}" /usr/local/sbin /etc/default
102

            
103
    install -m 0755 "${SOURCE_DIR}/bin/pve-net-hang-watchdog.sh" "${COMMAND_PATH}"
104
    install -m 0755 "${SOURCE_DIR}/scripts/uninstall.sh" "${UNINSTALL_PATH}"
105
    ln -sfn "${UNINSTALL_PATH}" "${UNINSTALL_WRAPPER}"
106

            
107
    if [[ ! -f "${CONFIG_PATH}" ]]; then
108
        install -m 0644 "${SOURCE_DIR}/config/xdev-pve-net-hang-watchdog" "${CONFIG_PATH}"
109
    else
110
        echo "Preserving existing config: ${CONFIG_PATH}"
111
    fi
112

            
113
    install -m 0644 "${SOURCE_DIR}/systemd/pve-net-hang-watchdog.service" "${UNIT_PATH}"
114
    systemctl daemon-reload
115
    systemctl enable --now pve-net-hang-watchdog.service >/dev/null 2>&1
116

            
117
    install_docs
118

            
119
    echo "Installed paths:"
120
    echo "  command: ${COMMAND_PATH}"
121
    echo "  uninstall: ${UNINSTALL_PATH}"
122
    echo "  config: ${CONFIG_PATH}"
123
    echo "  systemd: ${UNIT_PATH}"
124
    echo "  docs: ${DOC_DIR}"
125
    echo "  service: enabled and started"
126
    echo ""
127
    echo "Installation completed."
128
}
129

            
130
main "$@"