Import a new helper for job management
This currently depends on DeforaOS libDatabase.
This commit is contained in:
parent
f226962000
commit
2095760161
197
src/deforaos-jobs.sh
Executable file
197
src/deforaos-jobs.sh
Executable 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" "$@"
|
|
@ -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]
|
[deforaos-build.sh]
|
||||||
install=$(PREFIX)/bin
|
install=$(PREFIX)/bin
|
||||||
|
@ -20,6 +20,10 @@ mode=0755
|
||||||
install=$(PREFIX)/libexec
|
install=$(PREFIX)/libexec
|
||||||
mode=0755
|
mode=0755
|
||||||
|
|
||||||
|
[deforaos-jobs.sh]
|
||||||
|
install=$(PREFIX)/bin
|
||||||
|
mode=0755
|
||||||
|
|
||||||
[deforaos-lock.sh]
|
[deforaos-lock.sh]
|
||||||
install=$(PREFIX)/bin
|
install=$(PREFIX)/bin
|
||||||
mode=0755
|
mode=0755
|
||||||
|
|
Loading…
Reference in New Issue
Block a user