Unverified Commit 35a92677 authored by Kroese's avatar Kroese Committed by GitHub
Browse files

Automatic updating of agent

Major rework
parents 04874bd6 acf80e96
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -52,8 +52,8 @@ ENV CPU_CORES 1
ENV DISK_SIZE 16G
ENV RAM_SIZE 512M

ARG BUILD_ARG 0
ARG VERSION_ARG "0.0"
ARG BUILD_ARG=0
ARG VERSION_ARG="0.0"
ENV BUILD=$BUILD_ARG
ENV VERSION=$VERSION_ARG

+88 −30
Original line number Diff line number Diff line
#!/usr/bin/env bash
set -u

VERSION="4"
HEADER="VirtualDSM Agent"

# Functions

finish() {

  echo "$HEADER: Shutting down.."
  exit

}

function checkNMI {

  local nmi
  nmi=$(awk '/NMI/ {for (i=2; i<=NF; i++) if ($i ~ /^[0-9]+$/) {sum+=$i}} END {print sum}' /proc/interrupts)
  nmi=$(cat /proc/interrupts | grep NMI | sed 's/[^1-9]*//g')

  if [ "$nmi" != "" ] && [ "$nmi" -ne "0" ]; then
  if [ "$nmi" != "" ]; then

    echo "Received shutdown request through NMI.." > /dev/ttyS0
    echo "$HEADER: Received shutdown request through NMI.."

    /usr/syno/sbin/synoshutdown -s > /dev/null
    exit
    finish

  fi
}

function downloadUpdate {

  TMP="/tmp/agent.sh"
  rm -f "${TMP}"

  # Auto update the agent

  URL="https://raw.githubusercontent.com/kroese/virtual-dsm/master/agent/agent.sh"
  remote_size=$(curl -sIk -m 4 "${URL}" | grep -i "content-length:" | tr -d " \t" | cut -d ':' -f 2)

  [ "$remote_size" == "" ] && return
  [ "$remote_size" == "0" ] && return

  SCRIPT=$(readlink -f ${BASH_SOURCE[0]})
  local_size=$(stat -c%s "$SCRIPT")

  [ "$remote_size" == "$local_size" ] && return
  
  if ! curl -sfk -m 10 -o "${TMP}" "${URL}"; then
    echo "$HEADER: curl error" && return
  fi

  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

  if cmp --silent -- "${TMP}" "${SCRIPT}"; then
    echo "$HEADER: update file is already equal?" && return
  fi

  mv -f "${TMP}" "${SCRIPT}"
  chmod +x "${SCRIPT}"

  echo "$HEADER: succesfully installed update, please reboot."
  
}

finish() {
function installPackages {

  echo "Shutting down Guest Agent.." > /dev/ttyS0
  exit
  for filename in /usr/local/packages/*.spk; do
    if [ -f "$filename" ]; then

      BASE=$(basename "$filename" .spk)
      BASE="${BASE%%-*}"

      echo "$HEADER: Installing package ${BASE}.."

      /usr/syno/bin/synopkg install "$filename" > /dev/null
      /usr/syno/bin/synopkg start "$BASE" > /dev/null &

      rm "$filename"

    fi
  done

}

trap finish SIGINT SIGTERM

# Setup serialport
ts=$(date +%s%N)
echo "$HEADER v$VERSION"

chmod 666 /dev/ttyS0
checkNMI

# Install packages 
@@ -44,36 +109,28 @@ for filename in /usr/local/packages/*.spk; do
done

if [ "$first_run" = true ]; then
  for filename in /usr/local/packages/*.spk; do
    if [ -f "$filename" ]; then
  
      BASE=$(basename "$filename" .spk)
      BASE="${BASE%%-*}"
  installPackages

      echo "Installing package ${BASE}.." > /dev/ttyS0
      /usr/syno/bin/synopkg install "$filename" > /dev/null

      echo "Starting package ${BASE}.." > /dev/ttyS0
      /usr/syno/bin/synopkg start "$BASE" > /dev/null
else

      rm "$filename"
  downloadUpdate
  
fi
  done
else
  
  # TODO: Auto-update agent
  echo "Checking for updates.." > /dev/ttyS0

  sleep 5
delay=5000
elapsed=$((($(date +%s%N) - ts)/1000000))

if (( delay > elapsed )); then
  difference=$((delay-elapsed))
  sleep "$(echo | awk -v diff="${difference}" '{print diff * 0.001}')"
fi

# Display message in docker log output

echo "-------------------------------------------" > /dev/ttyS0
echo " You can now login to DSM at port 5000     " > /dev/ttyS0
echo "-------------------------------------------" > /dev/ttyS0
echo "-------------------------------------------"
echo " You can now login to DSM at port 5000     "
echo "-------------------------------------------"

# Wait for NMI interrupt as a shutdown signal

@@ -83,3 +140,4 @@ while true; do
  sleep 2

done
.
+2 −2
Original line number Diff line number Diff line
#!/bin/bash

PIDFILE="/var/run/agent.pid"
LOGFILE="/var/log/agent.log"
SCRIPT="/usr/local/bin/agent.sh" 

status() {
@@ -17,7 +16,8 @@ start() {
    return 1
  fi
  printf 'Starting agent service...' >&2
  "$SCRIPT" &> "$LOGFILE" & echo $! > "$PIDFILE"
  chmod 666 /dev/ttyS0
  "$SCRIPT" &> /dev/ttyS0 & echo $! > "$PIDFILE"
}

stop() {
+4 −4
Original line number Diff line number Diff line
@@ -80,12 +80,12 @@ if [ ! -f "${DATA}" ]; then

fi

AGENT_VERSION=1
AGENT="${STORAGE}/${BASE}.agent"
[ ! -f "$AGENT" ] && echo "1" > "$AGENT"
AGENT_VERSION=$(cat "${AGENT}")
[ -f "$AGENT" ] && AGENT_VERSION=$(cat "${AGENT}")

if ((AGENT_VERSION < 3)); then
  echo "INFO: The installed Guest Agent in DSM is an outdated version, please upgrade it."
if ((AGENT_VERSION < 4)); then
  echo "INFO: The installed VirtualDSM Agent is an outdated version, please upgrade it."
fi

KVM_DISK_OPTS="\
+6 −3
Original line number Diff line number Diff line
@@ -28,12 +28,15 @@ RD="$TMP/rd.gz"
rm -rf $TMP && mkdir -p $TMP

LOC="$DL/release/7.0.1/42218/DSM_VirtualDSM_42218.pat"
curl -r 64493568-69886247 -s -k -o "$RD" "$LOC"

if ! curl -r 64493568-69886247 -sfk -o "$RD" "$LOC"; then
  echo "Failed to download extractor, code: $?" && exit 60
fi

SUM=$(md5sum $RD | cut -f 1 -d " ")

if [ $SUM != "14fb88cb7cabddb5af1d0269bf032845" ]; then
  echo "Invalid extractor, checksum failed." && exit 59
  echo "Invalid extractor, checksum failed." && exit 61
fi

set +e
@@ -160,7 +163,7 @@ cp /agent/service.sh $LOC/agent.sh
chmod +x $LOC/agent.sh

# Store agent version
echo "3" > "$STORAGE"/"$BASE".agent
echo "4" > "$STORAGE"/"$BASE".agent

echo "Install: Installing system partition..."

Loading