#!/usr/bin/env bash
logfile="/var/log/futurehome/fhbutler/update.log"
size=$(stat -c%s "$logfile" 2>/dev/null || echo 0)
if [ "$size" -gt 102400 ]; then
  # drop oldest entries in place, metadata-only (no data copy, no mmc wear); rename as fallback
  fallocate -c -o 0 -l $(( (size - 51200) / 4096 * 4096 )) "$logfile" 2>/dev/null || mv -f "$logfile" "$logfile.1"
fi
force_version=""
downgrade=""
echo "$(date "+%Y-%m-%d %H:%M:%S") ---Start self-upgrade" >> "$logfile"
sleep 2
for ARGUMENT in "$@"
do
  if  [[ $ARGUMENT == -v=* ]];
  then
      force_version=${ARGUMENT:3}
      ## Allow only letters, numbers, dots, underscores, colons, hyphens, tildes and plus signs. No spaces allowed.
      if [[ "$force_version" =~ ^([a-zA-Z0-9\._:~+'-'])+$ ]]; then
         echo "Package version has been forced to: $force_version" >> "$logfile"
      else
         echo "Package version failed validation: '$force_version', aborting installation..." >> "$logfile"
         exit 1
      fi
  elif [[ $ARGUMENT == allow_downgrade ]];
  then
      # --allow-downgrades is unsupported on some apt versions, so it is opt-in.
      downgrade="--allow-downgrades"
  fi
done

package="fhbutler"
if [ -n "$force_version" ]; then
   package="fhbutler=$force_version"
fi

# $downgrade is intentionally unquoted: empty expands to no argument.
sudo -n /usr/bin/apt-get -qy install "$package" $downgrade >> "$logfile" 2>&1
rc=$?

echo "$(date "+%Y-%m-%d %H:%M:%S") ---Done self-upgrade rc=$rc" >> "$logfile"
exit $rc
