Compare commits

..

63 Commits

Author SHA1 Message Date
4080daa0b8 Intégration de la branche release-3.0.0 2015-12-24 15:39:53 +04:00
d3df5079f2 Intégration de la branche release-2.26.0 2015-12-24 12:17:33 +04:00
7cced4ad6f Intégration de la branche release-2.25.0 2015-12-24 11:15:24 +04:00
ee940402c7 Intégration de la branche release-2.24.1 2015-12-24 10:12:15 +04:00
ab76191789 Intégration de la branche release-2.24.0 2015-12-24 09:58:40 +04:00
38ae8be186 Intégration de la branche release-2.23.1 2015-12-15 11:01:55 +04:00
3f2f3346f7 Intégration de la branche release-2.23.0 2015-12-15 10:06:48 +04:00
e44ce6fcd3 Intégration de la branche release-2.22.0 2015-12-07 19:05:05 +04:00
2831e43a54 Intégration de la branche release-2.21.0 2015-12-07 15:12:53 +04:00
e9fbe9d7c3 Intégration de la branche release-2.20.0 2015-11-12 15:41:26 +04:00
bcf67ae1ef Intégration de la branche release-2.19.0 2015-11-02 11:04:09 +04:00
abe87b47ec Intégration de la branche release-2.18.0 2015-10-27 12:06:05 +04:00
90856f1319 Intégration de la branche release-2.17.2 2015-09-26 12:25:35 +04:00
0de8da913b Intégration de la branche release-2.17.1 2015-09-26 12:21:50 +04:00
338cd9734c Intégration de la branche release-2.17.0 2015-09-26 11:51:47 +04:00
0045ccf949 Intégration de la branche release-2.16.0 2015-09-10 11:16:54 +04:00
897dfb8517 Intégration de la branche release-2.15.0 2015-09-08 10:15:00 +04:00
133bcf2419 Intégration de la branche release-2.14.0 2015-09-03 09:04:47 +04:00
db0e830dcd Intégration de la branche release-2.13.0 2015-09-01 15:44:56 +04:00
39d612d433 Intégration de la branche release-2.12.1 2015-08-24 16:12:07 +04:00
Jephte CLAIN
c722a4d05c Intégration de la branche release-2.12.0 2015-08-23 22:57:19 +04:00
d605891f76 Intégration de la branche release-2.11.0 2015-08-21 10:31:46 +04:00
ed6a617449 Intégration de la branche release-2.10.0 2015-08-19 10:23:43 +04:00
7da96328b8 Intégration de la branche release-2.9.0 2015-08-10 14:05:25 +04:00
893380539f Intégration de la branche release-2.8.0 2015-07-22 15:09:33 +04:00
b0444d7b05 Intégration de la branche release-2.7.0 2015-07-17 22:03:31 +04:00
05c1c25929 Intégration de la branche release-2.6.0 2015-07-10 17:32:52 +04:00
3459d6ad8f Intégration de la branche release-2.5.1 2015-07-03 08:29:46 +04:00
Jephte CLAIN
80790935f7 Intégration de la branche release-2.5.0 2015-07-03 07:39:24 +04:00
9742df29ed Intégration de la branche release-2.4.0 2015-07-01 04:04:28 +04:00
a196607359 Intégration de la branche release-2.3.0 2015-07-01 03:09:04 +04:00
53ce593a4f Intégration de la branche release-2.2.0 2015-06-24 16:19:51 +04:00
02742deccc Intégration de la branche release-2.1.1 2015-06-22 11:37:49 +04:00
79df3907b6 Intégration de la branche release-2.1.0 2015-06-22 10:25:29 +04:00
9d52f4d019 Intégration de la branche release-2.0.0 2015-06-22 00:48:49 +04:00
b0aa8f23a7 Intégration de la branche release-1.19.0 2015-06-21 10:27:26 +04:00
e0b458f777 Intégration de la branche release-1.18.0 2015-06-09 10:40:31 +04:00
311f965013 Intégration de la branche release-1.17.0 2015-06-07 14:00:48 +04:00
71dd907b7c Intégration de la branche release-1.16.0 2015-06-04 22:14:30 +04:00
1dbb612e75 Intégration de la branche release-1.15.0 2015-05-22 17:03:10 +04:00
6b979d5a0c Intégration de la branche release-1.14.0 2015-05-22 16:41:56 +04:00
6733435943 Intégration de la branche release-1.13.0 2015-05-22 16:04:53 +04:00
a14208ad14 Intégration de la branche release-1.12.0 2015-05-22 13:37:17 +04:00
7b3aae26b6 Intégration de la branche release-1.11.0 2015-05-22 11:41:37 +04:00
2bd3e2052f Intégration de la branche release-1.10.0 2015-05-20 12:09:30 +04:00
9516f09504 Intégration de la branche release-1.9.0 2015-05-19 18:25:39 +04:00
bc3cbb4175 Intégration de la branche release-1.8.1 2015-05-19 10:45:42 +04:00
4bdbbd5751 Intégration de la branche release-1.8.0 2015-05-19 10:28:24 +04:00
07ef5622ef Intégration de la branche release-1.7.0 2015-05-15 16:12:01 +04:00
6ce2ce8d95 Intégration de la branche release-1.6.0 2015-05-04 12:41:10 +04:00
22244ac9bf Intégration de la branche release-1.5.1 2015-04-29 10:14:58 +04:00
a5366af24d Intégration de la branche release-1.4.1 2015-04-29 10:12:56 +04:00
062d73edcc Intégration de la branche release-1.4.0 2015-04-27 18:13:08 +04:00
05016e76ad Intégration de la branche release-1.3.0 2015-04-24 12:33:31 +04:00
80f88573ea Intégration de la branche release-1.2.4 2015-04-20 17:55:47 +04:00
5d02319c30 Intégration de la branche release-1.2.3 2015-04-20 17:44:38 +04:00
1781cab87c Intégration de la branche release-1.2.2 2015-04-20 01:16:33 +04:00
345e248a9e Intégration de la branche release-1.2.1 2015-04-20 01:15:43 +04:00
8ca2ca1dd2 Intégration de la branche release-1.2.0 2015-04-16 14:00:03 +04:00
4a3fd02f3c Intégration de la branche release-1.1.1 2015-04-16 12:12:09 +04:00
7329665b90 Intégration de la branche release-1.1.0 2015-04-16 12:10:01 +04:00
579436a540 Intégration de develop 2015-04-14 10:08:37 +04:00
002809c34d support du mode offline pour vcs 2015-03-09 16:41:48 +04:00
677 changed files with 32937 additions and 74207 deletions

4
.udir
View File

@ -16,10 +16,8 @@ rm_utools=
kvm_service=
# Faut-il installer le service openvz-fix-etchosts?
openvz_service=
# Faut-il installer le service kill-ssh-user-sessions?
ksus_service=
configure_variables=(dest uninst_utools rm_utools kvm_service openvz_service ksus_service)
configure_variables=(dest uninst_utools rm_utools kvm_service openvz_service)
configure_dest_for=(bashrc profile lib/uinst/conf lib/uinst/rootconf lib/profile.d/nutools.shared lib/bashrc.d/bash_completion.shared lib/init.d/kvm-stop-all legacy/sysinc/utools legacy/sysinc/system_caps legacy/sysinc/private/init)
config_scripts=(lib/uinst/conf lib/uinst/system_caps.legacy)
install_profiles=true

1445
CHANGES.md

File diff suppressed because it is too large Load Diff

420
CHANGES.txt Normal file
View File

