#!@@SH@@ # # pro-archman # src/pro-archman.sh # Main program file # # Copyright (C) 2013 Patrick "P. J." McDermott # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -u # Constant global variables PKGLIBDIR='@@PKGLIBDIR@@' PKGLIBCMDDIR='@@PKGLIBCMDDIR@@' PKGLIBCMD='@@PKGLIBCMD@@' LF=' ' # Global variables loading_cmd= opt_base_dir= opt_cmd= conf_incoming_channel= conf_incoming_dir= conf_pool_gc_delay= lock= # use() must be defined inline so it can be used to load other modules. use() { local module="${1}" local default_dir= local lib_subdir= local dir= if [ "x${module%/*}" = "x${module}" ]; then default_dir="${PKGLIBDIR}" lib_subdir='' else case "${module%/*}" in 'cmd') loading_cmd="$(printf '%s' "${module##*/}" | \ tr '[A-Z]' '[a-z]' | \ tr -C '[a-z0-9_]' '_')" default_dir="${PKGLIBCMDDIR}" lib_subdir='cmd' ;; esac fi if [ "${ARCHMAN_LIBDIR+set}" = 'set' ]; then dir="${ARCHMAN_LIBDIR:-.}/${lib_subdir}" else dir="${default_dir}" fi if [ -f "${dir}/${module##*/}.sm" ]; then . "${dir}/${module##*/}.sm" else printf '%s: Error: Failed to load module "%s": %s\n' \ "${0##*/}" "${module}" 'no such file or directory' >&2 exit 2 fi } use locale use cmd use index use garbage main() { local status= load_locale load_cmds opt_base_dir='.' opt_cmd='' get_options "${@}" shift $(($OPTIND - 1)) if [ ${#} -lt 1 ]; then cmd_help_main >&2 exit 1 fi mkdir -p "${opt_base_dir}/.db" lock="${opt_base_dir}/.db/lock" if ! (set -C; printf '%d\n' "${$}" >"${lock}") 2>/dev/null; then printf '%s: Error: ' "${0##*/}" >&2 printf "$(get_msg 'lock_fail')\n" >&2 exit 2 fi if [ "x${opt_cmd}" != 'x' ]; then run_cmd "${opt_cmd}" "${@}" status=${?} else get_conf run_cmd "${@}" status=${?} fi fini return ${status} } get_options() { local opt= while getopts 'b:h' opt; do case "${opt}" in 'b') opt_base_dir="$(cd "${OPTARG}" && pwd)" ;; 'h') opt_cmd='help' ;; esac done return 0 } get_conf() { local old_dir= # Set defaults. conf_incoming_channel='dev' conf_incoming_dir='../incoming' conf_pool_gc_delay=86400 if [ -f "${opt_base_dir}/conf" ]; then . "${opt_base_dir}/conf" fi old_dir="$(pwd)" cd "${opt_base_dir}" if [ -d "${conf_incoming_dir}" ]; then conf_incoming_dir="$(cd "${conf_incoming_dir}" && pwd)" fi cd "${old_dir}" return 0 } fini() { update_feeds collect_garbage rm -f "${lock}" } main "${@}"