Intégration de la branche release-4.2.0
This commit is contained in:
commit
a3b241962d
|
@ -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
|
||||
|
|
|
@ -1 +1 @@
|
|||
4.1.1
|
||||
4.2.0
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -1 +1 @@
|
|||
012000001
|
||||
012001000
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
49
uproject
49
uproject
|
@ -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" "$@"
|
||||
|
||||
|
|
8
utrigger
8
utrigger
|
@ -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() { (
|
||||
|
|
Loading…
Reference in New Issue