nutools/legacy/sysinc/scripts

158 lines
4.5 KiB
Bash

# -*- 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
}