Intégration de la branche release-2.18.0

This commit is contained in:
Jephté Clain 2015-10-27 12:06:05 +04:00
commit abe87b47ec
8 changed files with 194 additions and 31 deletions

View File

@ -1,3 +1,10 @@
## Version 2.18.0 du 27/10/2015-12:05
434403a Intégration de la branche uscrontab
2118885 uscrontab: possibilité de mettre en pause sans modifier les planifications en cours
0eeee20 awkrun: renommer les fonctions quote_*
18691c8 upassword: maj doc et support des commentaires pour le mode batch
## Version 2.17.2 du 26/09/2015-12:25 ## Version 2.17.2 du 26/09/2015-12:25
1837a0c pxs: corriger xget, xcopy, xmove pour utiliser directement git annex sync 1837a0c pxs: corriger xget, xcopy, xmove pour utiliser directement git annex sync

View File

@ -1 +1 @@
2.17.2 2.18.0

View File

@ -1 +1 @@
009004000 009005000

View File

@ -28,33 +28,68 @@ pour un tableau values qui contiendra deux valeurs: value1 et value2
Les fonctions suivantes sont définies: Les fonctions suivantes sont définies:
quote_value(s) num(s)
quoter une valeur pour le shell. la valeur est entourée de quotes, e.g: si s ne contient que des chiffres, retourner la valeur numérique associée,
quote_value(\"here, \\\"there\\\" and 'everywhere'.\") sinon retournée la valeur inchangée
--> 'here, \"there\" and '\\''everywhere'\\''.'
quoted_values() ord(s)
retourner le code ASCII du premier caractère de la chaine s. seuls les codes
de 32 à 127 sont supportés
hex(i)
retourner la représentation hexadécimale du nombre i
qhtml(s)
remplacer respectivement dans la chaine s les valeurs &, \", > et < par
&amp;, &quot;, &gt; et &lt;
L'alias quote_html(s) existe pour compatibilité
unquote_html(s)
faire le contraire de qhtml(s)
qval(s)
quoter une valeur pour le shell. la valeur est entourée de quotes, e.g:
qval(\"here, \\\"there\\\" and 'everywhere'.\")
--> 'here, \"there\" and '\\''everywhere'\\''.'
L'alias quote_value(s) existe pour compatibilité
qsval(s)
comme qval() mais ajouter un espace avant la valeur quotée. ceci permet de
construire facilement une ligne de commande, e.g.:
print \"mycmd\" qsval(arg1) qsval(arg2)
qvals()
quoter les valeurs \$1..\$NF pour les passer comme argument sur la ligne de quoter les valeurs \$1..\$NF pour les passer comme argument sur la ligne de
commande avec eval. e.g.: commande avec eval. e.g.:
print \"mycmd \" quoted_values() print \"mycmd \" qvals()
La ligne qui est affichée pourra être évaluée avec eval dans le shell. La ligne qui est affichée pourra être évaluée avec eval dans le shell.
L'alias quoted_values(s) existe pour compatibilité
quote_subrepl(s) qsvals(s)
comme qvals() mais ajouter un espace avant la valeur quotée. ceci permet de
construire facilement une ligne de commande, e.g.:
print \"mycmd\" qsvals()
qsubrepl(s)
quoter une valeur pour l'argument r des fonctions sub() et gsub(). Les quoter une valeur pour l'argument r des fonctions sub() et gsub(). Les
caractères suivants sont mis en échappement: \\ & caractères suivants sont mis en échappement: \\ &
L'alias quote_subrepl(s) existe pour compatibilité
quote_grep(s) qgrep(s)
quoter une valeur pour un pattern *simple* de grep. Les caractères suivants quoter une valeur pour un pattern *simple* de grep. Les caractères suivants
sont mis en échappement: \\ . [ ^ \$ * sont mis en échappement: \\ . [ ^ \$ *
L'alias quote_grep(s) existe pour compatibilité
quote_egrep(s) qegrep(s)
quoter une valeur pour un pattern *étendu* de grep. Les caractères suivants quoter une valeur pour un pattern *étendu* de grep. Les caractères suivants
sont mis en échappement: \\ . [ ^ \$ ? + * ( ) | { sont mis en échappement: \\ . [ ^ \$ ? + * ( ) | {
L'alias quote_egrep(s) existe pour compatibilité
quote_sql(s) qsql(s)
quoter une valeur pour un script sql. la valeur est entourée de quotes, e.g: quoter une valeur pour un script sql. la valeur est entourée de quotes, e.g:
quote_sql(\"hello'there\") quote_sql(\"hello'there\")
--> 'hello''there' --> 'hello''there'
L'alias quote_sql(s) existe pour compatibilité
unquote_mysqlcsv(s) unquote_mysqlcsv(s)
Analyser une valeur exportée de MySQL avec mysqlcsv. Les transformations Analyser une valeur exportée de MySQL avec mysqlcsv. Les transformations

View File

@ -1848,13 +1848,14 @@ function hex(i, s) {
if (length(s) < 2) s = "0" s if (length(s) < 2) s = "0" s
return s return s
} }
function quote_html(s) { function qhtml(s) {
gsub(/&/, "\\&amp;", s) gsub(/&/, "\\&amp;", s)
gsub(/"/, "\\&quot;", s) gsub(/"/, "\\&quot;", s)
gsub(/>/, "\\&gt;", s) gsub(/>/, "\\&gt;", s)
gsub(/</, "\\&lt;", s) gsub(/</, "\\&lt;", s)
return s return s
} }
function quote_html(s) { return qhtml(s) }
function unquote_html(s) { function unquote_html(s) {
gsub(/&lt;/, "<", s) gsub(/&lt;/, "<", s)
gsub(/&gt;/, ">", s) gsub(/&gt;/, ">", s)
@ -1862,11 +1863,15 @@ function unquote_html(s) {
gsub(/&amp;/, "\\&", s) gsub(/&amp;/, "\\&", s)
return s return s
} }
function quote_value(s) {'" function qval(s) {'"
gsub(/'/, \"'\\\\''\", s) gsub(/'/, \"'\\\\''\", s)
return \"'\" s \"'\" return \"'\" s \"'\"
"'} "'}
function quoted_values( i, line) { function quote_value(s) { return qval(s) }
function qsval(s) {
return " " qval(s)
}
function qvals( i, line) {
line = "" line = ""
for (i = 1; i <= NF; i++) { for (i = 1; i <= NF; i++) {
if (i > 1) line = line " " if (i > 1) line = line " "
@ -1874,27 +1879,36 @@ function quoted_values( i, line) {
} }
return line return line
} }
function quote_regexp(s) { function quoted_values() { return qvals() }
function qsvals() {
return " " qvals()
}
function qregexp(s) {
gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) gsub(/[[\\.^$*+?()|{]/, "\\\\&", s)
return s return s
} }
function quote_subrepl(s) { function quote_regexp(s) { return qregexp(s) }
function qsubrepl(s) {
gsub(/\\/, "\\\\", s) gsub(/\\/, "\\\\", s)
gsub(/&/, "\\\\&", s) gsub(/&/, "\\\\&", s)
return s return s
} }
function quote_grep(s) { function quote_subrepl(s) { return qsubrepl(s) }
function qgrep(s) {
gsub(/[[\\.^$*]/, "\\\\&", s) gsub(/[[\\.^$*]/, "\\\\&", s)
return s return s
} }
function quote_egrep(s) { function quote_grep(s) { return qgrep(s) }
function qegrep(s) {
gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) gsub(/[[\\.^$*+?()|{]/, "\\\\&", s)
return s return s
} }
function quote_sql(s) {'" function quote_egrep(s) { return qegrep(s) }
function qsql(s) {'"
gsub(/'/, \"''\", s) gsub(/'/, \"''\", s)
return \"'\" s \"'\" return \"'\" s \"'\"
"'} "'}
function quote_sql(s) { return qsql(s) }
function unquote_mysqlcsv(s) { function unquote_mysqlcsv(s) {
gsub(/\\n/, "\n", s) gsub(/\\n/, "\n", s)
gsub(/\\t/, "\t", s) gsub(/\\t/, "\t", s)

View File

@ -92,7 +92,12 @@ function enable_in_crontab() {
} }
# Afficher la spécification crontab correspondant à l'heure courante # Afficher la spécification crontab correspondant à l'heure courante
function ctnow() { function ctnow() {
date +"%-M %-H %-d %-m %u" #date +"%-M %-H %-d %-m %u"
if [ -n "$1" ]; then
echo "$1" | awk '{ print strftime("%-M %-H %-d %-m %u", $0) }'
else
awk 'BEGIN { print strftime("%-M %-H %-d %-m %u", systime()) }'
fi
} }
__CTRESOLVE_CTNOW="" __CTRESOLVE_CTNOW=""
# Analyser STDIN qui contient des lignes au format crontab, et afficher des # Analyser STDIN qui contient des lignes au format crontab, et afficher des

View File

@ -4398,7 +4398,7 @@ public class upassword {
/** /**
* Vérifier que le mot de spécifié est de qualité. * Vérifier que le mot de spécifié est de qualité.
* *
* @return null si le mot de passe est correct. Sinon, retourner un message qui indique ce * @return null si le mot de passe est correct. Sinon, retourner un message qui indique ce
* qui ne va pas. * qui ne va pas.
*/ */
@ -4868,6 +4868,7 @@ public class upassword {
+ "\n upassword -f aeskeyfile -s" + "\n upassword -f aeskeyfile -s"
+ "\n upassword -f aeskeyfile -e clear" + "\n upassword -f aeskeyfile -e clear"
+ "\n upassword -f aeskeyfile -d crypted" + "\n upassword -f aeskeyfile -d crypted"
+ "\n upassword --batch"
+ "\n\nOPTIONS" + "\n\nOPTIONS"
+ "\n -p, --hash-password" + "\n -p, --hash-password"
+ "\n Crypter un mot de passe (option par défaut). Si le mot de passe en clair" + "\n Crypter un mot de passe (option par défaut). Si le mot de passe en clair"
@ -4890,7 +4891,32 @@ public class upassword {
+ "\n Spécifier le fichier contenant la clé AES. Cette option est obligatoire" + "\n Spécifier le fichier contenant la clé AES. Cette option est obligatoire"
+ "\n avec les options -G, -s, -e et -d" + "\n avec les options -G, -s, -e et -d"
+ "\n --shell" + "\n --shell"
+ "\n Afficher les valeurs pour évaluation par le shell"); + "\n Afficher les valeurs pour évaluation par le shell"
+ "\n\nMODE BATCH"
+ "\nUtiliser l'option --batch active le mode batch. Dans ce mode, chaque ligne est"
+ "\nun ensemble d'arguments, comme si on avait lancé le script à plusieurs reprises."
+ "\nL'analyseur est limité: le découpage des arguments est fait sur les espaces."
+ "\nLes lignes commençant par # sont ignorées."
+ "\nSi une ligne commence par --batch-after, alors cette ligne est affichée après"
+ "\nchaque résultat. Ceci permet de générer un script qui peut être évalué."
+ "\n\nVoici un exemple:"
+ "\n upassword --batch <<EOF"
+ "\n --batch-after process_password1 args"
+ "\n --shell"
+ "\n --shell fixed-password1"
+ "\n --batch-after process_password2 args"
+ "\n --shell fixed-password2"
+ "\n EOF"
+ "\nLe résultat serait quelque chose comme:"
+ "\n clear='<random-password>'"
+ "\n ... # toutes les valeurs lm, ntlm, crypt, sha, xsha, ssha, md5, smd5"
+ "\n process_password1 args"
+ "\n clear='fixed-password1'"
+ "\n ... # toutes les valeurs lm, ntlm, crypt, sha, xsha, ssha, md5, smd5"
+ "\n process_password1 args"
+ "\n clear='fixed-password2'"
+ "\n ... # toutes les valeurs lm, ntlm, crypt, sha, xsha, ssha, md5, smd5"
+ "\n process_password2 args");
return; return;
} }
@ -4904,7 +4930,8 @@ public class upassword {
if (arg.equals("-p") || arg.equals("--hash-password")) { if (arg.equals("-p") || arg.equals("--hash-password")) {
action = EAction.HASH_PASSWORD; action = EAction.HASH_PASSWORD;
i++; i++;
} else if (arg.substring(0, 2).equals("-j") || arg.equals("--clear-is-codetu")) { } else if ((arg.length() >= 2 && arg.substring(0, 2).equals("-j"))
|| arg.equals("--clear-is-codetu")) {
int shift = 1; int shift = 1;
if (arg.equals("-j") || arg.equals("--clear-is-codetu")) { if (arg.equals("-j") || arg.equals("--clear-is-codetu")) {
if (args.length > i + 1) { if (args.length > i + 1) {
@ -4931,7 +4958,8 @@ public class upassword {
} else if (arg.equals("-d") || arg.equals("--aes-decrypt")) { } else if (arg.equals("-d") || arg.equals("--aes-decrypt")) {
action = EAction.AES_DECRYPT; action = EAction.AES_DECRYPT;
i++; i++;
} else if (arg.substring(0, 2).equals("-f") || arg.equals("--aes-keyfile")) { } else if ((arg.length() >= 2 && arg.substring(0, 2).equals("-f"))
|| arg.equals("--aes-keyfile")) {
int shift = 1; int shift = 1;
if (arg.equals("-f") || arg.equals("--aes-keyfile")) { if (arg.equals("-f") || arg.equals("--aes-keyfile")) {
if (args.length > i + 1) { if (args.length > i + 1) {
@ -5171,10 +5199,15 @@ public class upassword {
while (true) { while (true) {
String line = br.readLine(); String line = br.readLine();
if (line == null) break; if (line == null) break;
if (line.startsWith(AFTER_COMMAND)) { if (line.startsWith("#")) {
// Ignorer
} else if (line.startsWith(AFTER_COMMAND)) {
after = line.substring(AFTER_COMMAND_STRIP); after = line.substring(AFTER_COMMAND_STRIP);
} else { } else {
upassword.run(SPACES.split(line)); line = line.trim();
if (line.equals("")) args = new String[0];
else args = SPACES.split(line);
upassword.run(args);
if (after != null) println(after); if (after != null) println(after);
} }
} }

View File

@ -236,6 +236,18 @@ OPTIONS
$USCRONTAB_USERDIR $USCRONTAB_USERDIR
-n, --fake -n, --fake
Afficher au lieu de les exécuter les commandes qui doivent être lancées Afficher au lieu de les exécuter les commandes qui doivent être lancées
-P, --pause-for NBMINS
Désactiver les planifications pendant NBMINS minutes. Utiliser -1 pour
désactiver les planifications sans limite de durée. Pendant la période
de pause, toutes les invocations de uscrontab n'ont aucun effet, sauf si
on utilise l'option --force
-Y, --unpause
Réactiver les planifications après une mise en pause
-p, --pause
Désactiver les planifications pendant 1 journée. Equivalent à -P 1440
-f, --force
Forcer l'exécution de la planification, même si elle a été mise en pause
avec l'option --pause
OPTIONS AVANCEES OPTIONS AVANCEES
--lock LOCKFILE --lock LOCKFILE
@ -298,6 +310,21 @@ function get_usercrontab() {
fi fi
} }
function check_pause() {
# retourner 0 si on est en pause
local pauseuntil pausefile="$pausefile" now="$2"
if [ -f "$pausefile" ]; then
pauseuntil="$(<"$pausefile")"
if [ -z "$pauseuntil" ]; then
# pause sans limitation de durée
return 0
elif [ "$pauseuntil" -gt "$now" ]; then
return 0
fi
fi
return 1
}
USCRONTAB_CTLINE="* * * * * $script" USCRONTAB_CTLINE="* * * * * $script"
USCRONTAB_LOCKDELAY=8 USCRONTAB_LOCKDELAY=8
USCRONTAB_STOPEC=101 USCRONTAB_STOPEC=101
@ -312,6 +339,8 @@ lockfile=auto
lockdelay= lockdelay=
fake= fake=
continuous= continuous=
pause=
force=
parse_opts "${PRETTYOPTS[@]}" \ parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \ --help '$exit_with display_help' \
-A,--add,--install action=install \ -A,--add,--install action=install \
@ -322,6 +351,10 @@ parse_opts "${PRETTYOPTS[@]}" \
-r,--remove action=remove \ -r,--remove action=remove \
-l,--list action=list \ -l,--list action=list \
-n,--fake fake=1 \ -n,--fake fake=1 \
-P:,--pause-for: '$action=pause; set@ pause' \
-p,--pause action=pause \
-Y,--unpause action=unpause \
-f,--force force=1 \
--lock: lockfile= \ --lock: lockfile= \
--lockdelay: lockdelay= \ --lockdelay: lockdelay= \
-c,--continuous continuous=1 \ -c,--continuous continuous=1 \
@ -332,7 +365,28 @@ parse_opts "${PRETTYOPTS[@]}" \
uscrontab="$1"; shift uscrontab="$1"; shift
if [ "$action" == "edit" ]; then pausefile="$USCRONTAB_USERFILE.pauseuntil"
now="$(awk 'BEGIN { print int(systime() / 60) * 60 }')"
if [ "$action" == "pause" ]; then
[ -n "$pause" ] || pause=1440
if [ "$pause" -lt 0 ]; then
pauseuntil=
else
pauseuntil=$(($now + $pause * 60))
fi
echo "$pauseuntil" >"$pausefile" || die
enote "Désactivation des planifications pour $pause minute(s)"
exit 0
elif [ "$action" == "unpause" ]; then
if [ -f "$pausefile" ]; then
rm "$pausefile" || die
enote "Réactivation des planifications"
fi
exit 0
elif [ "$action" == "edit" ]; then
if [ -z "$uscrontab" ]; then if [ -z "$uscrontab" ]; then
basedir="$(dirname "$USCRONTAB_USERFILE")" basedir="$(dirname "$USCRONTAB_USERFILE")"
[ -d "$basedir" ] || die "$basedir: ce répertoire n'existe pas. Vérifiez l'installation de nutools" [ -d "$basedir" ] || die "$basedir: ce répertoire n'existe pas. Vérifiez l'installation de nutools"
@ -375,6 +429,10 @@ elif [ "$action" == "remove" ]; then
exit 0 exit 0
elif [ "$action" == "list" ]; then elif [ "$action" == "list" ]; then
if check_pause "$pausefile" "$now"; then
ewarn "En pause. Réactiver avec $scriptname -Y"
fi
if [ -n "$uscrontab" ]; then if [ -n "$uscrontab" ]; then
uscrontab="$(abspath "$uscrontab")" uscrontab="$(abspath "$uscrontab")"
array_from_lines ctfiles "$(crontab -l 2>/dev/null | awkrun script="$script" uscrontab="$uscrontab" '$6 == script && $7 == uscrontab { print $7 }')" array_from_lines ctfiles "$(crontab -l 2>/dev/null | awkrun script="$script" uscrontab="$uscrontab" '$6 == script && $7 == uscrontab { print $7 }')"
@ -394,9 +452,9 @@ elif [ "$action" == "list" ]; then
array_del ctfiles "#GENERIC" array_del ctfiles "#GENERIC"
set_usercrontabs usercrontabs set_usercrontabs usercrontabs
array_extend ctfiles usercrontabs array_extend ctfiles usercrontabs
ewarn "planification générique désactivée. Vous pouvez la réactiver avec $scriptname -A" ewarn "Planification générique désactivée. Vous pouvez la réactiver avec $scriptname -A"
elif [ ${#ctfiles[*]} -eq 0 ]; then elif [ ${#ctfiles[*]} -eq 0 ]; then
einfo "aucune planification en cours" einfo "Aucune planification en cours"
set_usercrontabs ctfiles set_usercrontabs ctfiles
fi fi
fi fi
@ -410,7 +468,7 @@ elif [ "$action" == "list" ]; then
exit $r exit $r
elif [ "$action" == "show-ctnow" ]; then elif [ "$action" == "show-ctnow" ]; then
ctnow ctnow "$now"
exit 0 exit 0
fi fi
@ -432,6 +490,17 @@ elif [ "$action" == "uninstall" ]; then
fi fi
elif [ "$action" == "run" ]; then elif [ "$action" == "run" ]; then
if [ -n "$force" ]; then
# ne pas tenir compte de l'état de pause
:
elif check_pause "$pausefile" "$now"; then
ewarn "En pause. Réactiver avec $scriptname -Y"
ac_clean "$lockfile"
exit 0
elif [ -f "$pausefile" ]; then
rm "$pausefile"
fi
if [ -n "$uscrontab" ]; then if [ -n "$uscrontab" ]; then
default_lockfile="/var/run/$scriptname$uscrontab.lock" default_lockfile="/var/run/$scriptname$uscrontab.lock"
else else