déplacer les librairies dans lib/

This commit is contained in:
Jephte CLAIN
2014-07-07 20:58:50 +04:00
parent 6d63e4b64c
commit ee78740382
353 changed files with 0 additions and 0 deletions

View File

@@ -1 +0,0 @@
42

View File

@@ -1,7 +0,0 @@
##@cooked nocomments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@include base
##@include pretty
##@include sysinfos
##@include compat
uprovide DEFAULTS
urequire base pretty sysinfos compat

View File

@@ -1,17 +0,0 @@
##@cooked nocomments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@include prefixes
##@include java
##@include webobjects
##@include apache
##@include ldap
##@include crontab
uprovide PREFIXES-DEFAULTS
urequire prefixes java webobjects apache ldap crontab
function compute_all_prefixes() {
compute_java_prefixes
compute_webobjects_prefixes
compute_apache_prefixes
compute_ldap_prefixes
compute_crontab_prefixes
}

View File

@@ -1,687 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion du service apache (démarrage/arrêt), et de sa configuration
##@cooked nocomments
##@require base
##@require sysinfos
uprovide apache
urequire base sysinfos
function __apache_prefixes_checkdir() {
local dir
for dir in "$@"; do
if [ -d "$dir" ]; then
echo "$dir"
return 0
fi
done
return 1
}
function __apache_prefixes_checkfile() {
local file
for file in "$@"; do
if [ -f "$file" ]; then
echo "$file"
return 0
fi
done
return 1
}
function __apache_prefixes_checkexec() {
local exec
for exec in "$@"; do
if [ -x "$exec" ]; then
echo "$exec"
return 0
fi
done
return 1
}
function get_default_apachebin_prefix() {
__apache_prefixes_checkexec /usr/sbin/{apache2,apache,httpd}
}
function get_default_apacheversion_prefix() {
[ -n "$APACHEBIN" ] || return
local version="$($APACHEBIN -v | grep version:)"
if [[ "$version" == *1.3* ]]; then
echo ""
elif [[ "$version" == *2.0* ]]; then
echo "2"
elif [[ "$version" == *2.2* ]]; then
echo "2.2"
elif [[ "$version" == *2.4* ]]; then
echo "2.4"
fi
}
function get_default_apachectl_prefix() {
[ -n "$APACHEBIN" ] || return
__apache_prefixes_checkexec "$(dirname "$APACHEBIN")"/apache*ctl
}
function get_default_apachelogdir_prefix() {
if check_sysinfos -s darwin; then
__apache_prefixes_checkdir /var/log/{apache2,httpd}
elif check_sysinfos -s linux; then
if check_sysinfos -d debianlike; then
__apache_prefixes_checkdir /var/log/{apache2,apache}
elif check_sysinfos -d redhatlike; then
__apache_prefixes_checkdir /var/log/httpd
elif check_sysinfos -d gentoo; then
# XXX à vérifier
__apache_prefixes_checkdir /var/log/{apache{2,},httpd}
fi
fi
}
function get_default_apachesslcertsdir_prefix() {
if check_sysinfos -s darwin; then
__apache_prefixes_checkdir /etc/{apache2,httpd}/ssl.crt
elif check_sysinfos -s linux; then
__apache_prefixes_checkdir /etc/ssl/certs /etc/pki/tls/certs /etc/httpd/conf/ssl.crt
fi
}
function get_default_apachesslkeysdir_prefix() {
if check_sysinfos -s darwin; then
__apache_prefixes_checkdir /etc/{apache2,httpd}/ssl.key
elif check_sysinfos -s linux; then
__apache_prefixes_checkdir /etc/ssl/private /etc/pki/tls/private /etc/httpd/conf/ssl.key
fi
}
function get_default_apacheconfdir_prefix() {
if check_sysinfos -s darwin; then
__apache_prefixes_checkdir /etc/{apache2,httpd}
elif check_sysinfos -s linux; then
if check_sysinfos -d debianlike; then
__apache_prefixes_checkdir /etc/{apache{2,,-ssl},httpd}
elif check_sysinfos -d redhatlike; then
__apache_prefixes_checkdir /etc/httpd
elif check_sysinfos -d gentoo; then
__apache_prefixes_checkdir /etc/{apache{2,},httpd}
fi
fi
}
function get_default_apacheconf_prefix() {
[ -n "$APACHECONFDIR" ] || return
__apache_prefixes_checkfile "$APACHECONFDIR"/{apache2,{,conf/}httpd}.conf
}
function get_default_apacheavsitesdir_prefix() {
[ -n "$APACHECONFDIR" ] || return
if check_sysinfos -s darwin; then
__apache_prefixes_checkdir "$APACHECONFDIR/sites_disabled"
elif check_sysinfos -d debianlike gentoo; then
__apache_prefixes_checkdir "$APACHECONFDIR/sites-available"
fi
}
function get_default_apachesitesdir_prefix() {
if check_sysinfos -s darwin; then
__apache_prefixes_checkdir "$APACHECONFDIR/sites"
elif check_sysinfos -d debianlike gentoo; then
__apache_prefixes_checkdir "$APACHECONFDIR/sites-enabled"
fi
}
function get_default_htdocsdir_prefix() {
if check_sysinfos -s darwin; then
__apache_prefixes_checkdir /Library/WebServer/Documents
elif check_sysinfos -s linux; then
if check_sysinfos -d debianlike; then
__apache_prefixes_checkdir /var/www
elif check_sysinfos -d redhatlike; then
__apache_prefixes_checkdir /var/www/html
elif check_sysinfos -d gentoo; then
__apache_prefixes_checkdir /var/www/localhost/htdocs
fi
fi
}
function get_default_cgibindir_prefix() {
if check_sysinfos -s darwin; then
__apache_prefixes_checkdir /Library/WebServer/CGI-Executables
elif check_sysinfos -s linux; then
if check_sysinfos -d debianlike; then
__apache_prefixes_checkdir /usr/lib/cgi-bin
elif check_sysinfos -d redhatlike; then
__apache_prefixes_checkdir /var/www/cgi-bin
elif check_sysinfos -d gentoo; then
__apache_prefixes_checkdir /var/www/localhost/cgi-bin
fi
fi
}
__apache_prefixes=
function __compute_apache_prefixes() {
[ -n "$__apache_prefixes" ] && return
APACHEBIN="${APACHEBIN:-$(get_default_apachebin_prefix)}"
APACHEVERSION="${APACHEVERSION:-$(get_default_apacheversion_prefix)}"
APACHECTL="${APACHECTL:-$(get_default_apachectl_prefix)}"
APACHELOGDIR="${APACHELOGDIR:-$(get_default_apachelogdir_prefix)}"
APACHESSLCERTSDIR="${APACHESSLCERTSDIR:-$(get_default_apachesslcertsdir_prefix)}"
APACHESSLKEYSDIR="${APACHESSLKEYSDIR:-$(get_default_apachesslkeysdir_prefix)}"
APACHECONFDIR="${APACHECONFDIR:-$(get_default_apacheconfdir_prefix)}"
APACHECONF="${APACHECONF:-$(get_default_apacheconf_prefix)}"
APACHEAVSITESDIR="${APACHEAVSITESDIR:-$(get_default_apacheavsitesdir_prefix)}"
APACHESITESDIR="${APACHESITESDIR:-$(get_default_apachesitesdir_prefix)}"
HTDOCSDIR="${HTDOCSDIR:-$(get_default_htdocsdir_prefix)}"
CGIBINDIR="${CGIBINDIR:-$(get_default_cgibindir_prefix)}"
__apache_prefixes=1
}
UTOOLS_PREFIXES=("${UTOOLS_PREFIXES[@]}" APACHEBIN APACHEVERSION APACHECTL APACHELOGDIR APACHESSLCERTSDIR APACHESSLKEYSDIR APACHECONFDIR APACHECONF APACHEAVSITESDIR APACHESITESDIR HTDOCSDIR CGIBINDIR)
function compute_apache_prefixes() {
__compute_apache_prefixes
}
function recompute_apache_prefixes() {
__apache_prefixes=
__compute_apache_prefixes
}
function get_APACHEBIN_prefix() {
__compute_apache_prefixes
echo "$APACHEBIN"
}
function get_APACHEVERSION_prefix() {
__compute_apache_prefixes
echo "$APACHEVERSION"
}
function get_APACHECTL_prefix() {
__compute_apache_prefixes
echo "$APACHECTL"
}
function get_APACHELOGDIR_prefix() {
__compute_apache_prefixes
echo "$APACHELOGDIR"
}
function get_APACHESSLCERTSDIR_prefix() {
__compute_apache_prefixes
echo "$APACHESSLCERTSDIR"
}
function get_APACHESSLKEYSDIR_prefix() {
__compute_apache_prefixes
echo "$APACHESSLKEYSDIR"
}
function get_APACHECONFDIR_prefix() {
__compute_apache_prefixes
echo "$APACHECONFDIR"
}
function get_APACHECONF_prefix() {
__compute_apache_prefixes
echo "$APACHECONF"
}
function get_APACHEAVSITESDIR_prefix() {
__compute_apache_prefixes
echo "$APACHEAVSITESDIR"
}
function get_APACHESITESDIR_prefix() {
__compute_apache_prefixes
echo "$APACHESITESDIR"
}
function get_HTDOCSDIR_prefix() {
__compute_apache_prefixes
echo "$HTDOCSDIR"
}
function get_CGIBINDIR_prefix() {
__compute_apache_prefixes
echo "$CGIBINDIR"
}
function __apache_resolvcert() {
[ -n "$__rc_dir" ] || __rc_dir="$(dirname "$__rc_conf")"
eval "$(
source "$__rc_conf"
set_var_cmd __rc_cert "$cert"
set_var_cmd __rc_key "$key"
set_var_cmd __rc_ca "$ca"
)"
[ -n "$__rc_cert" ] && __rc_cert="$(abspath "$__rc_cert" "$__rc_dir")"
[ -n "$__rc_key" ] && __rc_key="$(abspath "$__rc_key" "$__rc_dir")"
[ -n "$__rc_ca" ] && __rc_ca="$(abspath "$__rc_ca" "$__rc_dir")"
}
function __apache_checkvars() {
if [ -n "$__rc_cert" -a -z "$__rc_key" ]; then
local __rc_name __rc_ext
splitname "$__rc_cert" __rc_name __rc_ext
if [ "$__rc_ext" == "crt" -o "$__rc_ext" == "pem" ]; then
__rc_key="$__rc_name.key"
enote "La clé privée n'a pas été spécifiée. La valeur $(ppath "$__rc_key") sera utilisée"
else
eerror "Impossible de trouver la clé privée correspondant au certificat $(ppath "$__rc_cert")"
return 1
fi
fi
if [ -z "$__rc_cert" -a -z "$__rc_ca" ]; then
eerror "Vous devez spécifier le certificat à installer"
return 1
elif [ -z "$__rc_cert" ]; then
eattention "Seul le certificat autorité a été spécifié."
elif [ -z "$__rc_ca" ]; then
ewarn "Aucun certificat autorité n'a pas été spécifié. Cela ne peut marcher que si le certificat est autosigné"
fi
local i
for i in "$__rc_cert" "$__rc_key" "$__rc_ca"; do
[ -n "$i" ] || continue
[ -f "$i" ] || {
eerror "$i: Fichier introuvable"
return 1
}
done
}
function apache_resolvecert() {
# Calculer l'emplacement des certificats correspondant aux arguments $1 et
# $2 (qui correspondent aux options --conf et --dir de apache_addcert()),
# puis initialiser les variables $3(=cert), $4(=key) et $5(=ca)
local __rc_conf="$1" __rc_dir="$2"
local __rc_cert __rc_key __rc_ca
__apache_resolvcert
__apache_checkvars || return 1
set_var "${3:-cert}" "$__rc_cert"
set_var "${4:-key}" "$__rc_key"
set_var "${5:-ca}" "$__rc_ca"
}
function apache_addcert() {
function __apache_addcert_display_help() {
uecho "apache_addcert: Installer un certificat sur le serveur
USAGE
apache_addcert [options] [cert.pem [cert.key [ca.pem]]]
OPTIONS
--conf certsconf
--dir certsdir
Spécifier un fichier de configuration et un répertoire depuis lesquels
prendre les informations sur les certificats à utiliser.
Le fichier de configuration doit définir les variables cert, key et ca
avec les noms des fichiers contenant respectivement le certificat, la
clé privée, et les certificats autorités, exprimés relativement au
répertoire certsdir.
Si ces options ne sont pas spécifiées, les fichiers doivent être donnés
sur la ligne de commande.
--out-cert cert
--out-key key
--out-ca ca
Au lieu d'installer les certificats, placer les chemins vers les
fichiers correspondant dans les variables spécifiées"
}
eval "$(utools_local)"
local action=install
local certsconf certsdir cert key ca
local __out_cert __out_key __out_ca
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with __apache_addcert_display_help' \
-C:,--conf: certsconf= \
-d:,--dir: certsdir= \
--out-cert: '$set@ __out_cert; action=dump' \
--out-key: '$set@ __out_key; action=dump' \
--out-ca: '$set@ __out_ca; action=dump' \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
local __rc_conf __rc_dir
local __rc_cert __rc_key __rc_ca
if [ -n "$certsconf" ]; then
__rc_conf="$certsconf"
__rc_dir="$certsdir"
__apache_resolvconf
__apache_checkvars || return 1
else
__rc_cert="$1"
__rc_key="$2"
__rc_ca="$3"
__apache_checkvars || return 1
fi
cert="$__rc_cert"
key="$__rc_key"
ca="$__rc_ca"
if [ -n "$cert" ]; then
estepi "Certificat: $(ppath "$cert")"
estepi "Clé privée: $(ppath "$key")"
fi
[ -n "$ca" ] && estepi "CAutorités: $(ppath "$ca")"
ask_yesno "Voulez-vous continuer?" O || return 1
urequire install
etitle "Installation des certificats"
certsdir="$(get_APACHESSLCERTSDIR_prefix)"
keysdir="$(get_APACHESSLKEYSDIR_prefix)"
if [ ! -d "$certsdir" ]; then
mkdir -p "$certsdir" || return 1
chmod 755 "$certsdir" || return 1
fi
if [ ! -d "$keysdir" ]; then
mkdir -p "$keysdir" || return 1
chmod 710 "$keysdir" || return 1
fi
if [ -n "$cert" ]; then
copy_replace "$cert" "$certsdir" || return 1
chmod 644 "$certsdir/$(basename "$cert")" || return 1
copy_replace "$key" "$keysdir" || return 1
chmod 640 "$keysdir/$(basename "$key")" || return 1
fi
if [ -n "$ca" ]; then
copy_replace "$ca" "$certsdir" || return 1
chmod 644 "$certsdir/$(basename "$ca")" || return 1
fi
eend
return 0
}
function apache_autoconf() {
function __apache_autoconf_display_help() {
uecho "apache_autoconf: Mettre à jour la configuration d'apache
USAGE
apache_autoconf AUTOCONFDIR [CERTSDIR]
AUTOCONFDIR peut contenir les fichiers et répertoires suivants, qui sont tous
optionnels:
- modules.conf la liste des modules qu'il faut activer. Si un module n'existe
pas dans ce fichier, ou si ce fichier n'existe pas, aucune modification n'est
effectuée. Si un module est de la forme -module, il est désactivé. Si un
module est de la forme +module, il est activé. Cette syntaxe permet de
supporter les modules dont le nom commencerait par '-'
- sites.conf la liste des sites qu'il faut activer. Si un site ne figure pas
dans ce fichier, il est désactivé. Si ce fichier n'existe pas, tous les sites
existant sont activés.
- tous les autres fichiers sont copiés tels quels dans /etc/apache2. Notamment,
apache2.conf est le fichier de configuration principal d'apache et ports.conf
le fichier de configuration des ports d'écoute.
- modules/ le répertoire des configurations de modules à installer. Les fichiers
de ce répertoire sont de la forme MODULE.conf et sont installés dans le
répertoire /etc/apache2/mods-available. Il faut mentioner le module dans le
fichier modules.conf pour l'activer.
- sites/ le répertoire des sites à installer. Les fichiers de ce répertoire sont
de la forme NAME.conf pour les sites écoutant en clair, et NAME.ssl.conf pour
les sites écoutant en https. Pour chaque site NAME.ssl.conf, un fichier
NAME-certs.conf doit exister dans certsconf/
Dans les fichiers NAME.ssl.conf, les valeurs @@cert@@, @@key@@ et @@ca@@ sont
respectivement remplacées par l'emplacement des fichiers de certificats
définis dans les fichiers correspondants NAME-certs.conf
- cgi-bin/ le répertoire des scripts cgi à installer
- www/ le répertoire qui contient les fichiers du serveur web à installer dans
l'emplacement par défaut.
- certsconf/ le répertoire qui contient la configuration pour les certificats à
installer. Si ce répertoire existe, il faut spécifier CERTSDIR
Les fichiers de ce répertoire sont de la forme NAME-certs.conf et chacun d'eux
correspondant en principe à un fichier NAME.ssl.conf dans sites/
- RewriteRules/ le répertoire qui contient la configuration de réécriture. Tous
les fichiers RewriteRules*.conf de ce répertoire sont copiés dans /etc/apache2
IMPORTANT: Cette fonction n'est pour le moment supporté que sur debian
OPTIONS
--confdir CONFDIR
Spécifier l'emplacement des fichiers de configuration apache ainsi que
modules.conf et sites.conf
Par défaut, utiliser AUTOCONFDIR
--modulesdir MODULESDIR
Spécifier l'emplacement des fichiers de configuration des modules.
Par défaut, utiliser AUTOCONFDIR/modules si ce répertoire existe.
--sitesdir SITESDIR
Spécifier l'emplacement des fichiers de configuration des sites.
Par défaut, utiliser AUTOCONFDIR/sites si ce répertoire existe.
--cgibindir CGIBINDIR
Spécifier l'emplacement des scripts cgi à installer.
Par défaut, utiliser AUTOCONFDIR/cgi-bin si ce répertoire existe.
--wwwdir WWWDIR
Spécifier l'emplacement des fichiers du serveur web
Par défaut, utiliser AUTOCONFDIR/www si ce répertoire existe.
--certsconfdir CERTSCONFDIR
Spécifier l'emplacement des fichiers de configuration des certificats.
Par défaut, utiliser AUTOCONFDIR/certsconf si ce répertoire existe.
Il faut alors spécifier aussi CERTSDIR, l'emplacement des certificats à
installer.
--rrdir RRDIR
Spécifier l'emplacement des fichiers de réécriture.
Par défaut, utiliser AUTOCONFDIR/RewriteRules si ce répertoire existe.
--no-restart
Ne pas redémarrer apache en cas de modification de la configuration"
}
eval "$(utools_local)"
local autoconfdir certsdir confdir modulesdir sitesdir cgibindir wwwdir certsconfdir rrdir
local restart=1
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with __apache_autoconf_display_help' \
--confdir: confdir= \
--modulesdir: modulesdir= \
--sitesdir: sitesdir= \
--cgibindir: cgibindir= \
--wwwdir: wwwdir= \
--certsconfdir: certsconfdir= \
--rrdir: rrdir= \
--no-restart restart= \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
if ! check_sysinfos -s linux -d debian; then
eerror "apache_autoconf n'est supporté que sur Debian linux"
return 1
fi
urequire install
compute_apache_prefixes
autoconfdir="$1"
[ -n "$autoconfdir" ] || {
eerror "Vous devez spécifier le répertoire de base de la configuration apache"
return 1
}
certsdir="$2"
if [ -z "$confdir" -o -z "$modulesdir" -o -z "$sitesdir" \
-o -z "$cgibindir" -o -z "$wwwdir" -o -z "$certsconfdir" \
-o -z "$rrdir" ]; then
[ -d "$autoconfdir" ] || {
eerror "$autoconfdir: répertoire invalide"
return 1
}
fi
[ -n "$confdir" ] || confdir="$autoconfdir"
[ -n "$modulesdir" ] || modulesdir="$autoconfdir/modules"
[ -n "$sitesdir" ] || sitesdir="$autoconfdir/sites"
[ -n "$cgibindir" ] || cgibindir="$autoconfdir/cgi-bin"
[ -n "$wwwdir" ] || wwwdir="$autoconfdir/www"
[ -n "$certsconfdir" ] || certsconfdir="$autoconfdir/certsconf"
[ -n "$rrdir" ] || rrdir="$autoconfdir/RewriteRules"
if [ -d "$certsconfdir" ]; then
if [ -z "$certsdir" ]; then
eerror "CERTSDIR est requis si --certsconfdir est spécifié"
return 1
elif [ ! -d "$certsdir" ]; then
eerror "$certsdir: répertoire invalide"
return 1
fi
fi
local modified conf
if [ -d "$certsconfdir" ]; then
local -a certsconfs
local certsconf cert key ca
etitle "Installation des certificats"
array_lsfiles certsconfs "$certsconfdir" "*.conf"
for certsconf in "${certsconfs[@]}"; do
apache_resolvecert "$certsconf" "$certsdir" cert key ca || return 1
apache_addcert -y "$cert" "$key" "$ca"
modified=1
done
eend
fi
if [ -d "$modulesdir" ]; then
local -a confs
local conf
etitle "Installation des configurations des modules"
array_from_lines confs "$(list_files "$modulesdir" "*.conf")"
for conf in "${confs[@]}"; do
estep "$conf"
copy_update "$modulesdir/$conf" "$APACHECONFDIR/mods-available/$conf" && modified=1
done
eend
fi
if [ -d "$rrdir" ]; then
local -a confs
local conf
etitle "Installation des règles de réécriture"
array_from_lines confs "$(list_files "$rrdir" "RewriteRules*.conf")"
for conf in "${confs[@]}"; do
estep "$conf"
copy_update "$rrdir/$conf" "$APACHECONFDIR/$conf" && modified=1
done
eend
fi
local -a enablesites disablesites
if [ -d "$sitesdir" ]; then
local -a confs
local conf confname destconf certsconf tmpconf
etitle "Installation des sites"
array_lsfiles confs "$sitesdir" "*.conf"
for conf in "${confs[@]}"; do
confname="$(basename "$conf")"
destconf="$confname"
certsconf=
if [ "${destconf%.ssl.conf}" != "$destconf" ]; then
if [ -d "$certsconfdir" ]; then
certsconf="${destconf%.ssl.conf}-certs.conf"
else
ewarn "$conf: fichier ignoré parce que --certsconfdir n'a pas été spécifié"
fi
fi
case "$destconf" in
default.conf) destconf=default;;
default.ssl.conf) destconf=default-ssl;;
esac
if [ -n "$certsconf" ]; then
certsconf="$certsconfdir/$certsconf"
if [ -f "$certsconf" ]; then
apache_resolvecert "$certsconf" "$certsdir" cert key ca || return 1
ac_set_tmpfile tmpconf
sed "\
s#@@cert@@#$APACHESSLCERTSDIR/$(basename "$cert")#g
s#@@key@@#$APACHESSLKEYSDIR/$(basename "$key")#g
s#@@ca@@#$APACHESSLCERTSDIR/$(basename "$ca")#g
" <"$conf" >"$tmpconf"
copy_update "$tmpconf" "$APACHEAVSITESDIR/$destconf"
else
eerror "$(ppath "$certsconf"): fichier introuvable. Il a été ignoré"
fi
else
copy_update "$conf" "$APACHEAVSITESDIR/$destconf"
fi
enablesites=("${enablesites[@]}" "$destconf")
modified=1
done
eend
fi
if [ -d "$confdir" ]; then
local -a confs
local conf
etitle "Configuration de base"
array_from_lines confs "$(list_files "$confdir")"
for conf in "${confs[@]}"; do
case "$conf" in
modules.conf|sites.conf) continue;;
esac
estep "$conf"
copy_update "$confdir/$conf" "$APACHECONFDIR/$conf" && modified=1
done
if [ -f "$confdir/modules.conf" ]; then
local -a modules
local module
array_from_lines modules "$(<"$confdir/modules.conf" filter_conf)"
for module in "${modules[@]}"; do
if [ "${module#-}" != "$module" ]; then
module="${module#-}"
if a2dismod "$module"; then
estep "Désactivation du module $module"
modified=1
fi
else
module="${module#+}"
if a2enmod "$module"; then
estep "Activation du module $module"
modified=1
fi
fi
done
fi
if [ -f "$confdir/sites.conf" ]; then
local -a sitesconfs; local sitesconf
array_from_lines sitesconfs "$(<"$confdir/sites.conf" filter_conf)"
if [ ${#sitesconfs[*]} -gt 0 ]; then
# si une configuration existe, ignorer la configuration
# automatique
enablesites=()
disablesites=()
for sitesconf in "${sitesconfs[@]}"; do
if [ "${sitesconf#+}" != "$sitesconf" ]; then
array_del disablesites "${sitesconf#+}"
array_add enablesites "${sitesconf#+}"
elif [ "${sitesconf#-}" != "$sitesconf" ]; then
array_del enablesites "${sitesconf#-}"
array_add disablesites "${sitesconf#-}"
else
array_del disablesites "$sitesconf"
array_add enablesites "$sitesconf"
fi
done
fi
fi
eend
fi
if [ -d "$cgibindir" ]; then
etitle "Installation des scripts CGI"
cpdirnovcs "$cgibindir" "$CGIBINDIR"
eend
fi
if [ -d "$wwwdir" ]; then
etitle "Installation des fichiers du serveur web"
cpdirnovcs "$wwwdir" "$HTDOCSDIR"
eend
fi
if [ -n "${enablesites[*]}" -o -n "${disablesites[*]}" ]; then
etitle "(dés)Activation des sites"
local site
for site in "${enablesites[@]}"; do
a2ensite "$site"
done
for site in "${disablesites[@]}"; do
a2dissite "$site"
done
eend
fi
if [ -n "$modified" -a -n "$restart" ]; then
estep "Redémarrage d'apache"
"$APACHECTL" restart
fi
}

View File

@@ -1,40 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Charger si possible les librairies de ulib depuis /etc/ulib. Sinon, charger
## la librairie depuis le répertoire courant. Nécessite bash.
##@cooked nocomments
# Ce fichier doit être *sourcé* depuis un répertoire ulib créé par ulibsync. Si
# ce fichier n'est pas sourcé, alors le répertoire ulib doit être placé dans le
# répertoire du script qui inclue ce fichier.
ULIBDIR="${BASH_SOURCE[0]}"
if [ -n "$ULIBDIR" -a -f "$ULIBDIR" ]; then
# Fichier sourcé
ULIBDIR="$(dirname "$ULIBDIR")"
else
# Fichier non sourcé. Tout exprimer par rapport au script courant
ULIBDIR="$(dirname "$0")/ulib"
fi
function __check_ulib_version() {
# tester si la version ulib du système est plus récente que la version ulib
# du répertoire courant
local thisver=0 sysver=0
[ -f "$ULIBDIR/.ulib_version" ] && thisver="$(<"$ULIBDIR/.ulib_version")"
[ -f "/etc/.ulib_version" ] && sysver="$(<"/etc/.ulib_version")"
[ $sysver -gt $thisver ]
}
if [ -f /etc/ulib ] && __check_ulib_version; then
unset -f __check_ulib_version
. /etc/ulib
elif [ -f "$ULIBDIR/ulib" ]; then
unset -f __check_ulib_version
. "$ULIBDIR/ulib"
else
echo "error: Unable to find neither $ULIBDIR/ulib nor /etc/ulib" 1>&2
exit 1
fi
uprovide auto
urequire DEFAULTS

1654
ulib/awk

File diff suppressed because it is too large Load Diff

4161
ulib/base

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Relancer le script avec bash si nécessaire
##@cooked nocomments
if [ `basename "${BASH:-sh}"` = "sh" ]; then
bash=`which bash 2>/dev/null`
for bash in "$bash" /bin/bash /usr/bin/bash /usr/local/bin/bash; do
if [ -x "$bash" ]; then
exec "$bash" "$0" "$@"
fi
done
echo "error: this script requires bash"
exit 1
fi

File diff suppressed because it is too large Load Diff

View File

@@ -1,73 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonction de support pour CGI
##@cooked nocomments
uprovide cgi
function is_cgi() {
# Tester si on est lancé comme un script CGI
[ -n "$GATEWAY_INTERFACE" ]
}
function ctype_header() {
# Générer une en-tête Content-Type: avec la valeur $1[=text/html]
local ctype="$1"
[ -n "$ctype" ] || ctype="text/html"
if [[ "$ctype" == text/* ]]; then
[[ "$ctype" == *\;* ]] || ctype="$ctype; charset=utf-8"
fi
echo "Content-Type: $ctype"
}
function cdisp_header() {
# Générer une en-tête Content-Disposition: avec le type $2[=attachment] et
# le nom de fichier $1[=result]
local filename="${1:-result}" disp="${2:-attachment}"
echo "Content-Disposition: $disp; filename=$filename"
}
function nocache_header() {
# Générer des en-têtes qui désactivent la mise en cache du contenu
echo "Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0"
echo "Pragma: no-cache"
echo "Expires: Thu, 01 Jan 1970 00:00:00 GMT"
}
function cgicontent() {
# Générer les en-têtes nécessaire avant de servir le contenu.
# $1(=text/html) est le type de contenu. S'il faut servir le contenu avec
# une disposition "attachment", $2 est le nom de fichier à proposer à
# l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le
# contenu doit être servi.
# $4..* sont des en-têtes supplémentaires à rajouter
local ctype="$1" filename="$2" contentfile="$3"; shift; shift; shift
local header
ctype_header "$ctype"
[ -n "$filename" ] && cdisp_header "$filename"
for header in "$@"; do
echo "$header"
done
echo ""
[ -f "$contentfile" ] && cat "$contentfile"
}
function cgicontent_nocache() {
# Générer les en-têtes nécessaire avant de servir le contenu. Rajouter les
# entêtes pour désactiver la mise en cache.
# $1(=text/html) est le type de contenu. S'il faut servir le contenu avec
# une disposition "attachment", $2 est le nom de fichier à proposer à
# l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le
# contenu doit être servi.
# $4..* sont des en-têtes supplémentaires à rajouter
local ctype="$1" filename="$2" contentfile="$3"; shift; shift; shift
local header
ctype_header "$ctype"
[ -n "$filename" ] && cdisp_header "$filename"
nocache_header
for header in "$@"; do
echo "$header"
done
echo ""
[ -f "$contentfile" ] && cat "$contentfile"
}

View File

@@ -1,8 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonction de support pour cgiupload
##@cooked nocomments
##@require ulib
uprovide cgiupload
urequire ulib
function cgiupload() { "$ULIBDIR/support/cgiupload.py" "$@"; }

View File

@@ -1,378 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Code de support pour les architectures autre que Linux
##@cooked nocomments
##@require base
##@require sysinfos
uprovide compat
urequire base sysinfos
if check_sysinfos -s macosx; then
# implémentation en bash des variantes de readlink
function __rlnp() { local p="$1" np f; [ "${p#/}" == "$p" ] && p="$(pwd)/$p"; while [[ "$p" == *//* ]]; do p="${p//\/\///}"; done; p="${p%/}"; p="${p#/}"; np=; while [ -n "$p" ]; do if [[ "$p" == */* ]]; then f="${p%%/*}"; p="${p#*/}"; else f="$p"; p=; fi; if [ "$f" == . ]; then :; elif [ "$f" == .. ]; then if [[ "$np" == */* ]]; then np="${np%/*}"; else np=; fi; else [ -n "$np" ] && np="$np/"; np="$np$f"; fi; done; echo "/$np"; }
function readlinkm() { local p="$(__rlnp "$1")" np n; while [ -n "$p" ]; do local max=50; while [ -L "$p" -a $max -gt 0 ]; do n="$(readlink "$p")"; if [ "${n#/}" != "$n" ]; then p="$n"; else p="${p%/*}/$n"; fi; p="$(__rlnp "$p")"; max=$(($max-1)); done; [ -n "$np" ] && np="/$np"; if [[ "$p" == */* ]]; then np="${p##*/}$np"; p="${p%/*}"; else np="$p$np"; p=; fi; done; echo "/$np"; }
# la version de awk livrée sur macosx est braindead
function _nl2lf() { awk '{ sub(/\r$/, ""); gsub(/\r/, "\n"); print }'; }
function _nl2crlf() { _nl2lf | awk '{ print $0 "\r" }'; }
function _nl2cr() { _nl2lf | awk 'BEGIN { ORS="" } { print $0 "\r" }'; }
# sed -i demande un argument
function sedi() { sed -i '' "$@"; }
## gestion des arguments
function __po_check_options() {
# émuler gnu getopt puisque qu'il n'est pas disponible sur cette
# plateforme
local -a options args
local option value flag
if [ "${opts_#+}" != "$opts_" ]; then
# Arrêter au premier argument qui n'est pas une option
while [ -n "$*" ]; do
if [ "$1" == "--" ]; then
shift
break
elif [[ "$1" == --* ]]; then
# option longue
option="${1%%=*}"
if flag="$(array_find options_ "$option" flags_)"; then
if [[ "$flag" == ::* ]]; then
# valeur optionnelle
if [[ "$1" == *=* ]]; then
value="${1#--*=}"
else
value=
fi
shift
options=("${options[@]}" "$option" "$value")
elif [[ "$flag" == :* ]]; then
# valeur obligatoire
if [[ "$1" == *=* ]]; then
value="${1#--*=}"
shift
elif [ $# -gt 1 ]; then
value="$2"
shift 2
else
echo "option requires an argument: $option"
return 1
fi
options=("${options[@]}" "$option" "$value")
else
# pas de valeur
shift
options=("${options[@]}" "$option")
fi
else
echo "invalid option: $1"
return 1
fi
elif [[ "$1" == -* ]]; then
# option courte
option="${1:0:2}"
if flag="$(array_find options_ "$option" flags_)"; then
if [[ "$flag" == ::* ]]; then
# valeur optionnelle
value="${1:2}"
shift
options=("${options[@]}" "$option" "$value")
elif [[ "$flag" == :* ]]; then
# valeur obligatoire
if [[ -n "${1:2}" ]]; then
value="${1:2}"
shift
elif [ $# -gt 1 ]; then
value="$2"
shift 2
else
echo "option requires an argument: $option"
return 1
fi
options=("${options[@]}" "$option" "$value")
else
# pas de valeur
shift
options=("${options[@]}" "$option")
fi
else
echo "invalid option: $1"
return 1
fi
else
# ce n'est pas une option, on arrête là
break
fi
done
args=("$@")
elif [ "${opts_#-}" != "$opts_" ]; then
# Les options peuvent être situées partout sur la ligne de commande,
# mais les arguments ne sont pas réordonnés.
while [ -n "$*" ]; do
if [ "$1" == "--" ]; then
shift
break
elif [[ "$1" == --* ]]; then
# option longue
option="${1%%=*}"
if flag="$(array_find options_ "$option" flags_)"; then
if [[ "$flag" == ::* ]]; then
# valeur optionnelle
if [[ "$1" == *=* ]]; then
value="${1#--*=}"
else
value=
fi
shift
options=("${options[@]}" "$option" "$value")
elif [[ "$flag" == :* ]]; then
# valeur obligatoire
if [[ "$1" == *=* ]]; then
value="${1#--*=}"
shift
elif [ $# -gt 1 ]; then
value="$2"
shift 2
else
echo "option requires an argument: $option"
return 1
fi
options=("${options[@]}" "$option" "$value")
else
# pas de valeur
shift
options=("${options[@]}" "$option")
fi
else
echo "invalid option: $1"
return 1
fi
elif [[ "$1" == -* ]]; then
# option courte
option="${1:0:2}"
if flag="$(array_find options_ "$option" flags_)"; then
if [[ "$flag" == ::* ]]; then
# valeur optionnelle
value="${1:2}"
shift
options=("${options[@]}" "$option" "$value")
elif [[ "$flag" == :* ]]; then
# valeur obligatoire
if [[ -n "${1:2}" ]]; then
value="${1:2}"
shift
elif [ $# -gt 1 ]; then
value="$2"
shift 2
else
echo "option requires an argument: $option"
return 1
fi
options=("${options[@]}" "$option" "$value")
else
# pas de valeur
shift
options=("${options[@]}" "$option")
fi
else
echo "invalid option: $1"
return 1
fi
else
# ce n'est pas une option, mais l'ajouter aux options parce
# qu'on ne réordonne pas
options=("${options[@]}" "$1")
shift
fi
done
args=("$@")
else
# Les options peuvent être situées partout sur la ligne de commande.
# Les arguments sont réordonnés pour placer les options en premier,
# séparées des non-options par '--'
while [ -n "$*" ]; do
if [ "$1" == "--" ]; then
shift
break
elif [[ "$1" == --* ]]; then
# option longue
option="${1%%=*}"
if flag="$(array_find options_ "$option" flags_)"; then
if [[ "$flag" == ::* ]]; then
# valeur optionnelle
if [[ "$1" == *=* ]]; then
value="${1#--*=}"
else
value=
fi
shift
options=("${options[@]}" "$option" "$value")
elif [[ "$flag" == :* ]]; then
# valeur obligatoire
if [[ "$1" == *=* ]]; then
value="${1#--*=}"
shift
elif [ $# -gt 1 ]; then
value="$2"
shift 2
else
echo "option requires an argument: $option"
return 1
fi
options=("${options[@]}" "$option" "$value")
else
# pas de valeur
shift
options=("${options[@]}" "$option")
fi
else
echo "invalid option: $1"
return 1
fi
elif [[ "$1" == -* ]]; then
# option courte
option="${1:0:2}"
if flag="$(array_find options_ "$option" flags_)"; then
if [[ "$flag" == ::* ]]; then
# valeur optionnelle
value="${1:2}"
shift
options=("${options[@]}" "$option" "$value")
elif [[ "$flag" == :* ]]; then
# valeur obligatoire
if [[ -n "${1:2}" ]]; then
value="${1:2}"
shift
elif [ $# -gt 1 ]; then
value="$2"
shift 2
else
echo "option requires an argument: $option"
return 1
fi
options=("${options[@]}" "$option" "$value")
else
# pas de valeur
shift
options=("${options[@]}" "$option")
fi
else
echo "invalid option: $1"
return 1
fi
else
# ce n'est pas une option, l'ajouter aux arguments
args=("${args[@]}" "$1")
shift
fi
done
args=("${args[@]}" "$@")
fi
quoted_args "${options[@]}" -- "${args[@]}"
return 0
}
## gestion des dates
function __pd_isleap() {
# tester si l'année $1 est bissextile
[ $(($1 % 4)) -eq 0 -a \( $(($1 % 100)) -ne 0 -o $(($1 % 400)) -eq 0 \) ]
}
function __pd_fix_month() {
# soit $1 le nom d'une variable contenant une année, et $2 le nom d'une
# variable contenant un mois, normaliser les valeurs de ces variables, en
# ajustant si nécessaire les valeurs.
local __pdfm_y="${!1}" __pdfm_m="${!2}"
let __pdfm_m=$__pdfm_m-1
while [ $__pdfm_m -gt 11 ]; do
let __pdfm_m=$__pdfm_m-12
let __pdfm_y=$__pdfm_y+1
done
while [ $__pdfm_m -lt 0 ]; do
let __pdfm_m=$__pdfm_m+12
let __pdfm_y=$__pdfm_y-1
done
let __pdfm_m=$__pdfm_m+1
eval "$1=$__pdfm_y; $2=$__pdfm_m"
}
__PD_MONTHDAYS=(0 31 28 31 30 31 30 31 31 30 31 30 31)
function __pd_monthdays() {
# calculer le nombre de jours du mois $2 de l'année $1
local y="$1" m="$2" mds
__pd_fix_month y m
mds="${__PD_MONTHDAYS[$m]}"
[ "$m" -eq 2 ] && __pd_isleap "$y" && let mds=$mds+1
echo $mds
}
function __pd_fix_day() {
# soit $1 le nom d'une variable contenant une année, $2 le nom d'une
# variable contenant un mois et $3 le nom d'une variable contenant un jour,
# normaliser les valeurs de ces variables, en ajustant si nécessaire les
# valeurs. cette fonction assume que la valeur de $2 est déjà corrigée avec
# __pd_fix_month
local __pdfd_y="${!1}" __pdfd_m="${!2}" __pdfd_d="${!3}" __pdfd_mds
let __pdfd_d=$__pdfd_d-1
let __pdfd_mds=$(__pd_monthdays $__pdfd_y $__pdfd_m)
while [ $__pdfd_d -gt $(($__pdfd_mds-1)) ]; do
let __pdfd_d=$__pdfd_d-$__pdfd_mds
let __pdfd_m=$__pdfd_m+1
__pd_fix_month __pdfd_y __pdfd_m
let __pdfd_mds=$(__pd_monthdays $__pdfd_y $__pdfd_m)
done
while [ $__pdfd_d -lt 0 ]; do
let __pdfd_m=$__pdfd_m-1
__pd_fix_month __pdfd_y __pdfd_m
let __pdfd_d=$__pdfd_d-$(__pd_monthdays $__pdfd_y $__pdfd_m)
done
let __pdfd_d=$__pdfd_d+1
eval "$1=$__pdfd_y; $2=$__pdfd_m; $3=$__pdfd_d"
}
function __pd_fix_date() {
# soit $1 le nom d'une variable contenant une année, $2 le nom d'une
# variable contenant un mois et $3 le nom d'une variable contenant un jour,
# normaliser les valeurs de ces variables, en ajustant si nécessaire les
# valeurs.
local __pdf_y="${!1}" __pdf_m="${!2}" __pdf_d="${!3}"
}
function parse_date() {
local value="$1" type="${2:-date}"
local d m y
# date courante
eval "$(date +%d/%m/%Y | awk -F/ '{
print "d=" $1 "; m=" $2 "; y=" $3
}')"
if [ "${value#+}" != "$value" ]; then
# ajouter $1 jours
d="$(($d+${value#+}))"
else
# parser une nouvelle date, en complétant avec les informations de la
# date du jour
eval "$(<<<"$value" awkrun FS=/ dn="$dn" mn="$mn" yn="$yn" type="$type" '{
d = $1 + 0; if (d < 1) d = dn + 0;
m = $2 + 0; if (m < 1) m = mn + 0;
if ($3 == "") y = yn + 0;
else { y = $3 + 0; if (y < 100) y = y + 2000; }
print "d=" d "; m=" m "; y=" y
}')"
fi
# ensuite corriger les champs si nécessaire
__pd_fix_month y m
__pd_fix_day y m d
# enfin formater la date selon les volontés de l'utilisateur
case "$type" in
d|date)
awkrun d="$d" m="$m" y="$y" 'BEGIN { printf "%02i/%02i/%04i\n", d, m, y }'
;;
l|ldap)
awkrun d="$d" m="$m" y="$y" 'BEGIN { printf "%04i%02i%02i000000+0400\n", y, m, d }'
;;
esac
}
function myhost() {
hostname
}
function myhostname() {
hostname -s
}
fi

746
ulib/conf
View File

@@ -1,746 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion des fichiers de configuration
##@cooked nocomments
##@require base
uprovide conf
urequire base
################################################################################
# Gestion des fichiers de configuration où les directives sont de la forme
# 'name=value' et où les commentaires débutent par '#'. C'est typiquement le cas
# des scripts de profile du shell
# Note: #@$*! de MacOS X qui ne supporte pas \(expr\)\? dans sed. Toutes les
# lignes sed de la forme '/prefix\(expr\)\?suffix/s/from/to/g' sont remplacées
# par une double expression
# '/prefixexprsuffix/s/from/to/g
# /prefixsuffix/s/from/to/g'
function conf_enable() {
# Dans le fichier de configuration $1, activer les paramètres $2..*
# Chaque argument de cette fonction correspond à une directive du fichier de
# configuration et doit être de la forme name[=value]
# Dans tous les cas, toutes les directives de ce nom sont recherchées et
# décommentées. Si value est précisée, les directives sont mises à jour. Si
# la directive ne figure pas dans le fichier, elle y est rajoutée à la fin
# avec la valeur spécifiée.
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
local conf="$1"; shift
[ -n "$*" ] || return 1
local mode="$(fix_mode "$conf")"
local modified=1
local param name value to
for param in "$@"; do
splitvar "$param" name value
# Essayer d'abord de décommenter la valeur dans le fichier
if quietgrep "^[ $TAB]*##*[ $TAB]*\(export[ $TAB]*\)\?$name[ $TAB]*=" "$conf"; then
sedi "\
/^[ $TAB]*##*[ $TAB]*export[ $TAB]*$name[ $TAB]*=/s/^[ $TAB]*##*\([ $TAB]*export[ $TAB]*\)/\\1/g
/^[ $TAB]*##*[ $TAB]*$name[ $TAB]*=/s/^[ $TAB]*##*//g
" "$conf"
modified=0
elif ! quietgrep "^[ $TAB]*\(export[ $TAB]*\)\?$name[ $TAB]*=" "$conf"; then
echo "$name=" >>"$conf"
modified=0
fi
if [ "$name" != "$param" ]; then
# Ensuite, mettre à jour le fichier avec la valeur spécifiée
to="$(quote_seds "$value")"
sedi "\
/^[ $TAB]*export[ $TAB]*$name[ $TAB]*=/s/^\([ $TAB]*export[ $TAB]*$name[ $TAB]*=[ $TAB]*\).*\$/\\1$to/
/^[ $TAB]*$name[ $TAB]*=/s/^\([ $TAB]*$name[ $TAB]*=[ $TAB]*\).*\$/\\1$to/
" "$conf"
modified=0
fi
done
unfix_mode "$conf" "$mode"
return $modified
}
function conf_enableq() {
# Comme conf_enable(), mais s'assure que les valeurs sont quotées dans le
# fichier. Ceci permet de stocker des valeurs avec des espaces ou des
# caractères spéciaux.
local args arg name value
args=("$1"); shift
for arg in "$@"; do
splitvar "$arg" name value
array_add args "$name=$(quoted_arg "$value")"
done
conf_enable "${args[@]}"
}
function conf_disable() {
# Dans le fichier de configuration $1, désactiver les paramètres $2..*
# Chaque argument de cette fonction correspond à une directive du fichier de
# configuration et doit être de la forme name[=value]
# Toutes les directives de ce noms sont recherchées et commentées. La valeur
# si elle est spécifiée, est ignorée. Si la directive ne figure pas dans le
# fichier, c'est un NOP.
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
local conf="$1"; shift
[ -n "$*" ] || return 1
local mode="$(fix_mode "$conf")"
local modified=1
local param name value from0 from1
for param in "$@"; do
splitvar "$param" name value
# Essayer simplement de commenter la directive dans le fichier
from0="^[ $TAB]*export[ $TAB]*$name[ $TAB]*="
from1="^[ $TAB]*$name[ $TAB]*="
if [ "$name" != "$param" ]; then
from0="$from0$(quote_seds "$value")\$"
from1="$from1$(quote_seds "$value")\$"
fi
if quietgrep "$from" "$conf"; then
sedi "\
/$from0/s/^/#/g
/$from1/s/^/#/g
" "$conf"
modified=0
fi
done
unfix_mode "$conf" "$mode"
return $modified
}
CONF_APPEND_SEP=:
function conf_append() {
# Dans le fichier de configuration $1, augmenter les valeurs des variables
# correspondant aux paramètres $2..*
# Chaque argument de cette fonction correspond à une variable du fichier de
# configuration, et doit être de la forme name=value
# Une ligne 'name="${name:+$name:}$value"' est générée à la fin du fichier
# de configuration.
# Par défaut, le séparateur CONF_APPEND_SEP vaut ':', mais il est possible
# de changer cette valeur, de façon globale
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
local conf="$1"; shift
[ -n "$*" ] || return 1
local mode="$(fix_mode "$conf")"
local modified=1
local param name value from
for param in "$@"; do
splitvar "$param" name value
echo "$name=\"\${$name:+\$$name$CONF_APPEND_SEP}$(quote_arg "$value")\"" >>"$conf"
modified=0
done
unfix_mode "$conf" "$mode"
return $modified
}
function conf_array_append() {
# Dans le fichier de configuration $1, augmenter les valeurs des variables
# de tableau correspondant aux paramètres $2..*
# Chaque argument de cette fonction correspond à une variable du fichier de
# configuration, et doit être de la forme name=value
# Une ligne name=("${name[@]}" "$value") est générée à la fin du fichier de
# configuration
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
local conf="$1"; shift
[ -n "$*" ] || return 1
local mode="$(fix_mode "$conf")"
local modified=1
local param name value from
for param in "$@"; do
splitvar "$param" name value
if quietgrep "^[ $TAB]*\(export[ $TAB]*\)\?$name=(" "$conf"; then
# variable déjà existante
[ "$name" != "$param" ] || continue
echo "$name=(\"\${$name[@]}\" $(quoted_arg "$value"))" >>"$conf"
else
# nouvelle variable
if [ "$name" != "$param" ]; then
echo "$name=($(quoted_arg "$value"))" >>"$conf"
else
echo "$name=()" >>"$conf"
fi
fi
modified=0
done
unfix_mode "$conf" "$mode"
return $modified
}
function conf_check() {
# Dans le fichier de configuration $1, tester si tous les paramètres $2..*
# sont présents.
# Chaque argument de cette fonction correspond à une variable du fichier de
# configuration, et doit être de la forme name[=value]
# Si une valeur est spécifiée, vérifier que le fichier contient la valeur
# correspondante. Sinon, tester uniquement la présence de la directive.
local conf="$1"; shift
[ -n "$*" ] || return 1
local param name value from
for param in "$@"; do
splitvar "$param" name value
from="^[ $TAB]*\(export[ $TAB]*\)\?$name[ $TAB]*="
if [ "$name" != "$param" ]; then
from="$from$(quote_seds "$value")\$"
fi
quietgrep "$from" "$conf" || return 1
done
return 0
}
################################################################################
# Gestion des fichiers de configuration où les directives sont de la forme 'name
# value', et où les commentaires débutent par '#'. C'est typiquement le cas des
# fichiers de configuration d'apache
function aconf_enable() {
# Dans le fichier de configuration $1, activer les paramètres $2..*
# Chaque argument de cette fonction correspond à une directive du fichier de
# configuration et doit être de la forme name[=value]
# Toutes les directives de ce nom sont recherchées et décommentées, et la
# valeur mise à jour. Si la directive ne figure pas dans le fichier, elle y
# est rajoutée à la fin. A cause du mode opératoire, cette fonction ne
# convient pas pour les directives dont le nom peut apparaitre plusieurs
# fois dans le fichier
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
local conf="$1"; shift
[ -n "$*" ] || return 1
local mode="$(fix_mode "$conf")"
local modified=1
local param name value to
for param in "$@"; do
splitvar "$param" name value
# Essayer d'abord de décommenter la valeur dans le fichier
if quietgrep "^[ $TAB]*##*[ $TAB]*$name[ $TAB]*" "$conf"; then
sedi "/^[ $TAB]*##*[ $TAB]*$name[ $TAB]*/s/^[ $TAB]*##*\([ $TAB]*\)/\\1/g" "$conf"
modified=0
elif ! quietgrep "^[ $TAB]*$name[ $TAB]*" "$conf"; then
echo "$name" >>"$conf"
modified=0
fi
if [ "$name" != "$param" ]; then
# Ensuite, mettre à jour le fichier avec la valeur spécifiée
to="$(quote_seds "$value")"
sedi "\
/^[ $TAB]*$name[ $TAB][ $TAB]*/s/^\([ $TAB]*$name[ $TAB]*\).*$/\\1$to/
/^[ $TAB]*$name\$/s/^\([ $TAB]*$name\)\$/\\1 $to/" "$conf"
modified=0
fi
done
unfix_mode "$conf" "$mode"
return $modified
}
function aconf_disable() {
# Dans le fichier de configuration $1, désactiver les paramètres $2..*
# Chaque argument de cette fonction correspond à une directive du fichier de
# configuration et doit être de la forme name[=value]
# Si la valeur est précisée, la directive correspondant à ce nom et cette
# valeur est recherchée et commentée. Sinon, toutes les directives de ce
# noms sont recherchées et commentées. Si la directive ne figure pas dans le
# fichier, c'est un NOP.
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
local conf="$1"; shift
[ -n "$*" ] || return 1
local mode="$(fix_mode "$conf")"
local modified=1
local param name value from
for param in "$@"; do
splitvar "$param" name value
# Essayer simplement de commenter la valeur dans le fichier
from="^[ $TAB]*$name[ $TAB]*"
if [ "$name" != "$param" ]; then
from="$from$(quote_seds "$value")\$"
fi
if quietgrep "$from" "$conf"; then
sedi "/$from/"'s/^/#/g' "$conf"
modified=0
fi
done
unfix_mode "$conf" "$mode"
return $modified
}
function aconf_append() {
# Dans le fichier de configuration $1, ajouter des directives correspondant
# aux paramètres $2..*
# Chaque argument de cette fonction correspond à une directive du fichier de
# configuration et doit être de la forme name=value
# Une ligne '$name $value' est ajoutée à la fin du fichier de configuration
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
local conf="$1"; shift
[ -n "$*" ] || return 1
local mode="$(fix_mode "$conf")"
local modified=1
local param name value from
for param in "$@"; do
splitvar "$param" name value
echo "$name${value:+ $value}" >>"$conf"
modified=0
done
unfix_mode "$conf" "$mode"
return $modified
}
function aconf_array_append() { aconf_append "$@"; }
function aconf_check() {
# Dans le fichier de configuration $1, tester si tous les paramètres $2..*
# sont présents.
# Chaque argument de cette fonction correspond à une variable du fichier de
# configuration, et doit être de la forme name[=value]
# Si une valeur est spécifiée, vérifier que le fichier contient la valeur
# correspondante. Sinon, tester uniquement la présence de la directive.
local conf="$1"; shift
[ -n "$*" ] || return 1
local param name value from
for param in "$@"; do
splitvar "$param" name value
from="^[ $TAB]*$name[ $TAB]*"
if [ "$name" != "$param" ]; then
from="$from$(quote_seds "$value")\$"
fi
quietgrep "$from" "$conf" || return 1
done
return 0
}
################################################################################
# Gestion des fichiers de configuration où les directives sont placées dans des
# sections identifiées par une chaine de la forme [section]. Les directives sont
# de la forme 'name=value', et les commentaires débutent par '#' ou ';'. C'est
# typiquement le cas des fichiers de configuration de MySQL (my.cnf) et de PHP
# (php.ini)
function mconf_enable() {
# Dans le fichier de configuration $1, activer les paramètres $3..* de la
# section $2
# Chaque argument de cette fonction correspond à une directive du fichier de
# configuration et doit être de la forme name[=value]
# Toutes les directives de ce nom sont recherchées et décommentées, et la
# valeur mise à jour. Si la directive ne figure pas dans le fichier, elle y
# est rajoutée à la fin. A cause du mode opératoire, cette fonction ne
# convient pas pour les directives dont le nom peut apparaitre plusieurs
# fois dans le fichier
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
# Cette fonction nécessite gawk et ignore la locale
local conf="$1"; shift
local section="$1"; shift
[ -n "$*" ] || return 1
local script i param name value
script="BEGIN {
modified = 1
section = $(quoted_awk "$section")
in_section = 0"
i=0
for param in "$@"; do
splitvar "$param" name value
script="$script
names[$i] = $(quoted_awk "$name")"
if [ "$name" != "$param" ]; then
script="$script
hasvalues[$i] = 1
values[$i] = $(quoted_awk "$value")"
else
script="$script
hasvalues[$i] = 0
values[$i] = \"\""
fi
script="$script
seen[$i] = 0"
let i=$i+1
done
script="$script"'
}
function write_unseen(write_section, wrote_section) {
for (i in seen) {
if (!seen[i]) {
if (write_section && !wrote_section) {
print "[" section "]"
wrote_section = 1
}
print names[i] "=" values[i]
seen[i] = 1
modified = 0
}
}
}
/^\[.*\]/ {
was_in_section = in_section
match($0, /^\[(.*)\]/, vs)
in_section = (vs[1] == section)
if (!in_section && was_in_section) {
write_unseen()
}
}
'
i=0
for param in "$@"; do
splitvar "$param" name value
script="$script
in_section && \$0 ~ /^[ $TAB]*((##*|;;*)[ $TAB]*)?$name[ $TAB]*=/ {
\$0 = gensub(/^[ $TAB]*(##*|;;*)[ $TAB]*($name[ $TAB]*=)/, \"\\\\2\", \"\")
if (hasvalues[$i]) {
\$0 = gensub(/^([ $TAB]*$name[ $TAB]*=[ $TAB]*).*\$/, \"\\\\1\" values[$i], \"\")
}
seen[$i] = 1
modified = 0
}"
let i=$i+1
done
script="$script
{ print }
END {
write_unseen(!in_section)
exit modified
}"
local tmpfile; ac_set_tmpfile tmpfile
local mode="$(fix_mode "$conf")"
local modified=1
if <"$conf" >"$tmpfile" cawk "$script"; then
cat "$tmpfile" >"$conf"
modified=0
fi
unfix_mode "$conf" "$mode"
ac_clean "$tmpfile"
return $modified
}
function mconf_disable() {
# Dans le fichier de configuration $1, désactiver les paramètres $3..* de la
# section $2.
# Chaque argument de cette fonction correspond à une directive du fichier de
# configuration et doit être de la forme name[=value]
# Si la valeur est précisée, la directive correspondant à ce nom et cette
# valeur est recherchée et commentée. Sinon, toutes les directives de ce
# noms sont recherchées et commentées. Si la directive ne figure pas dans le
# fichier, c'est un NOP.
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
# Cette fonction nécessite gawk et ignore la locale
local conf="$1"; shift
local section="$1"; shift
[ -n "$*" ] || return 1
local script match
script="BEGIN {
modified = 1
section = $(quoted_awk "$section")
in_section = 0
"
local param name value
for param in "$@"; do
splitvar "$param" name value
match="${match:+$match || }\$0 ~ /^[ $TAB]*$name[ $TAB]*="
if [ "$name" != "$param" ]; then
match="$match[ $TAB]*$(quote_seds "$value")\$"
fi
match="$match/"
done
script="$script
}"'
/^\[.*\]/ {
match($0, /^\[(.*)\]/, vs)
in_section = (vs[1] == section)
}
in_section && ('"$match"') {
$0 = "#" $0
modified = 0
}
{ print }
END {
exit modified
}
'
local tmpfile; ac_set_tmpfile tmpfile
local mode="$(fix_mode "$conf")"
local modified=1
if <"$conf" >"$tmpfile" cawk "$script"; then
cat "$tmpfile" >"$conf"
modified=0
fi
unfix_mode "$conf" "$mode"
ac_clean "$tmpfile"
return $modified
}
function mconf_append() {
# Dans le fichier de configuration $1, ajouter des directives correspondant
# aux paramètres $3..* dans la section $2
# Chaque argument de cette fonction correspond à une directive du fichier de
# configuration et doit être de la forme name=value
# Une ligne '$name = $value' est ajoutée à la fin de la section, qui est
# créée si nécessaire à la fin du fichier de configuration
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
# Cette fonction nécessite gawk et ignore la locale
local conf="$1"; shift
local section="$1"; shift
[ -n "$*" ] || return 1
local script match
script="BEGIN {
modified = 1
section=$(quoted_awk "$section")
in_section=0
"
i=0
for param in "$@"; do
splitvar "$param" name value
script="$script
names[$i] = $(quoted_awk "$name")
values[$i] = $(quoted_awk "$value")
seen[$i] = 0"
let i=$i+1
done
script="$script"'
}
function write_vars(write_section, wrote_section) {
for (i in seen) {
if (!seen[i]) {
if (write_section && !wrote_section) {
print "[" section "]"
wrote_section = 1
}
print names[i] "=" values[i]
seen[i] = 1
modified = 0
}
}
}
/^\[.*\]/ {
was_in_section = in_section
match($0, /^\[(.*)\]/, vs)
in_section = (vs[1] == section)
if (!in_section && was_in_section) {
write_vars()
}
}
{ print }
END {
write_vars(!in_section)
exit modified
}'
local tmpfile; ac_set_tmpfile tmpfile
local mode="$(fix_mode "$conf")"
local modified=1
if <"$conf" >"$tmpfile" cawk "$script"; then
cat "$tmpfile" >"$conf"
modified=0
fi
unfix_mode "$conf" "$mode"
ac_clean "$tmpfile"
return $modified
}
function mconf_array_append() { mconf_append "$@"; }
function mconf_check() {
# Dans le fichier de configuration $1, tester si tous les paramètres $3..*
# sont présents dans la section $2
# Chaque argument de cette fonction correspond à une variable du fichier de
# configuration, et doit être de la forme name[=value]
# Si une valeur est spécifiée, vérifier que le fichier contient la valeur
# correspondante. Sinon, tester uniquement la présence de la directive.
# Cette fonction nécessite gawk et ignore la locale
local conf="$1"; shift
local section="$1"; shift
[ -n "$*" ] || return 1
local script i param name value
script="BEGIN {
section = $(quoted_awk "$section")
in_section = 0"
i=0
for param in "$@"; do
splitvar "$param" name value
script="$script
names[$i] = $(quoted_awk "$name")
values[$i] = $(quoted_awk "$value")
seen[$i] = 0"
let i=$i+1
done
script="$script"'
}
/^\[.*\]/ {
match($0, /^\[(.*)\]/, vs)
in_section = (vs[1] == section)
}
'
i=0
for param in "$@"; do
splitvar "$param" name value
script="$script
in_section && \$0 ~ /^[ $TAB]*$name[ $TAB]*="
if [ "$name" != "$param" ]; then
script="$script$(quote_seds "$value")\$"
fi
script="$script/ {
seen[$i] = 1
}"
let i=$i+1
done
script="$script
END {
for (i in seen) {
if (!seen[i]) exit 1
}
exit 0
}"
<"$conf" cawk "$script"
}
################################################################################
# Gestion de fichiers de configuration générique
function gconf_addline() {
# USAGE
# gconf_addline configfile -a BEGIN -z END NEWLINE
# Dans le fichier de configuration $1, ajouter la ligne NEWLINE entre les lignes
# BEGIN et END.
# -a BEGIN
# Spécifier une expression pour matcher une ligne de type BEGIN. Si
# cette option n'est pas spécifiée, on considère que le début de fichier
# matche la ligne BEGIN: la ligne NEWLINE est ajoutée dès que possible.
# Les lignes sont matchées dans l'ordre, i.e. avec '-a 1 -a 2', il faut
# d'abord trouver la ligne 1 puis la ligne 2, sinon, le test n'est pas
# concluant.
# -t LINE
# Si après avoir matché toutes les lignes BEGIN, la ligne LINE est
# rencontrée, alors considérer que la ligne à rajouter existe déjà et
# qu'il ne faut pas la rajouter de nouveau
# -r LINE
# Si après avoir matché toutes les lignes BEGIN, la ligne LINE est
# rencontrée, alors considérer que la ligne à rajouter existe et qu'il
# faut la mettre à jour. Supprimer la ligne existante et la remplacer
# par la nouvelle ligne.
# -z END
# Spécifier une expression pour matcher la ligne de type END. Que cette
# option soit ou non spécifiée, on considère toujours que la fin de
# fichier matche la ligne END. Ainsi, si END n'est pas trouvée, la ligne
# NEWLINE est ajoutée à la fin du fichier.
# Dès que la ligne END est rencontrée, et si aucun des tests -t ou -r
# n'est concluant, alors ajouter la nouvelle ligne avant celle-ci
# -n MAX[=1]
# Ajouter au plus MAX occurences de NEWLINE. Après avoir matché END, le
# cycle recommence, au plus MAX-1 fois. Utiliser MAX=-1 pour désactiver
# la limite
# Cette fonction nécessite gawk et ignore la locale
# Retourner 0 si l'ajout s'est fait correctement. Retourner 1 si BEGIN n'a
# pas été trouvé, et donc aucun ajout n'a été effectué. Retourner 2 si une
# erreur quelconque s'est produite
eval "$(utools_local)"
local -a beginlines newlines
local testline replaceline endline max
parse_opts "${PRETTYOPTS[@]}" \
-a:,--begin: beginlines \
-t:,--test: testline= \
-r:,--replace: replaceline= \
-z:,--end: endline= \
-n:,--max: max= \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 2
}
conf="$1"; shift
[ -n "$conf" ] || {
eerror "Vous devez spécifier le fichier à modifier"
return 2
}
[ -f "$conf" ] || {
eerror "$conf: fichier introuvable"
return 2
}
[ $# -gt 0 ] || {
eerror "Vous devez spécifier la ligne à rajouter"
return 2
}
[ -n "$max" ] || max=1
newlines=("$@")
# générer le script
local script="$(awkdef -f beginlines[@] testline="$testline" replaceline="$replaceline" endline="$endline" max:int="$max" newlines[@])"'
BEGIN {
searchindex = 1
found = 0
writeline = 1
if (beginlines_count == 0) found = 1
modified = 0
}
function writelines_maybe() {
if (writeline) {
for (i = 1; i <= newlines_count; i++) {
print newlines[i]
}
writeline = 0
modified = 1
}
}
max != 0 && !found && searchindex <= length(beginlines) && $0 ~ beginlines[searchindex] {
searchindex++
if (searchindex > length(beginlines)) {
found = 1
}
print; next
}
max != 0 && found && writeline && testline != "" && $0 ~ testline {
writeline = 0
print; next
}
max != 0 && found && writeline && replaceline != "" && $0 ~ replaceline {
writelines_maybe()
next
}
max != 0 && found && writeline && endline != "" && $0 ~ endline {
writelines_maybe()
searchindex = 1
found = 0
writeline = 1
if (max > 0) max--
print; next
}
{ print }
END {
if (max != 0 && found && writeline) {
writelines_maybe()
}
if (modified) exit 0
else exit 1
}
'
edebug "$script"
# traiter le fichier
local tmpfile; ac_set_tmpfile tmpfile
local mode="$(fix_mode "$conf")"
local modified=1
if <"$conf" >"$tmpfile" cawk "$script"; then
cat "$tmpfile" >"$conf"
modified=0
fi
unfix_mode "$conf" "$mode"
ac_clean "$tmpfile"
return $modified
}

View File

@@ -1,282 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion du fichier crontab
##@cooked nocomments
##@require base
uprovide crontab
urequire base
# Ajouter la ligne $1 au crontab de l'utilisateur $2
# Le code de retour est 123 si la ligne est déjà présente
function add_to_crontab() {
local -a crontab=(crontab ${2:+-u "$2"})
local current="$("${crontab[@]}" -l 2>/dev/null)"
local tmpfile
ac_set_tmpfile tmpfile
if [ -n "$current" ]; then
echo "$current" >"$tmpfile"
fi
local NL=$'\n'
if quietgrep -xF "$1$NL#$1" "$tmpfile"; then
ac_clean "$tmpfile"
return 123
else
echo "$1" >>"$tmpfile"
"${crontab[@]}" "$tmpfile"
ac_clean "$tmpfile"
fi
}
# Supprimer la ligne $1 du crontab de l'utilisateur $2
# Le code de retour est 123 si la ligne a déjà été supprimée
function remove_from_crontab() {
local -a crontab=(crontab ${2:+-u "$2"})
local current="$("${crontab[@]}" -l 2>/dev/null)"
local tmpfile
ac_set_tmpfile tmpfile
if [ -n "$current" ]; then
echo "$current" >"$tmpfile"
fi
local NL=$'\n'
if ! quietgrep -xF "$1$NL#$1" "$tmpfile"; then
ac_clean "$tmpfile"
return 123
else
grep -vxF "$1$NL#$1" "$tmpfile" | "${crontab[@]}" -
ac_clean "$tmpfile"
fi
}
# Désactiver la ligne $1 du crontab de l'utilisateur $2 en mettant '#' devant. Si
# la ligne n'existe pas, elle est ajoutée mais commentée.
# Le code de retour est 123 si la ligne est déjà désactivée
function disable_in_crontab() {
local -a crontab=(crontab ${2:+-u "$2"})
local current="$("${crontab[@]}" -l 2>/dev/null)"
local tmpfile
ac_set_tmpfile tmpfile
if [ -n "$current" ]; then
echo "$current" >"$tmpfile"
fi
local NL=$'\n'
if ! quietgrep -xF "$1$NL#$1" "$tmpfile"; then
echo "#$1" >>"$tmpfile"
"${crontab[@]}" "$tmpfile"
elif quietgrep -xF "#$1" "$tmpfile"; then
ac_clean "$tmpfile"
return 123
else
<"$tmpfile" awkrun line="$1" '$0 == line { $0 = "#" $0 } { print }' | "${crontab[@]}" -
ac_clean "$tmpfile"
fi
}
# Activer la ligne $1 du crontab de l'utilisateur $2 en enlevant '#' devant. Si
# la ligne n'existe pas, elle est ajoutée.
# Le code de retour est 123 si la ligne est déjà activée
function enable_in_crontab() {
local -a crontab=(crontab ${2:+-u "$2"})
local current="$("${crontab[@]}" -l 2>/dev/null)"
local tmpfile
ac_set_tmpfile tmpfile
if [ -n "$current" ]; then
echo "$current" >"$tmpfile"
fi
local NL=$'\n'
if ! quietgrep -xF "$1$NL#$1" "$tmpfile"; then
echo "$1" >>"$tmpfile"
"${crontab[@]}" "$tmpfile"
elif quietgrep -xF "$1" "$tmpfile"; then
ac_clean "$tmpfile"
return 123
else
<"$tmpfile" awkrun line="$1" '$0 == "#" line { sub(/^#/, "") } { print }' | "${crontab[@]}" -
ac_clean "$tmpfile"
fi
}
# Afficher la spécification crontab correspondant à l'heure courante
function ctnow() {
date +"%-M %-H %-d %-m %u"
}
# Analyser STDIN qui contient des lignes au format crontab, et afficher des
# commandes pour les lignes correspondant à la date courante.
# Les commandes sont de la forme "export var=value" pour la définition d'une
# variable, "__ctexec 'cmd'" pour exécuter la commande correspondante ou
# "__cterror 'msg'" en cas d'erreur de syntaxe sur une ligne. Il faut bien
# entendu définir les function __ctexec et __cterror.
# Cette fonction s'utilise de cette manière:
# function __ctexec() { eval "$*"; }
# function __cterror() { die "$*"; }
# eval "$(ctresolve <crontab)"
function ctresolve() {
local -a ctnow
eval "ctnow=($(ctnow))"
filter_conf | awkrun -f ctnow[@] '
function ctmatch(ctval, ref, parts, part, i, j, start, end, step, ok) {
ok = 0
split(ctval, parts, /,/)
for(i = 1; i <= length(parts); i++) {
part = parts[i]
start = -1; end = -1; step = 1
# extraire /step
pos = index(part, "/")
if (pos != 0) {
step = substr(part, pos + 1) + 0
part = substr(part, 1, pos - 1)
}
# traiter start-end
pos = index(part, "-")
if (pos != 0) {
start = substr(part, 1, pos - 1) + 0
end = substr(part, pos + 1) + 0
} else {
start = part + 0
end = start
}
# tester si ça matche
#print "start=" start ", end=" end ", step=" step", ref=" ref #DEBUG
for (j = start; j <= end; j += step) {
if (j == ref) {
ok = 1
break
}
}
if (ok) break
}
return ok
}
BEGIN {
refM = ctnow[1]; refH = ctnow[2]; refdom = ctnow[3]; refmon = ctnow[4]; refdow = ctnow[5]
ctref = refM " " refH " " refdom " " refmon " " refdow
print "##now: " ctref
match_ctline = 0
match_indented = 0
}
/^(export[ \t]+)?[a-zA-Z_][a-zA-Z0-9_]*[-+%#?]=/ {
# manipulation de variables de type PATH
match($0, /^(export[ \t]+)?([a-zA-Z_][a-zA-Z0-9_]*)([-+%#?])=(.*)$/, parts)
name = parts[2]
type = parts[3]
value = parts[4]
if (type == "+" || type == "%") {
print "uaddpath " value " " name
} else if (type == "#") {
print "uinspath " value " " name
} else if (type == "-") {
print "udelpath " value " " name
} else if (type == "?") {
print "[ -n \"$" name "\" ] || " name "=" value
}
print "export " name
next
}
/^(export[ \t]+)?[a-zA-Z_][a-zA-Z0-9_]*=/ {
# spécification de variable
sub(/^export[ \t]+/, "", $0)
print "export " $0
next
}
/^\$.+/ {
# exécution de commande arbitraire
if ($0 ~ /^\$\{([ \t]*(#.*)?)?$/) {
# commande sur plusieurs lignes
getline
while ($0 !~ /^\$\}([ \t]*(#.*)?)?$/) {
print
if (getline <= 0) break
}
} else {
# commande sur une seule ligne
sub(/^\$/, "", $0)
print
}
next
}
/^[ \t]*[-0-9/*,]+[ ]*[-0-9/*,]+[ ]*[-0-9/*,]+[ ]*[-0-9/*,]+[ ]*[-0-9/*,]+/ {
# ligne de planification
M = $1; H = $2; dom = $3; mon = $4; dow = $5
sub(/^[ ]*[^ ]+[ ]+[^ ]+[ ]+[^ ]+[ ]+[^ ]+[ ]+[^ ]+[ ]*/, "", $0)
if (!match_ctline) match_indented = 0
ctline = M " " H " " dom " " mon " " dow
gsub(/\*/, "0-59", M)
Mok = ctmatch(M, refM)
gsub(/\*/, "0-23", H)
Hok = ctmatch(H, refH)
gsub(/\*/, "1-31", dom)
domok = ctmatch(dom, refdom)
gsub(/\*/, "1-12", mon)
monok = ctmatch(mon, refmon)
gsub(/\*/, "1-7", dow)
dowok = ctmatch(dow, refdow)
if (Mok && Hok && monok && (domok || dowok)) {
print "##matches: " ctline
match_ctline = 1
match_indented = 1
}
if (match_ctline && $0 != "") {
print "__ctexec " quote_value($0)
match_ctline = 0
}
next
}
/^[ \t]+/ {
if (match_indented) {
# il faut matcher les commandes indentees
sub(/^[ \t]+/, "", $0)
print "__ctexec " quote_value($0)
}
next
}
{
print "__cterror " quote_value("ligne de format incorrect: " $0)
}
'
}
## Préfixes
function get_default_crontabdir_prefix() {
if check_sysinfos -s darwin; then
if check_sysinfos -d 10.6+; then
echo /var/at/tabs
else
echo /var/cron/tabs
fi
elif check_sysinfos -s linux; then
if check_sysinfos -d debianlike; then
echo /var/spool/cron/crontabs
elif check_sysinfos -d redhatlike; then
echo /var/spool/cron
fi
fi
}
__crontab_prefixes=
function __compute_crontab_prefixes() {
[ -n "$__crontab_prefixes" ] && return
CRONTABDIR="${CRONTABDIR:-$(get_default_crontabdir_prefix)}"
__crontab_prefixes=1
}
UTOOLS_PREFIXES=("${UTOOLS_PREFIXES[@]}" CRONTABDIR)
function compute_crontab_prefixes() {
__compute_crontab_prefixes
}
function recompute_crontab_prefixes() {
__crontab_prefixes=
__compute_crontab_prefixes
}
function get_CRONTABDIR_prefix() {
__compute_crontab_prefixes
echo "$CRONTABDIR"
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,127 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Des outils de haut niveau pour installer des fichiers de configuration
##@cooked nocomments
##@require base
uprovide install
urequire base
# Faut-il afficher le nom des fichiers copié/créés?
INSTALL_VERBOSE=1
# Faut-il afficher les destinations avec ppath?
INSTALL_USES_PPATH=
function ensure_exists() {
# créer le fichier vide "$1" s'il n'existe pas déjà. retourner vrai si le
# fichier a été créé sans erreur
[ -f "$1" ] || {
if [ -n "$INSTALL_VERBOSE" ]; then
if [ -n "$INSTALL_USES_PPATH" ]; then
estep "$(ppath "$1")"
else
estep "$1"
fi
fi
mkdirof "$1"
touch "$1"
return $?
}
return 1
}
function copy_replace() {
# Copier de façon inconditionnelle le fichier $1 vers le fichier $2
local src="$1" dest="$2"
local srcname="$(basename "$src")"
[ -d "$dest" ] && dest="$dest/$srcname"
mkdirof "$dest" || return 1
if [ -n "$INSTALL_VERBOSE" ]; then
local msg destname
if [ -n "$INSTALL_USES_PPATH" ]; then
msg="$srcname --> $(ppath "$(dirname "$dest")")/"
else
msg="$srcname --> $(dirname "$dest")/"
fi
destname="$(basename "$dest")"
[ "$srcname" == "$destname" ] || msg="$msg$destname"
estep "$msg"
fi
cp "$src" "$dest"
}
function copy_new() {
# copier le fichier "$1" vers le fichier "$2"
# Ne pas écraser le fichier destination s'il existe déjà
# Retourner vrai si le fichier a été copié sans erreur
local src="$1" dest="$2"
[ -d "$dest" ] && dest="$dest/$(basename "$src")"
mkdirof "$dest" || return 1
if [ ! -e "$dest" ]; then
copy_replace "$src" "$dest"
else
return 1
fi
}
function copy_update() {
# copier le fichier "$1" vers le fichier "$2", si $2 n'existe pas, ou si $1
# a été modifié par rapport à $2.
# Retourner vrai si le fichier a été copié sans erreur.
local src="$1" dest="$2"
[ -d "$dest" ] && dest="$dest/$(basename "$src")"
mkdirof "$dest" || return 1
if [ ! -e "$dest" ]; then
copy_replace "$src" "$dest"
elif testdiff "$src" "$dest"; then
copy_replace "$src" "$dest"
else
return 1
fi
}
function copy_update_ask() {
# Copier ou mettre à jour le fichier $1 vers le fichier $2.
# Si le fichier existe déjà, la différence est affichée, et une confirmation
# est demandée pour l'écrasement du fichier.
# Retourner vrai si le fichier a été copié sans erreur.
local src="$1" dest="$2"
[ -d "$dest" ] && dest="$dest/$(basename "$src")"
mkdirof "$dest" || return 1
[ -f "$dest" ] || copy_replace "$src" "$dest"
if testdiff "$src" "$dest"; then
diff -u "$dest" "$src"
if ask_yesno -c "Voulez-vous remplacer $(ppath "$dest") par la nouvelle version?" C; then
copy_replace "$src" "$dest"
return $?
fi
fi
return 1
}
function copy_tree() {
# Copier de façon inconditionnelle l'arborescence $1 dans l'arborescence $2
local srcdir="$1" destdir="$2"
mkdir -p "$destdir" || return 1
cpdirnovcs "$srcdir" "$destdir"
}
function link_new() {
# Si $2 n'existe pas, créer le lien symbolique $2 pointant vers $1
[ -e "$2" ] && return 0
if [ -n "$INSTALL_VERBOSE" ]; then
if [ -n "$INSTALL_USES_PPATH" ]; then
estep "$(basename "$2") --> $(ppath "$(dirname "$1")")"
else
estep "$(basename "$2") --> $(dirname "$1")"
fi
fi
ln -s "$1" "$2"
}

View File

@@ -1,198 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Calculateur d'adresse IP
##@cooked nocomments
##@require base
uprovide ipcalc
urequire base
function get_random_kvm_macaddr() {
# Obtenir une adresse mac au hasard commençant par 52:54:00 pour KVM
echo "52:54:00:$(awk 'BEGIN {srand(); printf("%02X:%02X:%02X", rand()*256, rand()*256, rand()*256)}' 2>/dev/null)"
}
function ipcalc_splitipmask() {
# Découper $1 de la forme ip[/mask] entre l'adresse ip, qui est placé dans
# la variable $2(=ip) et le masque, qui est placée dans la variable
# $3(=mask)
if [[ "$1" == */* ]]; then
set_var "${2:-ip}" "${1%%/*}"
set_var "${3:-mask}" "${1#*/}"
else
set_var "${2:-ip}" "$1"
set_var "${3:-mask}"
fi
}
function ipcalc_checkip() {
# Vérifier l'adresse ip $1 pour voir si elle est valide. Si l'adresse est
# valide, l'afficher. Sinon, retourner 1
awkrun status=0 '{
# si l"adresse ne fait pas la taille voulue, rajouter des .0
ip = $0
gsub(/[^.]/, "", ip)
count = length(ip)
while (count < 3) {
$0 = $0 ".0"
count++
}
# puis tester la validité
if ($0 !~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) {
status = 1
exit
}
match($0, /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/, ps)
for (i = 1; i <= 4; i++) {
p = 0 + ps[i]
if (p > 255) {
status = 1
exit
}
}
print $0
}
END { exit status }' <<<"$1"
}
function ipcalc_checkmask() {
# vérifier le masque de sous-réseau $1 pour voir si elle est valide. Si oui,
# afficher le suffixe (0, 8, 16, 24, 32) associé. Sinon retourner 1
case "$1" in
0|0.0.0.0) echo 0;;
8|255.0.0.0) echo 8;;
16|255.255.0.0) echo 16;;
24|255.255.255.0) echo 24;;
32|255.255.255.255) echo 32;;
*) return 1;;
esac
return 0
}
function ipcalc_netmask() {
# à partir d'un suffixe (0, 8, 16, 24, 32) ou d'un masque de sous-réseau,
# afficher le masque de sous-réseau. si le suffixe ou le masque ne sont pas
# reconnus, retourner 1
case "$1" in
0|0.0.0.0) echo 0.0.0.0;;
8|255.0.0.0) echo 255.0.0.0;;
16|255.255.0.0) echo 255.255.0.0;;
24|255.255.255.0) echo 255.255.255.0;;
32|255.255.255.255) echo 255.255.255.255;;
*) return 1;;
esac
return 0
}
function ipcalc_broadcast() {
# Calculer l'adresse de broadcast correspondant à l'adresse ip $1. Le masque
# de sous-réseau peut-être indiqué dans l'adresse ip avec le suffixe /n ou
# /x.x.x.x ou donné dans l'argument $2. Seuls les suffixes 0, 8, 16, 24, 32
# sont supportés.
# Retourner 1 si un erreur s'est produite, par exemple si l'adresse ou le
# suffixe sont invalides ou non supportés.
[ -n "$1" ] || return
local ip mask
ipcalc_splitipmask "$1" ip mask
[ -n "$mask" ] || mask="$2"
[ -n "$mask" ] || mask=24
ip="$(ipcalc_checkip "$ip")" || return
mask="$(ipcalc_checkmask "$mask")" || return
case "$mask" in
0) echo "255.255.255.255";;
8) ip="${ip%.*.*.*}"; echo "$ip.255.255.255";;
16) ip="${ip%.*.*}"; echo "$ip.255.255";;
24) ip="${ip%.*}"; echo "$ip.255";;
32) echo "$ip";;
esac
}
function ipcalc_gateway() {
# Calculer l'adresse du gateway correspondant à l'adresse ip $1, en
# considérant que le gateway est la première adresse du réseau. Le masque de
# sous-réseau peut-être indiqué dans l'adresse ip avec le suffixe /n ou
# /x.x.x.x ou donné dans l'argument $2. Seuls les suffixes 0, 8, 16, 24, 32
# sont supportés.
# Retourner 1 si un erreur s'est produite, par exemple si l'adresse ou le
# suffixe sont invalides ou non supportés.
[ -n "$1" ] || return
local ip mask
ipcalc_splitipmask "$1" ip mask
[ -n "$mask" ] || mask="$2"
[ -n "$mask" ] || mask=24
ip="$(ipcalc_checkip "$ip")" || return
mask="$(ipcalc_checkmask "$mask")" || return
case "$mask" in
0) echo "0.0.0.1";;
8) ip="${ip%.*.*.*}"; echo "$ip.0.0.1";;
16) ip="${ip%.*.*}"; echo "$ip.0.1";;
24) ip="${ip%.*}"; echo "$ip.1";;
32) echo "$ip";;
esac
}
function ipcalc_match() {
# Vérifier si l'adresse $1 correspond au modèle $2, e.g.:
# ipcalc_match 10.75.0.23 10/8 --> TRUE
# ipcalc_match 10.75.0.23 10.75.0.0/24 --> TRUE
# ipcalc_match 10.75.0.23 10.75.0.28 --> FALSE
[ -n "$1" -a -n "$2" ] || return
local ip tip tmask
ipcalc_splitipmask "$2" tip tmask
[ -n "$tmask" ] || tmask=32
ip="$(ipcalc_checkip "$1")" || return
tip="$(ipcalc_checkip "$tip")" || return
tmask="$(ipcalc_checkmask "$tmask")" || return
case "$tmask" in
0) return 0;;
8) [ "${ip%.*.*.*}" == "${tip%.*.*.*}" ];;
16) [ "${ip%.*.*}" == "${tip%.*.*}" ];;
24) [ "${ip%.*}" == "${tip%.*}" ];;
32) [ "$ip" == "$tip" ];;
esac
}
function ipcalc_fqdn() {
# Calculer si possible le nom pleinement qualifié correspondant à l'hôte $1.
# Dans tous les cas, afficher l'hôte, mais retourner 1 si la calcul n'a pas
# pu être effectué.
local -a ips hosts
local ip host
if ! ips=("$(ipcalc_checkip "$1")"); then
resolv_ips ips "$1"
if [ -z "${ips[*]}" ]; then
echo "$1"
return 1
fi
fi
for ip in "${ips[@]}"; do
resolv_hosts hosts "$ip"
if [ -n "${hosts[*]}" ]; then
echo "${hosts[0]}"
return 0
fi
done
echo "$1"
return 1
}
function ipcalc_fqdn_maybe() {
# Si $1 *semble* déjà être un nom d'hôte pleinement qualifié, l'afficher tel
# quel. Sinon utiliser ipcalc_fqdn() pour afficher le nom d'hôte pleinement
# qualifié correspondant.
if ipcalc_checkip "$1" >/dev/null; then
ipcalc_fqdn "$1"
elif [[ "$1" == *.* ]]; then
echo "$1"
else
ipcalc_fqdn "$1"
fi
}

515
ulib/java
View File

@@ -1,515 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion de la sélection d'une version de Java
##@cooked nocomments
##@require base
##@require sysinfos
uprovide java
urequire base sysinfos
################################################################################
# versions installées sur le système
JAVA_VMS13=(); JAVA_HOMES13=()
JAVA_VMS14=(); JAVA_HOMES14=()
JAVA_VMS5=(); JAVA_HOMES5=()
JAVA_VMS6=(); JAVA_HOMES6=()
JAVA_VMS7=(); JAVA_HOMES7=()
# versions locales 32 bits
JAVA32_VMS13=(); JAVA32_HOMES13=()
JAVA32_VMS14=(); JAVA32_HOMES14=()
JAVA32_VMS5=(); JAVA32_HOMES5=()
JAVA32_VMS6=(); JAVA32_HOMES6=()
JAVA32_VMS7=(); JAVA32_HOMES7=()
# versions locales 64 bits
JAVA64_VMS5=(); JAVA64_HOMES5=()
JAVA64_VMS6=(); JAVA64_HOMES6=()
JAVA64_VMS7=(); JAVA64_HOMES7=()
# version sélectionnée
SELECTED_JAVA_VM=; SELECTED_JAVA_HOME=
SELECTED_JAVA=; SELECTED_JAVAC=
function __java_add() {
# Ajouter la valeur $2 à la liste JAVA$3_$1
array_add "JAVA${3}_${1}" "$2"
}
function __java_compute_vms() {
# calculer la liste de VMs disponibles et initialiser les tableaux
# JAVA{,32,64}_{VMS,HOMES}{13,14,5,6,7}
[ -z "$__COMPUTED_JAVA_VMS" ] || return
local vms vm v
if check_sysinfos -s linux; then
# D'abord chercher dans les JVMs installées manuellement dans
# ~/opt/jvm{32,64}
array_from_lines vms "$(list_dirs "$HOME/opt/jvm32" "sun-jdk-*")"
for vm in "${vms[@]}"; do
v="${vm#sun-jdk-}"
if [ "$v" == 1.4 ]; then
__java_add VMS14 "$vm" 32
__java_add HOMES14 "$HOME/opt/jvm32/$vm" 32
elif [ "$v" == 1.5 ]; then
__java_add VMS5 "$vm" 32
__java_add HOMES5 "$HOME/opt/jvm32/$vm" 32
elif [ "$v" == 1.6 ]; then
__java_add VMS6 "$vm" 32
__java_add HOMES6 "$HOME/opt/jvm32/$vm" 32
elif [ "$v" == 1.7 ]; then
__java_add VMS7 "$vm" 32
__java_add HOMES7 "$HOME/opt/jvm32/$vm" 32
fi
done
array_from_lines vms "$(list_dirs "$HOME/opt/jvm32" "j2sdk1.4.2*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS14 "$vm" 32
__java_add HOMES14 "$HOME/opt/jvm32/$vm" 32
done
array_from_lines vms "$(list_dirs "$HOME/opt/jvm32" "jdk1.5.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS5 "$vm" 32
__java_add HOMES5 "$HOME/opt/jvm32/$vm" 32
done
array_from_lines vms "$(list_dirs "$HOME/opt/jvm32" "jdk1.6.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS6 "$vm" 32
__java_add HOMES6 "$HOME/opt/jvm32/$vm" 32
done
array_from_lines vms "$(list_dirs "$HOME/opt/jvm32" "jdk1.7.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS7 "$vm" 32
__java_add HOMES7 "$HOME/opt/jvm32/$vm" 32
done
array_from_lines vms "$(list_dirs "$HOME/opt/jvm64" "sun-jdk-*")"
for vm in "${vms[@]}"; do
v="${vm#sun-jdk-}"
if [ "$v" == 1.5 ]; then
__java_add VMS5 "$vm" 64
__java_add HOMES5 "$HOME/opt/jvm64/$vm" 64
elif [ "$v" == 1.6 ]; then
__java_add VMS6 "$vm" 64
__java_add HOMES6 "$HOME/opt/jvm64/$vm" 64
elif [ "$v" == 1.7 ]; then
__java_add VMS7 "$vm" 64
__java_add HOMES7 "$HOME/opt/jvm64/$vm" 64
fi
done
array_from_lines vms "$(list_dirs "$HOME/opt/jvm64" "jdk1.5.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS5 "$vm" 64
__java_add HOMES5 "$HOME/opt/jvm64/$vm" 64
done
array_from_lines vms "$(list_dirs "$HOME/opt/jvm64" "jdk1.6.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS6 "$vm" 64
__java_add HOMES6 "$HOME/opt/jvm64/$vm" 64
done
array_from_lines vms "$(list_dirs "$HOME/opt/jvm64" "jdk1.7.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS7 "$vm" 64
__java_add HOMES7 "$HOME/opt/jvm64/$vm" 64
done
# Puis chercher dans les JVMs installées manuellement dans ~/opt
array_from_lines vms "$(list_dirs "$HOME/opt" "sun-jdk-*")"
for vm in "${vms[@]}"; do
v="${vm#sun-jdk-}"
if [ "$v" == 1.4 ]; then
__java_add VMS14 "$vm"
__java_add HOMES14 "$HOME/opt/$vm"
elif [ "$v" == 1.5 ]; then
__java_add VMS5 "$vm"
__java_add HOMES5 "$HOME/opt/$vm"
elif [ "$v" == 1.6 ]; then
__java_add VMS6 "$vm"
__java_add HOMES6 "$HOME/opt/$vm"
elif [ "$v" == 1.7 ]; then
__java_add VMS7 "$vm"
__java_add HOMES7 "$HOME/opt/$vm"
fi
done
array_from_lines vms "$(list_dirs "$HOME/opt" "j2sdk1.4.2*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS14 "$vm"
__java_add HOMES14 "$HOME/opt/$vm"
done
array_from_lines vms "$(list_dirs "$HOME/opt" "jdk1.5.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS5 "$vm"
__java_add HOMES5 "$HOME/opt/$vm"
done
array_from_lines vms "$(list_dirs "$HOME/opt" "jdk1.6.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS6 "$vm"
__java_add HOMES6 "$HOME/opt/$vm"
done
array_from_lines vms "$(list_dirs "$HOME/opt" "jdk1.7.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS7 "$vm"
__java_add HOMES7 "$HOME/opt/$vm"
done
# Puis chercher dans les JVMs installées manuellement dans /opt
array_from_lines vms "$(list_dirs "/opt" "sun-jdk-*")"
for vm in "${vms[@]}"; do
v="${vm#sun-jdk-}"
if [ "$v" == 1.4 ]; then
__java_add VMS14 "$vm"
__java_add HOMES14 "/opt/$vm"
elif [ "$v" == 1.5 ]; then
__java_add VMS5 "$vm"
__java_add HOMES5 "/opt/$vm"
elif [ "$v" == 1.6 ]; then
__java_add VMS6 "$vm"
__java_add HOMES6 "/opt/$vm"
elif [ "$v" == 1.7 ]; then
__java_add VMS7 "$vm"
__java_add HOMES7 "/opt/$vm"
fi
done
array_from_lines vms "$(list_dirs "/opt" "j2sdk1.4.2*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS14 "$vm"
__java_add HOMES14 "/opt/$vm"
done
array_from_lines vms "$(list_dirs "/opt" "jdk1.5.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS5 "$vm"
__java_add HOMES5 "/opt/$vm"
done
array_from_lines vms "$(list_dirs "/opt" "jdk1.6.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS6 "$vm"
__java_add HOMES6 "/opt/$vm"
done
array_from_lines vms "$(list_dirs "/opt" "jdk1.7.*" | LANG=C sort -r)"
for vm in "${vms[@]}"; do
__java_add VMS7 "$vm"
__java_add HOMES7 "/opt/$vm"
done
# Puis chercher dans les JVMs installées par le système dans
# /usr/lib/jvm
if check_sysinfos -d gentoo; then
# sur gentoo
array_from_lines vms "$(list_dirs /usr/lib/jvm)"
for vm in "${vms[@]}"; do
v="${vm#sun-jdk-}"
if [ "$v" == 1.4 ]; then
__java_add VMS14 "$vm"
__java_add HOMES14 "/usr/lib/jvm/$vm"
elif [ "$v" == 1.5 ]; then
__java_add VMS5 "$vm"
__java_add HOMES5 "/usr/lib/jvm/$vm"
elif [ "$v" == 1.6 ]; then
__java_add VMS6 "$vm"
__java_add HOMES6 "/usr/lib/jvm/$vm"
elif [ "$v" == 1.7 ]; then
__java_add VMS7 "$vm"
__java_add HOMES7 "/usr/lib/jvm/$vm"
fi
done
elif check_sysinfos -d debianlike; then
# sur debian
array_from_lines vms "$(list_dirs /usr/lib/jvm)"
for vm in "${vms[@]}"; do
v="${vm%-sun}"
v="${v#java-}"
v="${v#j2sdk}"
if [ "$v" == 1.4 ]; then
__java_add VMS14 "$vm"
__java_add HOMES14 "/usr/lib/jvm/$vm"
elif [ "$v" == 1.5 -o "$v" == 1.5.0 ]; then
__java_add VMS5 "$vm"
__java_add HOMES5 "/usr/lib/jvm/$vm"
elif [ "$v" == 6 -o "$v" == 1.6 ]; then
__java_add VMS6 "$vm"
__java_add HOMES6 "/usr/lib/jvm/$vm"
elif [ "$v" == 7 -o "$v" == 1.7 ]; then
__java_add VMS7 "$vm"
__java_add HOMES7 "/usr/lib/jvm/$vm"
fi
done
if [ -d /usr/lib/j2sdk1.4-sun ]; then
__java_add VMS14 j2sdk1.4-sun
__java_add HOMES14 /usr/lib/j2sdk1.4-sun
fi
elif check_sysinfos -d redhatlike; then
# XXX sur redhat
:
fi
elif check_sysinfos -s macosx; then
if [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/1.3" ]; then
__java_add VMS13 "1.3"
__java_add HOMES13 "/System/Library/Frameworks/JavaVM.framework/Versions/1.3/Home"
fi
if [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/1.4" ]; then
__java_add VMS14 "1.4"
__java_add HOMES14 "/System/Library/Frameworks/JavaVM.framework/Versions/1.4/Home"
fi
if [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/1.5" ]; then
__java_add VMS5 "1.5"
__java_add HOMES5 "/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home"
fi
if [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/1.6" ]; then
__java_add VMS6 "1.6"
__java_add HOMES6 "/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home"
fi
if [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/1.7" ]; then
__java_add VMS7 "1.7"
__java_add HOMES7 "/System/Library/Frameworks/JavaVM.framework/Versions/1.7/Home"
fi
fi
__COMPUTED_JAVA_VMS=1
}
function __java_dump_vms() {
local v b i vms homes
for v in 13 14 5 6 7; do
for b in "" 32 64; do
vms="JAVA${b}_VMS${v}[@]"; vms=("${!vms}")
homes="JAVA${b}_HOMES${v}[@]"; homes=("${!homes}")
i=0
while [ $i -lt "${#vms[*]}" ]; do
echo "$v${b:+-$b}:${vms[$i]}:${homes[$i]}"
i=$(($i + 1))
done
done
done
}
function __java_select_vms() {
if [ -z "$2" ]; then
array_copy vms "JAVA_VMS$1"
if [ -n "${vms[*]}" ]; then
array_copy homes "JAVA_HOMES$1"
return 0
else
return 1
fi
else
array_copy vms "JAVA${2}_VMS$1"
array_copy homes "JAVA${2}_HOMES$1"
custom=1
[ -n "${vms[*]}" ] && return 0 || return 1
fi
}
function __java_select() {
# Sélectionner la version de java $1 (qui peut être 13, 14, 5, 6 ou 7)
# Si $2 est défini, il peut s'agit de 32 ou 64 selon que l'on requière la
# version 32bits ou 64 bits. Sinon, la version sélectionnée peut être 32bits
# ou 64bits selon ce qui est disponible.
__java_compute_vms
local vms homes custom
if [ -z "$2" ]; then
__java_select_vms "$1" "$MYBITS" ||
__java_select_vms "$1" ||
__java_select_vms "$1" 32 ||
__java_select_vms "$1" 64
elif [ "$MYBITS" == "$2" ]; then
__java_select_vms "$1" "$2" ||
__java_select_vms "$1"
else
__java_select_vms "$1" "$2"
fi
if [ -n "${vms[*]}" ]; then
SELECTED_JAVA_VM="${vms[0]}"
SELECTED_JAVA_HOME="${homes[0]}"
SELECTED_JAVA="$SELECTED_JAVA_HOME/bin/java"
SELECTED_JAVAC="$SELECTED_JAVA_HOME/bin/javac"
if [ -z "$custom" -a "$LINUX_FLAVOUR" == "gentoo" ]; then
export GENTOO_VM="$SELECTED_JAVA_VM"
export JAVA=java
export JAVAC=javac
return 0
else
[ "$LINUX_FLAVOUR" == "gentoo" ] && unset GENTOO_VM
export JAVA_HOME="$SELECTED_JAVA_HOME"
export JAVA="$SELECTED_JAVA"
export JAVAC="$SELECTED_JAVAC"
udelpath "$JAVA_HOME/bin"
uinspath "$JAVA_HOME/bin"
export PATH
return 0
fi
fi
return 1
}
function __java_select_default() {
# Sélectionner la version de java par défaut. Si JAVA_HOME est défini,
# prendre cette valeur. Sinon, essayer dans l'ordre 5, 6, 7, puis 14
# la version 13 n'est jamais sélectionnée automatiquement
if [ -n "$JAVA_HOME" ]; then
export JAVA_HOME # s'assurer que cette variable est exportée
export JAVA="$JAVA_HOME/bin/java"
export JAVAC="$JAVA_HOME/bin/java"
udelpath "$JAVA_HOME/bin"
uinspath "$JAVA_HOME/bin"
export PATH
return 0
fi
local vm
for vm in 5 6 7 14; do
__java_select "$vm" && return 0
done
return 1
}
function select_java() {
# sélectionner la version *minimum* de java correspondant à $1
# $1== 1.3|1.3+|1.4|1.4+|1.5|1.5+|1.6|1.6+|1.7|1.7+
# Si $2 est défini, il peut s'agit de 32 ou 64 selon que l'on requière la
# version 32bits ou 64 bits
local v vms homes
case "$1" in
1.3|1.3+|13|13+)
for v in 13 14 5 6 7; do
__java_select "$v" "$2" && return 0
done
;;
1.4|1.4+|14|14+)
for v in 14 5 6 7; do
__java_select "$v" "$2" && return 0
done
;;
1.5|1.5+|5|5+)
for v in 5 6 7; do
__java_select "$v" "$2" && return 0
done
;;
1.6|1.6+|6|6+)
for v in 6 7; do
__java_select "$v" "$2" && return 0
done
;;
1.7|1.7+|7|7+)
for v in 7; do
__java_select "$v" "$2" && return 0
done
;;
esac
return 1
}
function select_java_exact() {
# sélectionner la version *exacte* de java correspondant à $1
# $1== 1.3|1.4|1.5|1.6|1.7 pour une correspondance exacte
# $1== 1.3+|1.4+|1.5+|1.6+|1.7+ pour une version minimum
# Si $2 est défini, il peut s'agit de 32 ou 64 selon que l'on requière la
# version 32bits ou 64 bits
local v vms homes
case "$1" in
1.3|13)
__java_select 13 && return 0
;;
1.3+|13+)
for v in 13 14 5 6 7; do
__java_select "$v" "$2" && return 0
done
;;
1.4|14)
__java_select 14 && return 0
;;
1.4+|14+)
for v in 14 5 6 7; do
__java_select "$v" "$2" && return 0
done
;;
1.5|5)
__java_select 5 "$2" && return 0
;;
1.5+|5+)
for v in 5 6 7; do
__java_select "$v" "$2" && return 0
done
;;
1.6|6)
__java_select 6 "$2" && return 0
;;
1.6+|6+)
for v in 6 7; do
__java_select "$v" "$2" && return 0
done
;;
1.7|7)
__java_select 7 "$2" && return 0
;;
1.7+|7+)
for v in 7; do
__java_select "$v" "$2" && return 0
done
;;
esac
return 1
}
function select_java_any() {
# Sélectionner la version exacte de java correspondant aux arguments, dans
# l'ordre, jusqu'à ce qu'un argument corresponde. DEFAULT correspond à la
# valeur actuelle de JAVA_HOME, si elle est définie.
# Si aucun argument n'est défini, on assume "DEFAULT 1.5 1.6 1.7 1.4"
local v
[ -n "$*" ] || set -- DEFAULT 5 6 7 1.4
for v in "$@"; do
if [ "$v" == DEFAULT ]; then
if [ -n "$JAVA_HOME" ]; then
__java_select_default && return 0
fi
else
select_java_exact "$v" && return 0
fi
done
return 1
}
################################################################################
# Gestion des préfixes
function get_default_javahome_prefix() {
local GENTOO_VM JAVA_HOME JAVA JAVAC PATH="$PATH"
__java_select_default
[ -n "$JAVA_HOME" ] && echo "$JAVA_HOME"
}
function get_javaextensions_prefix() {
local javaextensions
if check_sysinfos -s linux; then
if [ -n "$JAVA_HOME" ]; then
javaextensions="$JAVA_HOME/jre/lib/ext"
[ -d "$javaextensions" ] || javaextensions="$JAVA_HOME/lib/ext"
fi
elif check_sysinfos -s darwin; then
javaextensions=/Library/Java/Extensions
fi
[ -n "$javaextensions" -a -d "$javaextensions" ] && echo "$javaextensions"
}
__java_prefixes=
function __compute_java_prefixes() {
[ -n "$__java_prefixes" ] && return
[ -n "$JAVA_HOME" ] || JAVA_HOME="$(get_default_javahome_prefix)"
JAVAEXTENSIONS="${JAVAEXTENSIONS:-$(get_javaextensions_prefix)}"
__java_prefixes=1
}
UTOOLS_PREFIXES=("${UTOOLS_PREFIXES[@]}" JAVA_HOME JAVAEXTENSIONS)
function compute_java_prefixes() {
__compute_java_prefixes
}
function recompute_java_prefixes() {
__java_prefixes=
__compute_java_prefixes
}
function get_JAVA_HOME_prefix() {
__compute_java_prefixes
echo "$JAVA_HOME"
}
function get_JAVAEXTENSIONS_prefix() {
__compute_java_prefixes
echo "$JAVAEXTENSIONS"
}

View File

@@ -1,113 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion de fichiers de propriétés java
##@cooked nocomments
##@require base
uprovide javaproperties
urequire base
function read_property() {
# Lire la propriété $2 dans le fichier $1, et placer la valeur dans la
# variable $3. Si la propriété n'existe pas, prendre la valeur par défaut
# $4. Si $3=="", elle est construite à partir de $2 en remplaçant les '.'
# par '_'
# Retourner 1 si une erreur s'est produite (par exemple si le fichier
# n'existe pas ou n'est pas accessible en lecture)
[ -f "$1" -a -r "$1" ] || return 1
local __rp_name __rp_value __rp_found
# utiliser cawkrun pour que awk n'essaye pas de traiter les caractères en
# unicode (latin1 wrt utf-8)
__rp_value="$(<"$1" cawkrun name="$2" '
BEGIN {
found = 1
re_name = name
gsub(/\./, "\\.", re_name)
re_name = "^[ \t]*" re_name "[ \t]*="
}
$0 ~ re_name {
sub(re_name, "")
value = $0
sub(/^[ \t]*/, "", value)
while (substr(value, length(value), 1) == "\\") {
getline
sub(/^[ \t]*/, "")
value = substr(value, 1, length(value) - 1) $0
}
print value
found = 0
exit
}
END { exit found }')" && __rp_found=1
if [ -n "$3" ]; then
__rp_name="$3"
else
__rp_name="${2//./_}"
fi
if [ -n "$__rp_found" ]; then
set_var "$__rp_name" "$(tooenc "$__rp_value" "$LATIN1")"
else
set_var "$__rp_name" "$4"
fi
}
function write_property() {
# Ecrire la propriété $2 dans le fichier $1 avec la valeur $3.
# Retourner 1 si une erreur s'est produite (par exemple si le fichier
# n'existe pas ou n'est pas accessible en écriture)
[ -f "$1" -a -w "$1" ] || return 1
local status tmpfile
ac_set_tmpfile tmpfile
# utiliser cawkrun pour que awk n'essaye pas de traiter les caractères en
# unicode (utf-8 wrt latin1)
<"$1" >"$tmpfile" cawkrun name="$2" value="$(tooenc "$3" "" "$LATIN1")" '
function write_value() {
# XXX attention, le découpage n"est potentiellement pas fait
# correctement si la valeur contient des espaces
line = name "=" value
prefix = ""
max_len = 75
if (length(line) > max_len) {
do {
print prefix substr(line, 1, max_len) "\\"
line = substr(line, max_len + 1)
prefix = " "
max_len = 71
} while (length(line) > max_len)
}
print prefix line
}
BEGIN {
found = 0
re_name = name
gsub(/\./, "\\.", re_name)
re_name = "^[ \t]*" re_name "[ \t]*="
}
!found && $0 ~ re_name {
line = $0
while (substr(line, length(line), 1) == "\\") {
getline
line = line $0
}
write_value()
found = 1
next
}
{ print }
END { if (!found) write_value() }
' && cat "$tmpfile" >"$1"
status=$?
ac_clean "$tmpfile"
return $status
}
function write_properties() {
# Ecrire les propriétés $2..* dans le fichier $1. Les propriétés sont de la
# forme "name=value"
local __wp_propfile="$1"; shift
local __wp_prop __wp_name __wp_value
for __wp_prop in "$@"; do
splitvar "$__wp_prop" __wp_name __wp_value
write_property "$__wp_propfile" "$__wp_name" "$__wp_value"
done
}

View File

@@ -1,31 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## gestion de contenu au format json
##@cooked nocomments
##@require base
uprovide json
urequire base
function json_filter() {
# traiter un flux json pour que chaque valeur soit sur une ligne séparée,
# facilitant le traitement par un script bash
awk '{
gsub(/}\][ ]*$/, "\n&")
gsub(/},[ ]*$/, "\n&")
gsub(/[][{]/, "&\n")
gsub(/,[ ]*"/, ",\n\"")
gsub(/"}/, "\",\n}")
print
}'
}
JSONFUNCS='
function json_get(line) {
if (!line) line = $0
match(line, /^[^"]*"[^"]*":[ ]*"?/); line = substr(line, RSTART + RLENGTH)
match(line, /"?[ ]*,?[ ]*$/); line = substr(line, 1, RSTART - 1)
return line
}
'
function awkjson() {
json_filter | awkrun -f "$JSONFUNCS" "$@"
}

240
ulib/ldap
View File

@@ -1,240 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion du service slapd (démarrage/arrêt), et de sa configuration
##@cooked nocomments
##@require base
##@require sysinfos
uprovide ldap
urequire base sysinfos
function get_default_ldapconfdir_prefix() {
# Calculer et afficher la valeur par défaut de LDAPCONFDIR, ou une chaine
# vide si l'on n'a pas pu le détecter automatiquement.
if check_sysinfos -s linux; then
if check_sysinfos -d debianlike; then
[ -d /etc/ldap ] && echo /etc/ldap
elif check_sysinfos -d redhatlike; then
[ -d /etc/openldap ] && echo /etc/openldap
elif check_sysinfos -d gentoo; then
[ -d /etc/openldap ] && echo /etc/openldap
fi
elif check_sysinfos -s darwin; then
[ -d /etc/openldap ] && echo /etc/openldap
fi
}
function get_default_ldapowner_prefix() {
# Calculer et afficher la valeur par défaut de LDAPOWNER, ou une chaine
# vide si l'on n'a pas pu le détecter automatiquement.
if check_sysinfos -s linux; then
if check_sysinfos -d debianlike; then
echo openldap:openldap
elif check_sysinfos -d redhatlike; then
echo ldap:ldap
elif check_sysinfos -d gentoo; then
echo ldap:ldap
fi
elif check_sysinfos -s darwin; then
echo root:wheel
fi
}
__ldap_prefixes=
function __compute_ldap_prefixes() {
[ -n "$__ldap_prefixes" ] && return
LDAPCONFDIR="${LDAPCONFDIR:-$(get_default_ldapconfdir_prefix)}"
LDAPOWNER="${LDAPOWNER:-$(get_default_ldapowner_prefix)}"
__ldap_prefixes=1
}
UTOOLS_PREFIXES=("${UTOOLS_PREFIXES[@]}" LDAPCONFDIR LDAPOWNER)
function compute_ldap_prefixes() {
__compute_ldap_prefixes
}
function recompute_ldap_prefixes() {
__ldap_prefixes=
__compute_ldap_prefixes
}
function get_LDAPCONFDIR_prefix() {
__compute_ldap_prefixes
echo "$LDAPCONFDIR"
}
function get_LDAPOWNER_prefix() {
__compute_ldap_prefixes
echo "$LDAPOWNER"
}
function split_ldapuri() {
# spliter le ldapuri $1 en $2(=proto), $3(=host) et $4(=port)
local ldapuri="$1" protoname="${2:-proto}" hostname="${3:-host}" portname="${4:-port}"
local tmp
if [ -z "$ldapuri" ]; then
set_var "$protoname" ""
set_var "$hostname" ""
set_var "$portname" ""
return 0
fi
tmp="$ldapuri"
if [ "${tmp#ldap://}" != "$tmp" ]; then
set_var "$protoname" ldap
tmp="${tmp#ldap://}"
elif [ "${tmp#ldaps://}" != "$tmp" ]; then
set_var "$protoname" ldaps
tmp="${tmp#ldaps://}"
elif [ "${tmp#ldapi://}" != "$tmp" ]; then
set_var "$protoname" ldapi
tmp="${tmp#ldapi://}"
else
set_var "$protoname" ""
set_var "$hostname" ""
set_var "$portname" ""
eerror "invalid ldapuri: $ldapuri"
return 1
fi
tmp="${tmp%%/*}"
local tmphost="${tmp%%:*}"
set_var "$hostname" "$tmphost"
tmp="${tmp#$tmphost}"
set_var "$portname" "${tmp#:}"
return 0
}
function get_suffixes() {
# obtenir les suffixes de connexion du serveur avec l'uri $1, un par ligne
# retourner 1 si la valeur n'a pas pu être obtenue
local ncs
ncs="$(ldapsearch -x ${1:+-H "$1"} -b "" -LLL -s base namingContexts)" || return 1
<<<"$ncs" grep namingContexts: | sed 's/namingContexts: //'
}
function get_anysuffix() {
# obtenir le *premier* suffixe du serveur avec l'uri $1
# retourner 1 si la valeur n'a pas pu être obtenue
local suffix
suffix="$(get_suffixes "$1")" || return 1
<<<"$suffix" head -n1
}
function get_dcsuffix() {
# obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine par
# dc=TLD où TLD est une valeur quelconque. A priori, c'est un suffixe d'une
# base de donnée non administrative.
# retourner 1 si la valeur n'a pas pu être obtenue
local suffix
suffix="$(get_suffixes "$1" | awk '/(^|,)dc=[^,]+/ { print }')" || return 1
<<<"$suffix" head -n1
}
function get_suffix() {
# obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine si
# possible par dc=TLD où TLD est une valeur quelconque. Dans le cas normal,
# le suffixe affiché est celui d'une base non administrative.
# retourner 1 si la valeur n'a pas pu être obtenue
local suffixes suffix
suffixes="$(get_suffixes "$1")" || return 1
suffix="$(<<<"$suffixes" awk '/(^|,)dc=[^,]+/ { print }')"
[ -n "$suffix" ] || suffix="$suffixes"
<<<"$suffix" head -n1
}
function reldn() {
local suffix="${2:-$SUFFIX}"
# exprimer le dn $1 relativement au suffixe $2(=$SUFFIX)
if [ -z "$suffix" ]; then
echo "$1"
elif [ -z "$1" -o "$1" == "$suffix" ]; then
echo ""
elif [ "${1%,$suffix}" != "$1" ]; then
# absolu, enlever $suffix
echo "${1%,$suffix}"
else
# relatif
echo "$1"
fi
}
function _absdn() {
local suffix="$2"
# obtenir le dn absolu correspondant au dn $1, le dn de base étant $2
if [ -z "$suffix" ]; then
echo "$1"
elif [ -z "$1" -o "$1" == "$suffix" ]; then
echo "$suffix"
elif [ "${1%,$suffix}" != "$1" ]; then
# absolu
echo "$1"
else
# relatif, ajouter $suffix
echo "$1,$suffix"
fi
}
function absdn() {
# obtenir le dn absolu correspondant au dn $1, le dn de base étant
# $2(=$SUFFIX)
_absdn "$1" "${2:-$SUFFIX}"
}
function subof() {
# tester si le dn absolu $1 est $2 ou un enfant de $2
[ "$1" == "$2" -o "${1%,$2}" != "$1" ]
}
function rabsdn() {
# comme absdn, mais tient compte de la valeur de $3(=$SEARCHBASE)
# Si le dn commence par "~/", le dn est relatif à $2(=$SUFFIX)
# Si le dn commence par "/", le dn est absolu
# Sinon, le dn est relatif à $3
local dn="$1" suffix="${2:-$SUFFIX}" searchbase="${3:-$SEARCHBASE}"
# corriger les expansions éventuelles du shell
if [ "$dn" == "$HOME" ]; then
dn="~"
elif [ "${dn#$HOME}" != "$dn" ]; then
dn="~${dn#$HOME}"
fi
# calculer le dn absolu
if [ "${dn#/}" != "$dn" ]; then
echo "${dn#/}"
elif [ "$dn" == "~" ]; then
echo "$SUFFIX"
elif [ "${dn#\~/}" != "$dn" ]; then
_absdn "${dn#\~/}" "$suffix"
else
_absdn "$dn" "$searchbase"
fi
}
function pdn() {
# corriger pour *affichage* un dn *absolu*. pour la racine "", afficher
# '/'. pour $2(=$SUFFIX), afficher '~'. sinon, afficher le dn relativement à
# $2
local suffix="${2:-$SUFFIX}"
if [ -z "$1" ]; then
echo "/"
elif [ "$1" == "$suffix" ]; then
echo "~"
elif [ "${1%,$suffix}" != "$1" ]; then
echo "$(reldn "$1")"
else
echo "/$1"
fi
}
function filter_slapdconf() {
# Traiter un fichier de configuration slapd.conf en fusionnant les lignes
# qui sont découpées. Ceci permet de faire des traitements sur le contenu.
# Ce filtre s'utilisera normalement avec filter_conf, e.g.:
# <slapd.conf filter_slapdconf | filter_conf >result.conf
awk '
BEGIN { line = ""; valid = 0; }
/^[ \t]/ { line = line $0; next; }
{ if (valid) print line; line = $0; valid = 1; }
END { if (valid) print line; }
'
}

1170
ulib/ldif

File diff suppressed because it is too large Load Diff

View File

@@ -1,579 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonctions "récupérées" de utools, pas encore classées ou réécrites, mais
## gardées pour compatibilité.
##@cooked nocomments
##@require base
uprovide legacy
urequire base
function file_get_vars() {
# lire les variables dans un fichier
local OENC="$UTF8"
local done_ prefix_ whole_file_ file_ vars_ var_ script_
# traiter les arguments
done_=
while [ -z "$done_" ]; do
case "$1" in
--prefix|-p)
# prefixe pour la variable
prefix_="$2"
shift; shift
;;
--whole-file|-w)
# lire les variables dans le fichier en entier, et pas seulement
# dans l'en-tête.
whole_file_=1
shift
;;
*)
done_=1
;;
esac
done
# obtenir le nom du fichier
file_="$1"; shift
if [ ! -f "$file_" ]; then
# fichier inexistant
ewarn "Fichier inexistant: $file_"
return 1
fi
# initialiser les valeurs par défaut
vars_=
while [ -n "$1" ]; do
var_="$1"; shift
vars_="${vars_:+$vars_ }$var_"
set_var "$var_" "$1"; shift
done
# puis parcourir le fichier pour initialiser la valeur définitive des
# variables
if [ -z "$whole_file_" ]; then
script_="/^ *$/ { exit }
"
fi
for var_ in $vars_; do
script_="$script_
"'$0 ~ "^ *#* *" prefix "'"$var_"'=" {
# enlever les caractères inutiles
sub(" *#* *" prefix "'"$var_"'=", "")
# enlever éventuellement les quotes autour de la valeur
if ($0 ~ /^".*" *$/) {
$0 = substr($0, 2) # premier quote
match($0, /" *$/)
$0 = substr($0, 1, RSTART - 1) # dernier quote
}
# remplacer dans les valeurs les occurences de quotes
gsub("\"", "\\\"")
# afficher la ligne à évaluer
print "'"$var_"'=\"" $0 "\""
}
'
done
eval "$(awkrun prefix="$prefix_" "$script_" <"$file_")"
}
function file_set_vars() {
# écrire les variables dans un fichier. Le fichier *doit exister*
local OENC="$UTF8"
local done_ quote_ comment_ prefix_ whole_file_ file_ var_ script_
# traiter les arguments
done_=
while [ -z "$done_" ]; do
case "$1" in
--quote-always|-q)
# toujours mettre les valeurs entre quotes
quote_=1
shift
;;
--comment-prefix|-c)
# commentaire à préfixer
comment_="$2"
shift; shift
;;
--prefix|-p)
# prefixe pour la variable
prefix_="$2"
shift; shift
;;
--whole-file|-w)
# écrire les variables dans le fichier en entier, et pas seulement
# dans l'en-tête.
whole_file_=1
shift
;;
*)
done_=1
;;
esac
done
# obtenir le nom du fichier
file_="$1"; shift
if [ ! -f "$file_" ]; then
# fichier inexistant
ewarn "Fichier inexistant: $file_"
return 1
fi
# puis parcourir le fichier pour mettre à jour les valeurs
script_='BEGIN {
# faut-il mettre à jour les variables?
update_vars = 1'
for var_ in "$@"; do
script_="$script_
${var_}_done = 0"
done
script_="$script_
}"
script_="$script_"'
function quote_value_maybe(value) {
if (quote_always || index(value, " ") != 0) {
return "\"" value "\""
} else {
return value
}
}
function write_all_remaining_vars() {'
for var_ in "$@"; do
value="${!var_}"
script_="$script_"'
if (! '"$var_"'_done) {
print comment prefix "'"$var_"'=" quote_value_maybe("'"${value//\"/\\\"}"'")
'"$var_"'_done = 1
}'
done
script_="$script_
}"
if [ -z "$whole_file_" ]; then
script_="$script_"'
/^[ \t]*$/ {
write_all_remaining_vars()
update_vars = 0
}'
fi
script_="$script_"'
update_vars && comment == "" && $0 ~ "^ *#* *.*=.*$" {
#comment = gensub("^( *#* *).*=.*$", "\\1", 1)
comment = ""
if (match($0, /^ *#* */) != 0) {
comment = substr($0, RSTART, RLENGTH)
}
}'
for var_ in "$@"; do
value="${!var_}"
script_="$script_"'
update_vars && ! '"$var_"'_done && $0 ~ "^ *#* *" prefix "'"$var_"'=" {
#$0 = gensub("^( *#* *" prefix "'"$var_"'=).*$", "\\1", 1)
match($0, "^ *#* *" prefix "'"$var_"'=")
$0 = substr($0, RSTART, RLENGTH)
$0 = $0 quote_value_maybe("'"${value//\"/\\\"}"'")
print
'"$var_"'_done = 1
next
}'
done
script_="$script_"'
{
print
}
END {
if (update_vars) {
write_all_remaining_vars()
}
}'
doinplace "$file_" awkrun quote_always="$quote_" comment="$comment_" prefix="$prefix_" "$script_"
}
function file_get_properties() {
# lire les propriétés d'un fichier de propriété java ou xml
if endswith "$1" .xml; then
file_get_xml_properties "$@"
else
file_get_java_properties "$@"
fi
}
function file_set_properties() {
# écrire les propriétés d'un fichier de propriété java ou xml
local done_ create_
while [ -z "$done_" ]; do
case "$1" in
--create|-c)
create_=1
shift
;;
*)
done_=1
;;
esac
done
if endswith "$1" .xml; then
file_set_xml_properties ${create_:+-c} "$@"
else
file_set_java_properties ${create_:+-c} "$@"
fi
}
function file_get_java_properties() {
# lire les propriétés d'un fichier de propriétés java. note: les noms de
# propriété java peuvent contenir le caractère "." mais pas les noms de
# variable bash. La conversion est faite automatiquement. Par exemple::
# file_get_properties build.properties path.to.package "default value"
# charge la valeur de la propriété dans la variable path_to_package
# $1=nom du fichier de propriété
# $2..n=propriétés qu'il faut lire et valeurs par défaut de ces propriétés
# $__2*i __=nom de la propriété
# $__2*i+1__=valeur par défaut de la propriété si la valeur n'existe pas
# dans le fichier
local OENC="$UTF8"
local file_="$1"; shift
if [ ! -f "$file_" ]; then
# fichier inexistant
ewarn "Fichier de propriété inexistant: $file_"
return 1
fi
local var_ sh_var_ awk_var_
local script
while [ -n "$1" ]; do
# pour chacune des variables...
var_="$1"; shift
sh_var_="${var_//./_}" # nom de la variable shell traduite ("." --> "_")
sh_var_="${sh_var_//-/_}" # ("-" --> "_")
awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk
# initialiser la valeur par défaut
set_var "$sh_var_" "$1"; shift
# et créer le script qui affichera sa valeur
script="$script"'
$0 ~ "^[ \t]*'"$(quote_awk "$awkre_var_")"'=" {
# enlever les caractères de début
sub("^[ \t]*'"$(quote_awk "$awkre_var_")"'=", "")
value = $0
# éventuellement ajouter les lignes de continuation
while (substr(value, length(value), 1) == "\\") {
getline
sub("^[ \t]*", "")
value = substr(value, 1, length(value) - 1) $0
}
gsub("\"", "\\\"", value)
print "'"$sh_var_"'=\"" value "\""
}
'
done
eval "$(awk "$script" <"$file_")"
}
function file_set_java_properties() {
# écrire des propriétés dans un fichier de propriétés java.
# $1=nom du fichier de propriété
# $2..n=propriétés qu'il faut écrire et valeurs de ces propriétés
# $__2*i __=nom de la propriété
# $__2*i+1__=valeur de la propriété
# traiter les arguments
local OENC="$UTF8"
local done_ create_
while [ -z "$done_" ]; do
case "$1" in
--create|-c)
# créer le fichier s'il n'existe pas
create_=1
shift
;;
*)
done_=1
;;
esac
done
local file_="$1"; shift
if [ ! -f "$file_" ]; then
if [ -n "$create_" ]; then
touch "$file_"
else
# fichier inexistant
ewarn "Fichier de propriété inexistant: $file_"
return 1
fi
fi
# récupérer les noms des propriétés et leur valeur
local var_ arg_ sh_var_ awkre_var_ value_
local -a vars_ values_
value_=vars_
for arg_ in "$@"; do
array_add "$value_" "$arg_"
if [ "$value_" == "vars_" ]; then
value_=values_
else
value_=vars_
fi
done
# créer le script qui va parcourir le fichier pour mettre à jour les valeurs
script_="BEGIN {"
for var_ in "${vars_[@]}"; do
sh_var_="${var_//./_}" # nom de la variable shell traduite ("." --> "_")
sh_var_="${sh_var_//-/_}" # ("-" --> "_")
script_="$script_
${sh_var_}_done = 0"
done
script_="$script_"'
}
function write_all_remaining_vars() {'
local i=0
while [ $i -lt ${#vars_[*]} ]; do
var_="${vars_[$i]}"
sh_var_="${var_//./_}" # nom de la variable shell traduite ("." --> "_")
sh_var_="${sh_var_//-/_}" # ("-" --> "_")
awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk
value_="${values_[$i]}"
script_="$script_"'
if (! '"$sh_var_"'_done) {
print "'"$var_"'=" "'"${value_//\"/\\\"}"'"
'"$sh_var_"'_done = 1
}'
i=$((i + 1))
done
script_="$script_
}"
local i=0
while [ $i -lt ${#vars_[*]} ]; do
var_="${vars_[$i]}"
sh_var_="${var_//./_}" # nom de la variable shell traduite ("." --> "_")
sh_var_="${sh_var_//-/_}" # ("-" --> "_")
awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk
value_="${values_[$i]}"
script_="$script_"'
! '"$sh_var_"'_done && $0 ~ "^[ \t]*'"$awkre_var_"'=" {
#name = gensub("^([ \t]*'"$awkre_var_"'=).*$", "\\1", 1)
match($0, "^[ \t]*'"$awkre_var_"'=")
name = substr($0, RSTART, RLENGTH)
value = substr($0, length(name) + 1)
while (substr(value, length(value), 1) == "\\") {
getline
value = value $0
}
line = name "'"${value_//\"/\\\"}"'"
prefix = ""
max_len = 75
if (length(line) > max_len) {
do {
print prefix substr(line, 1, max_len) "\\"
line = substr(line, max_len + 1)
prefix = " "
max_len = 71
} while (length(line) > max_len)
}
print prefix line
'"$sh_var_"'_done = 1
next
}'
i=$((i + 1))
done
script_="$script_
{
print
}
END {
write_all_remaining_vars()
}"
doinplace "$file_" awk "$script_"
}
function file_get_xml_properties() {
# lire les propriétés d'un fichier de propriétés xml. Limitation: les
# propriétés ne doivent pas être continuées sur plusieurs lignes. Les
# propriétés doivent être écrites sous la forme::
# <propname>propvalue</propname>
# note: les noms de propriété java peuvent contenir le caractère "." mais
# pas les noms de variable bash. La conversion est faite
# automatiquement. Par exemple::
# file_get_properties build.properties path.to.package "default value"
# charge la valeur de la propriété dans la variable path_to_package
# $1=nom du fichier de propriété
# $2..n=propriétés qu'il faut lire et valeurs par défaut de ces propriétés
# $__2*i __=nom de la propriété
# $__2*i+1__=valeur par défaut de la propriété si la valeur n'existe pas
# dans le fichier
local OENC="$UTF8"
local file_="$1"; shift
if [ ! -f "$file_" ]; then
# fichier inexistant
ewarn "Fichier de propriété inexistant: $file_"
return 1
fi
local var_ sh_var_ awk_var_
local script
while [ -n "$1" ]; do
# pour chacune des variables...
var_="$1"; shift
sh_var_="${var_//./_}" # nom de la variable shell traduite ("." --> "_")
sh_var_="${sh_var_//-/_}" # ("-" --> "_")
awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk
# initialiser la valeur par défaut
set_var "$sh_var_" "$1"; shift
# et créer le script qui affichera sa valeur
script="$script"'
$0 ~ /^[ \t]*<'"$awkre_var_"'>.*<\/'"$awkre_var_"'>/ {
sub(/^[ \t]*<'"$awkre_var_"'>/, "")
sub(/<\/'"$awkre_var_"'>.*$/, "")
gsub("\"", "\\\"", $0)
print "'"$sh_var_"'=\"" $0 "\""
}
'
done
eval "$(awk "$script" <"$file_")"
}
function file_set_xml_properties() {
# écrire des propriétés dans un fichier de propriétés java.
# $1=nom du fichier de propriété
# $2..n=propriétés qu'il faut écrire et valeurs de ces propriétés
# $__2*i __=nom de la propriété
# $__2*i+1__=valeur de la propriété
# traiter les arguments
local OENC="$UTF8"
local done_ create_
while [ -z "$done_" ]; do
case "$1" in
--create|-c)
# créer le fichier s'il n'existe pas
create_=1
shift
;;
*)
done_=1
;;
esac
done
local file_="$1"; shift
if [ ! -f "$file_" ]; then
if [ -n "$create_" ]; then
touch "$file_"
else
# fichier inexistant
ewarn "Fichier de propriété inexistant: $file_"
return 1
fi
fi
# récupérer les noms des propriétés et leur valeur
local var_ arg_ sh_var_ awkre_var_ value_
local -a vars_ values_
value_=vars_
for arg_ in "$@"; do
array_add "$value_" "$arg_"
if [ "$value_" == "vars_" ]; then
value_=values_
else
value_=vars_
fi
done
# créer le script qui va parcourir le fichier pour mettre à jour les valeurs
script_='BEGIN {
rootElement = ""'
for var_ in "${vars_[@]}"; do
sh_var_="${var_//./_}" # nom de la variable shell traduite ("." --> "_")
sh_var_="${sh_var_//-/_}" # ("-" --> "_")
script_="$script_
${sh_var_}_done = 0"
done
script_="$script_"'
}
function write_all_remaining_vars() {'
local i=0
while [ $i -lt ${#vars_[*]} ]; do
var_="${vars_[$i]}"
sh_var_="${var_//./_}" # nom de la variable shell traduite ("." --> "_")
sh_var_="${sh_var_//-/_}" # ("-" --> "_")
awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk
value_="${values_[$i]}"
script_="$script_"'
if (! '"$sh_var_"'_done) {
print "<'"$var_"'>'"${value_//\"/\\\"}"'</'"$var_"'>"
'"$sh_var_"'_done = 1
}'
i=$((i + 1))
done
script_="$script_
}"'
rootElement == "" {
match($0, /<.*>/)
element = substr($0, RSTART + 1, RLENGTH - 2)
firstChar = substr(element, 1, 1)
if (firstChar != "?" && firstChar != "!") {
rootElement = element
}
}'
local i=0
while [ $i -lt ${#vars_[*]} ]; do
var_="${vars_[$i]}"
sh_var_="${var_//./_}" # nom de la variable shell traduite ("." --> "_")
sh_var_="${sh_var_//-/_}" # ("-" --> "_")
awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk
value_="${values_[$i]}"
script_="$script_"'
rootElement != "" && ! '"$sh_var_"'_done && $0 ~ /^[ \t]*<'"$awkre_var_"'>.*<\/'"$awkre_var_"'>/ {
match($0, /^[ \t]*<'"$awkre_var_"'>/)
first = substr($0, RSTART, RLENGTH)
value = substr($0, length(first) + 1)
match(value, /<\/'"$awkre_var_"'>.*$/)
last = substr(value, RSTART, RLENGTH)
value = substr(value, 1, RSTART)
print first "'"${value_//\"/\\\"}"'" last
'"$sh_var_"'_done = 1
next
}'
i=$((i + 1))
done
script_="$script_"'
rootElement != "" && $0 ~ "</" rootElement ">" {
rootElement = ""
write_all_remaining_vars()
}
{
print
}
END {
write_all_remaining_vars()
}'
doinplace "$file_" awk "$script_"
}

View File

@@ -1,118 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Outils pour MacOS X
##@cooked nocomments
##@require base
##@require sysinfos
##@require compat
uprovide macosx
urequire base sysinfos compat
################################################################################
# Gestion des utilisateurs
function local_shellfix() {
# Modifier le compte local $1 pour qu'il utilise bash au lieu de sh
local username="${1:-root}"
local shell="$(dscl localhost read "/Local/Default/Users/$username" UserShell | sed 's/^UserShell: //g')"
if [ "$shell" != "/bin/bash" ]; then
dscl localhost change "/Local/Default/Users/$username" UserShell "$shell" /bin/bash
fi
}
function local_usercheck() {
# Vérifier si le user local $1 existe
if check_sysinfos -s macosx -d 10.5+; then
[ -n "$(dscl localhost list /Local/Default/Users | grep "$username")" ]
elif check_sysinfos -s macosx -d 10.4; then
[ -n "$(nicl . -list /users | grep "$username")" ]
else
return 123
fi
}
function local_useradd() {
# Créer le user local $1
# USAGE: local_useradd username [gecos [passwd]]
# OPTIONS
# -s Créer l'utilisateur avec les droits d'administrateur
# -m Créer le home directory
local -a args
local admin create_home
parse_opts "${PRETTYOPTS[@]}" \
-s,--admin admin=1 \
-m,--create-home create_home=1 \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
local uid gid
local username="$1" gecos="$2" passwd="$3"
[ -n "$passwd" ] || passwd="${username:0:3}+def"
local_usercheck "$username" && {
eerror "$username: ce compte existe déjà"
return 1
}
if check_sysinfos -s macosx -d 10.5+; then
[ -n "$uid" ] || uid=$(($(dscl localhost list /Local/Default/Users UniqueID | awk '{print $2}' | sort -rn | head -n 1) + 1))
[ -n "$gid" ] || gid=20
echo "\
cd /Local/Default/Users
create $username UniqueID $uid
create $username PrimaryGroupID $gid
create $username RealName \"$gecos\"
create $username UserShell /bin/bash
create $username NFSHomeDirectory /Users/$username
create $username _writers_passwd $username
passwd $username $passwd
${admin:+
cd /Local/Default/Groups
merge admin GroupMembership $username
}" | dscl -q localhost
elif check_sysinfos -s macosx -d 10.4; then
local create_group
[ -n "$uid" ] || uid="$(($(nicl . -list /users uid | awk '{print $2}' | sort -rn | head -n 1) + 1))"
if [ -z "$gid" ]; then
gid="$(($(nicl . -list /groups gid | awk '{print $2}' | sort -rn | head -n 1) + 1))"
[ "$gid" -lt 501 ] && gid=501
fi
[ -z "$(nicl . -list /groups gid | awk '{print $2}' | grep "$gid")" ] && create_group=1 || create_group=
echo "\
${create_group:+cd /groups
create $username gid $gid
create $username passwd *
}cd /users
create $username uid $uid
create $username gid $gid
${gecos:+create $username realname \"$gecos\"
}create $username shell /bin/bash
create $username home /Users/$username
create $username _writers_passwd $username
${admin:+
cd /groups
merge admin users $username
}" | nicl -q .
echo 'spawn passwd '"$username"'
expect "password:"
send "'"$passwd"'\r"
expect "password:"
send "'"$passwd"'\r"
expect eof
' | expect
else
return 123
fi
if [ -n "$create_home" ]; then
local homedir="/Users/$username"
ditto "/System/Library/User Template/French.lproj" "$homedir"
chown -R $uid:$gid "$homedir"
chmod 755 "$homedir"
fi
return 0
}

View File

@@ -1,9 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonction de support pour mkcrypt: cryptage de mots de passe
##@cooked nocomments
##@require ulib
##@require nutools/pyulib
uprovide mkcrypt
urequire ulib nutools/pyulib
function mkcrypt() { "$ULIBDIR/support/mkcrypt.py" "$@"; }

View File

@@ -1,169 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonctions pour gérer les modelines dans les fichiers
##@cooked nocomments
##@require base
uprovide modeline
urequire base
MODELINE="@prefix@-*- coding: utf-8 @mode@-*- vim:sw=@tabsize@:sts=@tabsize@:et:ai:si:sta:fenc=utf-8"
# modèles de modes à copier dans les fonctions __ml_* ci-dessous
#CSS=.css|css
#JS=.js|js|javascript
#JAVA=.java|java
#HTML=.html|.htm|html|html4|html5
#XML=.xml|xml
#PHP=.php|.phps|php|php4|php5
#SH=.sh|sh|shell
#PYTHON=.py|.pyw|py|python
#TEXT=.txt|txt|text
#CONF=.conf|conf
#MARKDOWN=.mdt|.mdwn|.md|.text|.twp|markdown
#PUML=.puml|puml|plantuml
#IUML=.iuml|iuml|plantumlinc
#SQL=.sql|sql
function __ml_getprefix() {
case "$1" in
.css|css|.js|js|javascript|.java|java) echo "/* ";;
.html|.htm|html|html4|html5) echo "<!-- ";;
.php|.phps|php|php4|php5) echo "<?php # ";;
.sh|sh|shell|.py|.pyw|py|python|.txt|txt|text|.conf|conf) echo "# ";;
.mdt|.mdwn|.md|.text|.twp|markdown|.puml|puml|plantuml) echo "# ";;
.iuml|iuml|plantumlinc) echo "'' ";;
.sql|sql) echo "-- ";;
*) # par défaut, utiliser le préfixe '# ', même si ce n'est pas forcément
# approprié
echo "# "
;;
esac
}
function __ml_getmode() {
case "$1" in
.html|.htm|html|html4|html5) echo html;;
.php|.phps|php|php5) echo php;;
.sh|sh|shell) echo sh;;
.py|.pyw|py|python) echo python;;
.txt|txt|text) echo text;;
.conf|conf) echo conf;;
.mdt|.mdwn|.md|.text|.twp|markdown) echo markdown;;
.puml|puml|plantuml|.iuml|iuml|plantumlinc) echo text;;
.sql|sql) echo sql;;
esac
}
function __ml_gettabsize() {
case "$1" in
.php|.phps|php|php5) echo 2;;
*) echo 4;;
esac
}
function __ml_getmodeline() {
local prefix="$(__ml_getprefix "$1")"
local mode="$(__ml_getmode "$1")"
local tabsize="$(__ml_gettabsize "$1")"
[ -n "$mode" ] && mode="mode: $mode "
local modeline="$MODELINE"
modeline="${modeline//@prefix@/$prefix}"
modeline="${modeline//@mode@/$mode}"
modeline="${modeline//@tabsize@/$tabsize}"
echo "$modeline"
}
function __ml_getsuffix() {
case "$1" in
.css|css|.js|js|javascript|.java|java) echo "*/";;
.html|.htm|html|html4|html5) echo "-->";;
.php|.phps|php|php4|php5) echo "?>";;
esac
}
function printml() {
local atype=auto
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-t:,--type: atype= \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
local mode modeline suffix type
if [ "$atype" == "auto" ]; then
local basename ext
splitname "$(basename "$1")" basename ext
type="${ext:+.$ext}"
type="${type:-shell}"
else
type="$atype"
fi
modeline="$(__ml_getmodeline "$type")"
suffix="$(__ml_getsuffix "$type")"
echo "$modeline${suffix:+
$suffix}"
}
function addml() {
local atype=auto
local edit=auto
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-t:,--type: atype= \
-e,--edit edit=1 \
-n,--noedit edit= \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
if [ "$edit" == "auto" ]; then
[ $# -eq 1 ] && edit=1 || edit=
fi
local mode modeline suffix type
local -a edits
for file in "$@"; do
if [ "$atype" == "auto" ]; then
local basename ext
splitname "$(basename "$file")" basename ext
type="${ext:+.$ext}"
type="${type:-shell}"
else
type="$atype"
fi
mode="$(__ml_getmode "$type")"
modeline="$(__ml_getmodeline "$type")"
suffix="$(__ml_getsuffix "$type")"
if [ ! -e "$file" ]; then
ask_yesno "Le fichier $file n'existe pas. Faut-il le créer?" O || continue
touch "$file"
fi
array_add edits "$file"
doinplacef "$file" awkrun mode="$mode" modeline="$modeline" suffix="$suffix" '
BEGIN { run = 1; done = 0; nextline = 0 }
run == 1 {
if (substr($0, length($0) - length(modeline) + 1) == modeline) {
run = 0; done = 1; nextline = 0
} else if (nextline) {
print modeline
if (suffix != "") print suffix
run = 0; done = 1; nextline = 0
} else if (mode == "shell" && $0 ~ /^#!/) {
nextline = 1
} else if (mode == "shell" && $0 ~ /^#/) {
print modeline
if (suffix != "") print suffix
done = 1; run = 0
} else if (!done) {
print modeline
if (suffix != "") print suffix
done = 1; run = 0
} else {
run = 0
}
}
{ print }
END {
if (run || nextline) {
print modeline
if (suffix != "") print suffix
}
}
'
done
[ -n "$edit" ] && "${EDITOR:-vi}" "${edits[@]}"
}

View File

@@ -1,32 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonctions spécifiques au service network-manager
##@cooked nocomments
##@require service
uprovide network-manager
urequire service
SERVICE_OVERRIDE_network_manager_stopx=1
function SERVICE_OVERRIDE_network_manager_stopx() {
# désactiver network-manager avant de l'arrêter, ce qui permet de s'assurer
# que chaque chaque connexion est arrêtée proprement
if service network-manager check; then
if [ "$(LANG=C nmcli -t -f STATE nm 2>/dev/null)" != asleep ]; then
nmcli nm sleep
sleep 2
fi
service network-manager stop
fi
}
SERVICE_OVERRIDE_network_manager_startx=1
function SERVICE_OVERRIDE_network_manager_startx() {
# cette fonction est le pendant de stopx: penser à relancer network-manager
# après avoir démarré le service
if ! service network-manager check; then
service network-manager start
sleep 2
fi
if [ "$(LANG=C nmcli -t -f STATE nm 2>/dev/null)" == asleep ]; then
nmcli nm wakeup
fi
}

View File

@@ -1,6 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Utiliser 'udir --help-vars' pour une description de la signification des
# variables suivantes:
udir_desc="Ce répertoire contient les scripts privés de nutools, à inclure avec uinc"
udir_note=""
udir_types=()

View File

@@ -1,6 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Donner accès à l'outil plbck.py
##@cooked nocomments
urequire nutools/pyulib
function plbck() { python "$PYULIBDIR/src/uapps/plbck.py" "$@"; }

View File

@@ -1,6 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Donner accès à l'outil plver.py
##@cooked nocomments
urequire nutools/pyulib
function plver() { python "$PYULIBDIR/src/uapps/plver.py" "$@"; }

View File

@@ -1,37 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Accéder aux librairies python *locales* de pyulib
##@cooked nocomments
# Modifier PYTHONPATH de façon que les librairies de pyulib *locales* soient
# accessibles. N'utiliser ce fichier que dans le cas où la librairie pyulib
# n'est pas installée sur le système.
# Ce fichier doit être *sourcé*. Si ce fichier n'est pas sourcé, alors le
# répertoire pyulib doit être disponible dans le répertoire du script qui inclue
# ce fichier. Ceci peut-être fait avec 'ulibsync -p'
## Calculer l'emplacement de pyulib
# il est possible de forcer la valeur de PYULIBDIR avec FORCED_PYULIBDIR. ceci
# est utile avec bash 2.x qui ne supporte pas la variable BASH_SOURCE
PYULIBDIR="$FORCED_PYULIBDIR"
if [ -z "$PYULIBDIR" ]; then
PYULIBDIR="${BASH_SOURCE[0]}"
if [ -n "$PYULIBDIR" -a -f "$PYULIBDIR" ]; then
# Fichier sourcé
PYULIBDIR="$(dirname "$PYULIBDIR")/../../pyulib"
else
# Fichier non sourcé. Tout exprimer par rapport au script courant
PYULIBDIR="$(dirname "$0")/pyulib"
fi
fi
PYULIBDIR="$(cd "$PYULIBDIR"; pwd)"
export PYTHONPATH="$PYULIBDIR/src${PYTHONPATH:+:$PYTHONPATH}"
function pyulib_sync() {
# Synchroniser les librairies pyulib dans le répertoire $1
destdir="$(abspath "${1:-.}")"
[ "$destdir/pyulib" != "$PYULIBDIR" ] && cpdirnovcs "$PYULIBDIR" "$destdir/pyulib"
}

View File

@@ -1,6 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Donner accès à l'outil uencdetect.py
##@cooked nocomments
urequire nutools/pyulib
function uencdetect() { python "$PYULIBDIR/src/uapps/uencdetect.py" "$@"; }

View File

@@ -1,6 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Donner accès à l'outil umail.py
##@cooked nocomments
urequire nutools/pyulib
function umail() { python "$PYULIBDIR/src/uapps/umail.py" "$@"; }

View File

@@ -1,99 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion de mots de passe
##@cooked nocomments
##@require base
uprovide password
urequire base
function random_index() {
# Afficher un index au hasard dans le tableau $1
[ -n "$1" ] || return
local -a __rn_array; array_copy __rn_array "$1"
[ ${#__rn_array[*]} -gt 0 ] || return
echo $(($RANDOM % ${#__rn_array[*]}))
}
function random_value() {
# Afficher une valeur au hasard dans le tableau $1
local __rv_index="$(random_index "$1")"
[ -n "$__rv_index" ] || return
eval "echo \${$1[$__rv_index]}"
}
function random_char() {
# Afficher un caractère au hasard dans la chaine $1
local section="$1"
[ ${#section} -gt 0 ] || return
local index=$(($RANDOM % ${#section}))
echo "${section:$index:1}"
}
GENPASS_UPPER="AZERTYUIOPQSDFGHJKLMWXCVBN"
GENPASS_LOWER="azertyuiopqsdfghjklmwxcvbn"
GENPASS_NUMBERS="1234567890"
GENPASS_SYMBOLS="&\"'(-_)=^\$*!:;,?./%+#{[|\\]}"
GENPASS_LEN=10
GENPASS_SECTIONS=("$GENPASS_UPPER" "$GENPASS_LOWER" "$GENPASS_UPPER$GENPASS_LOWER" "$GENPASS_NUMBERS" "$GENPASS_SYMBOLS" "$GENPASS_NUMBERS$GENPASS_SYMBOLS")
GENPASS_COUNTS=(0 0 4 0 0 1)
function genpass() {
# Générer un mot de passe au hasard avec les paramètres GENPASS_*
local -a indexes parts
local count index hascount part password
[ "${#GENPASS_SECTIONS[*]}" -eq "${#GENPASS_COUNTS[*]}" ] || die "GENPASS_COUNTS et GENPASS_SECTIONS doivent être de même taille"
# indexes contient les indexes dans le tableau SECTIONS, avec comme poids le
# nombre de caractères minimum de chaque sections
indexes=()
index=0
for count in "${GENPASS_COUNTS[@]}"; do
while [ $count -ge 0 ]; do
array_add indexes "$index"
count=$(($count - 1))
done
index=$(($index + 1))
done
# générer chaque caractère du mot de passe au hasard
parts=()
while true; do
# vérifier s'il reste encore des sections avec un nombre minimum
hascount=
for count in "${GENPASS_COUNTS[@]}"; do
[ "$count" -gt 0 ] && {
hascount=1
break
}
done
[ -n "$hascount" ] || break
# calculer la prochaine section à générer
while true; do
index=$(random_index GENPASS_SECTIONS)
[ ${GENPASS_COUNTS[$index]} -gt 0 ] && break
done
# générer un caractère au hasard
part="$(random_char "${GENPASS_SECTIONS[$index]}")"
array_add parts "$part"
GENPASS_COUNTS[$index]=$((${GENPASS_COUNTS[$index]} - 1))
done
# générer les autres caractères jusqu'à GENPASS_LEN
while [ "${#parts[*]}" -lt "$GENPASS_LEN" ]; do
index=$(random_value indexes)
part="$(random_char "${GENPASS_SECTIONS[$index]}")"
array_add parts "$part"
done
# puis générer le mot de passe en prenant chaque partie au hasard
password=
while [ ${#parts[*]} -gt 0 ]; do
index=$(random_index parts)
password="$password${parts[$index]}"
before=()
[ $index -gt 0 ] && before=("${parts[@]:0:$index}")
after=("${parts[@]:$((index + 1))}")
parts=("${before[@]}" "${after[@]}")
done
echo "$password"
}

View File

@@ -1,52 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion de chemins standardisés
##@cooked nocomments
##@require base
##@require sysinfos
uprovide prefixes
urequire base sysinfos
UTOOLS_PREFIXES=(USER HOME)
function get_USER_prefix() {
echo "$USER"
}
function get_HOME_prefix() {
echo "$HOME"
}
function has_prefix() {
array_contains UTOOLS_PREFIXES "$1" && return 0
local prefix
for prefix in "${UTOOLS_PREFIXES[@]}"; do
if beginswith "$1" "$prefix/"; then
return 0
fi
done
return 1
}
function expand_prefix() {
local prefix
for prefix in "${UTOOLS_PREFIXES[@]}"; do
if beginswith "$1" "$prefix/" || [ "$1" == "$prefix" ]; then
echo "$(get_${prefix}_prefix)${1#$prefix}"
return
fi
done
echo "$1"
}
function list_prefixes() {
local prefix
for prefix in "${UTOOLS_PREFIXES[@]}"; do
echo "$prefix"
done
}
function dump_prefixes() {
local prefix
for prefix in "${UTOOLS_PREFIXES[@]}"; do
echo "$prefix=$(expand_prefix "$prefix")"
done
}

View File

@@ -1,303 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Affichage en couleur, et support de niveaux de "verbosité" et d'interaction
##@cooked nocomments
##@require base
uprovide pretty
urequire base
################################################################################
# Gestion des couleurs
function __get_color() {
[ -z "$*" ] && set RESET
echo_ $'\e['
local sep
while [ -n "$1" ]; do
[ -n "$sep" ] && echo_ ";"
case "$1" in
z|RESET) echo_ "0";;
o|BLACK) echo_ "30";;
r|RED) echo_ "31";;
g|GREEN) echo_ "32";;
y|YELLOW) echo_ "33";;
b|BLUE) echo_ "34";;
m|MAGENTA) echo_ "35";;
c|CYAN) echo_ "36";;
w|WHITE) echo_ "37";;
DEFAULT) echo_ "39";;
O|BLACK_BG) echo_ "40";;
R|RED_BG) echo_ "41";;
G|GREEN_BG) echo_ "42";;
Y|YELLOW_BG) echo_ "43";;
B|BLUE_BG) echo_ "44";;
M|MAGENTA_BG) echo_ "45";;
C|CYAN_BG) echo_ "46";;
W|WHITE_BG) echo_ "47";;
DEFAULT_BG) echo_ "49";;
@|BOLD) echo_ "1";;
-|FAINT) echo_ "2";;
_|UNDERLINED) echo_ "4";;
~|REVERSE) echo_ "7";;
n|NORMAL) echo_ "22";;
esac
sep=1
shift
done
echo_ "m"
}
function get_color() {
[ -n "$NO_COLORS" ] && return
__get_color "$@"
}
function __set_no_colors() {
if [ -z "$1" ]; then
if [ -n "$UTOOLS_NO_COLORS" ]; then NO_COLORS=1
elif out_isatty && err_isatty; then NO_COLORS=
else NO_COLORS=1
fi
else
is_yes "$1" && NO_COLORS=1 || NO_COLORS=
fi
COULEUR_ROUGE="$(get_color RED BOLD)"
COULEUR_VERTE="$(get_color GREEN BOLD)"
COULEUR_JAUNE="$(get_color YELLOW BOLD)"
COULEUR_BLEUE="$(get_color BLUE BOLD)"
COULEUR_BLANCHE="$(get_color WHITE BOLD)"
COULEUR_NORMALE="$(get_color RESET)"
}
__set_no_colors
function __eerror() { tooenc "$(__edate)${__tlevel}${COULEUR_ROUGE}* error:${COULEUR_NORMALE} $(__indent "$1")"; }
function __ewarn() { tooenc "$(__edate)${__tlevel}${COULEUR_JAUNE}* warning:${COULEUR_NORMALE} $(__indent "$1")"; }
function __enote() { tooenc "$(__edate)${__tlevel}${COULEUR_VERTE}* note:${COULEUR_NORMALE} $(__indent "$1")"; }
function __ebanner() {
local maxi="${COLUMNS:-80}"
local -a lines
local psfix line
psfix="$(__edate)${__tlevel}"
while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done
tooenc "$COULEUR_ROUGE$psfix"
maxi=$(($maxi - 1))
array_from_xlines lines "$1"
for line in "" "${lines[@]}" ""; do
line="$(__edate)${__tlevel}= $line"
if [ ${#line} -le $maxi ]; then
while [ ${#line} -lt $maxi ]; do line="$line "; done
line="$line="
fi
tooenc "$line"
done
tooenc "$psfix$COULEUR_NORMALE"
}
function __eimportant() { tooenc "$(__edate)${__tlevel}${COULEUR_ROUGE}* important:${COULEUR_NORMALE} $(__indent "$1")"; }
function __eattention() { tooenc "$(__edate)${__tlevel}${COULEUR_JAUNE}* attention:${COULEUR_NORMALE} $(__indent "$1")"; }
function __einfo() { tooenc "$(__edate)${__tlevel}${COULEUR_BLEUE}* info:${COULEUR_NORMALE} $(__indent "$1")"; }
function __edebug() { tooenc "$(__edate)${__tlevel}${COULEUR_BLANCHE}* debug:${COULEUR_NORMALE} $(__indent "$1")"; }
function __estep() { tooenc "$(__edate)${__tlevel}${COULEUR_BLANCHE}*${COULEUR_NORMALE} $(__indent "$1")"; }
function __estepe() { tooenc "$(__edate)${__tlevel}${COULEUR_ROUGE}*${COULEUR_NORMALE} $(__indent "$1")"; }
function __estepw() { tooenc "$(__edate)${__tlevel}${COULEUR_JAUNE}*${COULEUR_NORMALE} $(__indent "$1")"; }
function __estepn() { tooenc "$(__edate)${__tlevel}${COULEUR_VERTE}*${COULEUR_NORMALE} $(__indent "$1")"; }
function __estepi() { tooenc "$(__edate)${__tlevel}${COULEUR_BLEUE}*${COULEUR_NORMALE} $(__indent "$1")"; }
function __estep_() { tooenc_ "$(__edate)${__tlevel}${COULEUR_BLANCHE}*${COULEUR_NORMALE} $(__indent "$1")"; }
function __estepe_() { tooenc_ "$(__edate)${__tlevel}${COULEUR_ROUGE}*${COULEUR_NORMALE} $(__indent "$1")"; }
function __estepw_() { tooenc_ "$(__edate)${__tlevel}${COULEUR_JAUNE}*${COULEUR_NORMALE} $(__indent "$1")"; }
function __estepn_() { tooenc_ "$(__edate)${__tlevel}${COULEUR_VERTE}*${COULEUR_NORMALE} $(__indent "$1")"; }
function __estepi_() { tooenc_ "$(__edate)${__tlevel}${COULEUR_BLEUE}*${COULEUR_NORMALE} $(__indent "$1")"; }
function __etitle() { tooenc "$(__edate)${__tlevel}${COULEUR_BLEUE}+++ $(get_color _)$(__indent "$1")${COULEUR_NORMALE}"; }
function __ebegin() { tooenc_ "$(__edate)${__tlevel}${COULEUR_BLANCHE}*${COULEUR_NORMALE} $(__indent "$1"): "; }
function __edoto() { echo_ "."; }
function __edotw() { echo_ "${COULEUR_JAUNE}w${COULEUR_NORMALE}"; }
function __edotx() { echo_ "${COULEUR_ROUGE}x${COULEUR_NORMALE}"; }
function __edotp() { echo_ "${COULEUR_JAUNE}+${COULEUR_NORMALE}"; }
function __edotd() { tooenc "($1)"; }
function __eendo() { echo "${COULEUR_VERTE}[ok]${COULEUR_NORMALE}"; }
function __eendx() { echo "${COULEUR_ROUGE}[error]${COULEUR_NORMALE}"; }
# 5=afficher les messages de debug; 4=afficher les message verbeux;
# 3=afficher les message informatifs; 2=afficher les warnings et les notes;
# 1=afficher les erreurs; 0=ne rien afficher
export __verbosity
[ -z "$__verbosity" ] && __verbosity=3
function set_verbosity() {
[ -z "$__verbosity" ] && __verbosity=3
case "$1" in
-Q|--very-quiet) __verbosity=0;;
-q|--quiet) [ "$__verbosity" -gt 0 ] && let __verbosity=$__verbosity-1;;
-v|--verbose) [ "$__verbosity" -lt 5 ] && let __verbosity=$__verbosity+1;;
-c|--default) __verbosity=3;;
-D|--debug) __verbosity=5; DEBUG=1;;
*) return 1;;
esac
return 0
}
# 3=interaction maximale; 2=interaction par défaut
# 1= interaction minimale; 0=pas d'interaction
export __interaction
[ -z "$__interaction" ] && __interaction=2
function set_interaction() {
[ -z "$__interaction" ] && __interaction=2
case "$1" in
-b|--batch) __interaction=0;;
-y|--automatic) [ "$__interaction" -gt 0 ] && let __interaction=$__interaction-1;;
-i|--interactive) [ "$__interaction" -lt 3 ] && let __interaction=$__interaction+1;;
-c|--default) __interaction=2;;
*) return 1;;
esac
return 0
}
# Variable à inclure pour lancer automatiquement set_verbosity et
# set_interaction en fonction des arguments de la ligne de commande. A utiliser
# de cette manière:
# parse_opts ... "${PRETTYOPTS[@]}" @ args -- ...
PRETTYOPTS=(
-L:,--log-to: '$elogto $value_'
-Q,--very-quiet,-q,--quiet,-v,--verbose,-D,--debug '$set_verbosity $option_'
-b,--batch,-y,--automatic,-i,--interactive '$set_interaction $option_'
)
function show_error() { [ "$__verbosity" -ge 1 ]; }
function show_warn() { [ "$__verbosity" -ge 2 ]; }
function show_info() { [ "$__verbosity" -ge 3 ]; }
function show_verbose() { [ "$__verbosity" -ge 4 ]; }
function show_debug() { [ -n "$DEBUG" -o "$__verbosity" -ge 5 ]; }
# Vérifier le niveau de verbosité actuel par rapport à l'argument. $1 peut valoir:
# -Q retourner true si on peut afficher les messages d'erreur
# -q retourner true si on peut afficher les messages d'avertissement
# -c retourner true si on peut afficher les message normaux
# -v retourner true si on peut afficher les messages verbeux
# -D retourner true si on peut afficher les messages de debug
function check_verbosity() {
case "$1" in
-Q|--very-quiet) [ "$__verbosity" -ge 1 ];;
-q|--quiet) [ "$__verbosity" -ge 2 ];;
-c|--default) [ "$__verbosity" -ge 3 ];;
-v|--verbose) [ "$__verbosity" -ge 4 ];;
-D|--debug) [ -n "$DEBUG" -o "$__verbosity" -ge 5 ];;
*) return 0;;
esac
}
# Retourner l'option correspondant au niveau de verbosité actuel
function get_verbosity_option() {
case "$__verbosity" in
0) echo --very-quiet;;
1) echo --quiet --quiet;;
2) echo --quiet;;
4) echo --verbose;;
5) echo --debug;;
esac
}
# Vérifier le niveau d'interaction autorisé par rapport à l'argument. Par
# exemple, 'check_interaction -y' signifie "Il ne faut interagir avec
# l'utilisateur qu'à partir du niveau d'interaction -y. Suis-je dans les
# condition voulues pour autoriser l'interaction?"
# $1 peut valoir:
# -b retourner true
# -y retourner true si on est au moins en interaction minimale
# -c retourner true si on est au moins en interaction normale
# -i retourner true si on est au moins en interaction maximale
function check_interaction() {
case "$1" in
-b|--batch) return 0;;
-y|--automatic) [ -n "$__interaction" -a "$__interaction" -ge 1 ];;
-c|--default) [ -n "$__interaction" -a "$__interaction" -ge 2 ];;
-i|--interactive) [ -n "$__interaction" -a "$__interaction" -ge 3 ];;
*) return 0;;
esac
}
# Vérifier le niveau d'interaction dans lequel on se trouve actuellement. $1
# peut valoir:
# -b retourner true si l'une des options -b ou -yy a été spécifiée
# -Y retourner true si l'une des options -b, -yy, ou -y a été spécifiée
# -y retourner true si l'option -y a été spécifiée
# -c retourner true si aucune option n'a été spécifiée
# -i retourner true si l'option -i a été spécifiée
# -C retourner true si aucune option ou l'option -i ont été spécifiés
function is_interaction() {
case "$1" in
-b|--batch) [ -n "$__interaction" -a "$__interaction" -eq 0 ];;
-Y) [ -n "$__interaction" -a "$__interaction" -le 1 ];;
-y|--automatic) [ -n "$__interaction" -a "$__interaction" -eq 1 ];;
-c|--default) [ -n "$__interaction" -a "$__interaction" -eq 2 ];;
-i|--interactive) [ -n "$__interaction" -a "$__interaction" -eq 3 ];;
-C) [ -n "$__interaction" -a "$__interaction" -ge 2 ];;
*) return 1;;
esac
}
# Retourner l'option correspondant au niveau d'interaction actuel
function get_interaction_option() {
case "$__interaction" in
0) echo --batch;;
1) echo --automatic;;
3) echo --interactive;;
esac
}
##XXX les fonctions ci-dessous restent à migrer
##function edot() {
## # Une étape d'une opération commencée par ebegin, matérialisée par un "."
## # Si l'argument est un fichier, utiliser -f pour que "$HOME" et "$(pwd)/"
## # soient remplacés respectivement par "~" et "" (afin que les chemins soient
## # plus courts)
## # Si l'argument est un commentaire, utiliser -m pour le spécifier. -w
## # indique que l'argument est un warning: un x jaune est affiché, avec le
## # message associé si on est en mode debug.
## # Sinon, l'argument est un status. 0 affiche un ".", sinon on affiche un "x"
## local status=$?
## local warn= color=
##
## if [ -n "$utools_edot_first_" ]; then
## # au premier dot, afficher un espace d'abord
## echo_ " "
## utools_edot_first_=
## fi
##
## eval `check_verbosity --action "$1" 2`
## if is_debug; then
## local msg paths path
## if [ "$1" = "-f" ]; then
## # chemins
## shift
## for path in "$@"; do
## paths="${paths:+$paths,}$(ppath "$path")"
## done
## msg="$paths"
## elif [ "$1" = "-m" -o "$1" = "-w" ]; then
## # message
## [ "$1" = "-w" ] && warn=1 # message de warning
## shift
## msg="$(tooenc "$*")"
## else
## # status
## [ -n "$1" ] && status="$1"
## fi
##
## [ "$utools_ESTATUS_" -eq 0 -a "$status" -ne 0 ] && utools_ESTATUS_="$status"
## if [ "$status" -eq 0 -a -z "$warn" ]; then
## echo_ "${msg:+
## }.${msg:+($msg)}"
## else
## color="$COULEUR_ROUGE"
## [ -n "$warn" ] && color="$COULEUR_JAUNE"
## echo_ "${msg:+
## }${color}x${COULEUR_NORMALE}${msg:+($msg)}"
## fi
## else
## if [ "$1" = "-f" -o "$1" = "-m" -o "$1" = "-w" ]; then
## [ "$1" = "-w" ] && warn=1 # message de warning
## shift
## else
## [ -n "$1" ] && status="$1"
## fi
##
## [ "$utools_ESTATUS_" -eq 0 -a "$status" -ne 0 ] && utools_ESTATUS_="$status"
## if [ "$status" -eq 0 -a -z "$warn" ]; then
## echo_ "."
## else
## color="$COULEUR_ROUGE"
## [ -n "$warn" ] && color="$COULEUR_JAUNE"
## echo_ "${color}x${COULEUR_NORMALE}"
## fi
## fi
##}

View File

@@ -1,78 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Outils pour les distributions redhat
##@cooked nocomments
##@require base
##@require sysinfos
##@require service
uprovide redhat
urequire base sysinfos service
################################################################################
# Gestion des packages
function pkg_check() {
# Vérifier que les packages sont installés sur le système
local pkg
for pkg in "$@"; do
rpm -q "$pkg" >/dev/null || return 1
done
return 0
}
function pkg_update() {
# Mettre à jour la liste des packages silencieusement sans confirmation
LANG=C yum check-update -q
}
function pkg_upgrade() {
# Mettre à jour la liste des packages silencieusement sans confirmation
LANG=C yum update -qy
}
function pkg_install() {
# Installer les packages silencieusement et sans confirmation
if check_sysinfos -v rhel4 centos4 redhat4 -b 64; then
LANG=C up2date --channel=rhel-x86_64-es-4 "${pkgs[@]}"
#elif check_sysinfos -v rhel4 centos4 redhat4 -b 32; then
# LANG=C up2date --channel=rhel-i386-es-4 "${pkgs[@]}"
else
LANG=C yum install -qy "$@"
fi
}
function pkg_installm() {
# Installer les packages silencieusement et sans confirmation
# Retourner 0 si au moins un des packages a été installé. Sinon, les
# packages n'ont pas été instllés, soit parce qu'ils sont déjà installé,
# soit parce qu'il y a eu une erreur.
if ! pkg_check "$@"; then
# essayer d'installer les packages
pkg_install "$@"
else
# aucun package n'a été installé
return 1
fi
}
################################################################################
# Gestion des services
function service_disable() {
# Désactiver le service $1 pour qu'il ne se lance pas automatiquement au
# démarrage
chkconfig "$1" off
}
function service_enable() {
# Activer le service $1 pour qu'il se lance automatiquement au démarrage
chkconfig "$1" on
}
################################################################################
# Gestion des interfaces réseau
function create_bridge() {
# Créer un nouveau pont nommé $1 avec les paramètres $2
eerror "non implémenté"
return 1
}

1937
ulib/runs

File diff suppressed because it is too large Load Diff

View File

@@ -1,231 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Versionnage sémantique
##@cooked nocomments
##@require base
uprovide semver
urequire base
function __semver_check_version() { [ -z "${1//[a-zA-Z0-9.+-]/}" ]; }
function __semver_check_prelease() { [ -z "${1//[a-zA-Z0-9.-]/}" ]; }
function __semver_check_metadata() { [ -z "${1//[a-zA-Z0-9.-]/}" ]; }
function semver_parse() {
local __p_ver="$1"
local __p_ma="${2:-major}" __p_mi="${3:-minor}" __p_pl="${4:-patchlevel}"
local __p_pr="${5:-prelease}" __p_md="${6:-metadata}" __p_va="${7:-valid}"
local __p_tmp
set_var "$__p_ma" ""
set_var "$__p_mi" ""
set_var "$__p_pl" ""
array_new "$__p_pr"
array_new "$__p_md"
set_var "$__p_va" ""
# vérifier les caractères valides
__semver_check_version "$__p_ver" || return 1
# extraire major
__p_tmp=
while [ "${__p_ver/#[0-9]/}" != "$__p_ver" ]; do
__p_tmp="$__p_tmp${__p_ver:0:1}"
__p_ver="${__p_ver:1}"
done
[ "${__p_ver:0:1}" == . ] || return 1
__p_ver="${__p_ver:1}"
set_var "$__p_ma" "$__p_tmp"
# extraire minor
__p_tmp=
while [ "${__p_ver/#[0-9]/}" != "$__p_ver" ]; do
__p_tmp="$__p_tmp${__p_ver:0:1}"
__p_ver="${__p_ver:1}"
done
[ "${__p_ver:0:1}" == . ] || return 1
__p_ver="${__p_ver:1}"
set_var "$__p_mi" "$__p_tmp"
# extraire patchlevel
__p_tmp=
while [ "${__p_ver/#[0-9]/}" != "$__p_ver" ]; do
__p_tmp="$__p_tmp${__p_ver:0:1}"
__p_ver="${__p_ver:1}"
done
[ -z "$__p_ver" -o "${__p_ver:0:1}" == - -o "${__p_ver:0:1}" == + ] || return 1
set_var "$__p_pl" "$__p_tmp"
# extraire prelease
if [ "${__p_ver:0:1}" == - ]; then
__p_ver="${__p_ver:1}"
if [[ "$__p_ver" == *+* ]]; then
__p_tmp="${__p_ver%%+*}"
__p_ver="+${__p_ver##*+}"
else
__p_tmp="$__p_ver"
__p_ver=
fi
__semver_check_prelease "$__p_tmp" || return 1
array_split "$__p_pr" "$__p_tmp" .
fi
# extraire metadata
if [ "${__p_ver:0:1}" == + ]; then
__p_ver="${__p_ver:1}"
__p_tmp="$__p_ver"
__p_ver=
__semver_check_metadata "$__p_tmp" || return 1
array_split "$__p_md" "$__p_tmp" .
fi
# on doit avoir tout analysé
[ -z "$__p_ver" ] || return 1
set_var "$__p_va" 1
return 0
}
function semver_incmajor() {
set_var "$1" $((${!1} + 1))
set_var "$2" 0
set_var "$3" 0
array_new "$4"
}
function semver_incminor() {
set_var "$2" $((${!2} + 1))
set_var "$3" 0
array_new "$4"
}
function semver_incpatchlevel() {
set_var "$3" $((${!3} + 1))
array_new "$4"
}
function semver_setversion() {
local __sv_ma __sv_mi __sv_svl __sv_svr __sv_md __sv_va
semver_parse "$1" __sv_ma __sv_mi __sv_pl __sv_pr __sv_md __sv_va
[ -n "$__sv_va" ] || return 1
set_var "$2" "$__sv_ma"
set_var "$3" "$__sv_mi"
set_var "$4" "$__sv_pl"
return 0
}
function semver_setprelease() {
if [ -n "$1" ]; then
__semver_check_prelease "$1" || return 1
array_split "$5" "$1" .
else
array_new "$5"
fi
return 0
}
function semver_compare_prelease() {
local -a __cp_pr1 __cp_pr2 __cp_len i __cp_v1 __cp_v2
array_copy __cp_pr1 "$1"
array_copy __cp_pr2 "$2"
if [ ${#__cp_pr1[*]} -eq 0 -a ${#__cp_pr2[*]} -eq 0 ]; then
# final == final
echo eq; return
elif [ ${#__cp_pr1[*]} -gt 0 -a ${#__cp_pr2[*]} -eq 0 ]; then
# prelease < final
echo lt; return
elif [ ${#__cp_pr1[*]} -eq 0 -a ${#__cp_pr2[*]} -gt 0 ]; then
# final > prelease
echo gt; return
fi
# calculer le nombre d'éléments à comparer dans les deux tableaux soit
# min(len(__cp_pr1), len(__cp_pr2))
__cp_len=${#__cp_pr1[*]}
[ ${#__cp_pr2[*]} -lt $__cp_len ] && __cp_len=${#__cp_pr2[*]}
# comparer __cp_len éléments
i=0
while [ $i -lt $__cp_len ]; do
__cp_v1="${__cp_pr1[$i]}"
__cp_v2="${__cp_pr2[$i]}"
if [ "$__cp_v1" == "$__cp_v2" ]; then
:
elif isnum "$__cp_v1" && isnum "$__cp_v2"; then
if [ $__cp_v1 -lt $__cp_v2 ]; then
echo lt; return
elif [ $__cp_v1 -gt $__cp_v2 ]; then
echo gt; return
fi
elif isnum "$__cp_v1"; then
echo lt; return
elif isnum "$__cp_v2"; then
echo gt; return
else
# comparaison chaine
if [ "$(echo "$__cp_v1"$'\n'"$__cp_v2" | LANG=C sort | head -n1)" == "$__cp_v1" ]; then
echo lt; return
else
echo gt; return
fi
fi
i=$(($i + 1))
done
# comparer ce qui reste
__cp_pr1=("${__cp_pr1[@]:$__cp_len}")
__cp_pr2=("${__cp_pr2[@]:$__cp_len}")
if [ ${#__cp_pr1[*]} -gt 0 ]; then
echo gt; return
elif [ ${#__cp_pr2[*]} -gt 0 ]; then
echo lt; return
fi
# en définitive, c'est égal
echo eq
}
function semver_setmetadata() {
if [ -n "$1" ]; then
__semver_check_metadata "$1" || return 1
array_split "$6" "$1" .
else
array_new "$5"
fi
return 0
}
function semver_compare_metadata() {
# même algo que pour prelease
semver_compare_prelease "$@"
}
function semver_copy() {
set_var "$1" "${!6}"
set_var "$2" "${!7}"
set_var "$3" "${!8}"
array_copy "$4" "$9"
array_copy "$5" "${10}"
}
function semver_build() {
echo_ "${!1}.${!2}.${!3}"
array_isempty "$4" || rawecho_ "-$(array_join "$4" .)"
array_isempty "$5" || rawecho_ "+$(array_join "$5" .)"
echo ""
}
function semver_setvar() {
set_var "$1" "$(semver_build "$2" "$3" "$4" "$5" "$6")"
}
################################################################################
# Les fonctions psemver_* sont comme semver_* mais les noms de variables sont
# standardisés (major, minor, pathchlevel, prelease, metadata) et l'on spécifie
# uniquement un préfixe pour les noms de variable
function psemver_parse() { semver_parse "$1" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata" "${2}valid"; }
function psemver_incmajor() { semver_incmajor "${1}major" "${1}minor" "${1}patchlevel" "${1}prelease" "${1}metadata"; }
function psemver_incminor() { semver_incminor "${1}major" "${1}minor" "${1}patchlevel" "${1}prelease" "${1}metadata"; }
function psemver_incpatchlevel() { semver_incpatchlevel "${1}major" "${1}minor" "${1}patchlevel" "${1}prelease" "${1}metadata"; }
function psemver_setversion() { semver_setversion "$1" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata"; }
function psemver_setprelease() { semver_setprelease "$1" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata"; }
function psemver_compare_prelease() { semver_compare_prelease "${1}prelease" "${2}prelease"; }
function psemver_setmetadata() { semver_setmetadata "$1" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata"; }
function psemver_compare_metadata() { semver_compare_metadata "${1}metadata" "${2}metadata"; }
function psemver_copy() { semver_copy "${1}major" "${1}minor" "${1}patchlevel" "${1}prelease" "${1}metadata" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata"; }
function psemver_build() { semver_build "${1}major" "${1}minor" "${1}patchlevel" "${1}prelease" "${1}metadata"; }
function psemver_setvar() { semver_setvar "$1" "${2}major" "${2}minor" "${2}patchlevel" "${2}prelease" "${2}metadata"; }

View File

@@ -1,67 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Des outils pour contrôler les services unix
##@cooked nocomments
uprovide service
urequire sysinfos
function __service() {
# Appliquer la commande $2 au service $1, e.g. 'service daemon restart'
# Si la variable SERVICE_OVERRIDE_$1_$2 existe, utiliser la fonction dont le
# nom est donnée par cette variable pour faire l'opération. Si la valeur est
# 1, prendre la fonction nommée SERVICE_OVERRIDE_$1_$2
# Pour information, le nom de la variable est corrigé en remplaçant '-' par
# '_'. Ceci permet d'utiliser des noms de services avec des '-' dans leur
# nom.
# XXX ajouter le support de MacOS X
local overriden="SERVICE_OVERRIDE_${1}_${2}" overridef
overriden="${overriden//-/_}"
overridef="${!overriden}"
if [ -n "$overridef" ]; then
[ "$overridef" == 1 ] && overridef="$overriden"
"$overridef" "$@"
elif [ -x /usr/sbin/service ]; then
/usr/sbin/service "$@"
else
local script="$1"; shift
"/etc/init.d/$script" "$@"
fi
}
function service() {
if [ "$2" == check ]; then
__service "$1" status >&/dev/null
elif [ "$2" == startm ]; then
__service "$1" status >&/dev/null || __service "$1" start
elif [ "$2" == stopm ]; then
__service "$1" status >&/dev/null && __service "$1" stop
elif [ "$2" == restartm ]; then
__service "$1" status >&/dev/null && __service "$1" restart
else
__service "$@"
fi
}
function service_start() {
# démarrer le service $1 de façon inconditionnelle
service "$1" start
}
function service_startm() {
# démarrer le service $1 s'il n'est pas déjà démarré
service "$1" startm
}
function service_stop() {
# arrêter le service $1 de façon inconditionnelle
service "$1" stop
}
function service_stopm() {
# arrêter le service $1 s'il n'est pas déjà arrêté
service "$1" stopm
}
function service_reload() {
# recharger le service $1
service "$1" reload
}
function service_status() {
# tester/afficher le status du service $1
service "$1" status
}

View File

@@ -1,29 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Support des scripts CGI attaqués par un lien symbolique
##@cooked nocomments
# Ce fichier doit être inclu avec uinc
# Si le script qui inclu ce fichier est lancé comme script CGI par un lien, il
# doit pouvoir accéder à ses fichiers de support à partir de son répertoire
# d'origine. Ce fichier permet de s'assurer que scriptdir a la bonne valeur.
# cgiscriptdir contient la valeur d'origine, c'est à dire le répertoire cgi à
# partir duquel le script est lancé.
cgiscriptdir="$(cd "$(dirname -- "$0")"; pwd)"
cgiscriptname="$(basename -- "$0")"
if [ "$(uname -s)" == Linux ]; then
script="$(readlink -f -- "$0")"
else
# Sur un système autre que linux, les options avancées (-f, -e, -m) de
# readlink n'existent sans doute pas. Implémenter en bash l'équivalent de
# readlink -m
script="$(
function __normpath() { local p="$1" np f; [ "${p#/}" == "$p" ] && p="$(pwd)/$p"; while [[ "$p" == *//* ]]; do p="${p//\/\///}"; done; p="${p%/}"; p="${p#/}"; np=; while [ -n "$p" ]; do if [[ "$p" == */* ]]; then f="${p%%/*}"; p="${p#*/}"; else f="$p"; p=; fi; if [ "$f" == . ]; then :; elif [ "$f" == .. ]; then if [[ "$np" == */* ]]; then np="${np%/*}"; else np=; fi; else [ -n "$np" ] && np="$np/"; np="$np$f"; fi; done; echo "/$np"; }
function __readlinkm() { local p="$(__normpath "$1")" np n; while [ -n "$p" ]; do local max=50; while [ -L "$p" -a $max -gt 0 ]; do n="$(readlink "$p")"; if [ "${n#/}" != "$n" ]; then p="$n"; else p="${p%/*}/$n"; fi; p="$(__normpath "$p")"; max=$(($max-1)); done; [ -n "$np" ] && np="/$np"; if [[ "$p" == */* ]]; then np="${p##*/}$np"; p="${p%/*}"; else np="$p$np"; p=; fi; done; echo "/$np"; }
__readlinkm "$0"
)"
fi
scriptdir="$(dirname -- "$script")"
scriptname="$(basename -- "$script")"
UTOOLS_HAVE_SCRIPTVARS=1
# Juste après avoir inclu ce fichier, on peut rajouter une ligne comme celle-ci
# pour charger ulib:
#source "$scriptdir/ulib/auto"

View File

@@ -1,114 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
u"""Ce script est prévu pour être utilisé dans un script CGI.
Il enregistre les fichiers uploadés dans le répertoire spécifié, et éventuellement lance une commande avec comme argument les fichiers enregistrés.
"""
import sys, os, types, cgi, tempfile
from os import path
cgitb = None # marqueur pour savoir si le module cgitb a été importé
#import cgitb; cgitb.enable()
class FileManager(object):
def __init__(self, destdir=None, parse_env=True):
if destdir is None: destdir = '/tmp'
self.fileinfos = []
self.count = 0
self.destdir = destdir
if parse_env: self.parse_env()
def parse_env(self):
class FieldStorage(cgi.FieldStorage):
def make_file(self, binary=None):
return self.fm._new_file(self)
FieldStorage.fm = self
self.form = FieldStorage()
def _new_file(self, form):
fp = path.join(self.destdir, 'upload%i' % self.count)
outf = open(fp, 'w+b')
self.count += 1
self.fileinfos.append((form.name, form.filename, fp, form.type))
return outf
def write_csv(self, outf):
close = False
if type(outf) is types.StringType:
outf = open(outf, 'w+b')
close = True
try:
outf.write("name,value,file,type\n")
for fi in self.fileinfos:
outf.write("%s,%s,%s,%s\n" % fi)
finally:
if close: outf.close()
# Analyser les options
from optparse import OptionParser
parser = OptionParser(usage=u"\n\t%prog [options]\n\t%prog [options] -c command [args]", description=__doc__)
parser.add_option('-d', '--destdir', dest='destdir',
help=u"Spécifier le répertoire de destination des fichiers uploadés. Ce répertoire est créé si nécessaire.")
parser.add_option('-p', '--printcsv', action='store_true', dest='printcsv',
help=u"Afficher la liste des fichiers uploadés au format CSV. Chaque ligne est de la forme 'name,value,file,type' où name est le nom du champ dans le formulaire http, value le nom du fichier tel qu'il a été fourni par le client, file le chemin complet vers le fichier uploadé, et type le type mime du contenu.")
parser.add_option('-c', '--cmd', action='store_true', dest='cmd',
help=u"Lancer une commande après avoir enregistré les fichiers. Implique --remove")
parser.add_option('-G', '--infos', action='store_const', const='infos', dest='argtype',
help=u"La commande est lancée avec 4 arguments pour chaque fichier uploadé. Les arguments sont fournis dans l'ordre donné par l'option -p. C'est l'option par défaut.")
parser.add_option('-F', '--files', action='store_const', const='files', dest='argtype',
help=u"La commande est lancée avec en argument chaque fichier uploadé, correspondant à la colonne file de l'option -p")
parser.add_option('-C', '--csv', action='store_const', const='csv', dest='argtype',
help=u"La commande est lancée avec en argument un fichier au format CSV qui liste les fichiers uploadés. Cf l'option -p pour le format de ce fichier.")
parser.set_defaults(argtype='infos')
parser.add_option('--remove', action='store_true', dest='clear',
help=u"Supprimer les fichiers uploadés.")
parser.add_option('-k', '--keep', action='store_false', dest='clear',
help=u"Ne pas supprimer les fichiers uploadés. Utiliser cette option avec -c pour garder les fichiers uploadés.")
parser.add_option('--devel', action='store_true', dest='devel',
help=u"Activer le mode développement: le module cgitb est chargé et activé.")
o, args = parser.parse_args()
if o.devel and cgitb is None:
import cgitb; cgitb.enable()
# Créer destdir le cas échéant
if o.destdir is not None and not path.isdir(o.destdir):
os.makedirs(o.destdir)
# Si aucune commande n'est spécifiée, afficher la liste des fichiers au format CSV
if o.printcsv is None and o.cmd is None:
o.printcsv = True
# Avec -c, par défaut supprimer les fichiers
if o.cmd and o.clear is None:
o.clear = True
fm = FileManager(o.destdir)
if o.printcsv:
fm.write_csv(sys.stdout)
if o.cmd:
tmpfile = None
if o.argtype == 'infos':
for fi in fm.fileinfos:
args.extend(fi)
elif o.argtype == 'files':
args.extend(map(lambda fi: fi[2], fm.fileinfos))
elif o.argtype == 'csv':
fd, tmpfile = tempfile.mkstemp()
os.close(fd)
fm.write_csv(tmpfile)
args.append(tmpfile)
os.spawnvp(os.P_WAIT, args[0], args)
if tmpfile is not None:
try: os.remove(tmpfile)
except: pass
if o.clear:
for fi in fm.fileinfos:
try: os.remove(fi[0])
except: pass

File diff suppressed because it is too large Load Diff

View File

@@ -1,30 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
import sys
import random
try: from crypt import crypt
except ImportError: sys.exit(1)
CHARS = "./abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
if __name__ == '__main__':
args = sys.argv[1:]
if len(args) == 1 and args[0] == '--help':
print """mkcrypt.py - crypter un mot de passe avec la méthode crypt
USAGE
mkcrypt.py clear [salt]"""
sys.exit(0)
elif len(args) > 0 and args[0] == '--':
args = args[1:]
clpasswd = args[0:1] and args[0] or None
salt = args[1:2] and args[1] or random.choice(CHARS) + random.choice(CHARS)
if clpasswd is not None:
print crypt(clpasswd, salt)
sys.exit(0)
else:
sys.exit(1)

View File

@@ -1,81 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
u"""%(scriptname)s: Plier/déplier des inclusions dans un fichier
USAGE
%(scriptname)s [[options] dest...]
OPTIONS
-f Plier les inclusions
-u Déplier les inclusions (par défaut)
-@ Forcer le caractère '@' pour le pliage/dépliage
-* Forcer le caractère '*' pour le pliage/dépliage
--auto
Activer la recherche automatique de paramètres (par défaut)
--noauto
Désactiver la recherche automatique de paramètres
-I SPEC
Spécifier des fichiers à inclure dans les répertoires spécifiés
-X SPEC
Spécifier des fichiers à exclure dans les répertoires spécifiés
--refdir REFDIR
Spécifier le répertoire de référence. Soit un répertoire DEST spécifié
dans les arguments. Si un fichier à inclure *n'est pas* un fils du
répertoire DEST, l'emplacement effectif du fichier est calculé en
faisant comme si DEST==REFDIR.
Par exemple, soit DEST=/dest/path et REFDIR=/refdir/path. Si le fichier
/dest/path/file inclue le fichier ../inc, alors c'est le fichier
/refdir/inc qui est considéré.
Ceci permet de traiter les inclusions dans une copie temporaire d'un
répertoire, dans le cas où les fichier font référence à d'autres
fichiers situés relativement à l'emplacement original.
Les spécifications de fichiers sont de types glob: ils peuvent contenir les
wildcards * et ?. Ils supportent en plus la chaine '**' qui signifie n'importe
quelle profondeur de répertoire. 'dir/' est équivalent à 'dir/**' et signifie
tous les fichiers situés dans l'arborescence à partir de dir.
La variable UINCPATH contient une liste de répertoires qui sont consultés pour
trouver les fichiers à inclure."""
import os, sys
from os import path
from ulib.all import *
from ulib.p.uinc import Updater, ConsoleOutput
def display_help():
uprint(__doc__ % globals())
def run_uinc():
action, options, args, params = Updater.parse_options(None)
for option, value in options:
if option in ('-h', '--help'):
display_help()
sys.exit(0)
uincdirs = os.environ.get('UINCPATH', '').split(os.pathsep)
uincdirs = filter(None, uincdirs)
updater = Updater(args, **params)
updater.out = ConsoleOutput()
updater.uincdirs = uincdirs
if updater.auto:
auto_args = u"\n ".join([relpath(p) for p in updater.args])
auto_msg = u"""Les fichiers/répertoires suivants seront traités:
%s
Cette liste a été calculée automatiquement. Vous pouvez désactiver la
configuration automatique avec --noauto. Voulez-vous continuer?""" % auto_args
if not ask_yesno(auto_msg, True):
return False
should_update, reason = updater.should_update()
if should_update:
return updater.update(action)
else:
ewarn(u"no update because %s" % reason)
if __name__ == '__main__':
raise Exit(run_uinc())

View File

@@ -1,32 +0,0 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# charger le fichier de configuration $1 pour avoir ULIBDIR
source "$1" || exit 1
source "$ULIBDIR/ulib" && urequire DEFAULTS uinst || exit 1
OENC="$UTF8"
is_root || die "Ce script doit être lancé avec les droits de root"
# recharger la configuration avec la base __uinst_defaultvars
__uinst_defaultvars
source "$1" || die
[ -n "$srcdir" ] || die "Il faut spécifier le répertoire source"
[ -e "$srcdir" ] || die "Répertoire/Fichier source inexistant: $srcdir"
################################################################################
# Copie des fichiers
if is_yes "$copy_files"; then
[ -n "$destdir" ] || die "Il faut spécifier le répertoire de destination"
etitle "Copie des fichiers" __uinst2s_copy_files || die
fi
################################################################################
# Lancement des scripts
if [ -n "${root_scripts[*]}" ]; then
# passer aux script le chemin vers le fichier de configuration
etitle "Lancement des scripts root" __uinst2s_root_scripts "$1" || die
fi

View File

@@ -1,21 +0,0 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# charger le fichier de configuration $1 pour avoir ULIBDIR
source "$1" || exit 1
source "$ULIBDIR/ulib" && urequire DEFAULTS uinst || exit 1
OENC="$UTF8"
is_root || die "Ce script doit être lancé avec les droits de root"
# recharger la configuration avec la base __uinst_defaultvars
__uinst_defaultvars
source "$1" || die
[ -n "$srcdir" ] || die "Il faut spécifier le répertoire source"
[ -d "$srcdir" ] || die "Répertoire source inexistant: $srcdir"
################################################################################
# Installation du package python
etitle "Installation des packages python" __uinst2s_python_setup || die

View File

@@ -1,232 +0,0 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$1" || exit 1 # pour avoir la définition de ULIBDIR
source "$ULIBDIR/ulib" &&
urequire DEFAULTS prefixes apache webobjects wosign ||
exit 1
OENC="$UTF8"
is_root || die "Ce script doit être lancé avec les droits de root"
set_defaults WOServices
urequire wondermonitor
compute_apache_prefixes
compute_webobjects_prefixes
source "$1" # relire les éventuelles valeurs forcées pour les préfixes
create_wodirs_maybe
wosign_setup_maybe
function rm_ifexists() {
if [ -d "$1" ]; then
/bin/rm -rf "$1"
fi
}
################################################################################
if [ -z "$webinst" ]; then
# récupérer les informations sur le mapping bundle -> application
wom_getApplications appinfos
# Calculer les instances à relancer, en fonctions des applications et des
# frameworks à déployer
apps_to_restart=("${applications[@]}" "${frameworks[@]}")
array_map apps_to_restart basename
etitle "Calcul des instances à relancer" \
compute_apps apps_to_restart appinfos "${apps_to_restart[@]}"
if [ -z "$bounce" ]; then
# Arrêter les instances
disable_autorecover=1
stop_apps -a apps_to_start "" "" "${apps_to_restart[@]}"
fi
fi
################################################################################
# Déployer les frameworks
if [ -n "${frameworks[*]}" ]; then
etitle -s "Déploiement des frameworks"
destdir="$WOFRAMEWORKS"
webdestdir="$HTDOCSDIR/WebObjects/Frameworks"
for bundle in "${frameworks[@]}"; do
fwkname="$(basename "$bundle")"
fwkbasename="${fwkname%.framework}"
fwkdesc=
oldfwkname="$fwkname.orig"
etitle -s "$fwkname${fwkdesc:+: $fwkdesc}"
if [ -z "$webinst" ]; then
ebegin "Correction de la casse du jar principal"
jar="$(awk <"$bundle/Resources/Info.plist" '
/<key>NSJavaPathClient<\/key>/ {
getline
gsub("^.*<string>", "")
gsub("</string>.*$", "")
print
}
')"
if [ -n "$jar" ]; then
lower_jar="$bundle/Resources/Java/$(echo "$jar" | awk '{print tolower($0)}')"
jar="$bundle/Resources/Java/$jar"
if [ ! -f "$jar" -a -f "$lower_jar" ]; then
/bin/mv "$lower_jar" "$jar"; edot
fi
fi
eend
fi
if reason="$(wosignable "$bundle")"; then
estep "Signature des jars"
wosign -d -s "$bundle"
fi
if [ -d "$destdir/$fwkname" ]; then
ebegin "Suppression de l'ancienne installation"
if [ -z "$webinst" ]; then
rm_ifexists "$destdir/$oldfwkname"; edot
/bin/mv "$destdir/$fwkname" "$destdir/$oldfwkname"; edot
fi
rm_ifexists "$webdestdir/$oldfwkname"; edot
if [ -d "$webdestdir/$fwkname" ]; then
/bin/mv "$webdestdir/$fwkname" "$webdestdir/$oldfwkname"; edot
fi
eend
fi
if [ -z "$webinst" ]; then
# copie des fichiers
ebegin "Copie des fichiers"
mkdir -p "$destdir"; edot
cpdir "$bundle" "$destdir/$fwkname" &
ewait $!
eend
# permissions
ebegin "Ajustement des permission"
chown -R root: "$destdir/$fwkname"; edot
chmod -R u=rwX,g=rX,o=rX "$destdir/$fwkname"; edot
eend
fi
if [ -d "$bundle/WebServerResources" ]; then
# copie des fichiers pour le web
ebegin "Copie des ressources web"
cpdir "$bundle/WebServerResources" "$webdestdir/$fwkname/WebServerResources" &
ewait $!
eend
# permissions
ebegin "Ajustement des permission"
chown -R root: "$webdestdir/$fwkname"; edot
chmod -R u=rwX,g=rX,o=rX "$webdestdir/$fwkname"; edot
eend
fi
eend
done
eend
fi
################################################################################
# Déployer les applications
if [ -n "${applications[*]}" ]; then
etitle -s "Déploiement des applications"
destdir="$WOAPPLICATIONS"
webdestdir="$HTDOCSDIR/WebObjects"
for bundle in "${applications[@]}"; do
appname="$(basename "$bundle")"
appbasename="${appname%.woa}"
appdesc=
oldappname="$appname.orig"
etitle -s "$appname${appdesc:+: $appdesc}"
if [ -z "$webinst" ]; then
estep "Correction éventuelle de la casse des jars"
fix_jars_case "$bundle"
fi
estep "Vérification du bundle"
verifix_bundle "$bundle"
if reason="$(wosignable "$bundle")"; then
estep "Signature des jars"
wosign -d -s "$bundle"
fi
if [ -d "$destdir/$appname" ]; then
ebegin "Suppression de l'ancienne installation"
if [ -z "$webinst" ]; then
rm_ifexists "$destdir/$oldappname"; edot
/bin/mv "$destdir/$appname" "$destdir/$oldappname"; edot
fi
rm_ifexists "$webdestdir/$oldappname"; edot
if [ -d "$webdestdir/$appname" ]; then
/bin/mv "$webdestdir/$appname" "$webdestdir/$oldappname"; edot
fi
eend
fi
if [ -z "$webinst" ]; then
# copie des fichiers
ebegin "Copie des fichiers"
mkdir -p "$destdir"; edot
cpdir "$bundle" "$destdir/$appname" &
ewait $!
eend
# permissions
ebegin "Ajustement des permission"
chown -R root: "$destdir/$appname"; edot
chmod -R u=rwX,g=rX,o=rX "$destdir/$appname"; edot
eend
fi
if [ -d "$bundle/Contents/WebServerResources" ]; then
# copie des fichiers pour le web
ebegin "Copie des ressources web"
cpdir "$bundle/Contents/WebServerResources" "$webdestdir/$appname/Contents/WebServerResources" &
ewait $!
eend
# permissions
ebegin "Ajustement des permission"
chown -R root: "$webdestdir/$appname"; edot
chmod -R u=rwX,g=rX,o=rX "$webdestdir/$appname"; edot
eend
fi
eend
done
eend
fi
################################################################################
if [ -z "$webinst" ]; then
if [ -z "$bounce" ]; then
# Démarrer les instances
enable_autorecover=1
start_apps "" "" "${apps_to_start[@]}"
else
# Relancer les applications en mode bounce
bounce_apps "" "" "${apps_to_restart[@]}"
fi
fi
################################################################################
# Lancer les scripts
for script in "${scripts[@]}"; do
eval "$script"
done

View File

@@ -1,384 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion des informations sur l'hôte local
##@cooked nocomments
##@require base
uprovide sysinfos
urequire base
################################################################################
## Informations sur le système local
## type de système
# attention: dans SYSNAMES et *_SYSDISTS, les noms doivent être ordonnés du
# moins spécifique au plus spécifique
SYSNAMES=(linux linux64 linux32 linuxppc64 linuxppc32 linuxarm macosx)
linux_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo)
linux32_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo)
linux64_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo)
linuxppc32_SYSDISTS=(debianlike debian ubuntu redhatlike fedora)
linuxppc64_SYSDISTS=(debianlike debian ubuntu redhatlike fedora)
linuxarm_SYSDISTS=(debianlike debian ubuntu)
macosx_SYSDISTS=(lion snowleopard leopard tiger panther)
SYSDIST_ALIASES=(
10.7=lion 10.6=snowleopard 10.5=leopard 10.4=tiger 10.3=panther
)
# attention: dans *_SYSVERS, les noms doivent être ordonnés du plus récent au
# moins récent
debianlike_SYSVERS=()
debian_SYSVERS=(wheezy squeeze lenny etch)
ubuntu_SYSVERS=(oneiric natty maverick lucid karmic jaunty intrepid hardy)
redhatlike_SYSVERS=()
rhel_SYSVERS=(rhel6 rhel5 rhel4 redhat6 redhat5 redhat4)
fedora_SYSVERS=(fedora14 fedora13 fedora12 fedora11)
centos_SYSVERS=(centos6 centos5 centos4 redhat6 redhat5 redhat4)
suse_SYSVERS=()
gentoo_SYSVERS=()
SYSVER_ALIASES=(
7=wheezy 6=squeeze 5=lenny 4=etch
11.10=oneiric 11.04=natty 10.10=maverick 10.04=lucid 9.10=karmic 9.04=jaunty 8.10=intrepid 8.04=hardy
)
function __setup_ALL_SYSvars() {
local s ds d fs f
ALL_SYSDISTS=()
for s in "${SYSNAMES[@]}"; do
array_copy ds "${s}_SYSDISTS"
for d in "${ds[@]}"; do
array_set ALL_SYSDISTS "$d"
done
done
ALL_SYSVERS=()
for d in "${ALL_SYSDISTS[@]}"; do
array_copy fs "${d}_SYSVERS"
for f in "${fs[@]}"; do
# les valeurs sont poussés vers la fin si elles existent déjà
array_contains ALL_SYSVERS "$f" && array_del ALL_SYSVERS "$f"
array_add ALL_SYSVERS "$f"
done
done
}
__setup_ALL_SYSvars
unset -f __setup_ALL_SYSvars
MYSYSNAME=()
MYBITS=
MYSYSDIST=()
MYSYSVER=()
if [ "$UNAME_SYSTEM" == "Linux" ]; then
case "$UNAME_MACHINE" in
x86_64)
MYSYSNAME=(linux64 linux)
MYBITS=64
;;
i386|i586|i686)
MYSYSNAME=(linux32 linux)
MYBITS=32
;;
ppc)
MYSYSNAME=(linuxppc32 linuxppc linux)
MYBITS=32
;;
ppc64)
MYSYSNAME=(linuxppc64 linuxppc linux)
MYBITS=64
;;
arm*)
MYSYSNAME=(linuxarm linux)
;;
*)
MYSYSNAME=(linux)
;;
esac
if [ -f /etc/debian_version ]; then
case "$(</etc/debian_version)" in
7*|wheezy*) MYSYSDIST=(debian debianlike); MYSYSVER=(wheezy);;
6*|squeeze*) MYSYSDIST=(debian debianlike); MYSYSVER=(squeeze);;
5*) MYSYSDIST=(debian debianlike); MYSYSVER=(lenny);;
4*) MYSYSDIST=(debian debianlike); MYSYSVER=(etch);;
*) MYSYSDIST=(debianlike);;
esac
elif [ -f /etc/gentoo-release ]; then
MYSYSDIST=(gentoo)
elif [ -f /etc/redhat-release ]; then
case "$(</etc/redhat-release)" in
Fedora*) MYSYSDIST=(fedora redhatlike);;
Red*Hat*Enterprise*Linux*) MYSYSDIST=(rhel redhatlike);;
CentOS*) MYSYSDIST=(centos redhatlike);;
*) MYSYSDIST=(redhatlike);;
esac
case "$(</etc/redhat-release)" in
Fedora*14*) MYSYSVER=(fedora14);;
Fedora*13*) MYSYSVER=(fedora13);;
Fedora*12*) MYSYSVER=(fedora12);;
Fedora*11*) MYSYSVER=(fedora11);;
Red*Hat*Enterprise*Linux*release\ 6*) MYSYSVER=(rhel6 redhat6);;
Red*Hat*Enterprise*Linux*release\ 5*) MYSYSVER=(rhel5 redhat5);;
Red*Hat*Enterprise*Linux*release\ 4*) MYSYSVER=(rhel4 redhat4);;
CentOS*release\ 6*) MYSYSVER=(centos6 redhat6);;
CentOS*release\ 5*) MYSYSVER=(centos5 redhat5);;
CentOS*release\ 4*) MYSYSVER=(centos4 redhat4);;
esac
fi
elif [ "$UNAME_SYSTEM" == "Darwin" ]; then
function get_macosx_version() {
local i
for i in /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist /System/Library/Frameworks/CoreServices.framework/Resources/version.plist; do
if [ -f "$i" ]; then
grep -A 1 CFBundleShortVersionString "$i" | grep string | sed 's/.*<string>//g
s/<\/string>.*$//g'
break
fi
done
}
MYSYSNAME=(macosx darwin)
case "$(get_macosx_version)" in
10.7*) MYSYSDIST=(lion);;
10.6*) MYSYSDIST=(snowleopard);;
10.5*) MYSYSDIST=(leopard);;
10.4*) MYSYSDIST=(tiger);;
10.3*) MYSYSDIST=(panther);;
esac
fi
if [ -n "$UTOOLS_CHROOT" ]; then
# Dans un chroot, il est possible de forcer les valeurs
[ -n "$UTOOLS_SYSNAME" ] && eval "MYSYSNAME=($UTOOLS_SYSNAME)"
[ -n "$UTOOLS_BITS" ] && eval "MYBITS=$UTOOLS_BITS"
[ -n "$UTOOLS_SYSDIST" ] && eval "MYSYSDIST=($UTOOLS_SYSDIST)"
[ -n "$UTOOLS_SYSVER" ] && eval "MYSYSVER=($UTOOLS_SYSVER)"
fi
function __get_sysdist_alias() {
if ! array_contains ALL_SYSDISTS "$1"; then
local nd n d
for nd in "${SYSDIST_ALIASES[@]}"; do
splitvar "$nd" n d
if [ "$n" == "$1" ]; then
echo "$d"
return
fi
done
fi
echo "$1"
}
function __get_sysver_alias() {
if ! array_contains ALL_SYSVERS "$1"; then
local nv n v
for nv in "${SYSVER_ALIASES[@]}"; do
splitvar "$nv" n v
if [ "$n" == "$1" ]; then
echo "$v"
return
fi
done
fi
echo "$1"
}
function __fix_sysinfos_upward() {
local sysname_ sysdists_ sysdist_ sysvers_ sysver_
if [ -z "${!sysnamevar_}" ]; then
if [ -z "${!sysdistvar_}" ]; then
[ -z "${!sysvervar_}" ] && return
# essayer de déterminer !sysdistvar_ à partir de !sysvervar_
for sysname_ in "${SYSNAMES[@]}"; do
array_copy sysdists_ "${sysname_}_SYSDISTS"
for sysdist_ in "${sysdists_[@]}"; do
array_copy sysvers_ "${sysdist_}_SYSVERS"
for sysver_ in "${sysvers_[@]}"; do
if [ "$sysver_" == "${!sysvervar_}" ]; then
set_var "$sysdistvar_" "$sysdist_"
set_var "$sysnamevar_" "$sysname_"
return
fi
done
done
done
fi
[ -z "${!sysdistvar_}" ] && return 0
# essayer de déterminer !sysnamevar_ à partir de !sysdistvar_
for sysname_ in "${SYSNAMES[@]}"; do
array_copy sysdists_ "${sysname_}_SYSDISTS"
for sysdist_ in "${sysdists_[@]}"; do
if [ "$sysdist_" == "${!sysdistvar_}" ]; then
set_var "$sysnamevar_" "$sysname_"
return
fi
done
done
fi
}
function __fix_sysinfos_downward() {
local sysname_ sysdist_ sysver_
# si !sysnamevar_ n'est pas défini, on ne peut rien faire
[ -z "${!sysnamevar_}" ] && return
if [ -z "${!sysdistvar_}" ]; then
# essayer de déterminer !sysdistvar_ à partir de !sysnamevar_
array_copy sysdists_ "${!sysnamevar_}_SYSDISTS"
for sysdist_ in "${sysdists_[@]}"; do
set_var "$sysdistvar_" "$sysdist_"
break
done
fi
[ -z "${!sysdistvar_}" ] && return
if [ -z "${!sysvervar_}" ]; then
# essayer de déterminer !sysvervar_ à partir de !sysdistvar_
array_copy sysvers_ "${sysdistvar_}_SYSVERS"
for sysver_ in "${sysvers_[@]}"; do
set_var "$sysvervar_" "$sysver_"
break
done
fi
#[ -z "${!sysvervar_}" ] && return
}
function ensure_sysinfos() {
# Essayer de déterminer les valeurs des variables $1(=SYSNAME), $2(=SYSDIST)
# et $3(=SYSVER) en fonction des valeurs des autres. Cette fonction est à
# utiliser quand on récupère cette information de la part de l'utilisateur,
# et qu'il faut compléter
local sysnamevar_="${1:-SYSNAME}"
local sysdistvar_="${2:-SYSDIST}"
local sysvervar_="${3:-SYSVER}"
[ -n "${!sysdistvar_}" ] && set_var "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")"
[ -n "${!sysvervar_}" ] && set_var "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")"
__fix_sysinfos_upward
__fix_sysinfos_downward
}
function check_sysinfos() {
# Tester si le système courant ($MYSYSNAME, $MYSYSDIST, $MYSYSVER, $MYBITS)
# correspond à au moins un des arguments.
# Les options -s, -d, -v, -b permettent respectivement de vérifier le
# système, la distribution, la version et le nombre de bits. Il est possible
# de spécifier plusieurs tests à effectuer, e.g.:
# check_sysinfos -d debian ubuntu -b 64
# pour tester si l'on est sur une distribution debian ou ubuntu *et* sur un
# système 64 bits
# Avec l'option -v, il est possible de suffixer la valeur avec + ou - selon
# que l'on veut toutes les versions situées après ou avant la version
# spécifiée. Attention, à cause d'une limitation de l'implémentation, il
# faut alors impérativement filtrer aussi sur la distribution, e.g:
# check_sysinfo -d debian -v lenny+
# pour tester si on est en lenny ou en squeeze.
# De même, l'option -d accepte aussi de suffixer la valeur avec + ou -, mais
# cela n'a actuellement de sens qu'avec les version de MacOS X. Il faut
# aussi impérativement filtrer sur le système, e.g:
# check_sysinfos -s macosx -d 10.5+
local sysnamevar_="MYSYSNAME"
local sysdistvar_="MYSYSDIST"
local sysvervar_="MYSYSVER"
local bitsvar_="MYBITS"
local check_=sysname r_=0
while [ -n "$1" ]; do
if [[ "$1" == -* ]]; then
[ "$1" == "-S" ] && { sysnamevar_="$2"; shift 2; continue; }
[ "$1" == "-D" ] && { sysdistvar_="$2"; shift 2; continue; }
[ "$1" == "-V" ] && { sysvervar_="$2"; shift 2; continue; }
[ "$1" == "-B" ] && { bitsvar_="$2"; shift 2; continue; }
[ "$r_" == "1" ] && break
[ "$1" == "-s" ] && check_=sysname
[ "$1" == "-d" ] && check_=sysdist
[ "$1" == "-v" ] && check_=sysver
[ "$1" == "-b" ] && check_=bits
r_=1
shift
continue
fi
if [ "$check_" == "sysname" ]; then
if array_contains "$sysnamevar_" "$1"; then
r_=0
check_=skip
fi
elif [ "$check_" == "sysdist" ]; then
local mode_=exact value_="$1"
if [ "${value_%+}" != "$value_" ]; then
mode_=after
value_="${value_%+}"
elif [ "${value_%-}" != "$value_" ]; then
mode_=before
value_="${value_%-}"
fi
value_="$(__get_sysdist_alias "$value_")"
if [ "$mode_" == "exact" ]; then
if array_contains "$sysdistvar_" "$value_"; then
r_=0
check_=skip
fi
elif [ "$mode_" == "after" ]; then
local sysdist_
for sysdist_ in "${ALL_SYSDISTS[@]}"; do
if array_contains "$sysdistvar_" "$sysdist_"; then
r_=0
check_=skip
elif [ "$sysdist_" == "$value_" ]; then
break
fi
done
elif [ "$mode_" == "before" ]; then
local sysdist_ found_
for sysdist_ in "${ALL_SYSDISTS[@]}"; do
[ "$sysdist_" == "$value_" ] && found_=1
if [ -n "$found_" ]; then
if array_contains "$sysdistvar_" "$sysdist_"; then
r_=0
check_=skip
break
fi
fi
done
fi
elif [ "$check_" == "sysver" ]; then
local mode_=exact value_="$1"
if [ "${value_%+}" != "$value_" ]; then
mode_=after
value_="${value_%+}"
elif [ "${value_%-}" != "$value_" ]; then
mode_=before
value_="${value_%-}"
fi
value_="$(__get_sysver_alias "$value_")"
if [ "$mode_" == "exact" ]; then
if array_contains "$sysvervar_" "$value_"; then
r_=0
check_=skip
fi
elif [ "$mode_" == "after" ]; then
local sysver_
for sysver_ in "${ALL_SYSVERS[@]}"; do
if array_contains "$sysvervar_" "$sysver_"; then
r_=0
check_=skip
elif [ "$sysver_" == "$value_" ]; then
break
fi
done
elif [ "$mode_" == "before" ]; then
local sysver_ found_
for sysver_ in "${ALL_SYSVERS[@]}"; do
[ "$sysver_" == "$value_" ] && found_=1
if [ -n "$found_" ]; then
if array_contains "$sysvervar_" "$sysver_"; then
r_=0
check_=skip
break
fi
fi
done
fi
elif [ "$check_" == "bits" ]; then
if [ "$1" == "${!bitsvar_}" ]; then
r_=0
check_=skip
fi
fi
shift
done
return $r_
}

View File

@@ -1,424 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion de tiddlywiki
##@cooked nocomments
##@require base
uprovide tiddlywiki
urequire base
function twget_version() {
# lire le numéro de version dans le fichier $1
awk '/var[ \t]*version/ {
match($0, /major: [0-9]*,/)
major = substr($0, RSTART + 7, RLENGTH - 8)
match($0, /minor: [0-9]*,/)
minor = substr($0, RSTART + 7, RLENGTH - 8)
match($0, /revision: [0-9]*,/)
revision = substr($0, RSTART + 10, RLENGTH - 11)
print major "." minor "." revision
exit
}' "$1"
}
function twdump_header() {
# lire et afficher le contenu avant-storeArea du tiddlywiki $1
awk '
BEGIN { found = 0 }
/<div id="storeArea"/ { found = 1 }
! found { print }
' "$1"
}
function twdump_footer() {
# lire et afficher le contenu après-storeArea du tiddlywiki $1
awk '
BEGIN {
found = 0
}
/<!--POST-STOREAREA-->/ { found = 1; }
found { print }
' "$1"
}
function twdump_storeArea() {
# lire et afficher le storeArea dans le tiddlywiki $1
awk '
BEGIN { found = 0 }
/<div id="storeArea"/ { found = 1 }
/<!--POST-STOREAREA-->/ { found = 0; next }
found { print }
' "$1"
}
function twreplace_storeArea() {
# dans le tiddlywiki $1, remplacer le storeArea par le fichier $2 (par défaut, lu sur stdin)
(
twdump_header "$1"
if [ -z "$2" -o "$2" == "-" ]; then
cat
else
cat "$2"
fi
twdump_footer "$1"
) >"$1.$$"
/bin/mv "$1.$$" "$1"
}
function twupgrade() {
# mettre à jour le tiddlywiki $1 sur la base du tiddlywiki plus récent $2
(
twdump_header "$2"
twdump_storeArea "$1"
twdump_footer "$2"
) >"$1.$$"
/bin/mv "$1.$$" "$1"
}
TW_AWK_FUNCS='
function twdate_tid2time(tiddate, vs, y, m, d, H, M, time) {
if (match(tiddate, /([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])$/, vs)) {
y = vs[1] + 0; m = vs[2] + 0; d = vs[3] + 0
H = vs[4] + 0; M = vs[5] + 0
time = mktime(sprintf("%04i %02i %02i %02i %02i 00", y, m, d, H, M))
time = time + 4 * 60 * 60 # UTC --> GMT+4
return time
}
}
function twdate_twp2time(twpdate, vs, y, m, d, H, M, time) {
if (match(twpdate, /([0-9]+)\/([0-9]+)\/([0-9][0-9][0-9][0-9]) ([0-9]+)[:.]([0-9]+)$/, vs)) {
y = vs[3] + 0; m = vs[2] + 0; d = vs[1] + 0
H = vs[4] + 0; M = vs[5] + 0
time = mktime(sprintf("%04i %02i %02i %02i %02i 00", y, m, d, H, M))
return time
}
}
function twdate_curtwp(time, r) {
if (!time) time = systime()
# arrondir à la minute supérieur si nécessaire, pour éviter les problèmes de
# mise à jour pour un fichier modifié plusieurs fois dans une même minute.
r = time % 60
if (r != 0) time = time + 60 - r
return strftime("%d/%m/%Y %H:%M", time)
}
function twdate_tid2twp(tiddate, vs, y, m, d, H, M, time) {
time = twdate_tid2time(tiddate)
if (time) return strftime("%d/%m/%Y %H:%M", time);
}
function twdate_curtid(time) {
if (!time) time = systime()
time = time - 4 * 60 * 60 # GMT+4 --> UTC
return strftime("%Y%m%d%H%M", time)
}
function twdate_twp2tid(twpdate, vs, y, m, d, H, M, time) {
time = twdate_twp2time(twpdate)
if (time) {
time = time - 4 * 60 * 60 # GMT+4 --> UTC
return strftime("%Y%m%d%H%M", time)
}
}
'
function twdate_curtwp() {
# obtenir la date courante dans le format "dd/mm/YYYY HH:MM" exprimée dans
# l'heure locale
# $1 est éventuellement la date exprimée en nombre de secondes depuis
# l'epoch, exprimée dans l'heure locale
awkrun time="$1" "$TW_AWK_FUNCS"'BEGIN { print twdate_curtwp(time); }'
}
function twdate_tid2twp() {
# Transformer $1, une date de la forme "YYYYmmddHHMM" exprimée dans le
# timezone UTC en une chaine "dd/mm/YYYY HH:MM" exprimée dans l'heure locale
# Si $1 n'est pas dans le bon format, ne rien afficher
awkrun "$TW_AWK_FUNCS"'{ twdate = twdate_tid2twp($0); if (twdate) print twdate; }' <<<"$1"
}
function twdate_curtid() {
# obtenir la date courante dans le format "YYYYmmddHHMM" exprimée dans le
# timezone UTC
# $1 est éventuellement la date exprimée en nombre de secondes depuis
# l'epoch, exprimée dans l'heure locale
awkrun time="$1" "$TW_AWK_FUNCS"'BEGIN { print twdate_curtid(time); }'
}
function twdate_twp2tid() {
# Transformer $1, une date de la forme "dd/mm/YYYY HH:MM" exprimée en heure
# locale en une chaine "YYYYmmddHHMM" exprimée dans le timezone UTC
# Si $1 n'est pas dans le bon format, ne rien afficher
awkrun "$TW_AWK_FUNCS"'{ tiddate = twdate_twp2tid($0); if (tiddate) print tiddate; }' <<<"$1"
}
function twdump_tiddlers() {
# dumper les tiddlers du fichier $1 généré avec twdump_storeArea() sous
# forme d'une liste d'appel de fonction '__tiddler_data title creator
# modifier created modified tags changecount content'
# Les arguments de la fonction sont les valeurs brutes du tiddler, qui ont
# simplement été corrigées avec unquote_html()
awkrun -f "$TW_AWK_FUNCS"'
function parse_attrs() {
title = ""
creator = ""
modifier = ""
created = ""
modified = ""
tags = ""
changecount = ""
if (match($0, /title="([^"]*)"/, vs)) title = unquote_html(vs[1])
if (match($0, /creator="([^"]*)"/, vs)) creator = unquote_html(vs[1])
if (match($0, /modifier="([^"]*)"/, vs)) modifier = unquote_html(vs[1])
if (match($0, /created="([^"]*)"/, vs)) created = unquote_html(vs[1])
if (match($0, /modified="([^"]*)"/, vs)) modified = unquote_html(vs[1])
if (match($0, /tags="([^"]*)"/, vs)) tags = unquote_html(vs[1])
if (match($0, /changecount="([^"]*)"/, vs)) changecount = unquote_html(vs[1])
}
function parse_content( found_pre, vs) {
content = ""
found_pre = 0
# Parser <pre> et éventuellement </pre>
while (getline > 0) {
if (match($0, /<pre>(.*)<\/pre>$/, vs)) {
content = unquote_html(vs[1])
break
} else if (match($0, /<pre>(.*)$/, vs)) {
found_pre = 1
content = unquote_html(vs[1])
break
}
}
# Puis lire jusqu"à </pre>, le cas échéant
if (found_pre) {
found_pre = 0
while (getline > 0) {
if (match($0, /^(.*)<\/pre>/, vs)) {
found_pre = 1
content = content "\n" unquote_html(vs[1])
break
} else {
content = content "\n" unquote_html($0)
}
}
}
}
function dump_tiddler() {
print "__tiddler_data " quote_value(title) " " quote_value(creator) " " quote_value(modifier) " " quote_value(created) " " quote_value(modified) " " quote_value(tags) " " quote_value(changecount) " " quote_value(content)
}
BEGIN { parse = 0 }
!parse && /<div id="storeArea"/ { parse = 1; next; }
parse && $0 ~ /<div / {
parse_attrs()
parse_content()
dump_tiddler()
}
' <"$1"
}
function twdump_twpage() {
# Dumper le contenu de la twpage $1 sous forme d'un appel à une function
# '__twpage_data title creator modifier created modified tags changecount
# content'
# Les arguments de la fonction sont les valeurs brutes de la twpage, sauf
# que le champ modified contient toujours la date de dernière modification
# du fichier.
local modifiedtime="$(stat -L -c %Y "$1")"
awkrun -f user="$USER" modifiedtime="$modifiedtime" "$TW_AWK_FUNCS"'
function parse_attr(line) {
if (match(line, /^##@([^:]+): (.*)$/, vs)) {
if (vs[1] == "title") title = vs[2]
else if (vs[1] == "creator") creator = vs[2]
else if (vs[1] == "modifier") modifier = vs[2]
else if (vs[1] == "created") created = vs[2]
else if (vs[1] == "modified") modified = vs[2]
else if (vs[1] == "tags") tags = vs[2]
else if (vs[1] == "changecount") changecount = vs[2]
if (!creator) creator = user
if (!modifier) modifier = user
if (!created) created = twdate_curtwp()
modified = twdate_curtwp(modifiedtime)
}
}
{
title = ""
creator = ""
modifier = ""
created = ""
modified = ""
tags = ""
changecount = ""
content = ""
eof = 0
while ($0 ~ /^#/) {
parse_attr($0)
if (getline <= 0) {
eof = 1
break
}
}
if (!eof) { while (getline > 0) {
content = content "\n" $0
}}
gsub(/^[ \t\n]*/, "", content);
gsub(/[ \t\n]*$/, "", content);
print "__twpage_data " quote_value(title) " " quote_value(creator) " " quote_value(modifier) " " quote_value(created) " " quote_value(modified) " " quote_value(tags) " " quote_value(changecount) " " quote_value(content)
}' <"$1"
}
function twwrite_tiddler() {
# Ecrire sur STDOUT le tiddler correspondant aux paramètres sont spécifiés
# sur la ligne de commande. Les arguments sont les valeurs brutes prises de
# la twpage, telles qu'elles sont générées par twdump_twpage()
awkrun -f title="$1" creator="$2" modifier="$3" created="$4" modified="$5" tags="$6" changecount="$7" content="$8" "$TW_AWK_FUNCS"'BEGIN {
title = quote_html(title)
creator = quote_html(creator)
modifier = quote_html(modifier)
created = quote_html(twdate_twp2tid(created))
modified = quote_html(twdate_twp2tid(modified))
tags = quote_html(tags)
changecount = quote_html(changecount)
content = quote_html(content)
print "<div title=\"" title "\" creator=\"" creator "\" modifier=\"" modifier "\" created=\"" created "\" modified=\"" modified "\" tags=\"" tags "\" changecount=\"" changecount "\">"
print "<pre>" content "</pre>"
print "</div>"
}'
}
function twcheck_twpage_modified() {
# Vérifier si la twpage $1 peut être écrasée par un tiddler dont la date de
# modification est $2, de format "YYYYmmddHHMM" exprimée dans le timezone
# UTC
# C'est le cas si le fichier $1 n'existe pas, ou a une date de modification
# antérieure à $2
[ -f "$1" ] || return 0
local twpage="$1" othermodified="$2"
(
function __twpage_data() { thismodified="$(twdate_twp2tid "$5")"; }
eval "$(twdump_twpage "$twpage")"
[ "$thismodified" -le "$othermodified" ]
)
}
function twcheck_twpage_newtwpage() {
# Vérifier si la twpage $1 peut être écrasée par la twpage $2
# C'est le cas si le fichier $1 n'existe pas, ou a une date de modification
# antérieure à $2
[ -f "$1" ] || return 0
local twpage="$1" othertwpage="$2"
(
function __twpage_data() { thismodified="$(twdate_twp2tid "$5")"; }
eval "$(twdump_twpage "$twpage")"
function __twpage_data() { othermodified="$(twdate_twp2tid "$5")"; }
eval "$(twdump_twpage "$othertwpage")"
[ "$thismodified" -le "$othermodified" ]
)
}
TW_VERBOSE=1
function twwrite_twpage() {
# Ecrire dans le répertoire courant le fichier correspondant au tiddler dont
# les paramètres sont spécifiés sur la ligne de commande. Les arguments sont
# les valeurs brutes prises du tiddler, telles qu'elles sont générées par
# twdump_tiddlers()
# Retourner 0 si le fichier a été écrasé, 1 s'il n'a pas été écrasé parce
# qu'il n'a pas été modifié, 2 s'il n'a pas été écrasé parce qu'il est plus
# récent.
# Si TW_VERBOSE=1, afficher un message informatif lors de l'export
local title="$1" creator="$2" modifier="$3" created="$4" modified="$5" tags="$6" changecount="$7" content="$8"
# enlever les caractères problématiques dans le titre pour générer le nom de
# fichier
local twpage="$title.twp"
twpage="${twpage//\//_}"
twpage="${twpage//:/_}"
local tmppage
ac_set_tmpfile tmppage
echo "# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Pense-bête:
# ''bold'' ==striked== __underline__ //italic// ^^super^^ ~~sub~~
# @@highlight@@ @@color:red;background-color:white; rouge sur noir@@
# ~NotAWikiWord [[force wikiword]] [[friendly name|WikiWord]]
# [[external|http://site.com]] ---- {{monospace}}
# !h1 !!h2 !!!h3 !!!!h4 !!!!!h5
# * dotlist ** sublist # numlist ## sublist
# {{{ |caption|c [img[title|filename]]
# pre text |!header|!header|h [img[filename]]
# }}} |cell|cell| [img[title|filename][link]]
# <<< |>|colspan| [img[filename][link]]
# blockquote |rowspan|one| [<img[filename]]
# <<< |~|two| [>img[filename]]
# >quote1 |left| right|
# >>quote2 |>| center |
# >>>quote3
##@creator: $creator
##@created: $(twdate_tid2twp "$created")
##@modifier: $modifier
##@changecount: $changecount
##@tags: $tags
##@title: $title
$content" >"$tmppage"
local status
if [ ! -f "$twpage" ] || testdiff "$tmppage" "$twpage"; then
if twcheck_twpage_modified "$twpage" "$modified"; then
if [ -n "$TW_VERBOSE" ]; then
if [ -f "$twpage" ]; then
estepw "$twpage: fichier écrasé, parce qu'il est plus ancien"
else
estepi "$title: export"
fi
fi
cat "$tmppage" >"$twpage"
status=0
else
if [ -n "$TW_VERBOSE" ]; then
estepw "$twpage: fichier non écrasé car il est plus récent (utiliser -u)"
fi
status=2
fi
else
status=1
fi
ac_clean "$tmppage"
return $status
}
function export_to_twpages() {
# Exporter tous les tiddlers du tiddlywiki $1 dans le répertoire $2
local wikifile="${1:-wiki.html}" wikidir="${2:-.}"
local storeArea
ac_set_tmpfile storeArea
twdump_storeArea "$wikifile" >"$storeArea"
function __tiddler_data() { twwrite_twpage "$@"; }
local CWD="$(pwd)"
cd "$wikidir"
eval "$(twdump_tiddlers "$storeArea")"
cd "$CWD"
ac_clean "$storeArea"
}
function import_from_twpages() {
# Remplacer les tiddlers du tiddlywiki $1 par les twpages du répertoire $2
local wikifile="${1:-wiki.html}" wikidir="${2:-.}"
local storeArea
ac_set_tmpfile storeArea
echo "<div id=\"storeArea\">" >"$storeArea"
function __twpage_data() {
twwrite_tiddler "$@" >>"$storeArea"
}
local -a twpages
local twpage
array_from_lines twpages "$(list_files "$wikidir" "*.twp" | csort)"
for twpage in "${twpages[@]}"; do
[ -n "$TW_VERBOSE" ] && estep "$twpage"
eval "$(twdump_twpage "$wikidir/$twpage")"
done
echo "</div>" >>"$storeArea"
twreplace_storeArea "$wikifile" "$storeArea"
ac_clean "$storeArea"
}

195
ulib/udir
View File

@@ -1,195 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonction de support pour udir: gestion des paramètres des répertoires
##@cooked nocomments
##@require base
uprovide udir
urequire base
UDIR_TEMPLATE="\
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Utiliser 'udir --help-vars' pour une description de la signification des
# variables suivantes:
udir_desc=\"\"
udir_note=\"\"
udir_types=()"
function udir_check() {
# Vérifier si le fichier $1 existe
# Si $1 est un répertoire, prendre $1/.udir
local udirf="$1"
[ -d "$udirf" ] && udirf="$udirf/.udir"
[ -f "$udirf" ]
}
function udir_create_maybe() {
# Si le fichier $1 n'existe pas, le créer comme un template .udir
# Si $1 est un répertoire, prendre $1/.udir
local udirf="$1"
[ -d "$udirf" ] && udirf="$udirf/.udir"
[ -f "$udirf" ] || echo "$UDIR_TEMPLATE" >"$udirf"
}
function udir_dump() {
# Dumper toutes les variables définies pour le fichier $1
# Si $1 est un répertoire, prendre $1/.udir
local udirf="$(abspath "${1:-.}")"
[ -d "$udirf" ] && udirf="$udirf/.udir"
if [ -f "$udirf" ]; then
set_var_cmd udir "$(dirname "$udirf")"
set_var_cmd udirf "$udirf"
<"$udirf" filter_comment -m
fi
}
function udir_eval() {
# Evaluer la commande "$2..$*" dans le contexte des variables définies pour
# le répertoire $1. La commande est évaluée dans un sous-shell pour ne pas
# polluer l'espace de noms courant.
# note: on évalue les commandes dans un sous-shell au lieu d'utiliser des
# variables locales, parce que bash 2.xx a un bug avec l'évaluation de la
# définition de tableaux locaux. i.e.
# eval "local array=(value)"
# a pour résultat "$array" == "(value)", ce qui est incorrect.
local udirf="$1"; shift
(eval "$(udir_dump "$udirf")"; [ -n "$*" ] && eval "$@")
}
function udir_dump_all() {
# Dumper toutes les variables définies pour le répertoire $1 et *tous ses
# parents* jusqu'à la racine
local -a udirs
local udir="$1"
[ -f "$udir" ] && udir="$(dirname "$udir")"
parentdirs udirs "$udir" reverse
for udir in "${udirs[@]}"; do
udir_dump "$udir/.udir"
done
}
function udir_eval_all() {
# Evaluer la commande "$2..$*" dans le contexte des variables définies pour
# le répertoire $1 et *tous ses parents* jusqu'à la racine
local udirf="$1"; shift
(eval "$(udir_dump_all "$udirf")"; [ -n "$*" ] && eval "$@")
}
function udir_parse() {
# Dans le fichier $1, lire les noms des variables
# Si $1 est un répertoire, prendre $1/.udir
# Les noms des variables sont placés dans le tableau $2(=UDIR_VARS), et les noms
# des tableaux sont placés dans le tableau $3(=UDIR_ARRAYS)
# note: les regex qui sont entre "" au lieu de // le sont à cause d'un bug
# de awk sous macosx
local __up_udir="$1"
[ -d "$__up_udir" ] && __up_udir="$__up_udir/.udir"
local __up_vars="${2:-UDIR_VARS}"
local __up_arrays="${3:-UDIR_ARRAYS}"
eval "$(<"$__up_udir" filter_comment -m | awk 'BEGIN {
vars = "'"$__up_vars"'=("; first_var = 1;
arrays = "'"$__up_arrays"'=("; first_array = 1;
}
/^[ \t]*#/ { next }
$0 ~ /^[ \t]*[a-zA-Z_][a-zA-Z0-9_]*=\(/ {
match($0, /^[ \t]*[a-zA-Z_][a-zA-Z0-9_]*=\(/)
name = substr($0, RSTART, RLENGTH)
sub(/^([ \t]*)?/, "", name)
sub("=\\($", "", name)
if (first_array) first_array = 0
else arrays = arrays " "
arrays = arrays name
next
}
$0 ~ /^[ \t]*[a-zA-Z_][a-zA-Z0-9_]*=/ {
match($0, /^[ \t]*[a-zA-Z_][a-zA-Z0-9_]*=/)
name = substr($0, RSTART, RLENGTH)
sub(/^([ \t]*)?/, "", name)
sub("=$", "", name)
if (first_var) first_var = 0
else vars = vars " "
vars = vars name
next
}
END {
print vars ")"
print arrays ")"
}')"
}
function udir_update() {
# Dans le fichier $1, mettre à jour les variables $2..*
# Si $1 est un répertoire, prendre $1/.udir
# Chaque argument de cette fonction est de la forme name[=value]
# Si value n'est pas précisée, la variable obtient une valeur nulle
# (i.e. var=)
# Si la variable ne figure pas dans le fichier, elle est rajoutée à la fin
# du fichier.
# Cette fonction nécessite gawk.
local udir="$1"; shift
[ -d "$udir" ] && udir="$udir/.udir"
udir_create_maybe "$udir"
local mode="$(fix_mode "$udir")"
local script i param name value
script="BEGIN {
in_section=0
max = $#"
i=0
for param in "$@"; do
name="${param%%=*}"
script="$script
names[$i] = $(quoted_awk "$name")"
if [ "$name" != "$param" ]; then
value="${param#*=}"
script="$script
values[$i] = $(quoted_awk "$value")"
else
script="$script
values[$i] = \"\""
fi
script="$script
seen[$i] = 0"
let i=$i+1
done
script="$script"'
}
function write_unseen() {
for (i = 0; i < max; i++) {
if (!seen[i]) {
print names[i] "=" values[i]
seen[i] = 1
}
}
}
'
i=0
for param in "$@"; do
name="${param%%=*}"
script="$script
\$0 ~ /^[ $TAB]*(##*[ $TAB]*)?$name[ $TAB]*=/ {
\$0 = gensub(/^([ $TAB]*##*)?([ $TAB]*$name[ $TAB]*=[ $TAB]*).*\$/, \"\\\\2\" values[$i], \"\")
seen[$i] = 1
}"
let i=$i+1
done
script="$script
{ print }
END {
write_unseen()
}"
ac_set_tmpfile tmpfile
<"$udir" >"$tmpfile" awk "$script" &&
cat "$tmpfile" >"$udir"
unfix_mode "$udir" "$mode"
ac_clean "$tmpfile"
}
function udir_edit() {
local udirf="$1"
[ -d "$udirf" ] && udirf="$udirf/.udir"
udir_create_maybe "$udirf"
"${EDITOR:-vi}" +1 "$udirf"
}

View File

@@ -1,72 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion des fichiers de ~/etc/{profile.d,bashrc.d,default}
##@cooked nocomments
uprovide uenv
function __uenv_check_file() {
# Vérifier si le fichier $2 du répertoire $1 doit être sourcé.
# note: pour utiliser cette fonction, les variables __uname_system et
# __myhostname doivent être définies.
local dir="$1" file="$2"
[ -f "$dir/$file" ] || return
# ignorer les fichiers qui ont l'extension .ignore
[ "${file%%.ignore}" != "$file" ] && return 1
# tester si le fichier est spécifique à une plateforme
local system
system="$(expr "$file" : ".*\\.\\[\\([^.]*\\)\\]")"
[ -n "$system" -a "$system" != "$__uname_system" ] && return 1
system="$(expr "$file" : ".*\\.\\[-\\([^.]*\\)\\]")"
[ -n "$system" -a "$system" == "$__uname_system" ] && return 1
# tester si le fichier est spécifique à une machine
local host
host="$(expr "$file" : ".*\\.on_\\([^.]*\\)")"
[ -n "$host" -a "$host" != "$__myhostname" ] && return 1
host="$(expr "$file" : ".*\\.noton_\\([^.]*\\)")"
[ -n "$host" -a "$host" == "$__myhostname" ] && return 1
# tester si le fichier est spécifique à un utilisateur
local user
user="$(expr "$file" : ".*\\.for_\\([^.]*\\)")"
[ -n "$user" -a "$user" != "$USER" ] && return 1
user="$(expr "$file" : ".*\\.notfor_\\([^.]*\\)")"
[ -n "$user" -a "$user" == "$USER" ] && return 1
return 0
}
function __uenv_source_dirs() {
# charger les fichiers qui sont dans le répertoire $1. Si un fichier
# .source_in_order existe dans ce répertoire, il fixe l'ordre dans lesquel
# les fichiers sont chargés. Sinon, les fichiers sont sourcé par ordre
# alphabétique.
local __uname_system __myhostname
__uname_system=`uname -s`
[ "${__uname_system#CYGWIN}" != "$__uname_system" ] && __uname_system=Cygwin
[ "${__uname_system#MINGW32}" != "$__uname_system" ] && __uname_system=Mingw
__myhostname="${HOSTNAME%%.*}"
local dir file sio
for dir in "$@"; do
[ -d "$dir" ] || continue
sio="$dir/.source_in_order"
if [ -f "$sio" ]; then
source "$sio"
else
for file in "$dir/"*; do
if __uenv_check_file "$(dirname "$file")" "$(basename "$file")"; then
source "$file"
fi
done
fi
done
}
function __uenv_cleanup() {
unset -f __uenv_check_file
unset -f __uenv_source_dirs
unset -f __uenv_cleanup
}

View File

@@ -1,262 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion de la mise à jour des fichiers de ~/etc/{profile.d,bashrc.d,default}
##@cooked nocomments
##@require base
##@require uenv
uprovide uenv_update
urequire base uenv
function __uenv_move_after() {
# Dans le fichier $1, déplacer la ligne $2 après la ligne $3.
# Si la ligne $2 n'existe pas, ne rien faire
# Si la ligne $3 n'existe pas ou vaut '*', mettre la ligne $2 en dernier.
# Si $4 est spécifié, l'utiliser comme fichier temporaire.
local tmpfile="$4"
[ -n "$tmpfile" ] || ac_set_tmpfile tmpfile
# XXX Il faudrait quoter $2 et $3 pour éviter les caractères spéciaux de
# grep!
if quietgrep "^$2$" "$1"; then
if [ "$3" != "*" ] && quietgrep "^$3$" "$1"; then
awkrun line="$2" after="$3" '
BEGIN {
found_line = 0
found_after = 0
}
! found_line && $0 == line {
found_line = 1
if (! found_after) {
next
}
}
! found_after && $0 == after {
found_after = 1
if (found_line) {
# si nous avons trouvé la ligne avant after, la mettre juste après
# sinon, pas la peine de faire de modification
print
print line
next
}
}
{ print }
END {
if (! found_after && after == "*") {
if (found_line) {
print line
}
}
}' <"$1" >"$tmpfile" &&
cat "$tmpfile" >"$1"
else
grep -v "^$2$" "$1" >"$tmpfile"
echo "$2" >>"$tmpfile"
cat "$tmpfile" >"$1"
fi
fi
}
function __uenv_move_before() {
# Dans le fichier $1, déplacer la ligne $2 avant la ligne $3.
# Si la ligne $2 n'existe pas, ne rien faire
# Si la ligne $3 n'existe pas ou vaut '*', mettre la ligne $2 en premier.
# Si $4 est spécifié, l'utiliser comme fichier temporaire.
local tmpfile="$4"
[ -n "$tmpfile" ] || ac_set_tmpfile tmpfile
# XXX Il faudrait quoter $2 et $3 pour éviter les caractères spéciaux de
# grep!
if quietgrep "^$2$" "$1"; then
if [ "$3" != "*" ] && quietgrep "^$3$" "$1"; then
awkrun line="$2" before="$3" '
BEGIN {
found_line = 0
found_before = 0
}
! found_line && $0 == line {
found_line = 1
if (found_before) {
next
}
}
! found_before && ($0 == before || before == "*") {
found_before = 1
if (! found_line) {
print line
print
next
}
}
{ print }
' <"$1" >"$tmpfile" &&
cat "$tmpfile" >"$1"
else
echo "$2" >"$tmpfile"
grep -v "^$2$" "$1" >>"$tmpfile"
cat "$tmpfile" >"$1"
fi
fi
}
function uenv_update_dir() {
# Mettre à jour l'ordre de chargement pour le répertoire $1 qui contient des
# fichiers de profil pour le shell. L'ordre dans lequel le fichiers de
# profil doivent être chargé est écrit dans le fichier $1/.source_in_order
# Si $2 est spécifié, il s'agit d'un fichier temporaire utilisé pour les
# calculs de l'ordre des chargements.
# $3(=$1) est le répertoire de destination. Si $1 est un répertoire de
# préparation temporaire, on peut spécifier grâce à $3 quel est le
# répertoire final après préparation.
local dir="$(abspath "$1")"
local destdir="${3:-$dir}"
local tmpfile="$2"
[ -n "$tmpfile" ] || ac_set_tmpfile tmpfile
local sio="$dir/.source_in_order"
local before after file
local -a files
local __uname_system="$UNAME_SYSTEM"
local __myhostname="$MYHOSTNAME"
>"$sio"
for file in "$dir/"*; do
file="$(basename "$file")"
files=("${files[@]}" "$file")
__uenv_check_file "$dir" "$file" && echo "$file" >>"$sio"
done
# traiter d'abord les fichiers qui ont '@before *' ou '@after *'
local -a nfiles
for file in "${files[@]}"; do
before="$(<"$dir/$file" awk '$0 ~ /^##@before / { print $2; exit 0 }')"
if [ "$before" == "*" ]; then
__uenv_move_before "$sio" "$file" "$before" "$tmpfile"
else
array_set nfiles "$file"
fi
after="$(<"$dir/$file" awk '$0 ~ /^##@after / { print $2; exit 0 }')"
if [ "$after" == "*" ]; then
__uenv_move_after "$sio" "$file" "$after" "$tmpfile"
else
array_set nfiles "$file"
fi
done
# Ensuite traiter les autres fichiers.
# L'opération est faite en deux temps parce que si A est avant B, et que B
# est avant *, si A est traité avant B, A risque de se trouver après B si B
# est déplacé au début de la liste.
for file in "${nfiles[@]}"; do
before="$(<"$dir/$file" awk '$0 ~ /^##@before / { print $2; exit 0 }')"
[ -n "$before" -a "$before" != "*" ] && __uenv_move_before "$sio" "$file" "$before" "$tmpfile"
after="$(<"$dir/$file" awk '$0 ~ /^##@after / { print $2; exit 0 }')"
[ -n "$after" -a "$after" != "*" ] && __uenv_move_after "$sio" "$file" "$after" "$tmpfile"
done
awkrun destdir="$destdir" '{ print "source " destdir "/" $0 }' <"$sio" >"$tmpfile" &&
cat "$tmpfile" >"$sio"
}
function uenv_set_destdirs() {
profiledestdir="$HOME/etc/profile.d"
bashrcdestdir="$HOME/etc/bashrc.d"
defaultdestdir="$HOME/etc/default"
}
function uenv_sourced_in() {
# vérifier que l'un des fichiers $2..$* est sourcé dans $1
local src="$1"; shift
local file
for file in "$@"; do
grep -q "\\.[ \\t]*$file\$" "$src" && return 0
grep -q "source[ \\t]*$file\$" "$src" && return 0
done
return 1
}
function uenv_configure_profiles() {
local destdir="$1"
local LEGACY_PROFILE="$HOME/.profile"
local PROFILE="$HOME/.bash_profile"
local BASHRC="$HOME/.bashrc"
if [ ! -f "$PROFILE" ]; then
echo "# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi" >"$PROFILE"
fi
if [ ! -f "$BASHRC" ]; then
touch "$BASHRC"
fi
if [ -f "$LEGACY_PROFILE" ]; then
if ! uenv_sourced_in "$PROFILE" "~/.profile"; then
ewarn "\
~/.profile existe, il contient peut-être des instructions utiles. Si c'est le
cas, il faut décommenter la ligne dans ~/.bash_profile qui source ~/.profile"
estep "Configuration de l'inclusion de ~/.profile dans $PROFILE"
echo >>"$PROFILE" "
# decommenter si ~/.profile contient des commandes utiles
#[ -f ~/.profile ] && source ~/.profile"
fi
fi
if ! uenv_sourced_in "$PROFILE" "$destdir/profile"; then
estep "Configuration de l'inclusion de $destdir/profile"
echo >>"$PROFILE" "
# source $destdir/profile.d scripts
[ -f \"$destdir/profile\" ] && source $destdir/profile"
fi
if ! uenv_sourced_in "$BASHRC" "$destdir/bashrc"; then
estep "Configuration de l'inclusion de $destdir/bashrc"
echo >>"$BASHRC" "
# source $destdir/bashrc.d scripts
[ -f \"$destdir/bashrc\" ] && source $destdir/bashrc"
fi
}
function uenv_install_profiles() {
local projdir="$1" profiledir="$2" bashrcdir="$3" defaultdir="$4"
local tmpfile
local prefix envsrcdir envdestdir envfiles envfile envsrc envdest
local profiledestdir bashrcdestdir defaultdestdir
uenv_set_destdirs
ac_set_tmpfile tmpfile
for prefix in profile bashrc default; do
envsrcdir="${prefix}dir"; envsrcdir="$projdir/${!envsrcdir}"
envdestdir="${prefix}destdir"; envdestdir="${!envdestdir}"
[ -n "$envsrcdir" -a -d "$envsrcdir" ] || continue
array_from_lines envfiles "$(list_files "$envsrcdir")"
for envfile in "${envfiles[@]}"; do
envsrc="$envsrcdir/$envfile"
envdest="$envdestdir/$envfile"
mkdir -p "$envdestdir"
if [ ! -f "$envdest" ]; then
estep "Installation du profil par défaut $envfile dans $(ppath "$envdestdir")"
/bin/cp -f "$envsrc" "$envdestdir"
elif [ "$prefix" != "default" ] && ! endswith "$envfile" ".userconf" && testdiff "$envdest" "$envsrc"; then
estep "Le profil par défaut $envfile dans $(ppath "$envdestdir") a été modifié"
if show_info; then
eecho "Voici les différences détectées:"
eecho ""
diff -u "$envdest" "$envsrcdir" 1>&2
eecho ""
fi
if ask_yesno "Faut-il remplacer $(ppath "$envdestdir/$envfile") par le profil par défaut?" O; then
/bin/cp -f "$envsrc" "$envdestdir"
fi
fi
done
if [ "$prefix" != "default" ]; then
estep "Mise à jour de l'ordre de lecture de $(ppath "$envdestdir")"
uenv_update_dir "$envdestdir" "$tmpfile"
fi
done
ac_clean "$tmpfile"
}

View File

@@ -1,9 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonction de support pour uinc: pliage/dépliage d'inclusions
##@cooked nocomments
##@require ulib
##@require nutools/pyulib
uprovide uinc
urequire ulib nutools/pyulib
function uinc() { "$ULIBDIR/support/uinc.py" "$@"; }

1398
ulib/uinst

File diff suppressed because it is too large Load Diff

102
ulib/ulib
View File

@@ -1,102 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Charger les librairies de ulib. Nécessite bash.
##@cooked nocomments
# Ce fichier doit être *sourcé*. Si ce fichier n'est pas sourcé, alors le
# répertoire ulib doit être disponible dans le répertoire du script qui inclue
# ce fichier. Ceci peut-être fait avec ulibsync.
# Ensuite, des librairies individuelles de ulib peuvent être chargées avec la
# fonction urequire(), e.g.
# source /etc/ulib && urequire DEFAULTS conf || exit 1
# 'DEFAULTS' permet de charger base, pretty, sysinfos et compat.
function eerror() { echo "error: $*" 1>&2; }
function die() { [ -n "$*" ] && eerror "$*"; exit 1; }
## Calculer l'emplacement de ulib
# il est possible de forcer la valeur de ULIBDIR avec FORCED_ULIBDIR. ceci est
# utile avec bash 2.x qui ne supporte pas la variable BASH_SOURCE
ULIBDIR="${FORCED_ULIBDIR:-@@dest@@/ulib}"
if [ "$ULIBDIR" = "@@""dest""@@/ulib" ]; then
# La valeur "@@"dest"@@" n'est remplacée que dans la copie de ce script
# faite dans /etc. Sinon, il faut toujours faire le calcul. Cela permet de
# déplacer la librairie n'importe ou sur le disque, ce qui est
# particulièrement intéressant quand on fait du déploiement.
ULIBDIR="${BASH_SOURCE[0]}"
if [ -n "$ULIBDIR" -a -f "$ULIBDIR" ]; then
# Fichier sourcé
ULIBDIR="$(dirname "$ULIBDIR")"
else
# Fichier non sourcé. Tout exprimer par rapport au script courant
ULIBDIR="$(dirname "$0")/ulib"
fi
fi
ULIBDIR="$(cd "$ULIBDIR"; pwd)"
ULIBDIRS=("$ULIBDIR")
# marqueur pour tester si ulib a été chargé. Il faut avoir $ULIBINIT==$ULIBDIR
ULIBINIT="$ULIBDIR"
# liste des fichiers sourcés par urequire
[ -n "$ULIBPROVIDED" ] || ULIBPROVIDED=(ulib)
function uprovided() {
# Tester si la ulibrairie $1 a déjà été chargé par urequire
local ulib_
for ulib_ in "${ULIBPROVIDED[@]}"; do
[ "$ulib_" == "$1" ] && return 0
done
return 1
}
function uprovide() {
# Spécifier que la ulibrairie $1 a été sourcée, ou prétendre que c'est le
# cas.
uprovided "$1" && return 0
ULIBPROVIDED=("${ULIBPROVIDED[@]}" "$1")
}
function urequire() {
# Sourcer un fichier recherché dans ULIBDIRS
# Si le fichier est DEFAULTS, charger base, pretty, sysinfos et compat à la
# place
local ulib_ ulibdir_ found_
[ -n "$*" ] || set DEFAULTS
for ulib_ in "$@"; do
found_=
for ulibdir_ in "${ULIBDIRS[@]}"; do
if [ -f "$ulibdir_/$ulib_" ]; then
found_=1
if ! uprovided "$ulib_"; then
uprovide "$ulib_"
source "$ulibdir_/$ulib_" || die
fi
break
elif [ "$ulib_" == "DEFAULTS" ]; then
found_=1
for ulib_ in base pretty sysinfos compat; do
if ! uprovided "$ulib_"; then
uprovide "$ulib_"
source "$ulibdir_/$ulib_" || die
fi
done
break
fi
done
[ -n "$found_" ] || die "Unable to find $ulib_ in ${ULIBDIR[*]}"
done
}
function ulib_add() {
# Ajouter $1 au chemin de recherche de urequire
[ -d "$1" ] && ULIBDIRS=("${ULIBDIRS[@]}" "$(cd "$1"; pwd)")
}
function ulib_sync() {
# Synchroniser les librairies ulib dans le répertoire $1
destdir="$(abspath "${1:-.}")"
[ "$destdir/ulib" != "$ULIBDIR" ] && cpdirnovcs "$ULIBDIR" "$destdir/ulib"
}

View File

@@ -1,57 +0,0 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: Gestion de la version de ulib
USAGE
$scriptname [options]
OPTIONS
-l, --show
Afficher la version de la librairie (par défaut)
-u, --update
Incrémenter la version de la librairie. Il faut incrémenter la version
de la librairie à chaque modification incompatible ou correction de bug.
-c, --check MIN_VERSION
Vérifier que la version de la librairie est au minimum MIN_VERSION, et
afficher un message d'information. Utiliser l'option -q si l'on veut
juste tester la version et ne pas afficher le message d'information."
}
source "$(dirname "$0")/ulib" &&
urequire DEFAULTS ||
exit 1
action=show
version=0
set_version=
min_version=
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-l,--show action=show \
-u,--update action=update \
-V:,--set-version: set_version= \
-c:,--check: '$set@ min_version; action=check' \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
versionfile="$scriptdir/.ulib_version"
[ -f "$versionfile" ] || echo "$version" >"$versionfile"
version="$(<"$versionfile")"
if [ "$action" == show ]; then
echo "ulib est en version $version"
elif [ "$action" == update ]; then
[ -n "$set_version" ] || set_version=$(($version + 1))
echo "$set_version" >"$versionfile"
echo "ulib est maintenant en version $set_version"
elif [ "$action" == check ]; then
r=1
[ $version -ge $min_version ] && r=0
if [ $r -eq 0 ]; then
einfo "ulib est en version $version >= $min_version ${COULEUR_VERTE}[OK]${COULEUR_NORMALE}"
else
einfo "ulib est en version $version < $min_version ${COULEUR_ROUGE}[KO]${COULEUR_NORMALE}"
fi
exit $r
fi

View File

@@ -1,94 +0,0 @@
##@cooked comments #-*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Version de ulib utilisable avec n'importe quel bourne shell: le script est
## relancé avec bash si nécessaire
##@cooked nocomments
##@inc[bash
## Relancer le script avec bash si nécessaire
if [ `basename "${BASH:-sh}"` = "sh" ]; then
bash=`which bash 2>/dev/null`
for bash in "$bash" /bin/bash /usr/bin/bash /usr/local/bin/bash; do
if [ -x "$bash" ]; then
exec "$bash" "$0" "$@"
fi
done
echo "error: this script requires bash"
exit 1
fi
##@inc]bash
##@inc[ulib
## Charger les librairies de ulib. Nécessite bash.
function eerror() { echo "error: $*" 1>&2; }
function die() { [ -n "$*" ] && eerror "$*"; exit 1; }
ULIBDIR="${FORCED_ULIBDIR:-@@dest@@/ulib}"
if [ "$ULIBDIR" = "@@""dest""@@/ulib" ]; then
ULIBDIR="${BASH_SOURCE[0]}"
if [ -n "$ULIBDIR" -a -f "$ULIBDIR" ]; then
ULIBDIR="$(dirname "$ULIBDIR")"
else
ULIBDIR="$(dirname "$0")/ulib"
fi
fi
ULIBDIR="$(cd "$ULIBDIR"; pwd)"
ULIBDIRS=("$ULIBDIR")
ULIBINIT="$ULIBDIR"
[ -n "$ULIBPROVIDED" ] || ULIBPROVIDED=(ulib)
function uprovided() {
local ulib_
for ulib_ in "${ULIBPROVIDED[@]}"; do
[ "$ulib_" == "$1" ] && return 0
done
return 1
}
function uprovide() {
uprovided "$1" && return 0
ULIBPROVIDED=("${ULIBPROVIDED[@]}" "$1")
}
function urequire() {
local ulib_ ulibdir_ found_
[ -n "$*" ] || set DEFAULTS
for ulib_ in "$@"; do
found_=
for ulibdir_ in "${ULIBDIRS[@]}"; do
if [ -f "$ulibdir_/$ulib_" ]; then
found_=1
if ! uprovided "$ulib_"; then
uprovide "$ulib_"
source "$ulibdir_/$ulib_" || die
fi
break
elif [ "$ulib_" == "DEFAULTS" ]; then
found_=1
for ulib_ in base pretty sysinfos compat; do
if ! uprovided "$ulib_"; then
uprovide "$ulib_"
source "$ulibdir_/$ulib_" || die
fi
done
break
fi
done
[ -n "$found_" ] || die "Unable to find $ulib_ in ${ULIBDIR[*]}"
done
}
function ulib_add() {
[ -d "$1" ] && ULIBDIRS=("${ULIBDIRS[@]}" "$(cd "$1"; pwd)")
}
function ulib_sync() {
destdir="$(abspath "${1:-.}")"
[ "$destdir/ulib" != "$ULIBDIR" ] && cpdirnovcs "$ULIBDIR" "$destdir/ulib"
}
##@inc]ulib
uprovide ulibsh

696
ulib/vcs
View File

@@ -1,696 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonctions pour gérer les outils de vcs (subversion, git)
##@cooked nocomments
##@require base
uprovide vcs
urequire base
################################################################################
# Général
function __vcs_get_type() {
# Afficher le type de vcs du répertoire $1. L'arborescence n'est pas
# parcourue. Si l'information n'est pas immédiatement disponible, cette
# fonction échoue.
# retourner 1 si le type n'a pas été trouvé
[ -d "$1/.git" ] && { echo "git"; return; }
[ -d "$1/.svn" ] && { echo "svn"; return; }
[ -d "$1/CVS" ] && { echo "cvs"; return; }
return 1
}
function __vcs_find_type() {
# Chercher le type de vcs du répertoire $1. L'arborescence jusqu'au
# répertoire $HOME est parcourue si nécessaire. $1 doit être un répertoire
# absolu.
# Retourner 1 si le type n'a pas été trouvé
local root="$1"
# soit on a l'information immédiatement...
__vcs_get_type "$root" && return
# soit il faut la chercher en parcourant l'arborescence...
while [ -n "$root" -a "$root" != "/" -a "$root" != "." -a "$root" != "$HOME" ]; do
__vcs_get_type "$root" && return
root="$(dirname "$root")"
done
return 1
}
function __vcs_upward_until() {
local root="$1"
local type="$2"
while [ -n "$root" -a "$root" != "/" -a "$root" != "." -a "$(__vcs_get_type "$root/..")" == "$type" ]; do
root="$(dirname "$root")"
done
echo "$root"
}
function __vcs_find_root() {
# A partir du répertoire $1, chercher le répertoire de base du checkout
# local. $1 doit être un répertoire absolu.
# retourner 1 si le type n'a pas été trouvé
local root="$1"
local type="$(__vcs_get_type "$root")"
if [ "$type" == "git" ]; then
# si le type est git, nous sommes forcément déjà à la racine
echo "$root"
return
elif [ "$type" == "svn" -o "$type" == "cvs" ]; then
# trouver le répertoire le plus haut
__vcs_upward_until "$root" "$type"
return
else
# sinon, il faut chercher dans les répertoire au dessus jusqu'à trouver
# un repository. On arrête la recherche à $HOME
local found
while [ -n "$root" -a "$root" != "/" -a "$root" != "." -a "$root" != "$HOME" ]; do
type="$(__vcs_get_type "$root")" && { found=1; break; }
root="$(dirname "$root")"
done
if [ -n "$found" ]; then
if [ "$type" == "git" ]; then
echo "$root"
return
elif [ "$type" == "svn" -o "$type" == "cvs" ]; then
__vcs_upward_until "$root" "$type"
return
fi
fi
fi
return 1
}
function _vcs_get_dir() {
abspath "${1:-.}"
}
function _vcs_get_type() {
__vcs_find_type "$1" || {
eerror "$(ppath "$1"): Ce répertoire n'est pas versionné"
return 1
}
}
function _vcs_unsupported() {
eerror "${1:+$1: }Opération ou option non supportée"
return 1
}
function _vcs_invalid_copy() {
eerror "Vous ne pouvez copier/déplacer qu'un fichier sur un fichier"
return 1
}
function _vcs_check_nbargs() {
[ "$1" -ge "$2" ] || {
eerror "Cette commande nécessite au moins $2 argument(s)"
return 1
}
if [ -n "$3" ]; then
[ "$1" -le "$3" ] || {
eerror "Cette commande supporte au plus $3 argument(s)"
return 1
}
fi
return 0
}
function _vcs_showhelp() {
local action func
action="$1"; shift
func="vcs_${action}_help"
[ $# == 1 -a "$1" == "--help" ] && { "$func" "$action"; return; }
return 1
}
function _vcs_dispatch() {
local dir action type func
dir="$(_vcs_get_dir "$1")"; shift
action="$1"; shift
_vcs_showhelp "$action" "$@" && return
type="$(_vcs_get_type "$dir")" || return
func="${type}_${action}"
"$func" "$@"
}
########################################
function vcs_getvcs_help() {
local OENC="$UTF8"
uecho "uproject $1: Afficher le type de vcs pour le répertoire spécifié
USAGE
uproject $1 [dir]"
}
function vcs_getvcs() {
_vcs_showhelp getvcs "$@" && return
__vcs_find_type "$(_vcs_get_dir "$1")"
}
########################################
function vcs_getroot_help() {
local OENC="$UTF8"
uecho "uproject $1: Afficher le répertoire racine du projet versionné correspondant au répertoire spécifié
USAGE
uproject $1 [dir]"
}
function vcs_getroot() {
_vcs_showhelp getvcs "$@" && return
__vcs_find_root "$(_vcs_get_dir "$1")"
}
########################################
function vcs_getrepos_help() {
local OENC="$UTF8"
uecho "uproject $1: Afficher l'url du repository du projet versionné correspondant au répertoire spécifié
USAGE
uproject $1 [dir]"
}
function vcs_getrepos() {
_vcs_dispatch "$1" getrepos "$@"
}
########################################
function vcs_geturl_help() {
local OENC="$UTF8"
uecho "uproject $1: Afficher l'url dans le repository du répertoire versionné spécifié
USAGE
uproject $1 [dir]"
}
function vcs_geturl() {
_vcs_dispatch "$1" geturl "$@"
}
########################################
function vcs_vcs_help() {
local OENC="$UTF8"
uecho "uproject $1: Appeler le gestionnaire de version approprié avec les arguments donnés
USAGE
uproject $1 [args]"
}
function vcs_vcs() {
_vcs_showhelp vcs "$@" && return
local type
type="$(_vcs_get_type "$(_vcs_get_dir)")" || return
"$type" "$@"
}
########################################
function vcs_add_help() {
local OENC="$UTF8"
uecho "uproject $1: Ajouter les fichiers spécifiés dans le gestionnaire de version
USAGE
uproject $1 <files...>"
}
function vcs_add() {
# le répertoire de référence est le répertoire du premier fichier ajouté
_vcs_dispatch "$(dirname "$1")" add "$@"
}
########################################
function vcs_remove_help() {
local OENC="$UTF8"
uecho "uproject $1: Suppprimer les fichiers versionnés spécifiés du gestionaire de version
USAGE
uproject $1 <files...>"
}
function vcs_remove() {
# le répertoire de référence est le répertoire du premier fichier supprimé
_vcs_dispatch "$(dirname "$1")" remove "$@"
}
########################################
function vcs_copy_help() {
local OENC="$UTF8"
uecho "uproject $1: Copier les fichiers versionnés spécifiés
USAGE
uproject $1 <sources...> <dest>"
}
function vcs_copy() {
# le répertoire de référence est le répertoire de destination
local last=$#
_vcs_dispatch "$(dirname "${!last}")" copy "$@"
}
########################################
function vcs_move_help() {
local OENC="$UTF8"
uecho "uproject $1: Déplacer les fichiers versionnés spécifiés
USAGE
uproject $1 <sources...> <dest>"
}
function vcs_move() {
# le répertoire de référence est le répertoire de destination
local last=$#
_vcs_dispatch "$(dirname "${!last}")" move "$@"
}
########################################
function vcs_mkdir_help() {
local OENC="$UTF8"
uecho "uproject $1: Créer un nouveau répertoire versionné
USAGE
uproject $1"
}
function vcs_mkdir() {
# le répertoire de référence est le répertoire du premier répertoire créé
_vcs_dispatch "$(dirname "$1")" mkdir "$@"
}
########################################
function vcs_commit_help() {
local OENC="$UTF8"
uecho "uproject $1: Enregistrer les modifications sur les fichiers modifiés avec le message spécifiés
USAGE
uproject $1 <message> [files...]
Si files n'est pas spécifié, prendre tous les fichiers modifiés actuellement
OPTIONS
-a Enregistrer les modifications sur tous les fichiers modifiés.
-c Enregistrer uniquement les modifications de l'index. (si applicable)
-l Garder le commit local, i.e. les modifications ne sont pas poussées sur
le serveur. (si applicable)"
}
function vcs_commit() {
_vcs_dispatch "" commit "$@"
}
########################################
function vcs_status_help() {
local OENC="$UTF8"
uecho "uproject $1: Afficher l'état des fichiers versionnés et non versionnés
USAGE
uproject $1"
}
function vcs_status() {
_vcs_dispatch "" status "$@"
}
########################################
function vcs_update_help() {
local OENC="$UTF8"
uecho "uproject $1: Mettre à jour le checkout local avec les modifications présentes sur le serveur
USAGE
uproject $1
OPTIONS
-x Ne pas mettre à jour les références externes"
}
function vcs_update() {
_vcs_dispatch "" update "$@"
}
########################################
function vcs_push_help() {
local OENC="$UTF8"
uecho "uproject $1: Pousser les modifications locales sur le serveur
USAGE
uproject $1"
}
function vcs_push() {
_vcs_dispatch "" push "$@"
}
########################################
function vcs_diff_help() {
local OENC="$UTF8"
uecho "uproject $1: Afficher les différences
USAGE
uproject $1
OPTIONS
-l (par défaut) Afficher les différences non commitées
-c Si cela a du sens, afficher les différences en passe d'être commitées
-R Afficher les modifications effectuées depuis la dernière release
Pour le moment, l'option -R n'est pas implémentée"
}
function vcs_diff() {
_vcs_dispatch "" diff "$@"
}
########################################
function vcs_tag_help() {
local OENC="$UTF8"
uecho "uproject $1: donner un nom symbolique à la révision courante
USAGE
uproject $1 <name>"
}
function vcs_tag() {
_vcs_dispatch "" tag "$@"
}
########################################
# XXX Ajouter vcs_revert, vcs_resolve, uproject_grep
################################################################################
# Git
function git_getrepos() {
git config --get remote.origin.url
}
function git_geturl() {
git config --get remote.origin.url
}
function git_add() {
git add "$@"
}
function git_remove() {
git rm "$@"
}
function git_copy() {
git cp "$@"
}
function git_move() {
git mv "$@"
}
function git_mkdir() {
git mkdir "$@"
}
function git_commit() {
local all=auto push=auto nopush args
normyesval nopush "$UTOOLS_NOPUSH"
[ -n "$nopush" ] && push=
parse_opts + "${PRETTYOPTS[@]}" \
-a,--all all=1 \
-c,--cached all= \
-p,--push push=1 \
-l,--local push= \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
local message="$1"; shift
local -a cmd
cmd=(git commit)
[ -n "$message" ] && cmd=("${cmd[@]}" -m "$message")
if [ "$all" == "auto" ]; then
# Si des fichiers sont spécifiés, prendre ceux-là.
if [ -z "$*" ]; then
# Sinon, s'il y a des fichiers dans l'index, commiter uniquement ces
# fichiers
# Sinon, committer tous les fichiers modifiés
# le code suivant retourne vrai si l'index contient au moins fichier
git status --porcelain 2>/dev/null | awk '
BEGIN { ec = 1 }
substr($0, 1, 1) ~ /[^ ?]/ { ec = 0; exit }
END { exit ec }' ||
cmd=("${cmd[@]}" -a)
fi
else
[ -n "$all" ] && cmd=("${cmd[@]}" -a)
fi
if ! "${cmd[@]}" "$@"; then
[ "$push" == auto ] && return 1
fi
if [ "$push" == auto ]; then
git_push --auto || return
elif [ -n "$push" ]; then
git_push --force || return
fi
return 0
}
function git_status() {
git status "$@"
}
function git_update() {
local dummy args
parse_opts + "${PRETTYOPTS[@]}" \
-x dummy \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
git pull "$@"
}
function git_push() {
local all auto force args
parse_opts + "${PRETTYOPTS[@]}" \
-a,--all all=1 \
--auto auto=1 \
-f,--force force=1 \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
if [ $# -gt 0 ]; then
# si des arguments sont spécifiés, les passer à git sans modification
git push "$@"
return $?
elif [ -n "$all" ]; then
# On a demandé à pusher toutes les branches
git push --all "$@"
return $?
fi
# sinon on push vers origin. vérifier la présence du remote
[ -n "$(git config --get remote.origin.url)" ] || {
if [ -n "$auto" ]; then
# en mode automatique, ignorer l'absence de remote
return 0
else
eerror "Aucun remote origin n'est défini"
return 1
fi
}
# puis calculer la branche à pusher
local branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)"
local origin="$(git config --get "branch.$branch.remote")"
if [ -n "$branch" -a "$origin" == origin ]; then
if [ -n "$auto" ]; then
# en mode automatique, ne pousser que la branche courante
git push origin "$branch" || return
else
# pousser toutes les branches
git push || return
fi
elif [ -n "$force" ]; then
git push || return
fi
return 0
}
function git_diff() {
local dummy cached args
parse_opts + "${PRETTYOPTS[@]}" \
-l dummy \
-r: '$_vcs_unsupported -r' \
-c cached \
-R '$_vcs_unsupported -R' \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
git diff ${cached:+--cached} "$@"
}
function git_tag() {
_vcs_unsupported tag #XXX
}
################################################################################
# Subversion
function svn_getrepos() {
LANG=C svn info "${@:-.}" | awk '/^Repository Root: / { print substr($0, 18) }'
}
function svn_geturl() {
LANG=C svn info "${@:-.}" | awk '/^URL: / { print substr($0, 6) }'
}
function svn_add() {
svn add "$@"
}
function svn_remove() {
svn delete "$@"
}
function svn_copy() {
svn copy --parents "$@"
}
function svn_move() {
svn move --parents "$@"
}
function svn_mkdir() {
svn mkdir --parents "$@"
}
function svn_commit() {
local message="$1"; shift
local -a cmd
cmd=(svn commit)
[ -n "$message" ] && cmd=("${cmd[@]}" -m "$message")
cmd=("${cmd[@]}" "${@:-.}")
"${cmd[@]}"
}
function svn_status() {
svn status "$@"
}
function svn_update() {
local ignore_externals args
parse_opts + "${PRETTYOPTS[@]}" \
-x ignore_externals \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
svn update ${ignore_externals:+--ignore-externals} "$@"
}
function svn_push() {
local args
parse_opts + "${PRETTYOPTS[@]}" \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
}
function svn_diff() {
local dummy revision args tmpfile0 tmpfile
parse_opts + "${PRETTYOPTS[@]}" \
-l dummy \
-r: revision \
-c '$_vcs_unsupported -c' \
-R '$_vcs_unsupported -R' \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
ac_set_tmpfile tmpfile0
ac_set_tmpfile tmpfile
LANG=C svn status 2>/dev/null | awk '/^$/ { next } /^(M|X|Performing status on external item at)/ { next } { print }' >"$tmpfile0"
if [ -s "$tmpfile0" ]; then
echo "Fichiers non modifiés dans un état spécial:" >>"$tmpfile"
cat "$tmpfile0" >>"$tmpfile"
echo "===================================================================" >>"$tmpfile"
fi
ac_clean "$tmpfile0"
svn diff -x -u ${revision:+-r "$revision"} "$@" >>"$tmpfile"
if [ -s "$tmpfile" ]; then
"${PAGER:-less}" "$tmpfile"
ac_clean "$tmpfile"
return 0
else
einfo "Aucune différence détectée"
ac_clean "$tmpfile"
return 1
fi
}
function svn_tag() {
_vcs_unsupported tag #XXX
}
################################################################################
# CVS
function cvs_getrepos() {
_vcs_unsupported getrepos
}
function cvs_geturl() {
_vcs_unsupported geturl
}
function cvs_add() {
cvs add "$@"
}
function cvs_remove() {
rm "$@"
cvs remove "$@"
}
function cvs_copy() {
_vcs_check_nbargs $# 2 2 || return
local src="$1" dest="$2"
if [ -d "$dest" ]; then
# copie d'un fichier vers un répertoire
cp "$src" "$dest" || return
cvs add "$dest/$(basename "$src")"
elif [ -f "$src" ]; then
# copie d'un fichier vers un fichier
cp "$src" "$dest" || return
cvs add "$dest"
else
_vcs_invalid_copy
return 1
fi
}
function cvs_move() {
_vcs_check_nbargs $# 2 2 || return
local src="$1" dest="$2"
if [ -d "$dest" ]; then
# copie d'un fichier vers un répertoire
mv "$src" "$dest" || return
cvs remove "$src"
cvs add "$dest/$(basename "$src")"
elif [ -f "$src" ]; then
# copie d'un fichier vers un fichier
mv "$src" "$dest" || return
cvs remove "$src"
cvs add "$dest"
else
_vcs_invalid_copy
return 1
fi
}
function cvs_mkdir() {
mkdir -p "$@"
cvs add "$@"
}
function cvs_commit() {
local message="$1"; shift
local -a cmd
cmd=(cvs commit)
[ -n "$message" ] && cmd=("${cmd[@]}" -m "$message")
cmd=("${cmd[@]}" "${@:-.}")
"${cmd[@]}"
}
function cvs_status() {
cvs update "$@"
}
function cvs_update() {
local dummy args
parse_opts + "${PRETTYOPTS[@]}" \
-x dummy \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
cvs update "$@"
}
function cvs_push() {
local args
parse_opts + "${PRETTYOPTS[@]}" \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
}
function cvs_diff() {
local dummy revision args tmpfile
parse_opts + "${PRETTYOPTS[@]}" \
-l dummy \
-r: revision \
-c '$_vcs_unsupported -c' \
-R '$_vcs_unsupported -R' \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
ac_set_tmpfile tmpfile
cvs diff -u ${revision:+-r "$revision"} "$@" >"$tmpfile"
if [ -s "$tmpfile" ]; then
"${PAGER:-less}" "$tmpfile"
ac_clean "$tmpfile"
return 0
else
ac_clean "$tmpfile"
einfo "Aucune différence détectée"
return 1
fi
}
function cvs_tag() {
local cwd rootdir
cwd="$(pwd)"
rootdir="$(__vcs_find_root "$cwd")"
cvs tag "$1" "$(relpath "$rootdir" "$cwd")"
}

View File

@@ -1,40 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonction de support pour virsh
##@cooked nocomments
uprovide virsh
function virsh_filter() {
# filtrer une sortie liste de virsh. En pratique, ne prendre que les lignes
# non vides à partir de la ligne "----*"
awk '
BEGIN { dump = 0 }
/^---/ { dump = 1; next }
dump && $0 != "" { print }
'
}
function virsh_list() {
virsh list "$@" | virsh_filter
}
function virsh_pool_list() {
virsh pool-list "$@" | virsh_filter
}
function guess_vm_type() {
# Afficher hn, kvm, vmware, virtualbox ou openvz suivant que l'on est
# *probablement* respectivement sur une machine physique, une machine
# virtuelle kvm, vmware, virtualbox, openvz
# XXX pour le moment, seuls openvz, kvm et hn sont supportés
local ctid="$(grep envID /proc/self/status | awk '{print $2}')"
if [ -n "$ctid" -a "$ctid" != "0" ]; then
echo openvz
return 0
fi
local cpuid="$(grep 'model name' /proc/cpuinfo)"
if quietgrep QEMU <<<"$cpuid"; then
echo kvm
else
echo hn
fi
}

View File

@@ -1,696 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion des services de webobjects (démarrage/arrêt), et de leur configuration
##@cooked nocomments
##@require base
##@require sysinfos
##@require javaproperties
uprovide webobjects
urequire base sysinfos javaproperties
################################################################################
# Préfixes
__webobjects_prefixes=
function __compute_webobjects_prefixes() {
[ -n "$__webobjects_prefixes" ] && return
if check_sysinfos -s darwin; then
# valeurs par défaut de NEXT_ROOT, WOROOT et LOCALROOT sur MacOS X
DEFAULT_NEXT_ROOT=
function get_default_woroot_prefix() { echo "$NEXT_ROOT/System"; }
function get_default_localroot_prefix() { echo "$NEXT_ROOT"; }
else
# valeurs par défaut de NEXT_ROOT, WOROOT et LOCALROOT sur les autres Unix
DEFAULT_NEXT_ROOT=/opt/Apple
function get_default_woroot_prefix() { echo "$NEXT_ROOT"; }
function get_default_localroot_prefix() { echo "$NEXT_ROOT/Local"; }
fi
NEXT_ROOT="${NEXT_ROOT:-$DEFAULT_NEXT_ROOT}"
WOROOT="${WOROOT:-$(get_default_woroot_prefix)}"
LOCALROOT="${LOCALROOT:-$(get_default_localroot_prefix)}"
SYSTEMFRAMEWORKS="$WOROOT/Library/Frameworks"
WOEXTENSIONS="$LOCALROOT/Library/WebObjects/Extensions"
WOFRAMEWORKS="$LOCALROOT/Library/WebObjects/Applications/Frameworks"
WOAPPLICATIONS="$LOCALROOT/Library/WebObjects/Applications"
WOCONFIGURATION="$LOCALROOT/Library/WebObjects/Configuration"
WOAUTOSTART="$WOCONFIGURATION/AutoStart.txt"
WOLOGS="/var/log/WebObjects"
local versionfile="$SYSTEMFRAMEWORKS/JavaWebObjects.framework/Resources/version.plist"
[ -f "$versionfile" ] && WOVERSION="$(grep -A 1 CFBundleShortVersionString "$versionfile" | tail -1 | sed 's/^.*<string>\(.*\)<\/string>.*$/\1/')" || WOVERSION=
__webobjects_prefixes=1
}
UTOOLS_PREFIXES=("${UTOOLS_PREFIXES[@]}" NEXT_ROOT WOROOT LOCALROOT SYSTEMFRAMEWORKS WOEXTENSIONS WOFRAMEWORKS WOAPPLICATIONS WOCONFIGURATION WOAUTOSTART WOLOGS WOVERSION)
function compute_webobjects_prefixes() {
__compute_webobjects_prefixes
}
function recompute_webobjects_prefixes() {
__webobjects_prefixes=
__compute_webobjects_prefixes
}
function get_NEXT_ROOT_prefix() {
__compute_webobjects_prefixes
echo "$NEXT_ROOT"
}
function get_WOROOT_prefix() {
__compute_webobjects_prefixes
echo "$WOROOT"
}
function get_LOCALROOT_prefix() {
__compute_webobjects_prefixes
echo "$LOCALROOT"
}
function get_SYSTEMFRAMEWORKS_prefix() {
__compute_webobjects_prefixes
echo "$SYSTEMFRAMEWORKS"
}
function get_WOEXTENSIONS_prefix() {
__compute_webobjects_prefixes
echo "$WOEXTENSIONS"
}
function get_WOFRAMEWORKS_prefix() {
__compute_webobjects_prefixes
echo "$WOFRAMEWORKS"
}
function get_WOAPPLICATIONS_prefix() {
__compute_webobjects_prefixes
echo "$WOAPPLICATIONS"
}
function get_WOCONFIGURATION_prefix() {
__compute_webobjects_prefixes
echo "$WOCONFIGURATION"
}
function get_WOAUTOSTART_prefix() {
__compute_webobjects_prefixes
echo "$WOAUTOSTART"
}
function get_WOLOGS_prefix() {
__compute_webobjects_prefixes
echo "$WOLOGS"
}
function get_WOVERSION_prefix() {
__compute_webobjects_prefixes
echo "$WOVERSION"
}
################################################################################
# Bundles
function is_wobundle() {
# Tester si $1 a un nom de bundle valide, c'est à dire avec l'extension .woa
# ou .framework
local bundle="$(basename "$(abspath "$1")")"
[ "${bundle%.woa}" != "$bundle" -o "${bundle%.framework}" != "$bundle" ]
}
function is_woappdir() {
# Tester si $1 est un répertoire d'application webobjects. Le test est
# effectué sur le contenu du bundle, pas sur le nom (utiliser is_wobundle()
# pour cela)
# existence du répertoire
[ -d "$1" ] || return 1
# répertoires de resources
[ -d "$1/Contents/Resources" ] || return 1
# répertoires de classpath
[ -d "$1/Contents/UNIX" ] || return 1
[ -d "$1/Contents/MacOS" ] || return 1
[ -d "$1/Contents/Windows" ] || return 1
# fin des tests
return 0
}
function is_wofwkdir() {
# Tester si $1 est un répertoire de framework webobjects. Le test est
# effectué sur le contenu du bundle, pas sur le nom (utiliser is_wobundle()
# pour cela)
# existence du répertoire
[ -d "$1" ] || return 1
# répertoires de resource
[ -d "$1/Resources" -o -d "$1/WebServerResources" ] || return 1
# fin des tests
return 0
}
function get_app_winclspth() {
# calculer la valeur de Contents/Windows/CLSSPATH.txt pour l'application $1
local found
if [ ! -f "$1/Contents/Windows/CLSSPATH.txt" ]; then
local clspth
array_from_lines clspth "$(list_files "$1/Contents/Windows" | grep -i clsspath.txt)"
if [ ${#clspth[*]} -eq 1 ]; then
echo "Contents/Windows/$clspth"
found=1
fi
fi
# pas trouvé, prendre la valeur par défaut
[ -n "$found" ] || echo Contents/Windows/CLSSPATH.txt
}
function get_infofile() {
# Obtenir le chemin vers le fichier Info.plist dans le répertoire de
# resource du bundle $1
local bundle="$(abspath "$1")" resdir
if endswith "$bundle" .woa; then
resdir="$bundle/Contents"
elif endswith "$bundle" .framework; then
resdir="$bundle/Resources"
else
# on a donné directement resdir
resdir="$bundle"
fi
echo "$resdir/Info.plist"
}
function read_infofile() {
# Lire la version et le numéro de release dans le fichier $1 (chemin vers
# Info.plist) et les placer dans les variables $2(=version) et $3(=release)
# Retourner 1 si un erreur s'est produite, par exemple si le fichier $1
# n'existe pas ou n'est pas accessible en lecture
[ -f "$1" -a -r "$1" ] || return 1
set_var "${2:-version}" "$(grep -A 1 CFBundleShortVersionString "$1" | tail -1 | sed 's/^.*<string>\(.*\)<\/string>.*$/\1/')"
set_var "${3:-release}" "$(grep -A 1 CFBundleVersion "$1" | tail -1 | sed 's/^.*<string>\(.*\)<\/string>.*$/\1/')"
}
function write_infofile() {
# Ecrire $2 (la version) et $3 (le numéro de release) dans le fichier $1
# (chemin vers Info.plist)
# Retourner 1 si un erreur s'est produite, par exemple si le fichier $1
# n'existe pas
local status tmpfile
ac_set_tmpfile tmpfile
<"$1" >"$tmpfile" cawkrun version="$2" release="$3" '
/<key>CFBundleShortVersionString<\/key>/ {
print; getline
sub(/<string>.*<\/string>/, "<string>" version "</string>")
print; next
}
/<key>CFBundleVersion<\/key>/ {
print; getline
sub(/<string>.*<\/string>/, "<string>" release "</string>")
print; next
}
{ print }
' && cat "$tmpfile" >"$1"
status=$?
ac_clean "$tmpfile"
return $status
}
function get_jawotoolsfile() {
# Obtenir le chemin vers le fichier jawotools.properties dans le bundle $1
local default="$1/jawotools.properties" file
for file in "$default" "$1/build_infos.txt"; do
if [ -f "$file" ]; then
echo "$file"
return
fi
done
echo "$default"
}
function read_jawotoolsfile() {
# lire le fichier de propriété $1 et placer les valeurs dans les variables
# $2(=version), $3(=releaseDate), $4(=description)
local filename="$(basename "$1")"
if [ "$filename" == "build_infos.txt" ]; then
# legacy
read_property "$1" version "${2:-version}"
read_property "$1" date "${3:-releaseDate}"
read_property "$1" desc "${4:-description}"
else
read_property "$1" version "${2:-version}"
read_property "$1" releaseDate "${3:-releaseDate}"
read_property "$1" description "${4:-description}"
fi
}
function save_jawotoolsfile() {
# écrire le fichier de propriété $1 avec les valeurs version ($2),
# releaseDate ($3) et description ($4)
[ -e "$1" ] || touch "$1"
write_property "$1" version "$2"
write_property "$1" releaseDate "$3"
write_property "$1" description "$4"
}
function get_versionfile() {
# Obtenir le chemin vers le fichier VERSION.txt dans le répertoire de
# resource du bundle $1
local bundle="$(abspath "$1")" resdir
if endswith "$bundle" .woa; then
resdir="$bundle/Contents/Resources"
elif endswith "$bundle" .framework; then
resdir="$bundle/Resources"
else
# on a donné directement resdir
resdir="$bundle"
fi
local default="$resdir/VERSION.txt" file
for file in "$default" "$1/version.txt"; do
if [ -f "$file" ]; then
echo "$file"
return
fi
done
echo "$default"
}
function get_configfile() {
# obtenir le chemin vers le fichier de configuration du répertoire de
# resource du bundle
# $1=bundle ou resdir (appdir/Contents/Resources ou fwkdir/Resources)
local bundle="$(abspath "$1")" resdir
if endswith "$bundle" .woa; then
resdir="$bundle/Contents/Resources"
elif endswith "$bundle" .framework; then
resdir="$bundle/Resources"
else
# on a donné directement resdir
resdir="$bundle"
fi
local configs
array_lsfiles configs "$resdir" "*.config"
if [ ${#configs[*]} -eq 0 ]; then
array_lsfiles configs "$resdir" "config.xml"
fi
echo "${configs:-$resdir/Properties}"
}
function searchreplace_classpath() {
# Dans les fichiers classpath de l'application $1, remplacer $2 par $3. Si
# $3 est vide, la ligne est supprimée
local bundle="$1" search="$2" replace="$3" scriptunx scriptwin clspth
[ -n "$search" ] || return 1
search="${search//\//\\/}"; replace="${replace//\//\\/}"
if [ -n "$replace" ]; then
scriptunx="s/${search}/${replace}/g"
else
scriptunx="/${search}/d"
fi
search="${search//\\\//\\\\}"; replace="${replace//\\\//\\\\}"
if [ -n "$replace" ]; then
scriptwin="s/${search}/${replace}/g"
else
scriptwin="/${search}/d"
fi
clspth="$bundle/Contents/UNIX/UNIXClassPath.txt"
nl2lf "$clspth"; sedi "$scriptunx" "$clspth"
clspth="$bundle/Contents/MacOS/MacOSClassPath.txt"
nl2lf "$clspth"; sedi "$scriptunx" "$clspth"
clspth="$bundle/$(get_app_winclspth "$bundle")"
nl2lf "$clspth"; sedi "$scriptwin" "$clspth"; nl2crlf "$clspth"
}
function dump_jars() {
# Afficher les jars des frameworks utilisés par l'application $1
local clspth
if [ "$UNAME_SYSTEM" == "Darwin" ]; then
clspth="Contents/MacOS/MacOSClassPath.txt"
else
clspth="Contents/UNIX/UNIXClassPath.txt"
fi
cat "$1/$clspth" | _nl2lf | grep '\.framework' | grep -v "^#" | grep -v "APPROOT/" | grep -v "WOROOT/" | awk '{
if (match($0, /[^\/]*\.framework/) != 0) {
print
}
}' | sort -u
}
function dump_frameworks() {
# Afficher les frameworks utilisés par l'application $1
dump_jars "$1" | awk '{
if (match($0, /[^\/]*\.framework/) != 0) {
print substr($0, RSTART, RLENGTH)
}
}'
}
function remove_framework() {
# supprimer le framework $2 (nom de base) des fichiers de classpath du
# bundle d'application $1
local bundle="$1" framework="$2" frameworks
endswith "$framework" .framework || framework="$framework.framework"
array_from_lines frameworks "$(dump_frameworks "$bundle")"
if array_contains frameworks "$framework"; then
searchreplace_classpath "$bundle" "^LOCALROOT/.*/$framework/"
fi
}
function add_framework() {
# s'il n'y existe pas déjà, ajouter le framework $2 (nom de base ou chemin
# absolu) aux fichiers de classpath du bundle d'application $1
local bundle="$1" framework="$2" frameworks jars jar line
local winclspth="$(get_app_winclspth "$bundle")"
endswith "$framework" .framework || framework="$framework.framework"
array_from_lines frameworks "$(dump_frameworks "$bundle")"
if ! array_contains frameworks "$framework"; then
if beginswith "$framework" /; then
# on a donné un chemin absolu
array_lsfiles jars "$framework/Resources/Java" "*.jar"
if [ -z "${jars[*]}" ]; then
eerror "Impossible de trouver les fichiers du framework $framework
dans $WOFRAMEWORKS"
return 1
else
for jar in "${jars[@]}"; do
echo "$jar" >>"$bundle/Contents/UNIX/UNIXClassPath.txt"
echo "$jar" >>"$bundle/Contents/MacOS/MacOSClassPath.txt"
echo "${jar//\//\\}" >>"$bundle/$winclspth"
done
fi
else
# on a donné juste le nom du framework
array_from_lines jars "$(list_files "$WOFRAMEWORKS/$framework/Resources/Java" "*.jar")"
if [ -z "${jars[*]}" ]; then
eerror "Impossible de trouver les fichiers du framework $framework
dans $WOFRAMEWORKS"
return 1
else
for jar in "${jars[@]}"; do
line="LOCALROOT/Library/WebObjects/Applications/Frameworks/$framework/Resources/Java/$jar"
echo "$line" >>"$bundle/Contents/UNIX/UNIXClassPath.txt"
echo "$line" >>"$bundle/Contents/MacOS/MacOSClassPath.txt"
echo "${line//\//\\}" >>"$bundle/$winclspth"
done
fi
fi
fi
}
function fix_jars_case() {
# Vérifier que la casse des jars de tous les frameworks utilisés par
# l'application $1 est conforme au système de fichier
local bundle="$1" clspth jars jar fwkdir fwkname jarname jarnamefs
if [ "$UNAME_SYSTEM" == "Darwin" ]; then
clspth="Contents/MacOS/MacOSClassPath.txt"
else
clspth="Contents/UNIX/UNIXClassPath.txt"
fi
array_from_lines jars "$(dump_jars "$bundle")"
for jar in "${jars[@]}"; do
{ endswith "$jar" .jar || endswith "$jar" .zip; } || continue
if beginswith "$jar" LOCALROOT; then
fwkname="${jar##*/Frameworks/}"; fwkname="${fwkname%%/*}"
fwkdir="$WOFRAMEWORKS"
else
fwkdir="${jar%/*.framework/*}"
fwkname="${jar##/*.framework/}";
fwkname="${jar:0:$((${#jar}-${#fwkname}-1))}"; fwkname="${fwkname##*/}"
fi
jarname="${jar##*/}"
if [ ! -d "$fwkdir/$fwkname" ]; then
eerror "$(basename "$bundle"): $fwkname: ce framework n'existe pas"
continue
fi
array_from_lines jarnamefs "$(list_files "$fwkdir/$fwkname/Resources/Java" "*.jar" | grep -i "^$jarname")"
if [ ${#jarnamefs[*]} -eq 0 ]; then
eerror "$(basename "$bundle"): $fwkname: $jarname n'existe pas"
elif [ ${#jarnamefs[*]} -gt 1 ]; then
eerror "$(basename "$bundle"): $fwkname: il existe plusieurs jars $jarname"
else
if [ "$jarname" != "$jarnamefs" ]; then
einfo "$(basename "$bundle"): $fwkname: $jarnamefs"
searchreplace_classpath "$bundle" "$fwkname/Resources/Java/$jarname" "$fwkname/Resources/Java/$jarnamefs"
fi
fi
done
}
function verifix_bundle() {
# vérifier et corriger le bundle $1. Pour une application, on vérifie que le
# script est exécutable. Pour un framework, on vérifie que le framework est
# conforme au modèle des framework générés par WebObjects.
local bundle="$1"
if is_woappdir "$bundle"; then
local script="$bundle/$(basename "$bundle" .woa)"
if [ ! -x "$script" ]; then
chmod +x "$script"
fi
elif is_wofwkdir "$bundle"; then
[ -L "$bundle/Resources" ] && return
local filename
if [ ! -L "$bundle/Resources" ]; then
rm -rf "$bundle/Versions/A/Resources"
cpdir "$bundle/Resources" "$bundle/Versions/A/Resources"
rm -rf "$bundle/Resources"
fi
if [ ! -L "$bundle/WebServerResource" ]; then
rm -rf "$bundle/Versions/A/WebServerResources"
cpdir "$bundle/WebServerResources" "$bundle/Versions/A/WebServerResources"
rm -rf "$bundle/WebServerResources"
fi
local cwd="$(pwd)"
cd "$bundle/Versions"
if [ -e Current ]; then
if [ ! -L Current -a -d Current ]; then
rm -rf Current
else
rm -f Current
fi
fi
ln -s A Current
cd ..
ln -s Versions/Current/Resources Resources
ln -s Versions/Current/WebServerResources WebServerResources
cd "$cwd"
fi
}
function compute_fapps() {
# Placer dans le tableau $1(=fappnames) la liste des noms de bundle
# d'applications qui dépendent du framework $2
# Cette opération est faite à partir des informations sur le système de
# fichier. Elle ne peut donc concerner qu'une installation locale.
local -a __cf_fappnames
local __cf_fwknames __cf_fwkname __cf_appnames __cf_appname
__cf_fwkname="$2"
[ "${__cf_fwkname%.framework}" != "$__cf_fwkname" ] || __cf_fwkname="$__cf_fwkname.framework"
__cf_fwkname="$(basename "$__cf_fwkname")"
array_from_lines __cf_appnames "$(list_dirs "$WOAPPLICATIONS" "*.woa")"
for __cf_appname in "${__cf_appnames[@]}"; do
array_from_lines __cf_fwknames "$(dump_frameworks "$WOAPPLICATIONS/$__cf_appname")"
if array_contains __cf_fwknames "$__cf_fwkname"; then
array_set __cf_fappnames "$__cf_appname"
fi
done
array_copy "${1:-fappnames}" __cf_fappnames
}
################################################################################
# Applications et instances
WORAURL_USE_PROXY= # faut-il passer par un proxy?
WORAURL_DATA=
function woraurl() {
# Faire une requête avec la méthode $1 sur l'url $2 avec le payload $3 (par
# exemple pour la méthode POST). la réponse est disponible dans le fichier
# $WORAURL_DATA, $4(=http_code) contient le code de réponse.
# Retourner 0 en cas de succès, ou une valeur différente de zéro si un
# erreur se produit (typiquement, 3 pour une erreur du serveur, 1 pour une
# réponse applicative, comme par exemple si l'application n'existe pas)
# Les codes de réponse 2xx et 417 sont des succès
# Les autres codes (à priori 4xx ou 5xx) sont des erreurs
# note: le code 417 est utilisé par le moniteur pour répondre "Non", par
# opposition à 200 utilisé pour répondre "OUI"
local _status _http_code _args
[ -n "$WORAURL_DATA" ] || ac_set_tmpfile WORAURL_DATA
_args=(-s -X "${1:-GET}" ${3:+-d "$3"} -w '%{http_code}' -o "$WORAURL_DATA")
[ -z "$WORAURL_USE_PROXY" ] && _args=("${_args[@]}" -x "")
_http_code="$(curl "${_args[@]}" "$2")"
case "$_http_code" in
2*|417) _status=0;;
4*) _status=1;;
5*) _status=3;;
*) _status=11;;
esac
set_var "${4:-http_code}" "$_http_code"
return $_status
}
function wogeturl() { woraurl GET "$@"; }
function splitins() {
# Analyser le nom $1, qui peut être de forme '', 'Name.woa',
# 'Name.framework', 'App' ou 'Instance-N' (où N est un nombre), et
# initialiser les variables $2(=type) et $3(=name)
# Si $1=="", type=all et name=""
# Si $1==Name.woa, type=woa et name=Name.woa
# Si $1==Name.framework, type=fwk et name=Name.framework
# Si $1==App, type=app et name=App
# si $1==App-N, type=ins et name=App-N
if [ -z "$1" ]; then
set_var "${2:-type}" all
set_var "${3:-name}"
elif [ "${1%.woa}" != "$1" ]; then
set_var "${2:-type}" woa
set_var "${3:-name}" "$1"
elif [ "${1%.framework}" != "$1" ]; then
set_var "${2:-type}" fwk
set_var "${3:-name}" "$1"
elif [[ "$1" == *-* ]]; then
local __si_name __si_num
__si_name="${1%-*}"
__si_num="${1##*-}"
if [ -z "${__si_num//[0-9]/}" ]; then
set_var "${2:-type}" ins
set_var "${3:-name}" "$1"
else
set_var "${2:-type}" app
set_var "${3:-name}" "$1"
fi
elif [ -n "$1" ]; then
set_var "${2:-type}" app
set_var "${3:-name}" "$1"
fi
}
################################################################################
# Environnement
function create_wodirs_maybe() {
mkdir -p "$WOAPPLICATIONS"
mkdir -p "$WOFRAMEWORKS"
}
function check_autostart() {
# vérifier la présence du fichier $WOAUTOSTART. Si ce n'est pas le cas, le
# créer avec le contenu du tableau $1
if [ ! -f "$WOAUTOSTART" -a -n "$1" ]; then
array_to_lines "$1" | csort >"$WOAUTOSTART" || return 1
enote "Le fichier $(ppath "$WOAUTOSTART") a été créé avec la liste suivante:
$(<"$WOAUTOSTART")"
fi
}
function get_autostart_order() {
# Initialiser le tableau $1 avec la liste donnée dans le fichier
# $WOAUTOSTART
array_from_lines "$1" "$(<"$WOAUTOSTART" filter_comment)"
}
function apply_autostart_order() {
# Réordonner les valeurs $3..* selon la liste donnée dans le tableau $2,
# puis placer le résultat dans le tableau $1. $2 doit être construit avec
# get_autostart_order(). Si $2 n'est pas spécifié, la liste est construite
# localement.
# Si le tableau contient des lignes de délai @N, replacer les délais après
# les applications appropriées
local __aa_reverse
if [ "$1" == "-r" ]; then
__aa_reverse=1
shift
fi
local -a __aa_oapps __aa_src
local __aa_dest="$1" __aa_oapp; shift
local __found
if [ -n "$1" ]; then
array_copy __aa_oapps "$1"
else
get_autostart_order __aa_oapps
fi
shift
set_array __aa_src @ "$@"
array_new "$__aa_dest"
for __aa_oapp in "${__aa_oapps[@]}"; do
if [[ "$__aa_oapp" == @* ]]; then
# Si on trouve une ligne @N, et que la précédente ligne a été
# sélectionnée, alors inclure le délai aussi dans la liste des
# valeurs à prendre en compte
[ -n "$__aa_found" ] && array_add "$__aa_dest" "$__aa_oapp"
__aa_found=
elif array_contains __aa_src "$__aa_oapp"; then
array_add "$__aa_dest" "$__aa_oapp"
array_del __aa_src "$__aa_oapp"
__aa_found=1
else
__aa_found=
fi
done
array_extend "$__aa_dest" __aa_src
[ -n "$__aa_reverse" ] && array_reverse "$__aa_dest"
}
function __unix_woservices() {
if [ -x /etc/init.d/WOServices ]; then
/etc/init.d/WOServices "$@"
else
eerror "Ce script ne sait pas piloter wotaskd/javamonitor sur cette plateforme"
return 1
fi
}
SERVICE_OVERRIDE_wotaskd_stop=wotaskd_stop
function wotaskd_stop() {
if [ "$UNAME_SYSTEM" == "Darwin" ]; then
launchctl unload /System/Library/LaunchDaemons/com.apple.wotaskd.plist
else
__unix_woservices stop
fi
}
SERVICE_OVERRIDE_wotaskd_start=wotaskd_start
function wotaskd_start() {
if [ "$UNAME_SYSTEM" == "Darwin" ]; then
launchctl load /System/Library/LaunchDaemons/com.apple.wotaskd.plist
else
__unix_woservices start
fi
}
SERVICE_OVERRIDE_javamonitor_stop=javamonitor_stop
SERVICE_OVERRIDE_womonitor_stop=javamonitor_stop
function javamonitor_stop() {
if [ "$UNAME_SYSTEM" == "Darwin" ]; then
launchctl unload /System/Library/LaunchDaemons/com.apple.womonitor.plist
else
__unix_woservices stop
fi
}
function womonitor_stop() { javamonitor_stop "$@"; }
SERVICE_OVERRIDE_javamonitor_start=javamonitor_start
SERVICE_OVERRIDE_womonitor_start=javamonitor_start
function javamonitor_start() {
if [ "$UNAME_SYSTEM" == "Darwin" ]; then
launchctl load /System/Library/LaunchDaemons/com.apple.womonitor.plist
else
__unix_woservices start
fi
}
function womonitor_start() { javamonitor_start "$@"; }
SERVICE_OVERRIDE_woservices_stop=woservices_stop
function woservices_stop() {
if [ "$UNAME_SYSTEM" == "Darwin" ]; then
javamonitor_stop
wotaskd_stop
else
__unix_woservices stop
fi
}
SERVICE_OVERRIDE_woservices_start=woservices_start
function woservices_start() {
if [ "$UNAME_SYSTEM" == "Darwin" ]; then
wotaskd_start
javamonitor_start
else
__unix_woservices start
fi
}

View File

@@ -1,558 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Déploiement de bundle WebObjects
##@cooked nocomments
##@require ulib
##@require base
##@require prefixes
##@require apache
##@require webobjects
uprovide woinst
urequire ulib base prefixes apache webobjects
function date2version() {
local date="$1"
dd="$(expr "$date" : "\(..\)")"; [ -z "$dd" ] && dd="$(date +%d)"
mm="$(expr "$date" : "../\(..\)")"; [ -z "$mm" ] && mm="$(date +%m)"
yyyy="$(expr "$date" : "../../\(....\)")"; [ -z "$yyyy" ] && yyyy="$(date +%Y)"
yy="$(expr "$yyyy" : "..\(..\)")"
echo "$yyyy$mm$dd"
}
function woconf() {
function __woconf_display_help() {
uecho "woctl configure: configurer une application ou un framework
USAGE
configure <app.woa|fwk.framework> [cmds...]
cmds est soit un unique argument avec une commande par ligne, soit une suite de commandes séparées par //
COMMANDES
# comment
Les commentaires sont ignorés
v[erify]
Vérifier le corriger la consistance du bundle.
Cette action est effectuée automatiquement sauf si l'option --no-verify
est spécifiée.
set_config configfile
c>configfile
Changer le fichier de configuration par défaut
set_config configfile srcfile
c>configfile:srcfile
Créer le fichier configfile en le copiant depuis srcfile, et en faire le
nouveau fichier de configuration par défaut
set_property prop value [configfile]
c[configfile/]prop=value
Modifier une propriété dans le fichier de configuration spécifié.
Utiliser le fichier de configuration par défaut si configfile n'est pas
spécifié.
set_eomodel eomodel
e>eomodel
Changer l'eomodel par défaut
set_dbconfig dbConfig [eomodel]
e[eomodel/]dbConfig
Activer la configuration dbConfig dans l'eomodel spécifié. Utiliser
l'eomodel par défaut si eomodel n'est pas spécifié.
add Fwk.framework
aFwk.framework
Ajouter un framework au classpath de l'application
remove Fwk.framework
rFwk.framework
Enlever un framework du classpath de l'application
replace before after
sbefore:after
Faire un recherche/remplace dans les fichiers de classpath de
l'application.
f[ix_case]
Corriger la casse dans les fichiers de classpath de l'application, selon
les frameworks effectivement installés. En effet, un déploiement qui
peut fonctionner sur MacOSX, dont le système de fichier n'est pas
sensible à la casse, peut cesser de fonctionner sur Linux, parce que le
nom du jar ne correspond pas."
}
local noverify bundle cmds cmd
noverify=
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with __woconf_display_help' \
--noverify,--no-verify noverify=1 \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
bundle="$1"; shift
[ -n "$bundle" ] || {
eerror "Il faut spécifier le bundle à configurer"
return 1
}
if is_wobundle "$bundle" && is_woappdir "$bundle"; then
:
elif is_wobundle "$bundle" && is_wofwkdir "$bundle"; then
:
else
eerror "N'est pas un bundle valide: $bundle"
return 1
fi
bundle="$(abspath "$bundle")"
[ -w "$bundle" ] || die "Bundle non accessible en écriture"
if [ $# -le 1 ]; then
array_from_lines cmds "$(filter_comment <<<"$1")"
else
cmds=()
cmd=()
while [ -n "$1" ]; do
if [ "$1" == // ]; then
if [ -n "${cmd[*]}" ]; then
cmds=("${cmds[@]}" "$(quoted_args "${cmd[@]}")")
fi
cmd=()
else
cmd=("${cmd[@]}" "$1")
fi
shift
done
if [ -n "${cmd[*]}" ]; then
cmds=("${cmds[@]}" "$(quoted_args "${cmd[@]}")")
fi
fi
etitle "Configuration de $(ppath "$bundle")"
local verify_done first=1
[ -z "$noverify" ] && {
estep verify
verifix_bundle "$bundle"
verify_done=1
}
for cmd in "${cmds[@]}"; do
eval "set -- $cmd"
if [ $# -eq 1 ]; then
# commandes abrégées sur une lettre
case "$1" in
v|verify|verifix)
# si v est en premier, et que la vérification a déjà été faite,
# alors on peut l'ignorer
if [ -z "$first" -o -z "$verify_done" ]; then
estep "verify"
verifix_bundle "$bundle"
fi
;;
f|fix_case|fix-case)
estep "fix-case"
fix_jars_case "$bundle"
;;
c*)
eerror "set_config / set_property ne sont pas implémentés"
;;
e*)
eerror "set_eomodel / set_dbconfig ne sont pas implémentés"
;;
a*)
local framework="${1#a}"
estep "add $framework"
add_framework "$bundle" "$framework"
;;
r*)
local framework="${1#r}"
estep "remove $framework"
remove_framework "$bundle" "$framework"
;;
s*)
local search replace
replace="${1#s}"
search="${replace%%:*}"
replace="${replace#*:}"
if [ -n "$replace" ]; then
estep "Replace in classpath $search --> $replace"
else
estep "Delete in classpath $search"
fi
searchreplace_classpath "$bundle" "$search" "$replace"
;;
*) eerror "Commande invalide: $1";;
esac
else
# commandes "user-friendly"
case "$1" in
conf|config|set_conf|set_config)
eerror "set_config n'est pas implémenté"
;;
prop|property|set_prop|set_property)
eerror "set_property n'est pas implémenté"
;;
eomodel|set_eomodel)
eerror "set_eomodel n'est pas implémenté"
;;
dbconf|dbconfig|set_dbconf|set_dbconfig)
eerror "set_dbconfig n'est pas implémenté"
;;
add|add_fwk|add_framework)
estep "add $2"
add_framework "$bundle" "$2"
;;
remove|remove_fwk|remove_framework)
estep "remove $2"
remove_framework "$bundle" "$2"
;;
repl|replace)
if [ -n "$3" ]; then
estep "Replace in classpath $2 --> $3"
else
estep "Delete in classpath $2"
fi
searchreplace_classpath "$bundle" "$2" "$3"
;;
*) eerror "Commande invalide: $*";;
esac
fi
first=
done
eend
}
function wotag() {
function __wotag_display_help() {
uecho "woctl tag: attacher une information de version à un bundle
USAGE
tag [options] <bundle>
OPTIONS
-c Vérifier si des informations de versions existent dans le bundle
spécifié.
-s Afficher les informations de versions attachées
-v VERSION
Spécifier la version, ou '-' s'il n'y a pas de version
-d DATE
Spécifier la date de release
-m DESC
Spécifier une description du bundle
Si aucune des options -v, -d, -m n'est spécifiée, alors tenter de prendre les
informations de version et la date de release depuis le fichier VERSION.txt
situé dans le répertoire de resources.
Sinon, il faut saisir manuellement les informations."
}
local action newversion newdate newdesc
local version date desc release
local bundlename bundle found
action=tag
newversion=
newdate=
newdesc=
bundlename=
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with __wotag_display_help' \
-c action=check \
-s action=show \
-v:,--version: newversion= \
-d:,--date: newdate= \
-m:,--desc: newdesc= \
--message: bundlename= \
@ args -- "$@" &&
set -- "${args[@]}" || {
eerror "$args"
return 1
}
bundle="$1"
[ -n "$bundle" ] || {
eerror "Il faut spécifier le bundle à tagger"
return 1
}
if [ ! -d "$bundle" ]; then
if [ "$action" == "check" ]; then
return 1
elif [ "$action" == "show" ]; then
[ -z "$bundlename" ] && bundlename="$(basename "$bundle")"
eecho "$bundlename: not found"
return 0
else
eerror "Bundle non trouvé: $bundle"
return 1
fi
elif is_wobundle "$bundle" && is_woappdir "$bundle"; then
:
elif is_wobundle "$bundle" && is_wofwkdir "$bundle"; then
:
else
eerror "N'est pas un bundle valide: $bundle"
return 1
fi
bundle="$(abspath "$bundle")"
[ -z "$bundlename" ] && bundlename="$(basename "$bundle")"
local infofile="$(get_infofile "$bundle")"
local jawotoolsfile="$(get_jawotoolsfile "$bundle")"
local jawotoolsfile2="$bundle/jawotools.properties"
local versionfile="$(get_versionfile "$bundle")"
if [ "$action" == "check" ]; then
[ -f "$jawotoolsfile" ] || return 1
read_jawotoolsfile "$jawotoolsfile" version date
[ -n "$version" -o -n "$date" ] && return 0
return 1
elif [ "$action" == "show" ]; then
found=
if [ -f "$jawotoolsfile" ]; then
read_jawotoolsfile "$jawotoolsfile" version date desc
if [ -n "$version" -o -n "$date" ]; then
eecho "$bundlename: Version${version:+ "$version"}${date:+ du "$date"}${desc:+
("$desc")}"
found=1
fi
elif [ -f "$infofile" ]; then
read_infofile "$infofile" version release
if [ -n "$version" ]; then
eecho "$bundlename: Version $version${release:+ ("$release")}"
found=1
elif [ -n "$release" ]; then
eecho "$bundlename: Release $release"
found=1
fi
fi
[ -n "$found" ] || eecho "$bundlename: no version found"
elif [ "$action" == "tag" ]; then
# lire les valeurs actuelles
if [ -f "$jawotoolsfile" ]; then
read_jawotoolsfile "$jawotoolsfile" version date desc
fi
# si le fichier de version existe, lire la version et la date de release
if [ -z "$newversion" -a -z "$newdate" -a -f "$versionfile" ]; then
newversion="$(awk <"$versionfile" '{
gsub("-r../../....$", "")
print
exit
}')"
newdate="$(awk <"$versionfile" '{
if ($0 ~ /.*-r..\/..\/....$/) {
gsub(".*-r", "")
print
}
exit
}')"
fi
# si le fichier Info.plist existe, y lire les informations de version
if [ -z "$newversion" -a -z "$newdate" -a -f "$infofile" ]; then
read_infofile "$infofile" newversion release
[ -n "$newversion" ] || newversion="$release"
fi
# nous n'avons pas trouvé de version, il faut saisir les valeurs à la main
if [ -z "$newversion" -o -z "$newdate" ]; then
[ "$newversion" == "-" ] && newversion=
[ "$newdate" == "-" ] && newdate=
defversion="${newversion:-$version}"
read_value "Entrez la version (vide s'il n'y a que la date de release)" newversion "$defversion" N
defdate="${newdate:-${date:-$(date +"%d/%m/%Y")}}"
read_value "Entrez la date de release" newdate "$defdate"
defdesc="${newdesc:-$desc}"
read_value -i "Entrez une description du bundle" newdesc "$defdesc" N
fi
[ "$newversion" == "-" ] && newversion=
[ "$newdate" == "-" ] && newdate=
[ -n "$newversion" -o -n "$newdate" ] || {
eerror "Il faut spécifier le numéro de version et/ou la date de release"
return 1
}
eecho "$bundlename: Version${newversion:+ "$newversion"}${newdate:+ du "$newdate"}${newdesc:+
("$newdesc")}"
if [ "$newversion" != "$version" -o "$newdate" != "$date" -o "$newdesc" != "$desc" ]; then
[ "$jawotoolsfile" == "$jawotoolsfile2" ] || rm -f "$jawotoolsfile"
save_jawotoolsfile "$jawotoolsfile2" "$newversion" "$newdate" "$newdesc"
write_infofile "$infofile" "$newversion" "$(date2version "$newdate")"
else
einfo "Aucune modification effectuée"
fi
fi
}
WOINST_TMPDIR_SET=
function __woinst_set_tmpdir_maybe() {
if [ -z "$WOINST_TMPDIR_SET" ]; then
ac_set_tmpdir tmpdir
WOINST_TMPDIR_SET=1
fi
}
function __woinst_expand_archive() {
local archdir contents
__woinst_set_tmpdir_maybe
estep "Décompactage de $(ppath "$src") dans $tmpdir..."
archdir="$tmpdir/$(get_archive_appname "$src")"
mkdir -p "$archdir"
extract_archive "$src" "$archdir" || return 1
# s'il n'y a qu'un répertoire dans l'archive, le considérer comme le
# répertoire à déployer.
array_from_lines contents "$(list_all "$archdir")"
if [ "${#contents[*]}" -eq 1 -a -d "$archdir/$contents" ]; then
archdir="$archdir/$contents"
fi
src="$archdir"
}
function woinst() {
function __woinst_display_help() {
uecho "$scriptname: Déployer un bundle (application ou framework) de WebObjects
USAGE
$scriptname [options] <file|archive|dir>...
OPTIONS
PREFIX=value
Spécifier une valeur pour un préfixe, plutôt que de laisser uprefix
l'autodétecter. Utiliser uprefix -l pour une liste de préfixes valides.
-b Redémarrer les instances en mode bounce.
Par défaut, les instances sont arrêtées avant le déploiement, et
redémarrées après
-W Ne déployer que les resources web. Implique -n
-n Ne pas tagger les bundles déployés avec un numéro de version. Par
défaut, l'utilisateur est invité à compléter des informations telles
que n° de version et date de release si ces informations ne sont pas
disponible.
-x CMD
Exécuter la commande CMD après avoir effectué le déploiement"
}
local bounce webinst notag scripts istmpdir tmpdir
scripts=()
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with __woinst_display_help' \
-b,--bounce bounce=1 \
-W,--webres webinst=1 \
-n,--notag notag=1 \
-x:,--exec: scripts \
--is-tmpdir '$istmpdir=1; tmpdir=.' \
@ args -- "$@" &&
set -- "${args[@]}" || {
eerror "$args"
return 1
}
# Tout d'abord énumérer les frameworks et applications à installer
# Lire aussi les définitions de variables
compute_apache_prefixes
compute_webobjects_prefixes
etitle "Calcul de la liste des bundles à déployer"
if [ -z "$istmpdir" ]; then
__woinst_set_tmpdir_maybe
estep "La copie de travail sera faite dans $(ppath "$tmpdir")..."
fi
local -a variables frameworks applications
local src name value valid copied
variables=()
frameworks=()
applications=()
for src in "${@:-.}"; do
if [[ "$src" == *=* ]]; then
splitvar "$src" name value
array_add variables "$name"
set_var "$name" "$value"
else
src="$(abspath "$src")"
valid=
copied=
if [ -f "$src" ] && is_archive "$src"; then
__woinst_expand_archive || return 1
copied=1
fi
if [ -d "$src" ]; then
if endswith "$src" .framework; then
is_wofwkdir "$src" || {
eerror "Framework invalide: $(ppath "$src")"
return 1
}
valid=1
elif endswith "$src" .woa; then
is_woappdir "$src" || {
eerror "Application invalide: $(ppath "$src")"
return 1
}
valid=1
fi
fi
[ -n "$valid" ] || {
eerror "N'est pas un bundle valide: $(ppath "$src")"
return 1
}
srcname="$(basename "$src")"
if [ -z "$copied" -a -z "$istmpdir" ]; then
estep "$(ppath "$src")"
cpnovcs "$src" "$tmpdir"
src="$tmpdir/$srcname"
fi
if endswith "$src" .framework; then
array_add frameworks "$src"
elif endswith "$src" .woa; then
array_add applications "$src"
fi
fi
done
eend
# Tagger les bundles
if [ -z "$webinst" -a -z "$notag" ]; then
etitle "Tagger les bundles"
for src in "${frameworks[@]}"; do
srcname="$(basename "$src")"
etitle "$srcname"
wotag --message "Version installée" -s "$WOFRAMEWORKS/$srcname"
wotag --message "Version à installer" "$src"
eend
done
for src in "${applications[@]}"; do
srcname="$(basename "$src")"
etitle "$srcname"
wotag --message "Version installée" -s "$WOAPPLICATIONS/$srcname"
wotag --message "Version à installer" "$src"
eend
done
eend
fi
# Confirmer le déploiement
etitle "Résumé"
function __woinst_strip_woa() { basename "$1" .woa; }
function __woinst_strip_fwk() { basename "$1" .framework; }
estepn "Déploiement ${applications:+des applications: $(array_mapjoin applications __woinst_strip_woa " ")${frameworks:+
et }}${frameworks:+des frameworks: $(array_mapjoin frameworks __woinst_strip_fwk " ")}
dans NEXT_ROOT = ${NEXT_ROOT:-/}
HTDOCS_DIR = ${HTDOCSDIR}"
if ! ask_yesno -c "Voulez-vous lancer le déploiement?" O; then
eend
return 1
fi
eend
# Faire le déploiement
local configfile variable
ac_set_tmpfile configfile
for variable in "${variables[@]}" bounce webinst ULIBDIR __estack __tlevel; do
set_var_cmd "$variable" "${!variable}" >>"$configfile"
done
for array in variables scripts applications frameworks; do
set_array_cmd "$array" >>"$configfile"
done
# pour les serveurs qui ont une vieille version de bash, forcer la valeur de
# ULIBDIR
set_var_cmd "FORCED_ULIBDIR" "$ULIBDIR" >>"$configfile"
runscript_as_root "$ULIBDIR/support/woinst2s" "$configfile"
ac_clean "$tmpdir" "$configfile"
}

View File

@@ -1,734 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Pilotage du moniteur de ProjectWonder
##@cooked nocomments
##@require base
##@require sysinfos
##@require webobjects
uprovide wondermonitor
urequire base sysinfos webobjects
WOM_DEFAULT_HOST=localhost
WOM_DEFAULT_PORT="${JAVAMONITOR_PORT:-56789}"
WOM_DEFAULT_PASSWORD="$JAVAMONITOR_PASSWORD"
function __get_womurl() {
# $1 est un nom d'hôte de la forme host[:port]
# Le transfomer en url pour attaquer le moniteur:
# http://host:port/cgi-bin/WebObjects/JavaMonitor.woa/$2[?pw=$3[&$4...]]
# $2 est l'url relative à attaquer. Si $3 est spécifié, c'est le mot de
# passe pour l'accès au moniteur. Si $4...* sont spécifiés, ce sont d'autres
# paramètres.
local host port password paramsep="?"
if [ -n "$1" ]; then
splitpair "$1" host port
[ -n "$host" ] || host="$WOM_DEFAULT_HOST"
[ -n "$port" ] || port="$WOM_DEFAULT_PORT"
shift
# si on spécifie explicitement l'hôte, considérer que le mot de passe
# est explicitement spécifié aussi, et ne pas prendre la valeur par
# défaut.
password="$2"
else
host="$WOM_DEFAULT_HOST"
port="$WOM_DEFAULT_PORT"
shift
password="${2:-$WOM_DEFAULT_PASSWORD}"
fi
local womurl="http://$host:$port/cgi-bin/WebObjects/JavaMonitor.woa"
if [ -n "$1" ]; then
[ "${1#/}" == "$1" ] && womurl="$womurl/"
womurl="$womurl$1"
fi; shift
if [ -n "$password" ]; then
womurl="$womurl${paramsep}pw=$password"
paramsep="&"
fi; shift
while [ -n "$1" ]; do
womurl="$womurl${paramsep}$1"; shift
paramsep="&"
done
echo "$womurl"
}
function __check_type() {
# vérifier que le type $1 (calculé par splitins()) est l'une des valeurs
# $2..*
local actual="$1" expected; shift
for expected in "$@"; do
[ "$actual" == "$expected" ] && return 0
done
return 1
}
function __json_filter() {
# traiter un flux json pour que chaque valeur soit sur une ligne séparée,
# facilitant le traitement par un script bash
awk '{
gsub(/}\][ ]*$/, "\n&")
gsub(/},[ ]*$/, "\n&")
gsub(/[][{]/, "&\n")
gsub(/,[ ]*"/, ",\n\"")
#gsub(/"}/, "\",\n}")
print
}'
}
function wom__statistics() {
# Afficher les statistiques pour le serveur $1, avec éventuellement le mot
# de passe $2
wogeturl "$(__get_womurl "$1" wa/statistics "$2")" || return
}
function wom__info() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et afficher des informations sur l'application $1 (par défaut, all)
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/info "$3" type="$type" ${name:+name=$name})" || return
}
function wom__info_filter() {
# filtrer le résultat de wom__info en ne gardant que les tags
# name, state, activeSessions, autoRecover, deaths, host, port
awkrun -f '
function get_value(line) {
match(line, /^[^"]*"[^"]*":[ ]*"?/); line = substr(line, RSTART + RLENGTH)
match(line, /"?[ ]*,?[ ]*$/); line = substr(line, 1, RSTART - 1)
return line
}
function reset_values() {
name = ""; state = "";
activeSessions = ""; autoRecover = ""; deaths = ""
host = ""; port = ""
}
function dump_values() {
if (name != "") {
print quote_value(name) " " quote_value(state) " " quote_value(activeSessions) " " quote_value(autoRecover) " " quote_value(deaths) " " quote_value(host) " " quote_value(port)
}
reset_values()
}
BEGIN {
inapp = 0
reset_values()
}
/{/ { inapp = 1 }
/}/ { dump_values(); inapp = 0 }
inapp && $0 ~ /"name"/ { name = get_value($0) }
inapp && $0 ~ /"state"/ { state = get_value($0) }
inapp && $0 ~ /"activeSessions"/ { activeSessions = get_value($0) }
inapp && $0 ~ /"autoRecover"/ { autoRecover = get_value($0) }
inapp && $0 ~ /"deaths"/ { deaths = get_value($0) }
inapp && $0 ~ /"host"/ { host = get_value($0) }
inapp && $0 ~ /"port"/ { port = get_value($0) }
'
}
function wom_info() {
# Contacter le moniteur sur l'hôte $3, avec éventuellement le mot de passe
# $4, et initialiser le tableau $1 avec une liste de valeurs quotés de la
# forme:
# "'name' 'state' 'activeSessions' 'autoRecover' 'deaths' 'host' 'port'"
# concernant l'application $2 (par défaut, toutes les applications). Notez
# qu'il y a une ligne par instance d'application
# Ces valeurs peuvent être utilisées comme arguments d'une fonction. par
# exemple:
# wom_info appinfos "" host pw
# for args in "${appinfos[@]}"; do
# eval "userfunc $args"
# done
wom__info "$2" "$3" "$4" || return
array_from_lines "$1" "$(<"$WORAURL_DATA" __json_filter | wom__info_filter)"
}
function wom_getValidAndRunning() {
# Placer la liste des applications valides dans le tableau $1(=valid_apps)
# et la liste des applications qui tournent dans le tableau
# $2=(running_apps), en contactant le moniteur sur l'hôte $3, avec
# éventuellement le mot de passe $4.
local -a __vr_appinfos __vr_valids="${1:-valid_apps}" __vr_runnings="${2:-running_apps}"
local __vr_appinfo
wom_info __vr_appinfos "$3" "$4" || return
array_new "$__vr_valids"
array_new "$__vr_runnings"
for __vr_appinfo in "${__vr_appinfos[@]}"; do
eval "__vr_appinfo=($__vr_appinfo)"
array_addu "$__vr_valids" "${__vr_appinfo[0]}"
if [ "${__vr_appinfo[1]}" == "ALIVE" ]; then
array_addu "$__vr_runnings" "${__vr_appinfo[0]}"
fi
done
}
function show_appinfo() {
# Afficher des informations sur une application. Les arguments doivent être
# le résultat de la fonction wom_info()
local name="$1" state="$2"
local activeSessions="$3" autoRecover="$4" deaths="$5"
local host="$6" port="$7"
local color suffix
case "$state" in
ALIVE)
color="$COULEUR_VERTE"
suffix="NbSessions: "
[ "${activeSessions:-0}" -gt 0 ] && suffix="$suffix$COULEUR_BLEUE"
suffix="$suffix$activeSessions$COULEUR_NORMALE, deaths="
[ "${deaths:-0}" -gt 0 ] && suffix="$suffix$COULEUR_ROUGE"
suffix="$suffix$deaths$COULEUR_NORMALE"
;;
DEAD) color="";;
STARTING|STOPPING) color="$COULEUR_BLEUE";;
*) color="$COULEUR_JAUNE";;
esac
eecho "$color$name$COULEUR_NORMALE ($state)${suffix:+: $suffix}"
}
function wom_running() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et tester si l'application $1 (par défaut, all) tourne actuellement
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/running "$3" type="$type" ${name:+name=$name})" || return
is_yes "$(<"$WORAURL_DATA")"
}
function wom_start() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et démarrer l'application $1 (par défaut, all)
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/start "$3" type="$type" ${name:+name=$name})" || return
[ "$(<"$WORAURL_DATA")" == "OK" ]
}
function wom_stopped() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et tester si l'application $1 (par défaut, all) est actuellement arrêtée
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/stopped "$3" type="$type" ${name:+name=$name})" || return
is_yes "$(<"$WORAURL_DATA")"
}
function wom_stop() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et arrêter l'application $1 (par défaut, all)
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/stop "$3" type="$type" ${name:+name=$name})" || return
[ "$(<"$WORAURL_DATA")" == "OK" ]
}
function wom_forceQuit() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et forcer l'arrêt de l'application $1 (par défaut, all)
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/forceQuit "$3" type="$type" ${name:+name=$name})" || return
[ "$(<"$WORAURL_DATA")" == "OK" ]
}
function wom_turnScheduledOn() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et activer le flag scheduled sur l'application $1 (par défaut, all)
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/turnScheduledOn "$3" type="$type" ${name:+name=$name})" || return
[ "$(<"$WORAURL_DATA")" == "OK" ]
}
function wom_turnScheduledOff() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et désactiver le flag scheduled sur l'application $1 (par défaut, all)
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/turnScheduledOff "$3" type="$type" ${name:+name=$name})" || return
[ "$(<"$WORAURL_DATA")" == "OK" ]
}
function wom_turnRefuseNewSessionOn() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et activer le flag refuseNewSession sur l'application $1 (par défaut,
# all)
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/turnRefuseNewSessionOn "$3" type="$type" ${name:+name=$name})" || return
[ "$(<"$WORAURL_DATA")" == "OK" ]
}
function wom_turnRefuseNewSessionOff() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et désactiver le flag refuseNewSession sur l'application $1 (par
# défaut, all)
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/turnRefuseNewSessionOff "$3" type="$type" ${name:+name=$name})" || return
[ "$(<"$WORAURL_DATA")" == "OK" ]
}
function wom_turnAutoRecoverOn() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et activer le flag autoRecover sur l'application $1 (par défaut, all)
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/turnAutoRecoverOn "$3" type="$type" ${name:+name=$name})" || return
[ "$(<"$WORAURL_DATA")" == "OK" ]
}
function wom_turnAutoRecoverOff() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et désactiver le flag autoRecover sur l'application $1 (par défaut,
# all)
local type name
splitins "$1" type name
__check_type "$type" all app ins || return 2
wogeturl "$(__get_womurl "$2" admin/turnAutoRecoverOff "$3" type="$type" ${name:+name=$name})" || return
[ "$(<"$WORAURL_DATA")" == "OK" ]
}
function wom_bounce() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et redémarrer l'application $1 (par défaut, all) en mode bounce
local type name
splitins "$1" type name
__check_type "$type" app all || return 2
wogeturl "$(__get_womurl "$2" admin/bounce "$3" type="$type" ${name:+name=$name})" || return
[ "$(<"$WORAURL_DATA")" == "OK" ]
}
function wom_clearDeaths() {
# Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3, et effacer le compte des morts suspectes pour l'application $1 (par
# défaut, all)
local type name
splitins "$1" type name
__check_type "$type" app all || return 2
wogeturl "$(__get_womurl "$2" admin/clearDeaths "$3" type="$type" ${name:+name=$name})" || return
[ "$(<"$WORAURL_DATA")" == "OK" ]
}
function wom__getApplications() {
# Obtenir des information sur la définition de l'application $1 (ou de
# toutes les applications si $1=="") en contactant le moniteur sur l'hôte $2
# avec éventuellement le mot de passe $3. Le résultat est un flux xml,
# chaque application étant défini dans un tag <MApplications>. Si un erreur
# se produit, l'erreur est dans un tag <Strings>
woraurl GET "$(__get_womurl "$2" "ra/mApplications${1:+/$1}" "$3")" || return
}
function wom__getApplications_filter() {
# filtrer le résultat de wom__getApplications en ne gardant que les tags
# name, unixPath, macPath, winPath
awkrun -f '
function get_value(line) {
if (line ~ / nil="true"/) return ""
match(line, /^[^<]*<[^<>]*>/); line = substr(line, RSTART + RLENGTH)
match(line, /<.*$/); line = substr(line, 1, RSTART - 1)
return line
}
function get_attr_value(attr, line) {
match(line, attr "=\""); line = substr(line, RSTART + RLENGTH)
match(line, /".*$/); line = substr(line, 1, RSTART - 1)
return line
}
function reset_values() {
name = ""
unixPath = ""
macPath = ""
winPath = ""
}
function dump_values() {
if (name != "") {
print quote_value(name) " " quote_value(unixPath) " " quote_value(macPath) " " quote_value(winPath)
}
reset_values()
}
BEGIN {
inapp = 0
reset_values()
}
/<MApplications/ { inapp = 1 }
/<\/MApplications/ { dump_values(); inapp = 0 }
inapp && $0 ~ /<name[> ]/ { name = get_value($0) }
inapp && $0 ~ /<unixPath[> ]/ { unixPath = get_value($0) }
inapp && $0 ~ /<macPath[> ]/ { macPath = get_value($0) }
inapp && $0 ~ /<winPath[> ]/ { winPath = get_value($0) }
'
}
function wom_getApplications() {
# Obtenir la liste des applications définies en contactant le moniteur sur
# l'hôte $3 avec éventuellement le mot de passe $4, et initialiser le
# tableau $1 avec une liste de valeurs quotées de la forme:
# "'name' 'unixPath' 'macPath' 'winPath'"
# concernant l'application $2 (par défaut, toutes les applications)
# Ces valeurs peuvent être utilisées comme arguments d'une fonction. par
# exemple:
# wom_getApplications appinfos "" host pw
# for args in "${appinfos[@]}"; do
# eval "userfunc $args"
# done
array_new "$1"
wom__getApplications "$2" "$3" "$4" || return
array_from_lines "$1" "$(<"$WORAURL_DATA" wom__getApplications_filter)"
}
function wom_addApplication() {
# Ajouter une application nommée $1 en contactant le moniteur sur l'hôte $2,
# avec éventuellement le mot de passe $3.
# Soit le nom Name, par défaut l'exécutable se trouve dans
# WOAPPLICATIONS/Name.woa/Name et les logs dans /var/log/WebObjects, et le
# flag autoRecover est activé
# XXX supporter la possibilité de modifier les valeurs par défaut
local name="$1" unixPath macPath unixOutputPath macOutputPath
if [ "$UNAME_SYSTEM" == "Darwin" ]; then
unixPath=
unixOutputPath=
macPath="$WOAPPLICATIONS/$name.woa/$name"
macOutputPath="$WOLOGS"
else
macPath=
macOutputPath=
unixPath="$WOAPPLICATIONS/$name.woa/$name"
unixOutputPath="$WOLOGS"
fi
local data="{id: '$name', type: 'MApplication', name: '$name', unixOutputPath: '$unixOutputPath', unixPath: '$unixPath', macOutputPath: '$macOutputPath', macPath: '$macPath', autoRecover: false}"
woraurl POST "$(__get_womurl "$2" ra/mApplications.json "$3")" "$data"
}
function wom_addInstance() {
# Ajouter une instance sur localhost pour l'application nommée $1 en
# contactant le moniteur sur l'hôte $2, avec éventuellement le mot de passe
# $3.
# XXX supporter la possibilité de modifier les valeurs par défaut
woraurl GET "$(__get_womurl "$2" "ra/mApplications/$1/addInstance" "$3" host=localhost)"
# cette requête plante pour je ne sais quelle raison: (faire des investigations!)
#woraurl GET "$(__get_womurl "$2" "ra/mApplications/$1/addInstanceOnAllHosts" "$3")"
}
function check_compute_apps_localhost() {
# si les arguments de compute_apps contiennent des bundles de framework, il
# faut avoir accès au système de fichier local. vérifier si l'un des
# arguments $2..* est un framework. si c'est le cas, vérifier que l'hôte $1
# est localhost.
# retourner 0 si c'est ok, 1 s'il y a des frameworks et que host n'est pas
# localhost
local host="$1"; shift
local spec type name
for spec in "$@"; do
splitins "$spec" type name
if [ "$type" == "fwk" ]; then
if [ -z "$host" -o "$host" == "localhost" -o "$host" == "127.0.0.1" ]; then
return 0
else
eerror "Spécifier des bundles de framework n'est supporté que sur l'hôte local"
return 1
fi
fi
done
return 0
}
function compute_apps() {
# Remplir le tableau $1(=apps) avec la liste des applications correspondant
# aux arguments $3...*
# Un bundle de framework (Name.framework) est remplacé par la liste des
# bundles d'applications qui dépendent de ce framework. Cette information
# est obtenue en consultant le système de fichier local.
# Un bundle d'application est remplacé par la liste des applications qui
# sont définies pour ce bundle. Cette information est obtenue en consultant
# le tableau généré par wom_getApplications(), dont le nom est $2
# Les arguments de la forme @N sont ignorés, ils correspondent à des délais
# à respecter lors du démarrage de l'application
local -a __ca_specs
local __ca_notempty
local __ca_spec __ca_type __ca_name __ca_fapps __ca_appinfo __ca_path __ca_found
__ca_fapps=()
local __ca_apps="${1:-apps}"; shift
local __ca_appinfos="$1"; shift
if [ -z "$__ca_appinfos" ]; then
# si on ne donne pas le tableau de wom_getApplications, le calculer nous
# même
wom_getApplications __ca_appinfos
else
array_copy __ca_appinfos "$__ca_appinfos"
fi
array_new "$__ca_apps"
[ -n "$*" ] && __ca_notempty=1
__ca_specs=("$@")
while [ -n "${__ca_specs[*]}" ]; do
set -- "${__ca_specs[@]}"
# si un framework est spécifié, il faut rajouter d'autres bundles
# d'applications. il sont insérés dans __ca_specs
__ca_specs=()
for __ca_spec in "$@"; do
if [[ "$__ca_spec" == @* ]]; then
array_add "$__ca_apps" "$__ca_spec"
continue
fi
splitins "$__ca_spec" __ca_type __ca_name
if [ "$__ca_type" == "fwk" ]; then
compute_fapps __ca_fapps "$__ca_name"
if [ -n "${__ca_fapps[*]}" ]; then
estep "$__ca_name --> ${__ca_fapps[*]}"
for __ca_spec in "${__ca_fapps[@]}"; do
# rajouter l'application dans __ca_specs, pour traitement
array_addu __ca_specs "$__ca_spec"
done
else
ewarn "$__ca_name: Aucune correspondance n'a été trouvée"
fi
elif [ "$__ca_type" == "woa" ]; then
__ca_found=
for __ca_appinfo in "${__ca_appinfos[@]}"; do
eval "__ca_appinfo=($__ca_appinfo)"
if [ "$UNAME_SYSTEM" == "Darwin" ]; then
__ca_path="${__ca_appinfo[2]}"
else
__ca_path="${__ca_appinfo[1]}"
fi
if [[ "$__ca_path" == */"$__ca_name/${__ca_name%.woa}" ]]; then
# trouvé
estep "$__ca_name --> ${__ca_appinfo[0]}"
array_addu "$__ca_apps" "${__ca_appinfo[0]}"
__ca_found=1
# note: ne pas s'arrêter ici. il peut y avoir d'autres
# instances pour cette application
fi
done
[ -n "$__ca_found" ] || ewarn "$__ca_name: Aucune correspondance n'a été trouvée"
else
array_addu "$__ca_apps" "$__ca_name"
fi
done
done
if array_isempty "$__ca_apps" && [ -n "$__ca_notempty" ]; then
# on a donné une liste non vide, mais on se retrouve avec une liste vide
return 1
fi
return 0
}
function get_error_msg() {
local status="$1"; shift
local reason
[ -f "$WORAURL_DATA" ] && reason=". Le message d'erreur est:
$(<"$WORAURL_DATA")"
case "$status" in
0) :;;
1) echo "Une erreur s'est produite$reason";;
2) echo "Erreur de syntaxe$reason";;
3) echo "Impossible de contacter le serveur$reason";;
*) echo "Impossible ${reason:-"de faire l'opération"}";; #' bug colorisation
esac
}
function __do_wait() {
if [[ "$1" == @* ]]; then
local n="${1#@}"
estepn "Attente de $n secondes..."
sleep "$n"
return 0
fi
return 1
}
function __ignore_wait() {
if [[ "$1" == @* ]]; then
estepw "$1: temps d'attente ignoré"
return 0
fi
return 1
}
function start_apps() {
# Démarrer les applications $3..$* en contactant le moniteur sur l'hôte $1
# avec le mot de passe éventuel $2
# Les variables globales enable_autorecover et force_enable_autorecover
# permettent respectivement d'activer l'autoRecover après le démarrage de
# l'application et de forcer l'activation de l'autoRecover même si
# l'instance tournait déjà.
# Un argument de la forme @N provoque une attente de N secondes. Ceci permet
# de placer un temps d'attente entre le démarrage de certaines applications.
[ -n "$*" ] || return 0
local app error turnArOn
local host="$1" password="$2"; shift; shift
etitle "Démarrage des applications"
for app in "$@"; do
__do_wait "$app" && continue
ebegin "$app"
error=
turnArOn=
if wom_running "$app" "$host" "$password"; then
edotw 0 "Application déjà démarrée"
elif wom_start "$app" "$host" "$password"; then
turnArOn=1
edot 0 "Démarrage"
else
error=$?
edot 1 "$(get_error_msg "$error" "de démarrer l'application")"
fi
[ -z "$error" -a -n "$force_enable_autorecover" ] && turnArOn=1
if [ -n "$turnArOn" -a -n "$enable_autorecover" ]; then
if wom_turnAutoRecoverOn "$app" "$host" "$password"; then
edot 0 "Activer autoRecover"
else
error=$?
edot 1 "$(get_error_msg "$error" "d'activer autoRecover")"
fi
fi
eend $error
done
eend
return "${error:-0}"
}
function stop_apps() {
# Arrêter les applications $3..$* en contactant le moniteur sur l'hôte $1
# avec le mot de passe éventuel $2
# Les variables globales disable_autorecover et force_disable_autorecover
# permettent respectivement de désactiver l'autoRecover après l'arrêt de
# l'application et de forcer la désactivation de l'autoRecover même si
# l'instance ne tournait pas.
# L'option {-a ARRAY} permet de remplir ARRAY avec la liste des applications
# qui ont été effectivement arrêtées. Cette option si elle est spécifiée
# doit être en premier
# Pour compatibilité avec start_apps, les arguments de la forme @N sont
# ignorés. Il n'y a pas de temps d'attente entre les applications lors de
# l'arrêt.
local -a __sa_stopped
if [ "$1" == "-a" ]; then
__sa_stopped="$2"
shift; shift
fi
[ -n "$*" ] || return 0
local __sa_app __sa_error __sa_turnArOff
local __sa_tried_stop_once __sa_could_not_stop
local __sa_host="$1" __sa_password="$2"; shift; shift
etitle "Arrêt des applications"
for __sa_app in "$@"; do
__ignore_wait "$__sa_app" && continue
ebegin "$__sa_app"
__sa_error=
__sa_should_stop=1
__sa_turnArOff=
if wom_stopped "$__sa_app" "$__sa_host" "$__sa_password"; then
edotw 0 "Application déjà arrêtée"
[ -n "$force_disable_autorecover" ] && __sa_turnArOff=1
__sa_should_stop=
else
__sa_turnArOff=1
fi
if [ -n "$__sa_turnArOff" -a -n "$disable_autorecover" ]; then
if wom_turnAutoRecoverOff "$__sa_app" "$__sa_host" "$__sa_password"; then
edot 0 "Désactiver autoRecover"
else
__sa_error=$?
edot 1 "$(get_error_msg "$__sa_error" "de désactiver autoRecover")"
fi
fi
if [ -n "$__sa_should_stop" ]; then
if wom_stop "$__sa_app" "$__sa_host" "$__sa_password"; then
edot 0 "Arrêt"
[ -n "$__sa_stopped" ] && array_addu "$__sa_stopped" "$__sa_app"
else
__sa_error=$?
__sa_could_not_stop=1
edot 1 "$(get_error_msg "$__sa_error" "d'arrêter l'application")"
fi
__sa_tried_stop_once=1
fi
eend $__sa_error
done
# ne faire d'attente que s'il y a eu au moins une tentative d'arrêt d'une
# application
[ -n "$__sa_tried_stop_once" ] || {
eend
return 0
}
# Attendre un certain temps avant de continuer... On accord 500 ms par
# instance, avec un minumum de 10 secondes
local delay=$(($# / 2))
[ "$delay" -lt 10 ] && delay=10
ebegin "Attente de l'arrêt des instances"
sleep $delay &
ewait $!
eend
if [ -n "$__sa_could_not_stop" ]; then
# Nous n'avons pas réussi à arrêter l'une des applications. Il faut
# l'arrêter sauvagement
__sa_could_not_stop=
for __sa_app in "$@"; do
if ! wom_stopped "$__sa_app" "$__sa_host" "$__sa_password"; then
ebegin "Arrêt forcé de $__sa_app"
if wom_stop "$__sa_app" "$__sa_host" "$__sa_password"; then
edot 0 "Arrêt forcé"
[ -n "$__sa_stopped" ] && array_addu "$__sa_stopped" "$__sa_app"
else
__sa_error=$?
__sa_could_not_stop=1
edot 1 "$(get_error_msg "$__sa_error" "de forcer l'arrêt de l'application")"
fi
eend
fi
done
# il faut attendre au plus 30 secondes pour l'arrêt forcé
ebegin "Attente de l'arrêt forcé des instances"
sleep 30 &
ewait $!
eend
[ -n "$__sa_could_not_stop" ] && ewarn "Certaines instances n'ont pas pu être arrêtées"
fi
eend
return "${__sa_error:-0}"
}
function bounce_apps() {
# Redémarrer les applications $3..$* en mode bounce en contactant le
# moniteur sur l'hôte $1 avec le mot de passe éventuel $2
# Pour compatibilité avec start_apps, les arguments de la forme @N sont
# ignorés. Il n'y a pas de temps d'attente entre les applications lors du
# redémarrage.
[ -n "$*" ] || return 0
local app error
local host="$1" password="$2"; shift; shift
etitle "Redémarrage des applications en mode bounce"
for app in "$@"; do
__ignore_wait "$app" && continue
ebegin "$app"
error=
if wom_bounce "$app" "$host" "$password"; then
edot 0 "Redémarrage"
else
error=$?
edot 1 "$(get_error_msg "$error" "de redémarrer l'application")"
fi
done
eend
return "${error:-0}"
}

View File

@@ -1,195 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Support de la signature des jars pour WebObjects
##@cooked nocomments
##@require webobjects
uprovide wosign
urequire webobjects
WOSIGN_KEYSTORE=
WOSIGN_STOREPASS=
WOSIGN_KEYALIAS=
function wosign_setup_maybe() {
WOSIGN_CONFDIR="$WOCONFIGURATION/Signatures"
WOSIGN_CONF="$WOSIGN_CONFDIR/signature.conf"
if [ -f "$WOSIGN_CONF" ]; then
eval "$(
keystore=
storepass=
keyalias=
source "$WOSIGN_CONF"
set_var_cmd WOSIGN_KEYSTORE "$keystore"
set_var_cmd WOSIGN_STOREPASS "$storepass"
set_var_cmd WOSIGN_KEYALIAS "$keyalias"
)"
[ -n "$WOSIGN_XTMPDIR" ] || ac_set_tmpdir WOSIGN_XTMPDIR
[ -n "$WOSIGN_JTMPDIR" ] || ac_set_tmpdir WOSIGN_JTMPDIR
return 0
else
return 1
fi
}
function __issjar() {
[ "${1%.sjar}" != "$1" ]
}
function __tosjar() {
local jarname="$(basename "$1")"
local jardir="${1%$jarname}"
local sjarname= jarbn="$(basename "$jarname" .jar)"
if [ "$jarbn" != "$jarname" ]; then
sjarname="$jarbn.sjar"
else
sjarname="$jarname.sjar"
fi
echo "$jardir$sjarname"
}
function __tojar() {
local jarname="$(basename "$1")"
local jardir="${1%$jarname}"
local jarbn="$(basename "$jarname" .sjar)"
[ "$jarbn" != "$jarname" ] && jarname="$jarbn.jar"
echo "$jardir$jarname"
}
function wosign_jar() {
local default=1 sign= unsign=
while [ -n "$1" ]; do
case "$1" in
-s) default=; sign=1;;
-d) default=; unsign=1;;
*) break;;
esac
shift
done
[ -n "$default" ] && sign=1
local curdir="$(pwd)"
local jar="$(abspath "$1")"
local cjar="$WOSIGN_JTMPDIR/$(basename "$jar")"
local sjar="$(__tosjar "$jar")"
cd "$WOSIGN_XTMPDIR"
rm -rf *
jar xf "$jar"
rm -f META-INF/*.{SF,RSA,DSA}
jar cf "$cjar" *
if [ -n "$unsign" ]; then
cp "$cjar" "$jar"
fi
if [ -n "$sign" ]; then
rm -f "$sjar"
jarsigner -keystore "$WOSIGN_KEYSTORE" ${WOSIGN_STOREPASS:+-storepass "$WOSIGN_STOREPASS" }-signedjar "$sjar" "$cjar" $WOSIGN_KEYALIAS
fi
cd "$curdir"
}
function wosignable() {
if [ -z "$WOSIGN_KEYSTORE" ]; then
echo "Il faut spécifier le paramètre keystore"
return 1
elif [ -z "$WOSIGN_KEYALIAS" ]; then
echo "Il faut spécifier le parammètre keyalias"
return 1
fi
local srcdir="$1"
if endswith "$srcdir" .woa; then
srcdir="$srcdir/Contents/WebServerResources/Java"
elif endswith "$1" .framework; then
srcdir="$srcdir/WebServerResources/Java"
fi
if [ -d "$srcdir" ]; then
if [ -z "$(list_files "$srcdir" "*.jar")" ]; then
echo "Il n'y a pas de jars à signer"
return 1
fi
elif [ -f "$srcdir" ]; then
if ! endswith "$srcdir" .jar; then
echo "Le fichier spécifié n'est pas un jar"
return 1
fi
else
echo "Il faut spécifier un répertoire ou un jar individuel"
return 1
fi
}
function __may_sign() {
# Si l'option -f est spécifiée, retourner true
# Si ce jar a une version signée associée, retourner true
# Si ce jar n'a pas de version signée associée, retourner true
# Si ce jar est la version signée d'un autre jar, retourner false
[ "$1" != "-f" ] && __issjar "$1" && [ -f "$(__tojar "$1")" ] && return 1
return 0
}
function __should_sign() {
# Si l'option -f est spécifiée, retourner true
# Sinon retourner true si la version signée n'existe pas
# On assume que __may_sign est vrai.
[ "$1" != "-f" ] && [ -f "$(__tosjar "$1")" ] && return 1
return 0
}
function wosign() {
# Signer un bundle, les jars d'un répertoire, ou un jar
# L'option -f force la resignature des jars d'un répertoire ou d'un
# bundle. Elle force aussi la signature d'un jar, même s'il semble qu'il
# soit la version signée d'un autre jar
# on présuppose que wosignable a retourné true
local default=1 sign= unsign= resign=
while [ -n "$1" ]; do
case "$1" in
-s) default=; sign=1;;
-d) default=; unsign=1;;
-f) resign=1;;
*) break;;
esac
shift
done
[ -n "$default" ] && sign=1
local srcdir="$1"
local candidates jars jar jarname jardir
if endswith "$srcdir" .woa; then
srcdir="$srcdir/Contents/WebServerResources/Java"
elif endswith "$1" .framework; then
srcdir="$srcdir/WebServerResources/Java"
fi
if [ -d "$srcdir" ]; then
array_from_lines candidates "$(list_files "$srcdir" "*.jar")"
jars=()
for jar in "${candidates[@]}"; do
__may_sign "$srcdir/$jar" && jars=("${jars[@]}" "$srcdir/$jar")
done
for jar in "${jars[@]}"; do
if __should_sign ${resign:+-f }"$jar"; then
ebegin "$(ppath "$jar")"
wosign_jar ${sign:+-s }${unsign:+-d }"$jar" &
ewait $!
eend
fi
done
elif [ -f "$srcdir" ]; then
jar="$srcdir"
if ! __may_sign ${resign:+-f }"$jar"; then
jardir="$(dirname "$jar")"
jarname="$(basename "$jar")"
eerror "$(ppath "$jar"): Ce jar est la version signée de $(ppath "$jardir/${jarname#s}")"
elif __should_sign ${resign:+-f }"$jar"; then
ebegin "$(ppath "$jar")"
wosign_jar ${sign:+-s }${unsign:+-d }"$jar" &
ewait $!
eend
fi
fi
}

View File

@@ -1,57 +0,0 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Pilotage de wotaskd
##@cooked nocomments
##@require base
##@require sysinfos
##@require webobjects
uprovide wotaskd
urequire base sysinfos webobjects
WOT_DEFAULT_HOST=localhost
WOT_DEFAULT_PORT="${WOTASKD_PORT:-1085}"
function __get_woturl() {
# $1 est un nom d'hôte de la forme host[:port]
# Le transfomer en url pour attaquer le wotaskd:
# http://host:port/cgi-bin/WebObjects/wotaskd.woa/$2[&$3...]
# $2 est l'url relative à attaquer. Si $3 est spécifié, c'est le mot de
# passe pour l'accès au moniteur. Si $4...* sont spécifiés, ce sont d'autres
# paramètres.
local host port paramsep="?"
splitpair "$1" host port; shift
[ -n "$host" ] || host="$WOT_DEFAULT_HOST"
[ -n "$port" ] || port="$WOT_DEFAULT_PORT"
local woturl="http://$host:$port/cgi-bin/WebObjects/wotaskd.woa"
if [ -n "$1" ]; then
[ "${1#/}" == "$1" ] && woturl="$woturl/"
woturl="$woturl$1"
fi; shift
if [ -n "$1" ]; then
woturl="$woturl${paramsep}pw=$1"
paramsep="&"
fi; shift
while [ -n "$1" ]; do
woturl="$woturl${paramsep}$1"; shift
paramsep="&"
done
echo "$woturl"
}
function wot_config() {
# Afficher la configuration de wotaskd
local clean status=1
if [ -z "$WORAURL_DATA" ]; then
local WORAURL_DATA
ac_set_tmpfile WORAURL_DATA
clean=1
fi
if wogeturl "$(__get_woturl "$1" wa/woconfig)"; then
cat "$WORAURL_DATA"
status=0
else
status=1
fi
[ -n "$clean" ] && rm -f "$WORAURL_DATA"
return $status
}