Intégration de la branche release-7.3.0
This commit is contained in:
commit
ab69916d2b
16
CHANGES.md
16
CHANGES.md
|
@ -1,3 +1,19 @@
|
|||
## Version 7.3.0 du 19/10/2017-12:12
|
||||
|
||||
* `72d7d15` maj version ulib
|
||||
* `9fb19b4` ulib/multiconf: améliorer conf_install()
|
||||
* `6c3ae24` openurl: supprimer la sortie erreur pour cacher les warnings GTK
|
||||
* `528a281` em: supprimer la sortie d'erreur par défaut. rendre configurable la géométrie
|
||||
* `489b31d` moiso: améliorer l'ergonomie pour le démontage
|
||||
* `7bd0a95` ufile: support des pattern regex
|
||||
* `6130c2f` chrono.py: 0 est équivalent à la chaine vide
|
||||
* `9c5b46b` pyulib: ajouter ShConfig
|
||||
* `f31f5f7` corriger un problème de compilation sur OL6
|
||||
* `ab8ede8` awk: support du format dd/mm/yy
|
||||
* `312c7dc` ajouter des fonctions pour simplifier le check de la version de l'os et l'installation de paquets
|
||||
* `5bf55e5` bug
|
||||
* `b6ff411` maj doc uscrontab
|
||||
|
||||
## Version 7.2.0 du 26/09/2017-17:01
|
||||
|
||||
* `1e576da` multiconf: rajouter conf_upgrade() dans conf_auto()
|
||||
|
|
|
@ -1 +1 @@
|
|||
7.2.0
|
||||
7.3.0
|
||||
|
|
|
@ -32,6 +32,12 @@ def playSound(name=None):
|
|||
|
||||
def isnum(i):
|
||||
return type(i) in (IntType, LongType)
|
||||
RE_NUM = re.compile(r'\d+$')
|
||||
def numof(s):
|
||||
if isnum(s): return s
|
||||
elif s is None: return None
|
||||
elif RE_NUM.match(str(s)) is not None: return int(str(s))
|
||||
else: return s
|
||||
|
||||
DEFAULT_TIMEOUT = '5'
|
||||
|
||||
|
@ -99,11 +105,13 @@ class Chrono:
|
|||
return Timedelta(seconds=timeout)
|
||||
|
||||
def set_timeout(self, timeout=None):
|
||||
if timeout == '': timeout = None
|
||||
if timeout is not None and not isnum(timeout):
|
||||
tmp = parse_desthour(str(timeout))
|
||||
if tmp is None: tmp = parse_timeout(timeout)
|
||||
if tmp is None: tmp = int(timeout) * 60
|
||||
timeout = tmp
|
||||
if timeout == 0: timeout = None
|
||||
self.timeout = timeout
|
||||
if timeout is None: self.initial = '00:00'
|
||||
else: self.initial = self.__format(self.__delta(timeout))
|
||||
|
@ -334,7 +342,6 @@ d'arrivée, et que la durée est calculée automatiquement""")
|
|||
|
||||
timeout = o.timeout
|
||||
if timeout is None: timeout = DEFAULT_TIMEOUT
|
||||
elif timeout == '': timeout = None
|
||||
o.timeout = timeout
|
||||
|
||||
run_chronometre(o.timeout, o.autostart)
|
||||
|
|
10
em
10
em
|
@ -1,13 +1,19 @@
|
|||
#!/bin/bash
|
||||
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
||||
|
||||
EMACS_GEOMETRY=150x50+0+67
|
||||
: "${EM_GEOMETRY:=150x50+0+67}" "${EM_STDERR:=}"
|
||||
|
||||
# Essayer avec emacs
|
||||
emacs="$(which emacs 2>/dev/null)"
|
||||
if [ -x "$emacs" ]; then
|
||||
if [ -n "$DISPLAY" ]; then
|
||||
exec "$emacs" -g "$EMACS_GEOMETRY" "$@" &
|
||||
if [ -n "$EM_STDERR" ]; then
|
||||
# ne pas supprimer la sortie erreur
|
||||
exec "$emacs" -g "$EM_GEOMETRY" "$@" &
|
||||
else
|
||||
# supprimer la sortie d'erreur. les warnings de GTK sont horripilants
|
||||
exec "$emacs" -g "$EM_GEOMETRY" "$@" 2>/dev/null &
|
||||
fi
|
||||
exit 0
|
||||
else
|
||||
exec "$emacs" -nw "$@"
|
||||
|
|
|
@ -11,14 +11,18 @@ value peut être placé entre double quotes ou simple quotes. Elle peut s'étend
|
|||
plusieurs lignes si elle est mise entre quotes, ou si elle se termine par \
|
||||
"""
|
||||
|
||||
__all__ = ('ConfigFile', 'ShConfigFile', 'PListFile')
|
||||
__all__ = (
|
||||
'ConfigFile', 'ShConfigFile', 'PListFile',
|
||||
'ShConfig',
|
||||
)
|
||||
|
||||
import os, string, re, types
|
||||
import os, string, re, types, shlex
|
||||
from os import path
|
||||
|
||||
from base import make_prop, isseq, seqof, firstof
|
||||
from base import odict, make_prop, isseq, seqof, firstof
|
||||
from uio import _s, _u
|
||||
from files import TextFile
|
||||
from ulib.formats import unicodeF
|
||||
|
||||
####################
|
||||
# gestion des commentaires
|
||||
|
@ -806,6 +810,68 @@ class PListFile(TextFile):
|
|||
_print_debug("XXX string=%s" % string)
|
||||
return string
|
||||
|
||||
################################################################################
|
||||
# classes utilisant shlex et l'interface odict
|
||||
|
||||
class ShConfig(odict):
|
||||
_formats = None
|
||||
def __init__(self, config, formats=None):
|
||||
super(ShConfig, self).__init__()
|
||||
if formats is None: formats = {}
|
||||
else: formats = dict(formats)
|
||||
self.__dict__['_formats'] = formats
|
||||
for name in self._formats.keys():
|
||||
self[name] = None
|
||||
|
||||
inf = open(config, 'rb')
|
||||
try: s = inf.read()
|
||||
finally: inf.close()
|
||||
parts = shlex.split(s, True)
|
||||
self.parse(parts)
|
||||
|
||||
def get_format(self, name):
|
||||
format = None
|
||||
if format is None: format = self._formats.get(name, None)
|
||||
if format is None: format = self._formats.get(None, None)
|
||||
if format is None: format = unicodeF
|
||||
return format
|
||||
|
||||
RE_ARRAY = re.compile(r'([^=]+)=\((.*)')
|
||||
RE_ARRAY_LAST = re.compile(r'(.*)\)$')
|
||||
RE_SCALAR = re.compile(r'([^=]+)=(.*)')
|
||||
def parse(self, parts):
|
||||
i = 0
|
||||
while i < len(parts):
|
||||
part = parts[i]
|
||||
i += 1
|
||||
amo = self.RE_ARRAY.match(part)
|
||||
smo = self.RE_SCALAR.match(part)
|
||||
if amo is not None:
|
||||
array = []
|
||||
name, value = amo.groups()
|
||||
format = self.get_format(name)
|
||||
if value != '': array.append(format.parse(value))
|
||||
while i < len(parts):
|
||||
value = parts[i]
|
||||
i += 1
|
||||
mo = self.RE_ARRAY_LAST.match(value)
|
||||
if mo is not None:
|
||||
value = mo.group(1)
|
||||
if value != '': array.append(format.parse(value))
|
||||
break
|
||||
else:
|
||||
array.append(format.parse(value))
|
||||
self[name] = array
|
||||
elif smo is not None:
|
||||
name, value = smo.groups()
|
||||
format = self.get_format(name)
|
||||
self[name] = format.parse(value)
|
||||
else:
|
||||
continue # ignorer l'erreur pour le moment
|
||||
raise ValueError("%s: not a variable" % part)
|
||||
|
||||
################################################################################
|
||||
|
||||
if __name__ == '__main__':
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
|
|
@ -19,9 +19,9 @@
|
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <unistd.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/user.h>
|
||||
#include <unistd.h>
|
||||
|
||||
enum child_state {
|
||||
ptrace_detached = 0,
|
||||
|
|
|
@ -1 +1 @@
|
|||
015000000
|
||||
015001000
|
||||
|
|
|
@ -1883,6 +1883,12 @@ function __parse_date_fr(date, parts, y, m, d) {
|
|||
m = int(parts[2])
|
||||
d = int(parts[1])
|
||||
return mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d))
|
||||
} else if (match(date, /([0-9][0-9]?)\/([0-9][0-9]?)\/([0-9][0-9])/, parts)) {
|
||||
basey = int(strftime("%Y")); basey = basey - basey % 100
|
||||
y = basey + int(parts[3])
|
||||
m = int(parts[2])
|
||||
d = int(parts[1])
|
||||
return mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d))
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
|
|
@ -60,6 +60,17 @@ function pkg_check_install() {
|
|||
pkg_installm "$@"
|
||||
}
|
||||
|
||||
function require_pkgs() {
|
||||
# installer les packages spécifiés silencieusement et sans confirmation.
|
||||
# si les packages n'existent pas ou ne peuvent pas être installé, c'est une
|
||||
# erreur fatale.
|
||||
if ! pkg_check "$@"; then
|
||||
# essayer d'installer les packages
|
||||
enote "Installation de packages $*"
|
||||
pkg_install "$@" || die
|
||||
fi
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Gestion des services
|
||||
|
||||
|
|
|
@ -24,8 +24,8 @@ function conf_auto() {
|
|||
# conf_auto NAME
|
||||
# est équivalent à:
|
||||
# conf_init VARS...
|
||||
# conf_find_files __CONF_FILES ~/etc/default/NAME.conf ~/etc/NAME.d/*.conf
|
||||
# conf_upgrade ~/etc/default/NAME.conf
|
||||
# conf_find_files __CONF_FILES ~/etc/default/NAME ~/etc/NAME.d/*.conf
|
||||
# conf_upgrade ~/etc/default/NAME
|
||||
# conf_load_files "${__CONF_FILES[@]}"
|
||||
# Pour supporter les scénarii où les fichiers de configuration sont ailleurs
|
||||
# que dans ~/etc/default, l'argument NAME peut être un chemin:
|
||||
|
@ -43,8 +43,8 @@ function conf_auto() {
|
|||
conf_find_files __CONFS_FILES "$__name.conf" "$__name.d/*.conf"
|
||||
[ $# -gt 0 ] && conf_upgrade "$__name.conf"
|
||||
else
|
||||
conf_find_files __CONFS_FILES "$HOME/etc/default/$__name.conf" "$HOME/etc/$__name.d/*.conf"
|
||||
[ $# -gt 0 ] && conf_upgrade "$HOME/etc/default/$__name.conf"
|
||||
conf_find_files __CONFS_FILES "$HOME/etc/default/$__name" "$HOME/etc/$__name.d/*.conf"
|
||||
[ $# -gt 0 ] && conf_upgrade "$HOME/etc/default/$__name"
|
||||
fi
|
||||
conf_load_files "${__CONFS_FILES[@]}"
|
||||
}
|
||||
|
@ -240,8 +240,9 @@ function conf_load_files() {
|
|||
}
|
||||
|
||||
function conf_install() {
|
||||
# USAGE: conf_install DEST SRCS...
|
||||
# installer les fichiers de SRCS dans le répertoire standardisé DEST
|
||||
# USAGE: conf_install DEST PREFIX SRCS...
|
||||
# installer les fichiers de SRCS dans le répertoire standardisé DEST avec le
|
||||
# préfixe PREFIX
|
||||
# ## destination
|
||||
# - si DEST est un nom sans chemin, e.g NAME, alors la destination est
|
||||
# ~/etc/NAME.d
|
||||
|
@ -253,24 +254,43 @@ function conf_install() {
|
|||
# - si SRC est un fichier, le prendre tel quel
|
||||
# - si SRC est un répertoire, prendre tous les fichiers SRC/*.conf
|
||||
# - si SRC est un pattern, prendre tous les fichiers correspondant
|
||||
local -a srcs
|
||||
# s'il n'y a qu'une seule source, la destination sera DEST/PREFIX.conf
|
||||
# sinon, la destination sera DEST/PREFIX-SRCNAME où SRCNAME est le nom du
|
||||
# fichier source
|
||||
# si PREFIX est vide, alors les fichiers sont copiés avec leur nom sans
|
||||
# modification.
|
||||
local -a tmpsrcs srcs
|
||||
local src dir wc
|
||||
local dest="$1"; shift
|
||||
local prefix="$1"; shift
|
||||
[[ "$dest" == */* ]] || dest="$HOME/etc/$dest.d"
|
||||
mkdir -p "$dest" || return 1
|
||||
for src in "$@"; do
|
||||
if [ -f "$src" ]; then
|
||||
srcs=("$src")
|
||||
array_add srcs "$src"
|
||||
elif [ -d "$src" ]; then
|
||||
array_lsfiles srcs "$src" "*.conf"
|
||||
array_lsfiles tmpsrcs "$src" "*.conf"
|
||||
array_extend srcs tmpsrcs
|
||||
else
|
||||
splitwcs "$src" dir wc
|
||||
array_lsfiles srcs "$dir" "$wc"
|
||||
array_lsfiles tmpsrcs "$dir" "$wc"
|
||||
array_extend srcs tmpsrcs
|
||||
fi
|
||||
done
|
||||
[ ${#srcs[*]} -gt 0 ] || return 0
|
||||
if [ -n "$prefix" ]; then
|
||||
if [ ${#srcs[*]} -eq 1 ]; then
|
||||
copy_update_ask -y "$src" "$dest/$prefix.conf"
|
||||
else
|
||||
for src in "${srcs[@]}"; do
|
||||
copy_update_ask -y "$src" "$dest/$prefix-$(basename -- "$srcname")"
|
||||
done
|
||||
fi
|
||||
else
|
||||
for src in "${srcs[@]}"; do
|
||||
copy_update_ask -y "$src" "$dest"
|
||||
done
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
function conf_upgrade() {
|
||||
|
|
|
@ -611,3 +611,28 @@ function on_default() {
|
|||
#XXX ici, on peut ajouter le code de support pour d'autres systèmes
|
||||
return 1
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Support uinst
|
||||
|
||||
function require_debian() {
|
||||
set -- -d debian "$@"
|
||||
if check_sysinfos "$@"; then
|
||||
urequire debian
|
||||
return 0
|
||||
fi
|
||||
local -a infos; local info
|
||||
for info in "$@"; do
|
||||
if ! [[ "$info" == -* ]]; then
|
||||
infos=("${infos[@]}" "$info")
|
||||
fi
|
||||
done
|
||||
local msg="Ce script n'est pas supporté sur $(get_sysinfos_desc)"
|
||||
[ -n "$*" ] && msg="$msg
|
||||
Il faut au moins l'un des systèmes suivants: ${infos[*]}"
|
||||
[ -n "$UINST" -a -n "$ABORT" ] && touch "$ABORT"
|
||||
die "$msg"
|
||||
}
|
||||
function require_stretch() {
|
||||
require_debian -v stretch+
|
||||
}
|
||||
|
|
1
moiso
1
moiso
|
@ -29,6 +29,7 @@ parse_opts "${PRETTYOPTS[@]}" \
|
|||
|
||||
image="$1"
|
||||
[ -n "$image" ] || die "Vous devez spécifier l'image iso à monter"
|
||||
[ -d "$image" -a -f "$image.iso" ] && image="$image.iso"
|
||||
[ -f "$image" ] || die "$image: fichier introuvable"
|
||||
image="$(abspath "$image")"
|
||||
|
||||
|
|
16
openurl
16
openurl
|
@ -3,6 +3,9 @@
|
|||
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
|
||||
urequire DEFAULTS
|
||||
|
||||
# faut-il supprimer la sortie erreur? les warnings de GTK sont horripilants.
|
||||
: "${OPENURL_STDERR:=}"
|
||||
|
||||
function display_help() {
|
||||
uecho "$scriptname: Ouvrir une URL dans un navigateur
|
||||
|
||||
|
@ -22,15 +25,20 @@ esac
|
|||
setx url="$scriptdir/caturl" "$1" || die
|
||||
|
||||
if progexists xdg-open; then
|
||||
if [ -n "$OPENURL_STDERR" ]; then
|
||||
exec xdg-open "$url"
|
||||
else
|
||||
exec xdg-open "$url" 2>/dev/null
|
||||
fi
|
||||
elif progexists gnome-open; then
|
||||
if [ -n "$OPENURL_STDERR" ]; then
|
||||
exec gnome-open "$url"
|
||||
else
|
||||
# si on est sur un MacOSX, essayer utiliser open
|
||||
urequire sysinfos
|
||||
if check_sysinfos -s macosx; then
|
||||
exec open "$url"
|
||||
exec gnome-open "$url" 2>/dev/null
|
||||
fi
|
||||
elif check_sysinfos -s macosx; then
|
||||
# si on est sur un MacOSX, utiliser open
|
||||
exec open "$url"
|
||||
fi
|
||||
|
||||
die "Impossible de trouver une méthode pour ouvrir l'url $url"
|
||||
|
|
|
@ -28,9 +28,9 @@ compilerArgs=-O2 -D_GNU_SOURCE -o $cacheDir/$executableFilename $cacheDir/$sourc
|
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
#include <unistd.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/user.h>
|
||||
#include <unistd.h>
|
||||
|
||||
enum child_state {
|
||||
ptrace_detached = 0,
|
||||
|
|
12
ufile
12
ufile
|
@ -12,7 +12,11 @@ Dans ce fichier, le tableau RULES contient des règles qui sont chacune de la
|
|||
forme pattern:destdir[:renamef]
|
||||
|
||||
- pattern est au format glob et identifie les fichiers auxquels s'applique la
|
||||
règle
|
||||
règle, sauf si la chaine commence par / auquel cas il s'agit d'une expression
|
||||
régulière reconnue par awk. Par exemple, les deux patterns suivants sont
|
||||
équivalents:
|
||||
[ab]cd*.pdf
|
||||
/[ab]cd.*\\\\.pdf\$
|
||||
- destdir est le répertoire de destination dans lequel classer le fichier
|
||||
- renamef est une fonction qui permet de supporter le renommage d'un fichier
|
||||
lors de son classement. Sa signature est 'renamef filename pf destdir' où
|
||||
|
@ -107,7 +111,7 @@ function __set_dest() {
|
|||
setx dest=abspath "$dest"
|
||||
else
|
||||
__check_destdir "$destdir" "$rule" || return 1
|
||||
setx dest=joinp "$destdir" "$filename"
|
||||
setx dest=joinp "$destdir" "$dest"
|
||||
fi
|
||||
upvar dest "$dest"
|
||||
return 0
|
||||
|
@ -223,7 +227,11 @@ for file in "${files[@]}"; do
|
|||
odestdir="$HOME"
|
||||
fi
|
||||
|
||||
if [ "${pattern#/}" != "$pattern" ]; then
|
||||
awk -v filename="$filename" -v pattern="${pattern#/}" 'BEGIN { exit(filename ~ pattern? 0: 1) }' || continue
|
||||
else
|
||||
eval "[[ \"\$filename\" == $(qwc "$pattern") ]]" || continue
|
||||
fi
|
||||
|
||||
unset dest
|
||||
interaction=--DEFAULT--
|
||||
|
|
13
uscrontab
13
uscrontab
|
@ -197,6 +197,19 @@ Les lignes commençant par # sont des commentaires et sont ignorées
|
|||
La fonction elogto() permet de spécifier un fichier vers lequel toutes les
|
||||
sorties sont redirigées.
|
||||
|
||||
La fonction osvar() permet d'utiliser une variable de type oneshot définie
|
||||
via l'option --osvar. Dans l'exemple suivant:
|
||||
|
||||
0 1 * * *
|
||||
osvar FIRST=default SECOND
|
||||
echo \"first is $FIRST and second is $SECOND\"
|
||||
|
||||
En temps normal, FIRST vaut la valeur par défaut 'default' et SECOND vaut la
|
||||
chaine vide ''. Si on appelle '$scriptname -v FIRST=1 -v SECOND=2' alors ces
|
||||
variables auront la valeur spécifiée *une seule fois* à la prochaine
|
||||
invocation avant de retrouver leur valeur par défaut à l'invocation
|
||||
suivante.
|
||||
|
||||
OPTIONS
|
||||
-A, --install
|
||||
Installer une planification toutes les minutes du script dans la crontab
|
||||
|
|
Loading…
Reference in New Issue