-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·284 lines (241 loc) · 10.2 KB
/
Copy pathinstall.sh
File metadata and controls
executable file
·284 lines (241 loc) · 10.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
#!/usr/bin/env bash
# =============================================================================
# ShareWave — install script
#
# Installs ShareWave under /opt/sharewave:
# /opt/sharewave/sharewave-server.jar headless server JAR
# /opt/sharewave/sharewave-gui.jar JavaFX admin GUI JAR
# /opt/sharewave/javafx/ JavaFX native libraries (for GUI)
# /opt/sharewave/sharewave wrapper script that launches the GUI
#
# Also installs and starts the sharewave-server systemd service, and links
# the "sharewave" wrapper into /usr/local/bin so the GUI can be launched
# from anywhere by typing: sharewave
#
# Usage:
# ./build.sh # build the JARs first
# sudo ./install.sh # then install (requires root)
#
# Re-running this script is safe — it overwrites the previous install.
# =============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
INSTALL_DIR="/opt/sharewave"
BIN_LINK="/usr/local/bin/sharewave"
info() { echo -e "\033[1;34m[INFO]\033[0m $*"; }
ok() { echo -e "\033[1;32m[ OK ]\033[0m $*"; }
warn() { echo -e "\033[1;33m[WARN]\033[0m $*"; }
err() { echo -e "\033[1;31m[ERR ]\033[0m $*"; exit 1; }
hr() { echo "─────────────────────────────────────────────────────"; }
hr
info "ShareWave installer"
hr
[ "$(id -u)" -eq 0 ] || err "Must be run as root (try: sudo ./install.sh)"
SERVER_JAR="$SCRIPT_DIR/sharewave-server/target/sharewave-server.jar"
GUI_JAR="$SCRIPT_DIR/sharewave-gui/target/sharewave-gui.jar"
[ -f "$SERVER_JAR" ] || [ -f "$GUI_JAR" ] \
|| err "Neither JAR found — run ./build.sh first"
HAVE_SERVER=0; [ -f "$SERVER_JAR" ] && HAVE_SERVER=1
HAVE_GUI=0; [ -f "$GUI_JAR" ] && HAVE_GUI=1
[ "$HAVE_SERVER" -eq 1 ] || warn "Server JAR not found: $SERVER_JAR (skipping server install/service)"
[ "$HAVE_GUI" -eq 1 ] || warn "GUI JAR not found: $GUI_JAR (skipping GUI install)"
# ── Step 1: Copy JARs ─────────────────────────────────────────────────────────
info "Step 1/5 — Installing JARs to $INSTALL_DIR"
mkdir -p "$INSTALL_DIR"
if [ "$HAVE_SERVER" -eq 1 ]; then
cp "$SERVER_JAR" "$INSTALL_DIR/sharewave-server.jar"
ok " $INSTALL_DIR/sharewave-server.jar"
fi
if [ "$HAVE_GUI" -eq 1 ]; then
cp "$GUI_JAR" "$INSTALL_DIR/sharewave-gui.jar"
ok " $INSTALL_DIR/sharewave-gui.jar"
fi
# Copy VERSION file alongside the JARs — AppVersion checks here first,
# so admins can update the displayed version post-install without rebuilding.
if [ -f "$SCRIPT_DIR/VERSION" ]; then
cp "$SCRIPT_DIR/VERSION" "$INSTALL_DIR/VERSION"
ok " $INSTALL_DIR/VERSION ($(tr -d '[:space:]' < "$SCRIPT_DIR/VERSION"))"
fi
# ── Step 1b: Create ~/.sharewave/ and migrate legacy config files ──────────────
# All ShareWave data (config, db, keystore, uploads) now lives under
# ~/.sharewave/ instead of being scattered across ~/. Migrate any files
# from their old locations on existing installs.
if [ -n "${SUDO_USER:-}" ]; then
SHAREWAVE_HOME="$(getent passwd "$SUDO_USER" | cut -d: -f6)/.sharewave"
DATA_OWNER="$SUDO_USER"
else
SHAREWAVE_HOME="$HOME/.sharewave"
DATA_OWNER="$(whoami)"
fi
mkdir -p "$SHAREWAVE_HOME"
chown "$DATA_OWNER" "$SHAREWAVE_HOME"
# Migrate old scattered files to the new unified directory.
OLD_HOME="$(dirname "$SHAREWAVE_HOME")"
declare -A MIGRATIONS=(
["$OLD_HOME/.sharewave.conf"]="$SHAREWAVE_HOME/sharewave.conf"
["$OLD_HOME/.sharewave-gui.conf"]="$SHAREWAVE_HOME/gui.conf"
["$OLD_HOME/.sharewave-admin.conf"]="$SHAREWAVE_HOME/admin.conf"
["$OLD_HOME/sharewave.db"]="$SHAREWAVE_HOME/sharewave.db"
["$OLD_HOME/sharewave.keystore"]="$SHAREWAVE_HOME/sharewave.keystore"
)
MIGRATED=0
for OLD in "${!MIGRATIONS[@]}"; do
NEW="${MIGRATIONS[$OLD]}"
if [ -f "$OLD" ] && [ ! -f "$NEW" ]; then
mv "$OLD" "$NEW"
chown "$DATA_OWNER" "$NEW"
ok " Migrated $(basename "$OLD") → ~/.sharewave/$(basename "$NEW")"
MIGRATED=1
fi
done
# Migrate old uploads directory
if [ -d "$OLD_HOME/sharewave-uploads" ] && [ ! -d "$SHAREWAVE_HOME/uploads" ]; then
mv "$OLD_HOME/sharewave-uploads" "$SHAREWAVE_HOME/uploads"
chown -R "$DATA_OWNER" "$SHAREWAVE_HOME/uploads"
ok " Migrated sharewave-uploads/ → ~/.sharewave/uploads/"
MIGRATED=1
fi
[ "$MIGRATED" -eq 0 ] && ok " ~/.sharewave/ ready (no legacy files to migrate)"
# ── Step 2: Bundle JavaFX native libraries for the GUI ────────────────────────
info "Step 2/5 — Bundling JavaFX native libraries"
FOUND_ANY=0
if [ "$HAVE_GUI" -eq 0 ]; then
info " Skipped (no GUI JAR)"
else
OS_ARCH=$(uname -m)
case "$OS_ARCH" in
aarch64|arm64) FX_CLASSIFIER="linux-aarch64" ;;
armv7l|armhf) FX_CLASSIFIER="linux-arm32-monocle" ;;
x86_64) FX_CLASSIFIER="linux" ;;
*) FX_CLASSIFIER="linux" ;;
esac
info " Platform: $OS_ARCH → FX classifier=$FX_CLASSIFIER"
# Find the real user's ~/.m2 (Maven downloads JavaFX jars there during build).
# When run with sudo, $HOME is root's home, so check SUDO_USER's home too.
M2_CANDIDATES=()
if [ -n "${SUDO_USER:-}" ]; then
SUDO_HOME=$(getent passwd "$SUDO_USER" | cut -d: -f6)
[ -n "$SUDO_HOME" ] && M2_CANDIDATES+=("$SUDO_HOME/.m2/repository/org/openjfx")
fi
M2_CANDIDATES+=("$HOME/.m2/repository/org/openjfx")
FX_VERSION="21.0.1"
FX_DIR="$INSTALL_DIR/javafx"
mkdir -p "$FX_DIR"
for MODULE in javafx-controls javafx-fxml javafx-graphics javafx-base; do
JAR=""
for M2 in "${M2_CANDIDATES[@]}"; do
[ -d "$M2/$MODULE/$FX_VERSION" ] || continue
JAR=$(find "$M2/$MODULE/$FX_VERSION" \
-name "${MODULE}-${FX_VERSION}-${FX_CLASSIFIER}.jar" 2>/dev/null | head -1)
[ -z "$JAR" ] && JAR=$(find "$M2/$MODULE/$FX_VERSION" \
-name "${MODULE}-${FX_VERSION}.jar" 2>/dev/null \
| grep -v sources | grep -v javadoc | head -1)
[ -n "$JAR" ] && break
done
if [ -n "$JAR" ]; then
cp "$JAR" "$FX_DIR/"
ok " $(basename "$JAR")"
FOUND_ANY=1
else
warn " Not found: $MODULE (searched: ${M2_CANDIDATES[*]})"
fi
done
if [ "$FOUND_ANY" -eq 0 ]; then
warn " No JavaFX jars found — the 'sharewave' GUI command will not work."
warn " Build with ./build.sh as the same user whose ~/.m2 has JavaFX,"
warn " then re-run this installer."
fi
fi # HAVE_GUI
# ── Step 3: Install the "sharewave" GUI launcher ──────────────────────────────
info "Step 3/5 — Installing GUI launcher"
if [ "$HAVE_GUI" -eq 0 ]; then
info " Skipped (no GUI JAR)"
else
cat > "$INSTALL_DIR/sharewave" <<'EOF'
#!/usr/bin/env bash
# =============================================================================
# ShareWave admin GUI launcher — installed by install.sh
#
# Launches /opt/sharewave/sharewave-gui.jar with the JavaFX native
# libraries bundled at install time in /opt/sharewave/javafx/.
# =============================================================================
set -euo pipefail
INSTALL_DIR="/opt/sharewave"
GUI_JAR="$INSTALL_DIR/sharewave-gui.jar"
FX_DIR="$INSTALL_DIR/javafx"
[ -f "$GUI_JAR" ] || { echo "Error: $GUI_JAR not found. Re-run install.sh."; exit 1; }
MODULE_PATH=""
if [ -d "$FX_DIR" ]; then
for jar in "$FX_DIR"/*.jar; do
[ -e "$jar" ] || continue
MODULE_PATH="${MODULE_PATH}:${jar}"
done
MODULE_PATH="${MODULE_PATH#:}"
fi
if [ -z "$MODULE_PATH" ]; then
echo "Error: No JavaFX libraries found in $FX_DIR."
echo "Re-run install.sh on a machine where ./build.sh has populated ~/.m2 with JavaFX."
exit 1
fi
java \
--module-path "$MODULE_PATH" \
--add-modules javafx.controls,javafx.fxml \
--add-opens=javafx.graphics/com.sun.javafx.application=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
-jar "$GUI_JAR" "$@" 2> >(grep -v '^WARNING' >&2)
exit $?
EOF
chmod +x "$INSTALL_DIR/sharewave"
ok " $INSTALL_DIR/sharewave"
# Link into PATH so "sharewave" works from anywhere
ln -sf "$INSTALL_DIR/sharewave" "$BIN_LINK"
ok " $BIN_LINK -> $INSTALL_DIR/sharewave"
fi # HAVE_GUI
# ── Step 4: Install systemd service ───────────────────────────────────────────
info "Step 4/5 — Installing systemd service"
if [ "$HAVE_SERVER" -eq 0 ]; then
info " Skipped (no server JAR)"
else
cp "$SCRIPT_DIR/sharewave-server.service" /etc/systemd/system/sharewave-server.service
systemctl daemon-reload
ok " /etc/systemd/system/sharewave-server.service"
fi # HAVE_SERVER
# ── Step 5: Enable and (re)start the service ──────────────────────────────────
info "Step 5/5 — Enabling and starting sharewave-server"
if [ "$HAVE_SERVER" -eq 0 ]; then
info " Skipped (no server JAR)"
else
systemctl enable sharewave-server >/dev/null 2>&1 || true
if systemctl is-active --quiet sharewave-server; then
systemctl restart sharewave-server
ok " Restarted sharewave-server"
else
systemctl start sharewave-server
ok " Started sharewave-server"
fi
fi # HAVE_SERVER
hr
ok "Install complete."
echo ""
if [ "$HAVE_SERVER" -eq 1 ]; then
echo " Server : systemctl status sharewave-server"
echo " journalctl -u sharewave-server -f"
echo ""
fi
if [ "$HAVE_GUI" -eq 1 ] && [ "$FOUND_ANY" -eq 1 ]; then
echo " Admin GUI: sharewave"
echo ""
fi
echo " Installed under: $INSTALL_DIR"
hr
if [ "$HAVE_SERVER" -eq 1 ]; then
echo ""
echo "NOTE: On first run, the server needs an admin password set on the"
echo "console. If this is a fresh install, stop the service, run the JAR"
echo "manually once to set the password, then restart:"
echo ""
echo " sudo systemctl stop sharewave-server"
echo " java -jar $INSTALL_DIR/sharewave-server.jar # enter password, then Ctrl+C"
echo " sudo systemctl start sharewave-server"
fi