#!/bin/sh

set -e

auSecours()
{
	nom="`basename "$0"`"
	cat >&2 << TERMINE
# $nom
# Ajout propre au crontab
# © 2007,2019 Guillaume Outters

Utilisation: $nom [-u <utilisateur>] [- <expr>] [<heure> <chose>|<var>=<val>]
  -u <utilisateur>              en tant que quelqu'un d'autre.
  <expr>                        expression à sortir du crontab (ex.: ligne que
                                remplace celle qu'on ajoute), passable sous
                                grep.
  <heure>                       heure façon crontab, avec des tirets à la place
                                des espaces ou tabulations.
  <chose>                       ligne à ajouter.
  <var>=<val>                   Définition de variable d'environnement.
TERMINE
	exit 1
}

analyserParametres()
{
	vars="heure chose"
	retirer=
	heure=
	chose=
	env=
	paramsQui=
	while [ $# -gt 0 ]
	do
		case "$1" in
			-h) auSecours ;;
			-u) shift ; paramsQui="-u $1" ;;
			-) shift ; retirer="$1" ;;
			*)
				[ -z "$vars" ] && auSecours
				for i in $vars
				do
					export $i="$1"
					break
				done
				vars="`echo "$vars" | sed -e 's/[^ ]* //'`"
				;;
		esac
		shift
	done
}

faire()
{
analyserParametres "$@"
	# Définition de l'environnement
	if [ -z "$chose" ]
	then
		case "$heure" in
			*=*)
				env="$heure"
				retirer="^`echo "$heure" | cut -d = -f 1`="
				heure=
				;;
		esac
	fi
[ -z "$chose" -a -z "$retirer" ] && auSecours

S=/tmp/temp.$$.crontaber
C=/tmp/temp.$$.crontabage
touch "$S" "$C"
chmod 700 "$S"
chmod 600 "$C"
	heure="`echo "$heure" | sed -E -e 's/[^0-9*]+/	/g' -e 's/$/	*	*	*	*	*/' -e 's/^([^	]+	[^	]+	[^	]+	[^	]+	[^	]+).*$/\1/'`"
	export retirer heure chose env
(
	cat << TERMINE
#!/bin/sh
sleep 2 # Si on va trop vite à modifier le fichier, le mtime est égal au ctime, et crontab croit qu'on n'a pas touché au fichier.
(
	[ -z "\$env" ] || echo "\$env"
	if [ -z "\$retirer" ]
	then
		cat
	else
		grep -v "\$retirer"
	fi < "\$1"
	[ -z "\$chose" -o -z "\$heure" ] || echo "\$heure	\$chose"
) > "$C" && cat "$C" > "\$1"
TERMINE
) > "$S"
export EDITOR="$S"
crontab $paramsQui -e
rm -f "$S" "$C"
}

faire "$@"
