Compare commits

..

No commits in common. "master" and "9.12.0" have entirely different histories.

410 changed files with 58971 additions and 6873 deletions

View File

@ -1,183 +1,3 @@
## Version 11.4.0 du 27/02/2025-08:44
* `7cc9629` modifs.mineures sans commentaires
* `df3986e` maj chemins registres
* `e674b31` améliorer la prise en charge de dkbuild imbriqué
* `7611760` paramètres par défaut pour dkbuild
* `056ae57` maj doc dkbuild -c
* `6f9ab14` support java 21
* `c9eaf7d` maj dkbuild.env par défaut
* `693f447` maj fichier dkbuild.env
* `6e23aae` maj config par défaut
## Version 11.3.1 du 31/12/2024-15:05
* `b9f264f` bug avec dkbuild -e
* `737179b` modifs.mineures sans commentaires
* `2687e72` support minimal runphp
## Version 11.3.0 du 24/09/2024-16:02
* `625d5f1` bug mineur
* `e308202` dkbuild: améliorer from_glob()
* `5c03184` lgrep, lless: modifier la doc pour ne parler que d'un fichier
## Version 11.2.0 du 21/06/2024-20:34
* `21042e4` bug
* `e4176df` reginc: possibilité de renommer des fichiers
* `1787aa2` bug
* `d1f77aa` dkbuild: support dist none et tag LATEST
* `c2cfd77` bug
* `e7745c2` dk: support --plain-output
* `ce8f541` dkbuild: -g pour --profile
* `30594aa` maj distributions
* `2df175e` dkbuild: cosmetic
* `fbb05f8` support des versions AMUE
## Version 11.1.0 du 01/02/2024-20:59
* `8570d12` pff: les répertoires liés peuvent contenir des fichiers
* `5d6c6b4` synchroniser pff et nulib/pff
* `90bda71` pff: support des répertoires liés
* `7d7b88a` autoriser les feature branches qui commencent par wip/
* `5cc1826` dk et dkbuild: support .composer.yaml et setup_image
* `0bf0f48` dk: support ~/.dkbuild.env
* `b818e11` dkbuild: ajout de --plain
* `ad14de3` dkbuild: configuration profil prod par défaut
* `54a5b54` Sscreen: support des cas où screen n'est pas dans le PATH
* `5a06851` dkbuild: support profil par défaut
* `a855b04` dkbuild: les versions de profil sont ordonnées comme les versions de distribution
* `e531553` dkbuild: sans --all-profiles, ne build que dans le profil par défaut
* `db1467b` bug
* `3123d8e` dkbuild: mappings par défaut
* `d9b1485` charnière entre java 8 et java 11
* `744a3fa` dkbuild: indiquer si la version de Java demandée n'est pas trouvée
* `2803868` dkbuild: marquer plus d'action comme étant du build
* `4f7bc3f` dkbuild: bug avec -u seul
* `8cdc3cb` modifs.mineures sans commentaires
## Version 11.0.0 du 05/09/2023-14:29
* `ddfbc00` maj des images par défaut dk et dkbuild
* `e33f2a5` ajout registry privé
* `f245e17` image par défaut en prod
* `efe31b8` support java17
* `5cb4112` dkbuild: bug profil unitaire
* `f424f41` dkbuild: -u n'implique plus -b
* `e5a1473` dkbuild: implémenter -u
## Version 10.0.0 du 12/08/2023-21:06
* `bfdf9b5` support système sans python2
* `108215f` maj registry pour devel
* `6ddb870` dkbuild: support profil nu
* `c0b130f` dkbuild: support profil jclain
* `ae20e49` modifs.mineures sans commentaires
* `2e5101d` ajout de lgrep
* `cff4833` ajout de ldiff
* `9c6e7a8` renommer less1 en lless
* `e9d52d8` ajout de less1 pour lire des fichiers latin1
* `d3d86c6` cssh: forcer la désactivation du verrouillage de la session
* `b761cb6` Sscreen: désactiver verrouillage de la session
## Version 9.16.0 du 15/06/2023-15:28
* `f36be0d` uscrontab: s'assurer que USER est défini
* `63674ef` cosmetic
* `ee80091` cosmetic
## Version 9.15.0 du 14/06/2023-15:41
* `2a02307` update-nutools: prendre le dépôt public par défaut
* `27a82e4` ajouter les numéros de version des debian et ubuntu
* `92157de` regins: implémentation initiale
* `efe9fbb` dk: ajout de XX pour prune-cache
* `dc94b5c` dkbuild: bug avec les chemins
* `5e87665` dk: X supprimer aussi le cache
* `9c1a8e6` dk: composer.phar est cherché dans sbin/ aussi
* `81cefdc` regcp: activer support regexp-extended
* `c5796d6` modifs.mineures sans commentaires
* `6919352` maj du message de commit par défaut
* `7ba7d1c` pcxone: correction de l'url généré des dépôts git
* `9d75943` repoctl: correction de l'url généré des dépôts git
## Version 9.14.0 du 15/03/2023-17:48
* `3ecb127` support docker compose v2
* `432ab6f` dkbuild: composer et mvn ne sont lancés qu'en mode build
* `01c14bb` regcp: ajout de l'option -n
* `0913c2e` upassword: rendre configurable le nombre de blocs
* `61433fb` dkbuild: revert image par défaut pour javabuilder
* `e4e0a55` pff: support mode vcs offline
* `e08c66b` pff: support des archives sh de l'amue
* `0d11932` dkbuild: corriger l'image javabuilder par défaut
* `3ead1f3` dkbuild: utiliser automatiquement l'image si nécessaire pour composer ou maven
* `93de256` ajout de regcp et regmv
* `5e33a36` rendre cohérent les en-têtes des scripts
* `9e13515` ajout exemple .dkbuild.env
* `c9e8110` dkbuild: corriger calcul des tags
* `c671cb3` dkbuild: fin support tag & last version
* `1a764f1` dkbuild: début support tag & last version
* `027f9b8` dkbuild: ajout de from_glob()
* `2293239` maj doc
* `9fc07bb` dkbuild: ajout build add-tags=
* `7b15f94` dkbuild: support préfixe et suffixe pour version
* `f2cfaee` dkbuild: calculer extract automatiquement
* `c36b8fb` dkbuild: corriger le support des paramètres sans argument
* `68a42d0` dkbuild: maj templates
* `306e77f` dkbuild: calcul de la version à partir d'un fichier ou d'un chemin
* `b006bb4` Maj des fichiers
* `6963d41` uproject: push -f force le push
* `9665d5a` cx-conndev: maj doc
* `137dfa9` repoctl, uproject: ne plus enlever le suffixe .git
* `440d2aa` upassword: maj nombre de blocs par défaut
* `f4047a3` ipaddr: forcer la sortie couleur
* `af1bdd3` Maj des fichiers
* `85e77e4` dkbuild: corriger le calcul de la dernière version d'une distribution
* `a56ec0e` dkbuild: améliorer clean
* `d6e78b9` dkbuild: maj messages debug
* `1699cc5` dkbuild: les fichiers d'environnement par défaut ont l'extension .env
* `2ae8406` maj doc dkbuild
* `1db7d08` maj doc cx-shelldev
* `aba08c2` maj update-nutools
* `e83b6d1` possibilité de choisir l'adresse IP
* `af9096d` ajouter le template fichier vide
* `89f0c09` typo
* `fb434c2` bug parse_date
* `f7ab14f` dkbuild: implémentation initiale
* `f46812f` cx-conndev: maj doc
## Version 9.13.0 du 07/02/2022-22:20
* `06686d9` pff: support nettoyage wsdl/
* `9a018a6` pdev: ajout de --check
* `a932a1a` la branche par défaut est master en prod
* `cb09f4d` maj template yaml
* `f895222` foreach: rendre -g et -S compatibles
* `4f7bcbc` maj template CSS
* `5cdd93d` upassword: réintégrer password wom
* `7030b87` dk: ajouter mvn_action=install
* `8a682ed` upassword: changer le générateur aléatoire
* `a85cdf6` Maj des fichiers
* `d75783b` dmcerts: cosmetic
* `11e6021` dmcerts: certificat client avec la même durée que le CA
* `938307c` ajout dmcerts
* `8b49084` typo
* `98c1ac8` ajouter le support de bullseye
* `28d42b0` authftp: support des mots de passe avec des caractères spéciaux
* `dfdfd59` sélectionner java 1.6 par défaut pour worun
* `6af0359` pff: ajout de la commande normalisée new_cmd_amue_clean_libs
* `b3a44d0` pff: bug
* `111463a` pff: ajout AUTO_CMDS et NEW_CMDS, supprimer MKDIRS
* `fe839f4` woinst: bug
* `ba8e1a1` upasword: ajout des mot de passe javamonitor de webobjects
* `a75b91e` network: utiliser 127.0.1.1 pour dhcp
* `dfb5fc3` maj ulib/redhat
* `40c9cb9` supprimer docker/ qui est obsolète
* `580e20b` supprimer nulib de la distribution de nutools
* `da28d8b` pff: changer le format des fichiers de version
## Version 9.12.0 du 29/03/2021-09:41
* `3d54e37` pff: bug origext

View File

