#!/bin/sh

set -eu

external_files_dir='/state/external_files'

if [ -e /etc/puavo/ldap/dn -a -e /etc/puavo/ldap/password ]; then
  puavo_rest_request_args='--user-etc'
else
  puavo_rest_request_args='--user-bootserver'
fi

extfile_needs_update() {
  local extfile_name extfile_hash

  extfile_name=$1
  extfile_hash=$2

  target_file_path="${external_files_dir}/${extfile_name}"

  if [ -r "$target_file_path" ]; then
    sha1=$(sha1sum "$target_file_path" | awk '{ print $1 }')
    if [ "$sha1" = "$extfile_hash" ]; then
      return 1
    fi
  fi

  return 0
}

get_extfiles() {
  extfile_urls=''
  curl_args=''

  if [ ! -d "$external_files_dir" ]; then
    mkdir -p "$external_files_dir"
  fi

  for extfile_name in $@; do
    extfile_urls="${extfile_urls} /v3/devices/$(hostname)/external_files/${extfile_name}"
    curl_args="${curl_args} --output ${external_files_dir}/${extfile_name}"
  done

  if [ -z "$curl_args" ]; then
    return 0
  fi

  if ! puavo-rest-request $extfile_urls $puavo_rest_request_args \
         -- $curl_args; then
    echo "error when fetching $extfile_urls" >&2
    return 1
  fi
}

read hostname < /etc/puavo/hostname

index_json=$(puavo-rest-request "/v3/devices/$(hostname)/external_files" \
	       $puavo_rest_request_args)

external_files_spec=$(printf "%s" "$index_json" \
  | jq -r '.[] | (.name + "|" + .data_hash)
               | if test("\\s") or test("/") then
                   error("unexpected characters in external files index data")
                 else . end')

extfiles_needing_update=''

for extfile_spec in $external_files_spec; do
  extfile_name="${extfile_spec%%|*}"
  extfile_hash="${extfile_spec##*|}"

  if extfile_needs_update "$extfile_name" "$extfile_hash"; then
    extfiles_needing_update="${extfiles_needing_update} ${extfile_name}"
  fi
done

get_extfiles $extfiles_needing_update

# cleanup old files
for extfile in ${external_files_dir}/*; do
  found=false
  for extfile_spec in $external_files_spec; do
    extfile_name="${extfile_spec%%|*}"
    if [ "$extfile_name" = "${extfile##*/}" ]; then
      found=true
      break
    fi
  done
  if ! $found; then
    rm -f "$extfile"
  fi
done

exit 0
