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
Lancer un editeur pour modifier la crontab spécifiée. Si aucun fichier
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
Si l'argument /path/to/crontab est spécifié, afficher le contenu de ce
fichier. Sinon, lister les contenus des fichiers crontab qui sont
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
et chacun des fichiers du répertoire
$USCRONTAB_USERDIR
@ -215,6 +219,16 @@ OPTIONS AVANCEES
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_LOCKDELAY=8
USCRONTAB_STOPEC=101
@ -238,43 +252,93 @@ parse_opts "${PRETTYOPTS[@]}" \
-c,--continuous continuous=1 \
-k:,--stop: USCRONTAB_STOPEC= \
-l,--list action=list \
-e,--edit action=edit \
-r,--remove action=remove \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
if [ "$action" == "list" ]; then
crontab="$1"; shift
[ -n "$crontab" ] && crontab="$(abspath "$crontab")"
crontab="$1"; shift
array_from_lines ctfiles "$(crontab -l 2>/dev/null | awkrun script="$script" '$6 == script { print $7 }')"
found=
for ctfile in "${ctfiles[@]}"; do
if [ -z "$crontab" -o "$ctfile" == "$crontab" ]; then
found=1
etitle "$(ppath "$ctfile")"
cat "$ctfile"
eend
fi
done
if [ -n "$crontab" -a -z "$found" ]; then
ewarn "$(ppath "$crontab"): non planifié"
if [ "$action" == "edit" ]; then
if [ -z "$crontab" ]; then
basedir="$(dirname "$USCRONTAB_USERFILE")"
[ -d "$basedir" ] || die "$basedir: ce répertoire n'existe pas. Vérifiez l'installation de nutools"
crontab="$USCRONTAB_USERFILE"
fi
enote "Edition de $crontab"
"${EDITOR:-vi}" "$crontab"
exit 0
elif [ "$action" == "remove" ]; then
[ -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
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
crontab="$1"; shift
[ -n "$crontab" ] || die_with "Vous devez spécifier le fichier crontab" display_help
[ -f "$crontab" ] || die "$crontab: fichier introuvable"
crontab="$(abspath "$crontab")"
[ -z "$crontab" -o -f "$crontab" ] || die "$crontab: fichier introuvable"
[ -n "$crontab" ] && crontab="$(abspath "$crontab")"
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
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
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 is_root; then
lockfile="/var/run/$scriptname$crontab.lock"
lockfile="$default_lockfile"
mkdirof "$lockfile" || die
else
lockfile=
@ -284,6 +348,8 @@ elif [ "$action" == "run" ]; then
if [ -n "$lockfile" ]; then
lockwarn="${lockfile%.lock}.lockwarn"
autoclean "$lockwarn"
retry=1
while [ -n "$retry" ]; do
case "$(lf_trylock -h "$lockdelay" "$lockfile")" in
@ -306,7 +372,8 @@ elif [ "$action" == "run" ]; then
*) retry=;;
esac
done
[ -f "$lockwarn" ] && rm "$lockwarn"
ac_clean "$lockwarn"
autoclean "$lockfile"
fi
@ -367,6 +434,6 @@ puis supprimez le cas échéant le fichier $1"
eval "$ctscript"
ac_cleanall
); ec=$?
[ -f "$lockfile" ] && rm "$lockfile"
ac_clean "$lockfile"
exit "$ec"
fi