#!/bin/sh

# Code updated based on a bug report in Ubuntu:
#   Bug #1999259 reported by Kyler Laird on 2022-12-09

set -e

# Get the effective UID, but do so in a compatible way (we may be running dash)
euid=${EUID:-$(id -u)}

if [ "${euid}" -ne 0 ]; then
	echo "Please run as root"
	exit
fi

if [ -f "@CIFPP_ETC_DIR@/libcifpp.conf" ]; then
	. "@CIFPP_ETC_DIR@/libcifpp.conf"
fi

# check to see if we're supposed to run at all
if [ "$update" != "true" ]; then
	exit
fi

# if cache directory doesn't exist, exit.
if ! [ -d "@CIFPP_CACHE_DIR@" ]; then
	exit
fi

# Create a temp file in the right directory and
# make sure it is cleaned up when this script exits

tmpfile=$(mktemp)
trap "rm -f \"${tmpfile}\"" EXIT

update_dictionary() {
	dict=$1
	source=$2

	# Using curl with
	# --location (follow redirects)
	# --silent (no diagnostic output at all)
	# --time-cond (only fetch if source is newer)
	#
	# Output is extracted and written to $tmpfile and when successful 
	# the tmpfile is placed at the desired location and updated is set
	# to true

	curl --silent --location --compressed --time-cond "${dict}" "${source}" | (
		# uncompress the file on the fly, if it is compressed
		if [ "${source%.gz}" != "${source}" ]; then
			gunzip -c > "${tmpfile}" 2>/dev/null
		else
			cat > "${tmpfile}"
		fi
	) && (
		mv "${tmpfile}" "${dict}" && chmod a+r "${dict}"
	) || true
}

# Update the dictionaries

update_dictionary "@CIFPP_CACHE_DIR@/components.cif" "https://ftp.wwpdb.org/pub/pdb/data/monomers/components.cif.gz"
update_dictionary "@CIFPP_CACHE_DIR@/mmcif_pdbx.dic" "https://mmcif.wwpdb.org/dictionaries/ascii/mmcif_pdbx_v50.dic.gz"
update_dictionary "@CIFPP_CACHE_DIR@/mmcif_ma.dic" "https://github.com/ihmwg/ModelCIF/raw/master/dist/mmcif_ma.dic"

# notify subscribers, will fail on FreeBSD

if [ -d "@CIFPP_ETC_DIR@/libcifpp/cache-update.d" ] && [ -x /bin/run-parts ]; then
	run-parts --arg "@CIFPP_CACHE_DIR@" -- "@CIFPP_ETC_DIR@/libcifpp/cache-update.d"
fi
