Intégration de la branche release-4.2.0

This commit is contained in:
Jephté Clain 2016-04-06 14:25:45 +04:00
commit a3b241962d
10 changed files with 212 additions and 12 deletions

View File

@ -1,3 +1,12 @@
## Version 4.2.0 du 06/04/2016-14:25
a710c5a Intégration de la branche stdout
ba969e3 ajout de stdredir pour pallier l'absence éventuelle de /dev/std*
472f2c7 Intégration de la branche sysinfos
1864cdf fonctions pour faciliter la gestion des dépendances sous debian
2c27f03 uproject: ajouter la commande xconfig-export
ed3de6d umail: ajout de l'option --gencmd
## Version 4.1.1 du 08/03/2016-12:04 ## Version 4.1.1 du 08/03/2016-12:04
0bd2b1f correction de bugs avec apacheconfig 0bd2b1f correction de bugs avec apacheconfig

View File

@ -1 +1 @@
4.1.1 4.2.0

View File

@ -27,13 +27,25 @@ OPTIONS
Corps du mail. Il est spécifié sur l'entrée standard. Corps du mail. Il est spécifié sur l'entrée standard.
-f, --body FILE -f, --body FILE
Spécifier un fichier qui contient le corps du message, au lieu de lire Spécifier un fichier qui contient le corps du message, au lieu de lire
sur l'entrée standard.""" sur l'entrée standard.
--gencmd
Afficher la commande complète avec sendmail et l'option -f. En effet, la
commande donnée en exemple dans la section USAGE utilise une valeur par
défaut pour l'en-tête From: de l'enveloppe. Pour certains serveurs SMTP
qui requièrent que le From: de l'enveloppe corresponde à un domaine
valide, il faut forcer la valeur avec l'option -f de sendmail:
%(scriptname)s [-F FROM] ... | sendmail -t -i -f FROM
L'option --gencmd affiche une commande complète qu'il suffit d'évaluer,
e.g:
sendmail -t -i -f FROM <<EOF
...
EOF"""
DEFAULT_FROM = 'no-reply@univ-reunion.fr' DEFAULT_FROM = 'no-reply@univ-reunion.fr'
import i_need_py25 # nécessite module email version 4.0 import i_need_py25 # nécessite module email version 4.0
import os, sys, mimetypes import os, sys, mimetypes, re
from os import path from os import path
from email import encoders from email import encoders
@ -47,6 +59,12 @@ from email.generator import Generator
from ulib.all import * from ulib.all import *
RE_UNSAFE_SH = re.compile(r'[^a-zA-Z0-9_^@%+=:,./-]')
def quotesh(s):
if not s: return "''"
if RE_UNSAFE_SH.search(s) is None: return s
return "'%s'" % s.replace("'", "'\\''")
def display_help(): def display_help():
uprint(__doc__ % globals()) uprint(__doc__ % globals())
@ -59,6 +77,7 @@ def run_umail():
('a:', 'attach=', "Attacher un fichier"), ('a:', 'attach=', "Attacher un fichier"),
('t:', 'content-type=', "Spécifier le type de contenu du fichier"), ('t:', 'content-type=', "Spécifier le type de contenu du fichier"),
('f:', 'body=', "Spécifier un fichier contenant le corps du message"), ('f:', 'body=', "Spécifier un fichier contenant le corps du message"),
(None, 'gencmd', "Générer une commande à évaluer pour envoyer le mail"),
]) ])
options, args = get_args(None, options, longoptions) options, args = get_args(None, options, longoptions)
mfrom = DEFAULT_FROM mfrom = DEFAULT_FROM
@ -70,6 +89,7 @@ def run_umail():
bodyfile = None bodyfile = None
afiles = [] afiles = []
amimetypes = [] amimetypes = []
gencmd = False
for option, value in options: for option, value in options:
if option in ('-h', '--help'): if option in ('-h', '--help'):
display_help() display_help()
@ -90,6 +110,8 @@ def run_umail():
bodyfile = None bodyfile = None
elif not path.exists(bodyfile): elif not path.exists(bodyfile):
die("%s: fichier introuvable" % bodyfile) die("%s: fichier introuvable" % bodyfile)
elif option in ('--gencmd',):
gencmd = True
if not args[0:1]: die("Vous devez spécifier le sujet") if not args[0:1]: die("Vous devez spécifier le sujet")
subject = args[0] subject = args[0]
@ -169,7 +191,9 @@ def run_umail():
if mbccs: msg['Bcc'] = ', '.join(mbccs) if mbccs: msg['Bcc'] = ', '.join(mbccs)
msg['Subject'] = Header(subject, 'utf-8') msg['Subject'] = Header(subject, 'utf-8')
if gencmd: print "sendmail -i -t -f %s <<EOF" % quotesh(mfrom)
Generator(sys.stdout).flatten(msg) Generator(sys.stdout).flatten(msg)
if gencmd: print "EOF"
if __name__ == '__main__': if __name__ == '__main__':
run_umail() run_umail()

View File

@ -1 +1 @@
012000001 012001000

View File

@ -1731,7 +1731,7 @@ parse_headers && do_once("parse-headers") {
# résultat # résultat
[ -n "$output" ] || output=/dev/stdout [ -n "$output" ] || output=/dev/stdout
<"$tmpsorted" >"$output" awkrun -f \ stdredir "$tmpsorted" "$output" "" awkrun -f \
padlen:int="$padlen" \ padlen:int="$padlen" \
headerscsv="$headers" show_headers:int="$show_headers" \ headerscsv="$headers" show_headers:int="$show_headers" \
' '
@ -1916,7 +1916,7 @@ function lprintcsv() {
[ -n "$output" ] || output=/dev/stdout [ -n "$output" ] || output=/dev/stdout
values=("$@") values=("$@")
awkrun -f >>"$output" fields[@] show_headers:int="$show_headers" values[@] ' stdredir "" ">>$output" "" awkrun -f fields[@] show_headers:int="$show_headers" values[@] '
BEGIN { BEGIN {
if (show_headers) array_printcsv(fields) if (show_headers) array_printcsv(fields)
if (fields_count > 0) count = fields_count if (fields_count > 0) count = fields_count

View File

@ -2742,6 +2742,53 @@ function utools_local() {
done done
} }
function stdredir() {
# Lancer la commande $4..@ en redirigeant stdin depuis $1, stdout vers $2,
# stderr vers $3. Si $1 est vide ou vaut /dev/stdin, la redirection n'est
# pas faite. Si $2 est vide ou vaut /dev/stdout, la redirection n'est pas
# faite. Si $3 est vide ou vaut /dev/stderr, la redirection n'est pas faite.
# Cette fonction existe parce que sur certaines versions de bash, il semble
# que les redirections /dev/std* ne sont pas traitées de façon particulière.
# De plus, sur des technologies telles que OpenVZ, les chemins /dev/std* ne
# sont pas créés (parce que /proc/self/fd/* n'est pas accessible). Donc,
# dans de rares cas où le script tourne sur OpenVZ avec une version de bash
# qui est buggée, la redirection n'est pas faite correctement.
local __redirs __in __out __err
if [ -n "$1" -o "$1" == /dev/stdin ]; then
if [ "${1#<}" != "$1" ]; then
__in="${1#<}"
else
__in="$1"
fi
__redirs="$__redirs"' <"$__in"'
fi; shift
if [ -n "$1" -o "$1" == /dev/stdout ]; then
if [ "${1#>>}" != "$1" ]; then
__out="${1#>>}"
__redirs="$__redirs"' >>"$__out"'
elif [ "${1#>}" != "$1" ]; then
__out="${1#>}"
__redirs="$__redirs"' >"$__out"'
else
__out="$1"
__redirs="$__redirs"' >"$__out"'
fi
fi; shift
if [ -n "$1" -o "$1" == /dev/stderr ]; then
if [ "${1#>>}" != "$1" ]; then
__err="${1#>>}"
__redirs="$__redirs"' 2>>"$__err"'
elif [ "${1#>}" != "$1" ]; then
__err="${1#>}"
__redirs="$__redirs"' 2>"$__err"'
else
__err="$1"
__redirs="$__redirs"' 2>"$__err"'
fi
fi; shift
eval '"$@"'"$__redirs"
}
function isatty() { function isatty() {
# tester si STDOUT n'est pas une redirection # tester si STDOUT n'est pas une redirection
tty -s <&1 tty -s <&1

View File

@ -50,6 +50,15 @@ function pkg_installm() {
fi fi
} }
function pkg_check_install() {
# Si le programme $1 n'existe pas, alors installer les packages $2..$@
# S'il n'y a pas d'arguments $2..$@ utiliser $1 comme nom de package
# Retourner 0 si au moins un des packages a été installé
progexists "$1" && return 1
[ $# -gt 1 ] && shift
pkg_installm "$@"
}
################################################################################ ################################################################################
# Gestion des services # Gestion des services

View File

@ -479,3 +479,69 @@ function check_sysinfos() {
done done
return $r_ return $r_
} }
# fonctions de support pour tester certaines versions de debian
# utilisation:
# on_debian
# if on_jessie; then
# elif on_wheezy; then
# elif on_squeeze; then
# else
# fi
# OU:
# on_debian:
# on_jessie xxx
# on_wheezy yyy
# on_squeeze zzz
# on_default ttt
# Sans arguments, on_{jessie,wheezy,squeeze} teste si on sur la version demandée
# OU SUPERIEURE. Avec un argument, la version EXACTE est testée, et la commande
# est lancée en cas de correspondance
function on_debian() {
NUTOOLS_ON_DEBIAN=
if check_sysinfos -d debian; then
urequire debian
NUTOOLS_ON_DEBIAN=1
return 0
else
return 1
fi
}
function on_debian:() { on_debian "$@"; }
function __on_debian() {
[ -z "$NUTOOLS_ON_DEBIAN" -o "$NUTOOLS_ON_DEBIAN" != 1 ] && return 1
local sysver="$1"; shift
if [ $# -gt 0 ]; then
if check_sysinfos -d debian -v "$sysver"; then
NUTOOLS_ON_DEBIAN="$sysver"
"$@"
return 0
else
return 1
fi
else
if check_sysinfos -d debian -v "$sysver+"; then
NUTOOLS_ON_DEBIAN="$sysver"
return 0
fi
fi
}
function on_stretch() { __on_debian stretch "$@"; }
function on_jessie() { __on_debian jessie "$@"; }
function on_wheezy() { __on_debian wheezy "$@"; }
function on_squeeze() { __on_debian squeeze "$@"; }
function on_default() {
if [ "$NUTOOLS_ON_DEBIAN" == 1 ]; then
if [ $# -gt 0 ]; then
"$@"
return 0
else
return 0
fi
elif [ -n "$NUTOOLS_ON_DEBIAN" ]; then
return 1
fi
#XXX ici, on peut ajouter le code de support pour d'autres systèmes
return 1
}

View File

@ -96,6 +96,11 @@ COMMANDS
Sur un dépôt fraichement cloné, initialiser le dépôt avec 'annex init' Sur un dépôt fraichement cloné, initialiser le dépôt avec 'annex init'
s'il contient des fichiers annexés. Récupérer aussi ces fichiers avec s'il contient des fichiers annexés. Récupérer aussi ces fichiers avec
'annex get' 'annex get'
xconfig-export [dir]
Installer des hooks pour qu'un dépôt puisse être utilisé pour servir des
fichiers, par exemple avec un serveur web. Plus précisément, un hook
post-receive est créé avec la commande 'git annex merge', et un hook
post-update est créé avec la commande 'git update-server-info'
printml [-t TYPE] printml [-t TYPE]
Afficher le modeline pour un fichier du type spécifié Afficher le modeline pour un fichier du type spécifié
@ -153,6 +158,7 @@ CMD_ALIASES=(
xs:xsync xs:xsync
xw:xwhereis xw:xwhereis
xwa:xwebapp xwa:xwebapp
xce:xconfig-export
gr:grep gr:grep
) )
DEFAULT_CMD=status DEFAULT_CMD=status
@ -293,6 +299,49 @@ elif [ "$CMD" == crone ]; then
git clone "$userhost:$path" "$destdir" || die git clone "$userhost:$path" "$destdir" || die
git_annex_initial "$destdir" || die git_annex_initial "$destdir" || die
elif [ "$CMD" == xconfig-export ]; then
unset GIT_DIR; unset GIT_WORK_TREE
dir="${1:-.}"
[ -d "$dir" ] || die "$dir: répertoire introuvable"
setx dir=abspath "$dir"
setx repodir=ppath "$dir"
cd "$dir"
git rev-parse 2>/dev/null || die "$repodir: n'est pas un dépôt git"
[ -n "$(git config --get annex.uuid)" ] || die "$repodir: n'est pas un dépôt git-annex"
cd "$(__vcs_find_root "$dir")"
[ -d .git ] || die "$repodir: est un dépôt nu"
prhook=.git/hooks/post-receive
prscript='if [ -n "$GIT_DIR" ]; then cd "$GIT_DIR"; cd ..; unset GIT_DIR; fi
git annex merge'
puhook=.git/hooks/post-update
puscript='git update-server-info'
if [ -f "$prhook" ]; then
ewarn "Le fichier $prhook existe déjà dans $repodir
Vérifiez qu'il contient les commandes suivantes:
--------8<--------
$prscript
--------8<--------"
else
estep "post-receive"
echo "#!/bin/bash
$prscript" >"$prhook"
chmod +x "$prhook"
fi
if [ -f "$puhook" ]; then
ewarn "Le fichier $puhook existe déjà dans $repodir
Vérifiez qu'il contient les commandes suivantes:
--------8<--------
$puscript
--------8<--------"
else
estep "post-update"
echo "#!/bin/bash
$puscript" >"$puhook"
chmod +x "$puhook"
fi
elif array_contains PY_CMDS "$CMD"; then elif array_contains PY_CMDS "$CMD"; then
exec "$scriptdir/lib/pywrapper" uproject.py "$CMD" "$@" exec "$scriptdir/lib/pywrapper" uproject.py "$CMD" "$@"

View File

@ -147,12 +147,8 @@ uspid="$base.uspid"
function __update_pending() { function __update_pending() {
touch "$podata" touch "$podata"
[ "$datafile" == "-" ] && datafile=/dev/stdin [ "$datafile" == "-" ] && datafile=/dev/stdin
if [ -n "$datafile" ]; then [ -n "$datafile" ] && stdredir "$datafile" ">>$podata" "" cat
cat "$datafile" >>"$podata" [ -n "$data" ] && echo "$data" >>"$podata"
fi
if [ -n "$data" ]; then
echo "$data" >>"$podata"
fi
} }
function __run_command() { ( function __run_command() { (