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
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.
-f, --body FILE
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'
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 email import encoders
@ -47,6 +59,12 @@ from email.generator import Generator
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():
uprint(__doc__ % globals())
@ -59,6 +77,7 @@ def run_umail():
('a:', 'attach=', "Attacher un fichier"),
('t:', 'content-type=', "Spécifier le type de contenu du fichier"),
('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)
mfrom = DEFAULT_FROM
@ -70,6 +89,7 @@ def run_umail():
bodyfile = None
afiles = []
amimetypes = []
gencmd = False
for option, value in options:
if option in ('-h', '--help'):
display_help()
@ -90,6 +110,8 @@ def run_umail():
bodyfile = None
elif not path.exists(bodyfile):
die("%s: fichier introuvable" % bodyfile)
elif option in ('--gencmd',):
gencmd = True
if not args[0:1]: die("Vous devez spécifier le sujet")
subject = args[0]
@ -169,7 +191,9 @@ def run_umail():
if mbccs: msg['Bcc'] = ', '.join(mbccs)
msg['Subject'] = Header(subject, 'utf-8')
if gencmd: print "sendmail -i -t -f %s <<EOF" % quotesh(mfrom)
Generator(sys.stdout).flatten(msg)
if gencmd: print "EOF"
if __name__ == '__main__':
run_umail()

View File

@ -1 +1 @@
012000001
012001000

View File

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

View File

@ -2742,6 +2742,53 @@ function utools_local() {
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() {
# tester si STDOUT n'est pas une redirection
tty -s <&1

View File

@ -50,6 +50,15 @@ function pkg_installm() {
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

View File

@ -479,3 +479,69 @@ function check_sysinfos() {
done
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'
s'il contient des fichiers annexés. Récupérer aussi ces fichiers avec
'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]
Afficher le modeline pour un fichier du type spécifié
@ -153,6 +158,7 @@ CMD_ALIASES=(
xs:xsync
xw:xwhereis
xwa:xwebapp
xce:xconfig-export
gr:grep
)
DEFAULT_CMD=status
@ -293,6 +299,49 @@ elif [ "$CMD" == crone ]; then
git clone "$userhost:$path" "$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
exec "$scriptdir/lib/pywrapper" uproject.py "$CMD" "$@"

View File

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