@ -0,0 +1,420 @@
## Version 3.0.0 du 24/12/2015-15:39
4b1c30b nouvelles fonctions pour le module cgi. cgilsxml, cgiupload et cgiparams sont rassemblés dans le module cgisupport
## Version 2.26.0 du 24/12/2015-12:17
d5a2cce cgilsxml.py: rajouter la variable env/query_vars
## Version 2.25.0 du 24/12/2015-11:15
6c73940 cgilsxml.py: désactiver le cache par défaut
## Version 2.24.1 du 24/12/2015-10:12
3aba3e3 bug
## Version 2.24.0 du 24/12/2015-09:58
b288cf2 apacheconfig: support des fichiers de confs --> /etc/apache2/cond.d sur debian wheezy-
2e3fe66 ussh: forcer l'allocation d'un tty avec --cc
58fa40c ussh: ajouter le support de uwatch
7bc63c5 maj doc uwatch
2d2754b ajout de uwatch pour afficher un compte
4376fff maj doc
bb176d7 maj du template pour runsconfig
## Version 2.23.1 du 15/12/2015-11:01
d8d0cc8 cgilsxml: sélectionner automatiquement un groupe seul
## Version 2.23.0 du 15/12/2015-10:06
501a7d2 cgilsxml: script_name et xslt peuvent être spécifié dans les paramètres QUERY_STRING
ebe4599 Intégration de la branche runs
35eadc1 correction d'un bug avec la recherche d'un fichier de recette
98ba626 les recettes ont maintenant l'extension .rr par défaut
a2e863e chercher aussi les scripts dans le sous-répertoire runs dans les répertoires d'hôte
## Version 2.22.0 du 07/12/2015-19:05
dbc4d9a uscrontab: ne pas afficher plusieurs fois un même message quand le verrou est posé. n'afficher le message sur la pause qu'avec un tty
9821d20 ajouter le lien vers cgilsxml.py
## Version 2.21.0 du 07/12/2015-15:12
d7b468d cgilsxml: ajouter les variables dlname, size, Y, m, d, H, M, S. maj doc
eac94a7 cgiupload: possibilité de filtrer sur le nom du fichier ou son type de contenu
fae2111 ajout de cgilsxml
26fe709 apacheconfig: -S peut aussi être utilisé avec --localhosts
7c6ad6a apacheconfig: nouvelles options pour le développement
c2d5eab pxs fait aussi git pull avec un dépôt sans annexe
dca7bee pxs fonctionne pour les dépôt normaux comme pci -A
## Version 2.20.0 du 12/11/2015-15:41
16d95d2 apache_autoconf(): déploiement des certificats autorité
775a021 nutools: ajout de cpvcs() pour copier avec la sémantique de cpnovcs() les fichiers de VCS aussi
1ca0ee5 runs: ajout des options --force, --copy-links et --with-vcs à ref()
91686fb templatectl: il n'est plus nécessaire de spécifier explicitement fichier.template
## Version 2.19.0 du 02/11/2015-11:03
37f3bff apacheconfig: diverses corrections de bugs
5d3861b apacheconfig: si host==@@dhost@@, alors hostname=@@dhostname@@ et aliases=@@daliases@@
27592d4 apacheconfig: support des hôtes dynamiques ou statiques
93ac7ea re-écrire la gestion des templates pour apacheconfig et runsconfig
## Version 2.18.0 du 27/10/2015-12:05
434403a Intégration de la branche uscrontab
2118885 uscrontab: possibilité de mettre en pause sans modifier les planifications en cours
0eeee20 awkrun: renommer les fonctions quote_*
18691c8 upassword: maj doc et support des commentaires pour le mode batch
## Version 2.17.2 du 26/09/2015-12:25
1837a0c pxs: corriger xget, xcopy, xmove pour utiliser directement git annex sync
## Version 2.17.1 du 26/09/2015-12:21
c8c6744 pxs: support des versions <= 5.20150825
## Version 2.17.0 du 26/09/2015-11:51
552e4ba améliorer pxs pour un dépôt en mode direct
2ce66e6 maj doc
## Version 2.16.0 du 10/09/2015-11:16
42aa7ea fonctions e*: changer l'affichage en mode NO_COLOR pour afficher les préfixes complets
## Version 2.15.0 du 08/09/2015-10:14
69ee45a Intégration de la branche prel-fixes
47b6e5b créer VERSION.txt et CHANGES.txt à la racine du projet
9d8a747 faire le push à la fin des opérations d'update et/ou de merge
## Version 2.14.0 du 03/09/2015-09:04
9dcd60b pxs transfert les données aussi en mode direct
## Version 2.13.0 du 01/09/2015-15:44
8d2e386 uscrontab: permettre d'ignorer le code d'erreur pour une commande planifiée
aa989ef Intégration de la branche uinst
58d9f16 uinst -y pose toujours la question si le répertoire est calculé automatiquement
594fd4e activer l'autocomplétion pour uinst -h
## Version 2.12.1 du 24/08/2015-16:12
e356c2b bug avec le calcul du système
e040cac Avec les fonctions e*, afficher le statut de façon explicite en mode non coloré
## Version 2.12.0 du 23/08/2015-22:57
dcb85ac Améliorer le déploiement uinst:rsync avec préfixes pour les hôtes distants
## Version 2.11.0 du 21/08/2015-10:31
d9282f7 uinst: ajouter l'option -h pour la méthode uinst:rsync
7643573 nettoyer la branche
## Version 2.10.0 du 19/08/2015-10:23
6ba41b9 support de --uses-su pour ruinst -C
## Version 2.9.0 du 10/08/2015-14:04
447d13f support de nouvelles versions d'OS pour sysinfos
48e111a fconv et fnconv: le premier argument est le fichier s'il n'est pas spécifié avec -f
c29f4b9 mkiso: nouvelles options -A et -V
662b82f caturl --check ne doit pas afficher l'url
## Version 2.8.0 du 22/07/2015-15:09
0f5b572 uinst installe maintenant les profils en mode partagé par défaut
fb6b492 améliorer l'affichage des scripts geturl et openurl
## Version 2.7.0 du 17/07/2015-22:03
7e2a6c3 update-nutools ignore par défaut l'eventuel proxy défini par http_proxy
13215c3 apacheconfig: améliorer l'affichage de l'aide et support du répertoire .apacheconfig
27f5f7a pyulib honore maintenant UTOOLS_NO_COLORS
3ee6cb4 diminuer l'indentation pour les fonctions e*
d4ac5f7 modifier l'affichage des fonction e*
## Version 2.6.0 du 10/07/2015-17:32
efa6b3a Intégration de la branche ftps
3288999 authftp: support tls en forçant l'utilisation de lftp
58e7f6f pconf reconnait maintenant les arguments offline et online
## Version 2.5.1 du 03/07/2015-08:29
abc4cb9 dumpclients: possibilité de choisir les champs supplémentaires à afficher
## Version 2.5.0 du 03/07/2015-07:39
2e15cbe Ajouter l'option -z à dumpclients
## Version 2.4.0 du 01/07/2015-04:04
fda97a8 mise à jour de upassword
## Version 2.3.0 du 01/07/2015-03:09
f581aa9 Intégration de la branche pdev-merges
80d7a73 ajouter les options -b et -s à pdev
## Version 2.2.0 du 24/06/2015-16:19
98cfdfc Intégration de la branche update-upassword
34f027b bug avec la présence du scheme dans sha
b5e6c13 Intégration de la branche update-upassword
e4e2fa7 mise à jour upassword pour afficher sha en hexadécimal
## Version 2.1.1 du 22/06/2015-11:37
40225b0 Intégration de la branche proxy-default
2fa0791 profile.d/proxy lit aussi les valeurs par défaut pour l'hôte
## Version 2.1.0 du 22/06/2015-10:25
2a3eb76 Intégration de la branche uenv-modifs
bd8c7f8 correction d'un bug avec le nom final
d73c929 correction d'un bug avec le choix du répertoire de destination
e9089d8 les répertoires de profil partagé et de machine sont traités comme un seul répertoire
e3f76cd possibilité de spécifier si un profil doit être installé dans le répertoire de profil partagé
## Version 2.0.0 du 22/06/2015-00:48
8286b29 Intégration de la branche uenv-modifs
c43cda0 les répertoires de profil sont spécifiques au nom de la machine
## Version 1.19.0 du 21/06/2015-10:27
387dec2 Intégration de la branche add-pxwa
4d0b734 ajout de la commande xwebapp
## Version 1.18.0 du 09/06/2015-10:40
01e2929 Intégration de la branche fix-javaproperties
b24e9ff norm_properties() affiche les caractères en majuscule, comme JavaProperties#store()
## Version 1.17.0 du 07/06/2015-14:00
e2d0c0c Intégration de la branche pdev-fix
1cc3bd4 ajouter l'option --sync à pdev
## Version 1.16.0 du 04/06/2015-22:14
4a15085 Intégration de la branche verbose-update
8a27561 pu: afficher un message s'il y a des modifications locales
## Version 1.15.0 du 22/05/2015-17:03
e715087 Intégration de la branche update-upassword
a74a373 upassword: possibilité de spécifier de façon dynamique la ligne à afficher après
## Version 1.14.0 du 22/05/2015-16:41
d8f20c3 Intégration de la branche update-upassword
dea524a ajout du mode batch
## Version 1.13.0 du 22/05/2015-16:04
275bff8 Intégration de la branche update-upassword
1ce1d98 mise à jour de upassword
## Version 1.12.0 du 22/05/2015-13:37
57fc84d correction d'un bug avec prel -s
cf108d7 Intégration de la branche prel-show-modifs
a744f48 prel -s afficher la liste des modifications qui seraient enregistrées
## Version 1.11.0 du 22/05/2015-11:41
2984052 Intégration de la branche quiet-completion
755cfa7 ne pas afficher les erreurs pour les fonctions de complétion de git
2b5eb2a Intégration de la branche pu
b004730 uproject update fait fetch puis merge, manuellement
## Version 1.10.0 du 20/05/2015-12:08
bf1d86a Intégration de la branche pu-auto-forward
8bf8164 fast-forwarder automatiquement les branches locales par rapport aux branches distantes
8baabea Intégration de la branche ptools-maj-topic
5ff5b7d déterminer les branches de topic: ignorer les branches avec un slash dans le nom
## Version 1.9.0 du 19/05/2015-18:25
5933089 Intégration de la branche awkfsv
caeb06e possibilité de spécifier les types des champs pour mysqlloadcsv
b2c9f81 uawk requière maintenant de spécifier le nom de l'outil
## Version 1.8.1 du 19/05/2015-10:45
de8d690 Intégration de la branche annex-support
2044181 ne pas synchroniser l'annexe en mode automatique
## Version 1.8.0 du 19/05/2015-10:27
4779695 Intégration de la branche annex-support
89ad130 support de git-annex pour pp et pdev
## Version 1.7.0 du 15/05/2015-16:11
16ad285 Intégration de la branche nutools
93d8262 rajouter le script nutools pour vérifier la version installée de nutools. renommer la fonction nutools() en pconf()
## Version 1.6.0 du 04/05/2015-12:40
0463b2c Intégration de la branche norm_props
48ca720 ajout de l'en-tête
## Version 1.5.1 du 29/04/2015-10:14
4c92f54 Intégration de la branche push-all
02c15f9 pp -a pousse toutes les branches et tous les tags. ajouter les options -b et -t pour pousser respectivement toutes les branches et tous les tags
## Version 1.4.1 du 29/04/2015-10:12
Release erronée, à ignorer
## Version 1.4.0 du 27/04/2015-18:12
7122fc4 Intégration de la branche norm-properties
845c54e ajout de la fonction norm_properties
## Version 1.3.0 du 24/04/2015-12:32
bdc6e9b Intégration de la branche localhost
94b2b48 reconnaitre la valeur spéciale localhost pour check_hostname()
## Version 1.2.4 du 20/04/2015-17:55
988e045 bug
## Version 1.2.3 du 20/04/2015-17:43
Correction d'un bug avec la copie des fichiers
d3ab6b8 bug
7e0d44b cosmetic
## Version 1.2.2 du 20/04/2015-01:16
## Version 1.2.1 du 20/04/2015-01:15
145acfa bug
## Version 1.2.0 du 16/04/2015-13:59
d756a6c Intégration de la branche ldapt
57dac04 support de xempty explicite, et de la possibilité de désactiver ce traitement
75f21b5 support des attributs ordonnés
00088b3 cosmetic
## Version 1.1.1 du 16/04/2015-12:10
Mise à jour de .ulibver
## Version 1.1.0 du 16/04/2015-12:09
4b445a2 Intégration de la branche ldapt-ev
f8bd000 support de la nouvelle fonction ensureval
dbd9605 Intégration de la branche ptools
1fb27d6 pousser le tag quand il a été créé
## Version 1.0.0 du 14/04/2015-10:05
commencer à suivre les versions de nutools: cette release est la première de
la série
66bbf23 Intégration de la branche update-ulibver
f5aeff7 maj de ulib
073e7b0 Intégration de la branche ptools
8f6a32b forcer la création de la destination. afficher un message informatif
48d9104 Intégration de la branche ptools
6890d30 workaround pour le bug sous debian squeeze
91de409 Intégration de la branche ptools
cd50646 ne pas mettre à jour le fichier local
f321f1c Intégration de la branche ptools
6258a6b utiliser la version au lieu de la release
5589314 bug
10a7d4e Intégration de la branche ptools
cd92832 ne pas supprimer la branche develop
3f1dc3e Intégration de la branche ptools
ce050db ajout d'un changelog possibilité d'éditer le changelog avec -e supprimer les options courtes -z et -Z
2bc314c ajout de --merge-log supprimer les options courtes -z et -Z
fc35a05 inclure la liste des modifications dans le log
4578219 Intégration de la branche ptools
5b0715e vérifier la présence dans le dépôt distant
0e6e94c Intégration de la feature branch ptools
10152b4 calcul de newver action delete
6c8e750 implémener -z et -Z
2f41de3 cosmetic
5f6d5bb ajout des options courtes -z et -Z
18bb510 supprimer l'option courte -d qui est déjà utilisée pour diff
dd2a712 ajout de -d et --force-delete
38f04ff maj doc
523d3f1 doc pour nouvelle fonctionnalité à implémenter
13dfb9a Intégration de la feature branch prel-tag
da96f72 ajout d'un tag après fusion de la branche dans master
2a71a51 Intégration de la feature branch prel-tag
09c59d8 ne pas afficher les erreurs
3e514d5 maj doc
f9d4556 Intégration de la feature branch linedots
7ae9b48 ajout de elinedots
ffa9195 fast-forwarder si possible
f64117c cosmetic
d8a3ed4 checkout par défaut
89be42e ne pas utiliser csort
881bcde tenir compte de la valeur de origin
7c67a7f tenir compte des branches potentielles
b757ca1 Intégration de la feature branch git-opts
c3683a5 bug
743e17b fast-forwarder automatiquement la branche vers laquelle on bascule
e3e3bbb ajout de git_fast_forward
1661ee5 ajout des fonctions git_is_ancestor(), git_should_ff(), git_should_push(), git_is_merged()
2e215cc utiliser l'api
b975724 maj doc
262d12e toujours charger le module
8ae0a8d utiliser nouvelle API --add-metadata
259e1be ajout de --add-metadata support de --allow-empty pour --update
8d3ab79 ajout de semver_addmetadata utiliser API moderne pour les perfs
ac940b8 ne garder que les infos sur la branche courante dans les metadata
1e11a57 ajouter pz pour faire une archive d'un projet
9389fb0 autoriser --allow-emptyp pour l'action --show
f90ad4d bug
26aa98f cosmetic
8deda74 cosmetic
f8c4a54 calcul de la version avec --prel
22a26d9 support des numéros style maven
4f0a746 support des fichiers pom.xml
6d85330 Intégration de la feature branch ptools
f60787a prel est maintenant en topevel
7647d2d prel est prêt à passer en toplevel
7c36761 possibilité de faire -u et -m dans la même commande
de618ae possibilité de ne pas supprimer une feature branch après son intégration
57bf621 cosmetic
8d4d35d mettre à jour la version avec pver
f98c977 support de -v en mode auto
4b64305 finaliser l'option -u
5862e75 ne pas charger le fichier s'il n'existe pas
e5b8b81 début d'implémentation de update
9235ce1 nettoyage
ffaed8a quelques corrections
9182dcf maj api chargement depuis ~/etc/completion.d
bbbc35a maj api chargement depuis ~/etc/completion.d
d2133c7 intégrer les modifications faites à l'ur
90772f0 Intégration de la feature branch completion
163df88 bug
e8d683b bug
041a830 suite du support de bash_completion
9c17a60 framework pour la complétion automatique
bbbe6c4 l'option -c ne fait que le basculement ou la création. Le choix de la version se fera avec -u
c5ba03b ajouter les completions pour prel
2b2b7f5 début d'implémentation de prel -c
3f925ca déplacer le code de pver dans ptools

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
@ -17,7 +17,7 @@ function ensure_kvm() {
# sont chargés, et que le service libvirt-bin est démarré
local module modified
if [ -z "$check_only" -a -n "$exclusive" ]; then
if [ -z "$check_only" ]; then
# Vérifier que les modules vbox* sont déchargés
for module in vboxpci vboxnetadp vboxnetflt vboxdrv; do
if lsmod | quietgrep "$module"; then
@ -54,24 +54,19 @@ function ensure_kvm() {
[ -n "$modified" ] && sleep 1
service=
function __guess_service() {
if check_sysinfos -d redhatlike; then
for i in libvirtd libvirtd-bin; do
[ -f "/etc/init.d/$i" ] && {
service="$i"
break
}
done
}
if check_sysinfos -d redhatlike; then
__guess_service
elif check_sysinfos -d debian -v jessie+; then
__guess_service
elif check_sysinfos -d debianlike; then
service=libvirt-bin
fi
if [ -n "$service" ]; then
# s'assurer que le service tourne
service "$service" startm
service libvirt-bin startm
else
return 0
fi
@ -82,7 +77,7 @@ function ensure_virtualbox() {
# sont chargés, et que le service vboxdrv est démarré
local module modified
if [ -z "$check_only" -a -n "$exclusive" ]; then
if [ -z "$check_only" ]; then
# Vérifier que kvm{,_intel,_amd} ne sont pas chargés
for module in kvm_intel kvm_amd kvm; do
if lsmod | quietgrep "$module"; then
@ -117,12 +112,9 @@ function ensure_virtualbox() {
}
check_only=
exclusive=
parse_opts + "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-c,--check-only,--check check_only=1 \
-x,--exclusive exclusive=1 \
-s,--shared exclusive= \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
run_as_root "$@"

View File

@ -1,61 +0,0 @@
# nutools
nutools est un ensemble d'utilitaires pour faciliter l'utililisation des Unixes,
en particulier Linux, mais aussi MacOS X et Cygwin.
C'est aussi une librairie de scripts shell réutilisables ([ulib](doc/ulib.md))
et une librairie de modules python réutilisables (pyulib)
## Installation
~~~sh
git clone https://git.univ-reunion.fr/modules/nutools
git checkout develop
cd nutools
./uinst -y
~~~
Dans l'exemple ci-dessous, on installe la branche develop, pour avoir toujours
la dernière version des outils.
Pour mettre à jour, il suffit de mettre à jour le dépôt et de relancer
l'installation
~~~sh
cd nutools
git pull
./uinst -y
~~~
Alternative, il est possible de demander à nutools à se mettre à jour avec la
dernière version
~~~sh
update-nutools --develop
~~~
## Prérequis
Python >= 2.3 et GNU Awk sont requis pour que toutes les fonctionnalités soient
supportées.
* Sous Linux, lors de l'installation du package, les meilleurs efforts sont fait
pour que ces packages soient installés.
* Sous MacOSX, il faut installer manuellement Fink, DarwinPorts ou Homebrew
## Outils
Chaque outil contient une aide intégrée. Il suffit de lancer l'outil avec
l'argument `--help` pour avoir une aide détaillée.
* Déploiement d'un répertoire ou d'une archive
* [uinst](doc/tools/uinst): Déploiement local
* [mkusfx](doc/tools/mkusfx): Faire une archive auto-installable avec uinst
* [ruinst](doc/tools/ruinst): Déploiement distant avec uinst
* [runs](doc/tools/runs): Lancer un script avec le protocole RUNS
* [rruns](doc/tools/rruns): Déploiement distant avec runs
* Librairie réutilisable de scripts shell
* [uinc](doc/tools/uinc): Dépliage des inclusions dans un fichier
* [ulibsync](doc/tools/ulibsync): Faire une copie locale pour un projet de ulib et/ou pyulib
* Autres outils
* [udir](doc/tools/udir): Gestion des paramètres d'un répertoire. Ces paramètres sont entre
autres utilisés par uinst et uinc.
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

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
@ -9,38 +10,19 @@ USAGE
$scriptname [options] vmName
OPTIONS
-n, --nop
Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés
-l, --list
Lister les machines virtuelles
-s, --start
Démarrer la machine virtuelle. C'est l'action par défaut.
-n Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés
-l Lister les machines virtuelles
-s Démarrer la machine virtuelle (par défaut)
Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
affiché
-x, --gui
-b, --headless
--separate
Ces options ne sont valides qu'avec -s et permettent de spécifier le
type de démarrage: 'gui' permet d'afficher une fenêtre complète dans
laquelle l'accélération graphique est supportée, headless démarre la
machine en tâche de fond, et separate affiche une fenêtre qui attaque la
machine démarrée en tâche de fond. --separate est l'option par défaut.
-k, -t, --stop
Arrêter la machine virtuelle. Les options -p, -H, -R, -S et -r
permettent de spécifier le type d'arrêt de la machine virtuelle
-p, --sleep
Mettre en veille la machine virtuelle (par ACPI)
-H, --poweroff
Arrêter sauvagement la machine virtuelle
-R, --reset
Redémarrer sauvagement la machine virtuelle
-S, --savestate
Enregistrer l'état de la machine virtuelle
-r, --rrestart
Arrêter la machine, restaurer l'état du dernier snapshot puis la
relancer.
-g, --gui
Afficher le gestionnaire de machines virtuelle"
-b Démarrer la VM sans interface graphique. Cette option n'est valide
qu'avec -s
-k Arrêter la machine virtuelle (par ACPI)
-p Mettre en veille la machine virtuelle (par ACPI)
-H Arrêter sauvagement la machine virtuelle
-R Redémarrer sauvagement la machine virtuelle
-S Enregistrer l'état de la machine virtuelle
-g Afficher le gestionnaire de machines virtuelle"
}
function build_arrays() {
@ -80,24 +62,20 @@ function start_virtualbox() {
}
action=start
type=separate
stopaction=acpipowerbutton
restore=
headless=
parse_opts + "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-n,--nop action=nop \
-n action=nop \
-l,--list action=list \
-s,--start action=start \
-x,--gui type=gui \
-b,--background,--headless type=headless \
--separate type=separate \
-b,--background,--headless headless=1 \
-k,-t,--stop '$action=stop; stopaction=acpipowerbutton' \
-p,--sleep '$action=stop; stopaction=acpisleepbutton' \
-H,--poweroff '$action=stop; stopaction=poweroff' \
-R,--reset '$action=stop; stopaction=reset' \
-S,--savestate '$action=stop; stopaction=savestate' \
-r,--rrestart '$action=stop; restore=1' \
-g,--gui action=gui \
-H '$action=stop; stopaction=poweroff' \
-R '$action=stop; stopaction=reset' \
-S '$action=stop; stopaction=savestate' \
-g action=gui \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
"$scriptdir/EnsureVM" virtualbox || die
@ -132,8 +110,8 @@ $(array_join rvms "
fi
if [ -n "$vm" ]; then
estep "Démarrage de $vm de type $type"
VBoxManage -q startvm --type "$type" "$vm" "$@"
estep "Démarrage de $vm${headless:+ en tâche de fond}"
VBoxManage -q startvm ${headless:+--type headless} "$vm" "$@"
else
ewarn "Aucune VM à démarrer n'a été trouvée"
fi
@ -142,23 +120,10 @@ elif [ "$action" == stop ]; then
if [ -z "$vm" -a "${rvms[*]}" ]; then
select_vm rvms vm "Choisissez la VM à arrêter avec la méthode $stopaction"
fi
[ -n "$vm" ] || die
estep "Arrêt de $vm avec la méthode $stopaction"
VBoxManage -q controlvm "$vm" "$stopaction" || die
if [ -n "$restore" ]; then
ebegin "Attente de l'arrêt"
while true; do
build_arrays
array_contains svms "$vm" && break
edot 0
sleep 1
done
eend
estep "Restauration du snapshot"
VBoxManage -q snapshot "$vm" restorecurrent || die
estep "Démarrage"
VBoxManage -q startvm --type "$type" "$vm"
if [ -n "$vm" ]; then
estep "Arrêt de $vm avec la méthode $stopaction"
VBoxManage -q controlvm "$vm" "$stopaction"
fi
elif [ "$action" == gui ]; then

86
Sscreen
View File

@ -1,86 +0,0 @@
#!/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'
COULEUR_JAUNE=$'\e[33;1m'
COULEUR_BLEUE=$'\e[34;1m'
COULEUR_BLANCHE=$'\e[37;1m'
function __ask() {
local r
read -p "$1" -t 2 r
[ $? -gt 128 -o -z "$r" -o "$r" == "o" -o "$r" == "O" -o "$r" == "y" -o "$r" == "Y" ]
}
function __auto_screen() {
# Si on est déjà dans screen, ne rien faire
[ -z "$STY" ] || return
# 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
echo "${COULEUR_JAUNE}WARNING${COULEUR_NORMALE} screen introuvable. une session bash classique sera lancée"
exec /bin/bash -l
fi
# corriger TERM pour les vieilles versions de Linux
case "$TERM" in
xterm*) TERM=xterm;;
screen*) TERM=screen;;
esac
export TERM
local msgprefix
local screens count
local session_name="nutools-$USER"
screens="$(LANG=C screen -ls | grep -Ei "${session_name}.*attached|detached")"
if [ -n "$screens" ]; then
count="$(echo "$screens" | wc -l)"
else
count=0
fi
if [ $count -gt 0 ]; then
if [ $count -eq 1 ]; then
msgprefix="Il y a ${COULEUR_BLEUE}1 session screen en cours${COULEUR_NORMALE}
Cette session"
else
msgprefix="Il y a ${COULEUR_ROUGE}$count sessions screen en cours${COULEUR_NORMALE}:
$screens
La première session"
fi
if __ask "
$msgprefix sera reconnectée automatiquent dans 2 secondes
Voulez-vous reconnecter la session screen? [On] "; then
exec screen -q -s -/bin/bash -xRR -S "$session_name"
else
exec /bin/bash -l
fi
elif __ask "
Une ${COULEUR_VERTE}nouvelle session screen${COULEUR_NORMALE} sera lancée automatiquement dans 2 secondes
Voulez-vous lancer une session screen? [On] "; then
exec screen -q -s -/bin/bash -RR -S "$session_name"
else
exec /bin/bash -l
fi
}
if [ $# -gt 0 ]; then
# lancer les commandes fournies avant de lancer SCREEN
"$@"
fi
__auto_screen

25
TODO.md
View File

@ -1,25 +0,0 @@
# 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
3.0.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,8 +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
apacheconfig_initvars
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS template apache.tools
function display_help() {
uecho "$scriptname: Gérer la configuration d'un serveur web apache
@ -16,19 +15,6 @@ OPTIONS
Créer un nouveau répertoire de configuration pour un hôte
-d, --destdir DESTDIR[=$TEMPLATECTL_NAME]
Nom du répertoire local de configuration.
-f,--full
--partial
Indiquer respectivement que la configuration est complète ou partielle.
Avec la configuration complète, le serveur peut être complètement
configuré avec tous les fichiers présents. Avec la configuration
partielle, uniquement les informations spécifiques à un service en
particulier sont disponibles.
Cette option est utilisée avec --create. Par défaut, la configuration
est partielle.
Pour le moment, la seule différence est que --full crée un fichier de
configuration nommé .apacheconfig alors que --partial crée un fichier
nommé apacheconfig.conf qui est visible et donc découvrable et éditable
plus facilement
-t, --template [OPT]
Gérer les fichiers du répertoire local avec templatectl. La valeur de
@ -59,23 +45,9 @@ OPTIONS
Lors du déploiement de la configuration, les valeurs des variables
dynamiques sont remplacées dans les fichiers destination.
Les arguments qui restent sont passés tels quels à apache_autoconf
-p, --pull
Faire 'git pull' avant --update
-F, --fix-ip
Corriger les lignes de la forme '<VirtualHost *:PORT>#*ip:IP' et les
remplacer par '<VirtualHost IP:PORT>'
Cela permet de déployer une version de production des fichiers de
configuration.
-N, --network-config
Mettre aussi à jour la configuration réseau.
--no-post-update
Ne pas lancer le script post-update.sh après le déploiement s'il existe.
Le script est lancé avec les mêmes arguments que apacheconfig_deploy()
la fonction définie dans le module apache.tools
-r, --certsdir CERTSDIR
Spécifier le cas échéant le répertoire contenant les certificats à
déployer. Cet argument est requis si le répertoire certsconf/ existe,
sauf si les certificats sont déjà déployés.
déployer. Cet argument est requis si le répertoire certsconf/ existe.
--localhosts
Créer dans le fichier /etc/hosts tous les noms d'hôte ayant un suffixe
@ -90,48 +62,108 @@ OPTIONS
-S, --one-site SITE
Ne déployer que le fichier de site spécifié. Cette option est utilisée
avec --deploy ou --localhosts et est utile pour le développement et les
tests.
-k, --new-site HOST.TLD
Créer une définition pour un nouveau site à partir des fichiers du
répertoires templates/
-K, --new-site-templatedir TEMPLATEDIR
Spécifier le répertoire source pour les templates de site utilisés par
l'option --new-site. Par défaut, utiliser le répertoire templates/ situé
dans le répertoire de configuration.
Si TEMPLATEDIR est un nom simple sans séparateur de chemin '/' et qu'un
répertoire templates/TEMPLATEDIR existe, alors prendre ce répertoire-là
comme source.
--new-site-force
Avec --new-site, utiliser le nom d'hôte fourni même s'il n'est pas
pleinement qualifié"
tests."
}
# toujours placer une variable dépendante AVANT la variable maitre
TEMPLATE_STATIC_VARS=(
hostname aliases host
certsdir caname
)
TEMPLATE_DYNAMIC_VARS=(
ips_namevirtualhosts ips_listens ips
dhostname daliases dhost
admin configdir
)
TEMPLATE_NOWRITE_VARS=(hostname aliases dhostname daliases configdir)
__TEMPLATE_DEFAULTF_host=__template_defaultf_host
__TEMPLATE_UPDATEF_host=__template_updatef_host
function __template_defaultf_host() {
myhost
}
function __template_updatef_host() {
if [ "$host" == "@@dhost@@" ]; then
__template_set_var hostname @@dhostname@@
__template_set_var aliases @@daliases@@
else
local update_aliases
[ "$aliases" == "$hostname" ] && update_aliases=1
__template_set_var hostname "${host%%.*}"
[ -n "$update_aliases" ] && __template_set_var aliases "$hostname"
[ -n "$ips" ] || __template_set_var ips ""
fi
}
__TEMPLATE_DEFAULTF_ips=__template_defaultf_ips
__TEMPLATE_UPDATEF_ips=__template_updatef_ips
function __template_defaultf_ips() {
local -a ips
if [ "$host" != "@@dhost@@" ]; then
resolv_ips ips "$host"
else
resolv_ips ips "$dhost"
fi
echo "${ips[*]}"
}
function __template_updatef_ips() {
local -a ipports; local ipport ip port
local nvhs ls
nvhs=
ls=
array_split ipports "$ips" " "
for ipport in "${ipports[@]}"; do
splitpair "$ipport" ip port
[ -n "$port" ] || port=443
[ -n "$nvhs" ] || nvhs="#ips_namevirtualhosts"
nvhs="$nvhs
NameVirtualHost $ip:$port"
[ -n "$ls" ] || ls="#ips_listens"
ls="$ls
Listen $ip:$port"
done
[ -n "$nvhs" ] && __template_set_var ips_namevirtualhosts "$nvhs"
[ -n "$ls" ] && __template_set_var ips_listens "$ls"
}
__TEMPLATE_DEFAULTF_dhost=__template_defaultf_dhost
__TEMPLATE_UPDATEF_dhost=__template_updatef_dhost
function __template_defaultf_dhost() {
myhost
}
function __template_updatef_dhost() {
local update_daliases
[ "$daliases" == "$dhostname" ] && update_daliases=1
__template_set_var dhostname "${dhost%%.*}"
[ -n "$update_daliases" ] && __template_set_var daliases "$dhostname"
[ -n "$ips" ] || __template_set_var ips ""
}
TEMPLATECTL_NAME=apacheconfig
TEMPLATECTL_SRCDIRS=(apacheconfig)
TEMPLATECTL_CONFIG="$TEMPLATECTL_NAME"
TEMPLATECTL_DEFAULTS=(
admin=supervision-gdrsi@listes.univ-reunion.fr
certsdir=1507-renater
caname=1507-DigiCertCA.crt
)
TEMPLATECTL_VARS=()
action=
destdir=
nohideconfig=auto
nohideconfig=
templateopt=
FULLCONF=
pull=
fixip=
netconf=
no_post_update=
aac_certsdir=
bits=
oneconf=
onemodule=
onesite=
site_host=
site_templdir=
site_force=
args=(
--help '$exit_with display_help'
-c,--create action=create
-d:,--destdir: destdir=
--no-hideconfig nohideconfig=1
--hideconfig nohideconfig=
-f,--full FULLCONF=1
--partial FULLCONF=
-t::,--template:: '$set@ templateopt; action=template'
--help-template '$templateopt=-help; action=template'
-l,--list '$templateopt=l; action=template'
@ -147,37 +179,39 @@ args=(
-8,--jessie '$array_add TEMPLATECTL_VARS sysver=jessie'
--bits: bits=
-u,--update,--deploy action=deploy
-p,--pull pull=1
-F,--fix-ip fixip=1
-N,--network-config netconf=1
--no-post-update no_post_update=1
-r:,--certsdir: aac_certsdir=
--localhosts action=localhosts
-C:,--one-conf: oneconf=
-M:,--one-module: onemodule=
-S:,--one-site: onesite=
-k:,--new-site: '$action=new-site; set@ site_host'
-K:,--new-site-templatedir: site_templdir=
--new-site-force site_force=
)
parse_args "$@"; set -- "${args[@]}"
if [ "$nohideconfig" == auto ]; then
[ -n "$FULLCONF" ] && nohideconfig= || nohideconfig=1
fi
__template_set_destdir destdir autocreate "$TEMPLATECTL_NAME" || die
setx config=templatectl_config "$destdir" ${nohideconfig:+nohideconfig}
modified=
templatectl_loadvars "$config" && modified=1
if [ -n "$pull" ]; then
estep "Mise à jour du dépôt"
if [ -n "$destdir" ]; then
[ -d "$destdir" ] || die "$destdir: répertoire introuvable"
(cd "$destdir" && git pull) || die
else
git pull || die
fi
if [ -n "$sysname" -o -n "$sysdist" -o -n "$sysver" ]; then
ensure_sysinfos sysname sysdist sysver
custom_sysinfos=1
else
sysname="$MYSYSNAME"
sysdist="$MYSYSDIST"
sysver="$MYSYSVER"
bits="$MYBITS"
custom_sysinfos=
fi
__template_set_var sysname "$sysname"
__template_set_var sysdist "$sysdist"
__template_set_var sysver "$sysver"
if check_sysinfos --vars sysname sysdist sysver bits -d debian -v jessie+; then
array_add TEMPLATECTL_SRCDIRS apacheconfig8
elif check_sysinfos --vars sysname sysdist sysver bits -d debian; then
array_add TEMPLATECTL_SRCDIRS apacheconfig7
else
ewarn "$(get_sysinfos_desc sysname sysdist sysver): système non supporté pour le déploiement"
fi
apacheconfig_loadconf "$destdir" "$nohideconfig" || die
apacheconfig_sysinfos "$sysname" "$sysdist" "$sysver" "$bits"
################################################################################
if [ "$action" == create ]; then
@ -200,7 +234,7 @@ if [ "$action" == create ]; then
ask_yesno "Le fichier $(ppath "$config") sera écrasé. Voulez-vous continuer?" O || die
rm -f "$config" || die
fi
templatectl -d "$destdir" --config "$config" ${nohideconfig:+--no-hide-config} --no-load-vars -m --write-vars
templatectl -d "$destdir" --config "$config" --no-load-vars -m --write-vars
################################################################################
elif [ "$action" == template ]; then
@ -214,17 +248,12 @@ elif [ "$action" == deploy -o "$action" == localhosts ]; then
[ -d "$destdir" ] || die "$destdir: répertoire introuvable"
args=(
-d "$destdir" --$action
${fixip:+--fix-ip}
${netconf:+--network-config}
${no_post_update:+--no-post-update}
${aac_certsdir:+-r "$aac_certsdir"}
-d "$destdir" --$action ${aac_certsdir:+-r "$aac_certsdir"}
${oneconf:+--one-conf "$oneconf"}
${onemodule:+--one-module "$onemodule"}
${onesite:+--one-site "$onesite"}
${custom_sysinfos:+--sysname "$sysname" --sysdist "$sysdist" --sysver "$sysver" --bits "$bits"}
)
# sur une ligne séparée parce que $bits peut être vide
[ -n "$custom_sysinfos" ] && array_add args --sysname "$sysname" --sysdist "$sysdist" --sysver "$sysver" --bits "$bits"
for __name in "${TEMPLATE_DYNAMIC_VARS[@]}"; do
array_add args -v "$__name=${!__name}"
done
@ -233,182 +262,23 @@ elif [ "$action" == deploy -o "$action" == localhosts ]; then
if [ "$action" == deploy ]; then
etitle "Mise à jour du système"
apacheconfig_deploy \
"$destdir" "$aac_certsdir" \
"$config" "$oneconf" "$onemodule" "$onesite" \
"$custom_sysinfos" "$sysname" "$sysdist" "$sysver" "$bits" \
"$netconf" "$fixip" "$no_post_update" || die
eend
args=(apache_autoconf
--ignore "$(basename -- "$config")"
${oneconf:+--one-conf "$(basename -- "$oneconf")"}
${onemodule:+--one-module "$(basename -- "$onemodule")"}
${custom_sysinfos:+--sysname "$sysname" --sysdist "$sysdist" --sysver "$sysver" --bits "$bits"}
)
elif [ "$action" == localhosts ]; then
etitle "Mise à jour de /etc/hosts"
apacheconfig_localhosts "$destdir" "$aac_certsdir" "$onesite" || die
eend
args=(apache_autoconf_localhosts)
fi
################################################################################
elif [ "$action" == new-site ]; then
host="$site_host"
templdir="$site_templdir"
if [ -z "$templdir" -a -d "$destdir/templates" ]; then
# si on ne précise pas le template à utiliser, alors afficher
# éventuellement un menu si plusieurs templates sont disponibles
templdirs=()
if [ -n "$(list_all "$destdir/templates" "*SITE*")" ]; then
array_add templdirs templates
templdir=templates
fi
array_from_lines stempldirs "$(list_dirs "$destdir/templates" | grep -v SITE)"
for stempldir in "${stempldirs[@]}"; do
if [ -n "$(list_all "$destdir/templates/$stempldir" "*SITE*")" ]; then
array_add templdirs "templates/$stempldir"
[ -n "$templdir" ] || templdir="templates/$stempldir"
fi
done
if [ ${#templdirs[*]} -gt 1 ]; then
simple_menu templdir templdirs -t "Choix du répertoire des modèles" -m "Veuillez choisir le modèle à utiliser"
fi
templdir="$destdir/$templdir"
fi
if [[ "$templdir" != */* ]] && [ -d "$destdir/templates/$templdir" ]; then
templdir="$destdir/templates/$templdir"
elif [ -z "$templdir" ]; then
templdir="$destdir/templates"
fi
[ -d "$templdir" ] || die "$templdir: répertoire introuvable"
force="$site_force"
clrtempl=
ssltempl=
certstempl=
wwwtempl=
array_from_lines clrtempls "$(list_files "$templdir" "*SITE*.conf")"
array_from_lines ssltempls "$(list_files "$templdir" "*SITE*.ssl.conf")"
array_from_lines certstempls "$(list_files "$templdir" "*SITE*-certs.conf")"
for xtempl in "${ssltempls[@]}" "${certstempls[@]}"; do
array_del clrtempls "$xtempl"
args=("${args[@]}"
"$destdir" "$aac_certsdir"
${onesite:+--one-site "$(basename -- "$onesite")"}
)
for __name in "${TEMPLATE_DYNAMIC_VARS[@]}"; do
array_add args "$__name=${!__name}"
done
[ ${#clrtempls[*]} -gt 0 ] && clrtempl="${clrtempls[0]}"
[ ${#ssltempls[*]} -gt 0 ] && ssltempl="${ssltempls[0]}"
[ ${#certstempls[*]} -gt 0 ] && certstempl="${certstempls[0]}"
array_from_lines wwwtempls "$(list_dirs "$templdir" "*SITE*")"
[ ${#wwwtempls[*]} -gt 0 ] && wwwtempl="${wwwtempls[0]}"
found=
for i in "$clrtempl" "$ssltempl" "$certstempl" "$wwwtempl"; do
[ -n "$i" ] && { found=1; break; }
done
[ -n "$found" ] || die "Aucun template disponible"
if [ -z "$force" ] && [[ "$host" != *.* ]]; then
die "$host n'est pas un nom d'hôte pleinement qualifié"
fi
hostip=
for i in "$clrtempl" "$ssltempl"; do
[ -n "$i" -a -f "$templdir/$i" ] || continue
quietgrep SITE_IP "$templdir/$i" && { hostip=1; break; }
done
if [ -n "$hostip" ]; then
# Il y a un champ SITE_IP, il faut demander à l'utilisateur l'adresse ip
# correspondante
[[ "$host" == *.* ]] && hostdomain="${host#*.}" || hostdomain=
pri=
hostip=
i=0
while [ $i -lt ${#PUBDOMAINS[*]} ]; do
if [ "${PUBDOMAINS[$i]}" == "$hostdomain" ]; then
pri="$VSPREFIX${host%$hostdomain}${PRIDOMAINS[$i]}"
resolv_ips ips "$pri"
if [ -n "$ips" ]; then
hostip="${ips[0]}"
break
fi
fi
i=$(($i + 1))
done
if [ -z "$hostip" ]; then
pri="$VSPREFIX$host"
resolv_ips ips "$pri"
[ -n "$ips" ] && hostip="${ips[0]}"
fi
if [ -n "$pri" -a -n "$hostip" ]; then
enote "Correspondance automatique $host --> $pri"
read_value "Veuillez confirmer l'adresse IP d'écoute" hostip "$hostip" N
else
enote "Vous devez saisir l'adresse IP privée correspondant à $host"
read_value "Veuillez entrer l'adresse IP *privée* d'écoute" hostip "" N
fi
[ -n "$hostip" ] || ewarn "Vous avez choisi de ne pas spécifier d'adresse IP d'écoute. Il faudra corriger manuellement les fichiers générés"
fi
etitle "$host"
hostname="${host%%.*}"
clrconf="${clrtempl/SITE/$hostname}"
sslconf="${ssltempl/SITE/$hostname}"
certsconf="${certstempl/SITE/$hostname}"
wwwdir="${wwwtempl/SITE/$hostname}"
mkdir -p "$destdir/certsconf"
mkdir -p "$destdir/sites"
sedscript=
[ -n "$hostip" ] && sedscript="$sedscript
s/SITE_IP/$hostip/g"
sedscript="$sedscript
s/SITE.TLD/$host/g
s/SITE/$hostname/g"
if [ -z "$clrtempl" ]; then
:
elif [ ! -f "$templdir/$clrtempl" ]; then
ewarn "Le fichier $(ppath "$templdir/$clrtempl") n'existe pas. La copie ne sera pas complète"
elif [ -f "$destdir/sites/$clrconf" ]; then
ewarn "Le fichier sites/$clrconf existe déjà. Il ne sera pas écrasé."
else
estep "sites/$clrconf"
sed "$sedscript" "$templdir/$clrtempl" >"$destdir/sites/$clrconf" || die
fi
if [ -z "$ssltempl" ]; then
:
elif [ ! -f "$templdir/$ssltempl" ]; then
ewarn "Le fichier $(ppath "$templdir/$ssltempl") n'existe pas. La copie ne sera pas complète"
elif [ -f "$destdir/sites/$sslconf" ]; then
ewarn "Le fichier sites/$sslconf existe déjà. Il ne sera pas écrasé."
else
estep "sites/$sslconf"
sed "$sedscript" "$templdir/$ssltempl" >"$destdir/sites/$sslconf" || die
fi
if [ -z "$certstempl" ]; then
:
elif [ ! -f "$templdir/$certstempl" ]; then
ewarn "Le fichier $(ppath "$templdir/$certstempl") n'existe pas. La copie ne sera pas complète"
elif [ -f "$destdir/certsconf/$certsconf" ]; then
ewarn "Le fichier certsconf/$certsconf exite déjà. Il ne sera pas écrasé."
else
estep "certsconf/$certsconf"
sed "$sedscript" "$templdir/$certstempl" >"$destdir/certsconf/$certsconf" || die
fi
if [ -z "$wwwtempl" ]; then
:
elif [ ! -d "$templdir/$wwwtempl" ]; then
ewarn "Le répertoire $(ppath "$templdir/$wwwtempl") n'existe pas. La copie ne sera pas complète"
elif [ -d "$destdir/$wwwdir" ]; then
ewarn "Le répertoire $wwwdir existe déjà. Il ne sera pas écrasé."
else
estep "$wwwdir"
cpdirnovcs "$templdir/$wwwtempl" "$destdir/$wwwdir" || die
sed -i "$sedscript" "$destdir/$wwwdir/.udir" || die
fi
"${args[@]}" "$@" || die
eend
if [ -n "$wwwtempl" ]; then
eimportant "Ne pas oublier le cas échéant de mettre à jour HTDMAPPINGS dans $(ppath "$config") e.g.
HTDMAPPINGS=($wwwdir)"
fi
fi

40
authftp
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é
@ -27,11 +28,6 @@ OPTIONS
--tls
Indiquer que la connexion se fera en TLS. Implique --lftp puisque ncftp
ne le supporte pas.
--verify-certificate
Avec la connexion --tls, forcer la vérification du certificat, qui est
désactivée par défaut.
--sftp
Indiquer que la connexion se fait via SFTP. Implique --lftp --noproxy
note: A cause d'une limitation de lftp, ce n'est pas possible de se connecter
automatiquement avec lftp si le mot de passe contient une virgule. A cause de la
@ -39,14 +35,6 @@ façon dont le proxy ftp est configuré, il n'est pas possible de se connecter
avec un mot de passe qui contient le caractère @"
}
function hostkeyfailed_apropos() {
eecho "\
------------------------------------------------------------------------------------
Si le message 'Host key verification failed' apparait, lancer la commande suivante:
ssh -o StrictHostKeyChecking=no -o BatchMode=yes $1
------------------------------------------------------------------------------------"
}
AUTHFTP_PROXY_DISABLED=1 # par défaut, ne pas utiliser le proxy
set_defaults proxy
set_defaults authftp
@ -55,8 +43,6 @@ noproxy="$AUTHFTP_PROXY_DISABLED"
lftp=
options=()
tls=
verify_certificate=no
sftp=
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-p,--proxy noproxy= \
@ -64,8 +50,6 @@ parse_opts "${PRETTYOPTS[@]}" \
-l,--lftp lftp=1 \
-o:,--option: options \
--tls tls=1 \
--verify-certificate verify_certificate=yes \
--sftp sftp=1 \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
[ -n "$noproxy" -o -n "$AUTHFTP_PROXY_HOST" ] || die "AUTHFTP_PROXY_HOST doit être défini"
@ -78,27 +62,13 @@ read_value -i "Entrez l'identifiant de connexion" login "$2"
read_value -i "Entrez le mot de passe" password "$3"
read_value -i "Entrez le chemin" path "$4" N
[ -n "$tls" -o -n "$sftp" ] && lftp=1
[ -n "$sftp" ] && noproxy=1
[ -n "$tls" ] && lftp=1
if [ -n "$lftp" ]; then
if [ -n "$noproxy" ]; then
export LFTP_PASSWORD="$password"
if [ -n "$sftp" ]; then
url="sftp://$host/$path"
hostkeyfailed_apropos "$login@$host"
else
url="ftp://$host/$path"
fi
exec lftp "${options[@]}" -e "\
set ssl:verify-certificate $verify_certificate
open -u $login --env-password $url"
exec lftp -u "$login,$password" "${options[@]}" "ftp://$host/$path"
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"
exec lftp -u "${login}@${my_login}@${host},${password}@${my_password}" "${options[@]}" "ftp://$AUTHFTP_PROXY_HOST/$path"
fi
else
if [ -n "$noproxy" ]; then

24
caturl
View File

@ -1,26 +1,19 @@
#!/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
USAGE
$scriptname <file.url|file.desktop|URL>
OPTIONS
-c, --check
Vérifier que le fichier est valide
-g, --get
Attaquer l'url spécifiée avec curl"
$scriptname <file.url|file.desktop|URL>"
}
check=
get=
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-c,--check check=1 \
-g,--get get=1 \
--check check=1 \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
function findurl() {
@ -94,10 +87,5 @@ END { if (type == 2) print URL }
fi
fi
if [ -n "$check" ]; then
exit 0
elif [ -n "$get" ]; then
curl -fs "$URL"
else
echo "$URL"
fi
[ -n "$check" ] && exit 0
echo "$URL"

410
chrono.py
View File

@ -1,410 +0,0 @@
#!/usr/bin/env python2
# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
u"""Afficher un chronomètre"""
import os, sys, re, subprocess, traceback
from os import path
from datetime import date as Date, time as Time
from datetime import datetime as Datetime, timedelta as Timedelta
from types import IntType, LongType
DEFAULT_SOUND = path.join(path.dirname(__file__), 'lib', 'chrono.wav')
def win_playSound(name):
try: import winsound as s
except: return
if name is None:
s.PlaySound(None, s.SND_ASYNC)
else:
scriptdir = path.split(path.abspath(sys.argv[0]))[0]
soundfile = path.join(scriptdir, name)
s.PlaySound(soundfile, s.SND_FILENAME + s.SND_ASYNC)
def linux_playSound(name):
subprocess.call(['/usr/bin/aplay', '-Nq', name])
def playSound(name=None):
if os.name == 'nt':
return win_playSound(name)
elif sys.platform.startswith('linux'):
return linux_playSound(name)
def isnum(i):
return type(i) in (IntType, LongType)
RE_NUM = re.compile(r'\d+$')
def numof(s):
if isnum(s): return s
elif s is None: return None
elif RE_NUM.match(str(s)) is not None: return int(str(s))
else: return s
DEFAULT_TIMEOUT = '5'
RE_DESTHOUR = re.compile(r'@(\d+)(?:[:.](\d+)(?:[:.](\d+))?)?$')
def parse_desthour(s):
mo = RE_DESTHOUR.match(s)
if mo is None: return None
h, m, s = mo.groups()
if h is None: h = 0
if m is None: m = 0
if s is None: s = 0
h, m, s = int(h), int(m), int(s)
src = Datetime.today()
srcdate = src.date(); srctime = src.time()
destdate = srcdate; desttime = Time(h, m, s)
if desttime <= srctime: destdate = destdate + Timedelta(1)
src = Datetime.combine(srcdate, srctime)
dest = Datetime.combine(destdate, desttime)
delta = dest - src
return delta.total_seconds()
RE_TIMEOUT = re.compile(r'(\d+)(?:[:.](\d+)(?:[:.](\d+))?)?$')
def parse_timeout(s):
mo = RE_TIMEOUT.match(s)
if mo is None: return None
h, m, s = mo.groups()
if m is None and s is None:
# M
m = h
h = None
elif s is None:
# M:S
s = m
m = h
h = None
else:
# H:M:S
pass
if h is None: h = 0
if m is None: m = 0
if s is None: s = 0
h, m, s = int(h), int(m), int(s)
return h * 3600 + m * 60 + s
class Chrono:
MODE_MINUTEUR = 'M'
MODE_CHRONOMETRE = 'C'
STATE_STARTED = 'started'
STATE_PAUSED = 'paused'
STATE_STOPPED = 'stopped'
ZERO = None
state = None
mode = None
timeout = None
elapsed = None
date_start = None
max_elapsed = None
initial = None
def __init__(self, timeout=None, start=False):
self.ZERO = self.__delta(0)
self.set_timeout(timeout)
if start: self.start()
def __format(self, delta):
h = delta.seconds // 3600
seconds = delta.seconds % 3600
m = seconds // 60
s = seconds % 60
if h > 0: return '%02i:%02i:%02i' % (h, m, s)
else: return '%02i:%02i' % (m, s)
def __delta(self, timeout):
return Timedelta(seconds=timeout)
def set_timeout(self, timeout=None):
if timeout == '': timeout = None
if timeout is not None and not isnum(timeout):
tmp = parse_desthour(str(timeout))
if tmp is None: tmp = parse_timeout(timeout)
if tmp is None: tmp = int(timeout) * 60
timeout = tmp
if timeout == 0: timeout = None
self.timeout = timeout
self.elapsed = self.ZERO
self.state = self.STATE_STOPPED
if timeout is None:
self.mode = self.MODE_CHRONOMETRE
self.initial = self.__format(self.ZERO)
else:
self.mode = self.MODE_MINUTEUR
self.max_elapsed = self.__delta(timeout)
self.initial = self.__format(self.max_elapsed)
def is_chronometre(self):
return self.mode == self.MODE_CHRONOMETRE
def is_minuteur(self):
return self.mode == self.MODE_MINUTEUR
def get_elapsed(self):
if self.date_start is None: return self.ZERO
delta = Datetime.today() - self.date_start
return self.elapsed + delta
def start(self, timeout=None):
if timeout is None: timeout = self.timeout
self.elapsed = self.ZERO
self.date_start = Datetime.today()
self.state = self.STATE_STARTED
def is_started(self):
return self.state == self.STATE_STARTED
def pause(self):
if self.state == self.STATE_PAUSED:
self.date_start = Datetime.today()
self.state = self.STATE_STARTED
else:
self.elapsed = self.get_elapsed()
self.state = self.STATE_PAUSED
def is_paused(self):
return self.state == self.STATE_PAUSED
def stop(self):
self.elapsed = self.get_elapsed()
self.state = self.STATE_STOPPED
def is_stopped(self):
return self.state == self.STATE_STOPPED
def is_end(self):
if not self.is_started(): return False
if not self.is_minuteur(): return False
elapsed = self.get_elapsed()
return elapsed >= self.max_elapsed
def __repr__(self):
elapsed = self.get_elapsed() if self.is_started() else self.elapsed
if self.is_minuteur():
delta = self.max_elapsed - elapsed
if delta < self.ZERO: delta = self.ZERO
return self.__format(delta)
else:
return self.__format(elapsed)
def run_chronometre(timeout=None, autostart=False):
from Tkinter import Tk, Toplevel, Frame, Label, Entry, Button
import tkMessageBox
class Dialog(Toplevel):
def __init__(self, parent, title=None):
self.result = None
self.have_result = False
Toplevel.__init__(self, parent)
self.transient(parent)
if title: self.title(title)
self.parent = parent
body = Frame(self)
self.initial_focus = self.body(body)
body.pack(padx=5, pady=5)
self.buttonbox()
self.grab_set()
if not self.initial_focus: self.initial_focus = self
self.protocol("WM_DELETE_WINDOW", self.cancel)
self.geometry("+%d+%d" % (parent.winfo_rootx()+50,
parent.winfo_rooty()+50))
self.initial_focus.focus_set()
self.wait_window(self)
def set_result(self, result):
self.result = result
self.have_result = True
def body(self, master):
pass
def buttonbox(self):
box = Frame(self)
w = Button(box, text="OK", width=10, command=self.ok, default='active')
w.pack(side='left', padx=5, pady=5)
w = Button(box, text="Annuler", width=10, command=self.cancel)
w.pack(side='left', padx=5, pady=5)
self.bind("<Return>", self.ok)
self.bind("<Escape>", self.cancel)
box.pack()
def ok(self, event=None):
if not self.validate():
self.initial_focus.focus_set()
return
self.withdraw()
self.update_idletasks()
self.apply()
self.cancel()
def cancel(self, event=None):
self.parent.focus_set()
self.destroy()
def validate(self):
return True
def apply(self):
pass
class Config(Dialog):
def body(self, master):
Label(master, text="Nb minutes", padx=20).grid(row=0)
self.entry = Entry(master)
self.entry.grid(row=0, column=1)
return self.entry
def apply(self):
value = self.entry.get()
if value == "": result = None
else: result = value
self.set_result(result)
class Application(Frame):
root = None
chrono = None
def __init__(self, timeout=None, autostart=False, **kw):
self.chrono = Chrono(timeout)
root = Tk()
root.title("Chronomètre")
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
root.bind("c", lambda event: self.do_config())
root.bind("s", lambda event: self.do_start())
root.bind("p", lambda event: self.do_pause())
root.bind("<space>", lambda event: self.do_pause())
root.bind("q", lambda event: self.quit())
self.root = root
kw.update(master=root)
Frame.__init__(self, **kw)
self.TIME = Label(self, width=10, height=2, text=self.chrono.initial, padx=30, pady=10, font=('Helvetica', 18, "normal"))
self.START = Button(self, text="Start", command=self.do_start)
self.PAUSE = Button(self, text="Pause", command=self.do_pause, state="disabled")
self.CONFIG = Button(self, text="Config", command=self.do_config)
self.QUIT = Button(self, text="Quit", command=self.quit)
self.grid(column=0, row=0, sticky='nsew')
self.TIME.grid(column=0, row=0, columnspan=4, sticky='nsew')
self.START.grid(column=0, row=1, sticky='ew')
self.PAUSE.grid(column=1, row=1, sticky='ew')
self.CONFIG.grid(column=2, row=1, sticky='ew')
self.QUIT.grid(column=3, row=1, sticky='ew')
self.columnconfigure(0, weight=2)
self.columnconfigure(1, weight=2)
self.columnconfigure(2, weight=1)
self.columnconfigure(3, weight=1)
self.rowconfigure(0, weight=1)
if autostart: self.do_start()
def update_time(self):
chrono = self.chrono
self.TIME.configure(text=chrono)
if chrono.is_started():
if chrono.is_end():
playSound(DEFAULT_SOUND)
else:
self.root.after(300, self.update_time)
def do_start(self):
self.PAUSE.configure(state="normal", text="Pause")
self.START.configure(text="reStart")
self.chrono.start()
self.update_time()
def do_pause(self):
self.chrono.pause()
if self.chrono.is_paused():
self.PAUSE.configure(text="unPause")
else:
self.PAUSE.configure(text="Pause")
self.update_time()
def do_config(self):
chrono = self.chrono
chrono.stop()
config = Config(self.root)
if config.have_result:
try:
self.PAUSE.configure(text="Pause", state="disabled")
self.START.configure(text="Start")
chrono.set_timeout(config.result)
self.TIME.configure(text=chrono.initial)
except:
traceback.print_exc()
tkMessageBox.showerror("Valeur invalide", sys.exc_info()[1])
Application(timeout, autostart).mainloop()
if __name__ == '__main__':
from argparse import ArgumentParser, HelpFormatter
if sys.argv[1:2] == ['--compat']:
# Avec l'argument --compat, désactiver la classe FancyHelpFormatter qui
# se base sur une API non documentée
sys.argv = sys.argv[0:1] + sys.argv[2:]
FancyHelpFormatter = HelpFormatter
else:
class FancyHelpFormatter(HelpFormatter):
"""Comme HelpFormatter, mais ne touche pas aux lignes qui commencent par les
caractères '>>>'. Cela permet de mixer du texte formaté et du texte non
formaté.
"""
def _fill_text(self, text, width, indent):
return ''.join([indent + line for line in text.splitlines(True)])
def _split_lines(self, text, width):
lines = ['']
for line in text.splitlines():
if line.startswith('>>>'):
lines.append(line)
lines.append('')
else:
lines[-1] += '\n' + line
lines = filter(None, lines)
texts = []
for line in lines:
if line.startswith('>>>'):
texts.append(line[3:])
else:
texts.extend(super(FancyHelpFormatter, self)._split_lines(line, width))
return texts
AP = ArgumentParser(
usage=u"%(prog)s [options] [TIMEOUT]",
description=u"Afficher un chronomètre",
epilog=u"Si TIMEOUT est spécifié, par défaut le décompte démarre automatiquement.",
formatter_class=FancyHelpFormatter,
)
AP.set_defaults(autostart=None, timeout=None)
AP.add_argument('timeout', metavar='TIMEOUT', nargs='?',
help=u"""\
>>> '' (valeur vide)
chronomètre qui démarre à 0:00 et ne s'arrête pas
>>> 'H:M:S' (heures:minutes:secondes)
>>> ou 'M:S' (minutes:secondes)
>>> ou 'M' (minutes)
minuteur qui démarre à H:M:S et fait un décompte jusqu'à 0:00. A la fin
du décompte, une sonnerie retentit.
>>> '@H[:M[:S]]'
minuteur qui fonctionne comme précédemment, sauf qu'on spécifie l'heure
d'arrivée, et que la durée est calculée automatiquement""")
AP.add_argument('-n', '--no-autostart', dest='autostart', action='store_false',
help=u"Ne pas démarrer automatiquement le décompte même si TIMEOUT est spécifié.")
AP.add_argument('-s', '--autostart', dest='autostart', action='store_true',
help=u"Forcer le démarrage automatique du décompte, même si TIMEOUT n'est pas spécifié.")
o = AP.parse_args()
autostart = o.autostart
if autostart is None: autostart = o.timeout is not None
o.autostart = autostart
timeout = o.timeout
if timeout is None: timeout = DEFAULT_TIMEOUT
o.timeout = timeout
run_chronometre(o.timeout, o.autostart)

View File

@ -411,7 +411,7 @@ javac* | jikes*)
fi
[[ ! -z "${execute:="${compilerDir}java -cp $cacheDir${classPath:+:$classPath} $mainClass"}" ]]
# Prepare to tell javac to compile for the latest language version it supports
sourceVersion="-source $(${compilerDir}java -version 2>&1 | sed -n '1{s/.*"\(.*\)".*/\1/; s/^1\.//; s/\..*//; p}')"
sourceVersion="-source $(${compilerDir}java -version 2>&1 | sed -n '1s,[^"]*"\([1-9][1-9]*\.[1-9][1-9]*\).*,\1,p')"
;;
jikes*)
if [[ -z "$classPath" && -z "$compilerArgs" && -z "$CLASSPATH" ]] ; then

View File

@ -1,172 +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: créer un utilisateur sudoer et lui installer une clé publique ssh
USAGE
$scriptname user [-p pubkey]
OPTIONS
-p, --pkfile PKFILE
Installer la clé publique ssh contenue dans le fichier spécifié. Par
défaut, prendre le fichier ~/.ssh/id_rsa.pub de l'utilisateur courant.
-s, --pkstring PUBKEY
Installer la clé publique ssh spécifiée. Cette option avancée n'est pas
utilisée en temps normal. Elle a la priorité sur l'option --pkfile
-l, --luser
Ne pas donner à l'utilisateur le droit de sudoer.
-h, --host [USER@]HOST
Créer l'utilisateur sur l'hôte distant spécifié. Si l'utilisateur
distant n'est pas root, il doit être sudoer.
-T, --tmproot TMPROOT
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
/var/tmp. Cette option est utile pour certains serveurs, qui ont un /tmp
minuscule.
-S, --ssh SSH
Spécifier le programme à utiliser pour la connection par ssh."
}
function create_user() {
# Créer le user, si nécessaire
# retourner vrai si le user a été créé, faux si ce n'était pas nécessaire
local user="$1" password="$2"
[ -z "$(getent passwd "$user")" ] || return 1
estep "Creation de l'utilisateur $user..."
useradd -s /bin/bash -m "$user"
[ -n "$password" ] || return 0
if ! (echo "$password" | passwd --stdin "$user" 2>/dev/null); then
echo "$user:$password" | chpasswd
fi
return 0
}
function init_sudoer() {
local user="$1"
local TAB=$'\t'
if [ -d /etc/sudoers.d ]; then
if [ ! -f "/etc/sudoers.d/$user" ]; then
estep "Ajout de $user comme sudoer dans /etc/sudoers.d/$user"
echo "$user${TAB}ALL=(ALL) NOPASSWD: ALL" >"/etc/sudoers.d/$user"
chmod 440 "/etc/sudoers.d/$user"
fi
elif [ -f /etc/sudoers ]; then
if ! grep -q "^$user" /etc/sudoers; then
estep "Ajout de user comme sudoer dans /etc/sudoers..."
echo "$user${TAB}ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers
fi
fi
}
function install_pubkeys() {
# Installer la clé $1 pour l'utilisateur $2
# $1 peut contenir autant de clés que nécessaire, une par ligne
local user="$1" pubkeys="$2"
local homedir="$(eval "echo ~$user")"
[ -d "$homedir" ] || return
local sshdir="$homedir/.ssh"
if [ ! -d "$sshdir" ]; then
mkdir -p "$sshdir"
chmod 700 "$sshdir"
chown -R "$user:" "$sshdir"
fi
local ak="$sshdir/authorized_keys"
if [ ! -f "$ak" ]; then
touch "$ak"
chown "$user:" "$ak"
fi
local -a pks
local pk
array_from_lines pks "$pubkeys"
for pk in "${pks[@]}"; do
if ! grep -q "$pk" "$ak"; then
estep "Installation de la clé ${pk:0:20}... pour $user"
echo "$pk" >>"$ak"
fi
done
}
pkfile=
pkstring=
luser=
host=
tmproot=
SSH=
args=(
--help '$exit_with display_help'
-p:,--pkfile: pkfile=
-s:,--pkstring: pkstring=
-l,--luser luser=1
-h:,-H:,--host: host=
-T:,--tmproot: tmproot=
-S:,--ssh: SSH=
)
parse_args "$@"; set -- "${args[@]}"
user="$1"
[ -n "$user" ] || die "Vous devez spécifier l'utilisateur à créer"
if [ -z "$pkstring" ]; then
if [ -z "$pkfile" ]; then
if [ -f ~/.ssh/id_rsa.pub ]; then pkfile=~/.ssh/id_rsa.pub
elif [ -f ~/.ssh/id_dsa.pub ]; then pkfile=~/.ssh/id_dsa.pub
fi
fi
if [ -f "$pkfile" ]; then pkstring="$(<"$pkfile")"
elif [ -n "$pkfile" ]; then die "$pkfile: fichier introuvable"
fi
fi
if [ -z "$host" ]; then
# déploiement local
run_as_root ${pkstring:+-s "$pkstring"} ${luser:+-l} "$user"
create_user "$user"
[ -z "$luser" ] && init_sudoer "$user"
[ -n "$pkstring" ] && install_pubkeys "$user" "$pkstring"
exit 0
else
# déploiement distant
if [ -n "$host" ]; then
splituserhost "$host" remoteuser host
[ -n "$remoteuser" ] || remoteuser=root
fi
if [ -n "$SSH" ]; then
ssh=("$SSH" -o StrictHostKeyChecking=no -o ConnectTimeout=2 -qt)
scp=(scp -S "$SSH" -o StrictHostKeyChecking=no -o ConnectTimeout=2 -q)
else
ssh=(ssh -o StrictHostKeyChecking=no -o ConnectTimeout=2 -qt)
scp=(scp -o StrictHostKeyChecking=no -o ConnectTimeout=2 -q)
fi
ac_set_tmpdir workdir
mkdir "$workdir/lib"
ulibsync "$workdir/lib"
cp "$script" "$workdir"
echo "#!/bin/bash
$(qvals "./$scriptname" ${pkstring:+-s "$pkstring"} ${luser:+-l} "$user")" >"$workdir/do_remote"
chmod +x "$workdir/do_remote"
ac_set_tmpfile archive
archivename="$(basename "$archive")"
"$scriptdir/mkusfx" --tmp-archive --bare -o "$archive" "$workdir" ./do_remote || die
estep "Copie du script sur $remoteuser@$host"
"${scp[@]}" "$archive" "$remoteuser@$host:" || die
estep "Exécution du script"
"${ssh[@]}" "$remoteuser@$host" "\
__estack=$(qval "$__estack")
__tlevel=$(qval "$__tlevel")
export __estack __tlevel
${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG
}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"})"
r=$?
ac_clean "$workdir"
exit $r
fi

65
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
@ -22,19 +23,55 @@ vars="$("$scriptdir/ussh" --parse "$@")" || die
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//\'/\'\\\'\'}'"
cmd="'$(quoted_args "${args[@]}")
"'
function __ask() {
local r
read -p "$1" -t 2 r
[ $? -gt 128 -o -z "$r" -o "$r" == "o" -o "$r" == "O" -o "$r" == "y" -o "$r" == "Y" ]
}
function __auto_screen() {
# Si on est déjà dans screen, ne rien faire
[ -z "$STY" ] || return
local msgprefix
local screens count
screens="$(LANG=C screen -ls | grep -Ei "attached|detached")"
if [ -n "$screens" ]; then
count="$(echo "$screens" | wc -l)"
else
count=0
fi
if [ $count -gt 0 ]; then
if [ $count -eq 1 ]; then
msgprefix="Il y a '"$COULEUR_BLEUE"'1 session screen en cours'"$COULEUR_NORMALE"'
Cette session"
else
msgprefix="Il y a '"$COULEUR_ROUGE"'$count sessions screen en cours'"$COULEUR_NORMALE"':
$screens
La première session"
fi
if __ask "
$msgprefix sera reconnectée automatiquent dans 2 secondes
Voulez-vous reconnecter la session screen? [On] "; then
exec screen -q -s -/bin/bash -xRR
else
exec /bin/bash -l
fi
elif __ask "
Une '"$COULEUR_VERTE"'nouvelle session screen'"$COULEUR_NORMALE"' sera lancée automatiquement dans 2 secondes
Voulez-vous lancer une session screen? [On] "; then
exec screen -q -s -/bin/bash -RR
else
exec /bin/bash -l
fi
}
__auto_screen
'\'
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"
if [ $? -eq 123 ]; then
# pas de Sscreen en face, le faire à la main
${exec:+exec} \
"$ssh" "${options[@]}" -t "$host" -- \
/bin/bash -c "$cmd"
fi
${exec:+exec} "$ssh" "${options[@]}" -t "$host" -- /bin/bash -c "$cmd"
done

View File

@ -1,124 +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
[ -n "$COMPOSE_V1" ] && DOCKER_COMPOSE=(docker-compose) || DOCKER_COMPOSE=(docker compose)
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
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
-d, --mysqldump-cmd
Lancer 'mysqldump --databases --add-drop-database -hSERVICE_IP' avec
les arguments supplémentaires fournis sur la ligne de commande
-k, --klean
Lancer la commande 'klean' dans le container spécifié (supprime toutes
les données et relance le container)
-u, --user USER
-p, --password PASSWORD
Paramètres supplémentaires utilisés uniquement avec les options -c et -d"
}
service=db
ipnum=
mysql_cmd=
mysqldump_cmd=
klean=
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
-u:,--user: user=
-p:,--password: password=
)
parse_args "$@"; set -- "${args[@]}"
[ -n "$service" ] || die "Vous devez spécifier le nom du service"
found=
first=1
while true; do
if [ -f composer.json ]; then
found=1
break
fi
first=
cd ..
if [ "$(pwd)" == "$HOME" ]; then
die "Cette commande ne peut être lancée que depuis un projet Composer"
fi
done
if [ -z "$first" ]; then
enote "Le répertoire du projet est $(ppath . ~)"
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
[ -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%%,*}"
[ -n "$ip" ] || die_not_found
edebug "$service ip: $ip"
if [ -n "$mysql_cmd" ]; then
mysql -h"$ip" ${user:+-u"$user"} ${password:+-p"$password"} "$@"
elif [ -n "$mysqldump_cmd" ]; then
mysqldump --databases --add-drop-database -h"$ip" ${user:+-u"$user"} ${password:+-p"$password"} "$@"
elif [ -n "$klean" ]; then
estep "klean"
docker exec "$cid" klean
estep "wait 10sec..."
sleep 10
estep "start"
"${DOCKER_COMPOSE[@]}" start "$service"
else
[ -f bin/conndev.php ] || die "Impossible de trouver le script compagnon conndev.php"
mysql_cmd="$(php bin/conndev.php "$ip" "$@")"
edebug "mysql_cmd: $mysql_cmd"
eval "$mysql_cmd"
fi

View File

@ -1,60 +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
[ -n "$COMPOSE_V1" ] && DOCKER_COMPOSE=(docker-compose) || DOCKER_COMPOSE=(docker compose)
function display_help() {
uecho "$scriptname: ouvrir un shell dans le container
USAGE
$scriptname [CMD...]
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
équivalent à -s db
-w, --web
é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
)
parse_args "$@"; set -- "${args[@]}"
[ -n "$service" ] || die "Vous devez spécifier le nom du service"
found=
first=1
while true; do
if [ -f composer.json ]; then
found=1
break
fi
first=
cd ..
if [ "$(pwd)" == "$HOME" ]; then
die "Cette commande ne peut être lancée que depuis un projet Composer"
fi
done
if [ -z "$first" ]; then
enote "Le répertoire du projet est $(ppath . ~)"
fi
###
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[@]}"

View File

@ -1,282 +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: mettre à jour un module ur/* ou lib/* sans utiliser composer
ça permet de faire du développement plus rapidement sans utiliser les dépôts de
type path
USAGE
$scriptname modules...
OPTIONS
-n, --fake
Afficher simplement ce qui serait fait
-q, --quiet
Ne pas lancer rsync en mode verbose
-g, --no-wait
Ne pas attendre avant de faire git commit
--rsync
Mettre à jour les répertoires dans vendor/ qui ne sont pas des liens
symboliques à partir des projets dépendants correspondants. Les liens
symboliques créés avec --link sont ignorés. C'est l'option par défaut.
-l, --link
Transformer les clones de dépôts dans vendor/ en liens symboliques vers
les projets dépendants correpondants.
-k, --copy
Transformer les liens symboliques dans vendor/ en copies des projets
dépendants correspondants. Les répertoires qui ne sont pas des liens
symboliques sont ignorés.
Cette option peut être considérée comme le contraire de --link
-i, --install
Supprimer les répertoires des projets dépendants dans vendor/, qu'il
s'agisse de liens symboliques ou de répertoires normaux, puis les faire
recréer par 'composer i'
Celà permet de ramener le projet à l'état original.
-j, --reinstall-link
Supprimer les répertoires des projets dépendants dans vendor/ s'il
s'agit de liens symboliques, puis les faire recréer par 'composer i'
Cette variante est plus rapide que --install puisqu'on ne cherche pas à
tout recréer.
-u, --update
Supprimer les répertoires des projets dépendants dans vendor/, qu'il
s'agisse de liens symboliques ou de répertoires normaux, puis les faire
recréer par 'composer u'
Celà permet de mettre à jour le projet sans les erreurs qui résultent
des modifications faites par les autres actions.
-w, --update-commit
Mettre à jour le projet avec --update puis enregistrer les modifications
éventuelles dans git
--ud, --update-deps
Mettre à jour les projets dépendants avec --update-commit avant de
mettre à jour le projet courant.
--ur, --update-recursive
Mettre à jour de façon récursive tous les projets dépendants.
NB: les modifications dans les projets dépendants seront automatiquement
enregistrées dans git."
}
fake=
verbose=1
nowait=
action=rsync
args=(
--help '$exit_with display_help'
-d:,--project-dir: projdir=
-n,--fake fake=1
-q,--quiet verbose=
-g,--no-wait nowait=1
-l,--link action=link
-k,--copy action=copy
-i,--install action=install
-j,--reinstall-link action=reinstall-link
-u,--update action=update
-w,--update-commit action=update-commit
--ud,--update-deps action=update-deps
--ur,--update-recursive action=update-recursive
)
parse_args "$@"; set -- "${args[@]}"
if [ -d "$projdir" ]; then
cd "$projdir"
elif [ -e "$projdir" ]; then
die "$projdir: répertoire introuvable"
fi
found=
first=1
while true; do
if [ -f composer.json ]; then
found=1
break
fi
first=
cd ..
if [ "$(pwd)" == "$HOME" ]; then
die "Cette commande ne peut être lancée que depuis un projet Composer"
fi
done
if [ -z "$first" ]; then
enote "Le répertoire du projet est $(ppath . ~)"
fi
if [ "$action" == update-deps -o "$action" == update-recursive ]; then
# avec update-deps et update-recursive, tous les modules doivent être
# considérés
set --
fi
###
if [ $# -eq 0 ]; then
setx -a ms=list_dirs vendor "ur/*" "lib/*"
set -- "${ms[@]}"
fi
function check_module() {
[ -d "../$m" ] || die "$m: module introuvable"
}
function update_with_rsync() {
local -a rsync_args
rsync_args=(
-a ${fake:+-n} ${verbose:+-v}
--delete
-f "- /.git/"
-f "- /vendor/"
"../$m/" "vendor/$p"
)
rsync "${rsync_args[@]}"
}
deps=()
modules=()
for m in "$@"; do
m="${m#vendor/}" # pour permettre de spécifier le chemin directement
m="${m//\//-}"
case "$m" in
ur-*|lib-*) ;;
*) m="ur-$m";;
esac
modules+=("$m")
p="${m//-/\/}"
check_module
case "$action" in
rsync)
# Action par défaut: ignorer les liens et synchroniser les copies
if [ ! -L "vendor/$p" ]; then
etitle "$m"
update_with_rsync
eend
fi
;;
link)
# Ignorer les liens et transformer les copies en liens
if [ ! -L "vendor/$p" ]; then
link="$m"
path="/project/vendor/$p"
path="${path%/*}"
while [ -n "$path" ]; do
link="../$link"
path="${path%/*}"
done
etitle "$m"
estep "suppr. vendor/$p"
rm -rf "vendor/$p"
mkdirof "vendor/$p"
estep "vendor/$p --> $link"
ln -s "$link" "vendor/$p"
eend
fi
;;
copy)
# Transformer les liens en copie et les synchroniser
etitle "$m"
if [ -L "vendor/$p" ]; then
estep "suppr. vendor/$p"
rm -f "vendor/$p"
fi
update_with_rsync
eend
;;
install)
# Supprimer les liens et répertoires...
etitle "$m"
if [ -e "vendor/$p" ]; then
estep "suppr. vendor/$p"
rm -rf "vendor/$p"
fi
array_add deps "$p"
eend
;;
reinstall-link)
# Supprimer les liens uniquement...
etitle "$m"
if [ -L "vendor/$p" ]; then
estep "suppr. vendor/$p"
rm -f "vendor/$p"
fi
array_add deps "$p"
eend
;;
update|update-commit|update-deps|update-recursive)
# Supprimer les liens et répertoires...
etitle "$m"
if [ -e "vendor/$p" ]; then
estep "suppr. vendor/$p"
rm -rf "vendor/$p"
fi
array_add deps "$p"
eend
;;
*) die "$action: action inconnue";;
esac
done
case "$action" in
install|reinstall-link)
# ... puis installer les dépendances
estep "Installation des dépendances"
"$scriptdir/dk" ci || die
;;
update|update-commit)
# ... puis mettre à jour les dépendances
estep "Mise à jour des dépendances"
"$scriptdir/dk" cu "${deps[@]}" || die
if [ "$action" == update-commit ]; then
if [ -z "$nowait" ]; then
# laisser le temps à @$*! d'eclipse qui met à jour automatiquement le projet...
estep "Attendre 10 secondes avant git commit"
sleep 10
fi
estep "Enregistrement dans git"
pci -A "maj deps"
fi
;;
update-deps)
# mettre à jour les dépendances directes
for m in "${modules[@]}"; do
etitle "Mise à jour projet dépendant: $m"
"$script" -d "../$m" -w
eend
done
estep "Mise à jour des dépendances"
"$scriptdir/dk" cu || die
if [ -z "$nowait" ]; then
# laisser le temps à @$*! d'eclipse qui met à jour automatiquement le projet...
estep "Attendre 10 secondes avant git commit"
sleep 10
fi
estep "Enregistrement dans git"
pci -A "maj deps"
;;
update-recursive)
# mettre à jour les dépendances de façon récursive
for m in "${modules[@]}"; do
etitle "Mise à jour récursive: $m"
"$script" -d "../$m" --ur
eend
done
estep "Mise à jour des dépendances"
"$scriptdir/dk" cu || die
if [ -z "$nowait" ]; then
# laisser le temps à @$*! d'eclipse qui met à jour automatiquement le projet...
estep "Attendre 10 secondes avant git commit"
sleep 10
fi
estep "Enregistrement dans git"
pci -A "maj deps"
;;
esac

3098
dk

File diff suppressed because it is too large Load Diff

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"

160
dmctl
View File

@ -1,160 +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: import/exporter une docker-machine
USAGE
$scriptname -d NAME
$scriptname -l ARCHIVE
$scriptname -a ARCHIVEs...
OPTIONS
-d, --dump
Exporter la machine
-l, --load
Importer la machine à partir de l'archive spécifiée
-a, --load-all
Importer toutes les machines depuis le répertoire spécifié"
}
function dump_machine() {
local name srcdir workdir destdir archive i
name="$1"
[ -n "$name" ] || die "Vous devez spécifier le nom de la machine"
srcdir="$HOME/.docker/machine/machines/$name"
[ -d "$srcdir" ] || die "$name: nom de machine incorrect"
ac_set_tmpdir workdir
destdir="$workdir/$name"
archive="${name}-machine.tar.gz"
estep "Copie des fichiers"
cp -r "$srcdir" "$workdir" || die
for i in ca-key.pem ca.pem key.pem cert.pem; do
[ -f "$destdir/$i" ] || {
cp "$HOME/.docker/machine/certs/$i" "$destdir" || die
}
done
estep "Correction des chemins"
sed -i "\
s|$HOME/.docker/machine|DOCKER_MACHINE_HOME|g
s|DOCKER_MACHINE_HOME/certs/|DOCKER_MACHINE_HOME/machines/$name/|g
" "$destdir/config.json" || die
estep "Génération de $archive"
tar czf "$archive" -C "$workdir" "$name" || die
ac_clean "$workdir"
}
function load_machine() {
local archive archivename destdir machinedir origdir workdir srcdir
archive="$1"
[ -n "$archive" ] || die "Vous devez spécifier l'archive à importer"
setx archivename=basename -- "$archive"
if [[ "$archivename" == *-machine.tar.gz ]]; then
name="${archivename%-machine.tar.gz}"
else
die "$archive: n'est pas une archive docker-machine"
fi
destdir="$HOME/.docker/machine/machines"
machinedir="$destdir/$name"
origdir="$HOME/${name}-machine.orig"
if [ -d "$machinedir" ]; then
if [ -n "$NOCLOBBER" ]; then
ewarn "$name: cette machine existe déjà"
return
else
ewarn "$name: une machine du même nom existe déjà"
ask_yesno "Voulez-vous l'écraser?" N || die
[ -d "$origdir" ] && rm -rf "$origdir"
mv "$machinedir" "$origdir"
fi
fi
ac_set_tmpdir workdir
srcdir="$workdir/$name"
estep "Extraction de l'archive"
tar xzf "$archive" -C "$workdir"
[ -d "$srcdir" ] || die "L'archive n'est pas pour la machine $name"
estep "Corriger les chemins"
sed -i "\
s|DOCKER_MACHINE_HOME|$HOME/.docker/machine|g
" "$srcdir/config.json" || die
estep "Installation de la machine"
mkdir -p "$destdir"
mv "$srcdir" "$destdir"
if [ -d "$origdir" ]; then
enote "Une fois que la machine aura été testée, vous pouvez supprimer ce répertoire:
$origdir"
fi
ac_clean "$workdir"
}
# faut-il ignorer les machines existantes
NOCLOBBER=
action=
args=(
--help '$exit_with display_help'
-d,--dump,-x,--export,-s,--save action=dump
-l,--load,-i,--import action=load
-a,--all,--load-all,--import-all action=loadall
)
parse_args "$@"; set -- "${args[@]}"
if [ -z "$action" ]; then
case "$1" in
d|dump|x|export|s|save) action=dump; shift;;
l|load|i|import) action=load; shift;;
a|all|loadall|importall) action=loadall; shift;;
*) die "Vous devez spécifier l'action à effectuer";;
esac
fi
case "$action" in
dump)
dump_machine "$1"
;;
load)
for archive in "$@"; do
etitle "$archive"
load_machine "$archive"
eend
done
;;
loadall)
[ $# -gt 0 ] || set -- .
archives=()
for file in "$@"; do
if [ -d "$file" ]; then
NOCLOBBER=1
array_lsfiles files "$file" "*-machine.tar.gz"
array_extend archives files
else
archives+=("$file")
fi
done
for archive in "${archives[@]}"; do
etitle "$archive"
load_machine "$archive"
eend
done
;;
esac

25
doc/DefaultTiddlers.twp Normal file
View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Pense-bête:
# ''bold'' ==striked== __underline__ //italic// ^^super^^ ~~sub~~
# @@highlight@@ @@color:red;background-color:white; rouge sur noir@@
# ~NotAWikiWord [[force wikiword]] [[friendly name|WikiWord]]
# [[external|http://site.com]] ---- {{monospace}}
# !h1 !!h2 !!!h3 !!!!h4 !!!!!h5
# * dotlist ** sublist # numlist ## sublist
# {{{ |caption|c [img[title|filename]]
# pre text |!header|!header|h [img[filename]]
# }}} |cell|cell| [img[title|filename][link]]
# <<< |>|colspan| [img[filename][link]]
# blockquote |rowspan|one| [<img[filename]]
# <<< |~|two| [>img[filename]]
# >quote1 |left| right|
# >>quote2 |>| center |
# >>>quote3
##@creator: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: DefaultTiddlers
[[Main]]

16
doc/EnsureVM.twp Normal file
View File

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

46
doc/Main.twp Normal file
View File

@ -0,0 +1,46 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Pense-bête:
# ''bold'' ==striked== __underline__ //italic// ^^super^^ ~~sub~~
# @@highlight@@ @@color:red;background-color:white; rouge sur noir@@
# ~NotAWikiWord [[force wikiword]] [[friendly name|WikiWord]]
# [[external|http://site.com]] ---- {{monospace}}
# !h1 !!h2 !!!h3 !!!!h4 !!!!!h5
# * dotlist ** sublist # numlist ## sublist
# {{{ |caption|c [img[title|filename]]
# pre text |!header|!header|h [img[filename]]
# }}} |cell|cell| [img[title|filename][link]]
# <<< |>|colspan| [img[filename][link]]
# blockquote |rowspan|one| [<img[filename]]
# <<< |~|two| [>img[filename]]
# >quote1 |left| right|
# >>quote2 |>| center |
# >>>quote3
##@creator: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: Main
!Présentation
nutools est un ensemble d'utilitaires pour faciliter l'utililisation des Unixes, en particulier Linux, mais aussi MacOS X et Cygwin.
C'est aussi une librairie de scripts shell réutilisables ([[ulib]]) et une librairie de modules python réutilisables (pyulib)
!Prérequis
Python >= 2.3 et GNU Awk sont requis pour que toutes les fonctionnalités soient supportées.
* Sous Linux, lors de l'installation du package, les meilleurs efforts sont fait pour que ces packages soient installés.
* Sous MacOSX, il faut installer manuellement Fink, DarwinPorts ou Homebrew
! Outils
Chaque outil contient une aide intégrée. Il suffit de lancer l'outil avec l'argument {{{--help}}} pour avoir une aide détaillée.
* Déploiement d'un répertoire ou d'une archive
** [[uinst]]: Déploiement local
** [[mkusfx]]: Faire une archive auto-installable avec uinst
** [[ruinst]]: Déploiement distant avec uinst
** [[runs]]: Lancer un script avec le protocole RUNS
** [[rruns]]: Déploiement distant avec runs
* Librairie réutilisable de scripts shell
** [[uinc]]: Dépliage des inclusions dans un fichier
** [[ulibsync]]: Faire une copie locale pour un projet de ulib et/ou pyulib
* Autres outils
** [[udir]]: Gestion des paramètres d'un répertoire. Ces paramètres sont entre autres utilisés par uinst et uinc.

25
doc/MainMenu.twp Normal file
View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Pense-bête:
# ''bold'' ==striked== __underline__ //italic// ^^super^^ ~~sub~~
# @@highlight@@ @@color:red;background-color:white; rouge sur noir@@
# ~NotAWikiWord [[force wikiword]] [[friendly name|WikiWord]]
# [[external|http://site.com]] ---- {{monospace}}
# !h1 !!h2 !!!h3 !!!!h4 !!!!!h5
# * dotlist ** sublist # numlist ## sublist
# {{{ |caption|c [img[title|filename]]
# pre text |!header|!header|h [img[filename]]
# }}} |cell|cell| [img[title|filename][link]]
# <<< |>|colspan| [img[filename][link]]
# blockquote |rowspan|one| [<img[filename]]
# <<< |~|two| [>img[filename]]
# >quote1 |left| right|
# >>quote2 |>| center |
# >>>quote3
##@creator: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: MainMenu
[[GettingStarted]]

30
doc/SKvm.twp Normal file
View File

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

27
doc/SVirtualBox.twp Normal file
View File

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

25
doc/SiteSubtitle.twp Normal file
View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Pense-bête:
# ''bold'' ==striked== __underline__ //italic// ^^super^^ ~~sub~~
# @@highlight@@ @@color:red;background-color:white; rouge sur noir@@
# ~NotAWikiWord [[force wikiword]] [[friendly name|WikiWord]]
# [[external|http://site.com]] ---- {{monospace}}
# !h1 !!h2 !!!h3 !!!!h4 !!!!!h5
# * dotlist ** sublist # numlist ## sublist
# {{{ |caption|c [img[title|filename]]
# pre text |!header|!header|h [img[filename]]
# }}} |cell|cell| [img[title|filename][link]]
# <<< |>|colspan| [img[filename][link]]
# blockquote |rowspan|one| [<img[filename]]
# <<< |~|two| [>img[filename]]
# >quote1 |left| right|
# >>quote2 |>| center |
# >>>quote3
##@creator: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: SiteSubtitle
Outils divers pour linux/macosx, et librairies pour bash

25
doc/SiteTitle.twp Normal file
View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Pense-bête:
# ''bold'' ==striked== __underline__ //italic// ^^super^^ ~~sub~~
# @@highlight@@ @@color:red;background-color:white; rouge sur noir@@
# ~NotAWikiWord [[force wikiword]] [[friendly name|WikiWord]]
# [[external|http://site.com]] ---- {{monospace}}
# !h1 !!h2 !!!h3 !!!!h4 !!!!!h5
# * dotlist ** sublist # numlist ## sublist
# {{{ |caption|c [img[title|filename]]
# pre text |!header|!header|h [img[filename]]
# }}} |cell|cell| [img[title|filename][link]]
# <<< |>|colspan| [img[filename][link]]
# blockquote |rowspan|one| [<img[filename]]
# <<< |~|two| [>img[filename]]
# >quote1 |left| right|
# >>quote2 |>| center |
# >>>quote3
##@creator: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: SiteTitle
nutools

25
doc/SiteUrl.twp Normal file
View File

@ -0,0 +1,25 @@
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Pense-bête:
# ''bold'' ==striked== __underline__ //italic// ^^super^^ ~~sub~~
# @@highlight@@ @@color:red;background-color:white; rouge sur noir@@
# ~NotAWikiWord [[force wikiword]] [[friendly name|WikiWord]]
# [[external|http://site.com]] ---- {{monospace}}
# !h1 !!h2 !!!h3 !!!!h4 !!!!!h5
# * dotlist ** sublist # numlist ## sublist
# {{{ |caption|c [img[title|filename]]
# pre text |!header|!header|h [img[filename]]
# }}} |cell|cell| [img[title|filename][link]]
# <<< |>|colspan| [img[filename][link]]
# blockquote |rowspan|one| [<img[filename]]
# <<< |~|two| [>img[filename]]
# >quote1 |left| right|
# >>quote2 |>| center |
# >>>quote3
##@creator: jclain
##@created: 09/03/2012 05:08
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: SiteUrl

12
doc/_root.twp Normal file
View File

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

18
doc/authftp.twp Normal file
View File

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

14
doc/caturl.twp Normal file
View File

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

11
doc/compileAndGo.twp Normal file
View File

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

27
doc/fconv.twp Normal file
View File

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

25
doc/fnconv.twp Normal file
View File

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

14
doc/geturl.twp Normal file
View File

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

View File

@ -1,6 +1,12 @@
# mkRewriteRules
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:19
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: mkRewriteRules
~~~
{{{
mkRewriteRules: Créer un fichier de redirections pour Apache à partir d'un certain
nombre de règles
@ -77,6 +83,4 @@ proxy), ou si le mode de réécriture requière l'utilisation d'un proxy.
Dans les exemples donnés ci-dessus, $URL est l'url générée par la réécriture,
et $proxy_acls la valeur du champ proxy_acls spécifiée ci-dessus.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary
}}}

18
doc/mkiso.twp Normal file
View File

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

View File

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

View File

@ -1,6 +1,12 @@
# mkusfx
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: mkusfx
~~~
{{{
mkusfx: Créer une archive auto-extractible qui installe son contenu avec uinst
USAGE
@ -26,6 +32,4 @@ OPTIONS
Spécifier que l'archive doit pouvoir s'installer même sur un système sur
lequel nutools n'est pas installé. Cette archive contiendra une copie
locale de ulib et uinst.sh
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary
}}}

14
doc/openurl.twp Normal file
View File

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

16
doc/rmtildes.twp Normal file
View File

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

View File

@ -1,13 +1,19 @@
# rruns
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 30/03/2012 04:42
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: rruns
~~~
{{{
rruns: Déploiement distant avec runs
USAGE
rruns [-h hosts] [-T tmproot] rscriptname name=value...
rruns [-h hosts] [-T tmproot] @recipe name=value...
rruns [-h hosts] [-T tmproot] -f rscript name=value...
rruns [-h hosts] [-T tmproot] -r recipe name=value...
rruns [-H host] [-T tmproot] rscriptname name=value...
rruns [-H host] [-T tmproot] @recipe name=value...
rruns [-H host] [-T tmproot] -f rscript name=value...
rruns [-H host] [-T tmproot] -r recipe name=value...
Lancer ce script sans argument (hors options) est équivalent à le lancer avec
l'argument @default
@ -21,31 +27,20 @@ OPTIONS
sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant,
il est possible de faire la configuration avec '--configure root'. La
commande serait alors
rruns -h user@host --configure root
rruns -H user@host --configure root
-T tmproot
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
/var/tmp. Cette option est utile pour les vservers, qui ont par défaut
un /tmp minuscule de 16 Mo.
-S ssh
Spécifier le programme à utiliser pour la connection par ssh.
-h host
-h @hostsfile
Spécifier un ou plusieurs hôtes sur lequels faire le déploiement. Pour
spécifier plusieurs hôtes, il est possible d'utiliser plusieurs fois
l'option -h, ou spécifier en une seule fois plusieurs hôtes en les
séparant par un espace ou le caractère ':', e.g. 'host1 host2' ou
'host1:host2'. Si la spécification contient les caractères { et },
l'expansion est effectuée, e.g
-h 'root@{host1,host2}.univ.run'
-H host
Spécifier un hôte distant sur lequel faire le déploiement. Plusieurs
options -H peuvent être spécifiées, ou alors on peut séparer plusieurs
hôtes par ':', e.g. -H host1:host2
Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
root. Il est possible de spécifier un autre utilisateur avec la syntaxe
user@host, e.g -h user@host
La forme @hostsfile permet de lire la liste des hôtes depuis le fichier
hostsfile, à raison d'un hôte par ligne.
Si cette option n'est pas spécifiée, et que le répertoire courant est
dans un des répertoires de $RUNSHOSTSPATH, sélectionner l'hôte
correspondant. Sinon, l'utilisateur doit saisir l'hôte distant de façon
interactive.
user@host, e.g -H jclain@host
-f RSCRIPT
Lancer le script individuel spécifié au lieu de chercher dans les
répertoires $RUNS{SCRIPTS,HOSTS}PATH
@ -58,17 +53,10 @@ OPTIONS
déploiement. Si plusieurs hôtes sont spécifiés, OUTPUT est considéré
comme un nom de base auquel est ajouté le nom de l'hôte sur lequel
l'archive doit être déployée.
--init
--no-init
Forcer (resp. empêcher) la création des répertoires d'hôte correspondant
aux hôtes spécifiés. Par défaut, la création des répertoires d'hôte est
effectuée uniquement si ce script est lancé sans argument.
--sysinfos
Après un déploiement réussi sur l'hôte distant, inscrire si ce n'est
déjà fait le résultat de la commande usysinfos dans le fichier
sysinfos.conf du répertoire d'hôte.
Cette option est automatiquement activée si ce script est lancé sans
argument (hors options).
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary
}}}

38
doc/ruinst.twp Normal file
View File

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

View File

@ -1,6 +1,12 @@
# runs
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 30/03/2012 04:42
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: runs
~~~
{{{
runs: Lancer un script avec le protocole runs
USAGE
@ -12,10 +18,8 @@ USAGE
OPTIONS
Configuration
--init
--verify
Vérifier le nom d'hôte et créer si nécessaire le répertoire d'hôte
correspondant à l'hôte courant ou à l'hôte spécifié avec l'option -h
Avec --verify, la création du répertoire d'hôte n'est pas effectuée.
Créer le répertoire d'hôte correspondant à l'hôte courant ou à l'hôte
spécifié avec l'option -h
--sysinfos DATA
Avec l'option --init, initialiser le fichier sysinfos.conf avec DATA, si
le fichier n'a pas déjà été provisionné. Sans cette option, un fichier
@ -40,7 +44,7 @@ Gestion des scripts
{$RUNSHOSTSPATH}/$hostname.$domain (par défaut) et
{$RUNSHOSTSPATH}/$domain/$hostname (le cas échéant)
L'option --host est équivalente, sauf que son argument est facultatif et
que sa valeur par défaut est l'hôte courant, soit hydra
que sa valeur par défaut est l'hôte courant, soit melee
--list
Afficher la liste des scripts qui sont disponibles. Avec l'option -h,
inclure aussi les scripts spécifiques à cet hôte.
@ -53,6 +57,4 @@ Gestion des scripts
--desc-only
Afficher seulement la description du script
-z Forcer la réinstallation des scripts qui se basent sur shouldrun/setdone
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary
}}}

View File

@ -1,6 +1,12 @@
# rwoinst
# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@creator: jclain
##@created: 15/03/2012 22:20
##@modifier: jclain
##@changecount: 1
##@tags:
##@title: rwoinst
~~~
{{{
rwoinst: Déploiement distant avec woinst
USAGE
@ -29,6 +35,4 @@ OPTIONS
Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
root. Il est possible de spécifier un autre utilisateur avec la syntaxe
user@host, e.g -H user@host
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary
}}}

View File

@ -1,12 +0,0 @@
# EnsureVM
~~~
EnsureVM: s'assurer que les services sont lancés pour un type de virtualisation
USAGE
EnsureVM type
Les types supportés sont virtualbox et kvm (par défaut)
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,36 +0,0 @@
# SKvm
~~~
SKvm: lancer une machine virtuelle kvm
USAGE
SKvm [options] vmName
SKvm {-l|-A|-g}
OPTIONS
-n, --check
Ne rien faire excepté s'assurer que les modules kvm sont chargés
-u, --user
Lancer l'opération avec les droits de l'utilisateur courant. Par défaut,
ce script tente d'acquérir les droits de root.
-l, --list
Lister les machines virtuelles
-s, --start
Démarrer la machine virtuelle (par défaut)
Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
affiché
-k, --stop
Arrêter la machine virtuelle
-H, --destroy
Arrêter sauvagement la machine virtuelle
-r, --restart
Redémarrer la machine virtuelle
-S, --managed-save
Enregistrer l'état de la machine virtuelle
-A, --stop-all
Arrêter toutes les machines virtuelles qui tournent actuellement
-g, --gui
Afficher le gestionnaire de machines virtuelle
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,44 +0,0 @@
# SVirtualBox
~~~
SVirtualBox: lancer une machine virtuelle VirtualBox
USAGE
SVirtualBox [options] vmName
OPTIONS
-n, --nop
Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés
-l, --list
Lister les machines virtuelles
-s, --start
Démarrer la machine virtuelle. C'est l'action par défaut.
Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
affiché
-x, --gui
-b, --headless
--separate
Ces options ne sont valides qu'avec -s et permettent de spécifier le
type de démarrage: 'gui' permet d'afficher une fenêtre complète dans
laquelle l'accélération graphique est supportée, headless démarre la
machine en tâche de fond, et separate affiche une fenêtre qui attaque la
machine démarrée en tâche de fond. --separate est l'option par défaut.
-k, -t, --stop
Arrêter la machine virtuelle. Les options -p, -H, -R, -S et -r
permettent de spécifier le type d'arrêt de la machine virtuelle
-p, --sleep
Mettre en veille la machine virtuelle (par ACPI)
-H, --poweroff
Arrêter sauvagement la machine virtuelle
-R, --reset
Redémarrer sauvagement la machine virtuelle
-S, --savestate
Enregistrer l'état de la machine virtuelle
-r, --rrestart
Arrêter la machine, restaurer l'état du dernier snapshot puis la
relancer.
-g, --gui
Afficher le gestionnaire de machines virtuelle
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,8 +0,0 @@
# _root
~~~
_root: devenir l'utilisateur root, avec 'sudo' si possible, ou 'su' si
'sudo' n'est pas installé
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,95 +0,0 @@
# apacheconfig
~~~
apacheconfig: Gérer la configuration d'un serveur web apache
USAGE
apacheconfig -c
apacheconfig -t -- args...
OPTIONS
-c, --create
Créer un nouveau répertoire de configuration pour un hôte
-d, --destdir DESTDIR[=apacheconfig]
Nom du répertoire local de configuration.
-f,--full
--partial
Indiquer respectivement que la configuration est complète ou partielle.
Avec la configuration complète, le serveur peut être complètement
configuré avec tous les fichiers présents. Avec la configuration
partielle, uniquement les informations spécifiques à un service en
particulier sont disponibles.
Cette option est utilisée avec --create. Par défaut, la configuration
est partielle.
Pour le moment, la seule différence est que --full crée un fichier de
configuration nommé .apacheconfig alors que --partial crée un fichier
nommé apacheconfig.conf qui est visible et donc découvrable et éditable
plus facilement
-t, --template [OPT]
Gérer les fichiers du répertoire local avec templatectl. La valeur de
cette option est utilisée comme argument court pour l'invocation de
templatectl, e.g
apacheconfig -tm args
est équivalent à
templatectl -m args
Les arguments qui restent sont passés tels quels à templatectl
Les options courantes de templatectl -l, -v, -m, -L sont disponibles
directement
--help-template
Afficher l'aide concernent la gestion des templates.
Equivalent à -t -- --help
-h, --host HOST
Spécifier l'hôte. Equivalent à -v host=HOST
--sysname SYSNAME
--sysdist SYSDIST
-s, --sysver SYSVER
Spécifier la distribution pour laquelle synchroniser le template. Par
défaut, choisir les valeurs correspondantes au système courant.
Les options -7 et -8 sont des aliases respectivement pour -s wheezy et
-s jessie, parce que les fichiers par défaut ont changé à partir de
debian jessie.
-u, --update, --deploy
Mettre à jour la configuration système à partir du répertoire local.
Lors du déploiement de la configuration, les valeurs des variables
dynamiques sont remplacées dans les fichiers destination.
Les arguments qui restent sont passés tels quels à apache_autoconf
-N, --network-config
Mettre aussi à jour la configuration réseau.
-r, --certsdir CERTSDIR
Spécifier le cas échéant le répertoire contenant les certificats à
déployer. Cet argument est requis si le répertoire certsconf/ existe,
sauf si les certificats sont déjà déployés.
--localhosts
Créer dans le fichier /etc/hosts tous les noms d'hôte ayant un suffixe
.local mentionnés dans les fichiers de site. Cette option est utile pour
le développement et les tests.
-C, --one-conf CONF
Ne déployer que le fichier de configuration spécifié. Cette option est
utilisée avec --deploy et est utile pour le développement et les tests.
-M, --one-module MODULE
Ne déployer que le fichier de module spécifié. Cette option est utilisée
avec --deploy et est utile pour le développement et les tests.
-S, --one-site SITE
Ne déployer que le fichier de site spécifié. Cette option est utilisée
avec --deploy ou --localhosts et est utile pour le développement et les
tests.
-k, --new-site HOST.TLD
Créer une définition pour un nouveau site à partir des fichiers du
répertoires templates/
-K, --new-site-templatedir TEMPLATEDIR
Spécifier le répertoire source pour les templates de site utilisés par
l'option --new-site. Par défaut, utiliser le répertoire templates/ situé
dans le répertoire de configuration.
Si TEMPLATEDIR est un nom simple sans séparateur de chemin '/' et qu'un
répertoire templates/TEMPLATEDIR existe, alors prendre ce répertoire-là
comme source.
--new-site-force
Avec --new-site, utiliser le nom d'hôte fourni même s'il n'est pas
pleinement qualifié
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,35 +0,0 @@
# authftp
~~~
authftp: Se connecter sur un site FTP authentifié
Ce script nécessite ncftp. Il est conçu pour faciliter l'accès à des sites FTP
s'il est requis d'y accéder par un proxy FTP pour les connexion authentifiées.
USAGE
authftp [options] host login password [path]
OPTIONS
-p, --proxy
-n, --noproxy
Forcer l'utilisation, resp. ne pas utiliser, le proxy FTP (i.e. faire la
connexion directement)
-l, --lftp
Se connecter avec lftp au lieu de ncftp. Le fonctionnement n'est pas
garanti si l'on utilise un proxy FTP.
-o OPTION
Ajouter une option à la commande lancée. Si l'option prend un argument,
il faut doubler l'option -o, e.g.
authftp -l -o -e -o 'mirror remote local' host login pass
Dans cet exemple, l'option -e de lftp est utilisée pour faire un miroir
local du répertoire remote.
--tls
Indiquer que la connexion se fera en TLS. Implique --lftp puisque ncftp
ne le supporte pas.
note: A cause d'une limitation de lftp, ce n'est pas possible de se connecter
automatiquement avec lftp si le mot de passe contient une virgule. A cause de la
façon dont le proxy ftp est configuré, il n'est pas possible de se connecter
avec un mot de passe qui contient le caractère @
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,16 +0,0 @@
# caturl
~~~
caturl: Afficher une url
USAGE
caturl <file.url|file.desktop|URL>
OPTIONS
-c, --check
Vérifier que le fichier est valide
-g, --get
Attaquer l'url spécifiée avec curl
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,28 +0,0 @@
# chrono.py
~~~
usage: chrono.py [options] [TIMEOUT]
Afficher un chronomètre
positional arguments:
TIMEOUT (valeur vide)
chronomètre qui démarre à 0:00 et ne s'arrête pas
H:M:S (heures:minutes:secondes)
ou M:S (minutes:secondes)
ou M (minutes)
minuteur qui démarre à H:M:S et fait un décompte jusqu'à 0:00. A la fin
du décompte, une sonnerie retentit.
@H[:M[:S]]
minuteur qui fonctionne comme précédemment, sauf qu'on spécifie l'heure
d'arrivée, et que la durée est calculée automatiquement
optional arguments:
-h, --help show this help message and exit
-n, --no-autostart Ne pas démarrer automatiquement le décompte même si TIMEOUT est spécifié.
-s, --autostart Forcer le démarrage automatique du décompte, même si TIMEOUT n'est pas spécifié.
Si TIMEOUT est spécifié, par défaut le décompte démarre automatiquement.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,7 +0,0 @@
# compileAndGo
~~~
compileAndGo: see http://Yost.com/computers/compileAndGo
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,29 +0,0 @@
# create-user
~~~
create-user: créer un utilisateur sudoer et lui installer une clé publique ssh
USAGE
create-user user [-p pubkey]
OPTIONS
-p, --pkfile PKFILE
Installer la clé publique ssh contenue dans le fichier spécifié. Par
défaut, prendre le fichier ~/.ssh/id_rsa.pub de l'utilisateur courant.
-s, --pkstring PUBKEY
Installer la clé publique ssh spécifiée. Cette option avancée n'est pas
utilisée en temps normal. Elle a la priorité sur l'option --pkfile
-l, --luser
Ne pas donner à l'utilisateur le droit de sudoer.
-h, --host [USER@]HOST
Créer l'utilisateur sur l'hôte distant spécifié. Si l'utilisateur
distant n'est pas root, il doit être sudoer.
-T, --tmproot TMPROOT
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
/var/tmp. Cette option est utile pour certains serveurs, qui ont un /tmp
minuscule.
-S, --ssh SSH
Spécifier le programme à utiliser pour la connection par ssh.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,14 +0,0 @@
# cssh
~~~
cssh: Faire une connexion ssh en lançant automatiquement un screen sur l'hôte distant
USAGE
cssh [user@]host [options]
En principe, hormis l'argument user@host, il ne faudrait spécifier que des
options. Dans le cas où d'autres arguments seraient spécifiés, les meilleurs
efforts sont faits pour lancer ces commandes avant screen.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,31 +0,0 @@
# doinplace
~~~
doinplace: filtrer en place un fichier à travers une suite de commandes
USAGE
doinplace FILE COMMAND [ARGS...]
Si on utilise une commande avec des options, penser à utliser '--' pour séparer
les options de ce script des options de la commande
En plus des commandes systèmes, il est possible d'utiliser toute fonction de
nutools qui effectue des traitement sur un flux comme stripnl, filter_empty,
merge_contlines, filter_comment, filter_conf, etc. Les fonctions nl2lf, nl2crlf,
nl2cr, latin1compat et noaccents sont aussi disponibles par convenance.
OPTIONS
-p, --evalp
Evaluer la commande avec evalp(), ce qui permet de chainer plusieurs
commandes en les séparant par //. Cette option est automatiquement
activée si ce script est lancé avec le nom doinplacex
-g, --ignore-error, --replace-always
Normalement, le fichier n'est pas remplacé si la commande retourne une
erreur. Avec cette option, le fichier est remplacé quel que soit le code
de retour de la commande. A utiliser par exemple avec des commandes
comme grep qui peuvent retourner FAUX s'ils ne trouvent pas le motif.
Cette option est automatiquement activée si ce script est lancé avec le
nom doinplacef
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,26 +0,0 @@
# dumpclients
~~~
dumpclients: afficher les connexions TCP entrantes sur un port
USAGE
dumpclients [options] port
OPTIONS
-4, --only-tcp
-6, --only-tcp6
Se limiter au protocole spécifié. Par défaut, afficher toutes les
connexions, qu'elles soient en IPv4 ou en IPv6
-a, --all
Afficher tous les sockets, y compris les ports d'écoute. Par défaut,
seules les sockets ouvertes sont affichées.
-n, --numeric
Afficher uniquement les adresses IP au lieu du nom d'hôte.
-z, --allow-no-port
Ne pas exiger que le port soit spécifié
--show none,ip,port,state
Spécifier d'afficher comme informations supplémentaire: rien, l'adresse
ip, le port et/ou l'état. Par défaut, afficher le port et l'état.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,94 +0,0 @@
# em
~~~
Usage: /usr/bin/emacs [OPTION-OR-FILENAME]...
Run Emacs, the extensible, customizable, self-documenting real-time
display editor. The recommended way to start Emacs for normal editing
is with no options at all.
Run M-x info RET m emacs RET m emacs invocation RET inside Emacs to
read the main documentation for these command-line arguments.
Initialization options:
--batch do not do interactive display; implies -q
--chdir DIR change to directory DIR
--daemon start a server in the background
--debug-init enable Emacs Lisp debugger for init file
--display, -d DISPLAY use X server DISPLAY
--no-desktop do not load a saved desktop
--no-init-file, -q load neither ~/.emacs nor default.el
--no-shared-memory, -nl do not use shared memory
--no-site-file do not load site-start.el
--no-site-lisp, -nsl do not add site-lisp directories to load-path
--no-splash do not display a splash screen on startup
--no-window-system, -nw do not communicate with X, ignoring $DISPLAY
--quick, -Q equivalent to:
-q --no-site-file --no-site-lisp --no-splash
--script FILE run FILE as an Emacs Lisp script
--terminal, -t DEVICE use DEVICE for terminal I/O
--user, -u USER load ~USER/.emacs instead of your own
Action options:
FILE visit FILE using find-file
+LINE go to line LINE in next FILE
+LINE:COLUMN go to line LINE, column COLUMN, in next FILE
--directory, -L DIR prepend DIR to load-path (with :DIR, append DIR)
--eval EXPR evaluate Emacs Lisp expression EXPR
--execute EXPR evaluate Emacs Lisp expression EXPR
--file FILE visit FILE using find-file
--find-file FILE visit FILE using find-file
--funcall, -f FUNC call Emacs Lisp function FUNC with no arguments
--insert FILE insert contents of FILE into current buffer
--kill exit without asking for confirmation
--load, -l FILE load Emacs Lisp FILE using the load function
--visit FILE visit FILE using find-file
Display options:
--background-color, -bg COLOR window background color
--basic-display, -D disable many display features;
used for debugging Emacs
--border-color, -bd COLOR main border color
--border-width, -bw WIDTH width of main border
--color, --color=MODE override color mode for character terminals;
MODE defaults to `auto', and
can also be `never', `always',
or a mode name like `ansi8'
--cursor-color, -cr COLOR color of the Emacs cursor indicating point
--font, -fn FONT default font; must be fixed-width
--foreground-color, -fg COLOR window foreground color
--fullheight, -fh make the first frame high as the screen
--fullscreen, -fs make the first frame fullscreen
--fullwidth, -fw make the first frame wide as the screen
--maximized, -mm make the first frame maximized
--geometry, -g GEOMETRY window geometry
--no-bitmap-icon, -nbi do not use picture of gnu for Emacs icon
--iconic start Emacs in iconified state
--internal-border, -ib WIDTH width between text and main border
--line-spacing, -lsp PIXELS additional space to put between lines
--mouse-color, -ms COLOR mouse cursor color in Emacs window
--name NAME title for initial Emacs frame
--no-blinking-cursor, -nbc disable blinking cursor
--reverse-video, -r, -rv switch foreground and background
--title, -T TITLE title for initial Emacs frame
--vertical-scroll-bars, -vb enable vertical scroll bars
--xrm XRESOURCES set additional X resources
--parent-id XID set parent window
--help display this help and exit
--version output version information and exit
You can generally also specify long option names with a single -; for
example, -batch as well as --batch. You can use any unambiguous
abbreviation for a --option.
Various environment variables and window system resources also affect
the operation of Emacs. See the main documentation.
Report bugs to bug-gnu-emacs@gnu.org. First, please see the Bugs
section of the Emacs manual or the file BUGS.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,60 +0,0 @@
# fconv
~~~
fconv: convertir un fichier ou les fichiers d'un répertoire
USAGE
fconv -f FILE [cmds...]
fconv FILE [cmds...]
Une ou plusieurs commandes peuvent être spécifiées, séparées par //
La commande par défaut est 'lf'
Si des commandes utilisant des options sont utilisées, penser à séparer les
options de fconv avec --
OPTIONS
-N, --detect-always
Pour la commande conv, ne pas optimiser le calcul de l'encoding. Cette
option n'est valide que si src_enc n'est pas spécifié. On assume que
tous les fichiers n'ont pas le même encoding: l'encoding src_enc est
donc recalculé à chaque fois.
-r, --reverse
Pour la commande conv, inverser src_enc et dest_enc, qui doivent être
tous les deux spécifiés.
-f, --file FILE
Spécifier le fichier ou le répertoire concerné par la conversion. Les
aliases -d et --dir sont aussi reconnus.
Si cette option n'est pas spécifiée, le premier argument est considéré
comme le nom du fichier ou du répertoire à convertir. Par défaut,
convertir l'entrée standard.
Si un répertoire est spécifié, tous les fichiers de ce répertoire et de
ses sous-répertoires sont recherchés de façon récursive, sans limite de
profondeur. Ensuite, chacun de ces fichiers est converti.
--show-cmd
Afficher la commande qui serait exécutée
COMMANDES
c, conv dest_enc [src_enc]
Convertir le fichier dans un autre encoding.
dest_enc est l'encoding destination. Il doit être spécifié.
src_enc est l'encoding source. S'il n'est pas spécifié ou vaut 'detect',
il est autodétecté.
U, utf8 [src_enc]
Equivalent à conv utf8 src_enc
L, latin1 [src_enc]
Equivalent à conv latin1 src_enc
lf
crlf
cr
Convertir respectivement les caractères de fin de ligne en LF, CR/LF ou CR
lc, latin1compat
Transformer certains caratères UTF-8 en équivalents qui existent en Latin1
na, noaccents
Transformer les caractères accentués en caractères non accentués
sort [-u]
Trier le fichier avec la commande sort. Attention! Il ne faut utiliser
que les options de sort qui agissent sur un flux e.g. -u pour trier les
lignes de façon unique.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,54 +0,0 @@
# fnconv
~~~
fnconv: renommer un fichier ou les fichiers d'un répertoire
USAGE
fnconv -f FILE [cmds...]
fnconv FILE [cmds...]
Une ou plusieurs commandes peuvent être spécifiées, séparées //
La commande par défaut est 'fixcase'
OPTIONS
-N, --detect-always
Pour la commande conv, ne pas optimiser le calcul de l'encoding. Cette
option n'est valide que si src_enc n'est pas spécifié. On assume que
tous les fichiers n'ont pas le même encoding: l'encoding src_enc est
donc recalculé à chaque fois.
-r, --reverse
Pour la commande conv, inverser src_enc et dest_enc, qui doivent être
tous les deux spécifiés.
-f, --file FILE
Spécifier le fichier ou le répertoire concerné par le renommage. Les
aliases -d et --dir sont aussi reconnus.
Si cette option n'est pas spécifiée, le premier argument est considéré
comme le nom du fichier ou du répertoire à renommer.
Si un répertoire est spécifié, le traitement est appliqué à tous les
fichiers et répertoires de façon récursive, sans limite de profondeur.
--show-cmd
Afficher la commande qui serait exécutée
COMMANDES
C, conv dest_enc [src_enc]
Convertir le nom du fichier dans un autre encoding.
dest_enc est l'encoding destination. Il doit être spécifié.
src_enc est l'encoding source. S'il n'est pas spécifié ou vaut 'detect',
il est autodétecté.
U, utf8 [src_enc]
Equivalent à conv utf8 src_enc
L, latin1 [src_enc]
Equivalent à conv latin1 src_enc
lc, latin1compat
Transformer certains caratères UTF-8 en équivalents qui existent en Latin1
na, noaccents
Transformer les caractères accentués en caractères non accentués
l, lowercase
Transfomer le nom en minuscule
u, uppercase
Transformer le nom en majuscule
f, fixcase
Transformer le nom en minuscule s'il est entièrement en majuscule
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,69 +0,0 @@
# fndate
~~~
fndate: manipuler des noms de fichier pour les dater
USAGE
fndate (FILE|DIR)s...
fndate -k SRCs... [DESTDIR]
fndate -m SRCs... [DESTDIR]
fndate -c COMMAND [ARGs...]
OPTIONS
--create-or-rename
Créer un nouveau fichier (option -f) ou créer un nouveau répertoire
(option -d), ou renommer un fichier existant sans le changer de
répertoire. C'est l'option par défaut.
-f, --create-file
Créer un nouveau fichier. Cette option est ignorée si le fichier ou le
répertoire spécifié existe. C'est la valeur par défaut
-d, --create-dir
Créer un nouveau répertoire. Cette option est ignorée si le fichier ou
le répertoire spécifié existe.
-k, --copy
Copier le fichier SRC vers la destination DESTDIR qui vaut par défaut le
répertoire courant si un seul fichier source est spécifié. Si plusieurs
fichiers sources sont spécifiés, il faut absolument spécifier un
répertoire destination. Dans la destination, les fichiers sont nommés
avec la date en préfixe.
-m, --move
Déplacer le fichier SRC vers la destination DESTDIR qui vaut par défaut
le répertoire courant si un seul fichier source est spécifié. Si
plusieurs fichiers sources sont spécifiés, il faut absolument spécifier
un répertoire destination. Dans la destination, les fichiers sont nommés
avec la date en préfixe.
-c, --cmd
Les arguments sont une commande à lancer. Dans les argument, PLACEHOLDER
est remplacé par la date. Si le PLACEHOLDER n'est trouvé dans aucun des
arguments, alors ajouter la date à la fin de la commande. Par exemple,
voici comment émuler l'option -k
fndate -c cp src dest/~~
--string
Remplacer dans chaque argument le placeholder par la date et afficher le
résultat.
-P, --placeholder PLACEHOLDER
Dans le nom spécifié, remplacer PLACEHOLDER par la date. Par défaut,
PLACEHOLDER vaut ~~. Si le nom spécifié ne contient pas le PLACEHOLDER,
il est placé au début.
-@, --force-date DATE
Dans le nom spécifié, si la date est déjà présente, forcer son
remplacement par la valeur spécifiée. Par défaut, le fichier n'est pas
modifié si la date est déjà présente.
-F, --format FORMAT
Spécifier le format de la date à insérer dans le nom du fichier. Par
défaut, FORMAT vaut 'YYMMDD-'
Les formats valides sont:
YYYY année sur 4 chiffres
YY année sur 2 chiffres
MM mois sur 2 chiffres
DD jour sur 2 chiffres
Tous les autres caractères sont pris tels-quels
-s, --short
Equivalent à -F YYMMDD --autof
-l, --long
Equivalent à -F YYYMMDD --autof
--autof
Option non (pas encore) documentée
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,80 +0,0 @@
# foreach
~~~
foreach: lancer une commande pour un ensemble d'arguments
USAGE
foreach [options] [VAR=]expr cmd...
foreach [options] [VAR=]items... -- cmd...
La commande est lancée avec la variable 'VAR', qui vaut par défaut 'item',
définie à la valeur courante de l'énumération. De plus, la variable 'index'
reçoit une valeur incrémentale commençant à 0.
La deuxième syntaxe appelée syntaxe alternative permet de spécifier un ensemble
d'éléments directement, mais nécessite l'utilisation du séparateur '--' pour
identifier où s'arrête la liste des éléments.
En plus de VAR, les variables file, dir, name, basename, ext et dotext sont
définies. Elle valent respectivement le chemin absolu du fichier, le répertoire
absolu du fichier, le nom du fichier, le nom de base sans extension, l'extension
sans le point et l'extension avec le point, e.g pour item=dir/file.ext on a
file=/path/to/dir/file.ext, dir=/path/to/dir, name=file.ext, basename=file,
ext=ext, dotext=.ext
Les 3 exemples suivants sont équivalents:
foreach '*.c' cp %item dest/dir
foreach item='*.c' cp %item dest/dir
foreach *.c -- cp %item dest/dir
OPTIONS
-b, --basedir BASEDIR
Chercher les expressions -d, -f, -a à partir de BASEDIR au lieu du
répertoire courant.
-d, --dir
-f, --file
-a, --all
-s, --string
Ces options permettent de spécifier le type d'expression et la façon de
les traiter. Avec -d, faire la correspondance de l'expression sur les
répertoires uniquement. Avec -f, faire la correspondance sur les fichier
uniquement. Avec -a, faire la correspondance sur les répertoires et les
fichiers. Avec -s, évaluer l'expression avec la fonction 'eval' du
shell.
Si la syntaxe alternative est utilisée, le premier élément est évalué
conformément à ces options *si et seulement s'il* est précédé d'une
chaine 'VAR='. Les autres éléments sont pris tels-quels. e.g:
cette commande affiche uniquement la chaine '*.c':
foreach '*.c' --
alors que celle-ci liste les fichiers qui ont l'extension '.c':
foreach 'item=*.c' --
-p, --parent
Pour chaque fichier/répertoire, se placer dans le répertoire parent
avant de lancer la commande. item est aussi modifié pour ne plus
contenir que le nom de la cible (qui est désormais dans le répertoire
courant)
Cette option a la priorité sur --go
-g, --go
Si la cible est un répertoire, en faire le répertoire courant avant de
lancer la commande. Si la cible est un fichier, faire comme --parent et
se placer dans le répertoire du fichier avant de lancer la commande.
Dans les deux cas, item est modifié pour ne plus contenir que le nom de
la cible, soit '.' pour le répertoire courant, soit le nom du fichier
dans le répertoire courant.
Si cette option est mentionnée seule, elle implique --dir
-x, --expand
-n, --no-expand
Reconnaitre et traiter (resp. ne pas reconnaitre) la syntaxe %var dans
les arguments. C'est le cas par défaut, ce qui permet de simplifier
l'écriture d'une ligne de commande. Pour écrire le caractère '%', il
suffit de le doubler e.g %%item
Si l'expansion est désactivée, il faut protéger le caractère $ pour
qu'il soit traité, e.g, avec les examples ci-dessus:
foreach -n '*.c' 'cp "$item" dest/dir'
-t, --title
--no-title
Afficher (resp. ne pas afficher) chaque correspondance avant de lancer
la commande. Par défaut, l'affichage est effectué.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,10 +0,0 @@
# geturl
~~~
geturl: Télécharger un fichier avec wget ou curl
USAGE
geturl <file.url|file.desktop|URL> [wget options]
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,21 +0,0 @@
# mkiso
~~~
mkiso: créer une image iso d'un répertoire
USAGE
mkiso [options] srcdir [dest.iso]
OPTIONS
-M, --hfs
créer une image hybride ISO/HFS
-V, --volume
Nom du volume. Par défaut, prendre le nom de base du répertoire
d'origine. La taille est de 32 caractères max.
-A, --application
Description de l'application qui est sur l'image créée. Par défaut,
prendre le nom de base du répertoire d'origine. La taille est de 128
caractères max.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,26 +0,0 @@
# mocifs
~~~
mocifs: Monter un partage Windows/Samba/CIFS
USAGE
mocifs [user@]host[/path] [mountpoint]
Par défaut, le répertoire distant est montée sur un répertoire avec le même nom
de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté.
Les options -M et -U permettent de modifier le comportement par défaut.
OPTIONS
-M
Forcer le montage
-U
Forcer le démontage
-o OPTIONS
Ajouter les options spécifiées à la commande de montage mount.cifs
-u USERNAME
-p PASSWORD
-c USERNAME:PASSWORD
Spécifier les credentials à utiliser pour la connexion
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,40 +0,0 @@
# modav
~~~
modav: Monter un répertoire sur un hôte distant avec davfs
USAGE
modav http[s]://host[/path] [mountpoint]
Par défaut, le répertoire distant est montée sur un répertoire avec le même nom
de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté.
Les options -M et -U permettent de modifier le comportement par défaut.
OPTIONS
-M
Forcer le montage
-U
Forcer le démontage
-o OPTIONS
Ajouter les options spécifiées à la commande de montage
-u USERNAME
-p PASSWORD
-c USERNAME:PASSWORD
Si les credentials à utiliser ne sont pas configuré dans le fichier
/etc/davfs2/secrets, cette option permet de les spécifier. Si cette
option est utilisée, il est possible de rajouter
ask_auth 0
dans le fichier /etc/davfs2/davfs2.conf pour éviter le conflit qui se
produit quand des informations sont demandées interactivement. C'est le
cas par exemple si une connexion en https est faite et que la chaine de
certification n'est pas configurée. Pour mémoire, cela se fait avec
servercert myCAs.pem
dans le fichier /etc/davfs2/davfs2.conf
Bien entendu, il est préférable de configurer les credentials dans le
fichier /etc/davfs2/secrets avec la syntaxe
url username password
ou
mountpoint username password
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,20 +0,0 @@
# moiso
~~~
moiso: Monter une image ISO
USAGE
moiso image.iso [mountpoint]
Par défaut, l'image iso est montée sur un répertoire avec le même nom de base.
Si l'image est déjà montée, elle est démontée. Les options -m et -u permettent
de modifier le comportement par défaut.
OPTIONS
-m
Forcer le montage
-u
Forcer le démontage
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,29 +0,0 @@
# mossh
~~~
mossh: Monter un répertoire sur un hôte distant avec sshfs
USAGE
mossh [user@]host[:/path] [mountpoint]
Par défaut, le répertoire distant est montée sur un répertoire avec le même nom
de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté.
Les options -M et -U permettent de modifier le comportement par défaut.
OPTIONS
-M
Forcer le montage
-U
Forcer le démontage
-o OPTIONS
Ajouter les options spécifiées à la commande de montage
-s
Equivalent à -o allow_other ou -o allow_root selon que l'on est root ou
non
-u USER
Spécifier le user pour la connexion distante, s'il n'est pas possible de
le spécifier dans l'url. En cas de conflit, la valeur dans l'url est
prioritaire par rapport à cette option.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,65 +0,0 @@
# mysqlcsv
~~~
mysqlcsv: Faire une requête MySQL et formater la sortie pour traitement avec awkcsv
USAGE
mysqlcsv [query [db]] [-- mysql options]
query est la requête sql à exécuter. Si query n'est pas spécifiée, la(les)
requête(s) sql sont prises sur l'entrée standard, ou depuis un fichier
si l'option -f est spécifiée.
db est le nom de la base de données. Cette argument n'est lu que si le nom
de la base de donnée n'est ni spécifié dans le fichier de configuration,
ni spécifié avec l'option -D
OPTIONS
-h, --host HOST
-P, --port PORT
-u, --user USER
-pPASSWORD
-D, --database DATABASE
Informations de connexion à la base de données
-C, --config CONFIG
Prendre les informations de connexion depuis le fichier spécifié.
Le fichier doit être de la forme
host=HOST
#post=3306
user=USER
password=PASS
#database=DB
#query=QUERY
Les variables port, database et query sont facultatives.
Les valeurs définies dans ce fichier sont prioritaires par rapport à
celles qui auraient été spécifiées sur la ligne de commande.
Utiliser password=--NOT-SET-- s'il faut se connecter sans mot de passe
Cette option peut être utilisée plusieurs fois, auquel cas les fichiers
sont chargés dans l'ordre.
--profile PROFILE
La variable $PROFILE est définie avec la valeur spécifiée avant de
sourcer les fichiers de configuration. Cela permet d'avoir des fichiers
de configuration qui calculent dynamiquement les paramètres en fonction
de la valeur du profil.
-N, --no-headers
Ne pas afficher les en-têtes
-c, --force
Continuer le traitement même en cas d'erreur
-r, --raw
Ne pas autoriser mysql à mettre en échappement certaines valeurs
retournées par le serveur. Par défaut, les transformations suivantes
sont effectuées:
newline --> \n
tab --> \t
nul --> \0
\ --> \\
-n, --nulls
Transformer dans le flux en sortie les valeurs NULL en chaines vides
-f, --input INPUT
Lire la requête depuis le fichier input au lieu de le lire depuis la
ligne de commande ou l'entrée standard. Ne pas spécifier cette option
ou utiliser '-' pour lire depuis l'entrée standard.
Cette option est ignorée si la requête est spécifiée parmi les
arguments.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,108 +0,0 @@
# mysqlloadcsv
~~~
mysqlloadcsv: Charger une table MySQL avec un fichier csv
USAGE
mysqlloadcsv [db.]table [fields...] [-- mysql options]
db est le nom de la base de données
table est le nom de la table à charger
fields est la liste des colonnes. Si cette valeur est spécifiée, il faudra
peut-être utiliser l'option -s pour ignorer le cas échéant la ligne des
en-têtes dans le fichier en entrée. Sinon, les colonnes à utiliser sont
calculées à partir du fichier en entrée.
Dans les données en entrées, qui doivent être en UTF8, les conversions suivantes
sont effectuées par MySQL:
\0 --> <caractère NUL>
\b --> <backspace>
\n --> <newline>
\r --> <carriage return>
\t --> <tab>
\Z --> Ctrl+Z
\N --> NULL
OPTIONS
-h, --host host
-P, --port port
-u, --user user
-ppassword
Informations de connexion à la base de données
-C, --config CONFIG
Prendre les informations de connexion depuis le fichier spécifié.
Le fichier doit être de la forme
host=HOST.TLD
#post=3306
user=USER
password=PASS
#dbtable=DB.TABLE
#fields=(FIELDS...)
# Il est possible aussi de spécifier DB et TABLE séparément:
#database=DB
#table=TABLE
Les variables port, dbtable et fields sont facultatives.
Les valeurs définies dans ce fichier sont prioritaires par rapport à
celles qui auraient été spécifiées sur la ligne de commande.
Utiliser password=--NOT-SET-- s'il faut se connecter sans mot de passe
Cette option peut être utilisée plusieurs fois, auquel cas les fichiers
sont chargés dans l'ordre.
--profile PROFILE
La variable $PROFILE est définie avec la valeur spécifiée avant de
sourcer les fichiers de configuration. Cela permet d'avoir des fichiers
de configuration qui calculent dynamiquement les paramètres en fonction
de la valeur du profil.
-f, --input INPUT
Fichier en entrée. Ne pas spécifier cette option ou utiliser '-' pour
lire depuis l'entrée standard.
-d, --auto-dbtable DB
Spécifier la base de données avec laquelle se connecter. De plus, si le
nom de la table n'est pas spécifié, prendre par défaut le nom de base du
fichier spécifié avec l'option -f
-s, --skip-lines NBLINES
Nombre de lignes à sauter dans le fichier en entrée
-n, --fake
Ne pas effectuer l'opération. Afficher simplement la commande SQL.
--run
Forcer le lancement de l'opération. Utiliser cette option avec -A pour
créer la table avec les paramètres analysés.
-T, --truncate
Vider la table avant d'effectuer le chargement
-L, --load-data
Charger les données avec la commande 'load data local'. C'est l'option
par défaut. Le fichier est transmis tel quel à MySQL.
-I, --insert-data
Charger les données en générant des commandes 'insert into'. L'effet est
en principe le même avec l'option -L (sauf que certains formats de date
exotiques seront correctement importés). Cette option peut aussi être
utilisée avec l'option -n pour générer une liste de commande à corriger
et/ou adapter.
-U, -k, --update-data KEY
Au lieu de charger de nouvelles données, essayer de mettre à jour la
table. KEY est le nom de la colonne qui est utilisée comme clé. Toutes
les autres colonnes sont les nouvelles données à mettre à jour. Si
aucune ligne ne correspond à une clé donnée, la mise à jour pour cette
ligne est ignorée.
Note: utiliser les options -T et -U ensemble n'a pas de sens, mais -T
est quand même honoré.
-Z, --null-value VALUE
Avec les options -I et -U, considérer que NULL est représenté par la
chaine spécifiée. Par défaut, utiliser \N
-z, --null-is-empty
Avec les options -I et -U, considérer que NULL est représenté par la
chaine vide. Cette option est équivalente à -Z ''
-t, --types [DEFAULT_TYPE,]FIELD:TYPE,...
Spécifier pour chaque champ mentionné le type de donnée à forcer. Le
type 'auto' signifie que le type est autodétecté. C'est la valeur par
défaut. Les autres types valides sont 'str', 'int' et 'date'
Cette option est ignorée avec l'option -L
-A, --analyse
Analyser les données et afficher une requête pour créer une table qui
pourrait contenir ces données.
Cette option implique --fake et affiche simplement la commande SQL.
Pour lancer la commande SQL générée, il faut ajouter l'option --run
APRES cette option
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,45 +0,0 @@
# netconfig
~~~
netconfig: gérer la configuration du réseau
USAGE
netconfig -c network.conf
netconfig [iface:]ip[/suffix]...
OPTIONS
-P, --partial
Activer le mode de configuration partielle. C'est la valeur par défaut.
Dans ce mode, la configuration courante n'est pas modifiée. Seules de
nouvelles adresses ips sont configurées le cas échéant.
-F, --full
Activer le mode de configuration complète. Dans ce mode, le nom d'hôte
ainsi que toutes les interfaces, pont et adresses sont configurés.
-z, --reset
En mode full, recréer le fichier /etc/network/interfaces au lieu
d'essayer de le mettre à jour.
-l, --inline
Prendre la configuration depuis la ligne de commande. C'est la valeur
par défaut, sauf si un fichier network.conf existe dans le répertoire
courant.
Dans ce mode, chaque argument est une spécification d'adresse IP à
configurer. Les autres paramètres i.e les ponts, le nom d'hôte et le
contenu du fichier /etc/networks sont spécifiés avec les options -b,
-h et -e
-c, --config CONFIG
Spécifier le fichier de configuration à utiliser pour la configuration
du réseau. Cette option est automatiquement activée si le répertoire
courant contient un fichier network.conf
-w, --write
Ecrire la configuration actuelle dans le fichier network.conf
Note: comme ce script demande les droits de root, le fichier sera écrit
avec le propriétaire root.
-b, --bridge BR:IFACES
En mode inline, spécifier une liste de ponts à configurer.
-h, --host HOST
En mode inline, spécifier le nom d'hôte pleinement qualifié
-e, --etc-networks CONTENT
Spécifier un contenu pour remplacer le fichier /etc/networks
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,7 +0,0 @@
# noerr
~~~
noerr: lancer une commande en supprimant la sortie d'erreur
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,7 +0,0 @@
# noerror
~~~
noerror: lancer une commande en masquant son code de retour. le code de retour est toujours 0
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,7 +0,0 @@
# noout
~~~
noout: lancer une commande en supprimant la sortie standard
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,34 +0,0 @@
# nutools
~~~
nutools: configurer ou afficher des informations sur nutools
USAGE
nutools [VERSION]
OPTIONS
-C, --configure
Faire la configuration pour l'utilisateur courant en appelant uenv -u
Avec cette option, l'option -l (ou --local-profiles) est aussi reconnue
et est passée directement à uenv
-v, --version
Afficher la version de nutools installée. C'est l'option par défaut
-c, --check
Calculer si la version installée correspond à la version spécifiée
-o, --oper OPERATOR
Spécifier l'opérateur à utiliser avec l'option --check (par défaut,
utiliser l'opérateur ge, qui permet de vérifier si la version minimum
spécifiée est installée)
--eq
--ne
--lt
--le
--gt
--ge
--same
--diff
Ces options sont des raccourcis. L'option '--OP' est équivalente à
'--check --op OP'
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,10 +0,0 @@
# openurl
~~~
openurl: Ouvrir une URL dans un navigateur
USAGE
openurl <file.url|file.desktop|URL>
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,86 +0,0 @@
# pdev
~~~
pdev: basculer sur une branche de développement
USAGE
pdev [FEATURE [SOURCE]]
pdev -m|-l|-d [FEATURE]
- Vérifier l'existence de la branche develop. La créer si nécessaire en la
basant sur [origin/]master.
- Vérifier s'il n'y a pas de modifications locales. Sinon, proposer de faire un
commit ou un stash.
- Si FEATURE est spécifié, et si on n'est pas déjà sur cette branche, basculer
vers cette nouvelle branche. S'il s'agit d'une nouvelle branche, la baser sur
la branche SOURCE, qui vaut par défaut develop
- Si FEATURE n'est pas spécifié, basculer sur develop s'il s'agit de la seule
solution, sinon afficher un menu pour choisir la branche de destination.
OPTIONS
-C, --projdir PROJDIR
Spécifier le répertoire de base du projet qui est dans git. Par défaut,
on travaille dans le répertoire courant et on laisse git trouver le
répertoire de base du projet. Avec cette option, le répertoire courant
est modifié avant de lancer les commandes git.
-O, --origin ORIGIN
Spécifier le nom de l'origine. Par défaut, utiliser 'origin'
-o, --offline
En cas de création d'une branche, ne pas pousser vers l'origine; ne pas
tenter le cas échéant de traquer la branche dans l'origine; ne pas
supprimer une branche dans l'origine. Cette option est automatiquement
activée si la variable UTOOLS_VCS_OFFLINE est définie.
--online
Annuler l'effet de la variable UTOOLS_VCS_OFFLINE: forcer le mode online
--sync
Faire un certain nombre d'opération pour 'corriger' le dépôt local: pour
chacune des branches distantes, vérifier qu'il existe une branche locale
qui la traque, et pour chaque feature branche locale, vérifier qu'il
existe une branche distante associée. Cette option nécessite --online
-s, --squash COMMIT_MSG
Si la branche actuelle est une feature branch, la merger comme un seul
commit avec le message COMMIT_MSG dans develop puis la supprimer. Puis
basculer sur la branche develop.
Cette option ne devrait pas être utilisée avec -k, puisque bien que les
modifications soient mergées, la branche elle-même n'est pas considérée
comme mergée. Les résultats sont donc indéfinis si la branche est mergée
à plusieurs reprises.
-b, --rebase
Si la branche actuelle est une feature branch, lancer 'git rebase -i'
sur la feature branch. Cela permet de réordonner les commits pour
nettoyer l'historique avant de fusionner la branche avec -m
Cette option devrait le cas échéant être utilisée immédiatement avant -m
ou alors il faut forcer le push et communiquer avec l'équipe sur le fait
que la branche de feature a été rebasée.
-m, --merge
Si la branche actuelle est une feature branch, la merger dans develop
puis la supprimer. Puis basculer sur la branche develop.
--merge-log
Ajouter un résumé des modifications sur la feature branch en ajoutant le
log en une ligne de chaque commit dans le message du merge. Cette option
n'est en principe pas nécessaire puisque 'prel -um' intègre la liste des
commits dans CHANGES.txt
-k, --keep
Avec l'option -m, ne pas supprimer une feature branch après l'avoir
fusionnée dans develop. Cela permet d'intégrer les modifications petit à
petit.
--delete
Supprimer une feature branch, à condition qu'elle aie déjà été
entièrement fusionnée dans la branch develop
--force-delete
Supprimer une feature branch, même si elle n'a pas encore été fusionnée
dans la branche develop
-l, --log
-d, --diff
Afficher les modifications entre deux branches. L'option --log affiche
les modifications dans l'ordre alors que --diff affiche les différences
sous forme de diff. Les deux options peuvent être combinées et ont
l'effet de 'git log -p'
La branche comparée, s'il elle n'est pas spécifiée, est par défaut la
branche courante. S'il s'agit d'une feature branch, elle est comparée à
develop. S'il s'agit de la branche develop, elle est comparée à master.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,105 +0,0 @@
# prel
~~~
prel: basculer sur une branche de release
USAGE
prel -u [SOURCE]
prel -c [RELEASE [SOURCE]]
prel -m|-l|-d [RELEASE]
- Vérifier s'il n'y a pas de modifications locales. Sinon, proposer de faire un
commit ou un stash.
- Avec l'option -c, s'il existe une branche de release, proposer de basculer
vers elle ou sur la branche master. Sinon, basculer sur la branche master.
- Avec l'option -u, proposer ou fixer une branche de release à créer. Si elle
existe déjà, basculer vers elle. Sinon, la créer en la basant sur SOURCE, qui
vaut par défaut develop
OPTIONS
-C, --projdir PROJDIR
Spécifier le répertoire de base du projet qui est dans git. Par défaut,
on travaille dans le répertoire courant et on laisse git trouver le
répertoire de base du projet. Avec cette option, le répertoire courant
est modifié avant de lancer les commandes git.
-O, --origin ORIGIN
Spécifier le nom de l'origine. Par défaut, utiliser 'origin'
-o, --offline
En cas de création d'une branche, ne pas pousser vers l'origine; ne pas
tenter le cas échéant de traquer la branche dans l'origine; ne pas
supprimer une branche dans l'origine. Cette option est automatiquement
activée si la variable UTOOLS_VCS_OFFLINE est définie.
--online
Annuler l'effet de la variable UTOOLS_VCS_OFFLINE: forcer le mode online
-c, --checkout
Basculer vers une branche de release existante. C'est l'option par
défaut. Si aucune branche de release n'existe, basculer vers master
-u, --update
Préparer une nouvelle release. Utiliser une des options -x, -z ou -p
pour spécifier le type de release à préparer. Si la branche qui serait
créée pour le type de release existe déjà, basculer vers cette branche.
S'il faut la créer, la baser sur la branche SOURCE, qui vaut par défaut
develop
--menu
-x, --major
-z, --minor
-p, --patchlevel
Utilisé avec l'option -u, soit afficher un menu pour choisir la version
de la nouvelle release (par défaut), soit préparer respectivement une
release majeure, mineure, ou pour correction de bug.
-v-OPT
Avec l'option -u, spécifier une option de pver permettant de choisir la
version de la nouvelle release. Les options supportées sont -v, -l, -a,
-b, -r et -R. Par exemple, si la version actuelle sur la branche master
est 0.2.3, les options '-uz -v-lbeta' permettent de préparer la release
0.3.0-beta
En principe, cette option n'a pas à être utilisée, puisque dans une
branche de release, on peut faire vivre les versions de pré-release
jusqu'à la release finale. Ainsi, la branche de release est nommée
d'après la version finale, mais le projet peut recevoir une version de
pré-release incrémentale.
-w, --write
Si une nouvelle branche est créée avec -u, mettre à jour le fichier
VERSION.txt avec pver. C'est l'option par défaut.
-n, --no-write
Si une nouvelle branche est créée avec -u, NE PAS mettre à jour le
fichier VERSION.txt avec pver. Utiliser cette option si la mise à jour
du numéro de version doit être faite d'une manière particulière.
-e, --edit
Editer le fichier CHANGES.md autogénéré par les options -u -w ou un
fichier CHANGES.txt existant. Cette option est surtout utile si -m est
utilisé avec -u, pour donner la possibilité de corriger la liste des
modifications avant leur enregistrement définitif.
-m, --merge
Si la branche actuelle est une branche de release, ou s'il existe une
branche de release, la merger dans master, puis dans develop, puis la
supprimer. A l'issu de cette opération, rester sur la branche develop.
S'il n'existe pas de branche de release, proposer de fusionner les
modifications de la branche develop dans la branche master, sans
préparer de branche de release au préalable.
--delete
Supprimer une branche de release, à condition qu'elle aie déjà été
entièrement fusionnée dans la branch master
--force-delete
Supprimer une branche de release, même si elle n'a pas encore été
fusionnée dans la branche master
-s, --summary
Afficher la liste des différences entre la branche develop et la branche
master, comme elle serait générée par les options -u -w pour le fichier
CHANGES.txt (la syntaxe pour CHANGES.md est légèrement différente)
-l, --log
Afficher les modifications actuellement effectuée dans la branche de
release par rapport à develop.
-d, --diff
Afficher les modifications actuellement effectuée dans la branche de
release par rapport à develop, sous forme de diff.
OPTIONS AVANCEES
--uc, --upgrade-changes
Convertir un fichier CHANGES.txt en CHANGES.md
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,201 +0,0 @@
# pver
~~~
pver: gérer des numéros de version selon les règles du versionage sémantique v2.0.0 (http://semver.org/)
USAGE
pver [options]
OPTIONS
-w, --auto-file DIR
Gérer le numéro de version du répertoire spécifié. Si un fichier pom.xml
existe dans ce répertoire, alors c'est l'option '-e DIR/pom.xml' qui est
activé. Si un fichier VERSION.txt existe dans ce répertoire, alors c'est
l'option '-f DIR/VERSION.txt' qui est activée. Sinon, un nouveau fichier
VERSION.txt est créé dans ce répertoire. C'est l'option par défaut.
--sw, --auto-string DIR
Prendre pour valeur de départ la version du répertoire spécifié. Si un
fichier pom.xml existe dans ce répertoire, alors c'est l'option -E qui
est activé. Si un fichier VERSION.txt existe dans ce répertoire, alors
c'est l'option -F qui est activée.
--gw, --auto-git-string [BRANCH:]DIR
Prendre pour valeur de départ la version du répertoire spécifié dans la
branche BRANCH (qui vaut par défaut master) du dépôt git. Si un fichier
pom.xml existe dans ce répertoire, alors c'est l'option -g qui est
activé. Si un fichier VERSION.txt existe dans ce répertoire, alors c'est
l'option -G qui est activée.
-e, --pom POMFILE
Gérer le numéro de version se trouvant dans le fichier pom.xml spécifié.
Le fichier DOIT exister. Implique --maven-update
-E, --pom-string POMFILE
Prendre pour valeur de départ la version contenue dans le fichier
pom.xml spécifié. Le fichier DOIT exister. Implique --maven-update
-f, --file VERSIONFILE
Gérer le numéro de version se trouvant dans le fichier spécifié. Le
fichier est créé si nécessaire.
-F, --file-string VERSIONFILE
Prendre pour valeur de départ le contenu du fichier VERSIONFILE.
-g, --git-file-string [BRANCH:]VERSIONFILE
Prendre pour valeur de départ le contenu du fichier VERSIONFILE (qui
vaut par défaut VERSION.txt) dans la branche BRANCH (qui vaut par défaut
master) du dépôt git. Retourner 2 si on n'est pas situé dans un dépôt
git.
-G, --git-pom-string [BRANCH:]POMFILE
Prendre pour valeur de départ la version du fichier POMFILE (qui vaut
par défaut pom.xml) dans la branche BRANCH (qui vaut par défaut master)
du dépôt git. Retourner 2 si on n'est pas situé dans un dépôt git.
--git-prel-string
Prendre pour valeur de départ le numéro de version correspondant à la
branche de release courante. Retourner 1 si la branche courante n'est
pas une branche de release, 2 si on n'est pas situé dans un dépôt git.
-s, --string VERSION
Prendre pour valeur de départ le numéro de version spécifié
--show
Afficher le numéro de version. C'est l'action par défaut
--check
Vérifier que le numéro de version est conforme aux règles du versionage
sémantique
--eq VERSION
--ne VERSION
--lt VERSION
--le VERSION
--gt VERSION
--ge VERSION
--same VERSION
--diff VERSION
Comparer avec la version spécifiée. Les opérateurs --eq, --ne, --lt,
--le, --gt, et --ge ignorent l'identifiant de build (comme le demande la
règle du versionage sémantique). Les opérateurs --same et --diff
comparent aussi les identifiants de build.
-u, --update
Mettre à jour le numéro de version.
Les options suivantes impliquent --update:
-v, --set-version VERSION
Spécifier un nouveau numéro de version qui écrase la valeur actuelle.
Cette option ne devrait pas être utilisée en temps normal parce que cela
va contre les règles du versionage sémantique.
--prel
Spécifier un nouveau numéro de version qui écrase la valeur actuelle. Le
numéro de version est obtenu à partir du nom de la branche git courante,
qui doit être de la forme release-VERSION
--menu
Afficher un menu permettant de choisir le composant de la version à
incrémenter.
-x, --major
Augmenter le numéro de version majeure.
-z, --minor
Augmenter le numéro de version mineure. C'est la valeur par défaut, sauf
avec --maven-update où c'est l'option -p qui est sélectionnée par
défaut.
-p, --patchlevel
Augmenter le numéro de patch.
-k, --keep
Ne pas augmenter le numéro de version. Cette option est surtout utile
pour *convertir* un numéro de version existant et mettre à jour le
fichier correspondant. Elle est assumée si aucune option -[xzp] n'est
spécifiée et qu'une des options -[labrSRmM] est utilisée.
-l, --prelease ID
Spécifier un identifiant de pré-release, à ajouter au numéro de version.
-a, --alpha
-b, --beta
-r, --rc
Spécifier une pré-release de type alpha, beta, ou rc. Si la version est
déjà dans ce type, augmenter la dernière valeur numérique des composants
de l'identifiant, e.g. alpha deviant alpha.1, beta-1.2 devient beta-1.3,
rc1 devient rc2
XXX ces fonctions ne sont pas encore implémentées
-S, --snapshot
Ajouter l'identifiant SNAPSHOT, utilisé par Maven
-R, --final, --release
Supprimer l'identifiant de prérelease, utilisé par Maven
-m, --metadata ID
Spécifier un identifiant de build, à ajouter au numéro de version.
-M, --vcs-metadata
Calculer l'identifiant de build à partir de la révision actuelle dans le
gestionnaire de version. Note: pour le moment, seul git est supporté.
--add-metadata ID
Ajouter l'identifiant spécifié à la valeur actuelle, au lieu de la
remplacer. Séparer l'identifiant de la valeur précédente avec un '.'
OPTIONS AVANCEES
--show-source
Afficher le type de source qui sera traité, i.e. pom, file, pom-string,
file-string, git-pom-string, git-file-string
--vpath VPATH
Pour les options -e et -E, spécifier le chemin XPATH du tag qui contient
le numéro de version.
--map MAPFILE
Cette option permet de spécifier un fichier de règles qui indique les
fichiers pom.xml et VERSION.txt qui doivent être mis à jour dans un
projet multi-modules pour lequel les versions doivent être mises à jour
en même temps.
Par défaut, si un fichier nommé .pver-map existe dans le répertoire de
{POM,VERSION}FILE, cette option est automatiquement activée. Ainsi, on
n'aura besoin d'utiliser cette option que si l'on désire charger un
fichier alternatif ou ignorer le fichier par défaut.
Si une valeur vide est fournie, seul le fichier {POM,VERSION}FILE est
traité. Sinon, {POM,VERSION}FILE est utilisé uniquement pour chercher le
fichier .pver-map et seuls les fichiers mentionnés dans MAPFILE sont
traités.
Le fichier MAPFILE est constitué d'un ensemble de lignes de la forme
FILESPEC:VPATH
FILESPEC est requis et prend la forme d'une spécification de chemin
relatif au répertoire de MAPFILE et identifiant un ensemble de fichiers
de version. Si FILESPEC contient des wildcards, alors les fichiers
identifiés par ce chemin sont ignorés s'ils ont déjà été traités par une
règle précédente. Si FILESPEC ne contient pas de wildcards, alors le
fichier est systématiquement traité.
VPATH désigne le chemin XPATH vers le numéro de version qu'il faut
mettre à jour dans les fichiers pom.xml. Certaines valeurs spéciales
pour VPATH sont supportées:
(vide) le chemin par défaut est utilisé pour ce fichier, c'est à
dire /project/version ou /project/parent/version en fonction
du contenu du fichier
- le fichier pom.xml n'est pas modifié (il est ignoré)
D alias pour le chemin XPATH /project/version
P alias pour le chemin XPATH /project/parent/version
Pour les fichiers VERSION.txt, VPATH doit être vide
Le fichier de version correspondant au premier fichier de la première
ligne de MAPFILE contient la version de référence, qui est dupliquée
dans tous les autres fichiers.
--allow-empty
Supporter que la version puisse ne pas être spécifiée ni trouvée. Sans
cette option, on assume que la version effective est 0.0.0 si elle n'est
pas spécifiée ni trouvée.
Avec --show et --update, ne rien afficher si la version est vide.
--convert
--no-convert
Activer (resp. désactiver) la conversion automatique. Par défaut, si la
version est au format classique 'x.z[.p]-rDD/MM/YYYY', elle est
convertie automatiquement au format sémantique x.z.p+rYYYYMMDD
-t, --maven-update
Mettre à jour le numéro de version selons les règles de Maven. Cette
option est automatiquement activée si -e est sélectionné. Elle n'est
prise en compte qu'avec l'option -u
Si les options -R et -S ne sont pas spécifiée, alors une release est
transformée en snapshot et une snapshot en release. Avec -R, une
snapshot est transformée en release, et une release est traitée /
incrémentée normalement. Avec -S une release est transformée en
snapshot, et un snapshot est traité / incrémentée normalement.
Si l'une des options -x, -z, -p est utilisée, alors la partie spécifiée
est incrémentée selon les règles suivantes. Dans les exemples suivants,
A est un nombre quelconque, B = A + 1, et x, y et z sont des nombres
quelconques.
Avec l'option -x:
A.0.0-SNAPSHOT --> A.0.0
A.x.y-SNAPSHOT --> B.0.0
x.A.y --> x.B.0-SNAPSHOT
Avec l'option -z:
x.A.0-SNAPSHOT --> x.A.0
x.A.y-SNAPSHOT --> x.B.0
x.A.y --> x.B.0-SNAPSHOT
Avec l'option -p, qui est celle sélectionnée par défaut:
x.y.z-SNAPSHOT --> x.y.z
x.y.A --> x.y.B-SNAPSHOT
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,20 +0,0 @@
# pz
~~~
pz: faire une archive du projet
USAGE
pz
OPTIONS
-C, --projdir PROJDIR
Spécifier le répertoire de base du projet qui est dans git. Par défaut,
on travaille dans le répertoire courant et on laisse git trouver le
répertoire de base du projet. Avec cette option, le répertoire courant
est modifié avant de lancer les commandes git.
-d, --destdir DESTDIR
Spécifier le répertoire dans lequel générer l'archive. Par défaut,
prendre le répertoire parent du répertoire de base du dépôt.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,16 +0,0 @@
# reptyr.cgo
~~~
Usage: reptyr [-s] PID
reptyr -l|-L [COMMAND [ARGS]]
-l Create a new pty pair and print the name of the slave.
if there are command-line arguments after -l
they are executed with REPTYR_PTY set to path of pty.
-L Like '-l', but also redirect the child's stdio to the slave.
-s Attach fds 0-2 on the target, even if it is not attached to a tty.
-h Print this help message and exit.
-v Print the version number and exit.
-V Print verbose debug output.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,12 +0,0 @@
# rmtildes
~~~
rmtildes: supprimer les fichiers *~ dans le répertoire courant
USAGE
rmtildes [dir [glob]]
Par défaut, dir==. et glob==*~
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,48 +0,0 @@
# ruinst
~~~
ruinst: Déploiement distant avec uinst
USAGE
ruinst [-h host] [-T tmproot] <file|archive|dir> [-- options de uinst]
note: à cause d'une limitation de makeself, les options de uinst ne devraient
pas contenir d'espaces ni de caractères spéciaux. L'échappement de ces
caractères n'est pas garanti.
OPTIONS
-C Ne pas faire le déploiement. Configurer uniquement la connexion par clé
sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir
se connecter par mot de passe pour configurer la connexion par clé.
Si l'on veut configurer la connexion par clé pour le user root, mais que
ce n'est pas possible de se connecter par mot de passe avec le user root
sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant,
il est possible de faire la configuration avec '--configure root'. La
commande serait alors
ruinst -h user@host --configure root
Si l'hôte distant n'a pas sudo ou si sudo n'est pas configuré, il faut
rajouter l'option --uses-su, e.g:
ruinst -h user@host --configure root --uses-su
-T tmproot
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
/var/tmp. Cette option est utile pour les vservers, qui ont par défaut
un /tmp minuscule de 16 Mo.
-S, --ssh ssh
Spécifier le programme à utiliser pour la connection par ssh.
-h hosts
-h @hostsfile
Spécifier un ou plusieurs hôtes sur lequels faire le déploiement. Pour
spécifier plusieurs hôtes, il est possible d'utiliser plusieurs fois
l'option -h, ou spécifier en une seule fois plusieurs hôtes en les
séparant par un espace ou le caractère ':', e.g. 'host1 host2' ou
'host1:host2'. Si la spécification contient les caractères { et },
l'expansion est effectuée, e.g
-h 'root@{host1,host2}.univ.run'
Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
root. Il est possible de spécifier un autre utilisateur avec la syntaxe
user@host, e.g -h user@host
La forme @hostsfile permet de lire la liste des hôtes depuis le fichier
hostsfile, à raison d'un hôte par ligne.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,14 +0,0 @@
# rumount
~~~
rumount: démonter un système de fichier récursivement
USAGE
rumount mountpoint
Démonter tous les systèmes de fichiers qui sont montés en-dessous de mountpoint
puis démonter mountpoint. Démonter aussi tous les systèmes de fichiers
bind-montés à partir d'un sous-répertoire de mountpoint.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,33 +0,0 @@
# runsconfig
~~~
runsconfig: Gérer un répertoire d'hôte de runs
USAGE
runsconfig -c [host [destdir]]
runsconfig -t -- args...
OPTIONS
-c, --create
Créer un nouveau répertoire de configuration pour un hôte
-d, --destdir DESTDIR[=runs]
Nom du répertoire local de configuration.
-t, --template [OPT]
Gérer les fichiers du répertoire local avec templatectl. La valeur de
cette option est utilisée comme argument court pour l'invocation de
templatectl, e.g
runsconfig -tm args
est équivalent à
templatectl -m args
Les arguments qui restent sont passés tels quels à templatectl
Les options courantes de templatectl -l, -v, -m, -L sont disponibles
directement
--help-template
Afficher l'aide concernent la gestion des templates.
Equivalent à -t -- --help
-h, --host HOST
Spécifier l'hôte. Equivalent à -v host=HOST
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,72 +0,0 @@
# runsmod
~~~
runsmod: récupérer des dépôts git à usage de runs
USAGE
runsmod [options] [-h host] [modules...]
Tous les dépôts spécifiés dans la configuration sont récupérés. Si des modules
sont spécifiés, les dépôts correspondants sont récupérés aussi. Avec l'option
-h, des dépôts spécifiques à l'hôte peuvent éventuellement être récupérés en
plus.
Il est possible de spécifier le module '*' pour récupérer tous les modules
disponibles. C'est utile sur un poste de développement.
OPTIONS
-c, --config CONFIG
Spécifier un fichier de configuration à charger au lieu de la valeur par
défaut ~/etc/default/runs
--prod
--devel
Forcer un mode de sélection des urls. En mode production, préférer pour
le clonage les urls de production, qui sont en principe accessibles sans
authentification et en lecture seule. En mode développement, préférer
pour le clonage les urls de développement, qui sont en principe
accessibles par clé ssh et en lecture/écriture
--no-fetch
Ne rien récupérer. Utile avec --update-repolist
-N, --no-host
-A, --all-hosts
-H, -h, --host HOST
-T, --this-host
Options permettant de spécifier l'hôte pour la récupération de dépôts
spécifiques.
--no-host demande explicitement à ce qu'aucun hôte ne soit spécifié
--all-hosts sélectionne tous les dépôts spécifiques
--host récupère uniquement les dépôts pour l'hôte spécifié
--this-host équivaut à --host natrix
L'option par défaut est --this-host en mode production et --all-hosts en
mode développement
--update-repolist
Forcer la mise à jour de la liste des dépôts. En principe, cette mise à
jour n'est pas faite plus d'une fois par période de 24 heures.
--shallow-clone
Faire un clone avec une profondeur de 1. C'est la valeur par défaut pour
le mode production.
-0, --offline
-n, --no-pull
-u, --pull
Spécifier le mode opératoire pour la récupération des dépôts.
En mode --offline, ni clone ni pull ne sont autorisés. Le module doit
avoir déjà été cloné.
En mode --no-pull, seul le clonage est autorisé, e.g. le dépôt est
cloné si ce n'est pas déjà le cas.
En mode --pull, cloner le dépôt si ce n'est pas déjà le cas, ou le
mettre à jour le dépôt avant de l'utiliser s'il avait déjà été cloné.
Par défaut, utiliser --pull en mode production et --no-pull en mode
développement.
-i, --identity IDENTITY_FILE
Spécifier le fichier depuis lequel lire la clé privée pour les
connexions par ssh.
-o, --output OUTPUT
Spécifier un fichier dans lequel écrire des définitions de variables,
notamment REPODIRS qui reçoit la liste des chemins des dépôts qui ont
été récupérés. De plus, les variables RUNSSCRIPTSPATH, RUNSMODULESPATH
et RUNSHOSTSPATH sont définies.
-a, --append-output
Ajouter au fichier OUTPUT au lieu de l'écraser
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,94 +0,0 @@
# sqlcsv
~~~
USAGE:
sqlcsv [query]
query est la requête SQL à exécuter. Si query n'est pas spécifiée ou si elle
vaut '-', la requête SQL est lue sur l'entrée standard, ou depuis un
fichier si l'option -f est spécifiée.
DEMARRAGE
Au démarrage, les répertoires de configuration (utilisateur ~/.sqlcsv et système
/etc/sqlcsv) sont analysés. Les fichiers *.jar situés dans ces répertoires sont
ajoutés au CLASSPATH. La présence de certains fichiers est testée pour activer
éventuellement les logs détaillés.
OPTIONS
-C, --config CONFIG
Prendre les informations de connexion depuis le fichier de propriété
spécifié. Pour l'identifiant CONN, la propriété 'CONN.url' doit exister
dans ce fichier avec la valeur de l'url jdbc de connexion. De plus, les
propriétés 'CONN.user' et 'CONN.password' contiennent respectivement si
nécessaire le nom et le mot de passe de connexion. La propriété
'loglevel', si elle existe, est utilisée pour configurer le niveau
d'affichage des logs, comme avec l'option --loglevel
Si cette option n'est pas spécifiée, un fichier nommé sqlcsv.properties
est recherché dans l'ordre: dans le répertoire courant, dans le
répertoire de configuration utilisateur, puis dans le répertoire de
configuration système. Si le fichier est trouvé, il est chargé
automatiquement.
-l, --conn CONN
Spécifier l'identifiant (ou l'url) de connexion. Cette information est
obligatoire. Si cette option n'est pas fournie, il faut spécifier un
fichier de configuration avec l'option -C dans lequel *une seule*
propriété 'CONN.url' est définie.
-u, --user USER
-p, --password PASSWORD
Spécifier un nom de connexion et un mot de passe si l'url ne le fournit
pas. Ces valeurs ont la priorité sur les valeurs éventuellement déjà
présentes dans le fichier de propriété.
-f, --input INPUT
Lire la requête depuis le fichier INPUT au lieu de la lire depuis la
ligne de commande ou l'entrée standard. Ne pas spécifier cette option ou
utiliser '-' pour lire depuis l'entrée standard. Cette option est
ignorée si la requête est fournie sur la ligne de commande.
-o, --output OUTPUT
Ecrire le résultat dans le fichier OUTPUT. Utiliser '-' pour spécifier
la sortie standard (c'est la valeur par défaut). S'il y a plusieurs
requêtes et que le fichier de sortie n'est pas la sortie standard,
ajouter un numéro incrémental au nom du fichier en sortie pour chaque
requête. Sinon, il est possible de spécifier plusieurs fois cette option
pour nommer les fichiers correspondant à chaque requête.
-t, --autocommit
Activer le mode autocommit
-c, --ignore-io-error
Continuer le traitement même en cas d'erreur du système de fichiers.
Cependant le traitement s'arrête et la transaction est annulée si une
autre erreur se produit.
-y, --ignore-any-error
Continuer le traitement même en cas d'erreur quelconque.
-n, --no-headers
Ne JAMAIS inclure les en-têtes dans la sortie, même avec l'option -h
-a, --append
Ajouter le résultat au fichier OUTPUT au lieu de l'écraser.
-A, --auto-na
Activer les option -n -a si le fichier OUTPUT existe et qu'il est non
vide. Le test n'est effectué que pour le premier fichier spécifié.
-s, --same-output
Utiliser le même fichier pour écrire le résultat de toutes les requêtes.
Normalement, un numéro incrémental est ajouté au fichier en sortie si
plusieurs requêtes sont spécifiées. Si les en-têtes sont les mêmes,
ajouter le résultat au fichier directement à la suite. Sinon, sauter une
ligne blanche et afficher les nouveaux en-têtes.
-h, --force-headers
En cas d'écriture du résultat de plusieurs requêtes dans un même
fichier, ne pas tenter de concaténer les résultats même si les en-têtes
sont les mêmes.
--uc-output
Ajouter dans la sortie les résultat de toutes les requêtes, pas
seulement celles de type DQML
--loglevel LOGLEVEL
Spécifier le niveau de logs à afficher. Les valeurs valides sont à
choisir parmi ALL, FINEST, FINER, FINE, CONFIG, INFO, WARNING, ERROR
La présence de certains fichiers dans les répertoires de configuration
utilisateur ou système configure les logs avant que les options de la
ligne de commande ne soient analysés: un fichier DEBUG fait démarrer
l'application avec le niveau de log ALL ce qui permet de voir les logs
concernant le chargement des jar. Un fichier SQL_DEBUG permet d'activer
la trace de DriverManager. Exemple:
mkdir -p ~/.sqlcsv && touch ~/.sqlcsv/{DEBUG,SQL_DEBUG}
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,13 +0,0 @@
# uawk
~~~
uawk: wrapper pour des outils implémentés en awk
USAGE
uawk TOOL args...
Les noms d'outils valides sont: awkrun awkcsv grepcsv awkfsv2csv mergecsv sortcsv dumpcsv printcsv
Utiliser l'option --help pour obtenir de l'aide sur chacun des outils
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,31 +0,0 @@
# ucalc
~~~
ucalc: Afficher une valeur dans plusieurs unités
USAGE
ucalc value
Sans suffixe, la valeur est exprimée en octets. Sinon, elle peut être suffixée
pour spécifier l'unité dans laquelle est exprimée la valeur:
K,M,G,T -- Kibi (1024), Mibi (1024^2), Gibi (1024^3), Tebi (1024^4)
k,m,g,t -- Kilo (1000), Mega (1000^2), Giga (1000^3), Tera (1000^4)
s -- secteurs de 512 octets
S -- secteurs de 2048 octets
p -- pages de 4096 octets
c -- cylindres (si l'option -c est spécifiée)
b -- octets
OPTIONS
-u UNIT
Spécifier l'unité de value. Le suffixe qui est éventuellement sur value
est ignoré.
-o UNIT
Spécifier l'unité en sortie. Par défaut, afficher la valeur dans toutes
les unités supportées.
-c VALUE
Taille d'un cylindre en octets, pour permettre l'affichage des valeurs
en cylindres
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,14 +0,0 @@
# udaemon.cgo
~~~
udaemon.cgo: start a program as a daemon
USAGE
udaemon.cgo /path/to/prog [args...]
OPTIONS
-d DESTDIR
Change to DESTDIR instead of "/" before starting the program
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,103 +0,0 @@
# udist
~~~
udist: gestion d'une distribution upstream
Des fichiers de configuration (par exemple) sont distribués par un partenaire,
et il faut maintenir des modifications locales, tout en acceptant les mises à
jour provenant de l'upstream. Ce script aide à maintenir un tel scénario.
En général, la distribution upstream identifie les fichiers modifiables en leur
donnant une extension particulière, par exemple 'file.origine' ou 'file.default'
La liste des extensions reconnues est spécifiée avec l'option -s. Lors de leur
intégration dans le répertoire local, ces fichiers sont copiés sans cette
extension.
Terminologie: Les fichiers pour lesquels il faut maintenir une version locale
sont appelés 'fichiers locaux', qu'ils viennent de la distribution upstream ou
non. Les autres fichiers qui proviennent de la distribution sont appelés
'fichiers upstream'.
USAGE
udist cmd [options]
OPTIONS COMMUNES
-s .EXT
Ajouter une extension à la liste des extensions reconnues comme contenu
original modifiable dans la distribution upstream. Par défaut, les
extensions suivantes sont reconnues:
.udist .origine .default
Cette option peut être utilisée autant de fois que nécessaire.
--clear-origexts
Supprimer la liste par défaut des extensions origines. Cette option doit
être spécifiée avant l'option -s pour construire une nouvelle liste.
La liste des extensions ne doit pas être vide. Si c'est le cas, elle est
modifiée pour contenir l'unique élément (.udist)
-d WORKDIR
Spécifier le répertoire de travail. Par défaut, la racine du répertoire
de travail est cherchée à partir du répertoire courant.
--help
Afficher l'aide détaillée de la commande spécifiée
COMMANDES
init [WORKDIR [ARCHIVE]]
Initialiser un répertoire de travail pour contenir une distribution
upstream
upstream-new, new SRCDIR|ARCHIVE [WORKDIR]
Intégrer une nouvelle distribution upstream.
Les nouveaux fichiers sont copiés tout de suite dans le répertoire de
travail. Par contre, les modifications ne sont intégrées qu'avec la
commande patch
upstream-clear, clear [WORKDIR]
Supprimer tous les fichiers non modifiés de l'upstream.
local-create, create FILE
Créer et/ou identifier FILE comme une modification locale par rapport à
l'upstream.
local-edit, edit FILE
S'assurer que local-create a été exécuté si nécessaire pour FILE, puis
l'éditer avec vim
local-copy, cp SRCFILE DESTFILE
local-move, mv SRCFILE DESTFILE
local-remove, rm FILE
Frontend pour respectivement cp, mv et rm. Ces commandes agissent aussi
sur les fichiers orig et de tag.
local-tag, tag FILE TAG
Faire une copie du fichier local avec le tag spécifié. Si le fichier de
tag existe déjà, il est écrasé.
local-switch, switch TAG FILE
Sélectionner la copie avec le tag spécifié.
local-put, put [WORKDIR] DESTDIR
Copier tous les fichiers locaux dans DESTDIR, par exemple pour faire une
sauvegarde. Si DESTDIR n'est pas spécifié, prendre la valeur de
l'origine, affichée par local-list
local-get, get [-l|-s] SRCDIR [WORKDIR]
Opération inverse de local-put: intégrer tous les fichiers de SRCDIR
comme fichiers locaux. Si SRCDIR n'est pas spécifié, prendre la valeur
de l'origine, affichée par local-list
local-list, list [WORKDIR]
Lister tous les fichiers locaux. Les fichiers pour lesquels il faut
intégrer une modification de l'upstream avec la commande local-patch
sont identifiés visuellement.
upstream-diff, udiff [FILE]
Après intégration d'une nouvelle distribution upstream, afficher les
modifications entre la nouvelle distribution upstream et l'ancienne pour
tous les fichiers modifiables
local-diff, ldiff [FILE]
Afficher les modifications locales par rapport à l'upstream pour le(s)
fichier(s) spécifié(s).
local-patch, lpatch [FILE]
Après intégration d'une nouvelle distribution upstream, appliquer au(x)
le(s) fichier(s) spécifié(s) les modifications disponibles affichées par
upstream-diff.
local-forget, lforget [FILE]
Après intégration d'une nouvelle distribution upstream, oublier les
modifications disponibles pour le(s) fichier(s) spécifié(s).
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,17 +0,0 @@
# ufixmod
~~~
ufixmod: forcer le mode d'une liste de fichiers
USAGE
ufixmod [options] [dirs|files....]
Le mode forcé pour les répertoires est rwxr-xr-x
Le mode forcé pour les fichiers est rw-r--r--
OPTIONS
-x, --executable
Forcer le mode rwX-r-Xr-X pour les fichiers
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,21 +0,0 @@
# ugenpass
~~~
ugenpass: générer un mot de passe au hasard
USAGE
ugenpass [options]
OPTIONS
-l, --len LEN
Spécifier le nombre de caractères du mot de passe généré
-U, --upper COUNT
-L, --lower COUNT
-A, --alpha COUNT
-N, --number COUNT
-S, --symbol COUNT
-B, --special COUNT
Spécifier le nombre minimum de chaque classe de caractère
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

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