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

            
3
set -euo pipefail
4

            
5
PROJECT_ID="thunderbolts"
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
RECOVER_CANONICAL="${INSTALL_DIR}/tb-recover.sh"
10
RECOVER_WRAPPER="/usr/local/sbin/tb-recover.sh"
11
UNINSTALL_PATH="${INSTALL_DIR}/uninstall.sh"
12
UNINSTALL_WRAPPER="/usr/local/sbin/${ORG_ID}-${PROJECT_ID}-uninstall"
13
UDEV_RULE_PATH="/etc/udev/rules.d/90-thunderbolt-net-systemd.rules"
14
TB_BRIDGE_UNIT="/etc/systemd/system/tb-bridge.service"
15
TB_ENLIST_UNIT="/etc/systemd/system/tb-enlist@.service"
16
TB_RECOVER_UNIT="/etc/systemd/system/tb-recover.service"
17
TB_RECOVER_TIMER="/etc/systemd/system/tb-recover.timer"
18

            
19
SOURCE_DIR=""
20

            
21
usage() {
22
    cat <<EOF
23
Usage: $0 [--source-dir <path>]
24

            
25
Install shared thunderbolt runtime artifacts on the current host.
26
This workflow does NOT modify /etc/network/interfaces or interfaces.d/10-thunderbolt.
27
EOF
28
}
29

            
30
require_root() {
31
    if [[ "${EUID}" -ne 0 ]]; then
32
        echo "ERROR: this script must be run as root" >&2
33
        exit 1
34
    fi
35
}
36

            
37
resolve_source_dir() {
38
    if [[ -n "${SOURCE_DIR}" ]]; then
39
        SOURCE_DIR="$(cd "${SOURCE_DIR}" && pwd)"
40
    else
41
        SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
42
    fi
43
}
44

            
45
validate_source_tree() {
46
    local required_files=(
47
        "${SOURCE_DIR}/deploy/attempt1/common/sbin/tb-recover.sh"
48
        "${SOURCE_DIR}/deploy/attempt1/common/systemd/system/tb-bridge.service"
49
        "${SOURCE_DIR}/deploy/attempt1/common/systemd/system/tb-enlist@.service"
50
        "${SOURCE_DIR}/deploy/attempt1/common/systemd/system/tb-recover.service"
51
        "${SOURCE_DIR}/deploy/attempt1/common/systemd/system/tb-recover.timer"
52
        "${SOURCE_DIR}/deploy/attempt1/common/udev/rules.d/90-thunderbolt-net-systemd.rules"
53
        "${SOURCE_DIR}/scripts/uninstall.sh"
54
        "${SOURCE_DIR}/README.md"
55
        "${SOURCE_DIR}/INSTALL.md"
56
        "${SOURCE_DIR}/CHANGELOG.md"
57
    )
58
    local file=""
59
    for file in "${required_files[@]}"; do
60
        if [[ ! -f "${file}" ]]; then
61
            echo "ERROR: missing required source file: ${file}" >&2
62
            exit 1
63
        fi
64
    done
65
}
66

            
67
run_existing_uninstall() {
68
    if [[ -x "${UNINSTALL_PATH}" ]]; then
69
        echo "Existing installation detected. Running canonical uninstall first..."
70
        "${UNINSTALL_PATH}" --force || true
71
    else
72
        bash "${SOURCE_DIR}/scripts/uninstall.sh" --force || true
73
    fi
74
}
75

            
76
install_docs() {
77
    mkdir -p "${DOC_DIR}"
78
    cp "${SOURCE_DIR}/README.md" "${DOC_DIR}/"
79
    cp "${SOURCE_DIR}/INSTALL.md" "${DOC_DIR}/"
80
    cp "${SOURCE_DIR}/CHANGELOG.md" "${DOC_DIR}/"
81
}
82

            
83
main() {
84
    while [[ $# -gt 0 ]]; do
85
        case "$1" in
86
            --source-dir)
87
                SOURCE_DIR="$2"
88
                shift 2
89
                ;;
90
            -h|--help)
91
                usage
92
                exit 0
93
                ;;
94
            *)
95
                echo "ERROR: unknown option: $1" >&2
96
                usage
97
                exit 1
98
                ;;
99
        esac
100
    done
101

            
102
    require_root
103
    resolve_source_dir
104
    validate_source_tree
105

            
106
    echo "=== Installing ${PROJECT_ID} shared runtime ==="
107
    run_existing_uninstall
108

            
109
    mkdir -p "${INSTALL_DIR}" "${DOC_DIR}" /usr/local/sbin /etc/udev/rules.d /etc/systemd/system
110

            
111
    install -m 0755 "${SOURCE_DIR}/deploy/attempt1/common/sbin/tb-recover.sh" "${RECOVER_CANONICAL}"
112
    ln -sfn "${RECOVER_CANONICAL}" "${RECOVER_WRAPPER}"
113

            
114
    install -m 0755 "${SOURCE_DIR}/scripts/uninstall.sh" "${UNINSTALL_PATH}"
115
    ln -sfn "${UNINSTALL_PATH}" "${UNINSTALL_WRAPPER}"
116

            
117
    install -m 0644 "${SOURCE_DIR}/deploy/attempt1/common/udev/rules.d/90-thunderbolt-net-systemd.rules" "${UDEV_RULE_PATH}"
118
    install -m 0644 "${SOURCE_DIR}/deploy/attempt1/common/systemd/system/tb-bridge.service" "${TB_BRIDGE_UNIT}"
119
    install -m 0644 "${SOURCE_DIR}/deploy/attempt1/common/systemd/system/tb-enlist@.service" "${TB_ENLIST_UNIT}"
120
    install -m 0644 "${SOURCE_DIR}/deploy/attempt1/common/systemd/system/tb-recover.service" "${TB_RECOVER_UNIT}"
121
    install -m 0644 "${SOURCE_DIR}/deploy/attempt1/common/systemd/system/tb-recover.timer" "${TB_RECOVER_TIMER}"
122

            
123
    install_docs
124

            
125
    systemctl daemon-reload
126
    udevadm control --reload-rules
127
    systemctl enable --now tb-bridge.service
128
    systemctl enable --now tb-recover.timer
129
    systemctl start tb-recover.service || true
130
    udevadm trigger --subsystem-match=net --action=add || true
131

            
132
    echo "Installed paths:"
133
    echo "  runtime: ${INSTALL_DIR}"
134
    echo "  recover wrapper: ${RECOVER_WRAPPER}"
135
    echo "  uninstall: ${UNINSTALL_PATH}"
136
    echo "  udev rule: ${UDEV_RULE_PATH}"
137
    echo "  systemd units: tb-bridge.service tb-enlist@.service tb-recover.service tb-recover.timer"
138
    echo "  docs: ${DOC_DIR}"
139
    echo ""
140
    echo "Network interface files were left untouched."
141
    echo "Installation completed."
142
}
143

            
144
main "$@"