#!/bin/bash

# This script checks for a new version of BasicAircraftLookup from
# the VRS website and, if one is available, downloads it and updates
# the dump1090 webmap json files.

set -e

# defaults that can be overridden:
VRS_URL=${VRS_URL:-http://www.virtualradarserver.co.uk/Files/BasicAircraftLookup.sqb.gz}
CACHEDIR=${CACHEDIR:-/var/cache/dump1090-mutability}
JSONDIR=${JSONDIR:-$CACHEDIR/db}
SQBDIR=${SQBDIR:-$CACHEDIR/sqb}
LOGFILE=${LOGFILE:-/var/log/dump1090-mutability.log}
UPDATESCRIPT=${UPDATESCRIPT:-/usr/share/dump1090-mutability/vrs-basicaircraft-to-json.py}

if [ -f /etc/default/dump1090-mutability ]
then
  . /etc/default/dump1090-mutability
fi

ETAGFILE=$SQBDIR/BasicAircraftLookup.sqb.etag
SQBFILE=$SQBDIR/BasicAircraftLookup.sqb

CHECKMODIFIED=true
LOGTOFILE=false
while [ "$#" -gt 0 ]
do
  case "$1" in
    -f|--force) CHECKMODIFIED=false ;;
    -l|--log-to-file) LOGTOFILE=true ;;
    *) echo "unrecognized option: $1" >&2; exit 1 ;;
  esac
  shift
done

if $LOGTOFILE; then exec >>$LOGFILE 2>&1; fi

log() {
  date "+%c $*" >&2
}

mkdir -p $CACHEDIR $JSONDIR $SQBDIR
rm -f $ETAGFILE.new $SQBFILE.new

log "Checking VRS server for an updated database.."

# get ETag
curl --silent --fail --include --head $VRS_URL | grep ETag >$ETAGFILE.new

# check for existing file
RETRIEVE=true
ARGS=""
if $CHECKMODIFIED && [ -f $SQBFILE ]
then
  if [ -s $ETAGFILE -a -s $ETAGFILE.new ]
  then
    if cmp -s $ETAGFILE $ETAGFILE.new
    then
      log "Database not modified."
      RETRIEVE=false
    else
      log "Database modified, will retrieve a new copy."
    fi
  else
    # do an if-modified-since
    log "Database possibly modified, will try to retrieve a new copy."
    ARGS="-z $SQBFILE"
  fi
fi

if $RETRIEVE
then
  log "Retrieving database.."
  curl --silent --fail --remote-time --retry 2 $ARGS -o $SQBFILE.new $VRS_URL
  mv $ETAGFILE.new $ETAGFILE
  if [ -f $SQBFILE.new ]
  then
    log "Decompressing database.."
    zcat $SQBFILE.new >$SQBFILE
    touch -r $SQBFILE.new $SQBFILE
    rm $SQBFILE.new
  else
    log "Database not modified."
  fi
fi

UPDATE=true
if $CHECKMODIFIED
then
  if test -f $JSONDIR/last_update; then
    if ! test $SQBFILE -nt $JSONDIR/last_update; then UPDATE=false; fi
  fi
fi

if $UPDATE
then
  log "Updating JSON files from database.."
  mkdir -p $JSONDIR/new
  $UPDATESCRIPT $SQBFILE $JSONDIR/new
  rm -f $JSONDIR/*.json
  mv $JSONDIR/new/*.json $JSONDIR/
  touch -r $SQBFILE $JSONDIR/last_update
  rmdir $JSONDIR/new
  log "Done."
else
  log "No update to JSON files needed."
fi