importation initiale dans git

This commit is contained in:
Jephté Clain 2013-08-27 15:14:44 +04:00
commit 39f9ee159c
687 changed files with 125329 additions and 0 deletions

60
.dokuwikigen Normal file
View File

@ -0,0 +1,60 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
gendefault
etitle "Documentation de ulib"
array_from_lines ulibnames "$(list_files ulib)"
# faire les pages
for ulibname in "${ulibnames[@]}"; do
awkrun <"ulib/$ulibname" 'BEGIN {
in_func = 0
dump_doc = 0
dumped_doc = 0
print
}
!in_func && $0 ~ /^function / {
if (match($0, /function +([^ ]+)\(\)/, vs)) {
funcname = vs[1]
if (funcname !~ /^_/) {
in_func = 1
dump_doc = 1
dumped_doc = 0
print "==== " funcname " ===="
if ($0 ~ /}$/) {
in_func = 0
dump_doc = 0
dumped_doc = 0
}
next
}
}
}
in_func && dump_doc && $0 !~ /^ *#/ {
dump_doc = 0
}
in_func && dump_doc && $0 ~ /^ *#/ {
if (!dumped_doc) print "<code>"
gsub(/^ *#+/, "")
print
dumped_doc = 1
}
in_func && $0 ~ /}$/ {
if (dumped_doc) print "</code>"
in_func = 0
dump_doc = 0
dumped_doc = 0
}
END { if (in_func) print "</code>" }
' | setpage "$ulibname" ulib
done
eend
# faire l'entête
addpage start <<EOF
==== Librairies ulib ====
EOF
for ulibname in "${ulibnames[@]}"; do
addpage start <<EOF
* [[${ns}ulib:$ulibname]]
EOF
done

0
.nutools-bootstrap Normal file
View File

31
.udir Normal file
View File

@ -0,0 +1,31 @@
# -*- 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="Outils divers pour linux/macosx, et librairies pour bash"
udir_note=""
udir_types=("uinst")
uinc=true
uinc_options=()
uinc_args=(ucrontab reptyr.cgo ulib/ulibsh ulib/support/install-pubkeys.sh lib/uinst/system_caps.legacy)
# Faut-il désinstaller les fichiers de configuration de utools?
uninst_utools=
# Faut-il supprimer /usr/local/utools?
rm_utools=
# Faut-il installer le service kvm-stop-all?
kvm_service=
# Faut-il installer le service openvz-fix-etchosts?
openvz_service=
configure_variables=(dest uninst_utools rm_utools kvm_service openvz_service)
configure_dest_for=(bashrc profile lib/uinst/conf lib/uinst/rootconf lib/profile.d/nutools lib/init.d/kvm-stop-all legacy/sysinc/utools legacy/sysinc/system_caps legacy/sysinc/private/init)
config_scripts=(lib/uinst/conf lib/uinst/system_caps.legacy)
install_profiles=true
profiledir=lib/profile.d
bashrcdir=lib/bashrc.d
defaultdir=lib/default
copy_files=true
destdir=/usr/local
srcdir=.
files=()
owner=root:
modes=(u=rwX,g=rX,o=rX)
root_scripts=(lib/uinst/rootconf)

111
EnsureVM Executable file
View File

@ -0,0 +1,111 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: s'assurer que les services sont lancés pour un type de virtualisation
USAGE
$scriptname type
Les types supportés sont virtualbox et kvm (par défaut)"
}
source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS service ||
exit 1
function ensure_kvm() {
# S'assurer que les modules VirtualBox sont déchargés et que les modules kvm
# sont chargés, et que le service libvirt-bin est démarré
local module modified
# Vérifier que les modules vbox* sont déchargés
for module in vboxpci vboxnetadp vboxnetflt vboxdrv; do
if lsmod | quietgrep "$module"; then
eecho "-$module"
rmmod "$module" || return 1
modified=1
fi
done
# Vérifier que kvm{,_intel,_amd} sont chargés
if grep -q ^flags.*\\\<vmx\\\> /proc/cpuinfo; then
module=kvm_intel
elif grep -q ^flags.*\\\<svm\\\> /proc/cpuinfo; then
module=kvm_amd
else
module=
fi
if [ -n "$module" ]; then
for module in kvm $module; do
if ! lsmod | quietgrep "$module"; then
eecho "+$module"
modprobe "$module" || return 1
modified=1
fi
done
fi
[ -n "$modified" ] && sleep 1
service=
if check_sysinfos -d redhatlike; then
for i in libvirtd libvirtd-bin; do
[ -f "/etc/init.d/$i" ] && {
service="$i"
break
}
done
elif check_sysinfos -d debianlike; then
service=libvirt-bin
fi
if [ -n "$service" ]; then
# s'assurer que le service tourne
service libvirt-bin startm
else
return 0
fi
}
function ensure_virtualbox() {
# S'assurer que les modules kvm sont déchargés, que les modules VirtualBox
# sont chargés, et que le service vboxdrv est démarré
local module modified
# Vérifier que kvm{,_intel,_amd} ne sont pas chargés
for module in kvm_intel kvm_amd kvm; do
if lsmod | quietgrep "$module"; then
eecho "-$module"
rmmod "$module" || return 1
modified=1
fi
done
# Vérifier que les modules vbox* sont chargés
[ -f /lib/modules/`uname -r`/updates/dkms/vboxpci.ko ] &&
vboxmodules=(vboxnetflt vboxnetadp vboxpci vboxdrv) ||
vboxmodules=(vboxnetflt vboxnetadp vboxdrv)
for module in "${vboxmodules[@]}"; do
if ! lsmod | quietgrep "$module"; then
eecho "+$module"
modprobe "$module" || return 1
modified=1
fi
done
[ -n "$modified" ] && sleep 1
# s'assurer que le service tourne
service vboxdrv startm
}
parse_opts + "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
run_as_root "$@"
case "${1:-kvm}" in
k|kvm) ensure_kvm;;
v|vbox|virtualbox) ensure_virtualbox;;
esac

189
SKvm Executable file
View File

@ -0,0 +1,189 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: lancer une machine virtuelle kvm
USAGE
$scriptname [options] vmName
$scriptname {-l|-A|-g}
OPTIONS
-n Ne rien faire excepté s'assurer que les modules kvm sont chargés
-u Lancer l'opération avec les droits de l'utilisateur courant. Par défaut,
ce script tente d'acquérir les droits de root.
-l Lister les machines virtuelles
-s Démarrer la machine virtuelle (par défaut)
Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
affiché
-k Arrêter la machine virtuelle
-H Arrêter sauvagement la machine virtuelle
-r Redémarrer la machine virtuelle
-S Enregistrer l'état de la machine virtuelle
-A Arrêter toutes les machines virtuelles qui tournent actuellement
-g Afficher le gestionnaire de machines virtuelle"
}
source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS virsh ||
exit 1
function build_arrays() {
# Construire les listes avms, rvms, svms
# rvms: les vms qui tournent
# avms: toutes les vms
# svms: les vms qui sont arrêtées
rvms=()
eval "$(virsh_list | awk '{print $2}' | sort | sed 's/^/array_add rvms /g')"
avms=()
eval "$(virsh_list --all | awk '{print $2}' | sort | sed 's/^/array_add avms /g')"
svms=()
for avm in "${avms[@]}"; do
array_contains rvms "$avm" || array_add svms "$avm"
done
}
function is_numeric() {
[ -n "$1" -a -z "${1//[0-9]/}" ]
}
function select_vm() {
# Afficher un menu pour sélectionner la machine virtuelle
simple_menu "${2:-vm}" "${1:-avms}" \
-t "Machines virtuelles" \
-m "${3:-Choisissez la VM}"
}
function start_virtmanager() {
# Lancer le gestionnaire de machines virtuelles
# Les mesures prises le sont pour compatibilité avec Fedora, si la commande
# est lancée depuis le menu. En effet, toutes les processus fils sont tués
# s'ils ne sont pas détachés avant la fin de la commande du menu. Le délai
# est donc pour laisser le temps à virt-manager de s'initialiser.
nohup >/dev/null 2>&1 virt-manager &
sleep 3
}
sudo=1
action=start
stopaction=shutdown
parse_opts + "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-u,--user sudo= \
-n action=nop \
-l,--list action=list \
-s,--start action=start \
-k,-t,--stop '$action=stop; stopaction=shutdown' \
-H '$action=stop; stopaction=destroy' \
-r,--restart '$action=stop; stopaction=reboot' \
-S '$action=stop; stopaction=managedsave' \
-A,--stopall,--stop-all action=stopall \
-g action=gui \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
if ! is_root && [ -n "$sudo" ]; then
# reconstruire la ligne de commande
case "$action" in
nop) opt=-n;;
list) opt=-l;;
start) opt=-s;;
stop)
case "$stopaction" in
shutdown) opt=-k;;
destroy) opt=-H;;
reboot) opt=-r;;
managedsave) opt=-S;;
*) opt=-k;;
esac
;;
stopall) opt=--stopall;;
gui) opt=-g;;
esac
run_as_root "$opt" "$@"
fi
"$scriptdir/EnsureVM" kvm || die
[ "$action" == "nop" ] && exit 0
build_arrays
vm="$1"; shift
if [ -n "$vm" ]; then
if ! array_contains avms "$vm" && is_numeric "$vm"; then
vm=$(($vm - 1))
vm="${avms[$vm]}"
enote "Sélection de la VM $vm"
fi
fi
if [ "$action" == list ]; then
for avm in "${avms[@]}"; do
if array_contains rvms "$avm"; then
avm="$(get_color @ g)$avm [running]$(get_color z)"
fi
echo "$avm$state"
done
elif [ "$action" == start ]; then
if [ -z "$vm" -a -n "${svms[*]}" ]; then
[ -n "${rvms[*]}" ] &&
einfo "Les machines virtuelles suivantes sont déjà démarrées:
$(array_join rvms "
" "" " ")" #"
select_vm svms vm "Choisissez la VM à démarrer"
fi
if [ -n "$vm" ]; then
virsh start "$vm" "$@"
else
ewarn "Aucune VM à démarrer n'a été trouvée"
fi
elif [ "$action" == stop ]; then
if [ -z "$vm" -a "${rvms[*]}" ]; then
select_vm rvms vm "Choisissez la VM à arrêter avec la méthode $stopaction"
fi
if [ -n "$vm" ]; then
virsh "$stopaction" "$vm"
fi
elif [ "$action" == stopall ]; then
# Arrêter toutes les machines virtuelles. Au bout de 10 minutes maximum,
# forcer l'arrêt de toutes celles qui restent
estep "Arrêt de toutes les machines virtuelles"
for vm in "${rvms[@]}"; do
virsh shutdown "$vm"
done
# laisser 10 secondes pour l'arrêt initial
estep "Attente de l'arrêt des machines..."
sleep 10
# Puis attendre au maximum 10 minutes pour l'arrêt de toutes les machines
max=10
all_stopped=
while [ $max -gt 0 ]; do
build_arrays
if [ -z "${rvms[*]}" ]; then
all_stopped=1
break
else
einfo "Il y a encore ${#rvms[*]} machine(s) en fonctionnement. Attente de $max minute(s)..."
sleep 60
max=$(($max - 1))
fi
done
# Puis forcer l'arrêt des machines
if [ -z "$all_stopped" ]; then
build_arrays
eattention "Forçage de l'arrêt des machines ${rvms[*]}"
for vm in "${rvms[@]}"; do
virsh destroy "$vm"
done
fi
elif [ "$action" == gui ]; then
start_virtmanager
fi

127
SVirtualBox Executable file
View File

@ -0,0 +1,127 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: lancer une machine virtuelle VirtualBox
USAGE
$scriptname [options] vmName
OPTIONS
-n Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés
-l Lister les machines virtuelles
-s Démarrer la machine virtuelle (par défaut)
Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
affiché
-k Arrêter la machine virtuelle (par ACPI)
-p Mettre en veille la machine virtuelle (par ACPI)
-H Arrêter sauvagement la machine virtuelle
-R Redémarrer sauvagement la machine virtuelle
-S Enregistrer l'état de la machine virtuelle
-g Afficher le gestionnaire de machines virtuelle"
}
source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS ||
exit 1
function build_arrays() {
# Construire les listes avms, rvms, svms
# rvms: les vms qui tournent
# avms: toutes les vms
# svms: les vms qui sont arrêtées
rvms=()
eval "$(VBoxManage -q list runningvms | sort | sed 's/^/array_add rvms /g')"
avms=()
eval "$(VBoxManage -q list vms | sort | sed 's/^/array_add avms /g')"
svms=()
for avm in "${avms[@]}"; do
array_contains rvms "$avm" || array_add svms "$avm"
done
}
function is_numeric() {
[ -n "$1" -a -z "${1//[0-9]/}" ]
}
function select_vm() {
# Afficher un menu pour sélectionner la machine virtuelle
simple_menu "${2:-vm}" "${1:-avms}" \
-t "Machines virtuelles" \
-m "${3:-Choisissez la VM}"
}
function start_virtualbox() {
# Lancer le gestionnaire de machines virtuelles
# Les mesures prises le sont pour compatibilité avec Fedora, si la commande
# est lancée depuis le menu. En effet, toutes les processus fils sont tués
# s'ils ne sont pas détachés avant la fin de la commande du menu. Le délai
# est donc pour laisser le temps à VirtualBox de s'initialiser.
nohup >/dev/null 2>&1 VirtualBox &
sleep 3
}
action=start
stopaction=acpipowerbutton
parse_opts + "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-n action=nop \
-l,--list action=list \
-s,--start action=start \
-k,-t,--stop '$action=stop; stopaction=acpipowerbutton' \
-p,--sleep '$action=stop; stopaction=acpisleepbutton' \
-H '$action=stop; stopaction=poweroff' \
-R '$action=stop; stopaction=reset' \
-S '$action=stop; stopaction=savestate' \
-g action=gui \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
"$scriptdir/EnsureVM" virtualbox || die
[ "$action" == "nop" ] && exit 0
build_arrays
vm="$1"; shift
if [ -n "$vm" ]; then
if ! array_contains avms "$vm" && is_numeric "$vm"; then
vm=$(($vm - 1))
vm="${avms[$vm]}"
enote "Sélection de la VM $vm"
fi
fi
if [ "$action" == list ]; then
for avm in "${avms[@]}"; do
if array_contains rvms "$avm"; then
avm="$(get_color @ g)$avm [running]$(get_color z)"
fi
echo "$avm$state"
done
elif [ "$action" == start ]; then
if [ -z "$vm" -a -n "${svms[*]}" ]; then
[ -n "${rvms[*]}" ] &&
einfo "Les machines virtuelles suivantes sont déjà démarées:
$(array_join rvms "
" "" " ")" #"
select_vm svms vm "Choisissez la VM à démarrer"
fi
if [ -n "$vm" ]; then
VBoxManage -q startvm "$vm" "$@"
else
ewarn "Aucune VM à démarrer n'a été trouvée"
fi
elif [ "$action" == stop ]; then
if [ -z "$vm" -a "${rvms[*]}" ]; then
select_vm rvms vm "Choisissez la VM à arrêter avec la méthode $stopaction"
fi
if [ -n "$vm" ]; then
VBoxManage -q controlvm "$vm" "$stopaction"
fi
elif [ "$action" == gui ]; then
start_virtualbox
fi

28
_root Executable file
View File

@ -0,0 +1,28 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: devenir l'utilisateur root, avec 'sudo' si possible, ou 'su' si
'sudo' n'est pas installé"
}
source "$(dirname "$0")/ulib/ulib" &&
urequire base ||
exit 1
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
user="$scriptname"
if [ "${user#_}" != "$user" ]; then
user="${user:1}"
fi
if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then
eecho "Entrez le mot de passe de $user"
exec su - "$user"
else
eecho "Si demandé, entrez le mot de passe de $USER"
exec sudo su - "$user"
fi

74
authftp Executable file
View File

