support des options -r, -l, -e

planification générique
This commit is contained in:
Jephté Clain 2014-04-23 18:26:51 +04:00
parent 8d37156375
commit d70809b9eb
1 changed files with 92 additions and 25 deletions

117
uscrontab
View File

@ -177,11 +177,15 @@ OPTIONS
-e, --edit -e, --edit
Lancer un editeur pour modifier la crontab spécifiée. Si aucun fichier Lancer un editeur pour modifier la crontab spécifiée. Si aucun fichier
n'est spécifié, éditer $USCRONTAB_USERFILE n'est spécifié, éditer $USCRONTAB_USERFILE
-r, --remove
Supprimer le fichier $USCRONTAB_USERFILE s'il existe
Si l'argument /path/to/crontab est spécifié, il est ignoré.
-l, --list -l, --list
Si l'argument /path/to/crontab est spécifié, afficher le contenu de ce Si l'argument /path/to/crontab est spécifié, afficher le contenu de ce
fichier. Sinon, lister les contenus des fichiers crontab qui sont fichier. Sinon, lister les contenus des fichiers crontab qui sont
exécutés avec la planification actuelle. Si une planification générique exécutés avec la planification actuelle. Si une planification générique
est installée, afficher le contenu du fichier est installée, ou si aucune planification n'est en cours, afficher le
contenu du fichier
$USCRONTAB_USERFILE $USCRONTAB_USERFILE
et chacun des fichiers du répertoire et chacun des fichiers du répertoire
$USCRONTAB_USERDIR $USCRONTAB_USERDIR
@ -215,6 +219,16 @@ OPTIONS AVANCEES
le traitement." le traitement."
} }
function set_usercrontabs() {
# initialiser le tableau $1(=usercrontabs) avec la liste suivante: le
# fichier $USCRONTAB_USERFILE s'il existe, puis la liste des fichiers dans
# le répertoire $USCRONTAB_USERDIR
local -a _userfile _userdir
[ -f "$USCRONTAB_USERFILE" ] && _userfile=("$USCRONTAB_USERFILE")
array_lsfiles _userdir "$USCRONTAB_USERDIR"
eval "${1:-usercrontabs}"'=("${_userfile[@]}" "${_userdir[@]}")'
}
USCRONTAB_CTLINE="* * * * * $script" USCRONTAB_CTLINE="* * * * * $script"
USCRONTAB_LOCKDELAY=8 USCRONTAB_LOCKDELAY=8
USCRONTAB_STOPEC=101 USCRONTAB_STOPEC=101
@ -238,43 +252,93 @@ parse_opts "${PRETTYOPTS[@]}" \
-c,--continuous continuous=1 \ -c,--continuous continuous=1 \
-k:,--stop: USCRONTAB_STOPEC= \ -k:,--stop: USCRONTAB_STOPEC= \
-l,--list action=list \ -l,--list action=list \
-e,--edit action=edit \
-r,--remove action=remove \
@ args -- "$@" && set -- "${args[@]}" || die "$args" @ args -- "$@" && set -- "${args[@]}" || die "$args"
if [ "$action" == "list" ]; then crontab="$1"; shift
crontab="$1"; shift
[ -n "$crontab" ] && crontab="$(abspath "$crontab")"
array_from_lines ctfiles "$(crontab -l 2>/dev/null | awkrun script="$script" '$6 == script { print $7 }')" if [ "$action" == "edit" ]; then
found= if [ -z "$crontab" ]; then
for ctfile in "${ctfiles[@]}"; do basedir="$(dirname "$USCRONTAB_USERFILE")"
if [ -z "$crontab" -o "$ctfile" == "$crontab" ]; then [ -d "$basedir" ] || die "$basedir: ce répertoire n'existe pas. Vérifiez l'installation de nutools"
found=1 crontab="$USCRONTAB_USERFILE"
etitle "$(ppath "$ctfile")" fi
cat "$ctfile" enote "Edition de $crontab"
eend "${EDITOR:-vi}" "$crontab"
fi exit 0
done
if [ -n "$crontab" -a -z "$found" ]; then elif [ "$action" == "remove" ]; then
ewarn "$(ppath "$crontab"): non planifié" [ -n "$crontab" ] && ewarn "$crontab: cet argument a été ignoré"
crontab="$USCRONTAB_USERFILE"
if [ -f "$crontab" ]; then
ask_yesno "Voulez-vous supprimer le fichier $crontab?" C || die
enote "Suppression de $crontab"
rm "$crontab" || die
fi fi
exit 0 exit 0
elif [ "$action" == "list" ]; then
if [ -n "$crontab" ]; then
crontab="$(abspath "$crontab")"
array_from_lines ctfiles "$(crontab -l 2>/dev/null | awkrun script="$script" crontab="$crontab" '$6 == script && $7 == crontab { print $7 }')"
if [ ${#ctfiles[*]} -eq 0 ]; then
ewarn "$(ppath "$crontab"): non planifié"
ctfiles=("$crontab")
fi
else
array_from_xlines ctfiles "$(crontab -l 2>/dev/null | awkrun script="$script" '$6 == script { print $7 }')"
if array_contains ctfiles ""; then
# il y a une planification générique
array_del ctfiles ""
set_usercrontabs usercrontabs
array_extend ctfiles usercrontabs
elif [ ${#ctfiles[*]} -eq 0 ]; then
ewarn "aucune planification en cours"
set_usercrontabs ctfiles
fi
fi
r=1
for ctfile in "${ctfiles[@]}"; do
r=0 # il y a au moins une planification
etitle "$(ppath "$ctfile")" \
cat "$ctfile"
done
exit $r
fi fi
crontab="$1"; shift [ -z "$crontab" -o -f "$crontab" ] || die "$crontab: fichier introuvable"
[ -n "$crontab" ] || die_with "Vous devez spécifier le fichier crontab" display_help [ -n "$crontab" ] && crontab="$(abspath "$crontab")"
[ -f "$crontab" ] || die "$crontab: fichier introuvable"
crontab="$(abspath "$crontab")"
if [ "$action" == "install" ]; then if [ "$action" == "install" ]; then
enable_in_crontab "$USCRONTAB_CTLINE $(quoted_arg "$crontab")" && estep "add_to_crontab $USCRONTAB_CTLINE $(quoted_arg "$crontab")" ctline="$USCRONTAB_CTLINE"
[ -n "$crontab" ] && ctline="$ctline $(quoted_arg "$crontab")"
enable_in_crontab "$ctline" && estep "add_to_crontab $ctline"
elif [ "$action" == "uninstall" ]; then elif [ "$action" == "uninstall" ]; then
remove_from_crontab "$USCRONTAB_CTLINE $(quoted_arg "$crontab")" && estep "remove_from_crontab $USCRONTAB_CTLINE $(quoted_arg "$crontab")" ctline="$USCRONTAB_CTLINE"
[ -n "$crontab" ] && ctline="$ctline $(quoted_arg "$crontab")"
remove_from_crontab "$ctline" && estep "remove_from_crontab $ctline"
elif [ "$action" == "run" ]; then elif [ "$action" == "run" ]; then
clean_crontab=
if [ -n "$crontab" ]; then
default_lockfile="/var/run/$scriptname$crontab.lock"
else
set_usercrontabs usercrontabs
ac_set_tmpfile crontab
clean_crontab=1
for usercrontab in "${usercrontabs[@]}"; do
echo "# $usercrontab" >>"$crontab"
cat "$usercrontab" >>"$crontab"
done
default_lockfile="/var/run/$scriptname$USCRONTAB_USER.lock"
fi
if [ "$lockfile" == auto ]; then if [ "$lockfile" == auto ]; then
if is_root; then if is_root; then
lockfile="/var/run/$scriptname$crontab.lock" lockfile="$default_lockfile"
mkdirof "$lockfile" || die mkdirof "$lockfile" || die
else else
lockfile= lockfile=
@ -284,6 +348,8 @@ elif [ "$action" == "run" ]; then
if [ -n "$lockfile" ]; then if [ -n "$lockfile" ]; then
lockwarn="${lockfile%.lock}.lockwarn" lockwarn="${lockfile%.lock}.lockwarn"
autoclean "$lockwarn"
retry=1 retry=1
while [ -n "$retry" ]; do while [ -n "$retry" ]; do
case "$(lf_trylock -h "$lockdelay" "$lockfile")" in case "$(lf_trylock -h "$lockdelay" "$lockfile")" in
@ -306,7 +372,8 @@ elif [ "$action" == "run" ]; then
*) retry=;; *) retry=;;
esac esac
done done
[ -f "$lockwarn" ] && rm "$lockwarn"
ac_clean "$lockwarn"
autoclean "$lockfile" autoclean "$lockfile"
fi fi
@ -367,6 +434,6 @@ puis supprimez le cas échéant le fichier $1"
eval "$ctscript" eval "$ctscript"
ac_cleanall ac_cleanall
); ec=$? ); ec=$?
[ -f "$lockfile" ] && rm "$lockfile" ac_clean "$lockfile"
exit "$ec" exit "$ec"
fi fi