Import a new helper for job management

This currently depends on DeforaOS libDatabase.
This commit is contained in:
Pierre Pronchery 2020-02-24 02:40:28 +01:00
parent f226962000
commit 2095760161
2 changed files with 202 additions and 1 deletions

197
src/deforaos-jobs.sh Executable file
View File

@ -0,0 +1,197 @@
#!/bin/sh
#Copyright (c) 2020 Pierre Pronchery <khorben@defora.org>
#Error codes:
# 1 Usage error
# 2 Generic error
# 3 Could not lock the database
# 4 Could not unlock the database
#variables
DATABASE_CONFFILE="deforaos-jobs.conf"
DATABASE_ENGINE="sqlite3"
DATABASE_FILE="deforaos-jobs.db"
DATABASE_INITFILE="deforaos-jobs.sql"
DEVNULL="/dev/null"
PROGNAME_JOBS="defora-jobs"
QUERY_ADD_BEGIN="INSERT INTO jobs (command) VALUES ('"
QUERY_ADD_END="')"
QUERY_EXEC_SELECT="SELECT jobs_id, command FROM jobs WHERE started IS NULL ORDER BY jobs_id ASC LIMIT 1"
QUERY_INIT="CREATE TABLE jobs (jobs_id INTEGER PRIMARY KEY, timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, command VARCHAR(255), started TIMESTAMP DEFAULT NULL, pid INTEGER DEFAULT NULL, code INTEGER DEFAULT NULL, completed TIMESTAMP DEFAULT NULL)"
QUERY_LIST="SELECT * FROM jobs"
#executables
DATABASE="database"
DEBUG=
LOCK="mkdir"
UNLOCK="rmdir"
SED="sed"
#functions
#database_add
_database_add()
{
if [ $# -ne 1 ]; then
_usage
return $?
fi
command="$1"
query="$QUERY_ADD_BEGIN$(echo "$command" | _database_escape)$QUERY_ADD_END"
_database_init || return 2
_database_query "$query" > "$DEVNULL" || return 2
}
#database_escape
_database_escape()
{
$SED -e "s,','',"
}
#database_exec
_database_exec()
{
if [ $# -ne 0 ]; then
_usage
return $?
fi
_database_init || return 2
_database_lock || return 3
_database_query "$QUERY_EXEC_SELECT" | (IFS="|"
read header
read empty jobs_id command empty
if [ -z "$jobs_id" ]; then
_database_unlock || return 4
return 0
fi
#XXX TOCTOU
QUERY="UPDATE jobs SET started=datetime() WHERE jobs_id='$jobs_id'"
_database_query "$QUERY" > "$DEVNULL"
_database_unlock
code=-1
if [ -n "$command" ]; then
$DEBUG sh -c "$command" &
pid=$!
QUERY="UPDATE jobs SET pid='$pid' WHERE jobs_id='$jobs_id'"
_database_query "$QUERY" > "$DEVNULL"
wait $pid
code=$?
fi
QUERY="UPDATE jobs SET completed=datetime(), code='$code' WHERE jobs_id='$jobs_id'"
_database_query "$QUERY" > "$DEVNULL")
}
#database_init
_database_init()
{
if [ ! -f "$DATABASE_CONFFILE" ]; then
echo "filename=$DATABASE_FILE" > "$DATABASE_CONFFILE"
fi
if [ ! -f "$DATABASE_FILE" ]; then
_database_lock || return 3
_database_query "$QUERY_INIT" > "$DEVNULL" || return 2
_database_unlock || return 4
fi
return 0
}
#database_list
_database_list()
{
if [ $# -ne 0 ]; then
_usage
return $?
fi
_database_init || return 2
_database_query "$QUERY_LIST" || return 2
}
#database_lock
_database_lock()
{
$DEBUG $LOCK "${DATABASE_FILE%.db}"
}
#database_query
_database_query()
{
$DEBUG $DATABASE -d "$DATABASE_ENGINE" -C "$DATABASE_CONFFILE" "$@"
}
#database_unlock
_database_unlock()
{
$DEBUG $UNLOCK "${DATABASE_FILE%.db}"
}
#debug
_debug()
{
echo "$@" 1>&3
"$@"
}
#error
_error()
{
echo "$PROGNAME_JOBS: $@" 1>&2
return 2
}
#usage
_usage()
{
echo "Usage: $PROGNAME_JOBS add command" 1>&2
echo " $PROGNAME_JOBS list" 1>&2
echo " $PROGNAME_JOBS exec" 1>&2
return 1
}
#main
while getopts "DO:" name; do
case "$name" in
D)
DEBUG="_debug"
;;
O)
export "${OPTARG%%=*}"="${OPTARG#*=}"
;;
?)
_usage
exit $?
;;
esac
done
shift $((OPTIND - 1))
if [ $# -lt 1 ]; then
_usage
exit $?
fi
exec 3>&1
method="_usage"
case "$1" in
add|list|exec)
method="_database_$1"
;;
*)
_error "$1: Operation not supported"
;;
esac
shift
"$method" "$@"

View File

@ -1,4 +1,4 @@
dist=Makefile,deforaos-build.sh,deforaos-document.sh,deforaos-git-hook.sh,deforaos-git-message.sh,deforaos-irc.sh,deforaos-lock.sh,deforaos-package.sh,deforaos-release.sh,deforaos-update.sh
dist=Makefile,deforaos-build.sh,deforaos-document.sh,deforaos-git-hook.sh,deforaos-git-message.sh,deforaos-irc.sh,deforaos-jobs.sh,deforaos-lock.sh,deforaos-package.sh,deforaos-release.sh,deforaos-update.sh
[deforaos-build.sh]
install=$(PREFIX)/bin
@ -20,6 +20,10 @@ mode=0755
install=$(PREFIX)/libexec
mode=0755
[deforaos-jobs.sh]
install=$(PREFIX)/bin
mode=0755
[deforaos-lock.sh]
install=$(PREFIX)/bin
mode=0755