@ -0,0 +1,74 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: Se connecter sur un site FTP authentifié
Ce script nécessite ncftp. Il est conçu pour faciliter l'accès à des sites FTP
s'il est requis d'y accéder par un proxy FTP pour les connexion authentifiées.
USAGE
$scriptname [options] host login password [path]
OPTIONS
-p, --proxy
-n, --noproxy
Forcer l'utilisation, resp. ne pas utiliser, le proxy FTP (i.e. faire la
connexion directement)
-l, --lftp
Se connecter avec lftp au lieu de ncftp. Le fonctionnement n'est pas
garanti si l'on utilise un proxy FTP.
-o OPTION
Ajouter une option à la commande lancée. Si l'option prend un argument,
il faut doubler l'option -o, e.g.
$scriptname -l -o -e -o 'mirror remote local' host login pass
Dans cet exemple, l'option -e de lftp est utilisée pour faire un miroir
local du répertoire remote.
note: A cause d'une limitation de lftp, ce n'est pas possible de se connecter
automatiquement avec lftp si le mot de passe contient une virgule. A cause de la
façon dont le proxy ftp est configuré, il n'est pas possible de se connecter
avec un mot de passe qui contient le caractère @"
}
source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS ||
exit 1
AUTHFTP_PROXY_DISABLED=1 # par défaut, ne pas utiliser le proxy
set_defaults proxy
set_defaults authftp
noproxy="$AUTHFTP_PROXY_DISABLED"
lftp=
options=()
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-p,--proxy noproxy= \
-n,--noproxy noproxy=1 \
-l,--lftp lftp=1 \
-o:,--option: options \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
[ -n "$noproxy" -o -n "$AUTHFTP_PROXY_HOST" ] || die "AUTHFTP_PROXY_HOST doit être défini"
my_login="$PROXY_LOGIN"
my_password="$PROXY_PASSWORD"
read_value -i "Entrez le nom de l'hôte" host "$1"
read_value -i "Entrez l'identifiant de connexion" login "$2"
read_value -i "Entrez le mot de passe" password "$3"
read_value -i "Entrez le chemin" path "$4" N
if [ -n "$lftp" ]; then
if [ -n "$noproxy" ]; then
exec lftp -u "$login,$password" "${options[@]}" "ftp://$host/$path"
else
exec lftp -u "${login}@${my_login}@${host},${password}@${my_password}" "${options[@]}" "ftp://$AUTHFTP_PROXY_HOST/$path"
fi
else
if [ -n "$noproxy" ]; then
exec ncftp -u "$login" -p "$password" "${options[@]}" "ftp://$host/$path"
else
exec ncftp -u "${login}@${my_login}@${host}" -p "${password}@${my_password}" "${options[@]}" "ftp://$AUTHFTP_PROXY_HOST/$path"
fi
fi

6
bashrc Normal file
View File

@ -0,0 +1,6 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function uprovide() { :; }
source @@dest@@/ulib/uenv || return
__uenv_source_dirs @@dest@@/bashrc.d "$HOME/etc/bashrc.d"
__uenv_cleanup

81
caturl Executable file
View File

@ -0,0 +1,81 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: Afficher une url
USAGE
$scriptname <file.url|file.desktop|URL>"
}
source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS ||
exit 1
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
function findurl() {
echo "$1"
}
URL="$1"
URLFILE=
if [ -z "$URL" ]; then
# Essayer de trouver une fichier homepage.{url,desktop} dans le répertoire
# courant
URLFILE="$(findurl homepage)"
[ -f "$URLFILE" ] || die "Il faut spécifier l'url à ouvrir"
elif [ -d "$URL" ]; then
# répertoire dans lequel se trouve éventuellement un fichier
# homepage.{url,desktop}
URLFILE="$(findurl "$URL/homepage")"
if [ -f "$URLFILE" ]; then
# un fichier d'url valide
:
else
# un répertoire local à ouvrir
URLFILE=
URL="file://$(abspath "$URL")"
fi
else
URLFILE="$(findurl "$URL")"
if [ -f "$URLFILE" ]; then
# un fichier d'url valide
:
else
if [ -f "$URL" ]; then
# un fichier local à ouvrir
URL="file://$(abspath "$URL")"
else
# on assume que c'est une url standard
:
fi
fi
fi
if [ -n "$URLFILE" ]; then
# lire l'url dans un fichier
if [ "${URLFILE%.url}" != "$URL" ]; then
# raccourci vers une url de windows
URL="$(<"$URLFILE" awk 'BEGIN { type = 0; URL = "" }
tolower($0) == "[internetshortcut]" { type = type + 1 }
/[uU][rR][lL]=/ { URL = substr($0, 5) }
END { if (type == 1) print URL }
')"
[ -n "$URL" ] || die "$URLFILE: ne contient pas d'URL"
elif [ "${URLFILE%.desktop}" != "$URL" ]; then
# raccourci vers une url de XDG
URL="$(<"$URLFILE" awk 'BEGIN { type = 0; URL = "" }
tolower($0) == "[desktop entry]" { type = type + 1 }
/Type=Link/ { type = type + 1 }
/[uU][rR][lL]=/ { URL = substr($0, 5) }
END { if (type == 2) print URL }
')"
[ -n "$URL" ] || die "$URLFILE: ne contient pas d'URL"
fi
fi
echo "$URL"

625
compileAndGo Executable file
View File

