virtual-dsm/agent/agent.sh

144 lines
2.6 KiB
Bash
Raw Normal View History

2023-04-01 18:43:53 +02:00
#!/usr/bin/env bash
set -u
2023-04-17 15:56:17 +02:00
VERSION="4"
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-04-17 03:13:00 +02:00
finish() {
2023-04-17 16:01:23 +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-04-17 16:01:23 +02:00
echo "$HEADER: 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 23:33:58 +02:00
fi
2023-04-17 15:56:17 +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 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 17:15:17 +02:00
2023-04-17 18:03:23 +02:00
[ "$remote_size" == "" ] && return
[ "$remote_size" == "0" ] && return
2023-04-17 18:16:43 +02:00
SCRIPT=$(readlink -f ${BASH_SOURCE[0]})
local_size=$(stat -c%s "$SCRIPT")
2023-04-17 18:03:23 +02:00
[ "$remote_size" == "$local_size" ] && return
2023-04-17 18:16:43 +02:00
if ! curl -sfk -m 10 -o "${TMP}" "${URL}"; then
2023-04-17 17:15:17 +02:00
echo "$HEADER: curl error" && return
fi
2023-04-17 16:12:03 +02:00
if [ ! -f "${TMP}" ]; then
echo "$HEADER: update error, file not found.." && return
fi
line=$(head -1 "${TMP}")
if [ "$line" != "#!/usr/bin/env bash" ]; then
echo "$HEADER: update error, invalid header: $line" && return
fi
2023-04-17 18:33:37 +02:00
if cmp --silent -- "${TMP}" "${SCRIPT}"; then
echo "$HEADER: update file is already equal?" && return
fi
2023-04-17 18:03:23 +02:00
2023-04-17 18:33:37 +02:00
mv -f "${TMP}" "${SCRIPT}"
chmod +x "${SCRIPT}"
2023-04-17 18:03:23 +02:00
2023-04-17 18:33:37 +02:00
echo "$HEADER: succesfully installed update, please reboot."
2023-04-17 16:12:03 +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-17 16:01:23 +02:00
echo "$HEADER: 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-04-17 16:23:26 +02:00
echo "$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
installPackages
else
2023-04-17 14:14:32 +02:00
2023-04-17 15:56:17 +02:00
downloadUpdate
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-17 16:48:39 +02:00
if (( delay > elapsed )); then
difference=$((delay-elapsed))
2023-04-17 18:56:52 +02:00
sleep "$(echo | awk -v diff="${difference}" '{print diff * 0.001}')"
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-17 15:22:44 +02:00
echo "-------------------------------------------"
echo " You can now login to DSM at port 5000 "
echo "-------------------------------------------"
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-17 04:43:24 +02:00
sleep 2
2023-04-01 18:43:53 +02:00
done
2023-04-17 18:56:52 +02:00
.