2023-04-01 18:43:53 +02:00
|
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
set -u
|
|
|
|
|
|
2023-04-19 04:32:29 +02:00
|
|
|
|
VERSION="7"
|
2023-04-17 16:01:23 +02:00
|
|
|
|
HEADER="VirtualDSM Agent"
|
2023-04-17 02:27:50 +02:00
|
|
|
|
|
2023-04-17 15:56:17 +02:00
|
|
|
|
# Functions
|
2023-04-10 20:13:59 +02:00
|
|
|
|
|
2023-05-11 04:19:32 +02:00
|
|
|
|
error () { echo -e "\E[1;31m❯ ERROR: $1\E[0m" ; }
|
2023-05-11 04:41:31 +02:00
|
|
|
|
info () { echo -e "\E[1;34m❯\E[1;36m $1\E[0m" ; }
|
2023-05-11 04:19:32 +02:00
|
|
|
|
|
2023-04-17 03:13:00 +02:00
|
|
|
|
finish() {
|
|
|
|
|
|
2023-05-11 04:41:31 +02:00
|
|
|
|
echo "$HEADER: Shutting down.."
|
2023-04-17 03:13:00 +02:00
|
|
|
|
exit
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-17 15:56:17 +02:00
|
|
|
|
function checkNMI {
|
2023-04-17 03:13:00 +02:00
|
|
|
|
|
2023-04-17 15:56:17 +02:00
|
|
|
|
local nmi
|
|
|
|
|
nmi=$(cat /proc/interrupts | grep NMI | sed 's/[^1-9]*//g')
|
2023-04-01 22:54:03 +02:00
|
|
|
|
|
2023-04-17 15:56:17 +02:00
|
|
|
|
if [ "$nmi" != "" ]; then
|
2023-04-17 15:25:18 +02:00
|
|
|
|
|
2023-05-11 04:19:32 +02:00
|
|
|
|
info "Received shutdown request through NMI.."
|
2023-04-17 02:27:50 +02:00
|
|
|
|
|
2023-04-17 15:56:17 +02:00
|
|
|
|
/usr/syno/sbin/synoshutdown -s > /dev/null
|
|
|
|
|
finish
|
2023-04-02 03:57:02 +02:00
|
|
|
|
|
2023-04-02 23:33:58 +02:00
|
|
|
|
fi
|
2023-04-17 15:56:17 +02:00
|
|
|
|
}
|
2023-04-02 03:57:02 +02:00
|
|
|
|
|
2023-04-17 15:56:17 +02:00
|
|
|
|
function downloadUpdate {
|
2023-04-02 21:38:34 +02:00
|
|
|
|
|
2023-04-17 14:50:38 +02:00
|
|
|
|
TMP="/tmp/agent.sh"
|
|
|
|
|
rm -f "${TMP}"
|
2023-04-17 14:14:32 +02:00
|
|
|
|
|
2023-04-17 15:13:34 +02:00
|
|
|
|
# Auto update the agent
|
|
|
|
|
|
2023-04-17 18:16:43 +02:00
|
|
|
|
URL="https://raw.githubusercontent.com/kroese/virtual-dsm/master/agent/agent.sh"
|
2023-04-17 20:51:41 +02:00
|
|
|
|
|
2023-04-17 18:33:37 +02:00
|
|
|
|
remote_size=$(curl -sIk -m 4 "${URL}" | grep -i "content-length:" | tr -d " \t" | cut -d ':' -f 2)
|
2023-04-17 20:51:41 +02:00
|
|
|
|
remote_size=${remote_size//$'\r'}
|
2023-04-17 17:15:17 +02:00
|
|
|
|
|
2023-04-17 21:01:05 +02:00
|
|
|
|
[[ "$remote_size" == "" || "$remote_size" == "0" ]] && return
|
2023-04-17 18:16:43 +02:00
|
|
|
|
|
2023-04-21 06:34:59 +02:00
|
|
|
|
SCRIPT=$(readlink -f "${BASH_SOURCE[0]}")
|
2023-04-17 18:16:43 +02:00
|
|
|
|
local_size=$(stat -c%s "$SCRIPT")
|
|
|
|
|
|
2023-04-17 21:01:05 +02:00
|
|
|
|
[[ remote_size -eq local_size ]] && return
|
2023-04-17 19:54:28 +02:00
|
|
|
|
|
2023-04-17 18:16:43 +02:00
|
|
|
|
if ! curl -sfk -m 10 -o "${TMP}" "${URL}"; then
|
2023-05-11 04:41:31 +02:00
|
|
|
|
error "$HEADER: curl error ($?)" && return
|
2023-04-17 17:15:17 +02:00
|
|
|
|
fi
|
|
|
|
|
|
2023-04-17 16:12:03 +02:00
|
|
|
|
if [ ! -f "${TMP}" ]; then
|
2023-05-11 04:41:31 +02:00
|
|
|
|
error "$HEADER: update error, file not found.." && return
|
2023-04-17 16:12:03 +02:00
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
line=$(head -1 "${TMP}")
|
|
|
|
|
|
2023-04-17 20:35:02 +02:00
|
|
|
|
if [[ "$line" != "#!/usr/bin/env bash" ]]; then
|
2023-05-11 04:41:31 +02:00
|
|
|
|
error "$HEADER: update error, invalid header: $line" && return
|
2023-04-17 16:12:03 +02:00
|
|
|
|
fi
|
|
|
|
|
|
2023-04-17 18:33:37 +02:00
|
|
|
|
if cmp --silent -- "${TMP}" "${SCRIPT}"; then
|
2023-05-11 04:41:31 +02:00
|
|
|
|
error "$HEADER: update file is already equal? (${local_size} / ${remote_size})" && return
|
2023-04-17 18:33:37 +02:00
|
|
|
|
fi
|
2023-04-17 18:03:23 +02:00
|
|
|
|
|
2023-04-17 18:33:37 +02:00
|
|
|
|
mv -f "${TMP}" "${SCRIPT}"
|
2023-04-18 21:01:01 +02:00
|
|
|
|
chmod 755 "${SCRIPT}"
|
2023-04-17 18:03:23 +02:00
|
|
|
|
|
2023-05-11 04:41:31 +02:00
|
|
|
|
info "$HEADER: succesfully installed update, please reboot."
|
2023-04-17 19:54:28 +02:00
|
|
|
|
|
2023-04-17 15:56:17 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function installPackages {
|
|
|
|
|
|
|
|
|
|
for filename in /usr/local/packages/*.spk; do
|
|
|
|
|
if [ -f "$filename" ]; then
|
|
|
|
|
|
|
|
|
|
BASE=$(basename "$filename" .spk)
|
|
|
|
|
BASE="${BASE%%-*}"
|
|
|
|
|
|
2023-04-18 19:20:10 +02:00
|
|
|
|
[[ $BASE == "ActiveInsight" ]] && continue
|
2023-04-18 19:18:30 +02:00
|
|
|
|
|
2023-05-11 04:19:32 +02:00
|
|
|
|
info "Installing package ${BASE}.."
|
2023-04-17 15:56:17 +02:00
|
|
|
|
|
|
|
|
|
/usr/syno/bin/synopkg install "$filename" > /dev/null
|
|
|
|
|
/usr/syno/bin/synopkg start "$BASE" > /dev/null &
|
|
|
|
|
|
|
|
|
|
rm "$filename"
|
|
|
|
|
|
|
|
|
|
fi
|
|
|
|
|
done
|
2023-04-17 16:07:35 +02:00
|
|
|
|
|
2023-04-17 15:56:17 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
trap finish SIGINT SIGTERM
|
|
|
|
|
|
|
|
|
|
ts=$(date +%s%N)
|
2023-05-11 04:41:31 +02:00
|
|
|
|
echo "Started $HEADER v$VERSION..."
|
2023-04-17 15:56:17 +02:00
|
|
|
|
|
2023-04-17 16:48:39 +02:00
|
|
|
|
checkNMI
|
|
|
|
|
|
2023-04-17 15:56:17 +02:00
|
|
|
|
# Install packages
|
|
|
|
|
|
|
|
|
|
first_run=false
|
|
|
|
|
|
|
|
|
|
for filename in /usr/local/packages/*.spk; do
|
|
|
|
|
if [ -f "$filename" ]; then
|
|
|
|
|
first_run=true
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
if [ "$first_run" = true ]; then
|
2023-04-17 19:54:28 +02:00
|
|
|
|
|
2023-04-17 15:56:17 +02:00
|
|
|
|
installPackages
|
|
|
|
|
|
|
|
|
|
else
|
2023-04-17 14:14:32 +02:00
|
|
|
|
|
2023-04-17 15:56:17 +02:00
|
|
|
|
downloadUpdate
|
2023-04-17 19:54:28 +02:00
|
|
|
|
|
2023-04-02 03:57:02 +02:00
|
|
|
|
fi
|
|
|
|
|
|
2023-04-17 16:48:39 +02:00
|
|
|
|
delay=5000
|
2023-04-17 18:56:52 +02:00
|
|
|
|
elapsed=$((($(date +%s%N) - ts)/1000000))
|
2023-04-17 17:15:17 +02:00
|
|
|
|
|
2023-04-18 21:01:01 +02:00
|
|
|
|
if [[ delay -gt elapsed ]]; then
|
2023-04-17 16:48:39 +02:00
|
|
|
|
difference=$((delay-elapsed))
|
2023-04-17 20:16:48 +02:00
|
|
|
|
float=$(echo | awk -v diff="${difference}" '{print diff * 0.001}')
|
|
|
|
|
sleep "$float"
|
2023-04-17 16:48:39 +02:00
|
|
|
|
fi
|
2023-04-17 15:50:49 +02:00
|
|
|
|
|
2023-04-17 02:27:50 +02:00
|
|
|
|
# Display message in docker log output
|
|
|
|
|
|
2023-04-20 03:50:20 +02:00
|
|
|
|
IP=$(ip address show dev eth0 | grep inet | awk '/inet / { print $2 }' | cut -f1 -d/)
|
|
|
|
|
|
|
|
|
|
if [[ "$IP" == "20.20"* ]]; then
|
|
|
|
|
MSG="port 5000"
|
|
|
|
|
else
|
|
|
|
|
MSG="http://${IP}:5000"
|
|
|
|
|
fi
|
|
|
|
|
|
2023-05-11 04:19:32 +02:00
|
|
|
|
info "--------------------------------------------------------"
|
|
|
|
|
info " You can now login to DSM at ${MSG}"
|
|
|
|
|
info "--------------------------------------------------------"
|
2023-04-01 18:43:53 +02:00
|
|
|
|
|
2023-04-17 02:27:50 +02:00
|
|
|
|
# Wait for NMI interrupt as a shutdown signal
|
|
|
|
|
|
2023-04-01 18:43:53 +02:00
|
|
|
|
while true; do
|
|
|
|
|
|
2023-04-10 20:13:59 +02:00
|
|
|
|
checkNMI
|
2023-04-18 21:01:01 +02:00
|
|
|
|
sleep 2 & wait $!
|
2023-04-01 18:43:53 +02:00
|
|
|
|
|
|
|
|
|
done
|