175 lines
3.5 KiB
Bash
Executable File
175 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
error() {
|
|
log "ERROR" "$1"
|
|
}
|
|
|
|
warn() {
|
|
log "WARNING" "$1"
|
|
}
|
|
|
|
info() {
|
|
log "info" "$1"
|
|
}
|
|
|
|
debug() {
|
|
if [ "${LOG_LEVEL}" = "debug" ]; then
|
|
log "debug" "$1"
|
|
fi
|
|
}
|
|
|
|
log() {
|
|
LEVEL=$1
|
|
MESSAGE=$2
|
|
printf "$(date '+%F %T') %s: %s\n" "${LEVEL}" "${MESSAGE}"
|
|
}
|
|
|
|
init_config_file() {
|
|
FILE=$1
|
|
FULLPATH=${LIBATION_CONFIG_DIR}/${FILE}
|
|
if [ -f ${FULLPATH} ]; then
|
|
info "loading ${FILE}"
|
|
cp ${FULLPATH} ${LIBATION_CONFIG_INTERNAL}/
|
|
return 0
|
|
else
|
|
warn "${FULLPATH} not found, creating empty file"
|
|
echo "{}" > ${LIBATION_CONFIG_INTERNAL}/${FILE}
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
update_settings() {
|
|
FILE=$1
|
|
KEY=$2
|
|
VALUE=$3
|
|
info "setting ${KEY} to ${VALUE}"
|
|
echo $(jq --arg k "${KEY}" --arg v "${VALUE}" '.[$k] = $v' ${LIBATION_CONFIG_INTERNAL}/${FILE}) > ${LIBATION_CONFIG_INTERNAL}/${FILE}.tmp
|
|
mv ${LIBATION_CONFIG_INTERNAL}/${FILE}.tmp ${LIBATION_CONFIG_INTERNAL}/${FILE}
|
|
}
|
|
|
|
is_mounted() {
|
|
DIR=$1
|
|
if grep -qs "${DIR} " /proc/mounts;
|
|
then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
create_db() {
|
|
DBFILE=$1
|
|
if [ -f "${DBFILE}" ]; then
|
|
warn "prexisting database found when creating"
|
|
return 0
|
|
else
|
|
if ! touch "${DBFILE}"; then
|
|
error "unable to create database, check permissions on host"
|
|
exit 1
|
|
fi
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
setup_db() {
|
|
DBPATH=$1
|
|
dbpattern="*.db"
|
|
|
|
debug "using database directory ${DBPATH}"
|
|
|
|
# Figure out the right databse file
|
|
if [[ -z "${LIBATION_DB_FILE}" ]];
|
|
then
|
|
dbCount=$(find "${DBPATH}" -maxdepth 1 -type f -name "${dbpattern}" | wc -l)
|
|
if [ "${dbCount}" -gt 1 ];
|
|
then
|
|
error "too many database files found, set LIBATION_DB_FILE to the filename you wish to use"
|
|
exit 1
|
|
elif [ "${dbCount}" -eq 1 ];
|
|
then
|
|
files=( ${DBPATH}/${dbpattern} )
|
|
FILE=${files[0]}
|
|
else
|
|
FILE="${DBPATH}/LibationContext.db"
|
|
fi
|
|
else
|
|
FILE="${DBPATH}/${LIBATION_DB_FILE}"
|
|
fi
|
|
|
|
debug "planning to use database ${FILE}"
|
|
|
|
if [ -f "${FILE}" ]; then
|
|
info "database found at ${FILE}"
|
|
elif [ ${LIBATION_CREATE_DB} = "true" ];
|
|
then
|
|
warn "database not found, creating one at ${FILE}"
|
|
create_db ${FILE}
|
|
else
|
|
error "database not found and creation is disabled"
|
|
exit 1
|
|
fi
|
|
ln -s "${FILE}" "${LIBATION_CONFIG_INTERNAL}/LibationContext.db"
|
|
}
|
|
|
|
run() {
|
|
info "scanning accounts"
|
|
/libation/LibationCli scan
|
|
info "liberating books"
|
|
/libation/LibationCli liberate
|
|
}
|
|
|
|
main() {
|
|
info "initializing libation"
|
|
init_config_file AccountsSettings.json
|
|
init_config_file Settings.json
|
|
|
|
info "loading settings"
|
|
update_settings Settings.json Books "${LIBATION_BOOKS_DIR:-/data}"
|
|
update_settings Settings.json InProgress /tmp
|
|
|
|
info "loading database"
|
|
# If user provides a separate database mount, use that
|
|
if is_mounted "${LIBATION_DB_DIR}";
|
|
then
|
|
DB_LOCATION=${LIBATION_DB_DIR}
|
|
# Otherwise, use the config directory
|
|
else
|
|
DB_LOCATION=${LIBATION_CONFIG_DIR}
|
|
fi
|
|
setup_db ${DB_LOCATION}
|
|
|
|
# Try to warn if books dir wasn't mounted in
|
|
if ! is_mounted "${LIBATION_BOOKS_DIR}";
|
|
then
|
|
warn "${LIBATION_BOOKS_DIR} does not appear to be mounted, books will not be saved"
|
|
fi
|
|
|
|
# Let the user know what the run type will be
|
|
if [[ -z "${SLEEP_TIME}" ]]; then
|
|
SLEEP_TIME=-1
|
|
fi
|
|
|
|
if [ "${SLEEP_TIME}" == -1 ]; then
|
|
info "running once"
|
|
else
|
|
info "running every ${SLEEP_TIME}"
|
|
fi
|
|
|
|
# loop
|
|
while true
|
|
do
|
|
run
|
|
|
|
# Liberate only once if SLEEP_TIME was set to -1
|
|
if [ "${SLEEP_TIME}" == -1 ]; then
|
|
break
|
|
fi
|
|
|
|
sleep "${SLEEP_TIME}"
|
|
done
|
|
|
|
info "exiting"
|
|
}
|
|
|
|
main
|