158 lines
4.5 KiB
Plaintext
158 lines
4.5 KiB
Plaintext
|
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
||
|
|
||
|
function __lf_get_age() {
|
||
|
y=$(date "+%Y")
|
||
|
dy=$(date "+%j"); while [ ${dy#0} != $dy ]; do dy=${dy#0}; done
|
||
|
h=$(date "+%H"); while [ ${h#0} != $h ]; do h=${h#0}; done
|
||
|
echo $((($y * 365 + $dy) * 24 + $h))
|
||
|
}
|
||
|
|
||
|
function lockfile_set() {
|
||
|
# USAGE
|
||
|
# lockfile_set [-h max_hours] /path/to/lockfile
|
||
|
# OPTIONS
|
||
|
# lockfile
|
||
|
# fichier qui doit contenir le verrou
|
||
|
# -h max_hours
|
||
|
# Nombre d'heures (par défaut 4) au bout duquel on retourne 2
|
||
|
# Sinon, on retourne 1.
|
||
|
# Retourne 0 si le verrou a été placé correctement. Le fichier sera supprimé
|
||
|
# automatiquement en fin de script.
|
||
|
# Retourne 1 si le verrou n'a pas pu être placé
|
||
|
# Retourne 2 si le verrou n'a pas pu être placé au bout de max_hours heures
|
||
|
local OENC="$UTF8"
|
||
|
local end_of_options lockfile max_hours=4
|
||
|
while [ -n "$1" ]; do
|
||
|
case "$1" in
|
||
|
-h)
|
||
|
shift
|
||
|
max_hours="$1"
|
||
|
;;
|
||
|
--)
|
||
|
shift
|
||
|
end_of_options=1
|
||
|
;;
|
||
|
|
||
|
-*)
|
||
|
if ! set_verbosity "$1" -v; then
|
||
|
ewarn "option non reconnue: $1"
|
||
|
fi
|
||
|
;;
|
||
|
|
||
|
*)
|
||
|
end_of_options=1
|
||
|
;;
|
||
|
esac
|
||
|
[ -n "$end_of_options" ] && break
|
||
|
shift
|
||
|
done
|
||
|
|
||
|
lockfile="$1"
|
||
|
[ -n "$lockfile" ] || return 1
|
||
|
|
||
|
local now="$(__lf_get_age)"
|
||
|
if [ -f "$lockfile" ]; then
|
||
|
local prev=$(<"$lockfile") diff="$(($now - $prev))"
|
||
|
[ "$diff" -gt "$max_hours" ] && return 2 || return 1
|
||
|
fi
|
||
|
touch "$lockfile" || return 1
|
||
|
autoclean "$lockfile"
|
||
|
echo "$now" >"$lockfile"
|
||
|
}
|
||
|
|
||
|
function pidfile_set() {
|
||
|
# USAGE
|
||
|
# pidfile_set [-p pid] /path/to/pidfile
|
||
|
# OPTIONS
|
||
|
# pidfile
|
||
|
# fichier qui doit contenir le pid du script
|
||
|
# -p pid
|
||
|
# spécifier le pid. par défaut, utiliser $$
|
||
|
# -r
|
||
|
# si pidfile existe mais que le processus ne tourne plus, faire
|
||
|
# comme si le fichier n'existe pas.
|
||
|
# Retourner 0 si le pid a été correctement écrit dans le fichier. Ce fichier
|
||
|
# sera supprimmé automatiquement en fin de script
|
||
|
# Retourner 1 si le fichier existe déjà et que le processus est en train de
|
||
|
# tourner.
|
||
|
# Retourner 2 si le fichier existe déjà mais que le processus ne tourne
|
||
|
# plus.
|
||
|
# Retourner 10 si autre erreur grave s'est produite (par exemple, s'il manque
|
||
|
# le chemin vers pidfile, ou si le fichier n'est pas accessible en
|
||
|
# écriture.)
|
||
|
local OENC="$UTF8"
|
||
|
local end_of_options pidfile pid=$$ replace=
|
||
|
while [ -n "$1" ]; do
|
||
|
case "$1" in
|
||
|
-p)
|
||
|
shift
|
||
|
pid="$1"
|
||
|
;;
|
||
|
-r)
|
||
|
replace=1
|
||
|
;;
|
||
|
--)
|
||
|
shift
|
||
|
end_of_options=1
|
||
|
;;
|
||
|
|
||
|
-*)
|
||
|
if ! set_verbosity "$1" -v; then
|
||
|
ewarn "option non reconnue: $1"
|
||
|
fi
|
||
|
;;
|
||
|
|
||
|
*)
|
||
|
end_of_options=1
|
||
|
;;
|
||
|
esac
|
||
|
[ -n "$end_of_options" ] && break
|
||
|
shift
|
||
|
done
|
||
|
|
||
|
pidfile="$1"
|
||
|
[ -n "$pidfile" ] || return 10
|
||
|
|
||
|
if [ -f "$pidfile" ]; then
|
||
|
local curpid="$(<"$pidfile")"
|
||
|
if is_running "$curpid"; then
|
||
|
return 1
|
||
|
elif [ -n "$replace" ]; then
|
||
|
/bin/rm -f "$pidfile" || return 10
|
||
|
else
|
||
|
return 2
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
echo_ "$pid" >"$pidfile" || return 10
|
||
|
autoclean "$pidfile"
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
function read_mainClasses() {
|
||
|
# USAGE
|
||
|
# read_mainClasses scriptName /path/to/mainClasses
|
||
|
# Lire le fichier mainClasses et initialiser les variables correspondant à
|
||
|
# scriptName.
|
||
|
# Retourner 1 si une erreur quelconque se produit: l'entrée correspondant à
|
||
|
# scriptName n'a pas été trouvée, il manque des arguments, ou le fichier
|
||
|
# mainClasses n'existe pas.
|
||
|
# Les lignes dans le fichier mainClasses doivent être de la forme
|
||
|
# scriptName:mainClass[;var0=value0;...]
|
||
|
local OENC="$UTF8"
|
||
|
local scriptname_="$1" mainClasses_="$2"
|
||
|
[ -n "$scriptname_" -a -n "$mainClasses_" ] || return 1
|
||
|
|
||
|
local line_="$(grep "^$scriptname_:" "$mainClasses_")" || return 1
|
||
|
[ -n "$line_" ] || return 1
|
||
|
|
||
|
#scriptname="${line_%%:*}"
|
||
|
line_="${line_#*:}"
|
||
|
mainClass="${line_%%;*}"
|
||
|
line_="${line_#*;}"
|
||
|
if [ "$line_" != "$mainClass" ]; then
|
||
|
# Evaluer les variables
|
||
|
eval "$line_"
|
||
|
fi
|
||
|
}
|