@ -1,7 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
urequire service
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS service
function display_help() {
uecho "$scriptname: s'assurer que les services sont lancés pour un type de virtualisation

4
SKvm
View File

@ -1,7 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
urequire virsh
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS virsh
function display_help() {
uecho "$scriptname: lancer une machine virtuelle kvm

View File

@ -1,6 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: lancer une machine virtuelle VirtualBox

21
Sscreen
View File

@ -1,9 +1,6 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# désactiver le verrouillage
export LOCKPRG=/bin/true
COULEUR_NORMALE=$'\e[0m'
COULEUR_ROUGE=$'\e[31;1m'
COULEUR_VERTE=$'\e[32;1m'
@ -18,25 +15,15 @@ function __ask() {
}
function __auto_screen() {
# Si on est déjà dans screen, ne rien faire
[ -z "$STY" ] || return
# Si screen pas installé, ne rien faire
local dir screen="$(which screen 2>/dev/null)"
if [ -z "$screen" ]; then
for dir in /usr/local/bin /opt/bin /usr/bin /bin; do
if [ -x "$dir/screen" ]; then
screen="$dir/screen"
PATH="$PATH:$dir"
break
fi
done
fi
if [ -z "$screen" ]; then
if [ -z "$(which screen 2>/dev/null)" ]; then
echo "${COULEUR_JAUNE}WARNING${COULEUR_NORMALE} screen introuvable. une session bash classique sera lancée"
exec /bin/bash -l
fi
# Si on est déjà dans screen, ne rien faire
[ -z "$STY" ] || return
# corriger TERM pour les vieilles versions de Linux
case "$TERM" in
xterm*) TERM=xterm;;

22
TODO.md
View File

@ -1,25 +1,3 @@
# TODO
dkbuild
* setversion peut prendre la version depuis la branche git d'un dépôt
* un argument permettrait de spécifier comment la version est calculée à
partir du dépôt
* si cela a du sens, une commande setlatest qui permet de désigner quelle
distribution/version est la dernière
git push
* ajouter le support pour le mode DEBUG
~~~
export GIT_TRACE=1
export GIT_TRANSFER_TRACE=1
export GIT_CURL_VERBOSE=1
~~~
* ajouter le support http basique pour git lfs en cas de problème pour upload de certains fichiers
~~~
git config --add lfs.basictransfersonly true
~~~
ou le mettre dans un fichier .lfsconfig
cf https://github.com/git-lfs/git-lfs/blob/main/docs/man/git-lfs-config.adoc
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1 +1 @@
11.4.0
9.12.0

2
_root
View File

@ -1,6 +1,6 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/ulib" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire base
function display_help() {

View File

@ -1,7 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
urequire template apache.tools
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS template apache.tools
apacheconfig_initvars
function display_help() {

View File

@ -1,6 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: Se connecter sur un site FTP authentifié
@ -83,7 +84,6 @@ read_value -i "Entrez le chemin" path "$4" N
if [ -n "$lftp" ]; then
if [ -n "$noproxy" ]; then
export LFTP_PASSWORD="$password"
if [ -n "$sftp" ]; then
url="sftp://$host/$path"
hostkeyfailed_apropos "$login@$host"
@ -92,13 +92,12 @@ if [ -n "$lftp" ]; then
fi
exec lftp "${options[@]}" -e "\
set ssl:verify-certificate $verify_certificate
open -u $login --env-password $url"
open -u $login,$password $url"
else
export LFTP_PASSWORD="${password}@${my_password}"
url="ftp://$AUTHFTP_PROXY_HOST/$path"
exec lftp "${options[@]}" -e "\
set ssl:verify-certificate $verify_certificate
open -u ${login}@${my_login}@${host} --env-password $url"
open -u ${login}@${my_login}@${host},${password}@${my_password} $url"
fi
else
if [ -n "$noproxy" ]; then

3
caturl
View File

@ -1,6 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: Afficher une url

View File

@ -1,6 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: créer un utilisateur sudoer et lui installer une clé publique ssh

8
cssh
View File

@ -1,6 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: Faire une connexion ssh en lançant automatiquement un screen sur l'hôte distant
@ -23,14 +24,13 @@ eval "$vars"
[ "${#hosts[*]}" -gt 0 ] || die "Vous devez spécifier l'hôte sur lequel se connecter"
[ ${#args[*]} -gt 0 ] && cmd="$(qvals "${args[@]}"); " || cmd=
cmd="$cmd
export LOCKPRG=/bin/true; $(<"$scriptdir/Sscreen")"
cmd="$cmd$(<"$scriptdir/Sscreen")"
cmd="'${cmd//\'/\'\\\'\'}'"
for host in "${hosts[@]}"; do
"$ssh" \
"${options[@]}" -qt "$host" -- \
"export LOCKPRG=/bin/true; [ -x /usr/local/nutools/Sscreen ] && exec /usr/local/nutools/Sscreen $(qvals "${args[@]}") || exit 123"
"[ -x /usr/local/nutools/Sscreen ] && exec /usr/local/nutools/Sscreen $(qvals "${args[@]}") || exit 123"
if [ $? -eq 123 ]; then
# pas de Sscreen en face, le faire à la main
${exec:+exec} \

View File

@ -1,26 +1,18 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
[ -n "$COMPOSE_V1" ] && DOCKER_COMPOSE=(docker-compose) || DOCKER_COMPOSE=(docker compose)
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: se connecter à la base MySQL
USAGE
$scriptname [DATABASE]
$scriptname -d [-uUSER [-pPASSWORD]] DATABASES... >backup.sql
$scriptname -c [-uUSER [-pPASSWORD]] <backup.sql
$scriptname -c|-d [-uUSER [-pPASSWORD]] ...
OPTIONS
--compose-v1
Forcer l'utilisation de docker-compose v1
-h, -s, --service SERVICE
Spécifier le nom du service. La valeur par défaut est db
-i, --ipnum IPNUM
Si le service est dans plusieurs réseaux, sélectionner le numéro du
réseau à attaquer en commençant à 1 (la liste sera affichée si cette
option n'est pas spécifiée)
-c, --mysql-cmd
Lancer 'mysql -hSERVICE_IP' avec les arguments supplémentaires fournis
sur la ligne de commande
@ -36,7 +28,6 @@ OPTIONS
}
service=db
ipnum=
mysql_cmd=
mysqldump_cmd=
klean=
@ -44,9 +35,7 @@ user=
password=
args=(
--help '$exit_with display_help'
--compose-v1 '$DOCKER_COMPOSE=(docker-compose)'
-h:,-s:,--service: service=
-i:,--ipnum: ipnum=
-c,--mysql-cmd mysql_cmd=1
-d,--mysqldump-cmd mysqldump_cmd=1
-k,--klean klean=1
@ -77,26 +66,12 @@ fi
###
function die_not_found() { die "$service: service introuvable. vérifiez que le projet est actuellement up"; }
setx cid="${DOCKER_COMPOSE[@]}" ps -q "$service" 2>/dev/null || die_not_found
setx cid=docker-compose ps -q "$service" 2>/dev/null || die_not_found
[ -n "$cid" ] || die_not_found
edebug "$service id: $cid"
function die_not_found() { die "$service: $cid: ip introuvable"; }
setx ip=docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}},{{end}}' "$cid" || die_not_found
[ -n "$ip" ] || die_not_found
ipdesc="${ip%,}"
if [ -z "$ipnum" ] && [[ "$ipdesc" == *,* ]]; then
enote "Le service est accessible sur plusieurs adresses ip: $ipdesc"
enote "Pensez à spécifier l'option -i pour désigner l'adresse à utiliser (-i1 pour la première, -i2 pour la seconde, etc.)"
fi
if [ -n "$ipnum" ]; then
let ipnum=ipnum-1
while [ $ipnum -gt 0 ]; do
ip="${ip#*,}"
let ipnum=ipnum-1
done
fi
ip="${ip%%,*}"
setx ip=docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$cid" || die_not_found
[ -n "$ip" ] || die_not_found
edebug "$service ip: $ip"
@ -112,7 +87,7 @@ elif [ -n "$klean" ]; then
estep "wait 10sec..."
sleep 10
estep "start"
"${DOCKER_COMPOSE[@]}" start "$service"
docker-compose start "$service"
else
[ -f bin/conndev.php ] || die "Impossible de trouver le script compagnon conndev.php"

View File

@ -1,33 +1,29 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
[ -n "$COMPOSE_V1" ] && DOCKER_COMPOSE=(docker-compose) || DOCKER_COMPOSE=(docker compose)
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: ouvrir un shell dans le container
USAGE
$scriptname [CMD...]
$scriptname [SHELL]
OPTIONS
--compose-v1
Forcer l'utilisation de docker-compose v1
-h, -s, --service SERVICE
Spécifier le nom du service sur lequel ouvrir le shell
-d, --db
-d
équivalent à -s db
-w, --web
-w
équivalent à -s web (c'est la valeur par défaut)"
}
service=web
args=(
--help '$exit_with display_help'
--compose-v1 '$DOCKER_COMPOSE=(docker-compose)'
-h:,-s:,--service: service=
-d,--db service=db
-w,--web service=web
-d service=db
-w service=web
)
parse_args "$@"; set -- "${args[@]}"
@ -52,9 +48,9 @@ fi
###
setx cid="${DOCKER_COMPOSE[@]}" ps -q "$service" 2>/dev/null || die "$service: service introuvable"
setx cid=docker-compose ps -q "$service" 2>/dev/null || die "$service: service introuvable"
cmd=("$@")
[ ${#cmd[*]} -gt 0 ] || cmd=(bash)
"${DOCKER_COMPOSE[@]}" exec "$service" "${cmd[@]}"
docker-compose exec "$service" "${cmd[@]}"

View File

@ -1,6 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: mettre à jour un module ur/* ou lib/* sans utiliser composer

224
dk
View File

@ -1,6 +1,6 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/auto" || exit 1
urequire pff json
function display_help() {
@ -179,9 +179,7 @@ COMMANDES
sélectionner que les images correspondant au filtre qui ont le tag
spécifié.
X|prune
XX|prune-cache
Supprimer les containers, les images et avec prune-cache, les objets
caches inutilisées
Supprimer les containers et les images inutilisées
composer|ci|cu|cr|cs [args...]
Frontend pour lancer composer à l'intérieur d'un container.
@ -222,15 +220,14 @@ COMMANDES
pour lancer l'image docker. La valeur par défaut est -u, ce qui force
l'utilisation de l'instance docker locale.
* COMPOSER_CMD -- Chemin vers l'exécutable composer. Par défaut,
utiliser composer.phar s'il existe dans le répertoire du projet ou
dans un sous-répertoire sbin/. Sinon utiliser /usr/bin/composer
utiliser composer.phar s'il existe dans le répertoire du projet. Sinon
utiliser /usr/bin/composer
* COMPOSER_SETUP -- Liste de commandes à lancer pour configurer le
container. Dans ce cas, un container ayant pour base \$COMPOSER_IMAGE
et nommé d'après le nom du projet est préparé et les commandes
spécifiées y sont lancées. Ce container est réutilisé à chaque fois.
Ce paramétrage est utilisé pour par exemple installer certains
packages nécessaire au projet.
* COMPOSER_SETUP_IMAGE -- nom final de l'image pour COMPOSER_SETUP
La commande 'rshell' est une extension qui lance un shell bash au lieu
de lancer la commande composer, ce qui permet de faire des opérations
plus complexes si le besoin s'en fait sentir. NB: le shell est lancé
@ -268,7 +265,6 @@ COMMANDES
spécifiées y sont lancées. Ce container est réutilisé à chaque fois.
Ce paramétrage est utilisé pour par exemple installer certains
packages nécessaire au projet.
* MAVEN_SETUP_IMAGE -- nom final de l'image pour MAVEN_SETUP
La commande 'rshell' est une extension qui lance un shell bash au lieu
de lancer la commande mvn, ce qui permet de faire des opérations
plus complexes si le besoin s'en fait sentir. NB: le shell est lancé
@ -336,8 +332,6 @@ OPTIONS build
deploy, by, bpy et update impliquent --stack
-j, --no-cache
Ne pas utiliser le cache lors du build
--plain-output
Afficher la sortie complète des containers lors du build
-U, --pull
Essayer de récupérer une version plus récente de l'image source
-g, --ug, --no-update-apps
@ -455,7 +449,7 @@ VARIABLES de update-apps.conf
ORIGIN
vaut 'origin' par défaut
BRANCH
vaut par défaut 'master' dans le profil prod, 'develop' sinon
vaut 'develop' par défaut
Pour toutes les variables de type BRANCH, utiliser la syntaxe ^COMMIT
pour ignorer ORIGIN et sélectionner un commit en particulier
TYPE
@ -500,11 +494,9 @@ VARIABLES de update-apps.conf
MAVEN_ACTION
vaut 'package' par défaut. Indique ce qu'il faut faire pour un projet de
type 'maven' après avoir lancé les commandes de BEFORE_BUILD et avant
les commandes de AFTER_UPDATE. Les directives supportées sont:
- 'install' (alias de 'clean package install')
- 'package' (alias de 'clean package')
- 'package_only' qui ne lance pas de clean avant le build
- 'none' qui ne fait rien
les commandes de AFTER_UPDATE. Les directives supportées sont 'package'
(alias de 'clean package'), 'package_only' qui ne lance pas de clean
avant le build, et 'none'
MAVEN_ARGS
options à utiliser avec la commande 'mvn \$MAVEN_ACTION'
@ -853,7 +845,8 @@ function build_update_apps() {
DEFAULT_ORIGIN="$UPDATE_APPS_ORIGIN"
[ -z "$DEFAULT_ORIGIN" ] && DEFAULT_ORIGIN=origin
DEFAULT_BRANCH="$UPDATE_APPS_BRANCH"
[ -z "$DEFAULT_BRANCH" -a "$PROFILE" == prod ] && DEFAULT_BRANCH=master
#XXX à terme, ne déployer en prod que la branche master
[ -z "$DEFAULT_BRANCH" -a "$PROFILE" == prod ] && DEFAULT_BRANCH=develop #XXX master
[ -z "$DEFAULT_BRANCH" ] && DEFAULT_BRANCH=develop
CLEAN=
APPS=()
@ -1087,10 +1080,10 @@ function build_update_apps() {
estep "Type de dépôt: $TYPE"
if [ "$TYPE" == composer ]; then
local cvname cvvalue
local composer_php composer_php_max composer_image composer_cmd composer_setup composer_setup_image composer_action
local composer_php composer_php_max composer_image composer_cmd composer_setup composer_action
local -a composer_vars composer_args
for cvname in composer_php composer_php_max composer_image composer_cmd composer_setup composer_setup_image; do
for cvname in composer_php composer_php_max composer_image composer_cmd composer_setup; do
cvvalue="${var}_${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}"
[ -n "$cvvalue" ] || { cvvalue="${var}_${cvname^^}"; cvvalue="${!cvvalue}"; }
[ -n "$cvvalue" ] || { cvvalue="${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}"; }
@ -1126,10 +1119,10 @@ function build_update_apps() {
fi
elif [ "$TYPE" == maven ]; then
local cvname cvvalue
local maven_java maven_image maven_cmd maven_setup maven_setup_image maven_action
local maven_java maven_image maven_cmd maven_setup maven_action
local -a maven_vars maven_args
for cvname in maven_java maven_image maven_cmd maven_setup maven_setup_image; do
for cvname in maven_java maven_image maven_cmd maven_setup; do
cvvalue="${var}_${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}"
[ -n "$cvvalue" ] || { cvvalue="${var}_${cvname^^}"; cvvalue="${!cvvalue}"; }
[ -n "$cvvalue" ] || { cvvalue="${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}"; }
@ -1150,16 +1143,15 @@ function build_update_apps() {
if [ -z "$BUILD_UPDATE_DEVEL" ]; then
case "$maven_action" in
install|"clean package install"|cpi|i) maven_action="clean package install";;
package|"clean package"|cp|p) maven_action="clean package";;
package_only|po) maven_action="package";;
"clean package"|package|cp|p) maven_action="clean package";;
none|nop) maven_action=;;
*) ewarn "$maven_action: action non standard. elle sera utilisée en l'état";;
*) ewarn "$maven_action: action invalide"; maven_action=;;
esac
if [ -n "$maven_action" ]; then
estep "Compilation du projet maven"
setx cwd=pwd
cd "$DEST"
estep "Compilation du projet maven"
auto_maven "${maven_vars[@]}" $maven_action "${maven_args[@]}" || { eend; return 1; }
cd "$cwd"
fi
@ -1243,11 +1235,10 @@ function default_update_build_env() {
function update_build_env() { default_update_build_env "$@"; }
function default_compose_build() {
${FAKE:+qvals} "${DOCKER_COMPOSE[@]}" \
${FAKE:+qvals} docker-compose \
"${replace_env_args[@]}" "${env_args[@]}" \
build \
${NO_CACHE:+--no-cache} \
${PROGRESS:+--progress "$PROGRESS"} \
${PULL:+--pull} \
"${replace_build_args[@]}" "${build_args[@]}" \
"$@"
@ -1259,7 +1250,6 @@ function default_docker_build() {
done
${FAKE:+qvals} "$DOCKER" build \
${NO_CACHE:+--no-cache} \
${PROGRESS:+--progress "$PROGRESS"} \
${PULL:+--pull} \
"${replace_env_args[@]}" "${env_args[@]}" \
"${replace_build_args[@]}" "${build_args[@]}" \
@ -1309,14 +1299,13 @@ function auto_build() {
done
${FAKE:+qvals} "$DOCKER" build \
${NO_CACHE:+--no-cache} \
${PROGRESS:+--progress "$PROGRESS"} \
${PULL:+--pull} \
"${replace_build_args[@]}" "$@"
fi
}
function default_compose_push() {
${FAKE:+qvals} "${DOCKER_COMPOSE[@]}" \
${FAKE:+qvals} docker-compose \
"${replace_env_args[@]}" "${env_args[@]}" \
push \
"$@"
@ -1354,7 +1343,7 @@ function auto_push() {
}
function default_compose_up() {
${FAKE:+qvals} "${DOCKER_COMPOSE[@]}" \
${FAKE:+qvals} docker-compose \
"${replace_env_args[@]}" "${env_args[@]}" \
up "${replace_run_args[@]}" "${run_args[@]}" \
"${replace_user_args[@]}" "${user_args[@]}" "$@"
@ -1388,7 +1377,7 @@ function auto_up() {
}
function default_compose_stop() {
${FAKE:+qvals} "${DOCKER_COMPOSE[@]}" \
${FAKE:+qvals} docker-compose \
"${replace_env_args[@]}" "${env_args[@]}" \
stop "${replace_stop_args[@]}" "${stop_args[@]}" \
"$@"
@ -1417,7 +1406,7 @@ function auto_stop() {
}
function default_compose_logs() {
${FAKE:+qvals} "${DOCKER_COMPOSE[@]}" \
${FAKE:+qvals} docker-compose \
"${replace_env_args[@]}" "${env_args[@]}" \
logs "${replace_logs_args[@]}" "${logs_args[@]}" \
"$@"
@ -1448,7 +1437,7 @@ function auto_logs() {
}
function default_compose_down() {
${FAKE:+qvals} "${DOCKER_COMPOSE[@]}" \
${FAKE:+qvals} docker-compose \
"${replace_env_args[@]}" "${env_args[@]}" \
down "${replace_down_args[@]}" "${down_args[@]}" \
"$@"
@ -1483,7 +1472,7 @@ function auto_down() {
}
function default_compose_run() {
${FAKE:+qvals} "${DOCKER_COMPOSE[@]}" \
${FAKE:+qvals} docker-compose \
"${replace_env_args[@]}" "${env_args[@]}" \
run "${replace_run_args[@]}" "${run_args[@]}" \
"${replace_user_args[@]}" "${user_args[@]}" "$@"
@ -1554,7 +1543,7 @@ function auto_run() {
}
function default_compose_exec() {
${FAKE:+qvals} "${DOCKER_COMPOSE[@]}" \
${FAKE:+qvals} docker-compose \
"${replace_env_args[@]}" "${env_args[@]}" \
exec "${replace_exec_args[@]}" "${exec_args[@]}" \
"$@"
@ -1768,7 +1757,7 @@ function auto_status() {
function default_compose_show_ip() {
local -a cmd cids; local cid
cmd=(
"${DOCKER_COMPOSE[@]}"
docker-compose
"${replace_env_args[@]}" "${env_args[@]}"
ps -q "${replace_show_ip_args[@]}" "${show_ip_args[@]}"
"$@"
@ -1804,23 +1793,7 @@ function auto_show_ip() {
}
function default_compose_systemd_unit() {
local -a docker_compose
if [ "${DOCKER_COMPOSE[0]}" == docker ]; then
# compose v2
local docker="$(which docker 2>/dev/null)"
if [ -z "$docker" ]; then
if [ -x /usr/bin/docker ]; then
docker=/usr/bin/docker
elif [ -x /usr/local/bin/docker ]; then
docker=/usr/local/bin/docker
else
die "Impossible de trouver docker"
fi
fi
docker_compose=("$docker" compose)
else
# compose v1
docker_compose="$(which docker-compose 2>/dev/null)"
local docker_compose="$(which docker-compose 2>/dev/null)"
if [ -z "$docker_compose" ]; then
if [ -x /usr/bin/docker-compose ]; then
docker_compose=/usr/bin/docker-compose
@ -1830,12 +1803,11 @@ function default_compose_systemd_unit() {
die "Impossible de trouver docker-compose"
fi
fi
fi
setx startcmd=qvals "${docker_compose[@]}" \
setx startcmd=qvals "$docker_compose" \
"${replace_env_args[@]}" "${env_args[@]}" \
up "${replace_run_args[@]}" "${run_args[@]}" \
"${replace_user_args[@]}" "${user_args[@]}" "$@"
setx stopcmd=qvals "${docker_compose[@]}" down
setx stopcmd=qvals "$docker_compose" down
}
function default_docker_systemd_unit() {
local docker="$(which "$DOCKER" 2>/dev/null)"
@ -1949,7 +1921,6 @@ function default_local_composer() {
*)
if [ -n "$COMPOSER_CMD" ]; then :
elif [ -x composer.phar ]; then COMPOSER_CMD=./composer.phar
elif [ -x sbin/composer.phar ]; then COMPOSER_CMD=./sbin/composer.phar
elif [ -x /usr/bin/composer ]; then COMPOSER_CMD=/usr/bin/composer
else
eerror "Impossible de trouver composer"
@ -1986,7 +1957,6 @@ function default_docker_composer() {
-e group="$group"
-e projdir="$projdir"
-e setup="$COMPOSER_SETUP"
-e setup_image="$COMPOSER_SETUP_IMAGE"
-e composer="$COMPOSER_CMD"
-e args="$args"
)
@ -2006,7 +1976,6 @@ echo "$group" >>/etc/group; group="${group%%:*}"
cd "$projdir"
if [ -n "$composer" ]; then :
elif [ -x composer.phar ]; then composer=./composer.phar
elif [ -x sbin/composer.phar ]; then composer=./sbin/composer.phar
elif [ -x /usr/bin/composer ]; then composer=/usr/bin/composer
else
echo "ERROR: Impossible de trouver composer"
@ -2016,36 +1985,35 @@ fi
if [ -n "$COMPOSER_SETUP" ]; then
# lancement dans un container docker à préparer
local NAME setup_image project_name container_name dkid
local NAME project_name container_name dkid
if [ -f docker-compose.yml ]; then
compose_set_project_name set_container_name
else
NAME="$(basename -- "$(pwd)")"
docker_check_name set_container_name
fi
setup_image="$COMPOSER_SETUP_IMAGE"
[ -n "$setup_image" ] || setup_image="dk_composer_${container_name}_image"
container_name="dk_composer_${container_name}"
# vérifier l'existence de l'image
setx dkid=docker image ls --format '{{.ID}}' "$setup_image"
setx dkid=docker image ls --format '{{.ID}}' "${container_name}_image"
# créer le container le cas échéant
if [ -z "$dkid" ]; then
estep "Création de l'image $setup_image à partir de $COMPOSER_IMAGE"
estep "Création du container $container_name avec l'image $COMPOSER_IMAGE"
cmd=(
"$DOCKER" create -it --name "${setup_image}_tmpct"
"$DOCKER" create -it --name "${container_name}_ct"
"${basecmd[@]}"
"$COMPOSER_IMAGE"
bash -c "$setupscript"
)
setx dkid="${cmd[@]}" || return 1
"$DOCKER" container start -ai "$dkid" || return 1
"$DOCKER" container commit "$dkid" "$setup_image" || return 1
"$DOCKER" container commit "$dkid" "${container_name}_image" || return 1
"$DOCKER" container rm "$dkid" || return 1
fi
# prendre comme image le container créé
COMPOSER_IMAGE="$setup_image"
COMPOSER_IMAGE="${container_name}_image"
fi
cmd=(
@ -2071,19 +2039,7 @@ function auto_composer() {
local COMPOSER_MACHINE=-u
local COMPOSER_CMD=
local COMPOSER_SETUP=
local COMPOSER_SETUP_IMAGE=
if [ -f .composer.yaml ]; then
local registry
eval "$(<.composer.yaml grep ^composer_ |
sed 's/^composer_php_min: /COMPOSER_PHP=/
s/^composer_php_max: /COMPOSER_PHP_MAX=/
s/^composer_registry: /registry=/
s/^composer_image: \(.*\)/COMPOSER_IMAGE="${registry:-$REGISTRY}\/\1"/
s/^composer_setup: /COMPOSER_SETUP=/
s/^composer_setup_image: /COMPOSER_SETUP_IMAGE=/')"
elif [ -f .composer.conf ]; then
source ./.composer.conf
fi
[ -f .composer.conf ] && source ./.composer.conf
# les premiers arguments peuvent servir à redéfinir les variables
while [ $# -gt 0 ]; do
case "$1" in
@ -2099,10 +2055,8 @@ function auto_composer() {
esac
done
local use_runphp use_image
if [ "$COMPOSER_PHP" == runphp ]; then
use_runphp=1
elif [ "$COMPOSER_PHP" == force -o "$COMPOSER_PHP" == any ]; then
local use_image
if [ "$COMPOSER_PHP" == force -o "$COMPOSER_PHP" == any ]; then
use_image=1
elif [ "$COMPOSER_PHP" == none -o "$COMPOSER_PHP" == system ]; then
COMPOSER_PHP=none
@ -2123,7 +2077,7 @@ exit((PHP_VERSION_ID > $version)? 0: 1);
*) ewarn "Erreur lors du lancement de PHP: est-il installé? Vous pouvez utiliser COMPOSER_PHP=any";;
esac
fi
if [ -n "$use_runphp" -o -n "$use_image" -o "$COMPOSER_PHP" == none ]; then
if [ -n "$use_image" -o "$COMPOSER_PHP" == none ]; then
: # ok, on a déjà décidé
elif [ -z "$COMPOSER_PHP" ]; then
# pas de version minimum, tester simplement la valeur de COMPOSER_IMAGE
@ -2145,23 +2099,7 @@ exit((PHP_VERSION_ID < $version)? 0: 1);
esac
fi
if [ -n "$use_runphp" ]; then
(
export PROJDIR="$(pwd)"
export RUNPHP_STANDALONE=
RUNPHP=; DIST=; REGISTRY=
if [ -f "$PROJDIR/.runphp.conf" ]; then
source "$PROJDIR/.runphp.conf"
[ -n "$RUNPHP" ] && exec "$PROJDIR/$RUNPHP" composer "$@"
elif [ -f "$PROJDIR/sbin/runphp" ]; then
exec "$PROJDIR/sbin/runphp" composer "$@"
elif [ -f "$PROJDIR/runphp" ]; then
exec "$PROJDIR/runphp" composer "$@"
fi
exec runphp composer "$@"
)
elif [ -n "$use_image" ]; then
if [ -n "$use_image" ]; then
[ "$COMPOSER_IMAGE" != none ] || die "Vous devez spécifier l'image à utiliser pour composer"
local PREVIOUS_DOCKER_MACHINE_NAME="$DOCKER_MACHINE_NAME"
@ -2243,7 +2181,6 @@ function default_docker_maven() {
-e group="$group"
-e projdir="$projdir"
-e setup="$MAVEN_SETUP"
-e setup_image="$MAVEN_SETUP_IMAGE"
-e maven="$MAVEN_CMD"
-e args="$args"
${MAVEN_JAVA:+-e JAVA="$MAVEN_JAVA"}
@ -2268,36 +2205,35 @@ cd "$projdir"
if [ -n "$MAVEN_SETUP" ]; then
# lancement dans un container docker à préparer
local NAME setup_image project_name container_name dkid
local NAME project_name container_name dkid
if [ -f docker-compose.yml ]; then
compose_set_project_name set_container_name
else
NAME="$(basename -- "$(pwd)")"
docker_check_name set_container_name
fi
setup_image="$MAVEN_SETUP_IMAGE"
[ -n "$setup_image" ] || setup_image="dk_maven_${container_name}_image"
container_name="dk_maven_${container_name}"
# vérifier l'existence de l'image
setx dkid=docker image ls --format '{{.ID}}' "$setup_image"
setx dkid=docker image ls --format '{{.ID}}' "${container_name}_image"
# créer le container le cas échéant
if [ -z "$dkid" ]; then
estep "Création de l'image $setup_image à partir de $MAVEN_IMAGE"
estep "Création du container $container_name avec l'image $MAVEN_IMAGE"
cmd=(
"$DOCKER" create -it --name "${setup_image}_tmpct"
"$DOCKER" create -it --name "${container_name}_ct"
"${basecmd[@]}"
"$MAVEN_IMAGE"
bash -c "$setupscript"
)
setx dkid="${cmd[@]}" || return 1
"$DOCKER" container start -ai "$dkid" || return 1
"$DOCKER" container commit "$dkid" "$setup_image" || return 1
"$DOCKER" container commit "$dkid" "${container_name}_image" || return 1
"$DOCKER" container rm "$dkid" || return 1
fi
# prendre comme image le container créé
MAVEN_IMAGE="$setup_image"
MAVEN_IMAGE="${container_name}_image"
fi
cmd=(
@ -2322,7 +2258,6 @@ function auto_maven() {
local MAVEN_MACHINE=-u
local MAVEN_CMD=
local MAVEN_SETUP=
local MAVEN_SETUP_IMAGE=
[ -f .maven.conf ] && source ./.maven.conf
# les premiers arguments peuvent servir à redéfinir les variables
while [ $# -gt 0 ]; do
@ -2453,8 +2388,7 @@ elif progexists podman; then DOCKER=podman
else DOCKER=docker
fi
[ -n "$COMPOSE_V1" ] && DOCKER_COMPOSE=(docker-compose) || DOCKER_COMPOSE=(docker compose)
DEFAULT_PROFILE=devel
PROFILE=
DM_ALIASES=()
DM_PROFILES=()
@ -2462,55 +2396,19 @@ CLUSTERDIRS=()
DEFAULT_DEVEL_SRCDIR="$HOME/wop"
COMPOSER_DEVEL_SRCDIR="$HOME/wop/php"
MAVEN_DEVEL_SRCDIR="$HOME/wop/sn"
DEFAULT_COMPOSER_IMAGE=
DEFAULT_MAVEN_IMAGE=
DEFAULT_COMPOSER_IMAGE=docker.univ-reunion.fr/image/phpbuilder
DEFAULT_MAVEN_IMAGE=docker.univ-reunion.fr/image/javabuilder
DEFAULT_HOST_MAPPINGS=()
prod_HOST_MAPPINGS=(
docker.univ-reunion.fr:10.82.70.154
repos.univ-reunion.fr:10.82.70.246
git.univ-reunion.fr:10.82.70.247
)
test_HOST_MAPPINGS=("${prod_HOST_MAPPINGS[@]}")
set_defaults dk
export PROFILE
DEFAULT_PROFILE=devel
REGISTRY=
HOST_MAPPINGS=()
if [ -f ~/.dkbuild.env ]; then
function default_profile() {
DEFAULT_PROFILE="$1"
}
function profile() {
local profile
for profile in "$@"; do
[ "$profile" == "$DEFAULT_PROFILE" ] && return 0
done
return 1
}
function setenv() {
eval "export $1"
}
function default() {
local command="$1"; shift
local nv n v
case "$command" in
docker)
for nv in "$@"; do
[[ "$nv" == *=* ]] || continue
n="${nv%%=*}"
v="${nv#*=}"
case "$n" in
host-mappings)
read -a nv <<<"$v"
for v in "${ns[@]}"; do
HOST_MAPPINGS+=("$v")
done
;;
esac
done
;;
esac
}
source ~/.dkbuild.env
fi
[ -n "$REGISTRY" ] || REGISTRY=pubdocker.univ-reunion.fr
[ -n "$DEFAULT_COMPOSER_IMAGE" ] || DEFAULT_COMPOSER_IMAGE="$REGISTRY/image/php:d11"
[ -n "$DEFAULT_MAVEN_IMAGE" ] || DEFAULT_MAVEN_IMAGE="$REGISTRY/image/javabuilder:d11"
chdir=
CONFIG=
@ -2522,7 +2420,6 @@ FAKE=
VARS=()
FORCE=
NO_CACHE=
PROGRESS=
PULL=
HOST=
WITH_REGISTRY_AUTH=1
@ -2532,7 +2429,6 @@ update_apps_origin=
update_apps_branch=
args=(
--help '$exit_with display_help'
--compose-v1 '$DOCKER_COMPOSE=(docker-compose)'
-d:,--chdir: chdir=
-c:,--config: CONFIG=
-p:,--profile: PROFILE=
@ -2546,7 +2442,6 @@ args=(
-e:,--build-arg:,--env: VARS
-f,--force FORCE=1
-j,--no-cache NO_CACHE=1
--plain-output PROGRESS=plain
-U,--pull PULL=1
-h:,--host: HOST=
-g,--ug,--no-update-apps update_apps_mode=b
@ -3023,11 +2918,6 @@ NR == 1 { print; next }
"$DOCKER" container prune -f || die
"$DOCKER" image prune -f || die
;;
XX|prune-cache)
"$DOCKER" container prune -f || die
"$DOCKER" image prune -f || die
"$DOCKER" builder prune -f || die
;;
composer|c|ci|cu|cr|cs)
build_set_options "$update_apps_mode" "$update_apps_origin" "$update_apps_branch"
[ -f .build.scripts.sh ] && source ./.build.scripts.sh

3296
dkbuild

File diff suppressed because it is too large Load Diff

132
dmcerts
View File

@ -1,132 +0,0 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
urequire install
function display_help() {
uecho "$scriptname: gérer les certificats de docker-machine
Les certificats créés par docker-machine ont une durée trop courte à mon goût.
Ce script permet de les recréer avec une durée de 30 ans pour le CA et le
certificat client, et de 10 ans pour chaque machine
USAGE
$scriptname [host]"
}
args=(
--help '$exit_with display_help'
)
parse_args "$@"; set -- "${args[@]}"
dmdir="$HOME/.docker/machine"
cadir="$dmdir/dmcerts"
cakey="$cadir/dmca.key"
cacsr="$cadir/dmca.csr"
cacrt="$cadir/dmca.crt"
cacrl="$cadir/dmca.crl"
if [ ! -d "$cadir" ]; then
enote "Le répertoire $cadir va être créé. Ne faites cela que si c'est la première fois. Sinon, récupérez le répertoire déjà créé par ailleurs"
ask_yesno "Voulez-vous continuer?" N || die
mkdir "$cadir"
chmod 700 "$cadir"
mkdir "$cadir"/{openssl,newcerts}
touch "$cadir/index.txt"
echo 01 >"$cadir/serial"
for src in "$scriptdir"/lib/dmcerts_openssl_*.cnf; do
dest="$cadir/openssl/${src#$scriptdir/lib/dmcerts_openssl_}"
cp "$src" "$dest"
done
sed -i "s/^dir = .*/dir = ${cadir//\//\\\/}/" "$cadir/openssl/"*.cnf
openssl req -config "$cadir/openssl/ca.cnf" -batch -new -nodes -keyout "$cakey" -out "$cacsr" &&
openssl ca -config "$cadir/openssl/ca.cnf" -batch -notext -out "$cacrt" -days 10950 -keyfile "$cakey" -selfsign -extensions v3_ca -infiles "$cacsr" &&
openssl ca -config "$cadir/openssl/ca.cnf" -batch -gencrl -out "$cacrl" ||
die "Une erreur s'est produite. Veuillez supprimer $cadir et recommencer"
fi
clientkey="$cadir/dmclient.key"
clientcsr="$cadir/dmclient.csr"
clientcrt="$cadir/dmclient.crt"
clientcnf="$cadir/openssl/client.cnf"
if [ ! -f "$clientcrt" ]; then
#sed -i "s/^dir = .*/dir = ${cadir//\//\\\/}/" "$clientcnf"
subj="/countryName=FR/stateOrProvinceName=La Reunion/localityName=Sainte Clotilde/organizationName=jclain/CN=dmclient/"
openssl req -config "$clientcnf" -batch -new -nodes -subj "$subj" -keyout "$clientkey" -out "$clientcsr" &&
openssl ca -config "$clientcnf" -batch -keyfile "$cakey" -notext -out "$clientcrt" -infiles "$clientcsr" &&
chmod 644 "$clientcrt" &&
chmod 600 "$clientkey" &&
rm -f "$clientcsr" ||
die "Une erreur s'est produite pendant la génération du certificat client"
fi
estep "Vérification certificats locaux"
copy_update "$cacrt" "$dmdir/certs/ca.pem"
copy_update "$cakey" "$dmdir/certs/ca-key.pem"
copy_update "$clientcrt" "$dmdir/certs/cert.pem"
copy_update "$clientkey" "$dmdir/certs/key.pem"
first=1
for host in "$@"; do
if [ -n "$first" ]; then
servercnf="$cadir/openssl/server.cnf"
#sed -i "s/^dir = .*/dir = ${cadir//\//\\\/}/" "$servercnf"
else
first=
fi
etitle "$host"
machine="${host%%.*}"
machinedir="$dmdir/machines/$machine"
if [ ! -d "$machinedir" ]; then
eerror "$machine: machine inexistante"
fi
serverkey="${machine}-server.key"
servercsr="${machine}-server.csr"
servercrt="${machine}-server.crt"
if [ ! -f "$servercrt" ]; then
subj="/countryName=FR/stateOrProvinceName=La Reunion/localityName=Sainte Clotilde/organizationName=jclain/CN=dmserver-$host/"
sans="DNS:$host,DNS:localhost"
sed -i "s/^subjectAltName = .*/subjectAltName = $sans/" "$servercnf"
openssl req -config "$servercnf" -batch -new -nodes -subj "$subj" -keyout "$serverkey" -out "$servercsr" &&
openssl ca -config "$servercnf" -batch -keyfile "$cakey" -notext -out "$servercrt" -infiles "$servercsr" &&
chmod 644 "$servercrt" &&
chmod 600 "$serverkey" &&
rm -f "$servercsr" ||
die "Une erreur s'est produite pendant la génération du certificat serveur"
fi
estep "machine: $machine"
ask_yesno "Voulez-vous remplacer les certificats distants et locaux?" O || continue
estep "Copie distante"
scp "$cacrt" "root@$host:/etc/docker/ca.pem" || die
scp "$servercrt" "root@$host:/etc/docker/server.pem" || die
scp "$serverkey" "root@$host:/etc/docker/server-key.pem" || die
estep "Redémarrage docker distant"
ssh "root@$host" "service docker restart" || die
estep "Copie locale"
copy_update "$cacrt" "$machinedir/ca.pem"
copy_update "$cakey" "$machinedir/ca-key.pem"
copy_update "$clientcrt" "$machinedir/cert.pem"
copy_update "$clientkey" "$machinedir/key.pem"
copy_update "$servercrt" "$machinedir/server.pem"
copy_update "$serverkey" "$machinedir/server-key.pem"
estep "Test de l'accès au serveur"
setx env=docker-machine env "$machine" || die
eval "$env"
echo "$machine docker version: $(docker system info -f '{{.ServerVersion}}')"
estep "Suppression des fichiers temporaires"
rm -f "$servercrt" "$serverkey"
done
enote "N'oubliez pas de re-exporter les docker-machines qui ont été regénérées"

2
dmctl
View File

@ -1,6 +1,6 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source /etc/ulibauto || exit 1
function display_help() {
uecho "$scriptname: import/exporter une docker-machine

1
docker/.dockerignore Normal file
View File

@ -0,0 +1 @@
/b/t/

2
docker/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/b/
/build.env.local

12
docker/Dockerfile Normal file
View File

@ -0,0 +1,12 @@
FROM ur/d9base
ARG date
ARG version
LABEL date=$date version=$version
ENV I=/install/nutools
COPY . $I
RUN $I/uinst -y $I && rm -rf $I
ENV PATH="$PATH:/usr/local/nutools"
CMD ["/bin/bash", "-il"]

72
docker/build Executable file
View File

@ -0,0 +1,72 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source /etc/ulibauto || exit 1
function display_help() {
uecho "$scriptname: construire $NAME
USAGE
$scriptname [options]
OPTIONS
-b, --build
-n, --no-cache"
}
function do_prereqs() {
:
}
function do_build() {
local date; local -a args
setx date=date +%y%m%d
args=(
-f Dockerfile
-t $NAME:latest
--build-arg "date=$date"
${no_cache:+--no-cache}
)
etitle "Création de l'image docker $NAME" \
docker build "${args[@]}" "$CTXDIR"
}
function do_run() {
docker run -it --rm "$NAME"
}
cd "$scriptdir"
source ./build.env || die "Impossible de trouver build.env"
[ -f build.env.local ] && source build.env.local
auto=1
prereqs=
build=
no_cache=
run=
args=(
--help '$exit_with display_help'
--prereqs '$prereqs=1; auto='
-b,--build '$build=1; auto='
-n,--no-cache no_cache=1
-r,--run '$run=1; auto='
)
parse_args "$@"; set -- "${args[@]}"
if [ -n "$prereqs" ]; then
build=
run=
elif [ -n "$auto" ]; then
build=1
fi
if [ -n "$prereqs" ]; then
do_prereqs "$@" || die
fi
if [ -n "$build" ]; then
do_build "$@" || die
fi
if [ -n "$run" ]; then
do_run "$@" || die
fi

15
docker/build.env Normal file
View File

@ -0,0 +1,15 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Nom de l'image
NAME=ur/nutools
# Build context pour docker
CTXDIR=..
# Répertoire contenant les fichiers nécessaire au build
BUILDDIR=b
# Répertoire temporaire pour construire les fichiers de BUILDDIR. Ce répertoire
# n'est pas transmis au daemon docker
TRANSDIR=b/t
# Fonctions spécifiques
#function do_prereqs() { :; }
#function do_build() { :; }
#function do_run() { :; }

View File

@ -11,7 +11,7 @@ if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then
exit 0
fi
source "$(dirname -- "$0")/lib/ulib/ulib" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire base
function display_help() {

View File

@ -1,6 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: afficher les connexions TCP entrantes sur un port

View File

@ -1,7 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
urequire ipcalc
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS ipcalc
function display_help() {
uecho "$scriptname: s'assurer que l'hôte courant a l'adresse IP spécifiée

3
fconv
View File

@ -1,6 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: convertir un fichier ou les fichiers d'un répertoire

3
fnconv
View File

@ -1,6 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: renommer un fichier ou les fichiers d'un répertoire

3
fndate
View File

@ -11,7 +11,8 @@ if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then
exit 0
fi
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: manipuler des noms de fichier pour les dater

View File

@ -1,6 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: lancer une commande pour un ensemble d'arguments
@ -82,7 +83,7 @@ OPTIONS
répertoire parent (valide uniquement avec l'option -p)
-S, --git-status
Equivalent à spécifier la commande 'git status --p'
Utiliser par exemple avec -g, -G ou -C
Utiliser avec -G ou -C
-G, --git-projects
Equivalent à '--ptitle -p */.git --' e.g '$scriptname -G git pull' pour
mettre à jour les dépôts situés dans un répertoire
@ -123,11 +124,7 @@ parse_args "$@"; set -- "${args[@]}"
case "$command" in
git-status-p)
if [ -n "$shortcut" ]; then
set -- git status --p "$@"
else
set -- "$@" -- git status --p
fi
;;
esac
case "$shortcut" in

3
geturl
View File

@ -1,6 +1,7 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
function display_help() {
uecho "$scriptname: Télécharger un fichier avec wget ou curl

4
ipaddr
View File

@ -7,9 +7,7 @@ elif [ -x /bin/ip ]; then IP=/bin/ip
else IP=ip
fi
if [ -n "IPADDR_COLOR" ]; then isatty=1
else tty -s <&1 && isatty=1 || isatty=
fi
tty -s <&1 && isatty=1 || isatty=
"$IP" addr "$@" | awk -v isatty="$isatty" '
isatty && $0 ~ /^[0-9]/ {

33
ldiff
View File

@ -1,33 +0,0 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/auto" || exit 1
function display_help() {
uecho "$scriptname: frontend de diff pour comparer deux fichiers encodés en latin1
USAGE
$scriptname [options] Lfile Rfile
OPTIONS
-u, -U, --unified N
-w, --ignore-all-space
-B, --ignore-blank-lines
options de diff qui sont reprises telles quelles"
}
diffopts=()
args=(
--help '$exit_with display_help'
-u '$diffopts+=(-u)'
-U:,--unified: '$diffopts+=(-U "$value_")'
-w,--ignore-all-space '$diffopts+=(-w)'
-B,--ignore-blank-lines '$diffopts+=(-B)'
)
parse_args "$@"; set -- "${args[@]}"
Lfile="$1"
Rfile="$2"
[ -n "$Lfile" -a -n "$Rfile" ] || die "vous devez spécifier les deux fichiers"
[ -d "$Lfile" -o -d "$Rfile" ] && die "il faut absolument comparer deux fichiers"
diff "${diffopts[@]}" <(iconv -f latin1 -t utf-8 "$Lfile") <(iconv -f latin1 -t utf-8 "$Rfile")

41
lgrep
View File

@ -1,41 +0,0 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/auto" || exit 1
function display_help() {
uecho "$scriptname: frontend de grep pour chercher dans un fichier encodé en latin1
USAGE
$scriptname [options] FILE
OPTIONS
options de grep qui sont reprises telles quelles"
}
grepopts=()
args=(
--help '$exit_with display_help'
-E,--extended-regexp '$grepopts+=(-E)'
-F,--fixed-strings '$grepopts+=(-F)'
-G,--basic-regexp '$grepopts+=(-G)'
-P,--perl-regexp '$grepopts+=(-P)'
-i,--ignore-case '$grepopts+=(-i)'
-v,--invert-match '$grepopts+=(-v)'
-L,--files-without-match '$grepopts+=(-L)'
-l,--files-with-matches '$grepopts+=(-l)'
-q,--quiet,--silent '$grepopts+=(-q)'
-s,--no-messages '$grepopts+=(-s)'
-H,--with-filename '$grepopts+=(-H)'
-h,--no-filename '$grepopts+=(-h)'
-a,--text '$grepopts+=(-a)'
-r,--recursive '$grepopts+=(-r)'
-R,--dereference-recursive '$grepopts+=(-R)'
)
parse_args "$@"; set -- "${args[@]}"
pattern="$1"
args=("${@:2}")
#XXX ajouter le support de -r, -h, -H, notamment si ${args[@]} contient un
# répertoire
iconv -f latin1 -t utf-8 "${args[@]}" | grep "${grepopts[@]}" "$pattern"

View File

@ -20,5 +20,10 @@
#MAVEN_DEVEL_SRCDIR="$HOME/wop/sn"
# Image à utiliser pour les builds
#DEFAULT_COMPOSER_IMAGE=pubdocker.univ-reunion.fr/image/php:d11
#DEFAULT_MAVEN_IMAGE=pubdocker.univ-reunion.fr/image/javabuilder:d11
#DEFAULT_COMPOSER_IMAGE=docker.univ-reunion.fr/image/phpbuilder:d10
#DEFAULT_MAVEN_IMAGE=docker.univ-reunion.fr/image/javabuilder:d10
# Mappings d'hôtes à activer pour les builds à base d'image
#DEFAULT_HOST_MAPPINGS=()
#prod_HOST_MAPPINGS=(docker.univ-reunion.fr:10.82.70.154 repos.univ-reunion.fr:10.82.70.246 git.univ-reunion.fr:10.82.70.247)
#test_HOST_MAPPINGS=("${prod_HOST_MAPPINGS}")

View File

@ -1,4 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Profil par défaut
#DKBUILD_PROFILE=prod

View File

@ -1,31 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
default_profile "${DKBUILD_PROFILE:-prod}"
# Source des paquets et proxy
#setenv APT_PROXY=http://aptcache.devel.self:3142
#setenv APT_MIRROR=default
#setenv SEC_MIRROR=default
# Timezone du serveur
#setenv TIMEZONE=Indian/Reunion
if profile jclain; then
setenv REGISTRY=docker.jclain.fr
setenv PRIVAREG=docker.jclain.fr
elif profile prod test; then
setenv REGISTRY=pubdocker.univ-reunion.fr/rununiv
setenv PRIVAREG=pridocker.univ-reunion.fr
host_mappings=(
pridocker.univ-reunion.fr:10.85.1.56
pubdocker.univ-reunion.fr:10.85.1.57
repos.univ-reunion.fr:10.85.1.57
git.univ-reunion.fr:10.85.1.55
)
default docker host-mappings="${host_mappings[*]}"
elif profile dist; then
setenv REGISTRY=pubdocker.univ-reunion.fr/dist
setenv PRIVAREG=pridocker.univ-reunion.fr
elif profile devel; then
setenv REGISTRY=docker.devel.self/rununiv
setenv PRIVAREG=docker.devel.self
fi

View File

@ -1 +0,0 @@
php

View File

@ -1,3 +0,0 @@
*.zip filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.tar.gz filter=lfs diff=lfs merge=lfs -text

View File

@ -1,2 +0,0 @@
.~lock*#
.*.swp

View File

@ -1,3 +0,0 @@
# -*- coding: utf-8 mode: dockerfile -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
FROM $REGISTRY/debian/min:$DIST
#RUN /debian/pkg i

View File

@ -1,2 +0,0 @@
/b/t/
**/.git/

View File

@ -1,3 +0,0 @@
/b/
/Dockerfile
# autogénéré

View File

@ -1,11 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setdists d11
# fichiers communs
copy ../common/ ./ gitignore=.
dockerfile "" Dockerfile.in sed="
s/\\\$REGISTRY/$REGISTRY/
s/\\\$DIST/$DIST/
"
build

View File

@ -1 +0,0 @@
../dkbuild.env

View File

@ -1,9 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
dists=(
d11
)
setdists "${dists[@]}"
if dist d11; then
include d11
fi

View File

@ -1,3 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setenv REGISTRY=pubdocker.univ-reunion.fr
setenv IMAGE=$REGISTRY/GROUP/NAME

View File

@ -1,3 +0,0 @@
/Dockerfile
.~lock*#
.*.swp

View File

@ -1,25 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
if profile prod; then
default checkout branch=master
elif profile test devel; then
default checkout branch=develop
fi
default composer image=$REGISTRY/image/phpbuilder:$DIST
## web ########################################################################
checkout https://git.univ-reunion.fr/sda-php/NAME-app b/web
composer b/web
dockerfile
# -*- coding: utf-8 mode: dockerfile -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
FROM $REGISTRY/image/apache-php-myiccas:$DIST
#RUN /debian/pkg i
#ENV MSMTP_ENABLE=1
#COPY b/web/config/msmtp /msmtp-config
COPY b/web/config/ssl /ssl-config
COPY b/web/config/apache /apache-config
COPY b/web/config/php /php-config
#COPY b/web/config/before-start-apache /
COPY b/web /var/www/app
build

View File

@ -1,4 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setenv REGISTRY=pubdocker.univ-reunion.fr
setenv IMAGE=$REGISTRY/GROUP/NAME
setenv DIST=d11

View File

@ -1,6 +0,0 @@
/docker-compose.yml
/docker-compose.*.yml
/web/Dockerfile
/db/Dockerfile
.~lock*#
.*.swp

View File

@ -1,37 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setprofiles prod test devel
if profile prod; then
default checkout branch=master
elif profile test devel; then
default checkout branch=develop
fi
default composer image=$REGISTRY/image/phpbuilder:$DIST
## web ########################################################################
checkout https://git.univ-reunion.fr/sda-php/NAME-app web/b/web
composer web/b/web
dockerfile context=web
# -*- coding: utf-8 mode: dockerfile -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
FROM $REGISTRY/image/apache-php-myiccas:$DIST
#RUN /debian/pkg i
#ENV MSMTP_ENABLE=1
#COPY b/web/config/msmtp /msmtp-config
COPY b/web/config/ssl /ssl-config
COPY b/web/config/apache /apache-config
COPY b/web/config/php /php-config
#COPY b/web/config/before-start-apache /
COPY b/web /var/www/app
## db #########################################################################
copy web/b/web/config/sqlmig db/config/mariadb/sqlmig
dockerfile context=db
# -*- coding: utf-8 mode: dockerfile -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
FROM $REGISTRY/image/mariadb:$DIST
COPY config/mariadb /mariadb-config

View File

@ -1,4 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setenv REGISTRY=pubdocker.univ-reunion.fr
setenv IMAGE=$REGISTRY/GROUP/NAME
setenv DIST=d11

View File

@ -1,12 +0,0 @@
# -*- coding: utf-8 mode: yaml -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8
version: "3.7"
services:
db:
image: $REGISTRY/devel/GROUP/NAME-db
web:
image: $REGISTRY/devel/GROUP/NAME-web
environment:
- APP_PROFILE=devel
- BASE_URL=http://NAME.self

View File

@ -1,14 +0,0 @@
# -*- coding: utf-8 mode: yaml -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8
version: "3.7"
services:
db:
image: $REGISTRY/GROUP/NAME-db
web:
image: $REGISTRY/GROUP/NAME-web
environment:
- APP_PROFILE=prod
- BASE_URL=https://NAME.univ-reunion.fr
extra_hosts:
- "casn.univ-reunion.fr:10.85.1.15"

View File

@ -1,14 +0,0 @@
# -*- coding: utf-8 mode: yaml -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8
version: "3.7"
services:
db:
image: $REGISTRY/test/GROUP/NAME-db
web:
image: $REGISTRY/test/GROUP/NAME-web
environment:
- APP_PROFILE=test
- BASE_URL=https://NAME-test.univ-reunion.fr
extra_hosts:
- "casn.univ-reunion.fr:10.85.1.15"

View File

@ -1,34 +0,0 @@
# -*- coding: utf-8 mode: yaml -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8
version: "3.7"
services:
db:
build: db
volumes:
- db-data:/var/lib/mysql
networks:
default:
aliases:
- NAMEdb
deploy:
update_config:
order: stop-first
web:
build: web
volumes:
- log-data:/var/log/apache2
- session-data:/var/lib/php/sessions
extra_hosts:
- "smtp.univ.run:10.82.70.46"
- "vs-apoprod-bdd.univ.run:10.82.91.11"
- "vs-apotest-bdd.univ.run:10.82.91.13"
- "vs-apodevp-bdd.univ.run:10.82.91.15"
deploy:
update_config:
order: start-first
volumes:
db-data:
log-data:
session-data:

View File

@ -1,8 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Description des templates de ce répertoire
TEMPLATES=(
[image]="Image générique basée sur debian"
[php]="Application web PHP"
[php_db]="Application web PHP avec base de données"
)

View File

@ -1,5 +0,0 @@
/Dockerfile
/src
/dest
/srcdir/
/destdir/

View File

@ -1,8 +0,0 @@
# tests
Lancer un test de cette façon
~~~sh
../../../dkbuild -j test-xxx
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,2 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setenv REGISTRY=docker.jclain.fr

View File

@ -1,16 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
section "variables de build"
setarg A="arg A"
resetarg B="arg B"
info "A=${ARGS[A]}, B=${ARGS[B]}"
if [ "${ARGS[A]}" != x ]; then
note "\
Essayer de relancer avec
$(qvals dkbuild -j "$(relpath "$DKBUILD")" --arg A=x --arg B=y)
on ne devrait pas pouvoir modifier la valeur de B"
fi
# pas de build automatique
AUTOBUILD=

View File

@ -1,13 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setenv REGISTRY=pubdocker.univ-reunion.fr
setenv IMAGE=$REGISTRY/group/name
info "IMAGE=$IMAGE"
if [ "$REGISTRY" == pubdocker.univ-reunion.fr ]; then
note "\
Essayer de relancer avec
$(qvals dkbuild -j "$(relpath "$DKBUILD")" -c registry.env)
La valeur de IMAGE devrait changer"
fi
AUTOBUILD=

View File

@ -1,15 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
run rm -rf src dest srcdir destdir
run mkdir srcdir
genfile srcdir/src <<<"file"
run ln -s src srcdir/link
copy srcdir destdir
if run; then
[ -f destdir/src ] || die "destdir/src n'a pas été créé"
diff -qr srcdir destdir || die "srcdir et destdir ne sont pas identiques"
fi
AUTOBUILD=

View File

@ -1,13 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
run rm -rf src dest srcdir destdir
run mkdir srcdir
genfile srcdir/src <<<"file"
run ln -s src srcdir/link
genfile dest <<<"dest"
copy srcdir dest
info "on ne devrait pas arriver ici"
AUTOBUILD=

View File

@ -1,20 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setdists v1-d11 v2-d11 v1-d10
setenv IMAGE=dkbuild-tests/distversions
dockerfile
# -*- coding: utf-8 mode: dockerfile -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
FROM scratch
ENV var=$DIST-$VERSION
build
info "vérifier les images construites avec
dk ls dkbuild-tests/distversions
on devrait avoir les images suivantes:
dkbuild-tests/distversions:v1-d10
dkbuild-tests/distversions:d10 -> v1-d10
dkbuild-tests/distversions:v1-d11
dkbuild-tests/distversions:v2-d11
dkbuild-tests/distversions:d11 -> v2-d11
dkbuild-tests/distversions:latest -> v2-d11
"

View File

@ -1,8 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
if runb; then
qvals dkbuild -c "${DKBUILD_CONFIGS[0]}" "${DKBUILD_CMD_ARGS[@]}"
fi
# pas de build automatique
AUTOBUILD=

View File

@ -1,14 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
run rm -rf src dest srcdir destdir
genfile src <<<"file"
run mkdir destdir
copy src destdir
if run; then
[ -f destdir/src ] || die "destdir/src n'a pas été créé"
diff -q src destdir/src || die "src et destdir/src ne sont pas identiques"
fi
AUTOBUILD=

View File

@ -1,13 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
run rm -rf src dest srcdir destdir
genfile src <<<"file"
copy src dest
if run; then
[ -f dest ] || die "dest n'a pas été créé"
diff -q src dest || die "src et dest ne sont pas identiques"
fi
AUTOBUILD=

View File

@ -1,27 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
run rm -rf src dest srcdir destdir
run mkdir srcdir
genfile srcdir/src <<<"file"
run ln -s src srcdir/link
run mkdir destdir
genfile destdir/.gitignore <<<"/a/"
copy srcdir destdir/a gitignore=destdir
copy srcdir destdir/b gitignore=destdir
if run; then
[ -f destdir/a/src ] || die "destdir/a/src n'a pas été créé"
[ -f destdir/b/src ] || die "destdir/b/src n'a pas été créé"
[ -L destdir/a/link ] || die "destdir/a/link n'a pas été créé"
[ -L destdir/b/link ] || die "destdir/b/link n'a pas été créé"
ignored="$(<destdir/.gitignore)"
expected="\
/a/
/b/link
/b/src"
[ "$ignored" == "$expected" ] || die "les fichiers n'ont pas été ignorés"
fi
AUTOBUILD=

View File

@ -1,13 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setdists d11 d10
setprofiles prod test
if dist LATEST; then
info "$DIST est la distribution la plus récente"
fi
if profile DEFAULT; then
info "$PROFILE est le profil par défaut"
fi
# pas de build automatique
AUTOBUILD=

View File

@ -1,10 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setdists v1-d11 v2-d11 v1-d10
if dist LATEST; then
info "$DIST est la distribution la plus récente"
fi
info "version=$VERSION"
# pas de build automatique
AUTOBUILD=

View File

@ -1,10 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setprofiles v1-prod v2-prod test
if profile DEFAULT; then
info "$PROFILE est le profil par défaut"
fi
info "version=$VERSION"
# pas de build automatique
AUTOBUILD=

View File

@ -1,16 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
if machine fast5; then
setprofiles prod
elif machine fast4; then
setprofiles test
else
setprofiles devel test prod
fi
if run; then
echo "PROFILE=$PROFILE"
fi
# pas de build automatique
AUTOBUILD=

View File

@ -1,16 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
section "première section"
note "une note"
info "une première info"
info "une deuxième info"
debug "message de debug"
section "deuxième section"
note "une note"
info "une première info"
info "une deuxième info"
debug "message de debug"
# pas de build automatique
AUTOBUILD=

View File

@ -1,8 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setenv IMAGE=dkbuild-tests/tags0
dockerfile
# -*- coding: utf-8 mode: dockerfile -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
FROM scratch
ENV var=empty
build

View File

@ -1,9 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setprofiles v1-prod v2-prod
setenv IMAGE=dkbuild-tests/tags1
dockerfile
# -*- coding: utf-8 mode: dockerfile -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
FROM scratch
ENV var=empty
build

View File

@ -1,16 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
section "variables d'environnement"
setenv A="env A"
resetenv B="env B"
info "A=$A, B=$B"
if [ "$A" != x ]; then
note "\
Essayer de relancer avec
$(qvals "$0" -j "$(relpath "$DKBUILD")" -e A=x -e B=y)
on ne devrait pas pouvoir modifier la valeur de B"
fi
# pas de build automatique
AUTOBUILD=

View File

@ -1,15 +0,0 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setenv dne=1
setenv de=
info "dne=$dne de=$de"
if [ -n "$dne" -o -z "$de" ]; then
note "\
Relancer avec
$(qvals "$0" -j "$(relpath "$DKBUILD")" -e dne= -e de=1)
pour vérifier qu'on peut changer la valeur avec les options en ligne de commande"
fi
# pas de build automatique
AUTOBUILD=

View File

@ -1,106 +0,0 @@
# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
[ca]
default_ca = dmca
[dmca]
dir = @@cadir@@
certs = $dir/certs
crl_dir = $dir/crl
database = $dir/index.txt
unique_subject = no
new_certs_dir = $dir/newcerts
certificate = $dir/dmca.crt
serial = $dir/serial
crl = $dir/dmca.crl
private_key = $dir/dmca.key
RANDFILE = $dir/private/.rand
x509_extensions = usr_cert
name_opt = ca_default
cert_opt = ca_default
default_days = 10950
default_crl_days = 30
default_md = sha256
preserve = no
policy = policy_match
[policy_match]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[req]
default_bits = 2048
default_md = sha256
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = v3_ca
string_mask = utf8only
[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = FR
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = La Reunion
localityName = Locality Name (eg, city)
localityName_default = Sainte-Clotilde
0.organizationName = Organization Name (eg, company)
0.organizationName_default = jclain
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default =
commonName = Common Name (eg, your name or your server\'s hostname)
commonName_default = dmca
commonName_max = 64
emailAddress = Email Address
emailAddress_default = jephte.clain@univ-reunion.fr
emailAddress_max = 64
[req_attributes]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
unstructuredName = dmca
[usr_cert]
basicConstraints=CA:FALSE
nsComment = "dmca certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always
[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation,digitalSignature,keyEncipherment
[v3_ca]
#subjectKeyIdentifier=hash
#authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
keyUsage = critical,keyCertSign,digitalSignature,keyEncipherment,keyAgreement
[crl_ext]
#issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always

View File

@ -1,99 +0,0 @@
# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
[ca]
default_ca = dmca
[dmca]
dir = @@cadir@@
certs = $dir/certs
crl_dir = $dir/crl
database = $dir/index.txt
unique_subject = no
new_certs_dir = $dir/newcerts
certificate = $dir/dmca.crt
serial = $dir/serial
crl = $dir/dmca.crl
private_key = $dir/dmca.key
RANDFILE = $dir/private/.rand
x509_extensions = usr_ext
name_opt = ca_default
cert_opt = ca_default
copy_extensions = copy
default_days = 10950
default_crl_days = 30
default_md = sha256
preserve = no
policy = policy_match
[policy_match]
#countryName = match
#stateOrProvinceName = match
#organizationName = match
countryName = supplied
stateOrProvinceName = supplied
organizationName = supplied
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[req]
default_bits = 2048
default_md = sha256
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = usr_ext
string_mask = utf8only
#input_password = secret
#output_password = secret
[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = FR
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = La Reunion
localityName = Locality Name (eg, city)
localityName_default = Sainte-Clotilde
0.organizationName = Organization Name (eg, company)
0.organizationName_default = jclain
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default =
commonName = Common Name (eg, your name or your server\'s hostname)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
[req_attributes]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
unstructuredName = jclain
[usr_ext]
basicConstraints=critical,CA:FALSE
#subjectKeyIdentifier=hash
#authorityKeyIdentifier=keyid,issuer:always
keyUsage = critical,digitalSignature
extendedKeyUsage = clientAuth
[crl_ext]
#issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always

View File

@ -1,101 +0,0 @@
# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
[ca]
default_ca = dmca
[dmca]
dir = @@cadir@@
certs = $dir/certs
crl_dir = $dir/crl
database = $dir/index.txt
unique_subject = no
new_certs_dir = $dir/newcerts
certificate = $dir/dmca.crt
serial = $dir/serial
crl = $dir/dmca.crl
private_key = $dir/dmca.key
RANDFILE = $dir/private/.rand
x509_extensions = usr_ext
name_opt = ca_default
cert_opt = ca_default
copy_extensions = copy
default_days = 3650
default_crl_days = 30
default_md = sha256
preserve = no
policy = policy_match
[policy_match]
#countryName = match
#stateOrProvinceName = match
#organizationName = match
countryName = supplied
stateOrProvinceName = supplied
organizationName = supplied
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[req]
default_bits = 2048
default_md = sha256
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = usr_ext
string_mask = utf8only
#input_password = secret
#output_password = secret
[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = FR
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = La Reunion
localityName = Locality Name (eg, city)
localityName_default = Sainte-Clotilde
0.organizationName = Organization Name (eg, company)
0.organizationName_default = jclain
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default =
commonName = Common Name (eg, your name or your server\'s hostname)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
[req_attributes]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
unstructuredName = jclain
[usr_ext]
basicConstraints = critical,CA:FALSE
#subjectKeyIdentifier=hash
#authorityKeyIdentifier=keyid,issuer:always
keyUsage = critical,digitalSignature,keyEncipherment,keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = DNS:localhost
[crl_ext]
#issuerAltName=issuer:copy
authorityKeyIdentifier=keyid:always

0
lib/nulib/.gitignore vendored Normal file
View File

17
lib/nulib/.project Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>nulib</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.python.pydev.PyDevBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.python.pydev.pythonNature</nature>
</natures>
</projectDescription>

8
lib/nulib/.pydevproject Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?eclipse-pydev version="1.0"?><pydev_project>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python interpreter</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
<path>/${PROJECT_DIR_NAME}/python</path>
</pydev_pathproperty>
</pydev_project>

View File

@ -0,0 +1,5 @@
eclipse.preferences.version=1
encoding//python/nulib/web/bootstrap.py=utf-8
encoding//python/nulib/web/model.py=utf-8
encoding//python/nulib/web/ui.py=utf-8
encoding/<project>=UTF-8

View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
line.separator=\n

4
lib/nulib/MANIFEST.in Normal file
View File

@ -0,0 +1,4 @@
global-include *
global-exclude *.pyc
exclude MANIFEST
prune dist

180
lib/nulib/TODO.md Normal file
View File

@ -0,0 +1,180 @@
# TODO
## Améliorer rtoinst
ajouter le support de pffprofile pour deploydb
## Refaire/repenser les fonctions evalX
dans chaque exemple, on affiche l'invocation de evalX suivi de l'équivalent en
syntaxe standard
- evala permet de traiter des tableaux
~~~
evala with array // add a b c
array=("${array[@]}" a b c)
~~~
les fonctions à utiliser pour le traitement sont configurées avec des
variables spéciales. par exemple, on peut indiquer que la commande add
ci-dessus est en réalité gérée par la fonction array_add et que c'est une
commande de type modify qui prend en premier argument le nom du tableau:
~~~
__evala_add_func=array_add
__evala_add_type=m
__evala_add_arg=first
~~~
en fonction du type de fonction, les arguments supplémentaires supportés sont
différents. par défaut, la fonction à utiliser est du même nom que la
commande, est du type scalar, et prend comme argument @
Ainsi les deux commandes suivantes sont équivalentes:
~~~
evala with array // echo
echo "${array[@]}"
~~~
et assument les définitions suivantes:
~~~
__evala_echo_func=echo
__evala_echo_type=s
__evala_echo_arg=@
~~~
- evalx permet d'utiliser toutes ces fonctions ensemble
~~~
evalx seq 5 //p grep -v 3 //a prepend prefix // append suffix //c echo
array=($(seq 5 | grep -v 3)); array=(prefix "${array[@]}"); array=("${array[@]}" suffix); echo "${array[@]}"
# à partir du mode evala, on peut exécuter directement les arguments du
# tableau comme une commande en terminant par //c
evalx -a with array // prepend echo //c
array=(echo "${array[@]}"); "${array[@]}"
~~~
evalx commence par défaut en mode evalc. il est possible avec les options -i,
-s, -a, -c, -p, -m de forcer respectivement evali, evals, evala, evalc, evalp,
evalm
- Il faudra réfléchir à comment sortir du mode evalm pour utilisation avec
evalx. ou alors on part du principe que evalm est toujours en fin de chaine.
## Faire la fonction cmdx
cmdx permet de lancer une commande avec les arguments qui sont générés par
evalx. cmdx commence par défaut en mode evalm. Par exemple, les deux commandes
suivantes sont équivalentes:
~~~
cmdx etitle //"Copie de " basename "$src" //" vers " ppath "$dest"
etitle "Copie de $(basename "$src") vers $(ppath "$dest")"
~~~
Comme pour evalx, les options -i, -s, -a, -c, -p, -m permettent de forcer
respectivement les modes evali, evals, evala, evalc, evalp, evalm. Par exemple
les deux commandes suivantes sont équivalentes:
~~~
cmdx -c echo a // b
echo "$(b "$(a)")"
~~~
## Faire la fonction checkx
checkx permet de tester le résultat d'une commande evalx. elle s'utilise de
cette manière:
~~~
checkx cmds... OP VALUE
~~~
Les opérateurs sont de la forme:
~~~
is -n|notempty
is -z|empty
is ok
is ko
== value
!= value
etc.
~~~
checkx remplace testx avec une syntaxe plus naturelle. si aucun script
n'utilise les fonctions testx, peut-être peut-on simplement supprimer les
fonctions testx et renommer checkx en testx
Comme pour evalx, les options -i, -s, -a, -c, -p, -m permettent de forcer
respectivement les modes evali, evals, evala, evalc, evalp, evalm. Par exemple
les deux commandes suivantes sont équivalentes:
~~~
checkx -p a // b == c
[ "$(evalp a // b)" == c ]
~~~
Les commande suivantes sont équivalentes deux à deux:
~~~
checkx cmd is -z
[ -z "$(evalx cmd)" ]
checkx cmd is ok
evalx cmd; [ $? -eq 0 ]
checkx cmd is ko
evalx cmd; [ $? -ne 0 ]
checkx cmd == value
[ "$(evalx cmd)" == value ]
~~~
## Faire la fonction storex
storex permet de mettre le résultat d'une fonction evalx dans une variable ou de
l'ajouter à un tableau. l'idée est d'avoir la même syntaxe que checkx. je ne
suis pas encore tout à fait sûr que ce soit une bonne chose.
Les commande suivantes sont équivalentes deux à deux:
~~~
storex cmd to var
var="$(evalx cmd)"
storex cmd to var
setx var=cmd
storex -a cmd to array
array_add array "$(evalx cmd)"
storex -r cmd from array
array_del array "$(evalx cmd)"
~~~
syntaxes alternatives
~~~
storex cmd to var
addx cmd to array
removex cmd from array
~~~
alternatives
~~~
setx var=cmd
evalx cmd // array_add array
evalx cmd // array_del array
~~~
note: il ne semble pas nécessaire au vu de l'alternative d'implémenter storex,
addx, removex.
par contre, il faut corriger un bug d'evalc: la dernière commande doit être
exécutée telle quelle. en effet,
~~~
evalc a // b
~~~
devrait être équivalent à
~~~
b "$(a)"
~~~
mais en fait c'est plutôt
~~~
echo "$(b "$(a)")"
~~~
et ça pose problème, notamment si b initialise des variables, etc.
## Fonctions diverses
`retcode cmd`
: affiche le code de retour de cmd. équivalent à `cmd; echo $?`
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

4
lib/nulib/awk/base Normal file
View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 mode: awk -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
@include "base.core"
@include "base.array"
@include "base.date"

157
lib/nulib/awk/base.array Normal file
View File

@ -0,0 +1,157 @@
# -*- coding: utf-8 mode: awk -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function mkindices(values, indices, i, j) {
array_new(indices)
j = 1
for (i in values) {
indices[j++] = int(i)
}
return asort(indices)
}
function array_new(dest) {
dest[0] = 0 # forcer awk à considérer dest comme un tableau
delete dest
}
function array_newsize(dest, size, i) {
dest[0] = 0 # forcer awk à considérer dest comme un tableau
delete dest
size = int(size)
for (i = 1; i <= size; i++) {
dest[i] = ""
}
}
function array_len(values, count, i) {
# length(array) a un bug sur awk 3.1.5
# cette version est plus lente mais fonctionne toujours
count = 0
for (i in values) {
count++
}
return count
}
function array_copy(dest, src, count, indices, i) {
array_new(dest)
count = mkindices(src, indices)
for (i = 1; i <= count; i++) {
dest[indices[i]] = src[indices[i]]
}
}
function array_getlastindex(src, count, indices) {
count = mkindices(src, indices)
if (count == 0) return 0
return indices[count]
}
function array_add(dest, value, lastindex) {
lastindex = array_getlastindex(dest)
dest[lastindex + 1] = value
}
function array_deli(dest, i, l) {
i = int(i)
if (i == 0) return
l = array_len(dest)
while (i < l) {
dest[i] = dest[i + 1]
i++
}
delete dest[l]
}
function array_del(dest, value, ignoreCase, i) {
do {
i = key_index(value, dest, ignoreCase)
if (i != 0) array_deli(dest, i)
} while (i != 0)
}
function array_extend(dest, src, count, lastindex, indices, i) {
lastindex = array_getlastindex(dest)
count = mkindices(src, indices)
for (i = 1; i <= count; i++) {
dest[lastindex + i] = src[indices[i]]
}
}
function array_fill(dest, i) {
array_new(dest)
for (i = 1; i <= NF; i++) {
dest[i] = $i
}
}
function array_getline(src, count, indices, i, j) {
$0 = ""
count = mkindices(src, indices)
for (i = 1; i <= count; i++) {
j = indices[i]
$j = src[j]
}
}
function array_appendline(src, count, indices, i, nf, j) {
count = mkindices(src, indices)
nf = NF
for (i = 1; i <= count; i++) {
j = nf + indices[i]
$j = src[indices[i]]
}
}
function in_array(value, values, ignoreCase, i) {
if (ignoreCase) {
value = tolower(value)
for (i in values) {
if (tolower(values[i]) == value) return 1
}
} else {
for (i in values) {
if (values[i] == value) return 1
}
}
return 0
}
function key_index(value, values, ignoreCase, i) {
if (ignoreCase) {
value = tolower(value)
for (i in values) {
if (tolower(values[i]) == value) return int(i)
}
} else {
for (i in values) {
if (values[i] == value) return int(i)
}
}
return 0
}
function array2s(values, prefix, sep, suffix, noindices, first, i, s) {
if (!prefix) prefix = "["
if (!sep) sep = ", "
if (!suffix) suffix = "]"
s = prefix
first = 1
for (i in values) {
if (first) first = 0
else s = s sep
if (!noindices) s = s "[" i "]="
s = s values[i]
}
s = s suffix
return s
}
function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) {
if (!prefix) prefix = "["
if (!sep) sep = ", "
if (!suffix) suffix = "]"
s = prefix
count = mkindices(values, indices)
for (i = 1; i <= count; i++) {
if (i > 1) s = s sep
if (!noindices) s = s "[" indices[i] "]="
s = s values[indices[i]]
}
s = s suffix
return s
}
function array_join(values, sep, prefix, suffix, count, indices, i, s) {
s = prefix
count = mkindices(values, indices)
for (i = 1; i <= count; i++) {
if (i > 1) s = s sep
s = s values[indices[i]]
}
s = s suffix
return s
}

141
lib/nulib/awk/base.core Normal file
View File

@ -0,0 +1,141 @@
# -*- coding: utf-8 mode: awk -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function num(s) {
if (s ~ /^[0-9]+$/) return int(s)
else return s
}
function ord(s, i) {
s = substr(s, 1, 1)
i = index(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", s)
if (i != 0) i += 32 - 1
return i
}
function hex(i, s) {
s = sprintf("%x", i)
if (length(s) < 2) s = "0" s
return s
}
function qhtml(s) {
gsub(/&/, "\\&amp;", s)
gsub(/"/, "\\&quot;", s)
gsub(/>/, "\\&gt;", s)
gsub(/</, "\\&lt;", s)
return s
}
function unquote_html(s) {
gsub(/&lt;/, "<", s)
gsub(/&gt;/, ">", s)
gsub(/&quot;/, "\"", s)
gsub(/&amp;/, "\\&", s)
return s
}
function qawk(s) {
gsub(/\\/, "\\\\", s)
gsub(/"/, "\\\"", s)
gsub(/\n/, "\\n", s)
return "\"" s "\""
}
function qval(s) {
gsub(/'/, "'\\''", s)
return "'" s "'"
}
function sqval(s) {
return " " qval(s)
}
function qvals( i, line) {
line = ""
for (i = 1; i <= NF; i++) {
if (i > 1) line = line " "
line = line qval($i)
}
return line
}
function sqvals() {
return " " qvals()
}
function qarr(values, prefix, i, count, line) {
line = prefix
count = array_len(values)
for (i = 1; i <= count; i++) {
if (i > 1 || line != "") line = line " "
line = line qval(values[i])
}
return line
}
function qregexp(s) {
gsub(/[[\\.^$*+?()|{]/, "\\\\&", s)
return s
}
function qsubrepl(s) {
gsub(/\\/, "\\\\", s)
gsub(/&/, "\\\\&", s)
return s
}
function qgrep(s) {
gsub(/[[\\.^$*]/, "\\\\&", s)
return s
}
function qegrep(s) {
gsub(/[[\\.^$*+?()|{]/, "\\\\&", s)
return s
}
function qsql(s, suffix) {
gsub(/'/, "''", s)
return "'" s "'" (suffix != ""? " " suffix: "")
}
function cqsql(s, suffix) {
return "," qsql(s, suffix)
}
function unquote_mysqlcsv(s) {
gsub(/\\n/, "\n", s)
gsub(/\\t/, "\t", s)
gsub(/\\0/, "\0", s)
gsub(/\\\\/, "\\", s)
return s
}
function sval(s) {
if (s == "") return s
else return " " s
}
function cval(s, suffix) {
suffix = suffix != ""? " " suffix: ""
if (s == "") return s
else return "," s suffix
}
function printto(s, output) {
if (output == "") {
print s
} else if (output ~ /^>>/) {
sub(/^>>/, "", output)
print s >>output
} else if (output ~ /^>/) {
sub(/^>/, "", output)
print s >output
} else if (output ~ /^\|&/) {
sub(/^\|&/, "", output)
print s |&output
} else if (output ~ /^\|/) {
sub(/^\|/, "", output)
print s |output
} else {
print s >output
}
}
function find_line(input, field, value, orig, line) {
orig = $0
line = ""
while ((getline <input) > 0) {
if ($field == value) {
line = $0
break
}
}
close(input)
$0 = orig
return line
}
function merge_line(input, field, key, line) {
line = find_line(input, field, $key)
if (line != "") $0 = $0 FS line
}

52
lib/nulib/awk/base.date Normal file
View File

@ -0,0 +1,52 @@
# -*- coding: utf-8 mode: awk -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function date__parse_fr(date, parts, y, m, d) {
if (match(date, /([0-9][0-9]?)\/([0-9][0-9]?)\/([0-9][0-9][0-9][0-9])/, parts)) {
y = int(parts[3])
m = int(parts[2])
d = int(parts[1])
return mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d))
} else if (match(date, /([0-9][0-9]?)\/([0-9][0-9]?)\/([0-9][0-9])/, parts)) {
basey = int(strftime("%Y")); basey = basey - basey % 100
y = basey + int(parts[3])
m = int(parts[2])
d = int(parts[1])
return mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d))
}
return -1
}
function date__parse_mysql(date, parts, y, m, d) {
if (match(date, /([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])/, parts)) {
y = int(parts[1])
m = int(parts[2])
d = int(parts[3])
return mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d))
}
return -1
}
function date__parse_any(date, serial) {
serial = date__parse_fr(date)
if (serial == -1) serial = date__parse_mysql(date)
return serial
}
function date_serial(date) {
return date__parse_any(date)
}
function date_parse(date, serial) {
serial = date__parse_any(date)
if (serial == -1) return date
return strftime("%d/%m/%Y", serial)
}
function date_monday(date, serial, dow) {
serial = date__parse_any(date)
if (serial == -1) return date
dow = strftime("%u", serial)
serial -= (dow - 1) * 86400
return strftime("%d/%m/%Y", serial)
}
function date_add(date, nbdays, serial) {
serial = date__parse_any(date)
if (serial == -1) return date
serial += nbdays * 86400
return strftime("%d/%m/%Y", serial)
}

201
lib/nulib/awk/csv Normal file
View File

@ -0,0 +1,201 @@
# -*- coding: utf-8 mode: awk -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
@include "base.core"
@include "base.array"
function csv__parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) {
line = substr(line, 2)
resl = ""
while (1) {
pos = index(line, qchar)
if (pos == 0) {
# chaine mal terminee
resl = resl line
destl[0] = ""
destl[1] = 0
return resl
}
if (echar != "" && pos > 1) {
# tenir compte du fait qu"un caratère peut être mis en échappement
prevc = substr(line, pos - 1, 1)
quotec = substr(line, pos, 1)
nextc = substr(line, pos + 1, 1)
if (prevc == echar) {
# qchar en échappement
tmpl = substr(line, 1, pos - 2)
resl = resl tmpl quotec
line = substr(line, pos + 1)
continue
}
tmpl = substr(line, 1, pos - 1)
if (nextc == colsep || nextc == "") {
# fin de champ ou fin de ligne
resl = resl tmpl
destl[0] = substr(line, pos + 2)
destl[1] = nextc == colsep
return resl
} else {
# erreur de syntaxe: guillemet non mis en échappement
# ignorer cette erreur et prendre le guillemet quand meme
resl = resl tmpl quotec
line = substr(line, pos + 1)
}
} else {
# pas d"échappement pour qchar. il est éventuellement doublé
tmpl = substr(line, 1, pos - 1)
quotec = substr(line, pos, 1)
nextc = substr(line, pos + 1, 1)
if (nextc == colsep || nextc == "") {
# fin de champ ou fin de ligne
resl = resl tmpl
destl[0] = substr(line, pos + 2)
destl[1] = nextc == colsep
return resl
} else if (nextc == qchar) {
# qchar en echappement
resl = resl tmpl quotec
line = substr(line, pos + 2)
} else {
# erreur de syntaxe: guillemet non mis en échappement
# ignorer cette erreur et prendre le guillemet quand meme
resl = resl tmpl quotec
line = substr(line, pos + 1)
}
}
}
}
function csv__parse_unquoted(line, destl, colsep, qchar, echar, pos) {
pos = index(line, colsep)
if (pos == 0) {
destl[0] = ""
destl[1] = 0
return line
} else {
destl[0] = substr(line, pos + 1)
destl[1] = 1
return substr(line, 1, pos - 1)
}
}
function csv__array_parse(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) {
array_new(fields)
array_new(destl)
i = 1
shouldparse = 0
# shouldparse permet de gérer le cas où un champ vide est en fin de ligne.
# en effet, après "," il faut toujours parser, même si line==""
while (shouldparse || line != "") {
if (index(line, qchar) == 1) {
value = csv__parse_quoted(line, destl, colsep, qchar, echar)
line = destl[0]
shouldparse = destl[1]
} else {
value = csv__parse_unquoted(line, destl, colsep, qchar, echar)
line = destl[0]
shouldparse = destl[1]
}
fields[i] = value
i = i + 1
}
if (nbfields) {
nbfields = int(nbfields)
i = array_len(fields)
while (i < nbfields) {
i++
fields[i] = ""
}
}
return array_len(fields)
}
BEGIN {
DEFAULT_COLSEP = ","
DEFAULT_QCHAR = "\""
DEFAULT_ECHAR = ""
}
function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) {
return csv__array_parse(fields, line, nbfields, colsep, qchar, echar)
}
function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) {
if (colsep == "") colsep = DEFAULT_COLSEP
if (qchar == "") qchar = DEFAULT_QCHAR
if (echar == "") echar = DEFAULT_ECHAR
return csv__array_parse(fields, line, nbfields, colsep, qchar, echar)
}
function parsecsv(line, fields) {
array_parsecsv(fields, line)
array_getline(fields)
return NF
}
function getlinecsv(file, fields) {
if (file) {
getline <file
} else {
getline
}
return parsecsv($0)
}
function csv__should_quote(s) {
if (s ~ /^[[:blank:][:cntrl:][:space:]]/) return 1
if (s ~ /[[:blank:][:cntrl:][:space:]]$/) return 1
return 0
}
function array_formatcsv2(fields, colsep, mvsep, qchar, echar, count, indices, line, i, value) {
line = ""
count = mkindices(fields, indices)
for (i = 1; i <= count; i++) {
value = fields[indices[i]]
if (i > 1) line = line colsep
if (qchar != "" && index(value, qchar) != 0) {
if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value);
else gsub(qchar, "&&", value);
}
if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || csv__should_quote(value))) {
line = line qchar value qchar
} else {
line = line value
}
}
return line
}
function array_formatcsv(fields) {
return array_formatcsv2(fields, ",", ";", "\"", "")
}
function array_printcsv(fields, output) {
printto(array_formatcsv(fields), output)
}
function get_formatcsv( fields) {
array_fill(fields)
return array_formatcsv(fields)
}
function formatcsv() {
$0 = get_formatcsv()
}
function printcsv(output, fields) {
array_fill(fields)
array_printcsv(fields, output)
}
function array_findcsv(fields, input, field, value, nbfields, orig, found, i) {
array_new(orig)
array_fill(orig)
array_new(fields)
found = 0
while ((getline <input) > 0) {
array_parsecsv(fields, $0, nbfields)
if (fields[field] == value) {
found = 1
break
}
}
close(input)
array_getline(orig)
if (!found) {
delete fields
if (nbfields) {
nbfields = int(nbfields)
i = array_len(fields)
while (i < nbfields) {
i++
fields[i] = ""
}
}
}
return found
}

57
lib/nulib/awk/enc.base64 Normal file
View File

@ -0,0 +1,57 @@
# -*- coding: utf-8 mode: awk -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function base64__and(var, x, l_res, l_i) {
l_res = 0;
for (l_i = 0; l_i < 8; l_i++){
if (var%2 == 1 && x%2 == 1) l_res = l_res/2 + 128;
else l_res /= 2;
var = int(var/2);
x = int(x/2);
}
return l_res;
}
# Rotate bytevalue left x times
function base64__lshift(var, x) {
while(x > 0){
var *= 2;
x--;
}
return var;
}
# Rotate bytevalue right x times
function base64__rshift(var, x) {
while(x > 0){
var = int(var/2);
x--;
}
return var;
}
BEGIN {
BASE64__BYTES = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
}
function b64decode(src, result, base1, base2, base3, base4) {
result = ""
while (length(src) > 0) {
# Specify byte values
base1 = substr(src, 1, 1)
base2 = substr(src, 2, 1)
base3 = substr(src, 3, 1); if (base3 == "") base3 = "="
base4 = substr(src, 4, 1); if (base4 == "") base4 = "="
# Now find numerical position in BASE64 string
byte1 = index(BASE64__BYTES, base1) - 1
if (byte1 < 0) byte1 = 0
byte2 = index(BASE64__BYTES, base2) - 1
if (byte2 < 0) byte2 = 0
byte3 = index(BASE64__BYTES, base3) - 1
if (byte3 < 0) byte3 = 0
byte4 = index(BASE64__BYTES, base4) - 1
if (byte4 < 0) byte4 = 0
# Reconstruct ASCII string
result = result sprintf( "%c", base64__lshift(base64__and(byte1, 63), 2) + base64__rshift(base64__and(byte2, 48), 4) )
if (base3 != "=") result = result sprintf( "%c", base64__lshift(base64__and(byte2, 15), 4) + base64__rshift(base64__and(byte3, 60), 2) )
if (base4 != "=") result = result sprintf( "%c", base64__lshift(base64__and(byte3, 3), 6) + byte4 )
# Decrease incoming string with 4
src = substr(src, 5)
}
return result
}

21
lib/nulib/bash/base Normal file
View File

@ -0,0 +1,21 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@cooked nocomments
# shim pour les fonctions de nulib.sh au cas où ce module n'est pas chargée
if [ -z "$NULIBDIR" -o "$NULIBDIR" != "$NULIBINIT" ]; then
function module:() { :; }
function function:() { :; }
function require:() { :; }
function import:() { :; }
fi
##@include base.init
##@include base.core
##@include base.str
##@include base.arr
##@include base.io
##@include base.eval
##@include base.split
##@include base.path
##@include base.args
module: base base_ "Chargement de tous les modules base.*"
NULIB_RECURSIVE_IMPORT=1
require: base.init base.core base.str base.arr base.io base.eval base.split base.path base.args

176
lib/nulib/bash/base.args Normal file
View File

@ -0,0 +1,176 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@cooked nocomments
module: base.args base_ "Fonctions de base: analyse d'arguments"
require: base.arr
function: base_myargs_local "Afficher des commandes pour rendre locales des variables utilisées par base_myargs()
Cela permet d'utiliser base_myargs() à l'intérieur d'une fonction. Par défaut, la génération automatique de l'autocomplete est désactivée."
function base_myargs_local() {
# par défaut, désactiver génération de autocomplete
echo "local NULIB_ARGS_HELP_DESC NULIB_ARGS_HELP_USAGE NULIB_ARGS_HELP_OPTIONS args"
echo "local NULIB_ARGS_DISABLE_AC=1"
echo "local NULIB_ARGS_ONERROR_RETURN=1"
}
function: base_myargs: "Débuter la description des arguments reconnus par ce script.
Arguments
: \$1 est un résumé de l'objet de ce script
: \$2 est le nom du script s'il est différent de \$MYNAME
Le mode opératoire est généralement le suivant:
~~~
myargs:
desc \"faire un traitement\"
usage \"MYNAME [options] <args>\"
arg -o:,--output:file output= \"spécifier le fichier destination\"
arg -h:,--host:host hosts+ \"spécifier les hôtes concernés\"
arg -c,--count count=1
parse \"\$@\"; set -- \"\${args[@]}\"
~~~"
function base_myargs:() {
NULIB_ARGS_HELP_DESC=
NULIB_ARGS_HELP_USAGE=
NULIB_ARGS_HELP_OPTIONS=()
args=()
function desc() { base_myargs_desc "$@"; }
function usage() { base_myargs_usage "$@"; }
function arg() { base_myargs_add "$@"; }
function parse() { base_myargs_parse "$@"; }
}
function: base_myargs_desc ""
function base_myargs_desc() {
NULIB_ARGS_HELP_DESC="$*"
}
function: base_myargs_usage ""
function base_myargs_usage() {
NULIB_ARGS_HELP_USAGE="$*"
}
function: base_myargs_add "Ajouter une définition d'option
Syntaxes
: base_arg MODE
: base_arg [MODE] -OPTIONS ACTION DESC
: base_arg [MODE] VARIABLE DESC
MODE peut être l'un des caractères '+', '-', '%' et a un effet sur l'analyse
entière de la ligne de commande
* Les caractères '+' et '-' influent sur la méthode d'analyse. Par défaut, les
options sont valides n'importe où sur la ligne de commande. Avec '+',
l'analyse s'arrête au premier argument qui n'est pas une option. Avec '-', les
options sont valides n'importe ou sur la ligne de commande, mais les arguments
ne sont pas réordonnés, et apparaissent dans l'ordre de leur mention.
* Le caractère '%' demande que toutes les variables mentionnées à partir de ce
moment soient initialisées. Elle sont garanties d'être vides.
Avec la première syntaxe, on définit précisément l'option. Deux formes sont
supportées. La forme détermine le type d'action
* Avec la forme '-OPT VAR[=VALUE]', OPT est une description d'option, VAR un nom
de variable à mettre à jour, et VALUE une valeur éventuelle pour les options
sans argument. Si plusieurs options sont mentionnées, séparées par des
virgules, alors tous les options partagent les mêmes paramètres.
OPT peut être de la forme '-o' ou '--longopt' pour des options sans arguments.
Dans ce cas, VAR obtient le nombre de fois que l'option est mentionnée (vide
pour aucune mention, '1' pour une seule mention, etc.), sauf si on utilise la
forme VAR=VALUE, auquel cas la variable obtient la valeur VALUE, et le nombre
d'occurences de l'option n'est pas compté.
Pour faciliter la lecture:
* '--longopt .' est équivalent à '--longopt longopt'
* '--longopt: .' est équivalent à '--longopt: longopt='
Avec les formes '-o:' et '--longopt:', l'option prend un argument obligatoire.
Avec les formes '-o::' et '--longopt::', l'option prend un argument facultatif
(dans ce cas, la valeur de l'option sur la ligne de commande doit
obligatoirement être collée à l'option.)
Si ces options sont mentionnées plusieurs fois sur la ligne de commande, alors
la variable de destination est un tableau qui contient toutes les valeurs. Le
traitement de la valeur d'une variable dépend de la forme utilisée.
* Avec une option sans argument, le comportement est celui décrit ci-dessus.
* Avec une option qui prend des arguments, la forme '-o: VAR' considère que
VAR est un tableau qui contiendra toutes les valeurs mentionnées dans les
options. Avec la forme '-o: VAR=', la variable n'est pas un tableau et
contient toujours la dernière valeur spécifiée.
* Dans la forme 'opt \$cmd', la commande cmd est executée avec eval *dès* que
l'option est rencontrée. La variable option_ contient l'option, e.g. '-o' ou
'--longopt'. Le cas échéant, la variable value_ contient la valeur de
l'option. La fonction 'set@ NAME' met à jour la variable NAME, soit en lui
donnant la valeur \$value_, soit en l'incrémentant, suivant le type d'option.
La fonction 'inc@ NAME' incrémente la variable NAME, 'res@ NAME [VALUE]'
initialise la variable à la valeur VALUE, 'add@ NAME [VALUE]' ajoute VALUE à
la fin du tableau NAME. Par défaut, VALUE vaut \$value_
Avec la deuxième syntaxe, l'option est déterminée sur la base du nom de la
variable.
* Une variable de la forme 'sansarg' est pour une option simple qui ne prend pas
d'argument
* Une variable de la forme 'avecarg=[default-value]' est pour une option qui
prend un argument.
L'option générée est une option longue. En l'occurence, les options générées
sont respectivement '--sansarg' et '--avecarg:'
Les variables et les options sont toujours en minuscule. Pour les variables, le
caractère '-' est remplacé par '_'. Si une option contient une lettre en
majuscule, l'option courte correspondante à cette lettre sera aussi reconnue.
"
function base_myargs_add() {
# description des options
base_array_add args "${@:1:2}"
# puis construire la description de l'option pour l'aide
local -a os; local o odesc
base_array_split os "$1" ,
for o in "${os[@]}"; do
o="${o%%:*}"
[ -n "$odesc" ] && odesc="$odesc, "
odesc="$odesc$o"
done
for o in "${os[@]}"; do
if [[ "$o" == *:* ]]; then
if [ "${2#\$}" != "$2" ]; then
o=ARG
else
o="${2%%=*}"
o="${o^^}"
fi
[ -n "$odesc" ] && odesc="$odesc "
odesc="$odesc$o"
fi
break
done
base_array_add NULIB_ARGS_HELP_OPTIONS "$odesc"
[ -n "$3" ] && base_array_add NULIB_ARGS_HELP_OPTIONS "$3"
}
function: base_myargs_show_help ""
function base_myargs_show_help() {
local help="$MYNAME"
[ -n "$NULIB_ARGS_HELP_DESC" ] && help="$help: $NULIB_ARGS_HELP_DESC"
[ -n "$NULIB_ARGS_HELP_USAGE" ] && help="$help
USAGE
$NULIB_ARGS_HELP_USAGE"
[ ${#NULIB_ARGS_HELP_OPTIONS[*]} -gt 0 ] && help="$help
OPTIONS"
echo "$help"
for help in "${NULIB_ARGS_HELP_OPTIONS[@]}"; do
echo "$help"
done
}
function: base_myargs_parse ""
function base_myargs_parse() {
[ -z "$NULIB_NO_DISABLE_SET_X" ] && [[ $- == *x* ]] && { set +x; local NULIB_ARGS_SET_X=1; }
local r=0
if ! parse_opts "${PRETTYOPTS[@]}" "${args[@]}" @ args -- "$@"; then
edie "$args"
r=$?
fi
[ -n "$NULIB_ARGS_SET_X" ] && set -x; return $r
}

361
lib/nulib/bash/base.arr Normal file
View File

@ -0,0 +1,361 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@cooked nocomments
module: base.arr base_ "Fonctions de base: gestion des variables tableaux"
require: base.core base.str
function: base_array_count "retourner le nombre d'éléments du tableau \$1"
function base_array_count() {
eval "echo \${#$1[*]}"
}
function: base_array_isempty "tester si le tableau \$1 est vide"
function base_array_isempty() {
eval "[ \${#$1[*]} -eq 0 ]"
}
function: base_array_new "créer un tableau vide dans la variable \$1"
function base_array_new() {
eval "$1=()"
}
function: base_array_copy "copier le contenu du tableau \$2 dans le tableau \$1"
function base_array_copy() {
eval "$1=(\"\${$2[@]}\")"
}
function: base_array_add "ajouter les valeurs \$2..@ à la fin du tableau \$1"
function base_array_add() {
local __aa_a="$1"; shift
eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")"
}
function: base_array_ins "insérer les valeurs \$2..@ au début du tableau \$1"
function base_array_ins() {
local __aa_a="$1"; shift
eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")"
}
function: base_array_del "supprimer *les* valeurs \$2 du tableau \$1"
function base_array_del() {
local __ad_v
local -a __ad_vs
eval '
for __ad_v in "${'"$1"'[@]}"; do
if [ "$__ad_v" != "$2" ]; then
__ad_vs=("${__ad_vs[@]}" "$__ad_v")
fi
done'
base_array_copy "$1" __ad_vs
}
function: base_array_addu "ajouter la valeur \$2 au tableau \$1, si la valeur n'y est pas déjà
Retourner vrai si la valeur a été ajoutée"
function base_array_addu() {
local __as_v
eval '
for __as_v in "${'"$1"'[@]}"; do
[ "$__as_v" == "$2" ] && return 1
done'
base_array_add "$1" "$2"
return 0
}
function: base_array_insu "insérer la valeur \$2 au début du tableau tableau \$1, si la valeur n'y est pas déjà
Retourner vrai si la valeur a été ajoutée."
function base_array_insu() {
local __as_v
eval '
for __as_v in "${'"$1"'[@]}"; do
[ "$__as_v" == "$2" ] && return 1
done'
base_array_ins "$1" "$2"
return 0
}
function: base_array_fillrange "Initialiser le tableau \$1 avec les nombres de \$2(=1) à \$3(=10) avec un step de \$4(=1)"
function base_array_fillrange() {
local -a __af_vs
local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}"
while [ "$__af_i" -le "$__af_to" ]; do
__af_vs=("${__af_vs[@]}" "$__af_i")
__af_i=$(($__af_i + $__af_step))
done
base_array_copy "$1" __af_vs
}
function: base_array_eq "tester l'égalité des tableaux \$1 et \$2"
function base_array_eq() {
local -a __ae_a1 __ae_a2
base_array_copy __ae_a1 "$1"
base_array_copy __ae_a2 "$2"
[ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1
local __ae_v __ae_i=0
for __ae_v in "${__ae_a1[@]}"; do
[ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1
__ae_i=$(($__ae_i + 1))
done
return 0
}
function: base_array_contains "tester si le tableau \$1 contient la valeur \$2"
function base_array_contains() {
local __ac_v
eval '
for __ac_v in "${'"$1"'[@]}"; do
[ "$__ac_v" == "$2" ] && return 0
done'
return 1
}
function: base_array_icontains "tester si le tableau \$1 contient la valeur \$2, sans tenir compte de la casse"
function base_array_icontains() {
local __ac_v
eval '
for __ac_v in "${'"$1"'[@]}"; do
[ "${__ac_v,,} == "${2,,}" ] && return 0
done'
return 1
}
function: base_array_find "si le tableau \$1 contient la valeur \$2, afficher l'index de la valeur. Si le tableau \$3 est spécifié, afficher la valeur à l'index dans ce tableau"
function base_array_find() {
local __af_i __af_v
__af_i=0
eval '
for __af_v in "${'"$1"'[@]}"; do
if [ "$__af_v" == "$2" ]; then
if [ -n "$3" ]; then
recho "${'"$3"'[$__af_i]}"
else
echo "$__af_i"
fi
return 0
fi
__af_i=$(($__af_i + 1))
done'
return 1
}
function: base_array_reverse "Inverser l'ordre des élément du tableau \$1"
function base_array_reverse() {
local -a __ar_vs
local __ar_v
base_array_copy __ar_vs "$1"
base_array_new "$1"
for __ar_v in "${__ar_vs[@]}"; do
base_array_ins "$1" "$__ar_v"
done
}
function: base_array_replace "dans le tableau \$1, remplacer toutes les occurences de \$2 par \$3..*"
function base_array_replace() {
local __ar_sn="$1"; shift
local __ar_f="$1"; shift
local -a __ar_s __ar_d
local __ar_v
base_array_copy __ar_s "$__ar_sn"
for __ar_v in "${__ar_s[@]}"; do
if [ "$__ar_v" == "$__ar_f" ]; then
__ar_d=("${__ar_d[@]}" "$@")
else
__ar_d=("${__ar_d[@]}" "$__ar_v")
fi
done
base_array_copy "$__ar_sn" __ar_d
}
function: base_array_each "Pour chacune des valeurs ITEM du tableau \$1, appeler la fonction \$2 avec les arguments (\$3..@ ITEM)"
function base_array_each() {
local __ae_v
local -a __ae_a
base_array_copy __ae_a "$1"; shift
for __ae_v in "${__ae_a[@]}"; do
"$@" "$__ae_v"
done
}
function: base_array_map "Pour chacune des valeurs ITEM du tableau \$1, appeler la fonction \$2 avec les arguments (\$3..@ ITEM), et remplacer la valeur par le résultat de la fonction"
function base_array_map() {
local __am_v
local -a __am_a __am_vs
local __am_an="$1"; shift
local __am_f="$1"; shift
base_array_copy __am_a "$__am_an"
for __am_v in "${__am_a[@]}"; do
__am_vs=("${__am_vs[@]}" "$("$__am_f" "$@" "$__am_v")")
done
base_array_copy "$__am_an" __am_vs
}
function: base_array_first "afficher la première valeur du tableau \$1"
function base_array_first() {
eval "recho \"\${$1[@]:0:1}\""
}
function: base_array_last "afficher la dernière valeur du tableau \$1"
function base_array_last() {
eval "recho \"\${$1[@]: -1:1}\""
}
function: base_array_copy_firsts "copier toutes les valeurs du tableau \$2(=\$1) dans le tableau \$1, excepté la dernière"
function base_array_copy_firsts() {
eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")"
}
function: base_array_copy_lasts "copier toutes les valeurs du tableau \$2(=\$1) dans le tableau \$1, excepté la première"
function base_array_copy_lasts() {
eval "$1=(\"\${${2:-$1}[@]:1}\")"
}
function: base_array_extend "ajouter le contenu du tableau \$2 au tableau \$1"
function base_array_extend() {
eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")"
}
function: base_array_extendu "ajouter chacune des valeurs du tableau \$2 au tableau \$1, si ces valeurs n'y sont pas déjà
Retourner vrai si au moins une valeur a été ajoutée"
function base_array_extendu() {
local __ae_v __ae_s=1
eval '
for __ae_v in "${'"$2"'[@]}"; do
base_array_addu "$1" "$__ae_v" && __ae_s=0
done'
return "$__ae_s"
}
function: base_array_extend_firsts "ajouter toutes les valeurs du tableau \$2 dans le tableau \$1, excepté la dernière"
function base_array_extend_firsts() {
eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")"
}
function: base_array_extend_lasts "ajouter toutes les valeurs du tableau \$2 dans le tableau \$1, excepté la première"
function base_array_extend_lasts() {
eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")"
}
function: base_array_xsplit "créer le tableau \$1 avec chaque élément de \$2 (un ensemble d'éléments séparés par \$3, qui vaut ':' par défaut)"
function base_array_xsplit() {
eval "$1=($(recho_ "$2" | lawk -v RS="${3:-:}" '
{
gsub(/'\''/, "'\'\\\\\'\''")
print "'\''" $0 "'\''"
}'))" #"
}
function: base_array_xsplitc "variante de base_array_xsplit() où le séparateur est ',' par défaut"
function base_array_xsplitc() {
base_array_xsplit "$1" "$2" "${3:-,}"
}
function: base_array_split "créer le tableau \$1 avec chaque élément de \$2 (un ensemble d'éléments séparés par \$3, qui vaut ':' par défaut)
Les éléments vides sont ignorés. par exemple \"a::b\" est équivalent à \"a:b\""
function base_array_split() {
eval "$1=($(recho_ "$2" | lawk -v RS="${3:-:}" '
/^$/ { next }
{
gsub(/'\''/, "'\'\\\\\'\''")
print "'\''" $0 "'\''"
}'))" #"
}
function: base_array_splitc "variante de base_array_split() où le séparateur est ',' par défaut"
function base_array_splitc() {
base_array_split "$1" "$2" "${3:-,}"
}
function: base_array_xsplitl "créer le tableau \$1 avec chaque ligne de \$2"
function base_array_xsplitl() {
eval "$1=($(recho_ "$2" | strnl2lf | lawk '
{
gsub(/'\''/, "'\'\\\\\'\''")
print "'\''" $0 "'\''"
}'))" #"
}
function: base_array_splitl "créer le tableau \$1 avec chaque ligne de \$2
Les lignes vides sont ignorés."
function base_array_splitl() {
eval "$1=($(recho_ "$2" | strnl2lf | lawk '
/^$/ { next }
{
gsub(/'\''/, "'\'\\\\\'\''")
print "'\''" $0 "'\''"
}'))" #"
}
function: base_array_join "afficher le contenu du tableau \$1 sous forme d'une liste de valeurs séparées par \$2 (qui vaut ':' par défaut)
* Si \$1==\"@\", alors les éléments du tableaux sont les arguments de la fonction à partir de \$3
* Si \$1!=\"@\" et que le tableau est vide, afficher \$3
* Si \$1!=\"@\", \$4 et \$5 sont des préfixes et suffixes à rajouter à chaque élément"
function base_array_join() {
local __aj_an __aj_l __aj_j __aj_s="${2:-:}" __aj_pf __aj_sf
if [ "$1" == "@" ]; then
__aj_an="\$@"
shift; shift
else
__aj_an="\${$1[@]}"
__aj_pf="$4"
__aj_sf="$5"
fi
eval '
for __aj_l in "'"$__aj_an"'"; do
__aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf"
done'
if [ -n "$__aj_j" ]; then
recho "$__aj_j"
elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then
recho "$3"
fi
}
function: base_array_joinc "afficher les éléments du tableau \$1 séparés par ','"
function base_array_joinc() {
base_array_join "$1" , "$2" "$3" "$4"
}
function: base_array_joinl "afficher les éléments du tableau \$1 à raison d'un élément par ligne"
function base_array_joinl() {
base_array_join "$1" "
" "$2" "$3" "$4"
}
function: base_array_mapjoin "map le tableau \$1 avec la fonction \$2, puis afficher le résultat en séparant chaque élément par \$3
Les arguments et la sémantique sont les mêmes que pour base_array_join() en
tenant compte de l'argument supplémentaire \$2 qui est la fonction pour
base_array_map() (les autres arguments sont décalés en conséquence)"
function base_array_mapjoin() {
local __amj_src="$1" __amj_func="$2" __amj_sep="$3"
shift; shift; shift
if [ "$__amj_src" == "@" ]; then
local -a __amj_tmpsrc
__amj_tmpsrc=("$@")
__amj_src=__amj_tmpsrc
set --
fi
local -a __amj_tmp
base_array_copy __amj_tmp "$__amj_src"
base_array_map __amj_tmp "$__amj_func"
base_array_join __amj_tmp "$__amj_sep" "$@"
}
function: base_array_fix_paths "Corriger les valeurs du tableau \$1. Les valeurs contenant le séparateur \$2(=':') sont séparées en plusieurs valeurs.
Par exemple avec le tableau input=(a b:c), le résultat est input=(a b c)"
function base_array_fix_paths() {
local __afp_an="$1" __afp_s="${2:-:}"
local -a __afp_vs
local __afp_v
base_array_copy __afp_vs "$__afp_an"
base_array_new "$__afp_an"
for __afp_v in "${__afp_vs[@]}"; do
base_array_split __afp_v "$__afp_v" "$__afp_s"
base_array_extend "$__afp_an" __afp_v
done
}

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