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

            
3
set -euo pipefail
4

            
5
PROJECT_ID="pve-guests-state"
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
STATE_DIR="/var/lib/${ORG_ID}/${PROJECT_ID}"
10
COMMAND_PATH="/usr/local/sbin/pgs"
11
UNINSTALL_PATH="${INSTALL_DIR}/uninstall.sh"
12
UNINSTALL_WRAPPER="/usr/local/sbin/${ORG_ID}-${PROJECT_ID}-uninstall"
13

            
14
SOURCE_DIR=""
15

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

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

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

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

            
39
validate_source_tree() {
40
    local required_files=(
41
        "${SOURCE_DIR}/bin/pgs"
42
        "${SOURCE_DIR}/scripts/uninstall.sh"
43
        "${SOURCE_DIR}/README.md"
44
        "${SOURCE_DIR}/INSTALL.md"
45
        "${SOURCE_DIR}/CHANGELOG.md"
46
        "${SOURCE_DIR}/LICENSE"
47
        "${SOURCE_DIR}/docs/DECISIONS.md"
48
        "${SOURCE_DIR}/docs/TECHNICAL.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
cleanup_legacy_artifacts() {
60
    rm -f /usr/local/sbin/pve-reboot-manager.sh
61
    rm -f /usr/local/sbin/pve-guest-state.sh
62
    rm -f /root/bin/pgs
63
    rm -f /root/bin/pve-reboot-manager.sh
64
    rm -f /root/bin/pve-guest-state.sh
65

            
66
    systemctl disable pve-suspend-vms.service pve-resume-vms.service >/dev/null 2>&1 || true
67
    systemctl stop pve-suspend-vms.service pve-resume-vms.service >/dev/null 2>&1 || true
68
    rm -f /etc/systemd/system/pve-suspend-vms.service
69
    rm -f /etc/systemd/system/pve-resume-vms.service
70
    systemctl daemon-reload
71
    systemctl reset-failed pve-suspend-vms.service pve-resume-vms.service >/dev/null 2>&1 || true
72
}
73

            
74
run_existing_uninstall() {
75
    if [[ -x "${UNINSTALL_PATH}" ]]; then
76
        echo "Existing installation detected. Running canonical uninstall first..."
77
        "${UNINSTALL_PATH}" --force || true
78
    else
79
        bash "${SOURCE_DIR}/scripts/uninstall.sh" --force || true
80
    fi
81
}
82

            
83
install_docs() {
84
    mkdir -p "${DOC_DIR}/docs"
85
    cp "${SOURCE_DIR}/README.md" "${DOC_DIR}/"
86
    cp "${SOURCE_DIR}/INSTALL.md" "${DOC_DIR}/"
87
    cp "${SOURCE_DIR}/CHANGELOG.md" "${DOC_DIR}/"
88
    cp "${SOURCE_DIR}/LICENSE" "${DOC_DIR}/"
89
    cp "${SOURCE_DIR}/docs/DECISIONS.md" "${DOC_DIR}/docs/"
90
    cp "${SOURCE_DIR}/docs/TECHNICAL.md" "${DOC_DIR}/docs/"
91
}
92

            
93
main() {
94
    while [[ $# -gt 0 ]]; do
95
        case "$1" in
96
            --source-dir)
97
                SOURCE_DIR="$2"
98
                shift 2
99
                ;;
100
            -h|--help)
101
                usage
102
                exit 0
103
                ;;
104
            *)
105
                echo "ERROR: unknown option: $1" >&2
106
                usage
107
                exit 1
108
                ;;
109
        esac
110
    done
111

            
112
    require_root
113
    resolve_source_dir
114
    validate_source_tree
115

            
116
    echo "=== Installing ${PROJECT_ID} ==="
117
    run_existing_uninstall
118

            
119
    mkdir -p "${INSTALL_DIR}" "${DOC_DIR}" "${STATE_DIR}" /usr/local/sbin
120

            
121
    cleanup_legacy_artifacts
122

            
123
    install -m 0755 "${SOURCE_DIR}/bin/pgs" "${COMMAND_PATH}"
124
    install -m 0755 "${SOURCE_DIR}/scripts/uninstall.sh" "${UNINSTALL_PATH}"
125
    ln -sfn "${UNINSTALL_PATH}" "${UNINSTALL_WRAPPER}"
126

            
127
    install_docs
128

            
129
    echo "Installed paths:"
130
    echo "  command: ${COMMAND_PATH}"
131
    echo "  uninstall: ${UNINSTALL_PATH}"
132
    echo "  docs: ${DOC_DIR}"
133
    echo "  state: ${STATE_DIR}"
134
    echo ""
135
    echo "Running dry-run verification..."
136
    "${COMMAND_PATH}" suspend --dry-run -v 2>&1 | tail -3 || true
137
    echo ""
138
    echo "Installation completed."
139
}
140

            
141
main "$@"