@ -0,0 +1,625 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# See notice of copyright and license at end.
# If you use this program for a #! script, please include the following
# as the second line of the script:
# See http://Yost.com/computers/compileAndGo
# Bug: doesn't recompile if invoked file is a symlink. Fixed?
# Needs a call to realpath.
## Bug: The following fails for the cg command after fixing it to work for compileAndGo
# Something about evaluation order of the variables in the source header.
# compiler = gcc
# compilerArgs = -O2 -o $cacheDir/$executableFilename $cacheDir/$sourceFilename
if [ $# == 1 -a "$1" == --help ]; then
echo "compileAndGo: see http://Yost.com/computers/compileAndGo"
exit 0
fi
# The #! compileAndGo script that invoked us.
# If $0 is a symlink, this is the invoked name, not the symlink referent name
typeset -r commandFile="$1"
pathOfDirPartOfExecPath() {
if [[ -h "$1" ]] ; then
local lsout="$(ls -l "$1")"
local referent="${lsout#* -> }"
pathOfDirPartOfExecPath "$referent"
elif [[ -d "${1%/*}" ]] ; then
echo "${1%/*}"
else
echo .
fi
}
typeset -r commandDir="$(pathOfDirPartOfExecPath "$0")/"
# If $0 is a symlink, this is the invoked name, not the symlink referent name
ourName=${0##*/}
#-------------------------------------------------------------------------------
extensionToLanguage() {
case "$1" in
js)
echo javascript
;;
java)
echo java
;;
c)
echo c
;;
cp | cpp | C | cxx | cc)
echo c++
;;
*)
;;
esac
}
languageToCompiler() {
case "$1" in
javascript)
echo jsc
;;
java)
echo javac
;;
c)
if [[ -x /usr/bin/gcc ]] ; then
echo /usr/bin/gcc
else
echo /usr/bin/cc
fi
;;
c++)
echo /usr/bin/g++
;;
*)
;;
esac
}
echo2() {
# This works for sh, ksh, and bash, but not zsh.
echo "$@"
}
echoVariables() {
echo 1>&2 $1
if [[ ! $ourName == cg ]] ; then
# Echo all but the builtins.
echo 1>&2 "$(
eval "$(
echo "$cmdSetters" \
| grep -v 'commandBasename
commandDir
sourceFilename
language
mainClass
executableFilename
compilerDir
classPath
compilerArgs
linkerArgs
execute
firstArgIsCommandName
verbose' \
| sed "
s,^eval,echo,
s,=, = ,
s,',,g
"
)" \
| sed "
s,= ,= ',
s,$,',
"
)"
else
echo 1>&2 commandName = "$commandName"
echo 1>&2 compiler = "$compiler"
fi
# Echo the builtins.
echo 1>&2 commandBasename = "$commandBasename"
echo 1>&2 commandDir = "$commandDir"
echo 1>&2 sourceFilename = "$sourceFilename"
echo 1>&2 language = "$language"
echo 1>&2 mainClass = "$mainClass"
echo 1>&2 executableFilename = "$executableFilename"
echo 1>&2 compilerDir = "$compilerDir"
echo 1>&2 classPath = "$classPath"
echo 1>&2 compilerArgs = "$compilerArgs"
echo 1>&2 linkerArgs = "$linkerArgs"
echo 1>&2 execute = "$execute"
echo 1>&2 firstArgIsCommandName = "$firstArgIsCommandName"
echo 1>&2 verbose = "$verbose"
}
#-------------------------------------------------------------------------------
# If we use zsh, we could do this:
# zmodload zsh/stat
# stat -F "%Y-%m-%d_%H-%M-%S" +mtime .
ls-linux() {
# 11742 2005-07-28 11:54:01.000000000
(
ls -dl --full-time --time-style=full-iso "$1" \
| sed 's,.*[0-9] \([12][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\) \([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\).[0-9]* .*,\1.\2-\3-\4,'
) 2> /dev/null
}
ls-oldlinux() {
# 11742 Tue Mar 01 17:22:50 2005
(
ls -dl --full-time "$1" \
| sed 's,.*[0-9] ... \(...\) \([0-9][0-9]\) \([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\) \([12][0-9][0-9][0-9]\) .*,\4-\1-\2.\3-\5-\6,'
) 2> /dev/null
}
ls-bsd() {
# 11742 Jul 28 12:38:31 2005
(
ls -dlT "$1" \
| awk '
BEGIN {
months["Jan"] = "01" ; months["Feb"] = "02" ; months["Mar"] = "03"
months["Apr"] = "04" ; months["May"] = "05" ; months["Jun"] = "06"
months["Jul"] = "07" ; months["Aug"] = "08" ; months["Sep"] = "09"
months["Oct"] = "10" ; months["Nov"] = "11" ; months["Dec"] = "12"
}
{
month = sprintf(months[$6]) ; day = $7 ; time = $8 ; year = $9 # What about Europe?
gsub(":", "-", time)
date = year "-" month "-" day "_" time
print date
}
'
) 2> /dev/null
}
#-------------------------------------------------------------------------------
set -e
sourceInput=
case $ourName in
cg)
# Invoked as cg
if [[ $# == 0 ]] ; then
echo 1>&2 "Usage: cg sourcefile.<extension> [ args ... ]"
exit 2
fi
sourceInput="$1"
export commandName=${commandFile##*/}
commandBasename="${commandName%.*}"
commandExtension="${commandFile##*.}"
sourceFilename=$commandName
language=$(extensionToLanguage $commandExtension)
compiler=$(languageToCompiler $language)
;;
cgs)
sourceInput=/dev/stdin
export commandName=$ourName
commandBasename=$commandName
compilerOpt="$1"
case "$compilerOpt" in
-jsc)
sourceFileName=$commandName.js
;;
-javac | -gcj | -jikes)
shift
export commandName=$1
commandBasename=$commandName
sourceFileName=$commandName.java
;;
-gcc | -c99 | -c89 | -cc)
sourceFileName=$commandName.c
;;
-g++)
sourceFileName=$commandName.cp
;;
"")
echo 1>&2 cgs: missing compiler option
exit 2
;;
*)
echo 1>&2 cgs: unknown compiler option: "$compilerOpt"
exit 2
;;
esac
compiler=${compilerOpt/-/}
;;
*)
sourceInput=
# Invoked as compileAndGo
# Collect the variable declarations at the top of $commmandFile.
declarations="$(
sed -n '
s,^[ ]*,,
/^!#$/q
/^compileAndGo/q
/^[ ]*#/d
s,^commandName,export commandName,
/^echo[ ]/{
s/$/ ;/p
d
}
s,\$\({*commandBasename\),\\$\1,g
s,\$\({*commandDir\),\\$\1,g
s,\$\({*sourceFilename\),\\$\1,g
s,\$\({*language\),\\$\1,g
s,\$\({*mainClass\),\\$\1,g
s,\$\({*executableFilename\),\\$\1,g
s,\$\({*compilerDir\),\\$\1,g
s,\$\({*classPath\),\\$\1,g
s,\$\({*compilerArgs\),\\$\1,g
s,\$\({*linkerArgs\),\\$\1,g
s,\$\({*execute\),\\$\1,g
s,\$\({*cacheDir\),\\$\1,g
s,\$\({*firstArgIsCommandName\),\\$\1,g
s,[ ]*=[ ]*,=",
s,$," ;,
p
' "$commandFile"
)"
eval $declarations
[[ ! -z ${commandName:="${1##*/}"} ]]
commandBasename="${commandName%.*}"
if (( 0$verbose >= 5 )) ; then
echo 1>&2 \=== Declarations
echo 1>&2 "$declarations"
fi
if [[ -z "$compiler" ]] ; then
if [[ -z "$language" ]] ; then
echo 1>&2 compileAndGo: compiler or language must be set
trouble=true
fi
compiler=$(languageToCompiler $language)
fi
if [[ ! -z "$trouble" ]] ; then
exit 2
fi
;;
esac
#-------------------------------------------------------------------------------
# Collect the source code
newsed() {
local arg
if sed --regex-extended < /dev/null >& /dev/null ; then
arg=--regex-extended
else
arg=-E
fi
sed $arg "$@"
}
case "$sourceInput" in
/dev/stdin)
# from stdin
sourceCode=$(cat)
;;
'')
# from the end of $commandFile
sourceCode=$(
newsed '
1,/^(!#|[ ]*compileAndGo)/s,.*,,
' "$commandFile"
)
if [[ -z "$sourceCode" ]] ; then
echo 1>&2 "$commandName: Missing '#!compileAndGo' line before source code starts."
exit 2
fi
;;
*)
# from the filename as first argument
sourceCode=$(cat $1)
;;
esac
#-------------------------------------------------------------------------------
# Construct the cacheDir variable.
abi=$(uname -sm)
abi=${abi// /-}
# Why must I use `` instead of $() here?
id=`
case "$sourceInput" in
/dev/stdin)
local tmp=($(echo "$sourceCode" | cksum))
echo ${tmp[0]}${tmp[1]}
;;
*)
case "$abi" in
Linux* | CYGWIN*)
ls-linux "$1" \
|| ls-oldlinux "$1"
;;
*)
ls-bsd "$1" \
|| ls-linux "$1" \
|| ls-oldlinux "$1"
;;
esac \
|| (
local tmp=($(echo "$sourceCode" | cksum))
echo ${tmp[0]}${tmp[1]}
)
;;
esac
`
compilerPath=$(type -p "$compiler" 2> /dev/null) || compilerPath=$compiler
realHOME=$(eval 'echo ~'$(whoami))
if [[ -x $realHOME/Library/Caches ]] ; then
# Mac OS X
cacheDirRoot=$realHOME/Library/Caches/CompileAndGo
else
cacheDirRoot=$realHOME/.compileAndGo
fi
cacheDirParent=$cacheDirRoot/${commandName}
cacheDir=$cacheDirParent/$abi/${id}_${compilerPath//\//-}
#-------------------------------------------------------------------------------
# Apply defaults and then set the variables again.
compilerName=${compiler##*/}
# Some settings common among different compiler groups:
case $compilerName in
javac* | jikes*)
[[ ! -z ${mainClass:="$commandBasename"} ]]
[[ ! -z ${sourceFilename:="${mainClass}.java"} ]]
;;
gcj*)
[[ ! -z ${mainClass:="$commandBasename"} ]]
[[ ! -z ${sourceFilename:="${mainClass}.java"} ]]
[[ ! -z ${executableFilename:="$commandBasename"} ]]
[[ ! -z ${execute:="PATH=$cacheDir:$PATH $executableFilename"} ]]
;;
gcc* | g++* | c89* | c99*)
[[ ! -z ${executableFilename:="$commandBasename"} ]]
[[ ! -z ${execute:="PATH=$cacheDir:$PATH $executableFilename"} ]]
;;
esac
case $compilerName in
jsc*)
[[ ! -z ${mainClass:="$commandBasename"} ]]
[[ ! -z ${sourceFilename:="${mainClass}.js"} ]]
[[ ! -z ${executableFilename:="${mainClass}.class"} ]]
[[ ! -z "${execute:="${javaBinDir}java -cp $cacheDir${classPath:+:$classPath} $mainClass"}" ]]
[[ ! -z "${compilerArgs:="-o $executableFilename $cacheDir/$sourceFilename"}" ]]
compileCmd="java -cp $cacheDir${classPath:+:$classPath} org.mozilla.javascript.tools.jsc.Main $compilerArgs"
;;
javac* | jikes*)
[[ ! -z ${executableFilename:="${mainClass}.class"} ]]
sourceVersion=
case $compilerName in
javac*)
if [[ $compilerName == $compiler ]] ; then
compilerDir=
else
compilerDir=${compiler%/*}/
fi
[[ ! -z "${execute:="${compilerDir}java -cp $cacheDir${classPath:+:$classPath} $mainClass"}" ]]
# Prepare to tell javac to compile for the latest language version it supports
sourceVersion="-source $(${compilerDir}java -version 2>&1 | sed -n '1s,[^"]*"\([1-9][1-9]*\.[1-9][1-9]*\).*,\1,p')"
;;
jikes*)
if [[ -z "$classPath" && -z "$compilerArgs" && -z "$CLASSPATH" ]] ; then
# Mac: export CLASSPATH=/System/Library/Frameworks/JavaVM.framework/Classes/classes.jar
echo 1>&2 compileAndGo: for jikes, if neither classPath nor CLASSPATH are set, compilerArgs must be set.
exit 2
fi
[[ ! -z "${execute:="java -cp $cacheDir${classPath:+:$classPath} $mainClass"}" ]]
;;
esac
[[ ! -z "${compilerArgs:="$sourceVersion -d $cacheDir -sourcepath . ${classPath:+-classpath $classPath} $cacheDir/$sourceFilename"}" ]]
compileCmd="$compiler $compilerArgs"
;;
gcj*)
[[ ! -z ${compilerArgs:="--main=$mainClass -o $cacheDir/$commandBasename $cacheDir/$sourceFilename"} ]]
compileCmd="$compiler $compilerArgs $linkerArgs"
;;
gcc* | g++* | c89* | c99* | clang | clang++)
case $compilerName in
cc* | gcc* | c89* | c99* | clang)
[[ ! -z ${sourceFilename:="${commandName}.c"} ]]
;;
g++* | clang++)
[[ ! -z ${sourceFilename:="${commandName}.cp"} ]]
;;
esac
[[ ! -z ${compilerArgs:="-O2 -o $cacheDir/$executableFilename $cacheDir/$sourceFilename"} ]]
compileCmd="$compiler $compilerArgs $linkerArgs"
;;
esac
#-------------------------------------------------------------------------------
# Set the variables
if [[ ! $ourName == cg ]] ; then
vars=$(
echo "$declarations" \
| sed -n 's,\([^=]*\)=.*,\1,p'
)
cmdSetters=$(
for x in $vars
do
echo eval "'"${x}='"'$(eval echo \$$x)'"'"'"
done
)
eval "$cmdSetters"
fi
if (( 0$verbose >= 3 )) ; then
echoVariables "=== the variables before defaults"
fi
if [[ $ourName == cg ]] ; then
if (( 0$verbose >= 4 )) ; then
echo 1>&2 \=== eval command to set variables
echo2 1>&2 eval "$cmdSetters"
fi
fi
#-------------------------------------------------------------------------------
# Check that all the required variables are set.
for x in sourceFilename executableFilename compilerArgs execute
do
eval 'if [ -z "'\$$x'" ] ; then trouble=true ; fi'
done
if [[ ! -z "$trouble" ]] ; then echo 1>&2 compileAndGo: unknown compiler setting "$compiler" ; exit 2 ; fi
for x in sourceFilename executableFilename compilerArgs execute
do
eval 'if [ -z "'\$$x'" ] ; then echo 1>&2 compileAndGo: $x must be set ; fi'
done
if [[ ! -z "$trouble" ]] ; then exit 2 ; fi
[[ ! -z ${firstArgIsCommandName:=false} ]]
[[ ! -z ${verbose:=0} ]]
eval "$cmdSetters"
if (( 0$verbose >= 3 )) ; then
echoVariables "=== the variables after defaults"
fi
#set -x
#-------------------------------------------------------------------------------
# Compile if necessary
# shorthand
cachedExecutable=$cacheDir/$executableFilename
# The security precautions go like this:
# The executable and the folder in which it resides are
# * owned by user
# * 700 permissions (rwx------)
# The important facts are:
# * Only the user or root can chmod a file or folder owned by him.
# * Only the user or root can write into a file or folder that is 700.
# * Only root can chown a file or folder to the user.
# so only the user or root can construct a suitable file in the suitable
# folder. No one else can. That's about as good as it can get on unix.
# The attack would be limited to finding some existing folder containing
# an executable of the correct name, both owned by the user and 700,
# then moving the folder into the appropriate path.
# The implementation should be expanded to require that all folders from
# $cacheDir through $cacheDirParent must be owned by user and be 700.
if [[ ! -O $cachedExecutable ]] ; then
if [[ -e $cachedExecutable ]] ; then
echo 1>&2 "$commandName: Aborting because $cachedExecutable exists,"
echo 1>&2 "$commandName: and you don't own it."
echo 1>&2 "$commandName: This is a possible security violation."
exit 2
fi
# Try to make it harder for others to tamper with our cache.
umask 077
# Insist that $cacheDirParent is a directory and is owned by the user.
if [[ -d $cacheDirParent ]] ; then
if [[ ! -O $cacheDirParent ]] ; then
echo 1>&2 "$commandName: Aborting because $cacheDirParent/ exists, and you don't own it."
echo 1>&2 "$commandName: This is a security risk."
exit 2
fi
chmod 700 $cacheDirParent
else
mkdir -p $cacheDirParent
echo > $cacheDirParent/../README "See http://Yost.com/computers/compileAndGo"
fi
mkdir -p $cacheDir
# Compile the source.
if (( 0$verbose == 1 )) ; then
echo 1>&2 "[ $commandName: compiling. ]"
elif (( 0$verbose >= 2 )) ; then
echo -n 1>&2 "[ "
echo2 -n 1>&2 "$compileCmd"
echo 1>&2 " ]"
fi
echo "$sourceCode" > $cacheDir/$sourceFilename
eval $compileCmd
# Make a canonical name we can look at to determine access time.
ln -f $cachedExecutable $cacheDir/.executable
fi
#-------------------------------------------------------------------------------
# Execute the built program.
if [[ "$firstArgIsCommandName" != true ]] ; then
shift
fi
if (( 0$verbose >= 2 )) ; then
echo -n 1>&2 "[ "
echo2 -n 1>&2 $execute "$@"
echo 1>&2 " ]"
fi
eval "$execute"' "$@"'
status=$?
if [[ true ]] ; then
# Run a background task to clean the cache occasionally.
(
# Check every this-many days.
checkInterval="-mtime -7"
# Max number of days a version cam be unused and not be removed.
maxAge="-atime +14"
# Every $checkInterval days, remove stuff not used in $maxAge days.
stamp=$(nice -n 20 find $cacheDirRoot -maxdepth 1 -name .timestamp $checkInterval)
if [[ ! -z "$stamp" ]] ; then
# Too soon
exit
fi
nice -n 20 touch $cacheDirRoot/.timestamp
# Remove dirs of executable versions not accessed in the last $maxAge days.
candidates=$(nice -n 20 find $cacheDirRoot -mindepth 3 -name .executable $maxAge)
if [[ ! -z "$candidates" ]] ; then
#echo "$candidates"
echo "$candidates" \
| nice -n 20 sed 's,/.executable,,' \
| nice -n 20 xargs rm -rf
fi
) \
> /dev/null 2>&1 \
&
fi
exit $status
# Copyright 2005-2010 Dave Yost <Dave@Yost.com>
# All rights reserved.
# This version is
# compileAndGo 5.0 2010-11-06
# which at time of this publication can be found at:
# http://Yost.com/computers/compileAndGo
# Redistribution and use in the form of source code or derivative data built
# from the source code, with or without modification, are permitted provided
# that the following conditions are met:
# 1. THE USER AGREES THAT THERE IS NO WARRANTY.
# 2. If and only if appropriate, the above phrase "This version is" must be
# followed by the phrase "a modified form of" or "extracted from" or
# "extracted and modified from".
# 3. Redistributions of source code must retain this notice intact.
# 4. Redistributions in the form of derivative data built from the source
# code must reproduce this notice intact in the documentation and/or other
# materials provided with the distribution, and each file in the derivative
# data must reproduce any Yost.com URI included in the original distribution.
# 5. Neither the name of Dave Yost nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
# 6. Written permission by the author is required for redistribution as part
# of a commercial product.
# This notice comprises all text from "Copyright" above through the end of
# this sentence.

80
cssh Executable file
View File

@ -0,0 +1,80 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: Faire une connexion ssh en lançant automatiquement un screen sur l'hôte distant
USAGE
$scriptname [user@]host [options]
OPTIONS
note: les options de ssh doivent se trouver *APRES* [user@]host, pour simplifier
leur analyse.
L'option -t de ssh est forcée, pour permettre la connexion par screen
Les options suivantes doivent se trouver *AVANT* le premier argument:
-S SSH
Spécifier l'exécutable à utiliser pour lancer ssh."
}
source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS ||
exit 1
ssh=
parse_opts + "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-S:,--ssh ssh= \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
userhost="$1"; shift
[ -n "$userhost" ] || die "Vous devez spécifier l'hôte sur lequel faire la connexion"
[ -n "$ssh" ] || ssh=ssh
exec "$ssh" -t "$@" "$userhost" /bin/bash -c \''
function __ask() {
local r
read -p "$1" -t 2 r
[ $? -gt 128 -o -z "$r" -o "$r" == "o" -o "$r" == "O" -o "$r" == "y" -o "$r" == "Y" ]
}
function __auto_screen() {
# Si on est déjà dans screen, ne rien faire
[ -z "$STY" ] || return
local msgprefix
local screens count
screens="$(LANG=C screen -ls | grep -Ei "attached|detached")"
if [ -n "$screens" ]; then
count="$(echo "$screens" | wc -l)"
else
count=0
fi
if [ $count -gt 0 ]; then
if [ $count -eq 1 ]; then
msgprefix="Il y a '"$COULEUR_BLEUE"'1 session screen en cours'"$COULEUR_NORMALE"'
Cette session"
else
msgprefix="Il y a '"$COULEUR_ROUGE"'$count sessions screen en cours'"$COULEUR_NORMALE"':
$screens
La première session"
fi
if __ask "
$msgprefix sera reconnectée automatiquent dans 2 secondes
Voulez-vous reconnecter la session screen? [On] "; then
exec screen -q -s -/bin/bash -xRR
else
exec /bin/bash -l
fi
elif __ask "
Une '"$COULEUR_VERTE"'nouvelle session screen'"$COULEUR_NORMALE"' sera lancée automatiquement dans 2 secondes
Voulez-vous lancer une session screen? [On] "; then
exec screen -q -s -/bin/bash -RR
else
exec /bin/bash -l
fi
}
__auto_screen
'\'

6
doc/.udir Normal file
View File

@ -0,0 +1,6 @@
# -*- 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=(wikidir)

25
doc/DefaultTiddlers.twp Normal file
View File

@ -0,0 +1,25 @@
# -*- 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: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: DefaultTiddlers
[[Main]]

16
doc/EnsureVM.twp Normal file
View File

@ -0,0 +1,16 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:19
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: EnsureVM
{{{
EnsureVM: s'assurer que les services sont lancés pour un type de virtualisation
USAGE
EnsureVM type
Les types supportés sont virtualbox et kvm (par défaut)
}}}

46
doc/Main.twp Normal file
View File

@ -0,0 +1,46 @@
# -*- 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: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: Main
!Présentation
nutools est un ensemble d'utilitaires pour faciliter l'utililisation des Unixes, en particulier Linux, mais aussi MacOS X et Cygwin.
C'est aussi une librairie de scripts shell réutilisables ([[ulib]]) et une librairie de modules python réutilisables (pyulib)
!Prérequis
Python >= 2.3 et GNU Awk sont requis pour que toutes les fonctionnalités soient supportées.
* Sous Linux, lors de l'installation du package, les meilleurs efforts sont fait pour que ces packages soient installés.
* Sous MacOSX, il faut installer manuellement Fink, DarwinPorts ou Homebrew
! Outils
Chaque outil contient une aide intégrée. Il suffit de lancer l'outil avec l'argument {{{--help}}} pour avoir une aide détaillée.
* Déploiement d'un répertoire ou d'une archive
** [[uinst]]: Déploiement local
** [[mkusfx]]: Faire une archive auto-installable avec uinst
** [[ruinst]]: Déploiement distant avec uinst
** [[runs]]: Lancer un script avec le protocole RUNS
** [[rruns]]: Déploiement distant avec runs
* Librairie réutilisable de scripts shell
** [[uinc]]: Dépliage des inclusions dans un fichier
** [[ulibsync]]: Faire une copie locale pour un projet de ulib et/ou pyulib
* Autres outils
** [[udir]]: Gestion des paramètres d'un répertoire. Ces paramètres sont entre autres utilisés par uinst et uinc.

25
doc/MainMenu.twp Normal file
View File

@ -0,0 +1,25 @@
# -*- 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: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: MainMenu
[[GettingStarted]]

152
doc/RUNS.txt Normal file
View File

@ -0,0 +1,152 @@
# -*- coding: utf-8 mode: text -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
Les scripts RUNS sont des scripts servant à déployer certains services ou à
faire certaines opérations.
runs diffère un peu de uinst, qui est orienté copie de fichiers et configuration
d'une arborescence. Avec runs, chaque script fait une seule opération, en
utilisant éventuellement certains fichiers disponibles dans le répertoire du
script.
RUNSPATH contient une liste de répertoires qu'il faut initialiser avec la
commande 'runs --init'. L'arborescence est de la forme:
runsdir
+- scripts
| \_ SCRIPTS...
+- hosts
| \_ HOSTS...
| + runs.conf
| + sysinfos.conf
| + default
| \_ SCRIPTS...
\_ DOMAINS...
\_ HOSTS...
+ runs.conf
+ sysinfos.conf
+ default
\_ SCRIPTS...
Le répertoire scripts contient les scripts généraux.
SCRIPTS correspondant aux fichiers de scripts, qui n'ont pas de contrainte sur
la façon de les nommer. HOSTS correspond aux répertoires d'hôtes, qui peuvent
contenir des fichiers de configuration ou d'autres scripts. DOMAINS correspond
aux domaines de hôtes pleinement qualifiés. Ces répertoire contiennent des
répertoires d'hôtes.
Le répertoire hosts contient des configuration pour des hôtes sans domaine. Les
hôtes pleinements qualifiés sont classés par domaine, puis par nom d'hôte. Par
exemple, si on cherche un script ou un fichier de configuration pour l'hôte
'medusa.univ.run', il sera d'abord cherché dans 'runsdir/univ.run/medusa' puis
dans 'runsdir/hosts/medusa'
Le fichier runs.conf contient des configuration qui sont partagées par tous les
scripts qui sont dans l'arborescence en-dessous. Ce fichier est au format CONF
(cf. ci-dessous).
Le fichier sysinfos.conf contient si nécessaire la configuration du système pour
l'hôte, pour les scripts qui doivent faire des préparations en local en fonction
du système distant. Ce fichier peut-être initialisé avec la configuration
affichée par le script usysinfos
Le fichier default contient la recette par défaut pour la configuration de
l'hôte. Il s'agit d'une suite de lignes de la forme:
script [params]
[params]
...
params correspond aux arguments de la fonction var. Chaque ligne indentée sous
le nom du script correspond à une invocation différente de var. Par exemple,
avec cette commande:
script name=value arr0+=value0 arr1-=value1
arr2 value21 value22
Le script 'script' est lancé avec la configuration de variable suivante:
name=value, rajouter value0 au tableau arr0, enlever value1 au tableau arr1, et
initialiser le tableau arr2 avec les valeur value21 et value22
Un script est composé de deux sections: CONF et SCRIPT, séparés par la ligne
'script:'. La forme d'un script est donc:
CONF
script:
SCRIPT
Les deux sections sont écrites dans le langage de script bash.
Format de la section CONF
=========================
Dans cette section, les fonctions notamment disponibles sont: desc, conf, var,
out, ref, sysinfos
desc DESC
Donner la description du script, à afficher avec 'runs --info'
conf flags...
Activer certains flags. Les valeurs possible sont:
root -- ce script requière d'être lancé avec l'utilisateur root
local -- dans le cas d'un déploiement distant, ce script doit être lancé
uniquement en local
after scriptpaths...
Requérir que dans une même session, ce script soit lancé après tous les
scripts mentionnés
after -r scriptpath [args...]
Si le script spécifié a déjà été lancé dans la session en cours, ne rien
faire. Sinon, lancer le script spécifié avec les arguments spécifiés avant
de lancer le script en cours.
after -rr scriptpath [args...]
Lancer de façon inconditionnelle le script spécifié avec les arguments
spécifiés avant de lancer le script en cours.
var name=value
Initialiser la variable name à la valeur value
var array+=value
Ajouter la valeur value au tableau array
var array-=value
Enlever la valeur value du tableau array
var array value0 value1... valueN
Initialiser le tableau array avec la valeur (value0 value1...valueN)
out name[=file]
Créer un fichier temporaire nommé file dans un espace partagé, et mettre son
chemin absolu dans la variable name.
ref [-r] name[=file]
Mettre dans la variable name le chemin absolu vers le fichier file, cherché
d'abord dans le répertoire du script, puis dans le répertoire partagé, et
enfin dans RUNSPATH. Si le fichier n'est trouvé nulle part, le chemin est
relatif au répertoire partagé.
Avec l'option -r, le fichier est requis: le script s'arrête si le fichier
référencé n'est pas trouvé.
Format de la section SCRIPT
===========================
Cette section peut contenir n'importe quelle script. Par défaut, les librairies
DEFAULTS et runs sont chargées. Mais il est possible avec urequire de charger
d'autres librairies, notamment uinst ou uinc.
Les fonctions suivantes sont disponibles: shouldrun, setdone, resetdone.
shouldrun [subsystem [value]]
Tester si le script (ou l'opération subsystem du script) doit être
lancée. Tant que la fonction 'setdone' n'est pas lancée, cette fonction
retourne vrai.
setdone [subsystem [value]]
Spécifier que le script (ou l'opération subsystem du script) a été lancée
correctement.
resetdone [subsystem]
Réinitialiser les informations concernant l'état d'installation du script ou
de l'opération subsystem du script.

30
doc/SKvm.twp Normal file
View File

@ -0,0 +1,30 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: SKvm
{{{
SKvm: lancer une machine virtuelle kvm
USAGE
SKvm [options] vmName
SKvm {-l|-A|-g}
OPTIONS
-n Ne rien faire excepté s'assurer que les modules kvm sont chargés
-u Lancer l'opération avec les droits de l'utilisateur courant. Par défaut,
ce script tente d'acquérir les droits de root.
-l Lister les machines virtuelles
-s Démarrer la machine virtuelle (par défaut)
Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
affiché
-k Arrêter la machine virtuelle
-H Arrêter sauvagement la machine virtuelle
-r Redémarrer la machine virtuelle
-S Enregistrer l'état de la machine virtuelle
-A Arrêter toutes les machines virtuelles qui tournent actuellement
-g Afficher le gestionnaire de machines virtuelle
}}}

27
doc/SVirtualBox.twp Normal file
View File

@ -0,0 +1,27 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: SVirtualBox
{{{
SVirtualBox: lancer une machine virtuelle VirtualBox
USAGE
SVirtualBox [options] vmName
OPTIONS
-n Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés
-l Lister les machines virtuelles
-s Démarrer la machine virtuelle (par défaut)
Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
affiché
-k Arrêter la machine virtuelle (par ACPI)
-p Mettre en veille la machine virtuelle (par ACPI)
-H Arrêter sauvagement la machine virtuelle
-R Redémarrer sauvagement la machine virtuelle
-S Enregistrer l'état de la machine virtuelle
-g Afficher le gestionnaire de machines virtuelle
}}}

25
doc/SiteSubtitle.twp Normal file
View File

@ -0,0 +1,25 @@
# -*- 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: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: SiteSubtitle
Outils divers pour linux/macosx, et librairies pour bash

25
doc/SiteTitle.twp Normal file
View File

@ -0,0 +1,25 @@
# -*- 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: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: SiteTitle
nutools

25
doc/SiteUrl.twp Normal file
View File

@ -0,0 +1,25 @@
# -*- 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: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: SiteUrl

12
doc/_root.twp Normal file
View File

@ -0,0 +1,12 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: _root
{{{
_root: devenir l'utilisateur root, avec 'sudo' si possible, ou 'su' si
'sudo' n'est pas installé
}}}

18
doc/authftp.twp Normal file
View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:19
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: authftp
{{{
authftp: Se connecter avec ncftp sur un site FTP authentifié
Ce script est conçu pour les sites qui utilisent un proxy FTP pour les connexion
authentifiées.
USAGE
authftp [options] host login password [path]
OPTIONS
}}}

14
doc/caturl.twp Normal file
View File

@ -0,0 +1,14 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:19
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: caturl
{{{
caturl: Afficher une url
USAGE
caturl <file.url|file.desktop|URL>
}}}

11
doc/compileAndGo.twp Normal file
View File

@ -0,0 +1,11 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:19
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: compileAndGo
{{{
compileAndGo: see http://Yost.com/computers/compileAndGo
}}}

27
doc/fconv.twp Normal file
View File

@ -0,0 +1,27 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:19
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: fconv
{{{
fconv: convertir des fichiers dans un autre encoding
USAGE
fconv [-f src_enc] [ -t dest_enc] [/path/to/file]
OPTIONS
-f from
Encoding source. Si n'est pas spécifié ou vaut 'detect', l'encoding est
autodétecté.
-t to
Encoding destination. Doit être spécifié.
Cas particulier: si to vaut 'lf' ou 'crlf', from est ignoré, et seuls
les caractères de fin de lignes sont convertis.
-N Ne pas optimiser le calcul de l'encoding. Cette option n'est valide que
si -f n'est pas spécifié. On assume que tous les noms de fichiers n'ont
pas le même encoding. L'encoding from est donc recalculé à chaque fois.
-r inverser from et to, qui doivent être tous les deux spécifiés.
}}}

25
doc/fnconv.twp Normal file
View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:19
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: fnconv
{{{
fnconv: renommer des fichiers en changeant leur encoding
USAGE
fnconv [-f src_enc] [ -t dest_enc] [/path/to/file]
OPTIONS
-f from
Encoding source. Si n'est pas spécifié ou vaut 'detect', l'encoding est
autodétecté.
-t to
Encoding destination. Doit être spécifié.
-N Ne pas optimiser le calcul de l'encoding. Cette option n'est valide que
si -f n'est pas spécifié. On assume que tous les noms de fichiers n'ont
pas le même encoding. L'encoding from est donc recalculé à chaque fois.
-r inverser from et to, qui doivent être tous les deux spécifiés.
}}}

14
doc/geturl.twp Normal file
View File

@ -0,0 +1,14 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:19
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: geturl
{{{
geturl: Télécharger un fichier avec wget ou curl
USAGE
geturl <file.url|file.desktop|URL> [wget options]
}}}

86
doc/mkRewriteRules.twp Normal file
View File

@ -0,0 +1,86 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:19
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: mkRewriteRules
{{{
mkRewriteRules: Créer un fichier de redirections pour Apache à partir d'un certain
nombre de règles
USAGE
mkRewriteRules -f rewrite.rules [-o RewriteRules.conf] [-w RewriteRules.html] host
OPTIONS
-p Générer les directives <Proxy...> et tenir compte de proxy_acls
Par défaut, le champ proxy_acls est ignoré
FORMAT des règles de mapping
============================
Les commentaires commencent par le signe "#"
Les règles sont de la forme:
src:dest:host:suffix:OPTS:prot:proxy_acls
^prefix
=literal
prot vaut par défaut http. Il peut valoir aussi https
Si dest ou suffix se terminent par $, on est en mode NO_SLASH
En mode NO_SLASH, si src se termine par $, on est en mode NO_TRAIL
* Si dest est de la forme Application.woa
En mode NO_SLASH, on génère
RewriteRule ^/src(.*) [prot://host]/cgi-bin/WebObjects/dest[/suffix]$1 [L,OPTS]
En mode NO_SLASH+NO_TRAIL, on génère
RewriteRule ^/src [prot://host]/cgi-bin/WebObjects/dest[/suffix] [L,OPTS]
En mode normal, on génère
RewriteRule ^/src$ /src/
RewriteRule ^/src/(.*) [prot://host]/cgi-bin/WebObjects/dest[/suffix]/$1 [L,OPTS]
* Si dest n'est pas de la forme Application.woa
En mode NO_SLASH, on génère
RewriteRule ^/src(.*) [prot://host]/dest[/suffix]$1 [L,OPTS]
En mode NO_SLASH+NO_TRAIL, on génère
RewriteRule ^/src [prot://host]/dest[/suffix] [L,OPTS]
En mode normal, on génère
RewriteRule ^/src$ /src/
RewriteRule ^/src/(.*) /dest[/suffix]/$1 [L,OPTS]
Si une règle est précédée d'une ou plusieurs lignes de la forme "^prefix",
ces lignes sont copiées avant chacune des commandes RewriteRule générées
pour une règle. Ceci permet d'ajouter des conditions avec RewriteCond pour
une règle. e.g.
^RewriteCond %{REMOTE_ADDR} 10\..*
src:dest.woa
qui génère:
RewriteCond %{REMOTE_ADDR} 10\..*
RewriteRule ^/src$ /src/
RewriteCond %{REMOTE_ADDR} 10\..*
RewriteRule ^/src/(.*) /cgi-bin/WebObjects/dest.woa/$1 [L]
Une ligne de la forme "=literal" est recopiée sans modifications (sans le "=")
dans le fichier de sortie.
proxy_acls est utilisé si l'option -p est spécifiée et OPTS contient P (comme
proxy), ou si le mode de réécriture requière l'utilisation d'un proxy.
* Avec la valeur "None", aucune directive <Proxy> n'est générée
* Si aucune valeur n'est spécifiée, la directive suivante est générée:
<Proxy $URL>
AddDefaultCharset off
Order Deny,Allow
Allow from all
</Proxy>
* Si une valeur est spécifiée, la directive suivante est générée:
<Proxy $URL>
AddDefaultCharset off
Order Allow,Deny
Allow from $proxy_acls
</Proxy>
Dans les exemples donnés ci-dessus, $URL est l'url générée par la réécriture,
et $proxy_acls la valeur du champ proxy_acls spécifiée ci-dessus.
}}}

18
doc/mkiso.twp Normal file
View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:19
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: mkiso
{{{
mkiso: créer une image iso d'un répertoire
USAGE
mkiso [options] srcdir [dest.iso]
OPTIONS
-M, --hfs
créer une image hybride ISO/HFS
}}}

20
doc/mkurl.twp Normal file
View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: mkurl
{{{
mkurl: Enregistrer une url dans un fichier raccourci
USAGE
mkurl <url> [output]
OPTIONS
Par défaut, l'url est enregistrée dans un fichier homepage.url
Mais il est possible de spécifier un fichier avec l'extension .url pour un
raccourci utilisable aussi sous Windows, ou avec l'extension .desktop pour
compatibilité avec le standard XDG
}}}

35
doc/mkusfx.twp Normal file
View File

@ -0,0 +1,35 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: mkusfx
{{{
mkusfx: Créer une archive auto-extractible qui installe son contenu avec uinst
USAGE
mkusfx [options] [--bare] src cmd...
mkusfx [options] [--uinst] src
OPTIONS
--bare
Installer le contenu de l'archive en lançant la commande 'cmd...' avec
le répertoire courant étant le contenu de l'archive. Typiquement, ce
sera une commande de forme './script', où script est un fichier situé à
la racine de l'archive
Dans ce mode d'installation, l'option --self-contained est ignorée.
--uinst
Installer le contenu de l'archive avec uinst (par défaut)
-o dest
Spécifier le fichier de sortie. Par défaut, il s'agit de
${src}-installer.run
--tmp-archive
Spécifier qu'il s'agit d'une archive temporaire. Cette archive
s'auto-détruit après utilisation.
--self-contained
Spécifier que l'archive doit pouvoir s'installer même sur un système sur
lequel nutools n'est pas installé. Cette archive contiendra une copie
locale de ulib et uinst.sh
}}}

14
doc/openurl.twp Normal file
View File

@ -0,0 +1,14 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: openurl
{{{
openurl: Ouvrir une URL dans un navigateur
USAGE
openurl <file.url|file.desktop|URL>
}}}

16
doc/rmtildes.twp Normal file
View File

@ -0,0 +1,16 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: rmtildes
{{{
rmtildes: supprimer les fichiers *~ dans le répertoire courant
USAGE
rmtildes [dir [glob]]
Par défaut, dir==. et glob==*~
}}}

62
doc/rruns.twp Normal file
View File

@ -0,0 +1,62 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 30/03/2012 04:42
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: rruns
{{{
rruns: Déploiement distant avec runs
USAGE
rruns [-H host] [-T tmproot] rscriptname name=value...
rruns [-H host] [-T tmproot] @recipe name=value...
rruns [-H host] [-T tmproot] -f rscript name=value...
rruns [-H host] [-T tmproot] -r recipe name=value...
Lancer ce script sans argument (hors options) est équivalent à le lancer avec
l'argument @default
OPTIONS
-C Ne pas faire le déploiement. Configurer uniquement la connexion par clé
sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir
se connecter par mot de passe pour configurer la connexion par clé.
Si l'on veut configurer la connexion par clé pour le user root, mais que
ce n'est pas possible de se connecter par mot de passe avec le user root
sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant,
il est possible de faire la configuration avec '--configure root'. La
commande serait alors
rruns -H user@host --configure root
-T tmproot
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
/var/tmp. Cette option est utile pour les vservers, qui ont par défaut
un /tmp minuscule de 16 Mo.
-S ssh
Spécifier le programme à utiliser pour la connection par ssh.
-H host
Spécifier un hôte distant sur lequel faire le déploiement. Plusieurs
options -H peuvent être spécifiées, ou alors on peut séparer plusieurs
hôtes par ':', e.g. -H host1:host2
Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
root. Il est possible de spécifier un autre utilisateur avec la syntaxe
user@host, e.g -H jclain@host
-f RSCRIPT
Lancer le script individuel spécifié au lieu de chercher dans les
répertoires $RUNS{SCRIPTS,HOSTS}PATH
-r RECIPE
Lancer les scripts spécifiés dans le fichier de recettes individuel
spécifié.
-z Forcer la réinstallation des scripts qui se basent sur shouldrun/setdone
-o OUTPUT
Générer l'archive à lancer sur l'hôte distant au lieu de faire le
déploiement. Si plusieurs hôtes sont spécifiés, OUTPUT est considéré
comme un nom de base auquel est ajouté le nom de l'hôte sur lequel
l'archive doit être déployée.
--sysinfos
Après un déploiement réussi sur l'hôte distant, inscrire si ce n'est
déjà fait le résultat de la commande usysinfos dans le fichier
sysinfos.conf du répertoire d'hôte.
Cette option est automatiquement activée si ce script est lancé sans
argument (hors options).
}}}

38
doc/ruinst.twp Normal file
View File

@ -0,0 +1,38 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ruinst
{{{
ruinst: Déploiement distant avec uinst
USAGE
ruinst [-H host] [-T tmproot] <file|archive|dir> [-- options de uinst]
OPTIONS
-C Ne pas faire le déploiement. Configurer uniquement la connexion par clé
sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir
se connecter par mot de passe pour configurer la connexion par clé.
Si l'on veut configurer la connexion par clé pour le user root, mais que
ce n'est pas possible de se connecter par mot de passe avec le user root
sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant,
il est possible de faire la configuration avec '--configure root'. La
commande serait alors
ruinst -H user@host --configure root
-T tmproot
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
/var/tmp. Cette option est utile pour les vservers, qui ont par défaut
un /tmp minuscule de 16 Mo.
-S ssh
Spécifier le programme à utiliser pour la connection par ssh.
-H host
Spécifier un hôte distant sur lequel faire le déploiement. Plusieurs
options -H peuvent être spécifiées, ou alors on peut séparer plusieurs
hôtes par ':', e.g. -H host1:host2
Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
root. Il est possible de spécifier un autre utilisateur avec la syntaxe
user@host, e.g -H user@host
}}}

60
doc/runs.twp Normal file
View File

@ -0,0 +1,60 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 30/03/2012 04:42
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: runs
{{{
runs: Lancer un script avec le protocole runs
USAGE
runs [options] rscriptname name=value...
runs [options] @recipe name=value...
runs [options] -f rscript name=value...
runs [options] -r recipe name=value...
OPTIONS
Configuration
--init
Créer le répertoire d'hôte correspondant à l'hôte courant ou à l'hôte
spécifié avec l'option -h
--sysinfos DATA
Avec l'option --init, initialiser le fichier sysinfos.conf avec DATA, si
le fichier n'a pas déjà été provisionné. Sans cette option, un fichier
vide avec des commentaires est créé à la place.
--create RSCRIPT
Créer un modèle de script avec le nom donné.
Avec l'option -h, le script est créé dans le répertoire d'hôte
correspondant à l'hôte spécifié
Gestion des scripts
-s Forcer l'exécution du script avec l'utilisateur root si ce n'est pas
déjà le cas
-f RSCRIPT
Lancer le script individuel spécifié au lieu de chercher dans les
répertoires de $RUNSSCRIPTSPATH
-r RECIPE
Lancer les scripts spécifiés dans le fichier de recettes individuel
spécifié.
-h HOSTNAME[.DOMAIN]
Spécifier que les scripts sont destinés à être lancés sur l'hôte
spécifié. Les scripts sont alors aussi cherchés dans les répertoires
{$RUNSHOSTSPATH}/$hostname.$domain (par défaut) et
{$RUNSHOSTSPATH}/$domain/$hostname (le cas échéant)
L'option --host est équivalente, sauf que son argument est facultatif et
que sa valeur par défaut est l'hôte courant, soit melee
--list
Afficher la liste des scripts qui sont disponibles. Avec l'option -h,
inclure aussi les scripts spécifiques à cet hôte.
Avec cette option, les arguments supplémentaires agissent comme des
filtres (regexp utilisée avec l'opérateur == de la commande [[). Les
noms des scripts doivent valider au moins un filtre.
--info
Afficher la la description du script et la valeur de chaque variable
définies
--desc-only
Afficher seulement la description du script
-z Forcer la réinstallation des scripts qui se basent sur shouldrun/setdone
}}}

38
doc/rwoinst.twp Normal file
View File

@ -0,0 +1,38 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: rwoinst
{{{
rwoinst: Déploiement distant avec woinst
USAGE
rwoinst [-H host] [-T tmproot] <file|archive|dir>... [-- options de woinst]
OPTIONS
-C Ne pas faire le déploiement. Configurer uniquement la connexion par clé
sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir
se connecter par mot de passe pour configurer la connexion par clé.
Si l'on veut configurer la connexion par clé pour le user root, mais que
ce n'est pas possible de se connecter par mot de passe avec le user root
sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant,
il est possible de faire la configuration avec '--configure root'. La
commande serait alors
rwoinst -H user@host --configure root
-T tmproot
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
/var/tmp. Cette option est utile pour les vservers, qui ont par défaut
un /tmp minuscule de 16 Mo.
-S ssh
Spécifier le programme à utiliser pour la connection par ssh.
-H host
Spécifier un hôte distant sur lequel faire le déploiement. Plusieurs
options -H peuvent être spécifiées, ou alors on peut séparer plusieurs
hôtes par ':', e.g. -H host1:host2
Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
root. Il est possible de spécifier un autre utilisateur avec la syntaxe
user@host, e.g -H user@host
}}}

39
doc/twsync.twp Normal file
View File

@ -0,0 +1,39 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: twsync
{{{
twsync: synchroniser un répertoire de wiki avec un tiddlywiki
USAGE
twsync [options]
Un répertoire de wiki est un répertoire où chaque page est contenu dans un
fichier avec l'extension .twp
Un tiddlywiki est un fichier html contenant le code de TiddlyWiki et les données
associées.
OPTIONS
-d wikidir
-f wikifile
Spécifier le répertoire de wiki et le tiddlywiki à traiter. Par défaut,
il s'agit de wiki.html dans le répertoire courant.
-u Importer les pages de wikidir dans le tiddlywiki. Utiliser cette action
quand les pages de wikidir sont modifiées et qu'il faut mettre à jour le
tiddlywiki.
Il s'agit de l'action par défaut
--force
Forcer l'importation des pages même si les tiddlers correspondant sont
plus récents dans le tiddlywiki
Forcer aussi la regénération de wikifile même si aucune modification n'a
été détectée
-e Exporter les tiddlers du tiddlywiki vers wikidir. Utiliser cette action
quand le tiddlywiki a été modifié, et qu'il faut synchroniser wikidir
avec les dernières modifications.
-U Mettre à jour le fichier wikifile avec la dernière version de tiddlywiki
située dans ~/wop/modules/nutools/lib/tiddlywiki/empty.html
}}}

24
doc/ubackup.twp Normal file
View File

@ -0,0 +1,24 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ubackup
{{{
ubackup: faire une sauvegarde des fichiers
USAGE
ubackup [options]
OPTIONS
-l Lister les profils de sauvegarde disponibles.
-p Spécifier le profil de sauvegarde à effectuer. Par défaut, toutes les
sauvegardes sont effectuées.
-u USER
Faire le sauvegarde pour l'utilisateur $USER. Cette option n'est valide
que pour l'utilisateur root.
-n Afficher ce qui doit être fait plutôt que de le faire
-H Arrêter la machine après une sauvegarde REUSSIE.
}}}

51
doc/uconf.twp Normal file
View File

@ -0,0 +1,51 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: uconf
{{{
uconf: Activer ou désactiver un paramètre dans un fichier de configuration
USAGE
uconf [options] config name[=value]...
OPTIONS
-e Activer le paramètre (par défaut). Si le paramètre existe, mais est
commenté, il est décommenté. Si une valeur est spécifiée pour le
paramètre, le paramètre est modifié dans le fichier en conséquence.
-q Cette option s'utilise avec l'option -e et le type shell. Elle permet
de s'assurer que les valeurs ayant des espaces et/ou des caractères
spéciaux sont quotées
-d Désactiver le paramètre. Le paramètre est commenté s'il existe dans le
fichier
-a Ajouter une valeur à la variable, ou un paramètre avec cette valeur
(suivant le type de fichier de configuration)
-A Ajouter une valeur au tableau, ou un paramètre avec cette valeur
(suivant le type de fichier de configuration)
-t TYPE
Type de fichier de configuration. TYPE peut être sh (par défaut), apache
ou mysql.
shell
les paramètres sont de la forme 'name=value', et les commentaires
débutent par '#'. Ce type peut être utilisé pour tous les fichiers
ayant ces caractéristiques, dont les fichiers de script shell
apache
les paramètres sont de la forme 'name value', et les commentaires
débutent par '#'. Ce type peut être utilisé pour tous les fichiers
ayant ces caractéristiques, dont les fichiers de configuration
apache
mysql, php
les paramètres sont dans des sections nommées de la forme [section],
sont de la forme 'name=value', et les commentaires débutent par '#'
ou ';'
Ce type peut être utilisé pour tous les fichiers ayant ces
caractéristiques, dont les fichiers de configuration de mysql et de
php. Avec ce type, la section est obligatoire.
-s SECTION
Avec le type mysql, préciser la section dans laquelle inscrire le
paramètre. Attention! La section DOIT exister, elle n'est pas créée
automatiquement.
}}}

90
doc/ucrontab.twp Normal file
View File

@ -0,0 +1,90 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ucrontab
{{{
ucrontab: Ajouter/Supprimer une ligne dans crontab
USAGE
ucrontab [options] ctline
OPTIONS
-a Ajouter la ligne dans le fichier crontab (par défaut)
-r Enlever la ligne dans le fichier crontab
-u user
Spécifier l'utilisateur pour lequel on modifie crontab. Par défaut,
modifier le crontab de root
-H host:hosts...
Modifier le crontab sur les hôtes distants spécifiés. Avec l'hôte '.' ou
'localhost', la modification est faite sur l'hôte local
Si l'action est -a, un script 'undo-ucrontab.sh' est créé dans le
répertoire courant, qui annule la planification. Il est possible de
lancer ce script le lendemain pour enlever les planifications
installées.
ctline
Ligne de crontab de la forme 'minutes hours days months dows command'
Si la ligne est de la forme halt[@hh:mm], la commande 'shutdown -h now'
est planifiée pour le LENDEMAIN à hh:mm. si hh:mm n'est pas spécifié,
l'arrêt est planifié pour 7:00
-t hh:mm
Ignorer la partie 'minutes hours days months dows' de ctline, et la
remplacer par une planification à hh:mm le LENDEMAIN.
--dom dayOfMonth
--month month
Spécifier respectivement le jour du mois et le mois (1-12) auquel faire
la planification. Par défaut, les planifications sont effectuées pour le
LENDEMAIN. Il est conseillé de spécifier les deux arguments si le jour
doit être fixé.
-s cmdfile
Spécifier un fichier, dont le contenu est utilisé pour générer le script
qui est planifié. Le fichier doit contenir l'ensemble des commandes à
exécuter. Le script est modifié pour s'autodétruire à la fin de son
exécution. Si ce comportement n'est pas souhaité, il faut rajouter la
commande 'exit 0' à la fin.
-S cmd
Comme -s, mais spécifier le contenu du fichier directement sur la ligne
de commande.
-f hostsfile
Spécifier un fichier qui contient la liste des hôtes sur lesquels faire
les planifications.
Les options -s, -S, -H, -d, -n sont ignorées. L'option --add est valide
jusqu'au premier @group du fichier. Voici le format de ce fichier:
Un groupe d'hôte débute par une ligne de la forme '@group:adelay:gdelay'
- adelay est le nombre de minutes à laisser passer entre les hôtes du
groupe (par défaut 1)
- gdelay est le nombre de minutes à laisser passer après le traitement
du groupe (par défaut 15)
Les autres lignes sont des hôtes sur lequels planifier l'opération, de
la forme 'host:cmd'
- host est un nom d'hôte pleinement qualifié, sur lequel il est possible
de se connecter par clé.
- cmd est une description de la commande à lancer pour effectuer
l'opération planifiée. Utiliser la syntaxe '<script' pour prendre le
contenu du fichier de script spécifié. Le script est copié dans un
fichier temporaire sur l'hôte, et se supprime après son
lancement. Sinon, la commande spécifiée est utilisée telle quelle. Si
cmd n'est pas spécifié, prendre la commande par défaut donnée par
ctline
Les lignes vides et commençant par '#' sont ignorées
La commande '@include:file' permet d'inclure un autre fichier
-d Activer l'incrémentation automatique des heures de planification entre
chaque hôte. Ceci permet par exemple de planifier l'arrêt d'un certain
nombre de machines dans un ordre précis, en horaire décalé.
Cette option est activée par défaut si ctline==halt[@time]
-n Désactiver l'incrémentation automatique des heures de planification.
--add ADELAY
Spécifier le nombre de minutes entre chaque hôte pour l'incrémentation
automatique des heures de planification. Par défaut, il y a 1 minute
entre chaque hôte.
--us undo-script
Spécifier le nom du script qui annule la planification. Utiliser ""
pour désactiver cette fonctionnalité.
--fake
Afficher simplement les modifications qui doivent être effectuées.
}}}

38
doc/udir.twp Normal file
View File

@ -0,0 +1,38 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: udir
{{{
udir: gérer les variables de répertoire
USAGE
udir [options] [dir [name=value...]]
Par défaut, mettre à jour les variables du répertoire avec les définitions
données. Attention! Les définitions sont insérées *telles quelles* dans le
fichier. Par exemple, pour définir une variable qui contient des espaces,
on pourra faire:
udir /path/to/dir 'var="value with spaces"'
pour définir un tableau:
udir /path/to/dir 'array=(first second)'
OPTIONS
-i Afficher la description du répertoire. C'est l'action par défaut si ce
script est lancé *sans argument*
-d Afficher toutes les variables définies pour le répertoire 'dir'.
-x 'cmds;...'
Exécuter les commandes dans le contexte des variables définies pour le
répertoire.
-e Editer les variables du répertoire
--local-vars
Avec -d, ajouter des directives 'local' aux définitions de variables
-A Avec -d et -x, considérer les variables de tous les répertoires parents
jusqu'à la racine. Pour ne considérer que les variables du répertoire
spécifié (par défaut), utiliser --local-only
--help-vars
Afficher une descriptions des variables spécifiques aux outils de utools
}}}

32
doc/uenv.twp Normal file
View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: uenv
{{{
uenv: Mettre à jour la configuration de l'environnement
USAGE
uenv [-u [projdirs...]]
Cette commande met à jour l'ordre de chargement des fichiers de configuration
dans ~/etc/{profile.d,bashrc.d}. Elle est donc utile si ces fichiers ont été
modifiés manuellement, ou si un fichier a été ajouté manuellement.
OPTIONS
HOME=/path/to/homedir
Spécifier le chemin vers ~
Cette option doit être placée avant les valeurs projdirs.
-u Installer ou mettre à jour les fichiers de profil des projets spécifiés:
Les fichiers ~/.profile, ~/.bash_profile et ~/.bashrc sont vérifiés et
corriger automatiquement pour inclure les fichiers de nutools.
Ensuite, les fichiers de profil sont copié dans les répertoires
~/etc/{profile.d,bashrc.d,default}
Les projets spécifiés *doivent* être configurés avec uinst -C, et
définir la valeur install_profiles=true dans leur fichier .udir
Si aucun projet n'est spécifié, prendre les fichiers de profil de
nutools.
}}}

47
doc/uinc.sh.twp Normal file
View File

@ -0,0 +1,47 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: uinc.sh
{{{
uinc.py: Plier/déplier des inclusions dans un fichier
USAGE
uinc.py [[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.
}}}

47
doc/uinc.twp Normal file
View File

@ -0,0 +1,47 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: uinc
{{{
uinc.py: Plier/déplier des inclusions dans un fichier
USAGE
uinc.py [[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.
}}}

38
doc/uinst.sh.twp Normal file
View File

@ -0,0 +1,38 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: uinst.sh
{{{
uinst.sh: Déployer en local un fichier, une archive, ou un répertoire
USAGE
uinst.sh [options] <file|archive|dir>
OPTIONS
var=value
Spécifier la valeur d'une variable ou d'un préfixe, plutôt que de
laisser uprefix l'autodétecter. Utiliser 'uprefix -l' pour avoir une
liste de préfixes valides. Utiliser 'udir --help-vars' pour avoir une
liste de variables valides pour uinst.sh.
-d /path/to/destdir
Spécifier le répertoire destination. Equivalent à l'option
destdir="/path/to/destdir"
-a (par défaut) Si la source n'est pas spécifiée, déterminer le répertoire
à déployer automatiquement.
--no-auto
Ne pas déterminer automatiquement le répertoire à déployer.
--prefix
(par défaut) Corriger les chemins srcdir et destdir qui commencent par
des préfixes valides. Utiliser 'uprefix -l' pour avoir une liste de
préfixes valides.
--no-prefix
Ne jamais corriger un chemin.
--include-vcs
Inclure les fichiers de VCS dans les fichiers copiés. Par défaut, les
fichiers de VCS sont exclus.
-C Configurer un répertoire pour le déploiement avec uinst
}}}

38
doc/uinst.twp Normal file
View File

@ -0,0 +1,38 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: uinst
{{{
uinst: Déployer en local un fichier, une archive, ou un répertoire
USAGE
uinst [options] <file|archive|dir>
OPTIONS
var=value
Spécifier la valeur d'une variable ou d'un préfixe, plutôt que de
laisser uprefix l'autodétecter. Utiliser 'uprefix -l' pour avoir une
liste de préfixes valides. Utiliser 'udir --help-vars' pour avoir une
liste de variables valides pour uinst.
-d /path/to/destdir
Spécifier le répertoire destination. Equivalent à l'option
destdir="/path/to/destdir"
-a (par défaut) Si la source n'est pas spécifiée, déterminer le répertoire
à déployer automatiquement.
--no-auto
Ne pas déterminer automatiquement le répertoire à déployer.
--prefix
(par défaut) Corriger les chemins srcdir et destdir qui commencent par
des préfixes valides. Utiliser 'uprefix -l' pour avoir une liste de
préfixes valides.
--no-prefix
Ne jamais corriger un chemin.
--include-vcs
Inclure les fichiers de VCS dans les fichiers copiés. Par défaut, les
fichiers de VCS sont exclus.
-C Configurer un répertoire pour le déploiement avec uinst
}}}

28
doc/ujava.twp Normal file
View File

@ -0,0 +1,28 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ujava
{{{
ujava: Lancer un script après avoir sélectionné une version de java
USAGE
ujava [options] version [args...]
OPTIONS
-b, --bits 32|64|auto
Sélectionner une version 32 ou 64 bits de java
-e, --exact
Sélectionner la version *exacte* de java demandée, au lieu de la version
minimum correspondant à la version demandée.
Si la version requise de java n'est pas trouvée, retourner avec le code
d'erreur 254.
La version de java attendue peut-être exprimée de l'une des façons suivantes:
1.4 1.4+ 1.5 1.5+ 1.6 1.6+ 1.7 1.7+
Si args n'est pas spécifié, un shell est lancé dans lequel les variables
JAVA_HOME, JAVA, JAVAC et PATH sont mis à jour.
}}}

219
doc/uldap.twp Normal file
View File

@ -0,0 +1,219 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: uldap
{{{
uldap: Shell pour accéder à un serveur ldap
USAGE
uldap [options]
OPTIONS
-C profile
Sélectionner un profil de connexion. Par défaut, si l'option -H n'est
pas spécifiée, le premier profil est sélectionné.
-x Ne pas tenter de faire une connexion sur le profil par défaut si aucun
profil n'est sélectionné.
-f script
Lire les commandes depuis le script spécifié.
-n Avec un script donné en ligne de commande ou lu depuis un fichier, ne pas
ajouter automatiquement la commande print à la fin
-i Si un script est spécifié, passer en mode interactif après l'exécution
du script.
-e Forcer l'arrêt du script si une erreur se produit. C'est l'option par
défaut pour un script spécifié avec -f.
-l input.ldif
Charger le fichier input.ldif comme espace de travail initial
-H ldapuri
-D binddn
-w password
-b searchbase
-v var=value
COMMANDES
$ cmd
Passer directement une commande au shell.
set [options] [var=value...]
Changer des options ou des variables. set sans argument affiche la liste
des variables définies.
[set] plain
Passer en mode 'plain': indiquer que l'espace de travail contient des
données brutes. Les pré-traitements et post-traitements (uncut_on_load,
decode_on_load, encode_on_save, cut_on_save) ne sont pas appliqués sur
cet espace de travail
[set] ldif
Passer en mode 'ldif': indiquer que l'espace de travail contient des
données ldif. Les pré-traitements et post-traitements sont appliqués
normalement sur cet espace de travail
[set] append
Pour certaines opérations, spécifier si le résultat de la *prochaine*
opération remplace le contenu de l'espace de travail courant (par
défaut), ou si le résultat est ajouté à la fin.
last
Afficher en mode édition la dernière commande. Cette commande n'est
fonctionnelle qu'avec une version de bash >=4.x
profile name
Choisir le profil 'name'. Equivalent à 'set profile=name'. Sans
argument, afficher la liste des profils valides.
auth anonymous|binddn [password]
Spécifier le compte à utiliser pour se connecter. Equivalent à
'set binddn=binddn; set password=password'
clear [-k]
Vider l'espace de travail et passer en mode 'plain'.
Avec l'option -k, supprimer aussi tout l'historique d'annulation.
load [-k] input
Charger un fichier dans l'espace de travail. Si l'extension du fichier
est .ldif, passer en mode 'ldif'
En mode append, rajouter le contenu du fichier à l'espace de travail,
puis repasser en mode replace.
Le code de retour est 0 si le fichier a été chargé, 1 sinon.
save [-a] output
Sauvegarder l'espace de travail dans un fichier.
Avec l'option -a, rajouter au fichier au lieu de l'écraser
print
Afficher l'espace de travail
alias a=rdn...
Définir un alias pour la commande cd. 'a' est l'alias, 'rdn' est le dn
correspondant, exprimé par rapport à $suffix. Sans argument, afficher
la liste des aliases définis.
cd rdn
Changer searchbase. Par défaut, il s'agit d'un rdn relatif à $searchbase
- Certains aliases sont supportés: .. pour l'objet parent, ~ pour
$suffix, / pour la racine. 'cd' sans argument équivaut à 'cd ~'
- Si le dn commence par '~/', il s'agit d'un rdn relatif à $suffix.
- Si le dn commence par /, searchbase reçoit la valeur rdn sans
modifications (sauf bien sûr enlever le '/' de tête si nécessaire). Il
faut alors que ce soit un dn absolu.
ls [-b searchbase] [filter [attrs...]]
search [-b searchbase] [filter [attrs...]]
Utiliser ldapsearch pour faire la recherche, et copier le résultat dans
l'espace de travail. 'ls' est équivalent à 'search -s one'. Si ce n'est
pas déjà le cas, passer en mode 'ldif'.
L'option -b prend une valeur avec la même syntaxe que la commande cd,
sauf que les alias ne sont pas supportés. En particulier, la valeur est
relative au $searchbase courant. Pour faire une recherche par rapport à
$suffix, il faut utiliser la syntaxe ~/searchbase.
En mode append, rajouter le résultat de la recherche à l'espace de
travail, puis repasser en mode replace.
Le code de retour est 1 si aucun enregistrement n'a été trouvé, sinon
le code de retour est celui de la commande ldapsearch.
cut Couper les lignes trop longues. Cette action est en principe effectuée
automatiquement lors de la sauvegarde. Il n'est pas conseillé
d'appliquer des méthodes de transformation après avoir utilisé cette
action.
uncut
Fusionner les lignes coupées. Cette action est en principe effectuée
automatiquement lors du chargement ou après la recherche.
encode [attrs...]
Encoder en base64 les valeurs des attributs mentionnés.
decode [attrs...]
Décoder les valeurs des attributs mentionnés si nécessaire (c'est à dire
s'ils sont encodés en base64)
keepattr attrs...
Garder uniquement les lignes des attributs mentionnés. Ensuite,
supprimer les objets ayant uniquement la ligne dn: (en d'autres termes,
keepattr sans argument supprime *tout* l'espace de travail)
keepval attr patterns...
Pour l'attribut attr, garder uniquement les lignes pour lesquelles les
valeurs correspondent aux expressions régulières. Les autres attributs
ne sont pas modifiés. Ensuite, supprimer les objets ayant uniquement la
ligne dn:
exclude attrs...
Supprimer les lignes des attributs mentionnés. Ensuite, supprimer les
objets ayant uniquement la ligne dn:
excludeval attr patterns...
Pour l'attribut attr, supprimer les lignes pour lesquelles les
valeurs correspondent aux expressions régulières. Les autres attributs
ne sont pas modifiés. Ensuite, supprimer les objets ayant uniquement la
ligne dn:
setval attr values...
Remplacer toutes les valeurs de l'attribut attr par les valeurs
spécifiées.
addval attr values...
Ajouter un nouvel attribut avec les valeurs spécifiées. Si l'attribut
existe déjà, les nouvelles valeurs sont ajoutées à la fin.
sed args
Modifier l'espace de travail avec le résultat de la commande sed.
note: aucun argument n'est filtré, mais il ne faut pas utiliser les
options de sed qui provoquent la modification en place du fichier,
comme par exemple l'option -i
awk args
Modifier l'espace de travail avec le résultat de la commande awk.
grep args
Modifier l'espace de travail avec le résultat de la commande grep.
format [options] attrs...
Formater l'espace de travail en données tabulaires, et passer en mode
'plain'.
--show-headers
Afficher les en-têtes
-F FSEP
Spécifier le séparateur pour les attributs. Par défaut, il s'agit du
caractère de tabulation.
-R VSEP
Spécifier le séparateur pour les valeurs des attributs. Par défaut, il
s'agit du point-virgule ';'
-e Retourner les valeurs comme des variables shell. Les options -F et -R
sont ignorées. Les attributs multivalués sont écrits sous forme de
tableaux. Par exemple:
attributes=('mail' 'givenName')
index=0
mail='user@domain.fr'
givenName=('peter' 'gabriel')
--bc
Dans le mode -e, spécifier une commande à insérer avant le premier
enregistrement. Quand cette commande est lancée, index==-1
-c Dans le mode -e, spécifier une commande à insérer après chaque
enregistrement
--ec
Dans le mode -e, spécifier une commande à insérer après le dernier
enregistrement
sort [args]
Modifier l'espace de travail avec le résultat de la commande sort.
edit
Lancer un éditeur pour modifier l'espace de travail.
diff [options]
Afficher les différences entre l'espace de travail et la version
précédente
ifok cmd
iferror cmd
Si le dernier code de retour est 0 (resp. !=0), lancer la commande cmd
skip n
Sauter les n prochaines commandes. A utiliser avec ifok et iferror
undo
Annuler la dernière modification effectuée sur l'espace de travail
Les directives suivantes prennent le contenu de l'espace de travail, et le
transforment en une suite de commandes de modifications pour ldapmodify:
A Créer un objet de toutes pièces avec les attributs donnés et leurs
valeurs.
a Ajouter les valeurs spécifiée à l'attribut
r Remplacer les valeurs de l'attribut par celles spécifiées
d Supprimer les valeurs spécifiées de l'attribut
D Supprimer l'attribut
delentry
Supprimer l'objet
ldapmodify
Utiliser ldapmodify pour modifier les objets sur le serveur. Il faut
utiliser au préalable l'une des méthodes de transformation parmi A, a,
r, d, D, delentry.
Le code de retour est celui de la commande ldapmodify.
ldapadd
Utiliser ldapadd pour créer les objets situés dans l'espace de travail.
Le code de retour est celui de la commande ldapadd.
ldapdelete
Utiliser ldapdelete pour supprimer la liste des dns situés dans l'espace
de travail.
Le code de retour est celui de la commande ldapdelete.
Notes:
- les expressions régulières sont celles reconnues par awk.
- pour spécifier plusieurs actions sur une même ligne, les séparer par //
- le code de retour est 0 si ok, 255 si une erreur s'est produite (erreur de
syntaxe, de connexion, de lecture/écriture de fichier, etc.). sinon, les
opérations ldap{search,modify,delete,add} ont leur code de retour respectifs
}}}

49
doc/ulib.twp Normal file
View File

@ -0,0 +1,49 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 02/06/2012 09:54
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib
!Liste des librairies de ulib
* [[ulib/apache]]
* [[ulib/base]]
* [[ulib/bash]]
* [[ulib/compat]]
* [[ulib/conf]]
* [[ulib/crontab]]
* [[ulib/debian]]
* [[ulib/DEFAULTS]]
* [[ulib/install]]
* [[ulib/ipcalc]]
* [[ulib/java]]
* [[ulib/javaproperties]]
* [[ulib/ldap]]
* [[ulib/ldif]]
* [[ulib/legacy]]
* [[ulib/macosx]]
* [[ulib/mkcrypt]]
* [[ulib/modeline]]
* [[ulib/network-manager-service]]
* [[ulib/pkg]]
* [[ulib/prefixes]]
* [[ulib/pretty]]
* [[ulib/runs]]
* [[ulib/service]]
* [[ulib/sysinfos]]
* [[ulib/tiddlywiki]]
* [[ulib/udir]]
* [[ulib/uenv]]
* [[ulib/uenv_update]]
* [[ulib/uinc]]
* [[ulib/uinst]]
* [[ulib/ulib]]
* [[ulib/ulibsh]]
* [[ulib/vcs]]
* [[ulib/virsh]]
* [[ulib/webobjects]]
* [[ulib/woinst]]
* [[ulib/wondermonitor]]
* [[ulib/wosign]]
* [[ulib/wotaskd]]

8
doc/ulib_DEFAULTS.twp Normal file
View File

@ -0,0 +1,8 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/DEFAULTS

41
doc/ulib_apache.twp Normal file
View File

@ -0,0 +1,41 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/apache
!! {{{get_default_apachebin_prefix}}}
!! {{{get_default_apacheversion_prefix}}}
!! {{{get_default_apachectl_prefix}}}
!! {{{get_default_apachelogdir_prefix}}}
!! {{{get_default_apachesslcertsdir_prefix}}}
!! {{{get_default_apachesslkeysdir_prefix}}}
!! {{{get_default_apacheconfdir_prefix}}}
!! {{{get_default_apacheconf_prefix}}}
!! {{{get_default_apacheavsitesdir_prefix}}}
!! {{{get_default_apachesitesdir_prefix}}}
!! {{{get_default_htdocsdir_prefix}}}
!! {{{get_default_cgibindir_prefix}}}
!! {{{compute_apache_prefixes}}}
!! {{{recompute_apache_prefixes}}}
!! {{{get_APACHEBIN_prefix}}}
!! {{{get_APACHEVERSION_prefix}}}
!! {{{get_APACHECTL_prefix}}}
!! {{{get_APACHELOGDIR_prefix}}}
!! {{{get_APACHESSLCERTSDIR_prefix}}}
!! {{{get_APACHESSLKEYSDIR_prefix}}}
!! {{{get_APACHECONFDIR_prefix}}}
!! {{{get_APACHECONF_prefix}}}
!! {{{get_APACHEAVSITESDIR_prefix}}}
!! {{{get_APACHESITESDIR_prefix}}}
!! {{{get_HTDOCSDIR_prefix}}}
!! {{{get_CGIBINDIR_prefix}}}
!! {{{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)
}}}
!! {{{apache_addcert}}}

1043
doc/ulib_base.twp Normal file

File diff suppressed because it is too large Load Diff

8
doc/ulib_bash.twp Normal file
View File

@ -0,0 +1,8 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/bash

8
doc/ulib_compat.twp Normal file
View File

@ -0,0 +1,8 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/compat

157
doc/ulib_conf.twp Normal file
View File

@ -0,0 +1,157 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/conf
!! {{{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
}}}
!! {{{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.
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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.
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{aconf_array_append}}}
!! {{{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.
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{mconf_array_append}}}
!! {{{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
}}}

10
doc/ulib_crontab.twp Normal file
View File

@ -0,0 +1,10 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/crontab
!! {{{add_to_crontab}}}
!! {{{remove_from_crontab}}}

49
doc/ulib_debian.twp Normal file
View File

@ -0,0 +1,49 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 30/03/2012 04:43
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/debian
!! {{{pkg_check}}}
{{{
Vérifier que les packages sont installés sur le système
}}}
!! {{{pkg_update}}}
{{{
Mettre à jour la liste des packages silencieusement sans confirmation
}}}
!! {{{pkg_upgrade}}}
{{{
Mettre à jour la liste des packages silencieusement sans confirmation
}}}
!! {{{pkg_install}}}
{{{
Installer les packages silencieusement et sans confirmation
}}}
!! {{{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.
}}}
!! {{{service_disable}}}
{{{
Désactiver le service $1 pour qu'il ne se lance pas automatiquement au
démarrage
}}}
!! {{{service_enable}}}
{{{
Activer le service $1 pour qu'il se lance automatiquement au démarrage
}}}
!! {{{create_bridge}}}
{{{
Créer un nouveau pont nommé $1 avec les paramètres $2
Si $2 est vide, sa valeur par défaut est
bridge_ports none
bridge_stp off
bridge_fd 2
bridge_maxwait 0
}}}

44
doc/ulib_install.twp Normal file
View File

@ -0,0 +1,44 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/install
!! {{{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
}}}
!! {{{copy_replace}}}
{{{
Copier de façon inconditionnelle le fichier $1 vers le fichier $2
}}}
!! {{{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
}}}
!! {{{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.
}}}
!! {{{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.
}}}
!! {{{copy_tree}}}
{{{
Copier de façon inconditionnelle l'arborescence $1 dans l'arborescence $2
}}}
!! {{{link_new}}}
{{{
S'il $2 n'existe pas, créer le lien symbolique $2 pointant vers $1
}}}

54
doc/ulib_ipcalc.twp Normal file
View File

@ -0,0 +1,54 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/ipcalc
!! {{{get_random_kvm_macaddr}}}
{{{
Obtenir une adresse mac au hasard commençant par 52:54:00 pour KVM
}}}
!! {{{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)
}}}
!! {{{ipcalc_checkip}}}
{{{
Vérifier l'adresse ip $1 pour voir si elle est valide. Si l'adresse est
valide, l'afficher. Sinon, retourner 1
}}}
!! {{{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
}}}
!! {{{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.
}}}
!! {{{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.
}}}
!! {{{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
}}}

29
doc/ulib_java.twp Normal file
View File

@ -0,0 +1,29 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/java
!! {{{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
}}}
!! {{{select_java_exact}}}
{{{
sélectionner la version *exacte* de javac 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
}}}
!! {{{get_default_javahome_prefix}}}
!! {{{get_javaextensions_prefix}}}
!! {{{compute_java_prefixes}}}
!! {{{recompute_java_prefixes}}}
!! {{{get_JAVA_HOME_prefix}}}
!! {{{get_JAVAEXTENSIONS_prefix}}}

View File

@ -0,0 +1,28 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/javaproperties
!! {{{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)
}}}
!! {{{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)
}}}
!! {{{write_properties}}}
{{{
Ecrire les propriétés $2..* dans le fichier $1. Les propriétés sont de la
forme "name=value"
}}}

66
doc/ulib_ldap.twp Normal file
View File

@ -0,0 +1,66 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/ldap
!! {{{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.
}}}
!! {{{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.
}}}
!! {{{compute_ldap_prefixes}}}
!! {{{recompute_ldap_prefixes}}}
!! {{{get_LDAPCONFDIR_prefix}}}
!! {{{get_LDAPOWNER_prefix}}}
!! {{{split_ldapuri}}}
{{{
spliter le ldapuri $1 en $2(=proto), $3(=host) et $4(=port)
}}}
!! {{{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
}}}
!! {{{get_suffix}}}
{{{
obtenir le *premier* suffixe du serveur avec l'uri $1
retourner 1 si la valeur n'a pas pu être obtenue
}}}
!! {{{reldn}}}
!! {{{absdn}}}
{{{
obtenir le dn absolu correspondant au dn $1, le dn de base étant
$2(=$SUFFIX)
}}}
!! {{{subof}}}
{{{
tester si le dn absolu $1 est $2 ou un enfant de $2
}}}
!! {{{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
}}}
!! {{{pdn}}}
{{{
corriger pour *affichage* un dn *absolu*. pour la racine "", afficher
'/'. pour $2(=$SUFFIX), afficher '~'. sinon, afficher le dn relativement à
$2
}}}
!! {{{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
}}}

60
doc/ulib_ldif.twp Normal file
View File

@ -0,0 +1,60 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 02/06/2012 09:54
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/ldif
!! {{{def_match_attr}}}
!! {{{def_match_value}}}
!! {{{uncut_lines}}}
{{{
reformer les lignes qui sont coupées
}}}
!! {{{cut_lines}}}
{{{
couper les lignes trop longues
}}}
!! {{{ensure_complete_objects}}}
{{{
S'assurer que le ldif ne contient que des objets complets (éliminant ainsi
les groupes ayant seulement dn:)
}}}
!! {{{delete_marked_objects}}}
{{{
Supprimer les objets marqués avec --DELETE--:
}}}
!! {{{dump_ldif}}}
!! {{{tl_addattr}}}
!! {{{tl_modifyattr}}}
!! {{{tl_deleteattr}}}
!! {{{tl_deleteentry}}}
!! {{{tl_keepattr}}}
!! {{{tl_keepval}}}
!! {{{tl_excludeattr}}}
!! {{{tl_excludeval}}}
!! {{{tl_keepvalentry}}}
!! {{{tl_excludevalentry}}}
!! {{{tl_replval}}}
!! {{{tl_addval}}}
!! {{{tl_decode}}}
!! {{{tl_encode}}}
!! {{{tl_format}}}
!! {{{dump_headers}}}
!! {{{get_transform_cmd}}}
{{{
Créer une liste de commandes bash à évaluer en fonction des arguments: une
suite de commandes séparées par //
Les variables suivantes peuvent être définies en entrée:
_T_inputfile:
Si cette variable est non vide, lire à partir du fichier $_T_inputfile
au lieu de stdin
_T_uncut_before:
faut-il fusionner automatiquement les lignes *avant* de lancer les
commandes.
_T_cut_after:
faut-il découper automatiquement les lignes *après* avoir lancé les
commandes.
}}}
!! {{{transform}}}

50
doc/ulib_legacy.twp Normal file
View File

@ -0,0 +1,50 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/legacy
!! {{{file_get_vars}}}
{{{
lire les variables dans un fichier
}}}
!! {{{file_set_vars}}}
{{{
écrire les variables dans un fichier. Le fichier *doit exister*
}}}
!! {{{write_all_remaining_vars}}}
!! {{{file_get_properties}}}
{{{
lire les propriétés d'un fichier de propriété java ou xml
}}}
!! {{{file_set_properties}}}
{{{
écrire les propriétés d'un fichier de propriété java ou xml
}}}
!! {{{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
}}}
!! {{{file_set_java_properties}}}
{{{
écrire des propriétés dans un fichier de propriétés java.
}}}
!! {{{write_all_remaining_vars}}}
!! {{{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>
}}}
!! {{{file_set_xml_properties}}}
{{{
écrire des propriétés dans un fichier de propriétés java.
}}}
!! {{{write_all_remaining_vars}}}

24
doc/ulib_macosx.twp Normal file
View File

@ -0,0 +1,24 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 02/06/2012 09:54
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/macosx
!! {{{local_shellfix}}}
{{{
Modifier le compte local $1 pour qu'il utilise bash au lieu de sh
}}}
!! {{{local_usercheck}}}
{{{
Vérifier si le user local $1 existe
}}}
!! {{{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
}}}

9
doc/ulib_mkcrypt.twp Normal file
View File

@ -0,0 +1,9 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/mkcrypt
!! {{{mkcrypt}}}

10
doc/ulib_modeline.twp Normal file
View File

@ -0,0 +1,10 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/modeline
!! {{{printml}}}
!! {{{addml}}}

View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/network-manager-service
!! {{{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
}}}
!! {{{SERVICE_OVERRIDE_network_manager_startx}}}
{{{
cette fonction est le pendant de stopx: penser à relancer network-manager
après avoir démarré le service
}}}

20
doc/ulib_pkg.twp Normal file
View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/pkg
!! {{{pkg_check}}}
{{{
Vérifier que les packages sont installés sur le système
Retourner 123 si le système n'est pas supporté, et donc qu'aucune commande
d'installation de package n'est disponible.
}}}
!! {{{pkg_install}}}
{{{
Installer les packages sans confirmation
Retourner 123 si le système n'est pas supporté, et donc qu'aucune commande
d'installation de package n'est disponible.
}}}

13
doc/ulib_prefixes.twp Normal file
View File

@ -0,0 +1,13 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/prefixes
!! {{{get_USER_prefix}}}
!! {{{get_HOME_prefix}}}
!! {{{expand_prefix}}}
!! {{{list_prefixes}}}
!! {{{dump_prefixes}}}

19
doc/ulib_pretty.twp Normal file
View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/pretty
!! {{{get_color}}}
!! {{{set_verbosity}}}
!! {{{set_interaction}}}
!! {{{show_error}}}
!! {{{show_warn}}}
!! {{{show_info}}}
!! {{{show_debug}}}
!! {{{check_verbosity}}}
!! {{{get_verbosity_option}}}
!! {{{check_interaction}}}
!! {{{get_interaction_option}}}

213
doc/ulib_runs.twp Normal file
View File

@ -0,0 +1,213 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 02/06/2012 09:54
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/runs
!! {{{runs_initdir}}}
{{{
Initialiser le répertoire d'hôte. $1 est un nom d'hôte pleinement
qualifié, et les fichiers sont créés dans le premier répertoire de
RUNSHOSTSDIRS qui convient: si un fichier .udir existe avec un tableau
runs_domains qui contient le domaine de l'hôte spécifié, alors c'est ce
répertoire qui est sélectionné. Sinon, on prend le premier répertoire de
RUNSHOSTSDIRS.
$2 spécifie si le fichier doit être créé avec de l'aide (yes) ou avec le
script minimum (no)
$3 est le contenu à placer dans le fichier sysinfos.conf, s'il n'a pas
déjà été provisionné.
Il faut lancer __runs_setpath avant d'utiliser cette fonction et
RUNSHOSTDIRS ne doit pas être vide
}}}
!! {{{runs_create_rscript}}}
{{{
Créer un modèle de script. Si $2 est spécifié, c'est un nom d'hôte
pleinement qualifié. Le répertoire d'hôte correspondant *doit* exister.
$3 spécifie si le fichier doit être créé avec de l'aide (yes) ou avec le
script minimum (no)
Si $2!="", il faut lancer __runs_setpath avant d'utiliser cette fonction
et RUNSHOSTDIRS ne doit pas être vide
Le chemin du nouveau script est ajouté au tableau new_rscripts
}}}
!! {{{runs_unsupported_system}}}
{{{
Afficher un message d'erreur indiquant que le système actuel n'est pas
supporté, et quitter le script
}}}
!! {{{runs_require_sysinfos}}}
{{{
Vérifier le système actuel avec check_sysinfos(), et afficher un message
d'erreur avec runs_unsupported_system() s'il ne correspond pas à la
requête
}}}
!! {{{runs_find_host}}}
!! {{{runs_add_domain}}}
{{{
Si $1 est nom d'hôte pleinement qualifié, retourner cette valeur
Sinon, lui rajouter le domaine RUNSDOMAIN
}}}
!! {{{runs_find_hostfile}}}
{{{
Trouver et afficher le fichier d'hôte $1 dans les répertoires du tableau
$3(=RUNSHOSTSDIRS), pour l'hôte $2(=$RUNSHOST). Retourner 0 en cas de
succès, 1 en cas d'échec.
Si host=$2 est une valeur non vide, la recherche est effectuée dans
{$RUNSHOSTSDIRS}/$host et {$RUNSHOSTSDIRS}/$domain/$hostname. Sinon,
retourner 1, car il faut spécifier un nom d'hôte.
}}}
!! {{{runs_find_datafile}}}
{{{
Trouver et afficher le fichier de données $1 dans le répertoire $3 s'il
est non vide puis dans les répertoires des tableaux $4(=RUNSSCRIPTSDIRS),
$5(=RUNSMODULESDIRS) et $6(=RUNSHOSTSDIRS), pour l'hôte
$2(=$RUNSHOST). Retourner 0 en cas de succès, 1 en cas d'échec.
- D'abord, si $1 *n'est pas* de la forme "./path" ou "../path", chercher
dans $3.
- Puis si l'hôte est spécifié, chercher dans {$RUNSHOSTSDIRS}/$host et
{$RUNSHOSTSDIRS}/$domain/$hostname.
- Puis chercher dans {$RUNSSCRIPTSDIRS} puis {$RUNSMODULESDIRS}.
- Puis, si $1 est de la forme "./path" ou "../path", chercher dans $3.
- Sinon, retourner 1
}}}
!! {{{runs_initvars}}}
{{{
Initialiser les variables RUNSDIR, RUNSSCRIPT, RUNSDIRPATH,
RUNSSCRIPTPATH, RUNSSCRIPTDIR et RUNSSCRIPTNAME pour le script $1.
Les valeurs sont initialisées comme suit:
RUNSSCRIPT="$(abspath "$1")"
RUNSDIR="$2" (le répertoire de $RUNS*PATH dans lequel a été trouvé le
script)
Si $3!="", RUNSDIRPATH="$3" et RUNSSCRIPTPATH="$4"
Sinon, RUNSDIRPATH="$RUNSSCRIPTDIR" et RUNSSCRIPTPATH="$RUNSSCRIPTNAME"
}}}
!! {{{runs_find_scriptfile}}}
{{{
Trouver sans l'afficher le script $1 dans les répertoires des tableaux
$3(=RUNSSCRIPTSDIRS), $4(=RUNSMODULESDIRS) et $5(=RUNSHOSTSDIRS), en
considérant que le script sera lancé sur l'hôte $2(=$RUNSHOST), et
initialiser les variables RUNSDIR, RUNSSCRIPT, RUNSSCRIPTDIR,
RUNSSCRIPTNAME, RUNSDIRPATH et RUNSSCRIPTPATH. Retourner 0 en cas de
succès, 1 en cas d'échec.
RUNSDIR est le répertoire dans lequel a été trouvé le script (parmi les
valeurs fournies dans les tableaux RUNSSCRIPTSDIRS, RUNSMODULESDIRS,
RUNSHOSTSDIRS), RUNSDIRPATH est le répertoire à partir duquel est exprimé
le chemin du script (i.e RUNSDIRPATH + RUNSSCRIPTPATH == RUNSSCRIPT),
RUNSSCRIPT contient le chemin absolu vers le script, RUNSSCRIPTPATH
contient le chemin du script dans RUNSDIRPATH, RUNSSCRIPTDIR le répertoire
du script, et RUNSSCRIPTNAME le nom du script.
D'abord, si l'hôte est spécifié, chercher dans {$RUNSHOSTSDIRS}/$host et
{$RUNSHOSTSDIRS}/$domain/$hostname. Puis chercher dans {$RUNSSCRIPTSDIRS}
}}}
!! {{{runs_find_scriptfile_reverse}}}
{{{
Soit le fichier de script $1, exprimée de façon absolue, trouver le
fichier parmi les tableaux $3(=RUNSSCRIPTSDIRS), $4(=RUNSMODULESDIRS)
et $5(=RUNSHOSTSDIRS), en considérant que le script sera lancé sur l'hôte
$2(=$RUNSHOST), puis initialiser les variables RUNSDIR, RUNSSCRIPT,
RUNSSCRIPTDIR, RUNSSCRIPTNAME, RUNSDIRPATH et RUNSSCRIPTPATH. Retourner 0
en cas de succès, 1 en cas d'échec.
}}}
!! {{{runs_rscript}}}
{{{
Lancer le fichier $1 comme un script avec les arguments $2..$*. Retourner
la valeur de retour du script.
}}}
!! {{{runs_recipe}}}
{{{
Lancer les scripts de la recette contenue dans le fichier $1. Arrêter au
premier script qui est en erreur
}}}
!! {{{runs_rscriptpath}}}
{{{
Lancer le script $1 avec les arguments $2..$*. Le script est cherché dans
les répertoires de RUNSSCRIPTSPATH. Retourner 123 si le script n'est pas
trouvé, sinon retourner la valeur de retour du script.
}}}
!! {{{runs_recipepath}}}
{{{
Lancer la recette $1. Le fichier de recette est cherché dans les
répertoires de RUNSSCRIPTSPATH. Retourner 123 si le fichier de recette n'a
pas été trouvé, sinon retourner la valeur de retour de runs_recipe()
}}}
!! {{{runs_init}}}
!! {{{runs_initdomains}}}
{{{
Si ce n'est pas déjà le cas, initialiser RUNSDOMAINS en fonction de
/etc/resolv.conf
}}}
!! {{{runs_inithost}}}
!! {{{runs_initsysinfos}}}
!! {{{runs_initworkdir}}}
!! {{{runs_after_export}}}
{{{
après l'export, initialiser varsfile avec les valeurs qu'il faut garder
entre le déploiement local et le déploiement distant.
}}}
!! {{{runs_check_runsscript}}}
!! {{{runs_var}}}
{{{
Initialiser les variables selon les directives données en ligne de
commande.
Les arguments peuvent être une suite de définitions de la forme
'scalar=value', 'scalar!=name', 'array+=value', 'array-=value' ou
'array@=name'.
Sinon, le *dernier* argument peut-être de l'une des formes suivantes:
'array value0 [value1...]' pour initialiser un tableau,
'array+ value0 [value1...]' pour ajouter des valeurs à un tableau,
'array- value0 [value1...]' pour enlever des valeurs à un tableau.
Les formes 'scalar!=value' et 'array@=value' sont des indirections et
permettent d'initialiser la variable avec la valeur d'une autre
variable. L'avantage est que la résolution de la valeur est faite
uniquement lors de l'appel de cette fonction, ce qui est utile avec des
fonction comme 'after -r'
}}}
!! {{{runs_conf}}}
{{{
Activer les flags $*
}}}
!! {{{runs_set_lang}}}
{{{
Charger la valeur de LANG depuis l'environnement. La variable LANG est
initialisée
}}}
!! {{{runs_set_proxy}}}
{{{
Charger la valeur du proxy depuis l'environnement. Les variables
http_proxy, ftp_proxy et no_proxy sont initialisées
}}}
!! {{{runs_check_confs}}}
{{{
Vérifier l'état courant par rapport aux flags
}}}
!! {{{runs_after}}}
{{{
Vérifier que ce script est lancé après le scriptpath $1, par rapport à
RUNSSTORY
}}}
!! {{{runs_clvars}}}
{{{
Traiter les spécifications de variables données en ligne de commande ou
dans un fichier de recettes
}}}
!! {{{runs_indvars}}}
{{{
Résoudre les valeurs effectives des variables qui sont des indirections
}}}
!! {{{runs_clvars_cmd}}}
{{{
écrire la ligne de recette correspondant au script $1 et aux variables
$2..$*
}}}
!! {{{runs_loadconfs}}}
!! {{{runs_clearvars}}}
!! {{{runs_action_desc}}}
!! {{{runs_action_dump}}}
!! {{{runs_action_run}}}
!! {{{runs_action_export}}}
!! {{{shouldrun}}}
!! {{{checkdone}}}
!! {{{requiredone}}}
!! {{{setdone}}}
!! {{{resetdone}}}

33
doc/ulib_service.twp Normal file
View File

@ -0,0 +1,33 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/service
!! {{{service}}}
!! {{{service_start}}}
{{{
démarrer le service $1 de façon inconditionnelle
}}}
!! {{{service_startm}}}
{{{
démarrer le service $1 s'il n'est pas déjà démarré
}}}
!! {{{service_stop}}}
{{{
arrêter le service $1 de façon inconditionnelle
}}}
!! {{{service_stopm}}}
{{{
arrêter le service $1 s'il n'est pas déjà arrêté
}}}
!! {{{service_reload}}}
{{{
recharger le service $1
}}}
!! {{{service_status}}}
{{{
tester/afficher le status du service $1
}}}

36
doc/ulib_sysinfos.twp Normal file
View File

@ -0,0 +1,36 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/sysinfos
!! {{{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
}}}
!! {{{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+
}}}

115
doc/ulib_tiddlywiki.twp Normal file
View File

@ -0,0 +1,115 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/tiddlywiki
!! {{{twget_version}}}
{{{
lire le numéro de version dans le fichier $1
}}}
!! {{{twdump_header}}}
{{{
lire et afficher le contenu avant-storeArea du tiddlywiki $1
}}}
!! {{{twdump_footer}}}
{{{
lire et afficher le contenu après-storeArea du tiddlywiki $1
}}}
!! {{{twdump_storeArea}}}
{{{
lire et afficher le storeArea dans le tiddlywiki $1
}}}
!! {{{twreplace_storeArea}}}
{{{
dans le tiddlywiki $1, remplacer le storeArea par le fichier $2 (par défaut, lu sur stdin)
}}}
!! {{{twupgrade}}}
{{{
mettre à jour le tiddlywiki $1 sur la base du tiddlywiki plus récent $2
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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()
}}}
!! {{{dump_tiddler}}}
!! {{{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.
}}}
!! {{{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()
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{export_to_twpages}}}
{{{
Exporter tous les tiddlers du tiddlywiki $1 dans le répertoire $2
}}}
!! {{{import_from_twpages}}}
{{{
Remplacer les tiddlers du tiddlywiki $1 par les twpages du répertoire $2
}}}

61
doc/ulib_udir.twp Normal file
View File

@ -0,0 +1,61 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/udir
!! {{{udir_check}}}
{{{
Vérifier si le fichier $1 existe
Si $1 est un répertoire, prendre $1/.udir
}}}
!! {{{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
}}}
!! {{{udir_dump}}}
{{{
Dumper toutes les variables définies pour le fichier $1
Si $1 est un répertoire, prendre $1/.udir
}}}
!! {{{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.
}}}
!! {{{udir_dump_all}}}
{{{
Dumper toutes les variables définies pour le répertoire $1 et *tous ses
parents* jusqu'à la racine
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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.
}}}
!! {{{write_unseen}}}
!! {{{udir_edit}}}

8
doc/ulib_uenv.twp Normal file
View File

@ -0,0 +1,8 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/uenv

26
doc/ulib_uenv_update.twp Normal file
View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/uenv_update
!! {{{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.
}}}
!! {{{uenv_set_destdirs}}}
!! {{{uenv_sourced_in}}}
{{{
vérifier que l'un des fichiers $2..$* est sourcé dans $1
}}}
!! {{{uenv_configure_profiles}}}
!! {{{uenv_install_profiles}}}

9
doc/ulib_uinc.twp Normal file
View File

@ -0,0 +1,9 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/uinc
!! {{{uinc}}}

19
doc/ulib_uinst.twp Normal file
View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/uinst
!! {{{uinst}}}
{{{
lancer uinst en déclarant les variables locales, de façon à ne pas polluer
l'environnement de l'appelant.
}}}
!! {{{uinst_nolocal}}}
{{{
Interface en mode ligne de commande pour uinst. Appeler cette fonction
avec les paramètres de la ligne de commande, e.g.:
uinst_clui "$@"
}}}

33
doc/ulib_ulib.twp Normal file
View File

@ -0,0 +1,33 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/ulib
!! {{{eerror}}}
!! {{{die}}}
!! {{{uprovided}}}
{{{
Tester si la ulibrairie $1 a déjà été chargé par urequire
}}}
!! {{{uprovide}}}
{{{
Spécifier que la ulibrairie $1 a été sourcée, ou prétendre que c'est le
cas.
}}}
!! {{{urequire}}}
{{{
Sourcer un fichier recherché dans ULIBDIRS
Si le fichier est DEFAULTS, charger base, pretty, sysinfos et compat à la
place
}}}
!! {{{ulib_add}}}
{{{
Ajouter $1 au chemin de recherche de urequire
}}}
!! {{{ulib_sync}}}
{{{
Synchroniser les librairies ulib dans le répertoire $1
}}}

15
doc/ulib_ulibsh.twp Normal file
View File

@ -0,0 +1,15 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/ulibsh
!! {{{eerror}}}
!! {{{die}}}
!! {{{uprovided}}}
!! {{{uprovide}}}
!! {{{urequire}}}
!! {{{ulib_add}}}
!! {{{ulib_sync}}}

89
doc/ulib_vcs.twp Normal file
View File

@ -0,0 +1,89 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/vcs
!! {{{vcs_getvcs_help}}}
!! {{{vcs_getvcs}}}
!! {{{vcs_getroot_help}}}
!! {{{vcs_getroot}}}
!! {{{vcs_getrepos_help}}}
!! {{{vcs_getrepos}}}
!! {{{vcs_geturl_help}}}
!! {{{vcs_geturl}}}
!! {{{vcs_vcs_help}}}
!! {{{vcs_vcs}}}
!! {{{vcs_add_help}}}
!! {{{vcs_add}}}
{{{
le répertoire de référence est le répertoire du premier fichier ajouté
}}}
!! {{{vcs_remove_help}}}
!! {{{vcs_remove}}}
{{{
le répertoire de référence est le répertoire du premier fichier supprimé
}}}
!! {{{vcs_copy_help}}}
!! {{{vcs_copy}}}
{{{
le répertoire de référence est le répertoire de destination
}}}
!! {{{vcs_move_help}}}
!! {{{vcs_move}}}
{{{
le répertoire de référence est le répertoire de destination
}}}
!! {{{vcs_mkdir_help}}}
!! {{{vcs_mkdir}}}
{{{
le répertoire de référence est le répertoire du premier répertoire créé
}}}
!! {{{vcs_commit_help}}}
!! {{{vcs_commit}}}
!! {{{vcs_status_help}}}
!! {{{vcs_status}}}
!! {{{vcs_update_help}}}
!! {{{vcs_update}}}
!! {{{vcs_diff_help}}}
!! {{{vcs_diff}}}
!! {{{vcs_tag_help}}}
!! {{{vcs_tag}}}
!! {{{git_getrepos}}}
!! {{{git_geturl}}}
!! {{{git_add}}}
!! {{{git_remove}}}
!! {{{git_copy}}}
!! {{{git_move}}}
!! {{{git_mkdir}}}
!! {{{git_commit}}}
!! {{{git_status}}}
!! {{{git_update}}}
!! {{{git_diff}}}
!! {{{git_tag}}}
!! {{{svn_getrepos}}}
!! {{{svn_geturl}}}
!! {{{svn_add}}}
!! {{{svn_remove}}}
!! {{{svn_copy}}}
!! {{{svn_move}}}
!! {{{svn_mkdir}}}
!! {{{svn_commit}}}
!! {{{svn_status}}}
!! {{{svn_update}}}
!! {{{svn_diff}}}
!! {{{svn_tag}}}
!! {{{cvs_getrepos}}}
!! {{{cvs_geturl}}}
!! {{{cvs_add}}}
!! {{{cvs_remove}}}
!! {{{cvs_copy}}}
!! {{{cvs_move}}}
!! {{{cvs_mkdir}}}
!! {{{cvs_commit}}}
!! {{{cvs_status}}}
!! {{{cvs_update}}}
!! {{{cvs_diff}}}
!! {{{cvs_tag}}}

22
doc/ulib_virsh.twp Normal file
View File

@ -0,0 +1,22 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 30/03/2012 04:43
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/virsh
!! {{{virsh_filter}}}
{{{
filtrer une sortie liste de virsh. En pratique, ne prendre que les lignes
non vides à partir de la ligne "----*"
}}}
!! {{{virsh_list}}}
!! {{{virsh_pool_list}}}
!! {{{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
}}}

180
doc/ulib_webobjects.twp Normal file
View File

@ -0,0 +1,180 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/webobjects
!! {{{compute_webobjects_prefixes}}}
!! {{{recompute_webobjects_prefixes}}}
!! {{{get_NEXT_ROOT_prefix}}}
!! {{{get_WOROOT_prefix}}}
!! {{{get_LOCALROOT_prefix}}}
!! {{{get_SYSTEMFRAMEWORKS_prefix}}}
!! {{{get_WOEXTENSIONS_prefix}}}
!! {{{get_WOFRAMEWORKS_prefix}}}
!! {{{get_WOAPPLICATIONS_prefix}}}
!! {{{get_WOCONFIGURATION_prefix}}}
!! {{{get_WOAUTOSTART_prefix}}}
!! {{{get_WOLOGS_prefix}}}
!! {{{get_WOVERSION_prefix}}}
!! {{{is_wobundle}}}
{{{
Tester si $1 a un nom de bundle valide, c'est à dire avec l'extension .woa
ou .framework
}}}
!! {{{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)
}}}
!! {{{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)
}}}
!! {{{get_app_winclspth}}}
{{{
calculer la valeur de Contents/Windows/CLSSPATH.txt pour l'application $1
}}}
!! {{{get_infofile}}}
{{{
Obtenir le chemin vers le fichier Info.plist dans le répertoire de
resource du bundle $1
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{get_jawotoolsfile}}}
{{{
Obtenir le chemin vers le fichier jawotools.properties dans le bundle $1
}}}
!! {{{read_jawotoolsfile}}}
{{{
lire le fichier de propriété $1 et placer les valeurs dans les variables
$2(=version), $3(=releaseDate), $4(=description)
}}}
!! {{{save_jawotoolsfile}}}
{{{
écrire le fichier de propriété $1 avec les valeurs version ($2),
releaseDate ($3) et description ($4)
}}}
!! {{{get_versionfile}}}
{{{
Obtenir le chemin vers le fichier VERSION.txt dans le répertoire de
resource du bundle $1
}}}
!! {{{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)
}}}
!! {{{searchreplace_classpath}}}
{{{
Dans les fichiers classpath de l'application $1, remplacer $2 par $3. Si
$3 est vide, la ligne est supprimée
}}}
!! {{{dump_jars}}}
{{{
Afficher les jars des frameworks utilisés par l'application $1
}}}
!! {{{dump_frameworks}}}
{{{
Afficher les frameworks utilisés par l'application $1
}}}
!! {{{remove_framework}}}
{{{
supprimer le framework $2 (nom de base) des fichiers de classpath du
bundle d'application $1
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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.
}}}
!! {{{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.
}}}
!! {{{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"
}}}
!! {{{wogeturl}}}
!! {{{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
}}}
!! {{{create_wodirs_maybe}}}
!! {{{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
}}}
!! {{{get_autostart_order}}}
{{{
Initialiser le tableau $1 avec la liste donnée dans le fichier
$WOAUTOSTART
}}}
!! {{{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
}}}
!! {{{wotaskd_stop}}}
!! {{{wotaskd_start}}}
!! {{{javamonitor_stop}}}
!! {{{womonitor_stop}}}
!! {{{javamonitor_start}}}
!! {{{womonitor_start}}}
!! {{{woservices_stop}}}
!! {{{woservices_start}}}

12
doc/ulib_woinst.twp Normal file
View File

@ -0,0 +1,12 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/woinst
!! {{{date2version}}}
!! {{{woconf}}}
!! {{{wotag}}}
!! {{{woinst}}}

219
doc/ulib_wondermonitor.twp Normal file
View File

@ -0,0 +1,219 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/wondermonitor
!! {{{wom__statistics}}}
{{{
Afficher les statistiques pour le serveur $1, avec éventuellement le mot
de passe $2
}}}
!! {{{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)
}}}
!! {{{wom__info_filter}}}
{{{
filtrer le résultat de wom__info en ne gardant que les tags
name, state, activeSessions, autoRecover, deaths, host, port
}}}
!! {{{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_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.
}}}
!! {{{show_appinfo}}}
{{{
Afficher des informations sur une application. Les arguments doivent être
le résultat de la fonction wom_info()
}}}
!! {{{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
}}}
!! {{{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)
}}}
!! {{{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
}}}
!! {{{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)
}}}
!! {{{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)
}}}
!! {{{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)
}}}
!! {{{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)
}}}
!! {{{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)
}}}
!! {{{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)
}}}
!! {{{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)
}}}
!! {{{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)
}}}
!! {{{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
}}}
!! {{{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)
}}}
!! {{{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>
}}}
!! {{{wom__getApplications_filter}}}
{{{
filtrer le résultat de wom__getApplications en ne gardant que les tags
name, unixPath, macPath, winPath
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{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
}}}
!! {{{get_error_msg}}}
!! {{{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.
}}}
!! {{{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.
}}}
!! {{{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.
}}}

19
doc/ulib_wosign.twp Normal file
View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/wosign
!! {{{wosign_setup_maybe}}}
!! {{{wosign_jar}}}
!! {{{wosignable}}}
!! {{{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
}}}

12
doc/ulib_wotaskd.twp Normal file
View File

@ -0,0 +1,12 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:15
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulib/wotaskd
!! {{{wot_config}}}
{{{
Afficher la configuration de wotaskd
}}}

23
doc/ulibshell.twp Normal file
View File

@ -0,0 +1,23 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulibshell
{{{
ulibshell: Lancer un shell après avoir chargé des modules de ulib
USAGE
ulibshell [options] [args...]
OPTIONS
-r module
Spécifier un module à charger avec urequire. Plusieurs modules peuvent
être spécifiés en les séparant par ':'
Un shell est lancé dans lequel les modules spécifiés sont chargés. Par défaut,
seul le module DEFAULTS est chargé. Les arguments sont passés inchangés au
shell.
}}}

18
doc/ulibsync.twp Normal file
View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: ulibsync
{{{
ulibsync: Copier les librairies ulib et/ou pyulib
USAGE
ulibsync [options] destdir
OPTIONS
-u Copier ulib
-p Copier pyulib
}}}

29
doc/umatch.twp Normal file
View File

@ -0,0 +1,29 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: umatch
{{{
umatch: Afficher le résultat d'une recherche par regexp
USAGE
umatch [options] <regexp>
Chaque ligne de stdin est matchée pas rapport à l'expression regulière avec la
syntaxe de awk. S'il y a correspondance, afficher soit toute l'expression
matchée, soit chaque groupe s'il y a des expressions parenthésées, chacun des
groupes étant séparé par le caractère sep.
regexp peut avoir l'une des valeurs suivantes, qui correspondent à des
expressions régulières prédéfinies:
ip --> [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
OPTIONS
-F sep
Spécifier le caractère séparateur s'il y a des champs multiples. Par
défaut, utiliser le caractère ':'
}}}

17
doc/umirror.twp Normal file
View File

@ -0,0 +1,17 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: umirror
{{{
umirror: faire un miroir d'un site web
USAGE
umirror [options] url [wget_options]
OPTIONS
-l Convertir les liens pour consultation locale
}}}

157
doc/update.sh Executable file
View File

@ -0,0 +1,157 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/../ulib/ulib" &&
urequire DEFAULTS ||
exit 1
OENC="$UTF8"
function display_help() {
local OENC="$UTF8"
uecho "$scriptname: Mettre à jour la documentation pour les outils de nutools
USAGE
$scriptname [options]
OPTIONS
-t Ne générer la documentation que pour les outils
-l Ne générer la documentation que pour ulib
-s Synchroniser avec nutools.html après la génération de la documentation
Par défaut, la documentation est (re)générée pour les outils et pour ulib"
}
function dump_content() {
local twpage="$1" content="$2"
if [ -f "$twpage" ]; then
awk '
BEGIN { dump = 0 }
!dump && ($0 == "" || $0 ~ /^[^#]/) { dump = 1 }
dump { print }' <"$twpage" >"$content"
else
>"$content"
fi
}
function write_twpage() {
local oldcontent="$1" title="$2" newcontent="$3" twpage="$4"
if testdiff "$oldcontent" "$newcontent"; then
local created="$(date +"%d/%m/%Y %H:%M")"
echo "# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: $USER
##@created: $created
##@modifier: $USER
##@changecount: 1
##@tags:
##@title: $title" >"$twpage"
cat "$newcontent" >>"$twpage"
fi
}
auto=1
tools=
ulib=
sync=
force=
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-t '$auto=; tools=1' \
-l '$auto=; ulib=1' \
-s '$auto=; sync=1' \
--force force=1 \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
[ -n "$auto" ] && {
tools=1
ulib=1
sync=1
}
ac_set_tmpfile oldcontent
ac_set_tmpfile newcontent
cd "$scriptdir"
if [ -n "$tools" ]; then
if [ -n "$*" ]; then
cmds=("$@")
else
array_lsfiles cmds ..
fi
for cmd in "${cmds[@]}"; do
cmdname="$(basename "$cmd")"
twpage="$cmdname.twp"
[ -x "$cmd" ] || continue
estep "$cmdname"
dump_content "$twpage" "$oldcontent"
echo "
{{{
$("$cmd" --help)
}}}" >"$newcontent"
write_twpage "$oldcontent" "$cmdname" "$newcontent" "$twpage"
done
fi
if [ -n "$ulib" ]; then
array_from_lines ulibnames "$(list_files ../ulib)"
# faire l'entête
dump_content ulib.twp "$oldcontent"
echo "
!Liste des librairies de ulib" >"$newcontent"
for ulibname in "${ulibnames[@]}"; do
echo "* [[ulib/$ulibname]]" >>"$newcontent"
done
write_twpage "$oldcontent" ulib "$newcontent" ulib.twp
# faire les pages
for ulibname in "${ulibnames[@]}"; do
ulib="../ulib/$ulibname"
twpage="ulib_$ulibname.twp"
title="ulib/$ulibname"
dump_content "$twpage" "$oldcontent"
awkrun 'BEGIN {
in_func = 0
dump_doc = 0
dumped_doc = 0
print
}
!in_func && $0 ~ /^function / {
if (match($0, /function +([^ ]+)\(\)/, vs)) {
funcname = vs[1]
if (funcname !~ /^_/) {
in_func = 1
dump_doc = 1
dumped_doc = 0
print "!! {{{" funcname "}}}"
if ($0 ~ /}$/) {
in_func = 0
dump_doc = 0
dumped_doc = 0
}
next
}
}
}
in_func && dump_doc && $0 !~ /^ *#/ {
dump_doc = 0
}
in_func && dump_doc && $0 ~ /^ *#/ {
if (!dumped_doc) print "{{{"
gsub(/^ *#+ */, "")
print
dumped_doc = 1
}
in_func && $0 ~ /}$/ {
if (dumped_doc) print "}}}"
in_func = 0
dump_doc = 0
dumped_doc = 0
}
END { if (in_func) print "}}}" }
' <"$ulib" >"$newcontent"
write_twpage "$oldcontent" "$title" "$newcontent" "$twpage"
done
fi
if [ -n "$sync" ]; then
../twsync ${force:+--force}
fi

21
doc/uprefix.twp Normal file
View File

@ -0,0 +1,21 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: uprefix
{{{
uprefix: Afficher les préfixes valides pour uinst
USAGE
uprefix -l|--dump|prefix...
OPTIONS
-l Afficher la liste des préfixes valides
--dump
Afficher la liste des préfixes valides et leurs valeurs
prefix
Afficher la valeur du préfixe spécifié
}}}

75
doc/uproject.twp Normal file
View File

@ -0,0 +1,75 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: uproject
{{{
uproject: Outil pour gérer des projets
USAGE
uproject cmd [args]
COMMANDS
getvcs [dir]
Afficher le type de VCS pour dir.
getroot [dir]
Si dir est un répertoire versionné, retourner le répertoire racine du
projet versionné.
getrepos [dir]
Si dir est un répertoire versionné, retourner l'url du repository du
projet versionné.
geturl [dir]
Si dir est un répertoire versionné, retourner son url dans le
repository.
fold [dir]
unfold [dir]
Utiliser uinc pour défaire (resp. refaire) toutes les inclusions des
fichiers de dir. Cela ne fonctionne que si un fichier .uir est configuré
à la racine du projet avec inc=true (ou un fichier .uinst.conf avec
update_inc=true
vcs [args]
Appeler le gestionnaire de gestion approprié avec les arguments donnés.
add files...
Ajouter les fichiers files dans le gestionnaire de version.
remove files...
Supprimer les fichiers versionnés files.
copy from to
Copier le fichier versionné from vers le fichier to.
move from to
Renommer le fichier versionné from vers le fichier to.
mkdir dir
Créer un nouveau répertoire versionné.
commit message [files...]
Enregistrer les modifications (par défaut sur tous les fichiers
modifiés) avec le commentaire message.
status
Afficher l'état des fichiers versionnés et non versionnés.
update [-x]
Mettre à jour la copie locale avec la copie sur le serveur.
-x Ne pas mettre à jour les références externes (si appliquable)
diff [options]
Afficher les différences.
-l Afficher les différences non commitées (par défaut)
-c Afficher les différences en passe d'être commitées (si appliquable)
-r REV
Afficher les différences depuis la révision REV.
-R Afficher les modifications effectuées depuis la dernière release.
printml [-t TYPE]
Afficher le modeline pour un fichier du type spécifié
addml [-t TYPE] file
Ajouter un modele pour le fichier spécifié, s'il n'en a pas déjà un.
Si nécessaire, forcer le type du fichier au lieu de l'autodétecter
new [options] file [template options]
Créer un nouveau fichier à partir d'un modèle.
Avant le nom du fichier, les options suivantes sont valides:
-t TEMPLATE
Spécifier le modèle de fichier à utiliser. Par défaut, le modèle
à utiliser est déduit de l'extension ou du nom du fichier.
-e Editer le fichier après l'avoir créé.
Après le nom du fichier, toutes les options sont spécifiques au modèle
utilisé pour créer le nouveau fichier. Utiliser l'option --help pour
avoir une description des options disponibles.
}}}

Some files were not shown because too many files have changed in this diff Show More