diff --git a/README.md b/README.md new file mode 100644 index 0000000..a3bf3e4 --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +# 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 \ No newline at end of file diff --git a/doc/index.md b/doc/index.md deleted file mode 100644 index 2762f05..0000000 --- a/doc/index.md +++ /dev/null @@ -1,35 +0,0 @@ -# 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](tools/uinst): Déploiement local - * [mkusfx](tools/mkusfx): Faire une archive auto-installable avec uinst - * [ruinst](tools/ruinst): Déploiement distant avec uinst - * [runs](tools/runs): Lancer un script avec le protocole RUNS - * [rruns](tools/rruns): Déploiement distant avec runs -* Librairie réutilisable de scripts shell - * [uinc](tools/uinc): Dépliage des inclusions dans un fichier - * [ulibsync](tools/ulibsync): Faire une copie locale pour un projet de ulib et/ou pyulib -* Autres outils - * [udir](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 \ No newline at end of file diff --git a/doc/nutools.html b/doc/nutools.html deleted file mode 100644 index d12e25b..0000000 --- a/doc/nutools.html +++ /dev/null @@ -1,17829 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
<!--{{{-->
-<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
-<!--}}}-->
-
-
-
-
Background: #fff
-Foreground: #000
-PrimaryPale: #8cf
-PrimaryLight: #18f
-PrimaryMid: #04b
-PrimaryDark: #014
-SecondaryPale: #ffc
-SecondaryLight: #fe8
-SecondaryMid: #db4
-SecondaryDark: #841
-TertiaryPale: #eee
-TertiaryLight: #ccc
-TertiaryMid: #999
-TertiaryDark: #666
-Error: #f88
-
-
-
-
/*{{{*/
-body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
-
-a {color:[[ColorPalette::PrimaryMid]];}
-a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
-a img {border:0;}
-
-h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
-h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
-h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}
-
-.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
-.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
-.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}
-
-.header {background:[[ColorPalette::PrimaryMid]];}
-.headerShadow {color:[[ColorPalette::Foreground]];}
-.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
-.headerForeground {color:[[ColorPalette::Background]];}
-.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}
-
-.tabSelected {color:[[ColorPalette::PrimaryDark]];
-	background:[[ColorPalette::TertiaryPale]];
-	border-left:1px solid [[ColorPalette::TertiaryLight]];
-	border-top:1px solid [[ColorPalette::TertiaryLight]];
-	border-right:1px solid [[ColorPalette::TertiaryLight]];
-}
-.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
-.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
-.tabContents .button {border:0;}
-
-#sidebar {}
-#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
-#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
-#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
-#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
-#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}
-
-.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
-.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
-.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
-.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
-	border:1px solid [[ColorPalette::PrimaryMid]];}
-.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
-.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
-.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
-.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
-	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
-.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
-.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
-	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
-
-.wizard .notChanged {background:transparent;}
-.wizard .changedLocally {background:#80ff80;}
-.wizard .changedServer {background:#8080ff;}
-.wizard .changedBoth {background:#ff8080;}
-.wizard .notFound {background:#ffff80;}
-.wizard .putToServer {background:#ff80ff;}
-.wizard .gotFromServer {background:#80ffff;}
-
-#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
-#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}
-
-.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}
-
-.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
-.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
-.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
-.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
-.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
-.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
-.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
-.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}
-
-.tiddler .defaultCommand {font-weight:bold;}
-
-.shadow .title {color:[[ColorPalette::TertiaryDark]];}
-
-.title {color:[[ColorPalette::SecondaryDark]];}
-.subtitle {color:[[ColorPalette::TertiaryDark]];}
-
-.toolbar {color:[[ColorPalette::PrimaryMid]];}
-.toolbar a {color:[[ColorPalette::TertiaryLight]];}
-.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
-.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}
-
-.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
-.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
-.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
-.tagging .button, .tagged .button {border:none;}
-
-.footer {color:[[ColorPalette::TertiaryLight]];}
-.selected .footer {color:[[ColorPalette::TertiaryMid]];}
-
-.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
-.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
-.lowlight {background:[[ColorPalette::TertiaryLight]];}
-
-.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}
-
-.imageLink, #displayArea .imageLink {background:transparent;}
-
-.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}
-
-.viewer .listTitle {list-style-type:none; margin-left:-2em;}
-.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
-.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}
-
-.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
-.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
-.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}
-
-.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
-.viewer code {color:[[ColorPalette::SecondaryDark]];}
-.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}
-
-.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}
-
-.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
-.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
-.editorFooter {color:[[ColorPalette::TertiaryMid]];}
-.readOnly {background:[[ColorPalette::TertiaryPale]];}
-
-#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
-#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
-#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
-#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
-#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
-#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
-#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
-.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
-.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
-#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:alpha(opacity=60);}
-/*}}}*/
-
-
-
/*{{{*/
-* html .tiddler {height:1%;}
-
-body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}
-
-h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
-h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
-h4,h5,h6 {margin-top:1em;}
-h1 {font-size:1.35em;}
-h2 {font-size:1.25em;}
-h3 {font-size:1.1em;}
-h4 {font-size:1em;}
-h5 {font-size:.9em;}
-
-hr {height:1px;}
-
-a {text-decoration:none;}
-
-dt {font-weight:bold;}
-
-ol {list-style-type:decimal;}
-ol ol {list-style-type:lower-alpha;}
-ol ol ol {list-style-type:lower-roman;}
-ol ol ol ol {list-style-type:decimal;}
-ol ol ol ol ol {list-style-type:lower-alpha;}
-ol ol ol ol ol ol {list-style-type:lower-roman;}
-ol ol ol ol ol ol ol {list-style-type:decimal;}
-
-.txtOptionInput {width:11em;}
-
-#contentWrapper .chkOptionInput {border:0;}
-
-.externalLink {text-decoration:underline;}
-
-.indent {margin-left:3em;}
-.outdent {margin-left:3em; text-indent:-3em;}
-code.escaped {white-space:nowrap;}
-
-.tiddlyLinkExisting {font-weight:bold;}
-.tiddlyLinkNonExisting {font-style:italic;}
-
-/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
-a.tiddlyLinkNonExisting.shadow {font-weight:bold;}
-
-#mainMenu .tiddlyLinkExisting,
-	#mainMenu .tiddlyLinkNonExisting,
-	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
-#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}
-
-.header {position:relative;}
-.header a:hover {background:transparent;}
-.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
-.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0; top:0;}
-
-.siteTitle {font-size:3em;}
-.siteSubtitle {font-size:1.2em;}
-
-#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}
-
-#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
-#sidebarOptions {padding-top:0.3em;}
-#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
-#sidebarOptions input {margin:0.4em 0.5em;}
-#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
-#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
-#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
-#sidebarTabs .tabContents {width:15em; overflow:hidden;}
-
-.wizard {padding:0.1em 1em 0 2em;}
-.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
-.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
-.wizardStep {padding:1em 1em 1em 1em;}
-.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
-.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
-.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
-.wizard .button {padding:0.1em 0.2em;}
-
-#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
-.messageToolbar {display:block; text-align:right; padding:0.2em;}
-#messageArea a {text-decoration:underline;}
-
-.tiddlerPopupButton {padding:0.2em;}
-.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}
-
-.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
-.popup .popupMessage {padding:0.4em;}
-.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
-.popup li.disabled {padding:0.4em;}
-.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
-.listBreak {font-size:1px; line-height:1px;}
-.listBreak div {margin:2px 0;}
-
-.tabset {padding:1em 0 0 0.5em;}
-.tab {margin:0 0 0 0.25em; padding:2px;}
-.tabContents {padding:0.5em;}
-.tabContents ul, .tabContents ol {margin:0; padding:0;}
-.txtMainTab .tabContents li {list-style:none;}
-.tabContents li.listLink { margin-left:.75em;}
-
-#contentWrapper {display:block;}
-#splashScreen {display:none;}
-
-#displayArea {margin:1em 17em 0 14em;}
-
-.toolbar {text-align:right; font-size:.9em;}
-
-.tiddler {padding:1em 1em 0;}
-
-.missing .viewer,.missing .title {font-style:italic;}
-
-.title {font-size:1.6em; font-weight:bold;}
-
-.missing .subtitle {display:none;}
-.subtitle {font-size:1.1em;}
-
-.tiddler .button {padding:0.2em 0.4em;}
-
-.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
-.isTag .tagging {display:block;}
-.tagged {margin:0.5em; float:right;}
-.tagging, .tagged {font-size:0.9em; padding:0.25em;}
-.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
-.tagClear {clear:both;}
-
-.footer {font-size:.9em;}
-.footer li {display:inline;}
-
-.annotation {padding:0.5em; margin:0.5em;}
-
-* html .viewer pre {width:99%; padding:0 0 1em 0;}
-.viewer {line-height:1.4em; padding-top:0.5em;}
-.viewer .button {margin:0 0.25em; padding:0 0.25em;}
-.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
-.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}
-
-.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
-.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
-table.listView {font-size:0.85em; margin:0.8em 1.0em;}
-table.listView th, table.listView td, table.listView tr {padding:0 3px 0 3px;}
-
-.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
-.viewer code {font-size:1.2em; line-height:1.4em;}
-
-.editor {font-size:1.1em;}
-.editor input, .editor textarea {display:block; width:100%; font:inherit;}
-.editorFooter {padding:0.25em 0; font-size:.9em;}
-.editorFooter .button {padding-top:0; padding-bottom:0;}
-
-.fieldsetFix {border:0; padding:0; margin:1px 0px;}
-
-.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
-.zoomer div {padding:1em;}
-
-* html #backstage {width:99%;}
-* html #backstageArea {width:99%;}
-#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
-#backstageToolbar {position:relative;}
-#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
-#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
-#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
-#backstage {position:relative; width:100%; z-index:50;}
-#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
-.backstagePanelFooter {padding-top:0.2em; float:right;}
-.backstagePanelFooter a {padding:0.2em 0.4em;}
-#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}
-
-.whenBackstage {display:none;}
-.backstageVisible .whenBackstage {display:block;}
-/*}}}*/
-
-
-
-
/***
-StyleSheet for use when a translation requires any css style changes.
-This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
-***/
-/*{{{*/
-body {font-size:0.8em;}
-#sidebarOptions {font-size:1.05em;}
-#sidebarOptions a {font-style:normal;}
-#sidebarOptions .sliderPanel {font-size:0.95em;}
-.subtitle {font-size:0.8em;}
-.viewer table.listView {font-size:0.95em;}
-/*}}}*/
-
-
-
/*{{{*/
-@media print {
-#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
-#displayArea {margin: 1em 1em 0em;}
-noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
-}
-/*}}}*/
-
-
-
<!--{{{-->
-<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
-<div class='headerShadow'>
-<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
-<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
-</div>
-<div class='headerForeground'>
-<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
-<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
-</div>
-</div>
-<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
-<div id='sidebar'>
-<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
-<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
-</div>
-<div id='displayArea'>
-<div id='messageArea'></div>
-<div id='tiddlerDisplay'></div>
-</div>
-<!--}}}-->
-
-
-
<!--{{{-->
-<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
-<div class='title' macro='view title'></div>
-<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
-<div class='tagging' macro='tagging'></div>
-<div class='tagged' macro='tags'></div>
-<div class='viewer' macro='view text wikified'></div>
-<div class='tagClear'></div>
-<!--}}}-->
-
-
-
<!--{{{-->
-<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
-<div class='title' macro='view title'></div>
-<div class='editor' macro='edit title'></div>
-<div macro='annotations'></div>
-<div class='editor' macro='edit text'></div>
-<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
-<!--}}}-->
-
-
-
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
-* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
-* [[MainMenu]]: The menu (usually on the left)
-* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
-You'll also need to enter your username for signing your edits: <<option txtUserName>>
-
-
-
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser
-
-Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])
-
-<<option txtUserName>>
-<<option chkSaveBackups>> [[SaveBackups]]
-<<option chkAutoSave>> [[AutoSave]]
-<<option chkRegExpSearch>> [[RegExpSearch]]
-<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
-<<option chkAnimate>> [[EnableAnimations]]
-
-----
-Also see [[AdvancedOptions]]
-
-
-
<<importTiddlers>>
-
-
- -
-
-
[[Main]]
-
-
-
{{{
-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)
-}}}
-
-
-
!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.
-
-
-
[[GettingStarted]]
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-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é
-    -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
-}}}
-
-
-
Outils divers pour linux/macosx, et librairies pour bash
-
-
-
nutools
-
-
-

-
-
-
{{{
-_root: devenir l'utilisateur root, avec 'sudo' si possible, ou 'su' si
-'sudo' n'est pas installé
-}}}
-
-
-
{{{
-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.
-
-    -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
-    -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.
-
-    --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.
-}}}
-
-
-
{{{
-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 @
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-compileAndGo: see http://Yost.com/computers/compileAndGo
-}}}
-
-
-
{{{
-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.
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-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.
-}}}
-
-
-
{{{
-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
---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-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-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     add DIR to variable load-path
---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', `auto', `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 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
-Emacs' operation.  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.
-}}}
-
-
-
{{{
-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.
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-geturl: Télécharger un fichier avec wget ou curl
-
-USAGE
-    geturl <file.url|file.desktop|URL> [wget options]
-}}}
-
-
-
{{{
-mkRewriteRules: Créer un fichier de redirections pour Apache à partir d'un certain
-nombre de règles
-
-USAGE
-    mkRewriteRules -f rewrite.rules [-o RewriteRules.conf] [-w RewriteRules.html] host
-
-OPTIONS
-    -p  Générer les directives <Proxy...> et tenir compte de proxy_acls
-        Par défaut, le champ proxy_acls est ignoré
-
-FORMAT des règles de mapping
-============================
-
-Les commentaires commencent par le signe "#"
-Les règles sont de la forme:
-    src:dest:host:suffix:OPTS:prot:proxy_acls
-    ^prefix
-    =literal
-
-prot vaut par défaut http. Il peut valoir aussi https
-
-Si dest ou suffix se terminent par $, on est en mode NO_SLASH
-En mode NO_SLASH, si src se termine par $, on est en mode NO_TRAIL
-
-* Si dest est de la forme Application.woa
-En mode NO_SLASH, on génère
-    RewriteRule ^/src(.*) [prot://host]/cgi-bin/WebObjects/dest[/suffix]$1 [L,OPTS]
-En mode NO_SLASH+NO_TRAIL, on génère
-    RewriteRule ^/src [prot://host]/cgi-bin/WebObjects/dest[/suffix] [L,OPTS]
-En mode normal, on génère
-    RewriteRule ^/src$ /src/
-    RewriteRule ^/src/(.*) [prot://host]/cgi-bin/WebObjects/dest[/suffix]/$1 [L,OPTS]
-
-* Si dest n'est pas de la forme Application.woa
-En mode NO_SLASH, on génère
-    RewriteRule ^/src(.*) [prot://host]/dest[/suffix]$1 [L,OPTS]
-En mode NO_SLASH+NO_TRAIL, on génère
-    RewriteRule ^/src [prot://host]/dest[/suffix] [L,OPTS]
-En mode normal, on génère
-    RewriteRule ^/src$ /src/
-    RewriteRule ^/src/(.*) /dest[/suffix]/$1 [L,OPTS]
-
-Si une règle est précédée d'une ou plusieurs lignes de la forme "^prefix",
-ces lignes sont copiées avant chacune des commandes RewriteRule générées
-pour une règle. Ceci permet d'ajouter des conditions avec RewriteCond pour
-une règle. e.g.
-    ^RewriteCond %{REMOTE_ADDR} 10\..*
-    src:dest.woa
-qui génère:
-    RewriteCond %{REMOTE_ADDR} 10\..*
-    RewriteRule ^/src$ /src/
-    RewriteCond %{REMOTE_ADDR} 10\..*
-    RewriteRule ^/src/(.*) /cgi-bin/WebObjects/dest.woa/$1 [L]
-
-Une ligne de la forme "=literal" est recopiée sans modifications (sans le "=")
-dans le fichier de sortie.
-
-proxy_acls est utilisé si l'option -p est spécifiée et OPTS contient P (comme
-proxy), ou si le mode de réécriture requière l'utilisation d'un proxy.
-
-* Avec la valeur "None", aucune directive <Proxy> n'est générée
-* Si aucune valeur n'est spécifiée, la directive suivante est générée:
-  <Proxy $URL>
-    AddDefaultCharset off
-    Order Deny,Allow
-    Allow from all
-  </Proxy>
-* Si une valeur est spécifiée, la directive suivante est générée:
-  <Proxy $URL>
-    AddDefaultCharset off
-    Order Allow,Deny
-    Allow from $proxy_acls
-  </Proxy>
-
-Dans les exemples donnés ci-dessus, $URL est l'url générée par la réécriture,
-et $proxy_acls la valeur du champ proxy_acls spécifiée ci-dessus.
-}}}
-
-
-
{{{
-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.
-}}}
-
-
-
{{{
-mkurl: Enregistrer une url dans un fichier raccourci
-
-USAGE
-    mkurl <url> [output]
-
-OPTIONS
-Par défaut, l'url est enregistrée dans un fichier homepage.url
-Mais il est possible de spécifier un fichier avec l'extension .url pour un
-raccourci utilisable aussi sous Windows, ou avec l'extension .desktop pour
-compatibilité avec le standard XDG
-}}}
-
-
-
{{{
-mkusfx: Créer une archive auto-extractible qui installe son contenu avec uinst
-
-USAGE
-    mkusfx [options] [--bare] src cmd...
-    mkusfx [options] [--uinst] src
-
-OPTIONS
-    --bare
-        Installer le contenu de l'archive en lançant la commande 'cmd...' avec
-        le répertoire courant étant le contenu de l'archive. Typiquement, ce
-        sera une commande de forme './script', où script est un fichier situé à
-        la racine de l'archive
-        Dans ce mode d'installation, l'option --self-contained est ignorée.
-    --uinst
-        Installer le contenu de l'archive avec uinst (par défaut)
-    -o dest
-        Spécifier le fichier de sortie. Par défaut, il s'agit de
-        ${src}-installer.run
-    --tmp-archive
-        Spécifier qu'il s'agit d'une archive temporaire. Cette archive
-        s'auto-détruit après utilisation.
-    --self-contained
-        Spécifier que l'archive doit pouvoir s'installer même sur un système sur
-        lequel nutools n'est pas installé. Cette archive contiendra une copie
-        locale de ulib et uinst.sh
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-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.
-}}}
-
-
-
{{{
-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.
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-noerr: lancer une commande en supprimant la sortie d'erreur
-}}}
-
-
-
{{{
-noerror: lancer une commande en masquant son code de retour. le code de retour est toujours 0
-}}}
-
-
-
{{{
-noout: lancer une commande en supprimant la sortie standard
-}}}
-
-
-
{{{
-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'
-}}}
-
-
-
{{{
-openurl: Ouvrir une URL dans un navigateur
-
-USAGE
-    openurl <file.url|file.desktop|URL>
-}}}
-
-
-
{{{
-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.
-}}}
-
-
-
{{{
-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.txt autogénéré par -u -w
-        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. Puis basculer sur la branche master.
-        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
-    -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.
-}}}
-
-
-
{{{
-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
-    -f, --file VERSIONFILE
-        Gérer le numéro de version se trouvant dans le fichier spécifié. Le
-        fichier est créé si nécessaire. C'est l'option par défaut si un fichier
-        nommé VERSION.txt se trouve dans le répertoire courant.
-    -e, --maven POMFILE
-        Gérer le numéro de version se trouvant dans le fichier pom.xml spécifié.
-        Le fichier DOIT exister. C'est l'option par défaut si un fichier nommé
-        pom.xml se trouve dans le répertoire courant.
-    -F, --file-string VERSIONFILE
-        Prendre pour valeur de départ le contenu du fichier VERSIONFILE (qui
-        vaut par défaut VERSION.txt)
-    -g, --git-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 situé dans le répertoire courant.
-    -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
-    --allow-empty
-        Supporter que la version puisse ne pas être spécifiée ni trouvée. Dans
-        ce cas, ne pas assumer que la version effective est 0.0.0
-        Avec --show et --update, ne rien afficher si la version est vide.
-    --check
-        Vérifier que le numéro de version est conforme aux règles du versionage
-        sémantique
-    --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
-    --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.
-    -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
-    -u, --update
-        Mettre à jour le numéro de 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.
-    -p, --patchlevel
-        Augmenter le numéro de patch
-
-    -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
-    -R, --final, --release
-        Supprimer l'identifiant de prérelease
-
-    -m, --metadata ID
-        Spécifier un identifiant de build, à ajouter au numéro de version.
-    -M, --vcs-metadata
-        Spécifier l'identifiant à 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 '.'
-}}}
-
-
-
{{{
-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.
-}}}
-
-
-
{{{
-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.
-}}}
-
-
-
{{{
-rmtildes: supprimer les fichiers *~ dans le répertoire courant
-
-USAGE
-    rmtildes [dir [glob]]
-
-Par défaut, dir==. et glob==*~
-}}}
-
-
-
{{{
-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...
-
-Lancer ce script sans argument (hors options) est équivalent à le lancer avec
-l'argument @default
-
-OPTIONS
-    -C  Ne pas faire le déploiement. Configurer uniquement la connexion par clé
-        sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir
-        se connecter par mot de passe pour configurer la connexion par clé.
-        Si l'on veut configurer la connexion par clé pour le user root, mais que
-        ce n'est pas possible de se connecter par mot de passe avec le user root
-        sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant,
-        il est possible de faire la configuration avec '--configure root'. La
-        commande serait alors
-            rruns -h user@host --configure root
-    -T tmproot
-        Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
-        /var/tmp. Cette option est utile pour les vservers, qui ont par défaut
-        un /tmp minuscule de 16 Mo.
-    -S ssh
-        Spécifier le programme à utiliser pour la connection par ssh.
-    -h host
-    -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.
-        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.
-    -f RSCRIPT
-        Lancer le script individuel spécifié au lieu de chercher dans les
-        répertoires $RUNS{SCRIPTS,HOSTS}PATH
-    -r RECIPE
-        Lancer les scripts spécifiés dans le fichier de recettes individuel
-        spécifié.
-    -z  Forcer la réinstallation des scripts qui se basent sur shouldrun/setdone
-    -o OUTPUT
-        Générer l'archive à lancer sur l'hôte distant au lieu de faire le
-        déploiement. Si plusieurs hôtes sont spécifiés, OUTPUT est considéré
-        comme un nom de base auquel est ajouté le nom de l'hôte sur lequel
-        l'archive doit être déployée.
-    --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).
-}}}
-
-
-
{{{
-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.
-}}}
-
-
-
{{{
-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.
-}}}
-
-
-
{{{
-runs: Lancer un script avec le protocole runs
-
-USAGE
-    runs [options] rscriptname name=value...
-    runs [options] @recipe name=value...
-    runs [options] -f rscript name=value...
-    runs [options] -r recipe name=value...
-
-OPTIONS
-Configuration
-    --init
-    --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.
-    --sysinfos DATA
-        Avec l'option --init, initialiser le fichier sysinfos.conf avec DATA, si
-        le fichier n'a pas déjà été provisionné. Sans cette option, un fichier
-        vide avec des commentaires est créé à la place.
-    --create RSCRIPT
-        Créer un modèle de script avec le nom donné.
-        Avec l'option -h, le script est créé dans le répertoire d'hôte
-        correspondant à l'hôte spécifié
-
-Gestion des scripts
-    -s  Forcer l'exécution du script avec l'utilisateur root si ce n'est pas
-        déjà le cas
-    -f RSCRIPT
-        Lancer le script individuel spécifié au lieu de chercher dans les
-        répertoires de $RUNSSCRIPTSPATH
-    -r RECIPE
-        Lancer les scripts spécifiés dans le fichier de recettes individuel
-        spécifié.
-    -h HOSTNAME[.DOMAIN]
-        Spécifier que les scripts sont destinés à être lancés sur l'hôte
-        spécifié. Les scripts sont alors aussi cherchés dans les répertoires
-        {$RUNSHOSTSPATH}/$hostname.$domain (par défaut) et
-        {$RUNSHOSTSPATH}/$domain/$hostname (le cas échéant)
-        L'option --host est équivalente, sauf que son argument est facultatif et
-        que sa valeur par défaut est l'hôte courant, soit sulfure
-    --list
-        Afficher la liste des scripts qui sont disponibles. Avec l'option -h,
-        inclure aussi les scripts spécifiques à cet hôte.
-        Avec cette option, les arguments supplémentaires agissent comme des
-        filtres (regexp utilisée avec l'opérateur == de la commande [[). Les
-        noms des scripts doivent valider au moins un filtre.
-    --info
-        Afficher la la description du script et la valeur de chaque variable
-        définies
-    --desc-only
-        Afficher seulement la description du script
-    -z  Forcer la réinstallation des scripts qui se basent sur shouldrun/setdone
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-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.
-
-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 sulfure
-        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.
-    -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
-}}}
-
-
-
{{{
-rwoinst: Déploiement distant avec woinst
-
-USAGE
-    rwoinst [-H host] [-T tmproot] <file|archive|dir>... [-- options de woinst]
-
-OPTIONS
-    -C  Ne pas faire le déploiement. Configurer uniquement la connexion par clé
-        sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir
-        se connecter par mot de passe pour configurer la connexion par clé.
-        Si l'on veut configurer la connexion par clé pour le user root, mais que
-        ce n'est pas possible de se connecter par mot de passe avec le user root
-        sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant,
-        il est possible de faire la configuration avec '--configure root'. La
-        commande serait alors
-            rwoinst -H user@host --configure root
-    -T tmproot
-        Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
-        /var/tmp. Cette option est utile pour les vservers, qui ont par défaut
-        un /tmp minuscule de 16 Mo.
-    -S ssh
-        Spécifier le programme à utiliser pour la connection par ssh.
-    -H host
-        Spécifier un hôte distant sur lequel faire le déploiement. Plusieurs
-        options -H peuvent être spécifiées, ou alors on peut séparer plusieurs
-        hôtes par ':', e.g. -H host1:host2
-        Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
-        root. Il est possible de spécifier un autre utilisateur avec la syntaxe
-        user@host, e.g -H user@host
-}}}
-
-
-
{{{
-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}
-}}}
-
-
-
{{{
-twsync: synchroniser un répertoire de wiki avec un tiddlywiki
-
-USAGE
-    twsync [options]
-
-Un répertoire de wiki est un répertoire où chaque page est contenu dans un
-fichier avec l'extension .twp
-Un tiddlywiki est un fichier html contenant le code de TiddlyWiki et les données
-associées.
-
-OPTIONS
-    -d wikidir
-    -f wikifile
-        Spécifier le répertoire de wiki et le tiddlywiki à traiter. Par défaut,
-        il s'agit de wiki.html dans le répertoire courant.
-    -u  Importer les pages de wikidir dans le tiddlywiki. Utiliser cette action
-        quand les pages de wikidir sont modifiées et qu'il faut mettre à jour le
-        tiddlywiki.
-        Il s'agit de l'action par défaut
-    --force
-        Forcer l'importation des pages même si les tiddlers correspondant sont
-        plus récents dans le tiddlywiki
-        Forcer aussi la regénération de wikifile même si aucune modification n'a
-        été détectée
-    -e  Exporter les tiddlers du tiddlywiki vers wikidir. Utiliser cette action
-        quand le tiddlywiki a été modifié, et qu'il faut synchroniser wikidir
-        avec les dernières modifications.
-    -U  Mettre à jour le fichier wikifile avec la dernière version de tiddlywiki
-        située dans ~/wop/modules/nutools/lib/tiddlywiki/empty.html
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-ubackup: faire une sauvegarde des fichiers
-
-USAGE
-    ubackup [options]
-
-OPTIONS
-    -l  Lister les profils de sauvegarde disponibles.
-    -p  Spécifier le profil de sauvegarde à effectuer. Par défaut, toutes les
-        sauvegardes sont effectuées.
-    -u USER
-        Faire le sauvegarde pour l'utilisateur $USER. Cette option n'est valide
-        que pour l'utilisateur root.
-    -n  Afficher ce qui doit être fait plutôt que de le faire
-    -H  Arrêter la machine après une sauvegarde REUSSIE.
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-uconf: Activer ou désactiver un paramètre dans un fichier de configuration
-
-USAGE
-    uconf [options] config name[=value]...
-
-OPTIONS
-    -e
-        Activer le paramètre (par défaut). Si le paramètre existe, mais est
-        commenté, il est décommenté. Si une valeur est spécifiée pour le
-        paramètre, le paramètre est modifié dans le fichier en conséquence.
-    -q
-        Cette option s'utilise avec l'option -e et le type shell. Elle permet
-        de s'assurer que les valeurs ayant des espaces et/ou des caractères
-        spéciaux sont quotées
-    -d
-        Désactiver le paramètre. Le paramètre est commenté s'il existe dans le
-        fichier
-    -a
-        Ajouter une valeur à la variable, ou un paramètre avec cette valeur
-        (suivant le type de fichier de configuration)
-    -A
-        Ajouter une valeur au tableau, ou un paramètre avec cette valeur
-        (suivant le type de fichier de configuration)
-    -t TYPE
-        Type de fichier de configuration. TYPE peut être sh (par défaut), apache
-        ou mysql.
-        shell
-            les paramètres sont de la forme 'name=value', et les commentaires
-            débutent par '#'. Ce type peut être utilisé pour tous les fichiers
-            ayant ces caractéristiques, dont les fichiers de script shell
-        apache
-            les paramètres sont de la forme 'name value', et les commentaires
-            débutent par '#'. Ce type peut être utilisé pour tous les fichiers
-            ayant ces caractéristiques, dont les fichiers de configuration
-            apache
-        mysql, php
-            les paramètres sont dans des sections nommées de la forme [section],
-            sont de la forme 'name=value', et les commentaires débutent par '#'
-            ou ';'
-            Ce type peut être utilisé pour tous les fichiers ayant ces
-            caractéristiques, dont les fichiers de configuration de mysql et de
-            php. Avec ce type, la section est obligatoire.
-    -s SECTION
-        Avec le type mysql, préciser la section dans laquelle inscrire le
-        paramètre. Attention! La section DOIT exister, elle n'est pas créée
-        automatiquement.
-}}}
-
-
-
{{{
-ucrontab: Ajouter/Supprimer une ligne dans crontab
-
-USAGE
-    ucrontab [options] ctline
-
-OPTIONS
-    -a  Ajouter la ligne dans le fichier crontab (par défaut)
-    -r  Enlever la ligne dans le fichier crontab
-    -u user
-        Spécifier l'utilisateur pour lequel on modifie crontab. Par défaut,
-        modifier le crontab de root
-    -H host:hosts...
-        Modifier le crontab sur les hôtes distants spécifiés. Avec l'hôte '.' ou
-        'localhost', la modification est faite sur l'hôte local
-        Si l'action est -a, un script 'undo-ucrontab.sh' est créé dans le
-        répertoire courant, qui annule la planification. Il est possible de
-        lancer ce script le lendemain pour enlever les planifications
-        installées.
-    ctline
-        Ligne de crontab de la forme 'minutes hours days months dows command'
-        Si la ligne est de la forme halt[@hh:mm], la commande 'shutdown -h now'
-        est planifiée pour le LENDEMAIN à hh:mm. si hh:mm n'est pas spécifié,
-        l'arrêt est planifié pour 7:00
-    -t hh:mm
-        Ignorer la partie 'minutes hours days months dows' de ctline, et la
-        remplacer par une planification à hh:mm le LENDEMAIN.
-    --dom dayOfMonth
-    --month month
-        Spécifier respectivement le jour du mois et le mois (1-12) auquel faire
-        la planification. Par défaut, les planifications sont effectuées pour le
-        LENDEMAIN. Il est conseillé de spécifier les deux arguments si le jour
-        doit être fixé.
-    -s cmdfile
-        Spécifier un fichier, dont le contenu est utilisé pour générer le script
-        qui est planifié. Le fichier doit contenir l'ensemble des commandes à
-        exécuter. Le script est modifié pour s'autodétruire à la fin de son
-        exécution. Si ce comportement n'est pas souhaité, il faut rajouter la
-        commande 'exit 0' à la fin.
-    -S cmd
-        Comme -s, mais spécifier le contenu du fichier directement sur la ligne
-        de commande.
-    -f hostsfile
-        Spécifier un fichier qui contient la liste des hôtes sur lesquels faire
-        les planifications.
-        Les options -s, -S, -H, -d, -n sont ignorées. L'option --add est valide
-        jusqu'au premier @group du fichier. Voici le format de ce fichier:
-
-        Un groupe d'hôte débute par une ligne de la forme '@group:adelay:gdelay'
-        - adelay est le nombre de minutes à laisser passer entre les hôtes du
-          groupe (par défaut 1)
-        - gdelay est le nombre de minutes à laisser passer après le traitement
-          du groupe (par défaut 15)
-        Les autres lignes sont des hôtes sur lequels planifier l'opération, de
-        la forme 'host:cmd'
-        - host est un nom d'hôte pleinement qualifié, sur lequel il est possible
-          de se connecter par clé.
-        - cmd est une description de la commande à lancer pour effectuer
-          l'opération planifiée. Utiliser la syntaxe '<script' pour prendre le
-          contenu du fichier de script spécifié. Le script est copié dans un
-          fichier temporaire sur l'hôte, et se supprime après son
-          lancement. Sinon, la commande spécifiée est utilisée telle quelle. Si
-          cmd n'est pas spécifié, prendre la commande par défaut donnée par
-          ctline
-        Les lignes vides et commençant par '#' sont ignorées
-        La commande '@include:file' permet d'inclure un autre fichier
-
-    -d  Activer l'incrémentation automatique des heures de planification entre
-        chaque hôte. Ceci permet par exemple de planifier l'arrêt d'un certain
-        nombre de machines dans un ordre précis, en horaire décalé.
-        Cette option est activée par défaut si ctline==halt[@time]
-    -n  Désactiver l'incrémentation automatique des heures de planification.
-    --add ADELAY
-        Spécifier le nombre de minutes entre chaque hôte pour l'incrémentation
-        automatique des heures de planification. Par défaut, il y a 1 minute
-        entre chaque hôte.
-    --us undo-script
-        Spécifier le nom du script qui annule la planification. Utiliser ""
-        pour désactiver cette fonctionnalité.
-    --fake
-        Afficher simplement les modifications qui doivent être effectuées.
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-udir: gérer les variables de répertoire
-
-USAGE
-    udir [options] [dir [name=value...]]
-
-Par défaut, mettre à jour les variables du répertoire avec les définitions
-données. Attention! Les définitions sont insérées *telles quelles* dans le
-fichier. Par exemple, pour définir une variable qui contient des espaces,
-on pourra faire:
-    udir /path/to/dir 'var="value with spaces"'
-pour définir un tableau:
-    udir /path/to/dir 'array=(first second)'
-
-OPTIONS
-    -i, --show-desc
-    -n, --show-note
-        Afficher la description du répertoire. C'est l'action par défaut si ce
-        script est lancé *sans argument*
-    -d, --dump
-        Afficher toutes les variables définies pour le répertoire 'dir'.
-    -x, --eval 'CMDS;...'
-        Exécuter les commandes dans le contexte des variables définies pour le
-        répertoire.
-    -e, --edit
-        Editer les variables du répertoire
-    --local-vars
-        Avec -d, ajouter des directives 'local' aux définitions de variables
-    -A, --all-parents
-        Avec -d et -x, considérer les variables de tous les répertoires parents
-        jusqu'à la racine. Pour ne considérer que les variables du répertoire
-        spécifié (par défaut), utiliser --local-only
-    --help-vars
-        Afficher une descriptions des variables spécifiques aux outils de nutools
-}}}
-
-
-
{{{
-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).
-}}}
-
-
-
{{{
-uenv: Mettre à jour la configuration de l'environnement
-
-USAGE
-    uenv [-u [projdirs...]]
-
-Cette commande met à jour l'ordre de chargement des fichiers de configuration
-dans ~/etc/{profile.d,bashrc.d}. Elle est donc utile si ces fichiers ont été
-modifiés manuellement, ou si un fichier a été ajouté manuellement.
-
-OPTIONS
-    HOME=/path/to/homedir
-        Spécifier le chemin vers ~
-        Cette option doit être placée avant les valeurs projdirs.
-    -u, --update
-        Installer ou mettre à jour les fichiers de profil des projets spécifiés:
-        Les fichiers ~/.profile, ~/.bash_profile et ~/.bashrc sont vérifiés et
-        corriger automatiquement pour inclure les fichiers de nutools.
-        Ensuite, les fichiers de profil sont copié dans les répertoires
-        ~/etc/{profile.d,bashrc.d,default}
-        Les projets spécifiés *doivent* être configurés avec uinst -C, et
-        définir la valeur install_profiles=true dans leur fichier .udir
-        Si aucun projet n'est spécifié, prendre les fichiers de profil de
-        nutools.
-    -l, --local-profiles
-        Avec l'option -u, installer les profils locaux comme tels. Pour les
-        fichiers de profil qui sont indiqués comme non partagés, les copier dans
-        des répertoires spécifiques de la forme {profile,bashrc}.HOSTNAME.d et
-        default.HOSTNAME
-    -s, --shared-profiles
-        Installer les profils locaux comme des profils partagés. C'est l'option
-        par défaut.
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-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
-}}}
-
-
-
{{{
-uinc.py: Plier/déplier des inclusions dans un fichier
-
-USAGE
-    uinc.py [[options] dest...]
-
-OPTIONS
-    -f  Plier les inclusions
-    -u  Déplier les inclusions (par défaut)
-    -@  Forcer le caractère '@' pour le pliage/dépliage
-    -*  Forcer le caractère '*' pour le pliage/dépliage
-    --auto
-        Activer la recherche automatique de paramètres (par défaut)
-    --noauto
-        Désactiver la recherche automatique de paramètres
-    -I SPEC
-        Spécifier des fichiers à inclure dans les répertoires spécifiés
-    -X SPEC
-        Spécifier des fichiers à exclure dans les répertoires spécifiés
-    --refdir REFDIR
-        Spécifier le répertoire de référence. Soit un répertoire DEST spécifié
-        dans les arguments. Si un fichier à inclure *n'est pas* un fils du
-        répertoire DEST, l'emplacement effectif du fichier est calculé en
-        faisant comme si DEST==REFDIR.
-        Par exemple, soit DEST=/dest/path et REFDIR=/refdir/path. Si le fichier
-        /dest/path/file inclue le fichier ../inc, alors c'est le fichier
-        /refdir/inc qui est considéré.
-        Ceci permet de traiter les inclusions dans une copie temporaire d'un
-        répertoire, dans le cas où les fichier font référence à d'autres
-        fichiers situés relativement à l'emplacement original.
-
-Les spécifications de fichiers sont de types glob: ils peuvent contenir les
-wildcards * et ?. Ils supportent en plus la chaine '**' qui signifie n'importe
-quelle profondeur de répertoire. 'dir/' est équivalent à 'dir/**' et signifie
-tous les fichiers situés dans l'arborescence à partir de dir.
-
-La variable UINCPATH contient une liste de répertoires qui sont consultés pour
-trouver les fichiers à inclure.
-}}}
-
-
-
{{{
-uinc.py: Plier/déplier des inclusions dans un fichier
-
-USAGE
-    uinc.py [[options] dest...]
-
-OPTIONS
-    -f  Plier les inclusions
-    -u  Déplier les inclusions (par défaut)
-    -@  Forcer le caractère '@' pour le pliage/dépliage
-    -*  Forcer le caractère '*' pour le pliage/dépliage
-    --auto
-        Activer la recherche automatique de paramètres (par défaut)
-    --noauto
-        Désactiver la recherche automatique de paramètres
-    -I SPEC
-        Spécifier des fichiers à inclure dans les répertoires spécifiés
-    -X SPEC
-        Spécifier des fichiers à exclure dans les répertoires spécifiés
-    --refdir REFDIR
-        Spécifier le répertoire de référence. Soit un répertoire DEST spécifié
-        dans les arguments. Si un fichier à inclure *n'est pas* un fils du
-        répertoire DEST, l'emplacement effectif du fichier est calculé en
-        faisant comme si DEST==REFDIR.
-        Par exemple, soit DEST=/dest/path et REFDIR=/refdir/path. Si le fichier
-        /dest/path/file inclue le fichier ../inc, alors c'est le fichier
-        /refdir/inc qui est considéré.
-        Ceci permet de traiter les inclusions dans une copie temporaire d'un
-        répertoire, dans le cas où les fichier font référence à d'autres
-        fichiers situés relativement à l'emplacement original.
-
-Les spécifications de fichiers sont de types glob: ils peuvent contenir les
-wildcards * et ?. Ils supportent en plus la chaine '**' qui signifie n'importe
-quelle profondeur de répertoire. 'dir/' est équivalent à 'dir/**' et signifie
-tous les fichiers situés dans l'arborescence à partir de dir.
-
-La variable UINCPATH contient une liste de répertoires qui sont consultés pour
-trouver les fichiers à inclure.
-}}}
-
-
-
{{{
-uinst.sh: Déployer en local un fichier, une archive, ou un répertoire
-
-USAGE
-    uinst.sh [options] <file|archive|dir>
-
-OPTIONS
-    var=value
-        Spécifier la valeur d'une variable ou d'un préfixe, plutôt que de
-        laisser uprefix l'autodétecter. Utiliser 'uprefix -l' pour avoir une
-        liste de préfixes valides. Utiliser 'udir --help-vars' pour avoir une
-        liste de variables valides pour uinst.sh.
-    -d /path/to/destdir
-        Spécifier le répertoire destination, exactement comme si la valeur
-        destdir avait été spécifiée, i.e destdir="/path/to/destdir"
-    -h, --host [user@]host
-        Avec la méthode de déploiement uinst:rsync, permettre de spécifier un
-        hôte différent. Cette option est ignorée pour les autres méthodes de
-        déploiement. Si host vaut localhost, un déploiement local avec ssh est
-        effectué. Si host vaut '.', un déploiement local *sans passer par ssh*
-        est effectué, comme si seul le chemin avait été spécifié.
-        Cette option initialise la valeur destdir_override_userhost
-    -S, --ssh ssh
-        Avec la méthode de déploiement uinst:rsync, spécifier le programme à
-        utiliser pour la connection par ssh. Cette option initialise la valeur
-        destdir_ssh
-    --force-remote
-        Avec la méthode de déploiement uinst:rsync, si un hôte est spécifié dans
-        la valeur de destdir, forcer le déploiement distant avec ssh+rsync, même
-        si l'hôte et l'utilisateur correspondent aux valeurs courantes. Cette
-        option initialise la valeur destdir_force_remote
-    -a, --auto
-        Si la source n'est pas spécifiée, déterminer le répertoire à déployer
-        automatiquement (c'est la valeur par défaut)
-    --no-auto
-        Ne pas déterminer automatiquement le répertoire à déployer.
-    --prefix
-        Corriger les chemins srcdir et destdir qui commencent par des préfixes
-        valides (c'est la valeur par défaut). Utiliser 'uprefix -l' pour avoir
-        une liste de préfixes valides
-    --no-prefix
-        Ne jamais corriger un chemin.
-    --include-vcs
-        Inclure les fichiers de VCS dans les fichiers copiés. Par défaut, les
-        fichiers de VCS sont exclus.
-    -l, --local-profiles
-        Installer les profils locaux comme tels
-    --shared-profiles
-        Installer les profils locaux comme des profils partagés. C'est la valeur
-        par défaut pour compatibilité.
-    -C  Configurer un répertoire pour le déploiement avec uinst
-        Ajouter l'option --force pour forcer la reconfiguration
-}}}
-
-
-
{{{
-uinst: Déployer en local un fichier, une archive, ou un répertoire
-
-USAGE
-    uinst [options] <file|archive|dir>
-
-OPTIONS
-    var=value
-        Spécifier la valeur d'une variable ou d'un préfixe, plutôt que de
-        laisser uprefix l'autodétecter. Utiliser 'uprefix -l' pour avoir une
-        liste de préfixes valides. Utiliser 'udir --help-vars' pour avoir une
-        liste de variables valides pour uinst.
-    -d /path/to/destdir
-        Spécifier le répertoire destination, exactement comme si la valeur
-        destdir avait été spécifiée, i.e destdir="/path/to/destdir"
-    -h, --host [user@]host
-        Avec la méthode de déploiement uinst:rsync, permettre de spécifier un
-        hôte différent. Cette option est ignorée pour les autres méthodes de
-        déploiement. Si host vaut localhost, un déploiement local avec ssh est
-        effectué. Si host vaut '.', un déploiement local *sans passer par ssh*
-        est effectué, comme si seul le chemin avait été spécifié.
-        Cette option initialise la valeur destdir_override_userhost
-    -S, --ssh ssh
-        Avec la méthode de déploiement uinst:rsync, spécifier le programme à
-        utiliser pour la connection par ssh. Cette option initialise la valeur
-        destdir_ssh
-    --force-remote
-        Avec la méthode de déploiement uinst:rsync, si un hôte est spécifié dans
-        la valeur de destdir, forcer le déploiement distant avec ssh+rsync, même
-        si l'hôte et l'utilisateur correspondent aux valeurs courantes. Cette
-        option initialise la valeur destdir_force_remote
-    -a, --auto
-        Si la source n'est pas spécifiée, déterminer le répertoire à déployer
-        automatiquement (c'est la valeur par défaut)
-    --no-auto
-        Ne pas déterminer automatiquement le répertoire à déployer.
-    --prefix
-        Corriger les chemins srcdir et destdir qui commencent par des préfixes
-        valides (c'est la valeur par défaut). Utiliser 'uprefix -l' pour avoir
-        une liste de préfixes valides
-    --no-prefix
-        Ne jamais corriger un chemin.
-    --include-vcs
-        Inclure les fichiers de VCS dans les fichiers copiés. Par défaut, les
-        fichiers de VCS sont exclus.
-    -l, --local-profiles
-        Installer les profils locaux comme tels
-    --shared-profiles
-        Installer les profils locaux comme des profils partagés. C'est la valeur
-        par défaut pour compatibilité.
-    -C  Configurer un répertoire pour le déploiement avec uinst
-        Ajouter l'option --force pour forcer la reconfiguration
-}}}
-
-
-
{{{
-ujava: Lancer un script après avoir sélectionné une version de java
-
-USAGE
-    ujava [options] version [args...]
-
-OPTIONS
-    -b, --bits 32|64|auto
-    --32
-    --64
-        Sélectionner une version 32 ou 64 bits de java
-    -e, --exact
-        Sélectionner la version *exacte* de java demandée, au lieu de la version
-        minimum correspondant à la version demandée.
-        Si la version requise de java n'est pas trouvée, retourner avec le code
-        d'erreur 254.
-
-La version de java attendue peut-être exprimée de l'une des façons suivantes:
-1.4 1.4+ 1.5 1.5+ 1.6 1.6+ 1.7 1.7+
-Si args n'est pas spécifié, un shell est lancé dans lequel les variables
-JAVA_HOME, JAVA, JAVAC et PATH sont mis à jour.
-}}}
-
-
-
{{{
-uldap: Shell pour accéder à un serveur ldap
-
-USAGE
-    uldap [options]
-
-OPTIONS
-    -C profile
-        Sélectionner un profil de connexion. Par défaut, si l'option -H n'est
-        pas spécifiée, le premier profil est sélectionné.
-    -x  Ne pas tenter de faire une connexion sur le profil par défaut si aucun
-        profil n'est sélectionné.
-    -f script
-        Lire les commandes depuis le script spécifié.
-    -n  Avec un script donné en ligne de commande ou lu depuis un fichier, ne pas
-        ajouter automatiquement la commande print à la fin
-    -i  Si un script est spécifié, passer en mode interactif après l'exécution
-        du script.
-    -e  Forcer l'arrêt du script si une erreur se produit. C'est l'option par
-        défaut pour un script spécifié avec -f.
-    -l input.ldif
-        Charger le fichier input.ldif comme espace de travail initial
-    -H ldapuri
-    -D binddn
-    -w password
-    -b searchbase
-    -v var=value
-
-COMMANDES
-    $ cmd
-        Passer directement une commande au shell.
-    set [options] [var=value...]
-        Changer des options ou des variables. set sans argument affiche la liste
-        des variables définies.
-    [set] plain
-        Passer en mode 'plain': indiquer que l'espace de travail contient des
-        données brutes. Les pré-traitements et post-traitements (uncut_on_load,
-        decode_on_load, encode_on_save, cut_on_save) ne sont pas appliqués sur
-        cet espace de travail
-    [set] ldif
-        Passer en mode 'ldif': indiquer que l'espace de travail contient des
-        données ldif. Les pré-traitements et post-traitements sont appliqués
-        normalement sur cet espace de travail
-    [set] append
-        Pour certaines opérations, spécifier si le résultat de la *prochaine*
-        opération remplace le contenu de l'espace de travail courant (par
-        défaut), ou si le résultat est ajouté à la fin.
-    last
-        Afficher en mode édition la dernière commande. Cette commande n'est
-        fonctionnelle qu'avec une version de bash >=4.x
-    profile name
-        Choisir le profil 'name'. Equivalent à 'set profile=name'. Sans
-        argument, afficher la liste des profils valides.
-    auth anonymous|binddn [password]
-        Spécifier le compte à utiliser pour se connecter. Equivalent à
-        'set binddn=binddn; set password=password'
-    clear [-k]
-        Vider l'espace de travail et passer en mode 'plain'.
-        Avec l'option -k, supprimer aussi tout l'historique d'annulation.
-    load [-k] input
-        Charger un fichier dans l'espace de travail. Si l'extension du fichier
-        est .ldif, passer en mode 'ldif'
-        En mode append, rajouter le contenu du fichier à l'espace de travail,
-        puis repasser en mode replace.
-        Le code de retour est 0 si le fichier a été chargé, 1 sinon.
-    save [-a] output
-        Sauvegarder l'espace de travail dans un fichier.
-        Avec l'option -a, rajouter au fichier au lieu de l'écraser
-    print
-        Afficher l'espace de travail
-    alias a=rdn...
-        Définir un alias pour la commande cd. 'a' est l'alias, 'rdn' est le dn
-        correspondant, exprimé par rapport à $suffix. Sans argument, afficher
-        la liste des aliases définis.
-    cd rdn
-        Changer searchbase. Par défaut, il s'agit d'un rdn relatif à $searchbase
-        - Certains aliases sont supportés: .. pour l'objet parent, ~ pour
-          $suffix, / pour la racine. 'cd' sans argument équivaut à 'cd ~'
-        - Si le dn commence par '~/', il s'agit d'un rdn relatif à $suffix.
-        - Si le dn commence par /, searchbase reçoit la valeur rdn sans
-          modifications (sauf bien sûr enlever le '/' de tête si nécessaire). Il
-          faut alors que ce soit un dn absolu.
-    ls [-b searchbase] [filter [attrs...]]
-    search [-b searchbase] [filter [attrs...]]
-        Utiliser ldapsearch pour faire la recherche, et copier le résultat dans
-        l'espace de travail. 'ls' est équivalent à 'search -s one'. Si ce n'est
-        pas déjà le cas, passer en mode 'ldif'.
-        L'option -b prend une valeur avec la même syntaxe que la commande cd,
-        sauf que les alias ne sont pas supportés. En particulier, la valeur est
-        relative au $searchbase courant. Pour faire une recherche par rapport à
-        $suffix, il faut utiliser la syntaxe ~/searchbase.
-        En mode append, rajouter le résultat de la recherche à l'espace de
-        travail, puis repasser en mode replace.
-        Le code de retour est 1 si aucun enregistrement n'a été trouvé, sinon
-        le code de retour est celui de la commande ldapsearch.
-    cut Couper les lignes trop longues. Cette action est en principe effectuée
-        automatiquement lors de la sauvegarde. Il n'est pas conseillé
-        d'appliquer des méthodes de transformation après avoir utilisé cette
-        action.
-    uncut
-        Fusionner les lignes coupées. Cette action est en principe effectuée
-        automatiquement lors du chargement ou après la recherche.
-    encode [attrs...]
-        Encoder en base64 les valeurs des attributs mentionnés.
-    decode [attrs...]
-        Décoder les valeurs des attributs mentionnés si nécessaire (c'est à dire
-        s'ils sont encodés en base64)
-    keepattr attrs...
-        Garder uniquement les lignes des attributs mentionnés. Ensuite,
-        supprimer les objets ayant uniquement la ligne dn: (en d'autres termes,
-        keepattr sans argument supprime *tout* l'espace de travail)
-    keepval attr patterns...
-        Pour l'attribut attr, garder uniquement les lignes pour lesquelles les
-        valeurs correspondent aux expressions régulières. Les autres attributs
-        ne sont pas modifiés. Ensuite, supprimer les objets ayant uniquement la
-        ligne dn:
-    exclude attrs...
-        Supprimer les lignes des attributs mentionnés. Ensuite, supprimer les
-        objets ayant uniquement la ligne dn:
-    excludeval attr patterns...
-        Pour l'attribut attr, supprimer les lignes pour lesquelles les
-        valeurs correspondent aux expressions régulières. Les autres attributs
-        ne sont pas modifiés. Ensuite, supprimer les objets ayant uniquement la
-        ligne dn:
-    keepvalentry attr patterns...
-        Pour l'attribut attr, vérifier si *au moins une* valeur correspond à
-        l'une des expressions régulières. Si c'est le cas, garder l'entrée
-        entière, sinon supprimer l'entrée.
-    excludevalentry attr patterns...
-        Pour l'attribut attr, vérifier si *aucune* des valeurs ne correspond à
-        l'une des expressions régulières. Si c'est le cas, garder l'entrée
-        entière, sinon supprimer l'entrée.
-    setval attr values...
-        Remplacer toutes les valeurs de l'attribut attr par les valeurs
-        spécifiées.
-    addval attr values...
-        Ajouter un nouvel attribut avec les valeurs spécifiées. Si l'attribut
-        existe déjà, les nouvelles valeurs sont ajoutées à la fin.
-    sed args
-        Modifier l'espace de travail avec le résultat de la commande sed.
-        note: aucun argument n'est filtré, mais il ne faut pas utiliser les
-        options de sed qui provoquent la modification en place du fichier,
-        comme par exemple l'option -i
-    awk args
-        Modifier l'espace de travail avec le résultat de la commande awk.
-    grep args
-        Modifier l'espace de travail avec le résultat de la commande grep.
-    format [options] attrs...
-        Formater l'espace de travail en données tabulaires, et passer en mode
-        'plain'.
-        --show-headers
-            Afficher les en-têtes
-        -F FSEP
-            Spécifier le séparateur pour les attributs. Par défaut, il s'agit du
-            caractère de tabulation.
-        -R VSEP
-            Spécifier le séparateur pour les valeurs des attributs. Par défaut, il
-            s'agit du point-virgule ';'
-        -e  Retourner les valeurs comme des variables shell. Les options -F et -R
-            sont ignorées. Les attributs multivalués sont écrits sous forme de
-            tableaux. Par exemple:
-                attributes=('mail' 'givenName')
-                index=0
-                mail='user@domain.fr'
-                givenName=('peter' 'gabriel')
-        --bc
-            Dans le mode -e, spécifier une commande à insérer avant le premier
-            enregistrement. Quand cette commande est lancée, index==-1
-        -c  Dans le mode -e, spécifier une commande à insérer après chaque
-            enregistrement
-        --ec
-            Dans le mode -e, spécifier une commande à insérer après le dernier
-            enregistrement
-    sort [args]
-        Modifier l'espace de travail avec le résultat de la commande sort.
-    edit
-        Lancer un éditeur pour modifier l'espace de travail.
-    diff [options]
-        Afficher les différences entre l'espace de travail et la version
-        précédente
-    ifok cmd
-    iferror cmd
-        Si le dernier code de retour est 0 (resp. !=0), lancer la commande cmd
-    skip n
-        Sauter les n prochaines commandes. A utiliser avec ifok et iferror
-    undo
-        Annuler la dernière modification effectuée sur l'espace de travail
-
-Les directives suivantes prennent le contenu de l'espace de travail, et le
-transforment en une suite de commandes de modifications pour ldapmodify:
-
-    A   Créer un objet de toutes pièces avec les attributs donnés et leurs
-        valeurs.
-    a   Ajouter les valeurs spécifiée à l'attribut
-    r   Remplacer les valeurs de l'attribut par celles spécifiées
-    d   Supprimer les valeurs spécifiées de l'attribut
-    D   Supprimer l'attribut
-    delentry
-        Supprimer l'objet
-    ldapmodify
-        Utiliser ldapmodify pour modifier les objets sur le serveur. Il faut
-        utiliser au préalable l'une des méthodes de transformation parmi A, a,
-        r, d, D, delentry.
-        Le code de retour est celui de la commande ldapmodify.
-    ldapadd
-        Utiliser ldapadd pour créer les objets situés dans l'espace de travail.
-        Le code de retour est celui de la commande ldapadd.
-    ldapdelete
-        Utiliser ldapdelete pour supprimer la liste des dns situés dans l'espace
-        de travail.
-        Le code de retour est celui de la commande ldapdelete.
-
-Notes:
-- les expressions régulières sont celles reconnues par awk.
-- pour spécifier plusieurs actions sur une même ligne, les séparer par //
-- le code de retour est 0 si ok, 255 si une erreur s'est produite (erreur de
-  syntaxe, de connexion, de lecture/écriture de fichier, etc.). sinon, les
-  opérations ldap{search,modify,delete,add} ont leur code de retour respectifs
-}}}
-
-
-
!Liste des librairies de ulib
-* [[ulib/apache]]
-* [[ulib/apache.tools]]
-* [[ulib/auto]]
-* [[ulib/awk]]
-* [[ulib/base]]
-* [[ulib/base.args]]
-* [[ulib/base.array]]
-* [[ulib/base.bool]]
-* [[ulib/base.compat]]
-* [[ulib/base.core]]
-* [[ulib/base.init]]
-* [[ulib/base.num]]
-* [[ulib/base.quote]]
-* [[ulib/base.split]]
-* [[ulib/base.string]]
-* [[ulib/base.tools]]
-* [[ulib/base.ulib]]
-* [[ulib/bash]]
-* [[ulib/cgi]]
-* [[ulib/cgisupport]]
-* [[ulib/compat]]
-* [[ulib/conf]]
-* [[ulib/crontab]]
-* [[ulib/debian]]
-* [[ulib/DEFAULTS]]
-* [[ulib/install]]
-* [[ulib/ipcalc]]
-* [[ulib/java]]
-* [[ulib/javaproperties]]
-* [[ulib/json]]
-* [[ulib/ldap]]
-* [[ulib/ldif]]
-* [[ulib/legacy]]
-* [[ulib/macosx]]
-* [[ulib/mkcrypt]]
-* [[ulib/modeline]]
-* [[ulib/network-manager-service]]
-* [[ulib/password]]
-* [[ulib/prefixes]]
-* [[ulib/PREFIXES-DEFAULTS]]
-* [[ulib/pretty]]
-* [[ulib/ptools]]
-* [[ulib/redhat]]
-* [[ulib/runs]]
-* [[ulib/runsmod]]
-* [[ulib/runsmod.defaults]]
-* [[ulib/semver]]
-* [[ulib/service]]
-* [[ulib/sysinfos]]
-* [[ulib/template]]
-* [[ulib/tiddlywiki]]
-* [[ulib/udir]]
-* [[ulib/uenv]]
-* [[ulib/uenv_update]]
-* [[ulib/uinc]]
-* [[ulib/uinst]]
-* [[ulib/ulib]]
-* [[ulib/ulibsh]]
-* [[ulib/vcs]]
-* [[ulib/virsh]]
-* [[ulib/webobjects]]
-* [[ulib/woinst]]
-* [[ulib/wondermonitor]]
-* [[ulib/wosign]]
-* [[ulib/wotaskd]]
-
-
-

-
-
-
!! {{{compute_all_prefixes}}}
-!! {{{recompute_all_prefixes}}}
-
-
-
!! {{{apache_resolvecert}}}
-{{{
-Calculer l'emplacement des certificats correspondant aux arguments $1 et
-$2 (qui correspondent aux options --conf et --dir de apache_addcert()),
-puis initialiser les variables $3(=cert), $4(=key) et $5(=ca)
-}}}
-!! {{{apache_addcert}}}
-!! {{{apache_autoconf}}}
-!! {{{apache_autoconf_localhosts}}}
-
-
-
!! {{{get_default_apachebin_prefix}}}
-!! {{{get_default_apacheversion_prefix}}}
-!! {{{get_default_apachectl_prefix}}}
-!! {{{get_default_apachelogdir_prefix}}}
-!! {{{get_default_apachesslcertsdir_prefix}}}
-!! {{{get_default_apachesslkeysdir_prefix}}}
-!! {{{get_default_apacheconfdir_prefix}}}
-!! {{{get_default_apacheconf_prefix}}}
-!! {{{get_default_apacheavsitesdir_prefix}}}
-!! {{{get_default_apachesitesdir_prefix}}}
-!! {{{get_default_htdocsdir_prefix}}}
-!! {{{get_default_cgibindir_prefix}}}
-!! {{{compute_apache_prefixes}}}
-!! {{{recompute_apache_prefixes}}}
-!! {{{get_APACHEBIN_prefix}}}
-!! {{{get_APACHEVERSION_prefix}}}
-!! {{{get_APACHECTL_prefix}}}
-!! {{{get_APACHELOGDIR_prefix}}}
-!! {{{get_APACHESSLCERTSDIR_prefix}}}
-!! {{{get_APACHESSLKEYSDIR_prefix}}}
-!! {{{get_APACHECONFDIR_prefix}}}
-!! {{{get_APACHECONF_prefix}}}
-!! {{{get_APACHEAVSITESDIR_prefix}}}
-!! {{{get_APACHESITESDIR_prefix}}}
-!! {{{get_HTDOCSDIR_prefix}}}
-!! {{{get_CGIBINDIR_prefix}}}
-
-
-

-
-
-
!! {{{parseheaders}}}
-!! {{{printheaders}}}
-!! {{{resetheaders}}}
-!! {{{copyall}}}
-!! {{{lawkcsv}}}
-!! {{{cawkcsv}}}
-!! {{{awkcsv}}}
-!! {{{lgrepcsv}}}
-!! {{{cgrepcsv}}}
-!! {{{grepcsv}}}
-!! {{{lawkfsv2csv}}}
-!! {{{cawkfsv2csv}}}
-!! {{{awkfsv2csv}}}
-!! {{{lmergecsv}}}
-{{{
-Fusionner sur la sortie standard les deux fichiers csv $1 et $2. La clé du
-fichier $1 est spécifiée par l'option --lkey et vaut 1 par défaut. La clé
-du fichier $2 est spécifiée par l'option --rkey et vaut 1 par défaut. Les
-valeurs des clés ne doivent pas faire plus de 64 caractères de long.
-}}}
-!! {{{readleft}}}
-!! {{{readright}}}
-!! {{{right2left}}}
-!! {{{cmergecsv}}}
-!! {{{mergecsv}}}
-!! {{{lsortcsv}}}
-{{{
-Trier le fichier csv $1. La clé du tri est spécifiée par l'option -k et
-vaut 1 par défaut. Les valeurs des clés ne doivent pas faire plus de 64
-caractères de long.
-}}}
-!! {{{csortcsv}}}
-!! {{{sortcsv}}}
-!! {{{ldumpcsv}}}
-!! {{{cdumpcsv}}}
-!! {{{dumpcsv}}}
-!! {{{lprintcsv}}}
-!! {{{cprintcsv}}}
-!! {{{printcsv}}}
-
-
-
!! {{{parse_opts}}}
-{{{
-Analyser des arguments. Cette fonction doit être appelée avec une description
-des options à analyser, suivie des arguments proprement dits. En fonction des
-options rencontrées, certaines variables sont mises à jour.
-Les arguments de cette fonction sont donc de la forme 'optdescs -- args'
-}}}
-!! {{{parse_args_check}}}
-{{{
-Simplifier l'utilisation de parse_opts(). En entrée, le tableau args doit être
-initialisé avec la liste des options. En sortie, ce tableau contient la liste
-des arguments restant sur la ligne de commande. En cas d'erreur, retourner 1.
-Exemple d'utilisation:
-args=(...)
-parse_args_check "$@" || return; set -- "${args[@]}"
-}}}
-!! {{{parse_args}}}
-{{{
-Simplifier l'utilisation de parse_opts(). En entrée, le tableau args doit être
-initialisé avec la liste des options. En sortie, ce tableau contient la liste
-des arguments restant sur la ligne de commande. En cas d'erreur, quitter le
-script avec die()
-Exemple d'utilisation:
-args=(...)
-parse_args_check "$@"; set -- "${args[@]}"
-}}}
-!! {{{genparse}}}
-{{{
-Afficher une ligne de commande à évaluer pour simplifier l'utilisation de
-parse_opts(). Une fonction display_help() par défaut est définie et les
-options appropriées de parse_opts sont utilisées pour reconnaître les options
-spécifiées par les arguments.
-Cette fonction peut être utilisée de cette manière:
-HELP_DESC=...
-HELP_ARG_DESC=... # pour chaque arg
-eval "$(genparse [args...])"
-D'autres variables peuvent être définies: HELP_USAGE, HELP_OPTIONS,
-HELP_ARG_OPTION. Consulter le source pour connaitre leur utilisation
-Les arguments de cette fonction sont de la forme 'sansarg' pour une option
-simple qui ne prend pas d'argument ou 'avecarg=[default-value]' pour une
-option qui prend un argument. Les options générées sont des options
-longues. En l'occurence, les options générées sont respectivement '--sansarg'
-et '--avecarg:'
-Les variables et les options sont toujours en minuscule. Pour les variables,
-le caractère '-' est remplacé par '_'. Si une option contient une lettre en
-majuscule, l'option courte correspondante à cette lettre sera aussi reconnue.
-Par exemple, la commande suivante:
-genparse Force enCoding=utf-8 input= long-Option=
-affichera ceci:
-function display_help() {
-[ -n "$HELP_USAGE" ] || HELP_USAGE="USAGE
-$scriptname [options]"
-[ -n "$HELP_OPTIONS" ] || HELP_OPTIONS="OPTIONS
-${HELP_FORCE_OPTION:-    -f, --force${HELP_FORCE_DESC:+
-$HELP_FORCE_DESC}}
-}}}
-
-
-

-
-
-
!! {{{is_yes}}}
-{{{
-retourner vrai si $1 est une valeur "oui"
-}}}
-!! {{{is_no}}}
-{{{
-retourner vrai si $1 est une valeur "non"
-}}}
-!! {{{yesval}}}
-{{{
-normaliser une valeur vraie: si $1 est une valeur "oui", afficher 1, sinon
-afficher une chaine vide
-}}}
-!! {{{setb}}}
-{{{
-Lancer la commande $2..@ en supprimant la sortie standard. Si la commande
-retourne vrai, assigner la valeur 1 à la variable $1. Sinon, lui assigner la
-valeur ""
-note: en principe, la syntaxe est 'setb var cmd args...'. cependant, la
-syntaxe 'setb var=cmd args...' est supportée aussi
-}}}
-!! {{{evalb}}}
-{{{
-Lancer la commande $@ avec evalx() en supprimant la sortie standard. Si la
-commande retourne vrai, afficher 1. Sinon, afficher ""
-}}}
-!! {{{setxb}}}
-{{{
-équivalent à setx $1 evalb $2..@
-}}}
-
-
-
!! {{{setx2}}}
-!! {{{rawecho}}}
-!! {{{rawecho_}}}
-!! {{{quote_arg}}}
-!! {{{quoted_arg}}}
-!! {{{quoted_args}}}
-!! {{{set_var}}}
-!! {{{set_var_cmd}}}
-!! {{{set_var_literal}}}
-!! {{{quote_awk}}}
-!! {{{quoted_awk}}}
-!! {{{quote_seds}}}
-!! {{{quote_form}}}
-!! {{{quoted_form}}}
-
-
-
!! {{{echo_}}}
-{{{
-afficher la valeur $* sans passer à la ligne
-}}}
-!! {{{recho}}}
-{{{
-afficher une valeur brute. contrairement à la commande echo, ne reconnaitre
-aucune option (i.e. -e, -E, -n ne sont pas signifiants)
-}}}
-!! {{{recho_}}}
-{{{
-afficher une valeur brute, sans passer à la ligne. contrairement à la commande
-echo, ne reconnaitre aucune option (i.e. -e, -E, -n ne sont pas signifiants)
-}}}
-!! {{{should_quote}}}
-{{{
-Tester si la chaine $* doit être mise entre quotes
-}}}
-!! {{{qval}}}
-{{{
-Afficher la chaine $* quotée avec "
-}}}
-!! {{{qvalm}}}
-{{{
-Afficher la chaine $* quotée si nécessaire avec "
-}}}
-!! {{{qvalr}}}
-{{{
-Afficher la chaine $* quotée si nécessaire avec ", sauf si elle est vide
-}}}
-!! {{{qvals}}}
-{{{
-Afficher chaque argument de cette fonction quotée le cas échéant avec "
-Chaque valeur est séparée par un espace.
-}}}
-!! {{{qwc}}}
-{{{
-Dans la chaine $*, remplacer \ par \\, " par \", $ par \$, ` par \`, puis
-quoter la chaine avec ", sauf les wildcards * et ?
-Cela permet de quoter une chaine permettant de glober des fichiers, e.g
-eval "ls $(qwc "$value")"
-Note: la protection de ! n'est pas effectuée, parce que le comportement du
-shell est incohérent entre le shell interactif et les scripts. Pour une
-version plus robuste, il est nécessaire d'utiliser un programme externe tel
-que sed ou awk
-}}}
-!! {{{qlines}}}
-{{{
-Traiter chaque ligne de l'entrée standard pour en faire des chaines quotées
-avec '
-}}}
-!! {{{setv}}}
-{{{
-initialiser la variable $1 avec la valeur $2*
-note: en principe, la syntaxe est 'setv var values...'. cependant, la
-syntaxe 'setv var=values...' est supportée aussi
-}}}
-!! {{{echo_setv}}}
-{{{
-Afficher la commande qui serait lancée par setv "$@"
-}}}
-!! {{{setx}}}
-{{{
-syntaxe 1: setx var cmd
-initialiser la variable $1 avec le résultat de la commande "$2..@"
-note: en principe, la syntaxe est 'setx var cmd args...'. cependant, la
-syntaxe 'setx var=cmd args...' est supportée aussi
-syntaxe 2: setx -a array cmd
-initialiser le tableau $1 avec le résultat de la commande "$2..@", chaque
-ligne du résultat étant un élément du tableau
-note: en principe, la syntaxe est 'setx -a array cmd args...'. cependant, la
-syntaxe 'setx -a array=cmd args...' est supportée aussi
-}}}
-!! {{{evalx}}}
-{{{
-Implémenter une syntaxe lisible et naturelle permettant d'enchainer des
-traitements sur une valeur. Par exemple, la commande
-evalx cmd1... // cmd2... // cmd3...
-affiche le résultat de la commande "$(cmd3 $(cmd2 $(cmd1)))"
-Retourner le dernier code d'erreur non nul, ou 0 si toutes les commandes se
-sont exécutées sans erreur.
-}}}
-!! {{{setxx}}}
-{{{
-équivalent à setx $1 evalx $2..@
-}}}
-!! {{{evalp}}}
-{{{
-Implémenter une syntaxe alternative permettant d'enchainer des traitements sur
-un flux de données. Par exemple, la commande
-evalp cmd1... // cmd2... // cmd3...
-affiche le résultat de la commande "$(cmd1 | cmd2 | cmd3)"
-Typiquement, cette fonction permet de faciliter la construction d'un
-enchainement de commandes par programme, ou de faciliter l'utilisation de la
-fonction setx() pour récupérer le résultat d'un enchainement. Dans les autres
-cas, il est plus simple et naturel d'écrire les enchainements avec la syntaxe
-de bash.
-}}}
-!! {{{setxp}}}
-{{{
-équivalent à setx $1 evalp $2..@
-}}}
-!! {{{testx}}}
-{{{
-Faire un test unaire avec la commande [ sur une valeur calculée avec evalx.
-Utiliser la syntaxe 'testx op cmds...' e.g.
-testx -z cmd1 // cmd2
-}}}
-!! {{{test2x}}}
-{{{
-Faire une test binaire avec la commande [ entre une valeur spécifiée et une
-valeur calculée avec evalx. Utiliser la syntaxe 'test2x value op cmds...' e.g.
-test2x value == cmd1 // cmd2
-}}}
-!! {{{testrx}}}
-{{{
-Faire une test binaire avec la commande [[ entre une valeur spécifiée et une
-valeur calculée avec evalx. Utiliser la syntaxe 'testrx value op cmds...' e.g.
-testrx value == cmd1 // cmd2
-}}}
-!! {{{testp}}}
-{{{
-Faire un test unaire avec la commande [ sur une valeur calculée avec evalp.
-Utiliser la syntaxe 'testp op cmds...' e.g.
-testp -z cmd1 // cmd2
-}}}
-!! {{{test2p}}}
-{{{
-Faire une test binaire avec la commande [ entre une valeur spécifiée et une
-valeur calculée avec evalp. Utiliser la syntaxe 'test2p value op cmds...' e.g.
-test2p value == cmd1 // cmd2
-}}}
-!! {{{testrp}}}
-{{{
-Faire une test binaire avec la commande [[ entre une valeur spécifiée et une
-valeur calculée avec evalp. Utiliser la syntaxe 'testrp value op cmds...' e.g.
-testrp value == cmd1 // cmd2
-}}}
-!! {{{err2out}}}
-{{{
-lancer la commande $@ en redirigeant la sortie d'erreur sur la sortie standard
-}}}
-
-
-

-
-
-
!! {{{isnum}}}
-{{{
-retourner vrai si $1 est une valeur numérique entière (positive ou négative)
-}}}
-!! {{{ispnum}}}
-{{{
-retourner vrai si $1 est une valeur numérique entière positive
-}}}
-!! {{{isrnum}}}
-{{{
-retourner vrai si $1 est une valeur numérique réelle (positive ou négative)
-le séparateur décimal peut être . ou ,
-}}}
-
-
-
!! {{{qawk}}}
-{{{
-Dans la chaine $*, remplacer \ par \\ et " par \" et afficher la chaine
-entourée de guillemets. Ceci est utile pour quoter des valeur à insérer dans
-un script awk
-}}}
-!! {{{qseds}}}
-{{{
-Quoter la chaine $*, qui doit être utilisée comme chaine de recherche ou de
-remplacement de grep, sed ou awk
-}}}
-!! {{{qform}}}
-{{{
-Dans la chaine $* qui est de la forme "name=value", remplacer dans name et
-dans value '%' par '%25', '+' par '%2B', '&' par '%26', '=' par '%3D', ' ' par
-'+'
-}}}
-
-
-
!! {{{splitfsep}}}
-{{{
-Découper $1 de la forme "first[SEPsecond]" entre first, qui est placé dans la
-variable $3(=first) et second, qui est placée dans la variable $4(=second). $2
-est la valeur SEP. Le découpage est faite sur la *première* occurence de SEP.
-}}}
-!! {{{splitfsep2}}}
-{{{
-Découper $1 de la forme "[firstSEP]second" entre first, qui est placé dans la
-variable $3(=first) et second, qui est placée dans la variable $4(=second). $2
-est la valeur SEP. Le découpage est faite sur la *première* occurence de SEP.
-}}}
-!! {{{splitlsep}}}
-{{{
-Découper $1 de la forme "first[SEPsecond]" entre first, qui est placé dans la
-variable $3(=first) et second, qui est placée dans la variable $4(=second). $2
-est la valeur SEP. Le découpage est faite sur la *dernière* occurence de SEP.
-}}}
-!! {{{splitlsep2}}}
-{{{
-Découper $1 de la forme "[firstSEP]second" entre first, qui est placé dans la
-variable $3(=first) et second, qui est placée dans la variable $4(=second). $2
-est la valeur SEP. Le découpage est faite sur la *dernière* occurence de SEP.
-}}}
-!! {{{splitvar}}}
-{{{
-Découper $1 de la forme name[=value] entre le nom, qui est placé dans la
-variable $2(=name) et la valeur, qui est placée dans la variable $3(=value)
-}}}
-!! {{{splitpath}}}
-{{{
-Découper $1 de la forme [dir/]name entre le répertoire, qui est placé dans la
-variable $2(=dir), et le nom du fichier, qui est placé dans la variable
-$3(=name)
-}}}
-!! {{{splitname}}}
-{{{
-Découper $1 de la forme basename[.ext] entre le nom de base du fichier, qui
-est placé dans la variable $2(=basename) et l'extension, qui est placée dans
-la variable $3(=ext)
-Attention, si $1 est un chemin, le résultat risque d'être faussé. Par exemple,
-'splitname a.b/c' ne donne pas le résultat escompté.
-}}}
-!! {{{splithost}}}
-{{{
-Découper $1 de la forme hostname[.domain] entre le nom d'hôte, qui est placé
-dans la variable $2(=hostname) et le domaine, qui est placée dans la variable
-$3(=domain)
-}}}
-!! {{{splituserhost}}}
-{{{
-Découper $1 de la forme [user@]host entre le nom de l'utilisateur, qui est placé
-dans la variable $2(=user) et le nom d'hôte, qui est placée dans la variable
-$3(=host)
-}}}
-!! {{{splitpair}}}
-{{{
-Découper $1 de la forme first[:second] entre la première valeur, qui est placé
-dans la variable $2(=src) et la deuxième valeur, qui est placée dans la variable
-$3(=dest)
-}}}
-!! {{{splitproxy}}}
-{{{
-Découper $1 de la forme http://[user:password@]host[:port]/ entre les valeurs
-$2(=host), $3(=port), $4(=user), $5(=password)
-}}}
-!! {{{spliturl}}}
-{{{
-Découper $1 de la forme scheme://[user:password@]host[:port]/path entre les
-valeurs $2(=scheme), $3(=user), $4(=password), $5(=host), $6(=port), $7(=path)
-}}}
-
-
-
!! {{{straddp}}}
-{{{
-ajouter le préfixe $1 à $2*
-}}}
-!! {{{strdelp}}}
-{{{
-enlever le préfixe $1 à $2*
-}}}
-!! {{{strdelp2}}}
-{{{
-enlever le préfixe $1 le plus long à $2*
-}}}
-!! {{{stradds}}}
-{{{
-ajouter le suffixe $1 à $2*
-}}}
-!! {{{strdels}}}
-{{{
-enlever le suffixe $1 à $2*
-}}}
-!! {{{strdels2}}}
-{{{
-enlever le suffixe le plus long $1 à $2*
-}}}
-!! {{{strlower}}}
-{{{
-afficher en minuscule la valeur $*
-}}}
-!! {{{strlower1}}}
-{{{
-afficher la valeur $* après avoir converti la première lettre en minuscule
-}}}
-!! {{{strlowers}}}
-{{{
-afficher les valeurs $1..* après avoir converti leur première lettre en
-minuscule
-}}}
-!! {{{strupper}}}
-{{{
-afficher en majuscule la valeur $*
-}}}
-!! {{{strupper1}}}
-{{{
-afficher la valeur $* après avoir converti la première lettre en majuscule
-}}}
-!! {{{struppers}}}
-{{{
-afficher les valeurs $1..* après avoir converti leur première lettre en
-majuscule
-}}}
-!! {{{strmid}}}
-{{{
-Afficher la plage $1 de la valeur $2*. La plage peut être d'une des formes
-'start', '[start]:length'. Si start est négatif, le compte est effectué à
-partir de la fin de la chaine. Si length est négatif, il est rajouté à la
-longueur de la chaine à partir de start
-}}}
-!! {{{strrepl}}}
-{{{
-Remplacer dans la valeur $3* le motif $1 par la chaine $2. $1 peut commencer
-par l'un des caractères /, #, % pour indiquer le type de recherche
-}}}
-!! {{{first_char}}}
-{{{
-retourner le premier caractère de la chaine $*
-}}}
-!! {{{last_char}}}
-{{{
-retourner le dernier caractère de la chaine $*
-}}}
-!! {{{first_chars}}}
-{{{
-retourner tous les caractères de la chaine $*, excepté le dernier
-}}}
-!! {{{last_chars}}}
-{{{
-retourner tous les caractères de la chaine $*, excepté le premier
-}}}
-!! {{{first_char_is}}}
-{{{
-Tester si le premier caractère de la chaine $1 est $2
-}}}
-!! {{{last_char_is}}}
-{{{
-Tester si le dernier caractère de la chaine $1 est $2
-}}}
-!! {{{beginswith}}}
-{{{
-Tester si la chaine $1 commence par le wildcard $2
-}}}
-!! {{{endswith}}}
-{{{
-Tester si la chaine $1 se termine par le wildcard $2
-}}}
-
-
-
!! {{{base_umove}}}
-{{{
-Outil de haut niveau pour déplacer un fichier ou un lien. Si c'est un lien qui
-est déplacé, la destination du lien est mise à jour si elle est relative.
-l'option '-d UPDATEDIR' permet de spécifier un répertoire dans lequel tous les
-liens qui pointent vers le fichier déplacé sont mis à jour si le déplacement
-du fichier se fait avec succès.
-}}}
-!! {{{base_udelete}}}
-{{{
-Outil de haut niveau pour supprimer un fichier ou un lien. Si on doit
-supprimer un fichier, et que l'option '-d UPDATEDIR' est spécifiée, et que des
-liens du répertoire UPDATEDIR pointent vers le fichier supprimé, ces liens
-sont supprimés aussi.
-}}}
-!! {{{base_ucopy}}}
-{{{
-Outil de haut niveau pour copier un fichier ou un lien. Si c'est un lien qui
-est copié, la destination du lien est mise à jour si elle est relative.
-}}}
-
-
-
!! {{{setyesval}}}
-{{{
-mettre la valeur normalisée de la valeur "oui" de $2 dans la variable $1
-}}}
-!! {{{normyesval}}}
-{{{
-remplacer la valeur de la variable $1 par la valeur normalisée de sa valeur "oui"
-Si $2 est non vide, prendre cette valeur plutôt que la valeur de la variable $1
-}}}
-!! {{{normyesvals}}}
-{{{
-remplacer les valeur des variables $1..* par les valeurs normalisées
-respectives de leur valeur "oui"
-}}}
-!! {{{quote_in}}}
-{{{
-Comme quote_arg pour une chaine lue sur stdin
-}}}
-!! {{{quote_sin}}}
-{{{
-Pour la chaine lue sur stdin, remplacer ' par '\''. Cela permet de protéger une
-chaine à mettre entre quotes
-}}}
-!! {{{quote_sarg}}}
-{{{
-Dans la chaine $1, remplacer ' par '\''. Cette fonction utilise quote_sin,
-puisque le shell a des difficultés à faire le rechercher/remplacer approprié
-}}}
-!! {{{quoted_sarg}}}
-{{{
-Dans la chaine $1, remplacer ' par '\'', et afficher la chaine entourée de
-quotes
-}}}
-!! {{{quoted_sargs}}}
-{{{
-Comme quoted_sarg, mais tous les arguments sont quotés et affichés entourés de
-quotes, ce qui permet de construire des arguments d'une ligne de commande
-}}}
-!! {{{set_array_cmd}}}
-{{{
-Afficher la commande permettant d'initialiser le tableau $1 avec les valeurs:
-soit du tableau $2, soit de $3..$n si $2=="@"
-S'il n'y a que l'argument $1, alors afficher la commande permettant de
-recréer le tableau $1
-}}}
-!! {{{set_array}}}
-{{{
-Soit $1 un tableau à créer. Si $2=="@", créer le tableau $1 avec les valeurs
-$3..$n. Sinon, créer le tableau $1 avec les valeurs du tableau $2.
-Cette fonction n'existe que comme un pendant de set_var(), mais le véritable
-intérêt est la fonction set_array_cmd(). cf array_copy() pour une version plus
-efficace de la copie de tableaux
-}}}
-!! {{{array_count}}}
-{{{
-retourner le nombre d'éléments du tableau $1
-}}}
-!! {{{array_isempty}}}
-{{{
-tester si le tableau $1 est vide
-}}}
-!! {{{array_new}}}
-{{{
-créer un tableau vide dont le nom est $1
-}}}
-!! {{{array_add}}}
-{{{
-ajouter les valeurs $2..@ au tableau dont le nom est $1
-}}}
-!! {{{array_ins}}}
-{{{
-insérer les valeurs $2..@ au début du tableau dont le nom est $1
-}}}
-!! {{{array_del}}}
-{{{
-supprimer *les* valeurs $2 du tableau dont le nom est $1
-}}}
-!! {{{array_addu}}}
-{{{
-ajouter la valeur $2 au tableau dont le nom est $1, si la valeur n'y est pas
-déjà. Retourner vrai si la valeur a été ajoutée
-}}}
-!! {{{array_set}}}
-!! {{{array_insu}}}
-{{{
-insérer la valeur $2 au début du tableau tableau dont le nom est $1, si la
-valeur n'y est pas déjà. Retourner vrai si la valeur a été ajoutée.
-}}}
-!! {{{array_fillrange}}}
-{{{
-Initialiser le tableau $1 avec les nombres de $2(=1) à $3(=10) avec un step de $4(=1)
-}}}
-!! {{{array_eq}}}
-{{{
-tester l'égalité des tableaux $1 et $2
-}}}
-!! {{{array_contains}}}
-{{{
-tester si le tableau dont le nom est $1 contient la valeur $2
-}}}
-!! {{{array_icontains}}}
-{{{
-tester si le tableau dont le nom est $1 contient la valeur $2, sans tenir
-compte de la casse
-}}}
-!! {{{array_find}}}
-{{{
-si le tableau $1 contient la valeur $2, retourner l'index de la valeur. Si le
-tableau $3 est spécifié, retourner la valeur à l'index dans ce tableau
-}}}
-!! {{{array_reverse}}}
-{{{
-Inverser l'ordre des élément du tableau $1
-}}}
-!! {{{array_replace}}}
-{{{
-dans le tableau $1, remplacer toutes les occurences de $2 par $3..*
-}}}
-!! {{{array_each}}}
-{{{
-Pour chacune des valeurs 'v' du tableau $1, appeler la fonction $2 avec les
-arguments '$v $3..$n'
-}}}
-!! {{{array_map}}}
-{{{
-Pour chacune des valeurs 'v' du tableau $1, appeler la fonction $2 avec les
-arguments '$v $3..$n', et remplacer la valeur par le résultat de la fonction
-}}}
-!! {{{first_value}}}
-{{{
-retourner la première valeur du tableau $1
-}}}
-!! {{{last_value}}}
-{{{
-retourner la dernière valeur du tableau $1
-}}}
-!! {{{array_copy}}}
-{{{
-copier le contenu du tableau $2 dans le tableau $1
-}}}
-!! {{{array_copy_firsts}}}
-{{{
-copier tous les valeurs du tableau $2(=$1) dans le tableau $1, excepté la dernière
-}}}
-!! {{{array_del_last}}}
-!! {{{array_copy_lasts}}}
-{{{
-copier tous les valeurs du tableau $2(=$1) dans le tableau $1, excepté la première
-}}}
-!! {{{array_del_first}}}
-!! {{{array_extend}}}
-{{{
-ajouter le contenu du tableau $2 au tableau $1
-}}}
-!! {{{array_extendu}}}
-{{{
-ajouter chacune des valeurs du tableau $2 au tableau $1, si ces valeurs n'y
-sont pas déjà. Retourner vrai si au moins une valeur a été ajoutée
-}}}
-!! {{{array_extend_firsts}}}
-{{{
-ajouter toutes les valeurs du tableau $2 dans le tableau $1, excepté la dernière
-}}}
-!! {{{array_extend_lasts}}}
-{{{
-ajouter toutes les valeurs du tableau $2 dans le tableau $1, excepté la première
-}}}
-!! {{{array_xsplit}}}
-{{{
-créer le tableau $1 avec chaque élément de $2 (un ensemble d'éléments séparés
-par $3, qui vaut ':' par défaut).
-}}}
-!! {{{array_split}}}
-{{{
-créer le tableau $1 avec chaque élément de $2 (un ensemble d'éléments séparés
-par $3, qui vaut ':' par défaut). Les éléments vides sont ignorés. par exemple
-"a::b" est équivalent à "a:b"
-}}}
-!! {{{array_from_path}}}
-!! {{{array_from_xlines}}}
-{{{
-créer le tableau $1 avec chaque ligne de $2.
-}}}
-!! {{{array_from_lines}}}
-{{{
-créer le tableau $1 avec chaque ligne de $2. Les lignes vides sont ignorés.
-}}}
-!! {{{array_join}}}
-{{{
-afficher le contenu du tableau dont le nom est $1 sous forme d'une liste de
-valeurs séparées par $2 (par défaut, une virgule)
-Si $1=="@", alors les éléments du tableaux sont les arguments de la fonction à
-partir de $3
-Si $1!="@" et que le tableau est vide, afficher $3
-Si $1!="@", $4 et $5 sont des préfixes et suffixes à rajouter à chaque élément
-}}}
-!! {{{array_mapjoin}}}
-{{{
-map le tableau $1 avec la fonction $2, puis afficher le résultat en séparant
-chaque élément par $3. Les arguments et la sémantique sont les mêmes que pour
-array_join en tenant compte de l'argument supplémentaire $2 qui est la
-fonction pour array_map (les autres arguments sont décalés en conséquence)
-}}}
-!! {{{array_to_lines}}}
-{{{
-afficher le tableau dont le nom est $1 sous forme de lignes
-}}}
-!! {{{array_to_path}}}
-{{{
-afficher le tableau dont le nom est $1 sous forme d'une liste de chemins
-séparés par ':')
-}}}
-!! {{{array_fix_paths}}}
-{{{
-Corriger les valeurs du tableau $1. Les valeurs contenant le séparateur
-$2(=':') sont séparées en plusieurs valeurs. Par exemple avec le tableau
-input=(a b:c), le résultat est input=(a b c)
-}}}
-!! {{{get_date_rfc822}}}
-!! {{{get_date_fr}}}
-!! {{{get_time_fr}}}
-!! {{{parse_date}}}
-!! {{{udelpath}}}
-{{{
-supprimer le chemin $1 de $2(=PATH)
-}}}
-!! {{{uaddpath}}}
-{{{
-Ajouter le chemin $1 à la fin, dans $2(=PATH), s'il n'y existe pas déjà
-}}}
-!! {{{uinspathm}}}
-{{{
-Ajouter le chemin $1 au début, dans $2(=PATH), s'il n'y existe pas déjà
-}}}
-!! {{{uinspath}}}
-{{{
-S'assurer que le chemin $1 soit au début de $2(=PATH)
-}}}
-!! {{{withpath}}}
-{{{
-tester si le chemin est relatif à . ou à .., ou est absolu. i.e 'withpath a/b'
-renvoie faux alors que 'withpath ./a/b' renvoie vrai
-}}}
-!! {{{withext}}}
-{{{
-tester si le fichier a une extension
-}}}
-!! {{{normpath}}}
-{{{
-normaliser le chemin $1, qui est soit absolu, soit relatif à $2 (qui vaut
-$(pwd) par défaut)
-}}}
-!! {{{abspath}}}
-{{{
-Retourner un chemin absolu vers $1. Si $2 est non nul et si $1 est un chemin
-relatif, alors $1 est exprimé par rapport à $2, sinon il est exprimé par
-rapport au répertoire courant.
-Si le chemin n'existe pas, il n'est PAS normalisé. Sinon, les meilleurs
-efforts sont faits pour normaliser le chemin.
-}}}
-!! {{{parentdirs}}}
-{{{
-Obtenir la liste de tous les parents du répertoire $2 dans le tableau $1, du
-répertoire $2 vers la racine. Si $3 commence par 'r' (comme reverse), l'ordre
-est inversé: le tableau contient les répertoire de la racine vers $2.
-}}}
-!! {{{ppath}}}
-{{{
-Dans un chemin *absolu*, remplacer "$HOME" par "~" et "$(pwd)/" par "", afin
-que le chemin soit plus facile à lire. Le répertoire courant est spécifié par
-$2 ou $(pwd) si $2 est vide
-}}}
-!! {{{relpath}}}
-{{{
-Afficher le chemin relatif de $1 par rapport à $2. Si $2 n'est pas spécifié,
-on prend le répertoire courant. Si $1 ou $2 ne sont pas des chemins absolus,
-il sont transformés en chemins absolus par rapport à $3. Si $1==$2, retourner
-une chaine vide
-}}}
-!! {{{relpathx}}}
-{{{
-Comme relpath, mais pour un chemin vers un exécutable qu'il faut lancer:
-s'assurer qu'il y a une spécification de chemin, e.g. ./script
-}}}
-!! {{{withinpath}}}
-{{{
-Tester si le chemin absolu $2 se trouve dans le chemin absolu "$1" (appelée
-barrière). Soit un chemin P, on considère que P est dans P. Si ce comportement
-n'est pas souhaité, $3(=N) doit valoir O, auquel cas P est dans Q implique que
-P != Q.
-}}}
-!! {{{safe_abspath}}}
-{{{
-Afficher le chemin absolu de $1, par rapport à $2, si et seulement si le
-chemin résultat ne se trouve pas en dehors de la barrière $3. Si $2 n'est pas
-spécifié, prendre le répertoire courant. S'il est relatif, l'exprimer par
-rapport au répertoire courant. Si $3 est relatif, l'exprimer par rapport à $2.
-Si le chemin résultat est sité en dehors de la barrière, ne rien afficher et
-retourner un code d'erreur.
-Si le chemin $1 n'existe pas, il n'est PAS normalisé. Sinon, les meilleurs
-efforts sont faits pour normaliser le chemin résultat.
-}}}
-!! {{{safe_relpath}}}
-{{{
-Afficher le chemin relatif de $1 par rapport à $2 si et seulement si le chemin
-résultat ne se trouve pas en dehors de la barrière $3. Si $2 n'est pas
-spécifié, prendre le répertoire courant. S'il est relatif, l'exprimer par
-rapport au répertoire courant. Si $3 est relatif, l'exprimer par rapport à $2.
-Si le chemin résultat est sité en dehors de la barrière, ne rien afficher et
-retourner un code d'erreur.
-}}}
-!! {{{splitwcs}}}
-{{{
-Découper un nom de chemin $1 entre la partie sans wildcards, qui est placée dans
-la variables $2(=basedir), et la partie avec wildcards, qui est placée dans la
-variable $3(=filespec)
-}}}
-!! {{{deref}}}
-{{{
-Retourner un chemin absolu vers le fichier $1, dans lequel toutes les
-composantes "lien symbolique" ont été supprimées.
-DEPRECATED: Cette fonction est dépréciée. Utiliser à la place readlinkm()
-}}}
-!! {{{readlinka}}}
-{{{
-Afficher un chemin absolu vers la destination du fichier $1. Si $1 n'est pas
-un lien, afficher simplement le chemin du fichier
-}}}
-!! {{{readlinkm}}}
-{{{
-Retourner un chemin absolu vers le fichier $1, dans lequel toutes les
-composantes "lien symbolique" ont été supprimées. Il n'est pas requis que les
-composantes du chemin existent.
-}}}
-!! {{{path_if_test}}}
-{{{
-afficher un chemin si le fichier $2 existe (en utilisant l'opérateur $1) dans
-l'un des chemins absolus $4..n. si $3==relative, afficher le chemin relatif,
-sinon le chemin absolu. note: $3 peut être de la forme relative:path, auquel
-cas le chemin affiché est exprimé relativement à path
-}}}
-!! {{{update_link}}}
-{{{
-mettre à jour le lien $2 pour qu'il pointe vers le fichier $1
-}}}
-!! {{{update_links}}}
-{{{
-Mettre à jour les liens $2..@ pour qu'ils pointent vers la nouvelle
-destination $1
-}}}
-!! {{{move_link}}}
-{{{
-Déplacer le lien $1 vers $2, et mettre à jour la destination du lien si
-elle est exprimée de façon relative
-Si $1 n'est pas un lien, le déplacer normalement avec mv
-}}}
-!! {{{copy_link}}}
-{{{
-Copier le lien $1 vers $2, et mettre à jour la destination du lien si
-elle est exprimée de façon relative
-Si $1 n'est pas un lien, le copier normalement avec cp
-}}}
-!! {{{array_find_links}}}
-{{{
-Chercher dans le répertoire $3 (qui est par défaut le répertoire courant)
-les liens vers le fichier $2, et ajouter leurs chemins absolus dans le
-tableau $1
-}}}
-!! {{{list_links}}}
-{{{
-Chercher dans le répertoire $2 les liens vers le fichier $1, et les
-afficher, un par ligne.
-}}}
-!! {{{move_file}}}
-{{{
-Déplacer le fichier $1 vers $2, et mettre à jour les liens $3..@ pour
-qu'ils pointent vers la nouvelle destination
-}}}
-!! {{{get_nblines}}}
-{{{
-Afficher le nombre de lignes d'un fichier
-}}}
-!! {{{mktempf}}}
-{{{
-générer un fichier temporaire et retourner son nom
-}}}
-!! {{{mktempd}}}
-{{{
-générer un répertoire temporaire et retourner son nom
-}}}
-!! {{{mkdirof}}}
-{{{
-Créer le répertoire correspondant à un fichier
-}}}
-!! {{{cp_a}}}
-{{{
-copier des fichiers en gardant le maximum de propriétés
-}}}
-!! {{{cp_R}}}
-{{{
-copier des fichiers récursivement, en suivant les liens symboliques
-}}}
-!! {{{quietgrep}}}
-{{{
-tester la présence d'un pattern dans un fichier
-}}}
-!! {{{quietdiff}}}
-{{{
-tester si deux fichiers sont identiques
-}}}
-!! {{{testsame}}}
-{{{
-tester si deux fichiers sont identiques/différents
-}}}
-!! {{{testdiff}}}
-!! {{{testupdated}}}
-{{{
-test si $2 n'existe pas ou si $1 est différent de $2
-}}}
-!! {{{testnewer}}}
-{{{
-test si $2 n'existe pas ou si $1 est plus récent que $2
-}}}
-!! {{{ps_all}}}
-{{{
-afficher tous les processus avec le maximum d'informations
-}}}
-!! {{{progexists}}}
-{{{
-tester l'existence d'un programme dans le PATH
-}}}
-!! {{{has_python}}}
-{{{
-tester la présence de python
-}}}
-!! {{{has_gawk}}}
-{{{
-tester la présence de gnuawk
-}}}
-!! {{{is_root}}}
-{{{
-tester si on est root
-}}}
-!! {{{source_ifexists}}}
-{{{
-sourcer un fichier s'il existe
-}}}
-!! {{{is_running}}}
-{{{
-tester si un programme dont on donne le PID tourne
-}}}
-!! {{{sedi}}}
-{{{
-Lancer sed sur un fichier en le modifiant en place
-}}}
-!! {{{csort}}}
-{{{
-Lancer sort avec LANG=C pour éviter les problèmes avec la locale. en effet,
-avec LANG!=C, sort utilise les règles de la locale pour le tri, et par
-exemple, avec LANG=fr_FR.UTF-8, la locale indique que les ponctuations doivent
-être ignorées.
-}}}
-!! {{{lsort}}}
-!! {{{cgrep}}}
-{{{
-Lancer grep avec LANG=C pour éviter les problèmes avec la locale. cf csort
-pour une explication.
-}}}
-!! {{{lgrep}}}
-!! {{{csed}}}
-{{{
-Lancer sed avec LANG=C pour éviter les problèmes avec la locale. cf csort pour
-une explication.
-}}}
-!! {{{lsed}}}
-!! {{{cawk}}}
-{{{
-Lancer awk avec LANG=C pour éviter les problèmes avec la locale. cf csort pour
-une explication.
-}}}
-!! {{{lawk}}}
-!! {{{cdiff}}}
-{{{
-Lancer diff avec LANG=C pour éviter les problèmes avec la locale. cf csort
-pour une explication.
-}}}
-!! {{{ldiff}}}
-!! {{{fix_mode}}}
-{{{
-Si le fichier $1 n'est pas writable, le rendre writable temporairement. Si
-nécessaire, le fichier est créé.
-Cette fonction s'utilise de cette façon:
-mode="$(fix_mode file)"
-...
-unfix_mode file "$mode"
-}}}
-!! {{{unfix_mode}}}
-{{{
-Restaurer le mode $2 du fichier $1 traité par fix_mode
-}}}
-!! {{{get_mode}}}
-{{{
-Obtenir le mode du fichier $1, en le créant si nécessaire. A utiliser avec
-unfix_mode pour restaurer le mode d'un fichier qui a été traité avec un
-fichier temporaire intermédiaire
-}}}
-!! {{{rm_maybe}}}
-{{{
-Supprimer les fichiers dont on donne la liste. Si aucun fichier n'est
-spécifié, cette fonction est un NOP
-}}}
-!! {{{cpdir}}}
-{{{
-copier un fichier dans un répertoire, ou le contenu d'un répertoire dans un
-autre répertoire, que le répertoire source soit un lien symbolique ou
-non. Cette fonction existe parce que le comportement de "cp_a src dest" n'est
-pas consistant selon les plateformes, surtout si src est un lien symbolique
-sur un répertoire: parfois on copie le lien, parfois on copie le contenu du
-répertoire, parfois on copie le répertoire...
-La copie est faite avec rsync si possible. Les options du tableau
-__CPDIR_RSYNC_ARGS sont rajoutées aux options standard de rsync.
-}}}
-!! {{{cpnovcs}}}
-{{{
-copier le fichier/répertoire $1 *dans* le *répertoire* $2 avec rsync. Les
-options du tableau __CPNOVCS_RSYNC_ARGS sont rajoutées aux options standard
-de rsync.
-Si $1 est un répertoire, la copie est faite en ignorant les sous-répertoires
-de VCS (.svn, CVS). En ce qui concerne les répertoire de VCS, git aussi est
-supporté, mais uniquement s'il est à la racine du transfert.
-Si $1 se termine par un '/', c'est le contenu du répertoire qui est copié, pas
-le répertoire lui-même. Si rsync n'est pas trouvé sur le système, alors on
-fait une copie standard qui inclue les répertoires de VCS.
-}}}
-!! {{{cpvcs}}}
-{{{
-comme cpnovcs, mais ne pas ignorer les répertoires de VCS
-}}}
-!! {{{cpdirnovcs}}}
-{{{
-Le pendant de cpdir, mais en ignorant les sous-répertoires de VCS: copier le
-contenu du répertoire $1 dans le répertoire $2
-}}}
-!! {{{doinplace}}}
-{{{
-Filtrer le fichier $1 à travers la commande $2..$*, puis remplacer le fichier
-s'il n'y a pas eu d'erreur. Retourner le code d'erreur de la commande. Si $1
-n'est pas spécifié ou vaut -, filtrer l'entrée standard vers la sortie
-standard.
-La variante doinplacef remplace le fichier quelque soit le code de retour de
-la commande. A utiliser avec des commandes comme grep qui peuvent retourner
-FAUX s'ils ne trouvent pas le motif
-}}}
-!! {{{doinplacef}}}
-!! {{{stripnl}}}
-{{{
-Supprimer les caractères de fin de ligne de la chaine en entrée
-}}}
-!! {{{nl2lf}}}
-!! {{{nl2crlf}}}
-!! {{{nl2cr}}}
-!! {{{list_all}}}
-{{{
-Lister les fichiers ou répertoires du répertoire $1, un par ligne
-Les répertoires . et .. sont enlevés de la liste
-$1=un répertoire dont le contenu doit être listé
-$2..@=un ensemble de patterns pour le listage
-}}}
-!! {{{list_files}}}
-{{{
-Lister les fichiers du répertoire $1, un par ligne
-$1=un répertoire dont le contenu doit être listé.
-$2..@=un ensemble de patterns pour le listage
-}}}
-!! {{{list_dirs}}}
-{{{
-Lister les répertoires du répertoire $1, un par ligne
-Les répertoires . et .. sont enlevés de la liste
-$1=un répertoire dont le contenu doit être listé.
-$2..@=un ensemble de patterns pour le listage
-}}}
-!! {{{array_lsall}}}
-{{{
-Lister les fichiers avec `list_all $2 $3...`, et les mettre dans le
-tableau $1. Le tableau contient les chemins complets, par seulement les
-noms comme avec list_all
-}}}
-!! {{{array_lsdirs}}}
-{{{
-Lister les fichiers avec `list_dirs $2 $3...`, et les mettre dans le
-tableau $1. Le tableau contient les chemins complets, par seulement les
-noms comme avec list_dirs
-}}}
-!! {{{array_lsfiles}}}
-{{{
-Lister les fichiers avec `list_files $2 $3...`, et les mettre dans le
-tableau $1. Le tableau contient les chemins complets, par seulement les
-noms comme avec list_files
-}}}
-!! {{{filter_empty}}}
-{{{
-Filtrer l'entrée standard en enlevant les lignes vides
-}}}
-!! {{{filter_vcspath}}}
-{{{
-L'entrée standard étant une liste de chemins, filtrer les fichiers et
-répertoire qui ont un rapport avec subversion ou git
-}}}
-!! {{{merge_contlines}}}
-{{{
-Avec les lignes lues sur stdin, fusionner celles qui se terminent par \ avec
-les suivantes.
-}}}
-!! {{{filter_comment}}}
-{{{
-Filtrer un fichier de configuration lu sur stdin en enlevant les commentaires
-et les lignes vides.
-Avec $1==-m, fusionner les lignes qui se terminent par \ avec les suivantes
-Comme filter_conf(), les commentaires doivent être sur une ligne à part.
-Contrairement à filter_conf, il n'est pas nécessaire que le caractère '#' soit
-en début de ligne: il peut apparaitre après des espaces et des tabulations. De
-même, une ligne qui ne contient que des espaces et des tabulations est
-considérée comme vide.
-}}}
-!! {{{filter_conf}}}
-{{{
-filtrer un fichier de configuration lu sur stdin en enlevant les commentaires
-et les lignes vides. Une ligne n'est considérée commentaire que si '#' est un
-première position. Utiliser filter_comment() si les commentaire peuvent
-commencer par des caractères espace et tabulation.
-Si $1==-m, fusionner les lignes qui se terminent par \ avec les suivantes
-}}}
-!! {{{is_archive}}}
-{{{
-tester si l'extension d'un fichier indique que c'est une archive
-}}}
-!! {{{extract_archive}}}
-{{{
-Extraire le contenu de l'archive $1 dans le répertoire ${2:-.}
-}}}
-!! {{{get_archive_basename}}}
-{{{
-Obtenir le nom de base de l'archive $1
-}}}
-!! {{{get_archive_appname}}}
-{{{
-Obtenir le nom probable de l'application ou du framework contenu dans
-l'archive $1, e.g:
-get_archive_versionsuffix app-0.1.tgz
---> app
-}}}
-!! {{{get_archive_versionsuffix}}}
-{{{
-Obtenir la valeur probable de la version de l'application ou du framework
-contenu dans l'archive $1, avec le caractère de séparation, e.g:
-get_archive_versionsuffix app-0.1.tgz
---> -0.1
-}}}
-!! {{{get_archive_version}}}
-{{{
-Obtenir la valeur probable de la version de l'application ou du framework
-contenu dans l'archive $1, e.g:
-get_archive_versionsuffix app-0.1.tgz
---> 0.1
-}}}
-!! {{{dump_usernames}}}
-{{{
-Placer dans le tableau $1 la liste des utilisateurs du système
-Cette implémentation consulte /etc/passwd et liste tous les utilisateurs dont
-le homedir se trouve dans /home, et dont l'uid est >=500
-}}}
-!! {{{resolv_ips}}}
-{{{
-Placer dans le tableau $1(=ips) la liste des adresses ip correspondant à
-l'hôte $2. La résolution est effectuée avec la commande host.
-}}}
-!! {{{resolv_hosts}}}
-{{{
-Placer dans le tableau $1(=hosts) la liste des hôtes correspondant à
-l'adresse ip $2. La résolution est effectuée avec la commande host.
-}}}
-!! {{{runscript_as}}}
-{{{
-Utiliser bash pour lancer le script $2 avec les arguments $3..$n afin qu'il
-tourne avec les droits d'un autre user $1(=root). Si $2=exec, utiliser exec
-pour lancer le script et ses arguments qui commencent à partir de $3, ce qui
-fait que cette fonction ne retourne pas.
-Attention! cette fonction ne teste pas avec si on est déjà le user $1. Il y a
-donc un risque de boucle infinie si on ne teste pas le user courant.
-}}}
-!! {{{runscript_as_root}}}
-{{{
-Utiliser bash pour lancer le script $1 avec les arguments $2..$* avec les
-droits de root. Si on est déjà en root, le script est simplement lancé. Sinon,
-utiliser runscript_as pour lancer le script avec les droits de root.
-}}}
-!! {{{run_as}}}
-{{{
-Relancer le script courant afin qu'il tourne avec les droits d'un autre user
-$1(=root)
-Attention! cette fonction ne teste pas avec si on est déjà ce user. Il y a
-donc un risque de boucle infinie si on ne teste pas le user courant.
-Il faut lancer cette fonction avec les arguments du script en cours. Par
-exemple::
-run_as root "$@"
-Si $2=--noexec, on n'utilise pas la fonction exec, ce qui fait que la fonction
-retourne. Sinon, on peut considérer que cette fonction ne retourne jamais
-}}}
-!! {{{run_as_root}}}
-{{{
-relancer le script courant afin qu'il tourne en root si on est pas en déjà
-root. Sinon, cette fonction est un nop.
-}}}
-!! {{{check_user}}}
-{{{
-Vérifier si le user courant est l'un des users $1..*
-}}}
-!! {{{ensure_user}}}
-{{{
-Vérifier si le user courant est l'un des users $1..N où N est la position du
-premier "--". Si ce n'est pas le cas et que l'on est root, relancer le script
-avec ce user grâce à la fonction run_as()
-Retourner 1 si ce n'était pas le bon user. Retourner 10 si ce n'était pas le
-bon user et que l'on n'est pas root (donc impossible à priori de relancer le
-script avec le bon user). Retourner 11 si l'utilisateur a choisi de ne pas
-lancer le script avec le bon utilisateur
-A utiliser de cette manière:
-if ensure_user users... -- args; then
-# ... on est avec le bon user; faire les opérations
-else
-# ... ce code n'est exécuté que si une erreur s'est produite, ou si ce
-# n'était pas le bon user et que l'option --noexec est utilisée
-fi
-}}}
-!! {{{check_hostname}}}
-{{{
-Vérifier si le hostname courant est l'un des hôtes $1..*
-localhost matche toujours
-}}}
-!! {{{check_userhostname}}}
-{{{
-Vérifier si le hostname et éventuellement le user courant sont l'un des
-arguments $1..*
-Chaque argument est de la forme [user@]host, mais le test ne tient compte que
-du nom de l'hôte, sans tenir compte du domaine. Si le user n'est pas spécifié,
-le test ne porte que sur hostname.
-}}}
-!! {{{ensure_hostname}}}
-{{{
-Vérifier si le hostname et le user courant sont l'un des arguments $1..*
-Chaque argument est de la forme [user@]host, mais le test ne tient compte que
-du nom de l'hôte, sans tenir compte du domaine.
-Si user est spécifié:
-- Si on est sur le bon hôte mais pas le bon user, ensure_user est lancé avec
-l'argument approprié pour relancer le script
-Si l'argument était de la forme userhost:path, le répertoire courant est
-changé avant de lancer le script avec le bon utilisateur.
-Sinon (si user n'est pas spécifié):
-- Si on n'est pas sur le bon hôte, après confirmation le script est lancé avec
-ssh sur l'hôte distant avec le user spécifié (qui vaut par défaut root). Ce
-script DOIT exister sur l'hôte distant avec le même chemin.
-Si l'argument était de la forme userhost:path, le répertoire courant distant
-est changé avant de lancer le script
-Si on est avec le bon user sur le bon hôte, le répertoire courant n'est jamais
-changé.
-Retourner 1 si ce n'était pas le bon user. Retourner 10 si ce n'était pas le
-bon user et que l'on n'est pas root (donc impossible à priori de relancer le
-script avec le bon user). Retourner 11 si l'utilisateur a choisi de ne pas
-lancer le script sur l'hôte distant. Retourner 12 si une erreur s'est produite
-avec ssh.
-A utiliser de cette manière:
-if ensure_hostname user@host... -- args; then
-# ... on est [avec le bon user] sur le bon hôte; faire les opérations
-else
-# ... ce code n'est exécuté que si une erreur s'est produite, ou si ce
-# n'était pas le bon user et que l'option --noexec est utilisée
-fi
-}}}
-!! {{{sqvals}}}
-!! {{{quoted_values}}}
-!! {{{formatcsv}}}
-!! {{{awkdef}}}
-{{{
-Afficher un script à insérer au début d'un script awk. Ce script définit dans
-une section BEGIN{} les variables donnés en arguments, et avec l'option -f,
-des fonctions utiles. Si une valeur ne ressemble pas à une définition de
-variable, l'analyse des variables s'arrête et le reste des arguments est
-inséré tel quel. Cette fonction peut être utilisée de cette manière:
-awk "$(awkdef -f var=value... 'script awk')"
-Normalement, les variables définies sont scalaires, avec une syntaxe de la
-forme var[:type]=value. type peut valoir str ou int, pour forcer le type de la
-variable créée dans awk.
-Il est possible d'utiliser la syntaxe awk_array[@]=bash_array ou array[@] (qui
-est équivalente à array[@]=array) pour initialiser le tableau awk_array, qui
-contiendra toute les valeurs du tableau nommé bash_array, avec les indices de
-1 à N, N étant le nombre d'éléments du tableau bash_array. La variable
-awk_array_count est aussi initialisée, et contient le nombre d'éléments du
-tableau
-La syntaxe "awk_array[@]=<\n..." permet de spécifier les valeurs du tableau,
-une par ligne, e.g:
-$'values[@]=<\nvalue1\nvalue2'
-pour un tableau values qui contiendra deux valeurs: value1 et value2
-Avec l'option -f, des fonctions supplémentaires sont définies. Elles sont
-décrites dans le module awk.
-}}}
-!! {{{lawkrun}}}
-{{{
-wrapper pour lancer awk avec un script préparé par awkdef. Les définitions et
-les arguments sont séparés par --, e.g.
-awkrun var0=value0 var1=value1 script -- input0 input1
-}}}
-!! {{{cawkrun}}}
-!! {{{awkrun}}}
-!! {{{lf_trylock}}}
-{{{
-USAGE
-lf_trylock [-h max_hours] /path/to/lockfile
-OPTIONS
-lockfile
-fichier qui doit contenir le verrou
--h max_hours
-Nombre d'heures (par défaut 4) au bout duquel afficher stale
-Sinon, afficher locked
-Retourne 0 si le verrou a été placé correctement. Il ne faut pas oublier de
-supprimer le fichier. Le mieux est de le faire supprimer automatiquement par
-autoclean:
-lockfile=...
-case "$(lf_trylock "$lockfile")" in
-locked) ...;;
-stale) ...;;
-esac
-autoclean "$lockfile"
-Sinon, retourner 1 et afficher l'une des deux valeurs suivantes:
-- stale si le verrou a déjà été placé, depuis au moins max_hours heures
-- locked si le verrou a déjà été placé
-- retry si une erreur s'est produite pendant la pose du verrou ou sa
-lecture. Cela peut se produire si les droits ne sont pas suffisants pour
-écrire dans le répertoire destination, ou si le fichier a été supprimé
-avant sa lecture (race-condition). Dans ce dernier cas, reessayer permettra
-d'acquérir le verrou
-}}}
-!! {{{pidfile_set}}}
-{{{
-USAGE
-pidfile_set [-p pid] /path/to/pidfile
-OPTIONS
-pidfile
-fichier qui doit contenir le pid du script
--p pid
-spécifier le pid. par défaut, utiliser $$
--r  si pidfile existe mais que le processus ne tourne plus, faire
-comme si le fichier n'existe pas.
-Retourner 0 si le pid a été correctement écrit dans le fichier. Ce fichier
-sera supprimé automatiquement en fin de script
-Retourner 1 si le fichier existe déjà et que le processus est en train de
-tourner.
-Retourner 2 si le fichier existe déjà mais que le processus ne tourne plus.
-Retourner 10 si autre erreur grave s'est produite (par exemple, s'il manque le
-chemin vers pidfile, ou si le fichier n'est pas accessible en écriture.)
-}}}
-!! {{{pidfile_check}}}
-{{{
-USAGE
-pidfile_check /path/to/pidfile
-OPTIONS
-pidfile
-fichier qui doit contenir le pid d'un processus
-Cette fonction permet de vérifier si le processus associé à un fichier de pid
-est en train de tourner.
-Retourner 0 si le fichier de pid existe et que le process du pid spécifié est
-en train de tourner. Retourner 1 sinon.
-Retourner 10 si erreur grave s'est produite (par exemple, s'il manque le
-chemin vers pidfile, ou si le fichier n'est pas accessible en lecture.)
-}}}
-!! {{{page_maybe}}}
-{{{
-Utiliser less, si possible, pour afficher le flux en entrée. Si le terminal
-n'est pas interactif ou si le nombre de lignes en entrée est inférieur au
-nombre de lignes du terminal, afficher simplement le flux.
-Les arguments de cette fonction sont passés à less
-}}}
-!! {{{utools_local}}}
-{{{
-Afficher les commandes pour rendre locales certaines variables en fonction des
-arguments:
-- opts rend locale args, pour utiliser parse_opts() à l'intérieur d'une
-fonction.
-- verbosity et interaction rendent respectivement locales __verbosity et
-__interaction. Ceci est utile pour pouvoir appeler sans risque de pollution
-de l'environnement une fonction qui utilise parse_opts() avec les
-définitions de PRETTYOPTS.
-Si aucun arguments n'est fourni, toutes les définitions sont affichées.
-}}}
-!! {{{stdredir}}}
-{{{
-Lancer la commande $4..@ en redirigeant stdin depuis $1, stdout vers $2,
-stderr vers $3. Si $1 est vide ou vaut /dev/stdin, la redirection n'est
-pas faite. Si $2 est vide ou vaut /dev/stdout, la redirection n'est pas
-faite. Si $3 est vide ou vaut /dev/stderr, la redirection n'est pas faite.
-Cette fonction existe parce que sur certaines versions de bash, il semble
-que les redirections /dev/std* ne sont pas traitées de façon particulière.
-De plus, sur des technologies telles que OpenVZ, les chemins /dev/std* ne
-sont pas créés (parce que /proc/self/fd/* n'est pas accessible). Donc,
-dans de rares cas où le script tourne sur OpenVZ avec une version de bash
-qui est buggée, la redirection n'est pas faite correctement.
-}}}
-!! {{{isatty}}}
-{{{
-tester si STDOUT n'est pas une redirection
-}}}
-!! {{{in_isatty}}}
-{{{
-tester si STDIN n'est pas une redirection
-}}}
-!! {{{out_isatty}}}
-{{{
-tester si STDOUT n'est pas une redirection
-}}}
-!! {{{err_isatty}}}
-{{{
-tester si STDERR n'est pas une redirection
-}}}
-!! {{{die}}}
-!! {{{die_unless}}}
-{{{
-Afficher $-1 et quitter le script avec die() si la commande $1..-2 retourne
-FAUX
-}}}
-!! {{{eerror_unless}}}
-{{{
-Afficher $-1 avec eerror() et retourner $? si la commande $1..-2 retourne FAUX
-}}}
-!! {{{die_if}}}
-{{{
-Afficher $-1 et quitter le script avec die() si la commande $1..-2 retourne
-VRAI
-}}}
-!! {{{eerror_if}}}
-{{{
-Afficher $-1 avec eerror() et retourner le code d'erreur 1 si la commande
-$1..-2 retourne VRAI
-}}}
-!! {{{noerror}}}
-{{{
-lancer la commande "$@" et masquer son code de retour
-}}}
-!! {{{noout}}}
-{{{
-lancer la commande "$@" en supprimant sa sortie standard
-}}}
-!! {{{noerr}}}
-{{{
-lancer la commande "$@" en supprimant sa sortie d'erreur
-}}}
-!! {{{tooenc}}}
-{{{
-Transformer la valeur $1 de l'encoding $2(=$OENC) vers l'encoding de sortie
-$3=($UTOOLS_OUTPUT_ENCODING)
-}}}
-!! {{{uecho}}}
-!! {{{tooenc_}}}
-{{{
-Transformer la valeur $1 de l'encoding $2(=$OENC) vers l'encoding de sortie
-$3=($UTOOLS_OUTPUT_ENCODING)
-}}}
-!! {{{uecho_}}}
-!! {{{toienc}}}
-{{{
-Transformer la valeur $1 de $2(=$IENC) vers l'encoding d'entrée
-$3(=$UTOOLS_INPUT_ENCODING)
-}}}
-!! {{{uread}}}
-{{{
-Lire une valeur sur stdin et la placer dans la variable $1. On assume que la
-valeur en entrée est encodée dans l'encoding d'entrée par défaut
-}}}
-!! {{{stooenc}}}
-{{{
-Transformer la valeur lue sur stdin de $OENC vers l'encoding de sortie par
-défaut ($UTOOLS_OUTPUT_ENCODING)
-}}}
-!! {{{stoienc}}}
-{{{
-Transformer la valeur lue sur stdin de $IENC vers l'encoding d'entrée par
-défaut ($UTOOLS_INPUT_ENCODING)
-}}}
-!! {{{elogto}}}
-{{{
-Activer UTOOLS_EDATE et rediriger STDOUT et STDERR vers le fichier $1
-Si deux fichiers sont spécifiés, rediriger STDOUT vers $1 et STDERR vers $2
-Si aucun fichier n'est spécifié, ne pas faire de redirection
-Si la redirection est activée, forcer l'utilisation de l'encoding UTF8
-Si UTOOLS_ELOG_OVERWRITE=1, alors le fichier en sortie est écrasé. Sinon, les
-lignes en sortie lui sont ajoutées
-}}}
-!! {{{set_verbosity}}}
-!! {{{set_interaction}}}
-!! {{{show_error}}}
-{{{
-tester respectivement si on doit afficher les messages d'erreur,
-d'avertissement, d'information, de debug
-}}}
-!! {{{show_warn}}}
-!! {{{show_info}}}
-!! {{{show_verbose}}}
-!! {{{show_debug}}}
-!! {{{check_verbosity}}}
-!! {{{get_verbosity_option}}}
-!! {{{check_interaction}}}
-!! {{{is_interaction}}}
-!! {{{get_interaction_option}}}
-!! {{{eflush}}}
-{{{
-Afficher les messages en attente
-}}}
-!! {{{eclearp}}}
-{{{
-Supprimer les message en attente
-}}}
-!! {{{eerror}}}
-{{{
-Afficher un message d'erreur
-}}}
-!! {{{ewarn}}}
-{{{
-Afficher un message d'avertissement
-}}}
-!! {{{enote}}}
-{{{
-Afficher un message d'information de même niveau qu'un avertissement
-}}}
-!! {{{ebanner}}}
-{{{
-Afficher un message très important encadré, puis attendre 5 secondes
-}}}
-!! {{{eimportant}}}
-{{{
-Afficher un message très important
-}}}
-!! {{{eattention}}}
-{{{
-Afficher un message important
-}}}
-!! {{{einfo}}}
-{{{
-Afficher un message d'information
-}}}
-!! {{{eecho}}}
-{{{
-Afficher un message d'information sans préfixe
-}}}
-!! {{{eecho_}}}
-!! {{{edebug}}}
-{{{
-Afficher un message de debug
-}}}
-!! {{{trace}}}
-{{{
-Afficher la commande $1..@, la lancer, puis afficher son code d'erreur si une
-erreur se produit
-}}}
-!! {{{trace_error}}}
-{{{
-Lancer la commande $1..@, puis afficher son code d'erreur si une erreur se
-produit. La différence avec trace() est que la commande n'est affichée que si
-une erreur se produit.
-}}}
-!! {{{etitle}}}
-{{{
-Afficher le titre $1, qui est le début éventuel d'une section. Les section
-imbriquées sont affichées indentées. La section n'est pas terminée, et il faut
-la terminer explicitement avec eend, sauf dans certains cas précis:
-- Si $2..$* est spécifié, c'est une commande. Lancer la commande dans le
-contexte de la section. Puis, la section est automatiquement terminée sauf si
-l'option -s est spécifiée, auquel cas la section reste ouverte. Si l'option -p
-est spécifiée, eclearp() est appelé pour purger les messages en attente
-- Dans le cas contraire, l'option -s est ignorée: la section doit toujours
-être terminée explicitement.
-La fonction etitled() est comme etitle(), mais le titre n'est pas affiché
-immédiatement. L'affichage effectif est effectué dès qu'une fonction e* est
-utilisée. Ceci permet, avec la fonction eclearp(), de ne pas afficher de titre
-pour une section vide.
-}}}
-!! {{{etitled}}}
-!! {{{estep}}}
-{{{
-Afficher la description d'une opération. Cette fonction est particulièrement
-appropriée dans le contexte d'un etitle.
-Les variantes e (error), w (warning), n (note), i (info) permettent d'afficher
-des couleurs différentes, mais toutes sont du niveau info.
-}}}
-!! {{{estepe}}}
-!! {{{estepw}}}
-!! {{{estepn}}}
-!! {{{estepi}}}
-!! {{{estep_}}}
-!! {{{estepe_}}}
-!! {{{estepw_}}}
-!! {{{estepn_}}}
-!! {{{estepi_}}}
-!! {{{ebegin}}}
-{{{
-Afficher le message $1, qui décrit le début d'une opération. Cette fonction
-débute une section, qu'il faut terminer avec eend.
-Si $2..$* est spécifié, c'est une commande. Lancer la commande dans le
-contexte de la section. Puis, la section est terminée automatiquement, sauf si
-l'option -s est spécifiée, auquel cas la section reste ouverte.
-}}}
-!! {{{edot}}}
-{{{
-Afficher une étape d'une opération, matérialisée par un point '.' ou une
-croix 'x' en cas de succès ou d'erreur. Cette fonction est particulièrement
-appropriée dans le contexte d'un ebegin.
-}}}
-!! {{{edotw}}}
-{{{
-Afficher un avertissement comme étape d'une opération, matérialisée par une
-lettre 'w' (typiquement de couleur jaune). Cette fonction est particulièrement
-appropriée dans le contexte d'un ebegin.
-}}}
-!! {{{ewait}}}
-{{{
-Afficher les étapes d'une opération qui dure, matérialisées par des '+' toutes
-les secondes tant que le processus $1 tourne.
-A utiliser de cette manière:
-ebegin "msg"
-cmd &
-ewait $!
-eend
-}}}
-!! {{{eend}}}
-{{{
-Terminer une section.
-Avec l'option -c, remettre à zéro toutes les informations de section
-Si la section en cours est un ebegin, afficher la fin de l'opération: [ok] ou
-[error] en fonction du code de retour de la dernière commande (ou de $1 si
-cette valeur est donnée)
-Si la section en cours est un etitle, marquer la fin de la section concernée
-par le titre.
-}}}
-!! {{{elinedots}}}
-{{{
-Afficher un message comme avec ebegin "$1", puis afficher un point '.' pour
-chaque ligne lue sur stdin. Cela permet de suivre une opération. En mode
-DEBUG, afficher la ligne affichée plutôt qu'un point.
-Si $2..$* sont spécifiés, lancer la commande et suivre sa sortie. Ainsi,
-'elinedots msg cmd args' est un raccourci pour 'cmd args | elinedots msg'
-}}}
-!! {{{ask_yesno}}}
-{{{
-Afficher le message $1 suivi de [oN] ou [On] suivant que $2 vaut O ou N, puis
-lire la réponse. Retourner 0 si la réponse est vrai, 1 sinon.
-Si $1 est une option, elle est utilisée avec check_interaction pour savoir si
-on est en mode interactif ou non. A ce moment-là, les valeurs sont décalées
-($2=message, $3=default)
-Si $2 vaut C, la valeur par défaut est N si on est interactif, O sinon
-Si $2 vaut X, la valeur par défaut est O si on est interactif, N sinon
-}}}
-!! {{{read_value}}}
-{{{
-Afficher le message $1 suivi de la valeur par défaut [$3] si elle est non
-vide, puis lire la valeur donnée par l'utilisateur. Cette valeur doit être non
-vide si $4(=O) est vrai. La valeur saisie est placée dans la variable
-$2(=value)
-Si $1 est une option, elle est utilisée avec check_interaction pour savoir si
-on est en mode interactif ou non. A ce moment-là, les valeurs sont décalées
-($2=message, $3=variable, $4=default, $5=required)
-En mode non interactif, c'est la valeur par défaut qui est sélectionnée. Si
-l'utilisateur requière que la valeur soit non vide et que la valeur par défaut
-est vide, afficher un message d'erreur et retourner faux
-read_password() est comme read_value(), mais la valeur saisie n'est pas
-affichée, ce qui la rend appropriée pour la lecture d'un mot de passe.
-}}}
-!! {{{read_password}}}
-!! {{{simple_menu}}}
-{{{
-Afficher un menu simple dont les éléments sont les valeurs du tableau
-$2(=options). L'option choisie est placée dans la variable $1(=option)
--t TITLE: spécifier le titre du menu
--m YOUR_CHOICE: spécifier le message d'invite pour la sélection de l'option
--d DEFAULT: spécifier l'option par défaut. Par défaut, prendre la valeur
-actuelle de la variable $1(=option)
-}}}
-!! {{{actions_menu}}}
-{{{
-Afficher un menu dont les éléments sont les valeurs du tableau $4(=options),
-et une liste d'actions tirées du tableau $3(=actions). L'option choisie est
-placée dans la variable $2(=option). L'action choisie est placée dans la
-variable $1(=action)
-Un choix est saisi sous la forme [action]num_option
--t TITLE: spécifier le titre du menu
--m OPT_YOUR_CHOICE: spécifier le message d'invite pour la sélection de
-l'action et de l'option
--M ACT_YOUR_CHOICE: spécifier le message d'invite dans le cas où aucune option
-n'est disponible. Dans ce cas, seules les actions vides sont possibles.
--e VOID_ACTION: spécifier qu'une action est vide, c'est à dire qu'elle ne
-requière pas d'être associée à une option. Par défaut, la dernière action
-est classée dans cette catégorie puisque c'est l'action "quitter"
--d DEFAULT_ACTION: choisir l'action par défaut. par défaut, c'est la première
-action.
--q QUIT_ACTION: choisir l'option "quitter" qui provoque la sortie du menu sans
-choix. par défaut, c'est la dernière action.
--o DEFAULT_OPTION: choisir l'option par défaut. par défaut, prendre la valeur
-actuelle de la variable $2(=option)
-}}}
-!! {{{autoclean}}}
-{{{
-Ajouter $1..$n à la liste des fichiers à supprimer à la fin du programme
-}}}
-!! {{{ac_cleanall}}}
-{{{
-Supprimer *tous* les fichiers temporaires gérés par autoclean tout de suite.
-}}}
-!! {{{ac_clean}}}
-{{{
-Supprimer les fichier temporaires $1..$* si et seulement s'ils ont été générés
-par ac_set_tmpfile ou ac_set_tmpdir
-}}}
-!! {{{ac_set_tmpfile}}}
-{{{
-Créer un fichier temporaire avec le motif $2, l'ajouter à la liste des
-fichiers à supprimer en fin de programme, et mettre sa valeur dans la
-variable $1
-En mode debug, si ($5 est vide ou ${!5} est une valeur vraie), et si $3 n'est
-pas vide, prendre ce fichier au lieu de générer un nouveau fichier
-temporaire. Si $4==keep, ne pas écraser le fichier $3 s'il existe.
-}}}
-!! {{{ac_set_tmpdir}}}
-{{{
-Créer un répertoire temporaire avec le motif $2, l'ajouter à la liste des
-fichiers à supprimer en fin de programme, et mettre sa valeur dans la
-variable $1
-En mode debug, si ($4 est vide ou ${!4} est une valeur vraie), et si $3 n'est
-pas vide, prendre ce nom de répertoire au lieu de créer un nouveau répertoire
-temporaire
-}}}
-!! {{{debug_tee}}}
-{{{
-En mode debug, passer le flux à travers la commande 'tee "$@"'. Sinon, le flux
-est passé inchangé.
-}}}
-!! {{{get_user_defaults_file}}}
-{{{
-Afficher le chemin vers le fichier utilisateur à éditer pour qu'il soit chargé
-par 'set_defaults $1'. Ce fichier n'existe pas forcément; il faut peut-être le
-créer.
-}}}
-!! {{{get_defaults_files}}}
-{{{
-Initialiser le tableau $1(=defaults) avec la liste des fichiers qui seraient
-chargés par la commande 'set_defaults $2..N'
-}}}
-!! {{{set_defaults}}}
-{{{
-Pour chaque argument, sourcer /etc/default/$arg *et* (en priorité
-~/etc/default.$HOSTNAME/$arg ou à défaut ~/etc/default/$arg) si ceux-ci
-existent. *Sinon*, lire $scriptdir/lib/default/$arg si ce fichier existe
-}}}
-!! {{{myhost}}}
-{{{
-Afficher le nom d'hôte pleinement qualifié, en faisant appel à la commande
-hostname. Par comparaison, $MYHOST est fourni par bash.
-}}}
-!! {{{myhostname}}}
-{{{
-Afficher le nom d'hôte sans domaine, en faisant appel à la commande
-hostname. Par comparaison, $MYHOSTNAME est fourni par bash.
-}}}
-
-
-

-
-
-

-
-
-
!! {{{is_cgi}}}
-{{{
-Tester si on est lancé comme un script CGI
-}}}
-!! {{{ctype_header}}}
-{{{
-Générer une en-tête Content-Type: avec la valeur $1[=text/html]
-}}}
-!! {{{cdisp_header}}}
-{{{
-Générer une en-tête Content-Disposition: avec le type $2[=attachment] et
-le nom de fichier $1[=result]
-}}}
-!! {{{nocache_header}}}
-{{{
-Générer des en-têtes qui désactivent la mise en cache du contenu
-}}}
-!! {{{cgicontent}}}
-{{{
-Générer les en-têtes nécessaire avant de servir le contenu.
-$1(=text/html) est le type de contenu. S'il faut servir le contenu avec
-une disposition "attachment", $2 est le nom de fichier à proposer à
-l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le
-contenu doit être servi.
-$4..* sont des en-têtes supplémentaires à rajouter
-}}}
-!! {{{cgicontent_nocache}}}
-{{{
-Générer les en-têtes nécessaire avant de servir le contenu. Rajouter les
-entêtes pour désactiver la mise en cache.
-$1(=text/html) est le type de contenu. S'il faut servir le contenu avec
-une disposition "attachment", $2 est le nom de fichier à proposer à
-l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le
-contenu doit être servi.
-$4..* sont des en-têtes supplémentaires à rajouter
-}}}
-!! {{{cgierror}}}
-{{{
-Afficher les en-têtes pour désactiver la mise en cache, puis afficher un
-message d'erreur puis arrêter le script
-}}}
-!! {{{cgiredirect}}}
-{{{
-Afficher les en-têtes pour rediriger le client vers la page $1 puis
-arrêter le script
-}}}
-
-
-
!! {{{cgiparams}}}
-!! {{{cgilsxml}}}
-!! {{{cgiupload}}}
-
-
-

-
-
-
!! {{{conf_enable}}}
-{{{
-Dans le fichier de configuration $1, activer les paramètres $2..*
-Chaque argument de cette fonction correspond à une directive du fichier de
-configuration et doit être de la forme name[=value]
-Dans tous les cas, toutes les directives de ce nom sont recherchées et
-décommentées. Si value est précisée, les directives sont mises à jour. Si
-la directive ne figure pas dans le fichier, elle y est rajoutée à la fin
-avec la valeur spécifiée.
-Retourner 0 si une modification a été faite dans le fichier, 1 sinon
-}}}
-!! {{{conf_enableq}}}
-{{{
-Comme conf_enable(), mais s'assure que les valeurs sont quotées dans le
-fichier. Ceci permet de stocker des valeurs avec des espaces ou des
-caractères spéciaux.
-}}}
-!! {{{conf_disable}}}
-{{{
-Dans le fichier de configuration $1, désactiver les paramètres $2..*
-Chaque argument de cette fonction correspond à une directive du fichier de
-configuration et doit être de la forme name[=value]
-Toutes les directives de ce noms sont recherchées et commentées. La valeur
-si elle est spécifiée, est ignorée. Si la directive ne figure pas dans le
-fichier, c'est un NOP.
-Retourner 0 si une modification a été faite dans le fichier, 1 sinon
-}}}
-!! {{{conf_append}}}
-{{{
-Dans le fichier de configuration $1, augmenter les valeurs des variables
-correspondant aux paramètres $2..*
-Chaque argument de cette fonction correspond à une variable du fichier de
-configuration, et doit être de la forme name=value
-Une ligne 'name="${name:+$name:}$value"' est générée à la fin du fichier
-de configuration.
-Par défaut, le séparateur CONF_APPEND_SEP vaut ':', mais il est possible
-de changer cette valeur, de façon globale
-Retourner 0 si une modification a été faite dans le fichier, 1 sinon
-}}}
-!! {{{conf_array_append}}}
-{{{
-Dans le fichier de configuration $1, augmenter les valeurs des variables
-de tableau correspondant aux paramètres $2..*
-Chaque argument de cette fonction correspond à une variable du fichier de
-configuration, et doit être de la forme name=value
-Une ligne name=("${name[@]}" "$value") est générée à la fin du fichier de
-configuration
-Retourner 0 si une modification a été faite dans le fichier, 1 sinon
-}}}
-!! {{{conf_check}}}
-{{{
-Dans le fichier de configuration $1, tester si tous les paramètres $2..*
-sont présents.
-Chaque argument de cette fonction correspond à une variable du fichier de
-configuration, et doit être de la forme name[=value]
-Si une valeur est spécifiée, vérifier que le fichier contient la valeur
-correspondante. Sinon, tester uniquement la présence de la directive.
-}}}
-!! {{{aconf_enable}}}
-{{{
-Dans le fichier de configuration $1, activer les paramètres $2..*
-Chaque argument de cette fonction correspond à une directive du fichier de
-configuration et doit être de la forme name[=value]
-Toutes les directives de ce nom sont recherchées et décommentées, et la
-valeur mise à jour. Si la directive ne figure pas dans le fichier, elle y
-est rajoutée à la fin. A cause du mode opératoire, cette fonction ne
-convient pas pour les directives dont le nom peut apparaitre plusieurs
-fois dans le fichier
-Retourner 0 si une modification a été faite dans le fichier, 1 sinon
-}}}
-!! {{{aconf_disable}}}
-{{{
-Dans le fichier de configuration $1, désactiver les paramètres $2..*
-Chaque argument de cette fonction correspond à une directive du fichier de
-configuration et doit être de la forme name[=value]
-Si la valeur est précisée, la directive correspondant à ce nom et cette
-valeur est recherchée et commentée. Sinon, toutes les directives de ce
-noms sont recherchées et commentées. Si la directive ne figure pas dans le
-fichier, c'est un NOP.
-Retourner 0 si une modification a été faite dans le fichier, 1 sinon
-}}}
-!! {{{aconf_append}}}
-{{{
-Dans le fichier de configuration $1, ajouter des directives correspondant
-aux paramètres $2..*
-Chaque argument de cette fonction correspond à une directive du fichier de
-configuration et doit être de la forme name=value
-Une ligne '$name $value' est ajoutée à la fin du fichier de configuration
-Retourner 0 si une modification a été faite dans le fichier, 1 sinon
-}}}
-!! {{{aconf_array_append}}}
-!! {{{aconf_check}}}
-{{{
-Dans le fichier de configuration $1, tester si tous les paramètres $2..*
-sont présents.
-Chaque argument de cette fonction correspond à une variable du fichier de
-configuration, et doit être de la forme name[=value]
-Si une valeur est spécifiée, vérifier que le fichier contient la valeur
-correspondante. Sinon, tester uniquement la présence de la directive.
-}}}
-!! {{{mconf_enable}}}
-{{{
-Dans le fichier de configuration $1, activer les paramètres $3..* de la
-section $2
-Chaque argument de cette fonction correspond à une directive du fichier de
-configuration et doit être de la forme name[=value]
-Toutes les directives de ce nom sont recherchées et décommentées, et la
-valeur mise à jour. Si la directive ne figure pas dans le fichier, elle y
-est rajoutée à la fin. A cause du mode opératoire, cette fonction ne
-convient pas pour les directives dont le nom peut apparaitre plusieurs
-fois dans le fichier
-Retourner 0 si une modification a été faite dans le fichier, 1 sinon
-Cette fonction nécessite gawk et ignore la locale
-}}}
-!! {{{mconf_disable}}}
-{{{
-Dans le fichier de configuration $1, désactiver les paramètres $3..* de la
-section $2.
-Chaque argument de cette fonction correspond à une directive du fichier de
-configuration et doit être de la forme name[=value]
-Si la valeur est précisée, la directive correspondant à ce nom et cette
-valeur est recherchée et commentée. Sinon, toutes les directives de ce
-noms sont recherchées et commentées. Si la directive ne figure pas dans le
-fichier, c'est un NOP.
-Retourner 0 si une modification a été faite dans le fichier, 1 sinon
-Cette fonction nécessite gawk et ignore la locale
-}}}
-!! {{{mconf_append}}}
-{{{
-Dans le fichier de configuration $1, ajouter des directives correspondant
-aux paramètres $3..* dans la section $2
-Chaque argument de cette fonction correspond à une directive du fichier de
-configuration et doit être de la forme name=value
-Une ligne '$name = $value' est ajoutée à la fin de la section, qui est
-créée si nécessaire à la fin du fichier de configuration
-Retourner 0 si une modification a été faite dans le fichier, 1 sinon
-Cette fonction nécessite gawk et ignore la locale
-}}}
-!! {{{mconf_array_append}}}
-!! {{{mconf_check}}}
-{{{
-Dans le fichier de configuration $1, tester si tous les paramètres $3..*
-sont présents dans la section $2
-Chaque argument de cette fonction correspond à une variable du fichier de
-configuration, et doit être de la forme name[=value]
-Si une valeur est spécifiée, vérifier que le fichier contient la valeur
-correspondante. Sinon, tester uniquement la présence de la directive.
-Cette fonction nécessite gawk et ignore la locale
-}}}
-!! {{{gconf_addline}}}
-{{{
-USAGE
-gconf_addline configfile -a BEGIN -z END NEWLINE
-Dans le fichier de configuration $1, ajouter la ligne NEWLINE entre les lignes
-BEGIN et END.
--a BEGIN
-Spécifier une expression pour matcher une ligne de type BEGIN. Si
-cette option n'est pas spécifiée, on considère que le début de fichier
-matche la ligne BEGIN: la ligne NEWLINE est ajoutée dès que possible.
-Les lignes sont matchées dans l'ordre, i.e. avec '-a 1 -a 2', il faut
-d'abord trouver la ligne 1 puis la ligne 2, sinon, le test n'est pas
-concluant.
--t LINE
-Si après avoir matché toutes les lignes BEGIN, la ligne LINE est
-rencontrée, alors considérer que la ligne à rajouter existe déjà et
-qu'il ne faut pas la rajouter de nouveau
--r LINE
-Si après avoir matché toutes les lignes BEGIN, la ligne LINE est
-rencontrée, alors considérer que la ligne à rajouter existe et qu'il
-faut la mettre à jour. Supprimer la ligne existante et la remplacer
-par la nouvelle ligne.
--z END
-Spécifier une expression pour matcher la ligne de type END. Que cette
-option soit ou non spécifiée, on considère toujours que la fin de
-fichier matche la ligne END. Ainsi, si END n'est pas trouvée, la ligne
-NEWLINE est ajoutée à la fin du fichier.
-Dès que la ligne END est rencontrée, et si aucun des tests -t ou -r
-n'est concluant, alors ajouter la nouvelle ligne avant celle-ci
--n MAX[=1]
-Ajouter au plus MAX occurences de NEWLINE. Après avoir matché END, le
-cycle recommence, au plus MAX-1 fois. Utiliser MAX=-1 pour désactiver
-la limite
-Cette fonction nécessite gawk et ignore la locale
-Retourner 0 si l'ajout s'est fait correctement. Retourner 1 si BEGIN n'a
-pas été trouvé, et donc aucun ajout n'a été effectué. Retourner 2 si une
-erreur quelconque s'est produite
-}}}
-!! {{{writelines_maybe}}}
-
-
-
!! {{{add_to_crontab}}}
-!! {{{remove_from_crontab}}}
-!! {{{disable_in_crontab}}}
-!! {{{enable_in_crontab}}}
-!! {{{ctnow}}}
-{{{
-date +"%-M %-H %-d %-m %u"
-}}}
-!! {{{ctresolve}}}
-!! {{{get_default_crontabdir_prefix}}}
-!! {{{compute_crontab_prefixes}}}
-!! {{{recompute_crontab_prefixes}}}
-!! {{{get_CRONTABDIR_prefix}}}
-
-
-
!! {{{pkg_check}}}
-{{{
-Vérifier que les packages sont installés sur le système
-}}}
-!! {{{pkg_update}}}
-{{{
-Mettre à jour la liste des packages silencieusement sans confirmation
-}}}
-!! {{{pkg_upgrade}}}
-{{{
-Mettre à jour la liste des packages silencieusement sans confirmation
-}}}
-!! {{{pkg_install}}}
-{{{
-Installer les packages silencieusement et sans confirmation
-}}}
-!! {{{pkg_installm}}}
-{{{
-Installer les packages silencieusement et sans confirmation
-Retourner 0 si au moins un des packages a été installé. Sinon, les
-packages n'ont pas été installés, soit parce qu'ils sont déjà installé,
-soit parce qu'il y a eu une erreur.
-}}}
-!! {{{pkg_check_install}}}
-{{{
-Si le programme $1 n'existe pas, alors installer les packages $2..$@
-S'il n'y a pas d'arguments $2..$@ utiliser $1 comme nom de package
-Retourner 0 si au moins un des packages a été installé
-}}}
-!! {{{service_disable}}}
-{{{
-Désactiver le service $1 pour qu'il ne se lance pas automatiquement au
-démarrage
-}}}
-!! {{{service_enable}}}
-{{{
-Activer le service $1 pour qu'il se lance automatiquement au démarrage
-}}}
-!! {{{network_parse_confbr}}}
-{{{
-network_parse_confbr "$confbr" br ifaces
-}}}
-!! {{{network_format_confbr}}}
-{{{
-network_format_confbr "$br" ifaces --> "br:ifaces"
-}}}
-!! {{{network_parse_confip}}}
-{{{
-network_parse_confip "$confip" iface gateway ipsuffixes
-}}}
-!! {{{network_parse_ipsuffix}}}
-{{{
-network_parse_ipsuffix "$ipsuffix" ip suffix
-}}}
-!! {{{network_format_confip}}}
-{{{
-network_format_confip "$iface" "$gateway" ipsuffixes --> "iface//gateway:ipsuffixes"
-}}}
-!! {{{network_format_ipsuffix}}}
-{{{
-network_format_ipsuffix "$ip" "$suffix" --> "ip/suffix"
-}}}
-!! {{{network_fix_confbrs}}}
-{{{
-normaliser le tableau $1(=confbrs): fusionner les doublons
-}}}
-!! {{{network_fix_confips}}}
-{{{
-normaliser le tableau $1(=confips): fusionner les doublons, spécifier le
-suffixe /24 par défaut, etc. $2 est le cas échéant l'interface associée
-aux adresses ip non qualifiées
-}}}
-!! {{{network_fix_mainiface}}}
-{{{
-A partir des valeurs des tableaux $1(=confbrs) et $2(=confips), et de
-l'interface principale $3, déterminer l'interface principale. Si $3 est
-spécifié, c'est la valeur sélectionnée. Sinon, si un bridge existe, c'est
-le premier bridge qui est sélectionné. Sinon, la première interface est
-sélectionnée. Sinon, on prend eth0.
-Ensuite, réorganiser les tableaux de façon que confips[0] devienne la
-configuration ip de l'interface principale.
-}}}
-!! {{{network_fix_confs}}}
-!! {{{network_set_confbrs}}}
-{{{
-initialiser $1(=confbrs) avec l'état des bridges sur le système courant
-}}}
-!! {{{network_set_confips}}}
-{{{
-initialiser le tableau $1(=confips) avec l'état des interfaces sur le
-système courant
-}}}
-!! {{{network_interfaces_check_confbr}}}
-{{{
-Vérifier que la configuration du bridge $1, dont les membres sont les
-interfaces du tableau $2(=ifaces) est faite dans le fichier
-$3(=/etc/network/interfaces)
-}}}
-!! {{{network_interfaces_check_confip}}}
-{{{
-Vérifier que la configuration de l'interface $1, avec la passerelle $2,
-avec les adresses IP du tabbleau $3(=ipsuffixes) est faite dans le fichier
-$4(=/etc/network/interfaces)
-}}}
-!! {{{network_interfaces_remove_iface}}}
-{{{
-Supprimer dans le fichier $2(=/etc/network/interfaces) toute la
-configuration qui concerne l'interface $1
-}}}
-!! {{{network_interfaces_remove_ifaces}}}
-{{{
-Supprimer dans le fichier $2(=/etc/network/interfaces) toute la
-configuration qui concerne les interfaces du tableau $1=(ifaces)
-}}}
-!! {{{network_interfaces_remove_confbr}}}
-{{{
-Supprimer dans le fichier $3(=/etc/network/interfaces) toute la
-configuration qui concerne le bridge $1, et dont les interfaces sont
-listées dans le tableau $2(=ifaces)
-}}}
-!! {{{network_interfaces_add_confip}}}
-{{{
-ajouter dans le fichier $4(=/etc/network/interfaces) la configuration pour
-l'interface $1, avec éventuellement la passerelle $2, et les adresses ips
-telles qu'elles sont définies dans le table $3(=ipsuffixes)
-}}}
-!! {{{network_interfaces_add_confbr}}}
-{{{
-ajouter dans le fichier $4(=/etc/network/interfaces) la configuration pour
-le bridge $1, avec la liste des interfaces dans le tableau $2(=ifaces) et
-la liste des configurations des adresses des interfaces dans le tableau
-$3(=confips)
-}}}
-!! {{{network_fix_hostname}}}
-!! {{{network_fix_mailname}}}
-!! {{{network_fix_exim4}}}
-!! {{{network_fix_postfix}}}
-!! {{{network_fix_hosts}}}
-!! {{{network_config}}}
-{{{
-(Re)configurer le réseau sur l'hôte courant.
-$1 (host) est le nom d'hôte.
-$2 (confips) est le nom d'un tableau contenant la configuration des
-adresses ips pour les interfaces.
-$3 (confbrs) est le nom d'un tableau contenant la configuration des
-bridges à créer/mettre à jour.
-$4 (mainiface) est le nom de l'interface principale, c'est à dire
-l'interface qui est sélectionnée si une adresse ip n'est pas préfixée de
-son interface. En principe, l'interface principale est le premier bridge
-défini ou la première interface définie.
-$5 (reset_interfaces) spécifie de ne pas chercher à mettre à jour le
-fichier /etc/network/interfaces, mais de le recréer depuis zéro.
-$6 (oldhost) est le nom d'hôte actuel, avant la modification
-Si un des arguments n'est pas spécifié, il est ignoré.
-Le tableau confips doit contenir des définitions d'une des formes
-suivantes:
-[[iface][//gateway]:]address[/suffix],...
-[iface:]dhcp
-La deuxième forme est pour spécifier qu'une interface est configurée par
-DHCP. iface vaut par défaut eth0, sauf si une définition de bridge
-existe, auquel cas il s'agit du premier bridge défini. Pour chaque
-interface, seule la première spécification d'adresse IP tient compte de
-l'argument gateway. Les autres spécifications définissent des adresses IP
-supplémentaires pour l'interface.
-Le tableau brs doit contenir des définitions de la forme suivante:
-br:ifaces,...
-br est le nom du bridge, e.g. br0. ifaces est une liste d'interfaces
-séparées par une virgule. e.g. br0:eth0,eth1
-Bien que ce soit techniquement possible, ce script interdit que l'on
-définisse une adresse IP pour une interface faisant partie d'un bridge.
-}}}
-
-
-
!! {{{ensure_exists}}}
-{{{
-Créer le fichier vide "$1" s'il n'existe pas déjà, avec les permissions
-$2(=644). retourner vrai si le fichier a été créé sans erreur
-}}}
-!! {{{copy_replace}}}
-{{{
-Copier de façon inconditionnelle le fichier $1 vers le fichier $2, en
-réinitialisation les permissions à la valeur $3
-}}}
-!! {{{copy_new}}}
-{{{
-Copier le fichier "$1" vers le fichier "$2", avec les permissions $3(=644)
-Ne pas écraser le fichier destination s'il existe déjà
-Retourner vrai si le fichier a été copié sans erreur
-}}}
-!! {{{copy_update}}}
-{{{
-Copier le fichier "$1" vers le fichier "$2", si $2 n'existe pas, ou si $1
-a été modifié par rapport à $2. Réinitialiser le cas échéant les
-permissions à la valeur $3
-Retourner vrai si le fichier a été copié sans erreur.
-}}}
-!! {{{copy_update_ask}}}
-{{{
-Copier ou mettre à jour le fichier $1 vers le fichier $2.
-Si le fichier existe déjà, la différence est affichée, et une confirmation
-est demandée pour l'écrasement du fichier.
-Retourner vrai si le fichier a été copié sans erreur.
-}}}
-!! {{{copy_tree}}}
-{{{
-Copier de façon inconditionnelle l'arborescence $1 dans l'arborescence $2
-}}}
-!! {{{link_new}}}
-{{{
-Si $2 n'existe pas, créer le lien symbolique $2 pointant vers $1
-}}}
-
-
-
!! {{{get_random_kvm_macaddr}}}
-{{{
-Obtenir une adresse mac au hasard commençant par 52:54:00 pour KVM
-}}}
-!! {{{ipcalc_splitipmask}}}
-{{{
-Découper $1 de la forme ip[/mask] entre l'adresse ip, qui est placé dans
-la variable $2(=ip) et le masque, qui est placée dans la variable
-$3(=mask)
-}}}
-!! {{{ipcalc_checkip}}}
-{{{
-Vérifier l'adresse ip $1 pour voir si elle est valide. Si l'adresse est
-valide, l'afficher. Sinon, retourner 1
-}}}
-!! {{{ipcalc_checkmask}}}
-{{{
-vérifier le masque de sous-réseau $1 pour voir si elle est valide. Si oui,
-afficher le suffixe (0, 8, 16, 24, 32) associé. Sinon retourner 1
-}}}
-!! {{{ipcalc_netmask}}}
-{{{
-à partir d'un suffixe (0, 8, 16, 24, 32) ou d'un masque de sous-réseau,
-afficher le masque de sous-réseau. si le suffixe ou le masque ne sont pas
-reconnus, retourner 1
-}}}
-!! {{{ipcalc_broadcast}}}
-{{{
-Calculer l'adresse de broadcast correspondant à l'adresse ip $1. Le masque
-de sous-réseau peut-être indiqué dans l'adresse ip avec le suffixe /n ou
-/x.x.x.x ou donné dans l'argument $2. Seuls les suffixes 0, 8, 16, 24, 32
-sont supportés.
-Retourner 1 si un erreur s'est produite, par exemple si l'adresse ou le
-suffixe sont invalides ou non supportés.
-}}}
-!! {{{ipcalc_gateway}}}
-{{{
-Calculer l'adresse du gateway correspondant à l'adresse ip $1, en
-considérant que le gateway est la première adresse du réseau. Le masque de
-sous-réseau peut-être indiqué dans l'adresse ip avec le suffixe /n ou
-/x.x.x.x ou donné dans l'argument $2. Seuls les suffixes 0, 8, 16, 24, 32
-sont supportés.
-Retourner 1 si un erreur s'est produite, par exemple si l'adresse ou le
-suffixe sont invalides ou non supportés.
-}}}
-!! {{{ipcalc_match}}}
-{{{
-Vérifier si l'adresse $1 correspond au modèle $2, e.g.:
-ipcalc_match 10.75.0.23 10/8         --> TRUE
-ipcalc_match 10.75.0.23 10.75.0.0/24 --> TRUE
-ipcalc_match 10.75.0.23 10.75.0.28   --> FALSE
-}}}
-!! {{{ipcalc_fqdn}}}
-{{{
-Calculer si possible le nom pleinement qualifié correspondant à l'hôte $1.
-Dans tous les cas, afficher l'hôte, mais retourner 1 si la calcul n'a pas
-pu être effectué.
-}}}
-!! {{{ipcalc_fqdn_maybe}}}
-{{{
-Si $1 *semble* déjà être un nom d'hôte pleinement qualifié, l'afficher tel
-quel. Sinon utiliser ipcalc_fqdn() pour afficher le nom d'hôte pleinement
-qualifié correspondant.
-}}}
-
-
-
!! {{{select_java}}}
-{{{
-sélectionner la version *minimum* de java correspondant à $1
-$1== 1.3|1.3+|1.4|1.4+|1.5|1.5+|1.6|1.6+|1.7|1.7+|1.8|1.8+
-Si $2 est défini, il peut s'agit de 32 ou 64 selon que l'on requière la
-version 32bits ou 64 bits
-}}}
-!! {{{select_java_exact}}}
-{{{
-sélectionner la version *exacte* de java correspondant à $1
-$1== 1.3|1.4|1.5|1.6|1.7|1.8 pour une correspondance exacte
-$1== 1.3+|1.4+|1.5+|1.6+|1.7+|1.8+ pour une version minimum
-Si $2 est défini, il peut s'agit de 32 ou 64 selon que l'on requière la
-version 32bits ou 64 bits
-}}}
-!! {{{select_java_any}}}
-{{{
-Sélectionner la version exacte de java correspondant aux arguments, dans
-l'ordre, jusqu'à ce qu'un argument corresponde. DEFAULT correspond à la
-valeur actuelle de JAVA_HOME, si elle est définie.
-Si aucun argument n'est défini, on assume "DEFAULT 5 6 7 8 1.4"
-}}}
-!! {{{get_java_version}}}
-{{{
-Afficher la version de java qui installée dans $1(=$JAVA_HOME)
-En cas d'erreur, ne rien afficher.
-}}}
-!! {{{get_default_javahome_prefix}}}
-!! {{{get_javaextensions_prefix}}}
-!! {{{compute_java_prefixes}}}
-!! {{{recompute_java_prefixes}}}
-!! {{{get_JAVA_HOME_prefix}}}
-!! {{{get_JAVAEXTENSIONS_prefix}}}
-
-
-
!! {{{read_property}}}
-{{{
-Lire la propriété $2 dans le fichier $1, et placer la valeur dans la
-variable $3. Si la propriété n'existe pas, prendre la valeur par défaut
-$4. Si $3=="", elle est construite à partir de $2 en remplaçant les '.'
-par '_'
-Retourner 1 si une erreur s'est produite (par exemple si le fichier
-n'existe pas ou n'est pas accessible en lecture)
-}}}
-!! {{{write_property}}}
-{{{
-Ecrire la propriété $2 dans le fichier $1 avec la valeur $3.
-Retourner 1 si une erreur s'est produite (par exemple si le fichier
-n'existe pas ou n'est pas accessible en écriture)
-}}}
-!! {{{write_properties}}}
-{{{
-Ecrire les propriétés $2..* dans le fichier $1. Les propriétés sont de la
-forme "name=value"
-}}}
-!! {{{norm_properties}}}
-{{{
-Normaliser un fichier de propriété: Les commentaires sont supprimés, les
-valeurs sont triées par ordre alphabétique, les caractères accentués sont
-remplacés par des caractères unicode \\uxxxx, les séquences unicodes sont
-transformées en minuscule.
-}}}
-
-
-
!! {{{json_filter}}}
-{{{
-traiter un flux json pour que chaque valeur soit sur une ligne séparée,
-facilitant le traitement par un script bash
-}}}
-!! {{{awkjson}}}
-
-
-
!! {{{get_default_ldapconfdir_prefix}}}
-{{{
-Calculer et afficher la valeur par défaut de LDAPCONFDIR, ou une chaine
-vide si l'on n'a pas pu le détecter automatiquement.
-}}}
-!! {{{get_default_ldapowner_prefix}}}
-{{{
-Calculer et afficher la valeur par défaut de LDAPOWNER, ou une chaine
-vide si l'on n'a pas pu le détecter automatiquement.
-}}}
-!! {{{compute_ldap_prefixes}}}
-!! {{{recompute_ldap_prefixes}}}
-!! {{{get_LDAPCONFDIR_prefix}}}
-!! {{{get_LDAPOWNER_prefix}}}
-!! {{{split_ldapuri}}}
-{{{
-spliter le ldapuri $1 en $2(=proto), $3(=host) et $4(=port)
-}}}
-!! {{{get_suffixes}}}
-{{{
-obtenir les suffixes de connexion du serveur avec l'uri $1, un par ligne
-retourner 1 si la valeur n'a pas pu être obtenue
-}}}
-!! {{{get_anysuffix}}}
-{{{
-obtenir le *premier* suffixe du serveur avec l'uri $1
-retourner 1 si la valeur n'a pas pu être obtenue
-}}}
-!! {{{get_dcsuffix}}}
-{{{
-obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine par
-dc=TLD où TLD est une valeur quelconque. A priori, c'est un suffixe d'une
-base de donnée non administrative.
-retourner 1 si la valeur n'a pas pu être obtenue
-}}}
-!! {{{get_suffix}}}
-{{{
-obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine si
-possible par dc=TLD où TLD est une valeur quelconque. Dans le cas normal,
-le suffixe affiché est celui d'une base non administrative.
-retourner 1 si la valeur n'a pas pu être obtenue
-}}}
-!! {{{reldn}}}
-!! {{{absdn}}}
-{{{
-obtenir le dn absolu correspondant au dn $1, le dn de base étant
-$2(=$SUFFIX)
-}}}
-!! {{{subof}}}
-{{{
-tester si le dn absolu $1 est $2 ou un enfant de $2
-}}}
-!! {{{rabsdn}}}
-{{{
-comme absdn, mais tient compte de la valeur de $3(=$SEARCHBASE)
-Si le dn commence par "~/", le dn est relatif à $2(=$SUFFIX)
-Si le dn commence par "/", le dn est absolu
-Sinon, le dn est relatif à $3
-}}}
-!! {{{pdn}}}
-{{{
-corriger pour *affichage* un dn *absolu*. pour la racine "", afficher
-'/'. pour $2(=$SUFFIX), afficher '~'. sinon, afficher le dn relativement à
-$2
-}}}
-!! {{{filter_slapdconf}}}
-{{{
-Traiter un fichier de configuration slapd.conf en fusionnant les lignes
-qui sont découpées. Ceci permet de faire des traitements sur le contenu.
-Ce filtre s'utilisera normalement avec filter_conf, e.g.:
-<slapd.conf filter_slapdconf | filter_conf >result.conf
-}}}
-
-
-
!! {{{def_match_attr}}}
-!! {{{def_match_value}}}
-!! {{{uncut_lines}}}
-{{{
-reformer les lignes qui sont coupées
-}}}
-!! {{{cut_lines}}}
-{{{
-couper les lignes trop longues
-}}}
-!! {{{ensure_complete_objects}}}
-{{{
-S'assurer que le ldif ne contient que des objets complets (éliminant ainsi
-les groupes ayant seulement dn:)
-}}}
-!! {{{delete_marked_objects}}}
-{{{
-Supprimer les objets marqués avec --DELETE--:
-}}}
-!! {{{dump_ldif}}}
-!! {{{tl_addattr}}}
-!! {{{tl_modifyattr}}}
-!! {{{tl_deleteattr}}}
-!! {{{tl_deleteentry}}}
-!! {{{tl_touchentry}}}
-!! {{{tl_keepattr}}}
-!! {{{tl_keepval}}}
-!! {{{tl_excludeattr}}}
-!! {{{tl_excludeval}}}
-!! {{{tl_keepvalentry}}}
-!! {{{tl_excludevalentry}}}
-!! {{{tl_replval}}}
-!! {{{tl_addval}}}
-!! {{{tl_defval}}}
-!! {{{print_values}}}
-!! {{{tl_ensureval}}}
-!! {{{print_ensure_values}}}
-!! {{{tl_decode}}}
-!! {{{tl_encode}}}
-!! {{{tl_format}}}
-!! {{{dump_headers}}}
-!! {{{tl_formatcsv}}}
-!! {{{tl_parsecsv}}}
-!! {{{tl_parsecsvmod}}}
-!! {{{get_transform_cmd}}}
-{{{
-Créer une liste de commandes bash à évaluer en fonction des arguments: une
-suite de commandes séparées par //
-Les variables suivantes peuvent être définies en entrée:
-_T_inputfile:
-Si cette variable est non vide, lire à partir du fichier $_T_inputfile
-au lieu de stdin
-_T_uncut_before:
-faut-il fusionner automatiquement les lignes *avant* de lancer les
-commandes.
-_T_cut_after:
-faut-il découper automatiquement les lignes *après* avoir lancé les
-commandes.
-}}}
-!! {{{transform}}}
-
-
-
!! {{{file_get_vars}}}
-{{{
-lire les variables dans un fichier
-}}}
-!! {{{file_set_vars}}}
-{{{
-écrire les variables dans un fichier. Le fichier *doit exister*
-}}}
-!! {{{write_all_remaining_vars}}}
-!! {{{file_get_properties}}}
-{{{
-lire les propriétés d'un fichier de propriété java ou xml
-}}}
-!! {{{file_set_properties}}}
-{{{
-écrire les propriétés d'un fichier de propriété java ou xml
-}}}
-!! {{{file_get_java_properties}}}
-{{{
-lire les propriétés d'un fichier de propriétés java. note: les noms de
-propriété java peuvent contenir le caractère "." mais pas les noms de
-variable bash. La conversion est faite automatiquement. Par exemple::
-file_get_properties build.properties path.to.package "default value"
-charge la valeur de la propriété dans la variable path_to_package
-}}}
-!! {{{file_set_java_properties}}}
-{{{
-écrire des propriétés dans un fichier de propriétés java.
-}}}
-!! {{{write_all_remaining_vars}}}
-!! {{{file_get_xml_properties}}}
-{{{
-lire les propriétés d'un fichier de propriétés xml. Limitation: les
-propriétés ne doivent pas être continuées sur plusieurs lignes. Les
-propriétés doivent être écrites sous la forme::
-<propname>propvalue</propname>
-}}}
-!! {{{file_set_xml_properties}}}
-{{{
-écrire des propriétés dans un fichier de propriétés java.
-}}}
-!! {{{write_all_remaining_vars}}}
-
-
-
!! {{{local_shellfix}}}
-{{{
-Modifier le compte local $1 pour qu'il utilise bash au lieu de sh
-}}}
-!! {{{local_usercheck}}}
-{{{
-Vérifier si le user local $1 existe
-}}}
-!! {{{local_useradd}}}
-{{{
-Créer le user local $1
-USAGE: local_useradd username [gecos [passwd]]
-OPTIONS
--s  Créer l'utilisateur avec les droits d'administrateur
--m  Créer le home directory
-}}}
-
-
-
!! {{{mkcrypt}}}
-
-
-
!! {{{printml}}}
-!! {{{addml}}}
-
-
-
!! {{{SERVICE_OVERRIDE_network_manager_stopx}}}
-{{{
-désactiver network-manager avant de l'arrêter, ce qui permet de s'assurer
-que chaque chaque connexion est arrêtée proprement
-}}}
-!! {{{SERVICE_OVERRIDE_network_manager_startx}}}
-{{{
-cette fonction est le pendant de stopx: penser à relancer network-manager
-après avoir démarré le service
-}}}
-
-
-
!! {{{random_index}}}
-{{{
-Afficher un index au hasard dans le tableau $1
-}}}
-!! {{{random_value}}}
-{{{
-Afficher une valeur au hasard dans le tableau $1
-}}}
-!! {{{random_char}}}
-{{{
-Afficher un caractère au hasard dans la chaine $1
-}}}
-!! {{{genpass}}}
-{{{
-Générer un mot de passe au hasard avec les paramètres GENPASS_*
-}}}
-
-
-
!! {{{pkg_check}}}
-{{{
-Vérifier que les packages sont installés sur le système
-Retourner 123 si le système n'est pas supporté, et donc qu'aucune commande
-d'installation de package n'est disponible.
-}}}
-!! {{{pkg_install}}}
-{{{
-Installer les packages sans confirmation
-Retourner 123 si le système n'est pas supporté, et donc qu'aucune commande
-d'installation de package n'est disponible.
-}}}
-
-
-
!! {{{get_USER_prefix}}}
-!! {{{get_HOME_prefix}}}
-!! {{{has_prefix}}}
-!! {{{expand_prefix}}}
-!! {{{list_prefixes}}}
-!! {{{dump_prefixes}}}
-
-
-
!! {{{get_color}}}
-!! {{{set_verbosity}}}
-!! {{{set_interaction}}}
-!! {{{show_error}}}
-!! {{{show_warn}}}
-!! {{{show_info}}}
-!! {{{show_verbose}}}
-!! {{{show_debug}}}
-!! {{{check_verbosity}}}
-!! {{{get_verbosity_option}}}
-!! {{{check_interaction}}}
-!! {{{is_interaction}}}
-!! {{{get_interaction_option}}}
-
-
-
!! {{{is_any_branch}}}
-!! {{{is_master_branch}}}
-!! {{{is_develop_branch}}}
-!! {{{is_release_branch}}}
-!! {{{is_hotfix_branch}}}
-!! {{{is_feature_branch}}}
-!! {{{list_release_branches}}}
-!! {{{list_hotfix_branches}}}
-!! {{{list_feature_branches}}}
-!! {{{pver}}}
-
-
-
!! {{{pkg_check}}}
-{{{
-Vérifier que les packages sont installés sur le système
-}}}
-!! {{{pkg_update}}}
-{{{
-Mettre à jour la liste des packages silencieusement sans confirmation
-}}}
-!! {{{pkg_upgrade}}}
-{{{
-Mettre à jour la liste des packages silencieusement sans confirmation
-}}}
-!! {{{pkg_install}}}
-{{{
-Installer les packages silencieusement et sans confirmation
-}}}
-!! {{{pkg_installm}}}
-{{{
-Installer les packages silencieusement et sans confirmation
-Retourner 0 si au moins un des packages a été installé. Sinon, les
-packages n'ont pas été instllés, soit parce qu'ils sont déjà installé,
-soit parce qu'il y a eu une erreur.
-}}}
-!! {{{service_disable}}}
-{{{
-Désactiver le service $1 pour qu'il ne se lance pas automatiquement au
-démarrage
-}}}
-!! {{{service_enable}}}
-{{{
-Activer le service $1 pour qu'il se lance automatiquement au démarrage
-}}}
-!! {{{create_bridge}}}
-{{{
-Créer un nouveau pont nommé $1 avec les paramètres $2
-}}}
-
-
-
!! {{{runs_initdir}}}
-{{{
-Initialiser le répertoire d'hôte. $1 est un nom d'hôte pleinement
-qualifié, et les fichiers sont créés dans le premier répertoire de
-RUNSHOSTSDIRS qui convient: si un fichier .udir existe avec un tableau
-runs_domains qui contient le domaine de l'hôte spécifié, alors c'est ce
-répertoire qui est sélectionné. Sinon, on prend le premier répertoire de
-RUNSHOSTSDIRS.
-$2 spécifie si le fichier doit être créé avec de l'aide (yes) ou avec le
-script minimum (no)
-$3 est le contenu à placer dans le fichier sysinfos.conf, s'il n'a pas
-déjà été provisionné.
-Il faut lancer __runs_setpath avant d'utiliser cette fonction et
-RUNSHOSTDIRS ne doit pas être vide
-}}}
-!! {{{runs_create_rscript}}}
-{{{
-Créer un modèle de script. Si $2 est spécifié, c'est un nom d'hôte
-pleinement qualifié. Le répertoire d'hôte correspondant *doit* exister.
-$3 spécifie si le fichier doit être créé avec de l'aide (yes) ou avec le
-script minimum (no)
-Si $2!="", il faut lancer __runs_setpath avant d'utiliser cette fonction
-et RUNSHOSTDIRS ne doit pas être vide
-Le chemin du nouveau script est ajouté au tableau new_rscripts
-}}}
-!! {{{runs_unsupported_system}}}
-{{{
-Afficher un message d'erreur indiquant que le système actuel n'est pas
-supporté, et quitter le script
-}}}
-!! {{{runs_require_sysinfos}}}
-{{{
-Vérifier le système actuel avec check_sysinfos(), et afficher un message
-d'erreur avec runs_unsupported_system() s'il ne correspond pas à la
-requête
-}}}
-!! {{{runs_find_host}}}
-!! {{{runs_add_domain}}}
-{{{
-Si $1 est nom d'hôte pleinement qualifié, retourner cette valeur
-Sinon, lui rajouter le domaine RUNSDOMAIN
-}}}
-!! {{{runs_find_hostfile}}}
-{{{
-Trouver et afficher le fichier d'hôte $1 dans les répertoires du tableau
-$3(=RUNSHOSTSDIRS), pour l'hôte $2(=$RUNSHOST). Retourner 0 en cas de
-succès, 1 en cas d'échec.
-Si host=$2 est une valeur non vide, la recherche est effectuée dans
-{$RUNSHOSTSDIRS}/$host et {$RUNSHOSTSDIRS}/$domain/$hostname. Sinon,
-retourner 1, car il faut spécifier un nom d'hôte.
-}}}
-!! {{{runs_find_datafile}}}
-{{{
-Trouver et afficher le fichier de données $1 dans le répertoire $3 s'il
-est non vide puis dans les répertoires des tableaux $4(=RUNSSCRIPTSDIRS),
-$5(=RUNSMODULESDIRS) et $6(=RUNSHOSTSDIRS), pour l'hôte
-$2(=$RUNSHOST). Retourner 0 en cas de succès, 1 en cas d'échec.
-- D'abord, si $1 *n'est pas* de la forme "./path" ou "../path", chercher
-dans $3.
-- Puis si l'hôte est spécifié, chercher dans {$RUNSHOSTSDIRS}/$host et
-{$RUNSHOSTSDIRS}/$domain/$hostname.
-- Puis chercher dans {$RUNSSCRIPTSDIRS} puis {$RUNSMODULESDIRS}.
-- Puis, si $1 est de la forme "./path" ou "../path", chercher dans $3.
-- Sinon, retourner 1
-}}}
-!! {{{runs_initvars}}}
-{{{
-Initialiser les variables RUNSDIR, RUNSSCRIPT, RUNSDIRPATH,
-RUNSSCRIPTPATH, RUNSSCRIPTDIR et RUNSSCRIPTNAME pour le script $1.
-Les valeurs sont initialisées comme suit:
-RUNSSCRIPT="$(abspath "$1")"
-RUNSDIR="$2" (le répertoire de $RUNS*PATH dans lequel a été trouvé le
-script)
-Si $3!="", RUNSDIRPATH="$3" et RUNSSCRIPTPATH="$4"
-Sinon, RUNSDIRPATH="$RUNSSCRIPTDIR" et RUNSSCRIPTPATH="$RUNSSCRIPTNAME"
-}}}
-!! {{{runs_find_scriptfile}}}
-{{{
-Trouver sans l'afficher le script $1 dans les répertoires des tableaux
-$3(=RUNSSCRIPTSDIRS), $4(=RUNSMODULESDIRS) et $5(=RUNSHOSTSDIRS), en
-considérant que le script sera lancé sur l'hôte $2(=$RUNSHOST), et
-initialiser les variables RUNSDIR, RUNSSCRIPT, RUNSSCRIPTDIR,
-RUNSSCRIPTNAME, RUNSDIRPATH et RUNSSCRIPTPATH. Retourner 0 en cas de
-succès, 1 en cas d'échec.
-$6 vaut ".rs" par défaut est c'est une extension à rajouter au nom
-spécifié si le fichier sans l'extension n'existe pas
-RUNSDIR est le répertoire dans lequel a été trouvé le script (parmi les
-valeurs fournies dans les tableaux RUNSSCRIPTSDIRS, RUNSMODULESDIRS,
-RUNSHOSTSDIRS), RUNSDIRPATH est le répertoire à partir duquel est exprimé
-le chemin du script (i.e RUNSDIRPATH + RUNSSCRIPTPATH == RUNSSCRIPT),
-RUNSSCRIPT contient le chemin absolu vers le script, RUNSSCRIPTPATH
-contient le chemin du script dans RUNSDIRPATH, RUNSSCRIPTDIR le répertoire
-du script, et RUNSSCRIPTNAME le nom du script.
-D'abord, si l'hôte est spécifié, chercher dans {$RUNSHOSTSDIRS}/$host et
-{$RUNSHOSTSDIRS}/$domain/$hostname. Puis chercher dans {$RUNSSCRIPTSDIRS}
-}}}
-!! {{{runs_find_scriptfile_reverse}}}
-{{{
-Soit le fichier de script $1, exprimée de façon absolue, trouver le
-fichier parmi les tableaux $3(=RUNSSCRIPTSDIRS), $4(=RUNSMODULESDIRS)
-et $5(=RUNSHOSTSDIRS), en considérant que le script sera lancé sur l'hôte
-$2(=$RUNSHOST), puis initialiser les variables RUNSDIR, RUNSSCRIPT,
-RUNSSCRIPTDIR, RUNSSCRIPTNAME, RUNSDIRPATH et RUNSSCRIPTPATH. Retourner 0
-en cas de succès, 1 en cas d'échec.
-}}}
-!! {{{runs_rscript}}}
-{{{
-Lancer le fichier $1 comme un script avec les arguments $2..$*. Retourner
-la valeur de retour du script.
-}}}
-!! {{{runs_recipe}}}
-{{{
-Lancer les scripts de la recette contenue dans le fichier $1. Arrêter au
-premier script qui est en erreur
-}}}
-!! {{{runs_rscriptpath}}}
-{{{
-Lancer le script $1 avec les arguments $2..$*. Le script est cherché dans
-les répertoires de RUNSSCRIPTSPATH. Retourner 123 si le script n'est pas
-trouvé, sinon retourner la valeur de retour du script.
-}}}
-!! {{{runs_recipepath}}}
-{{{
-Lancer la recette $1. Le fichier de recette est cherché dans les
-répertoires de RUNSSCRIPTSPATH. Retourner 123 si le fichier de recette n'a
-pas été trouvé, sinon retourner la valeur de retour de runs_recipe()
-}}}
-!! {{{runs_init}}}
-!! {{{runs_initdomains}}}
-{{{
-Si ce n'est pas déjà le cas, initialiser RUNSDOMAINS en fonction de
-/etc/resolv.conf
-}}}
-!! {{{runs_inithost}}}
-!! {{{runs_initsysinfos}}}
-!! {{{runs_initworkdir}}}
-!! {{{runs_after_export}}}
-{{{
-après l'export, initialiser varsfile avec les valeurs qu'il faut garder
-entre le déploiement local et le déploiement distant.
-}}}
-!! {{{runs_check_runsscript}}}
-!! {{{runs_var}}}
-{{{
-Initialiser les variables selon les directives données en ligne de
-commande.
-Les arguments peuvent être une suite de définitions de la forme
-'scalar=value', 'scalar!=name', 'array+=value', 'array-=value' ou
-'array@=name'.
-Sinon, le *dernier* argument peut-être de l'une des formes suivantes:
-'array value0 [value1...]' pour initialiser un tableau,
-'array+ value0 [value1...]' pour ajouter des valeurs à un tableau,
-'array- value0 [value1...]' pour enlever des valeurs à un tableau.
-Les formes 'scalar!=value' et 'array@=value' sont des indirections et
-permettent d'initialiser la variable avec la valeur d'une autre
-variable. L'avantage est que la résolution de la valeur est faite
-uniquement lors de l'appel de cette fonction, ce qui est utile avec des
-fonction comme 'after -r'
-}}}
-!! {{{runs_conf}}}
-{{{
-Activer les flags $*
-}}}
-!! {{{runs_indref}}}
-{{{
-fonction de convenance pour créer des références $3..* avec le fichier de
-configuration $1 et les variables $2
-}}}
-!! {{{runs_refcerts}}}
-{{{
-fonction de convenance pour créer une référence à un répertoire contenant
-des certificats mentionnés dans le fichier de configuration $1. Si les
-références $2..* ne sont pas mentionnées, la variable certsdir dans le
-fichier de configuration est utilisée.
-}}}
-!! {{{runs_refapacheconfig}}}
-{{{
-fonction de convenance pour créer les références à un répertoire de
-configuration pour apache.
-USAGE: refapacheconfig autoconfdir=path/to/autoconfdir [certsdir=[path/to/certsdir]]
-- autoconfdir= est requis et permet de définir à la fois la variable qui
-contiendra la référence ainsi que le répertoire à référencer.
-- certsdir= est optionel. Si cet argument est spécifié sous la forme
-certsdir=path/to/certsdir, il permet de définir à la fois la variable qui
-contiendra la référence ainsi que le répertoire à référencer. Si
-l'argument est spécifié sous la forme certsdir=, il permet de définir la
-variable qui contiendra la référence. C'est cette variable qui sera lue
-dans les fichiers de configuration. Si l'argument n'est pas spécifié, on
-considère que l'argument 'certsdir=' a été utilisé.
-}}}
-!! {{{runs_set_lang}}}
-{{{
-Charger la valeur de LANG depuis l'environnement. La variable LANG est
-initialisée
-}}}
-!! {{{runs_set_proxy}}}
-{{{
-Charger la valeur du proxy depuis l'environnement. Les variables
-http_proxy, ftp_proxy et no_proxy sont initialisées
-}}}
-!! {{{runs_check_confs}}}
-{{{
-Vérifier l'état courant par rapport aux flags
-}}}
-!! {{{runs_after}}}
-{{{
-Vérifier que ce script est lancé après le scriptpath $1, par rapport à
-RUNSSTORY
-}}}
-!! {{{runs_clvars}}}
-{{{
-Traiter les spécifications de variables données en ligne de commande ou
-dans un fichier de recettes
-}}}
-!! {{{runs_indvars}}}
-{{{
-Résoudre les valeurs effectives des variables qui sont des indirections
-}}}
-!! {{{runs_clvars_cmd}}}
-{{{
-écrire la ligne de recette correspondant au script $1 et aux variables
-$2..$*
-}}}
-!! {{{runs_loadconfs}}}
-!! {{{runs_clearvars}}}
-!! {{{runs_action_desc}}}
-!! {{{runs_action_dump}}}
-!! {{{runs_action_run}}}
-!! {{{runs_action_export}}}
-!! {{{shouldrun}}}
-!! {{{checkdone}}}
-!! {{{requiredone}}}
-!! {{{setdone}}}
-!! {{{resetdone}}}
-
-
-

-
-
-
!! {{{runsmod_checkenv}}}
-{{{
-vérifier l'environement. créer les répertoires nécessaires.
-}}}
-!! {{{runsmod_should_update_repolists}}}
-{{{
-tester s'il faut mettre à jour au moins un des fichiers contenant les
-listes des dépôts
-}}}
-!! {{{runsmod_update_repolists}}}
-{{{
-mettre à jour si nécessaire les fichiers contenant les listes des dépôts.
-Si $1 n'est pas vide, forcer la mise à jour de tous les fichiers
-}}}
-!! {{{runsmod_setup_vars}}}
-{{{
-récupérer configuration statique pour la mettre à jour
-}}}
-!! {{{runsmod_clone_or_pull}}}
-{{{
-Chercher les modules $3..@, pour l'hôte $1 qui est le mode d'hôte: none,
-all, self ou one pour un hôte spécifique $2. Ajouter les chemins dans le
-tableau REPO_DIRS. Mettre à jour les tableaux SCRIPTS_DIRS, MODULES_DIRS
-et HOSTS_DIRS
-}}}
-!! {{{runsmod_teardown_vars}}}
-
-
-
!! {{{semver_parse}}}
-!! {{{semver_incmajor}}}
-!! {{{semver_incminor}}}
-!! {{{semver_incpatchlevel}}}
-!! {{{semver_setversion}}}
-!! {{{semver_setprelease}}}
-!! {{{semver_compare_prelease}}}
-!! {{{semver_setmetadata}}}
-!! {{{semver_addmetadata}}}
-!! {{{semver_compare_metadata}}}
-{{{
-même algo que pour prelease
-}}}
-!! {{{semver_copy}}}
-!! {{{semver_build}}}
-!! {{{semver_setvar}}}
-!! {{{psemver_parse}}}
-!! {{{psemver_incmajor}}}
-!! {{{psemver_incminor}}}
-!! {{{psemver_incpatchlevel}}}
-!! {{{psemver_setversion}}}
-!! {{{psemver_setprelease}}}
-!! {{{psemver_compare_prelease}}}
-!! {{{psemver_setmetadata}}}
-!! {{{psemver_addmetadata}}}
-!! {{{psemver_compare_metadata}}}
-!! {{{psemver_copy}}}
-!! {{{psemver_build}}}
-!! {{{psemver_setvar}}}
-
-
-
!! {{{service}}}
-!! {{{service_start}}}
-{{{
-démarrer le service $1 de façon inconditionnelle
-}}}
-!! {{{service_startm}}}
-{{{
-démarrer le service $1 s'il n'est pas déjà démarré
-}}}
-!! {{{service_stop}}}
-{{{
-arrêter le service $1 de façon inconditionnelle
-}}}
-!! {{{service_stopm}}}
-{{{
-arrêter le service $1 s'il n'est pas déjà arrêté
-}}}
-!! {{{service_reload}}}
-{{{
-recharger le service $1
-}}}
-!! {{{service_status}}}
-{{{
-tester/afficher le status du service $1
-}}}
-
-
-
!! {{{read_data}}}
-!! {{{dump_data}}}
-!! {{{compute_local_sysinfos}}}
-!! {{{compute_remote_sysinfos}}}
-!! {{{ensure_sysinfos}}}
-{{{
-Essayer de déterminer les valeurs des variables $1(=SYSNAME), $2(=SYSDIST)
-et $3(=SYSVER) en fonction des valeurs des autres. Cette fonction est à
-utiliser quand on récupère cette information de la part de l'utilisateur,
-et qu'il faut compléter
-}}}
-!! {{{get_sysinfos_desc}}}
-{{{
-Afficher une chaine de la forme SYSNAME/SYSDIST/SYSVER qui décrit le
-système actuel
-}}}
-!! {{{check_sysinfos}}}
-{{{
-Tester si le système courant ($MYSYSNAME, $MYSYSDIST, $MYSYSVER, $MYBITS)
-correspond à au moins un des arguments.
-Il est possible de spécifier des variables différentes pour tester le
-système courant avec l'option --vars qui doit être spécifiée en premier:
-check_sysinfos --vars sysname sysdist sysver bits -d debian
-Les options -s, -d, -v, -b permettent respectivement de vérifier le
-système, la distribution, la version et le nombre de bits. Il est possible
-de spécifier plusieurs tests à effectuer, e.g.:
-check_sysinfos -d debian ubuntu -b 64
-pour tester si l'on est sur une distribution debian ou ubuntu *et* sur un
-système 64 bits
-Note: avec l'option --vars, il peut arriver que sysname, sysdist ou sysver
-ne soient pas des tableaux mais des variables scalaires, surtout si elles
-sont fournies par l'utilisateur. Il est conseillé dans ce cas de tester
-toutes les possibilités quand on vérifie une valeur, e.g.:
-check_sysinfos --vars sysname sysdist sysver bits -s linux64 linux32 linux
-pour tester si on est sur un système linux
-Avec l'option -v, il est possible de suffixer la valeur avec + ou - selon
-que l'on veut toutes les versions situées après ou avant la version
-spécifiée. Attention, à cause d'une limitation de l'implémentation, il
-faut alors impérativement filtrer aussi sur la distribution, e.g:
-check_sysinfo -d debian -v lenny+
-pour tester si on est en lenny ou en squeeze.
-De même, l'option -d accepte aussi de suffixer la valeur avec + ou -, mais
-cela n'a actuellement de sens qu'avec les version de MacOS X. Il faut
-aussi impérativement filtrer sur le système, e.g:
-check_sysinfos -s macosx -d 10.5+
-}}}
-!! {{{on_debian}}}
-{{{
-Tester si on est sur debian. charger le module debian si c'est le cas.
-Si une commande $1..@ est spécifiée, la lancer, mais il n'est alors plus
-possible de lancer des tests plus spécifiques avec __on_debian()
-}}}
-!! {{{on_debian:}}}
-!! {{{on_stretch}}}
-!! {{{on_jessie}}}
-!! {{{on_wheezy}}}
-!! {{{on_squeeze}}}
-!! {{{on_default}}}
-
-
-
!! {{{template_list}}}
-{{{
-Soit $N le séparateur --, lister les fichiers des répertoires sources
-$2..$(N-1) qui seraient fusionnés avec template_merge() ou supprimés avec
-template_unmerge() du répertoire destination $1. Si des chemins sont spécifiés
-avec les arguments $(N+1)..@, ne traiter que les fichiers qui correspondent à
-ces spécifications. Exemple:
-template_list destdir srcdirs... -- specs...
-}}}
-!! {{{template_merge}}}
-{{{
-Soit $N le séparateur --, copier dans le répertoire destination $1 les
-fichiers des répertoires sources $2..$(N-1) correspondant aux spécifications
-$(N+1)..@, si ces fichiers n'ont pas été modifiés dans le répertoire de
-destination.
-Les fichiers sources ayant l'extension .template sont ignorés par défaut, sauf
-s'ils sonts demandés explicitement. Exemple:
-template_merge destdir srcdirs... -- specs...
-}}}
-!! {{{template_unmerge}}}
-{{{
-Soit $N le séparateur --, supprimer du répertoire destination $1 les fichiers
-provenant des répertoires sources $2..$(N-1) et qui n'ont pas été modifiés. Si
-des chemins sont spécifiés avec les arguments $(N+1)..@, ne traiter que les
-fichiers qui correspondent à ces spécifications. Exemple:
-template_unmerge destdir srcdirs... -- specs...
-}}}
-!! {{{template_cleandest}}}
-{{{
-Supprimer dans le répertoire de destination $1 tous les répertoires vides.
-Cette fonction est habituellement utilisée après template_unmerge()
-Ignorer les chemins qui contiennent .git/ et .svn/
-}}}
-!! {{{template_diff}}}
-{{{
-Afficher les différences entre les fichiers du répertoire de destination $1 et
-les fichiers des répertoires sources $2..@
-}}}
-!! {{{template_srcdir}}}
-{{{
-Obtenir le chemin vers le répertoire source de templates $1, situé dans
-ULIBDIR/templates
-}}}
-!! {{{templatectl_config}}}
-{{{
-Obtenir le chemin vers le fichier de configuration pour le répertoire $1
-Si $2==nohideconfig, utiliser le nom CONFIG.conf, sinon utiliser par défaut
-.CONFIG sauf si le fichier CONFIG.conf existe
-}}}
-!! {{{templatectl_loadvars}}}
-{{{
-Charger les valeurs des variables depuis le fichier $1
-Les variables suivantes doivent être définies:
-- Le tableau TEMPLATECTL_DEFAULTS permet de donner une valeur par défaut aux
-variables mentionnées dans TEMPLATE_STATIC_VARS. C'est une liste de valeurs
-de la forme 'name=value'
-- Le tableau TEMPLATECTL_VARS contient des variables supplémentaires
-spécifiées par l'utilisateur. C'est une liste de valeurs de la forme
-'name=value'
-- TEMPLATE_STATIC_VARS doit contenir une liste de noms de variables qui
-peuvent être remplacés dans les fichiers de template.
-- TEMPLATE_DYNAMIC_VARS contient une liste de noms de variables valides, mais
-qui ne doivent pas être remplacés, en effet, ils sont utilisés pour le
-déploiement des fichiers.
-- TEMPLATE_NOWRITE_VARS contient une liste de noms de variables qui ne
-devraient pas être écrits dans le fichier des variables, sauf si elles
-reçoivent une valeur explicite de la part de l'utilisateur. Ce tableau est
-mis à jour lors de l'analyse du tableau TEMPLATECTL_VARS
-}}}
-!! {{{templatectl_writevars}}}
-{{{
-Ecrire les variables dans le fichier $1
-}}}
-!! {{{templatectl_list_vars}}}
-{{{
-Afficher les valeurs des variables
-}}}
-!! {{{templatectl}}}
-{{{
-Fonction de haut niveau qui facilite l'utilisation des fonctions template_*
-définir la fonction __display_templatectl_help() pour l'affichage de l'aide
-- Le tableau TEMPLATECTL_SRCDIRS doit contenir la liste des répertoires
-sources pour les templates. Alternativement, il est possible de définir la
-variable TEMPLATECTL_SRCDIR s'il n'y a qu'un seul répertoire source pour le
-template
-- TEMPLATECTL_CONFIG est le nom de base du fichier à partir duquel sont
-chargées les variables et dans lequel sont écrites les variables avec
-l'option --write-vars
-Si le nom de base est CONFIG, le fichier s'appelera .CONFIG si l'option
---hide-config est utilisée (par défaut) ou CONFIG.conf si l'option
---no-hide-config est utilisée
-Les variables de template_loadvars() sont aussi prises en compte
-}}}
-
-
-
!! {{{twget_version}}}
-{{{
-lire le numéro de version dans le fichier $1
-}}}
-!! {{{twdump_header}}}
-{{{
-lire et afficher le contenu avant-storeArea du tiddlywiki $1
-}}}
-!! {{{twdump_footer}}}
-{{{
-lire et afficher le contenu après-storeArea du tiddlywiki $1
-}}}
-!! {{{twdump_storeArea}}}
-{{{
-lire et afficher le storeArea dans le tiddlywiki $1
-}}}
-!! {{{twreplace_storeArea}}}
-{{{
-dans le tiddlywiki $1, remplacer le storeArea par le fichier $2 (par défaut, lu sur stdin)
-}}}
-!! {{{twupgrade}}}
-{{{
-mettre à jour le tiddlywiki $1 sur la base du tiddlywiki plus récent $2
-}}}
-!! {{{twdate_curtwp}}}
-{{{
-obtenir la date courante dans le format "dd/mm/YYYY HH:MM" exprimée dans
-l'heure locale
-$1 est éventuellement la date exprimée en nombre de secondes depuis
-l'epoch, exprimée dans l'heure locale
-}}}
-!! {{{twdate_tid2twp}}}
-{{{
-Transformer $1, une date de la forme "YYYYmmddHHMM" exprimée dans le
-timezone UTC en une chaine "dd/mm/YYYY HH:MM" exprimée dans l'heure locale
-Si $1 n'est pas dans le bon format, ne rien afficher
-}}}
-!! {{{twdate_curtid}}}
-{{{
-obtenir la date courante dans le format "YYYYmmddHHMM" exprimée dans le
-timezone UTC
-$1 est éventuellement la date exprimée en nombre de secondes depuis
-l'epoch, exprimée dans l'heure locale
-}}}
-!! {{{twdate_twp2tid}}}
-{{{
-Transformer $1, une date de la forme "dd/mm/YYYY HH:MM" exprimée en heure
-locale en une chaine "YYYYmmddHHMM" exprimée dans le timezone UTC
-Si $1 n'est pas dans le bon format, ne rien afficher
-}}}
-!! {{{twdump_tiddlers}}}
-{{{
-dumper les tiddlers du fichier $1 généré avec twdump_storeArea() sous
-forme d'une liste d'appel de fonction '__tiddler_data title creator
-modifier created modified tags changecount content'
-Les arguments de la fonction sont les valeurs brutes du tiddler, qui ont
-simplement été corrigées avec unquote_html()
-}}}
-!! {{{dump_tiddler}}}
-!! {{{twdump_twpage}}}
-{{{
-Dumper le contenu de la twpage $1 sous forme d'un appel à une function
-'__twpage_data title creator modifier created modified tags changecount
-content'
-Les arguments de la fonction sont les valeurs brutes de la twpage, sauf
-que le champ modified contient toujours la date de dernière modification
-du fichier.
-}}}
-!! {{{twwrite_tiddler}}}
-{{{
-Ecrire sur STDOUT le tiddler correspondant aux paramètres sont spécifiés
-sur la ligne de commande. Les arguments sont les valeurs brutes prises de
-la twpage, telles qu'elles sont générées par twdump_twpage()
-}}}
-!! {{{twcheck_twpage_modified}}}
-{{{
-Vérifier si la twpage $1 peut être écrasée par un tiddler dont la date de
-modification est $2, de format "YYYYmmddHHMM" exprimée dans le timezone
-UTC
-C'est le cas si le fichier $1 n'existe pas, ou a une date de modification
-antérieure à $2
-}}}
-!! {{{twcheck_twpage_newtwpage}}}
-{{{
-Vérifier si la twpage $1 peut être écrasée par la twpage $2
-C'est le cas si le fichier $1 n'existe pas, ou a une date de modification
-antérieure à $2
-}}}
-!! {{{twwrite_twpage}}}
-{{{
-Ecrire dans le répertoire courant le fichier correspondant au tiddler dont
-les paramètres sont spécifiés sur la ligne de commande. Les arguments sont
-les valeurs brutes prises du tiddler, telles qu'elles sont générées par
-twdump_tiddlers()
-Retourner 0 si le fichier a été écrasé, 1 s'il n'a pas été écrasé parce
-qu'il n'a pas été modifié, 2 s'il n'a pas été écrasé parce qu'il est plus
-récent.
-Si TW_VERBOSE=1, afficher un message informatif lors de l'export
-}}}
-!! {{{export_to_twpages}}}
-{{{
-Exporter tous les tiddlers du tiddlywiki $1 dans le répertoire $2
-}}}
-!! {{{import_from_twpages}}}
-{{{
-Remplacer les tiddlers du tiddlywiki $1 par les twpages du répertoire $2
-}}}
-
-
-
!! {{{udir_check}}}
-{{{
-Vérifier si le fichier $1 existe
-Si $1 est un répertoire, prendre $1/.udir
-}}}
-!! {{{udir_create_maybe}}}
-{{{
-Si le fichier $1 n'existe pas, le créer comme un template .udir
-Si $1 est un répertoire, prendre $1/.udir
-}}}
-!! {{{udir_dump}}}
-{{{
-Dumper toutes les variables définies pour le fichier $1
-Si $1 est un répertoire, prendre $1/.udir
-}}}
-!! {{{udir_eval}}}
-{{{
-Evaluer la commande "$2..$*" dans le contexte des variables définies pour
-le répertoire $1. La commande est évaluée dans un sous-shell pour ne pas
-polluer l'espace de noms courant.
-}}}
-!! {{{udir_dump_all}}}
-{{{
-Dumper toutes les variables définies pour le répertoire $1 et *tous ses
-parents* jusqu'à la racine
-}}}
-!! {{{udir_eval_all}}}
-{{{
-Evaluer la commande "$2..$*" dans le contexte des variables définies pour
-le répertoire $1 et *tous ses parents* jusqu'à la racine
-}}}
-!! {{{udir_parse}}}
-{{{
-Dans le fichier $1, lire les noms des variables
-Si $1 est un répertoire, prendre $1/.udir
-Les noms des variables sont placés dans le tableau $2(=UDIR_VARS), et les noms
-des tableaux sont placés dans le tableau $3(=UDIR_ARRAYS)
-note: les regex qui sont entre "" au lieu de // le sont à cause d'un bug
-de awk sous macosx
-}}}
-!! {{{udir_update}}}
-{{{
-Dans le fichier $1, mettre à jour les variables $2..*
-Si $1 est un répertoire, prendre $1/.udir
-Chaque argument de cette fonction est de la forme name[=value]
-Si value n'est pas précisée, la variable obtient une valeur nulle
-(i.e. var=)
-Si la variable ne figure pas dans le fichier, elle est rajoutée à la fin
-du fichier.
-Cette fonction nécessite gawk.
-}}}
-!! {{{write_unseen}}}
-!! {{{udir_edit}}}
-
-
-

-
-
-
!! {{{uenv_update_dir}}}
-{{{
-Mettre à jour l'ordre de chargement pour le répertoire $1 qui contient des
-fichiers de profil pour le shell. L'ordre dans lequel le fichiers de
-profil doivent être chargé est écrit dans le fichier $1/.source_in_order
-Si $2 est spécifié, il s'agit d'un fichier temporaire utilisé pour les
-calculs de l'ordre des chargements.
-$3(=$1) est le répertoire de destination. Si $1 est un répertoire de
-préparation temporaire, on peut spécifier grâce à $3 quel est le
-répertoire final après préparation.
-S'ils sont spécifiés, les arguments $4..* sont des répertoires contenant
-des fichiers de profils supplémentaires qu'il faut considérer aussi. Dans
-ce cas, $3 est ignoré.
-}}}
-!! {{{uenv_set_destdirs}}}
-!! {{{uenv_sourced_in}}}
-{{{
-vérifier que l'un des fichiers $2..$* est sourcé dans $1
-}}}
-!! {{{uenv_configure_profiles}}}
-!! {{{uenv_install_profiles}}}
-
-
-
!! {{{uinc}}}
-
-
-
!! {{{uinst}}}
-{{{
-lancer uinst en déclarant les variables locales, de façon à ne pas polluer
-l'environnement de l'appelant.
-}}}
-!! {{{uinst_nolocal}}}
-{{{
-Interface en mode ligne de commande pour uinst. Appeler cette fonction
-avec les paramètres de la ligne de commande, e.g.:
-uinst_nolocal "$@"
-}}}
-
-
-
!! {{{eerror}}}
-!! {{{die}}}
-!! {{{uprovided}}}
-{{{
-Tester si le module $1 a déjà été chargé par urequire
-}}}
-!! {{{uprovide}}}
-{{{
-Spécifier que le module $1 a été sourcée, ou prétendre que c'est le cas.
-Retourner 1 si le module était déjà pourvu, 0 si c'est la première fois
-qu'on le pourvoit
-}}}
-!! {{{urequire}}}
-{{{
-Sourcer un module recherché dans ULIBDIRS
-Le module DEFAULTS est traité de façon particulière: si le fichier associé
-n'est pas trouvé, charger base, pretty, sysinfos et compat à la place
-Si un module n'est pas trouvé, quitter le script avec die()
-}}}
-!! {{{ulibadd}}}
-{{{
-Ajouter $1 au chemin de recherche de urequire
-}}}
-!! {{{ulibsync}}}
-{{{
-Synchroniser les modules de ulib dans le répertoire $1
-}}}
-!! {{{ulibver}}}
-{{{
-Vérifier que la version actuelle de ulib est au moins à la version $1
-(inclue) et éventuellement au plus à la version $2 (exclue)
-}}}
-!! {{{ulibver_require}}}
-
-
-
!! {{{eerror}}}
-!! {{{die}}}
-!! {{{uprovided}}}
-!! {{{uprovide}}}
-!! {{{urequire}}}
-!! {{{ulibadd}}}
-!! {{{ulibsync}}}
-!! {{{ulibver}}}
-!! {{{ulibver_require}}}
-
-
-
!! {{{vcs_getvcs_help}}}
-!! {{{vcs_getvcs}}}
-!! {{{vcs_getroot_help}}}
-!! {{{vcs_getroot}}}
-!! {{{vcs_getrepos_help}}}
-!! {{{vcs_getrepos}}}
-!! {{{vcs_geturl_help}}}
-!! {{{vcs_geturl}}}
-!! {{{vcs_vcs_help}}}
-!! {{{vcs_vcs}}}
-!! {{{vcs_add_help}}}
-!! {{{vcs_add}}}
-{{{
-le répertoire de référence est le répertoire du premier fichier ajouté
-}}}
-!! {{{vcs_remove_help}}}
-!! {{{vcs_remove}}}
-{{{
-le répertoire de référence est le répertoire du premier fichier supprimé
-}}}
-!! {{{vcs_copy_help}}}
-!! {{{vcs_copy}}}
-{{{
-le répertoire de référence est le répertoire de destination
-}}}
-!! {{{vcs_move_help}}}
-!! {{{vcs_move}}}
-{{{
-le répertoire de référence est le répertoire de destination
-}}}
-!! {{{vcs_mkdir_help}}}
-!! {{{vcs_mkdir}}}
-{{{
-le répertoire de référence est le répertoire du premier répertoire créé
-}}}
-!! {{{vcs_commit_help}}}
-!! {{{vcs_commit}}}
-!! {{{vcs_status_help}}}
-!! {{{vcs_status}}}
-!! {{{vcs_update_help}}}
-!! {{{vcs_update}}}
-!! {{{vcs_push_help}}}
-!! {{{vcs_push}}}
-!! {{{vcs_diff_help}}}
-!! {{{vcs_diff}}}
-!! {{{vcs_tag_help}}}
-!! {{{vcs_tag}}}
-!! {{{git_getrepos}}}
-!! {{{git_geturl}}}
-!! {{{git_have_annex}}}
-!! {{{git_add}}}
-!! {{{git_remove}}}
-!! {{{git_copy}}}
-!! {{{git_move}}}
-!! {{{git_mkdir}}}
-!! {{{git_commit}}}
-!! {{{git_status}}}
-!! {{{git_update}}}
-!! {{{git_push}}}
-!! {{{git_diff}}}
-!! {{{git_tag}}}
-!! {{{git_check_gitvcs}}}
-!! {{{git_ensure_gitvcs}}}
-!! {{{git_list_branches}}}
-!! {{{git_list_rbranches}}}
-!! {{{git_list_pbranches}}}
-{{{
-lister les branches locales et celles qui existent dans l'origine
-$1(=origin) et qui pourraient devenir une branche locale avec la commande
-git checkout -b
-}}}
-!! {{{git_have_branch}}}
-!! {{{git_have_rbranch}}}
-!! {{{git_get_branch}}}
-!! {{{git_get_branch_remote}}}
-!! {{{git_get_branch_merge}}}
-!! {{{git_get_branch_rbranch}}}
-!! {{{git_is_branch}}}
-!! {{{git_have_remote}}}
-!! {{{git_track_branch}}}
-!! {{{git_ensure_branch}}}
-{{{
-retourner 0 si la branche a été créée, 1 si elle existait déjà, 2 en cas d'erreur
-}}}
-!! {{{git_check_cleancheckout}}}
-{{{
-vérifier qu'il n'y a pas de modification locales dans le dépôt
-correspondant au répertoire courant.
-}}}
-!! {{{git_ensure_cleancheckout}}}
-!! {{{git_is_ancestor}}}
-{{{
-vérifier que la branche $1 est un ancêtre direct de la branche $2, qui
-vaut par défaut refs/remotes/${3:-origin}/$1
-note: cette fonction retourne vrai si $1 et $2 identifient le même commit
-}}}
-!! {{{git_should_ff}}}
-{{{
-vérifier si la branche $1 devrait être fast-forwardée à partir de la
-branche d'origine $2, qui vaut par défaut refs/remotes/${3:-origin}/$1
-note: cette fonction est similaire à git_is_ancestor(), mais retourne
-false si $1 et $2 identifient le même commit
-}}}
-!! {{{git_should_push}}}
-{{{
-vérifier si la branche $1 devrait être poussée vers la branche de même nom
-dans l'origine $2(=origin), parce que l'origin peut-être fast-forwardée à
-partir de cette branche.
-}}}
-!! {{{git_fast_forward}}}
-{{{
-vérifier que la branche courante est bien $1, puis tester s'il faut la
-fast-forwarder à partir de la branche d'origine $2, puis le faire si c'est
-nécessaire. la branche d'origine $2 vaut par défaut refs/remotes/origin/$1
-}}}
-!! {{{git_is_merged}}}
-{{{
-vérifier que les branches $1 et $2 ont un ancêtre commun, et que la
-branche $1 a été complètement fusionnée dans la branche destination $2
-}}}
-!! {{{git_annex_initial}}}
-{{{
-sur le dépôt $1 fraichement cloné, vérifier s'il faut faire git annex
-init. Si oui, l'initialiser avec le nom d'hôte, et récupérer tous les
-fichiers annexés
-retourner 1 si une erreur s'est produite
-}}}
-!! {{{svn_getrepos}}}
-!! {{{svn_geturl}}}
-!! {{{svn_add}}}
-!! {{{svn_remove}}}
-!! {{{svn_copy}}}
-!! {{{svn_move}}}
-!! {{{svn_mkdir}}}
-!! {{{svn_commit}}}
-!! {{{svn_status}}}
-!! {{{svn_update}}}
-!! {{{svn_push}}}
-!! {{{svn_diff}}}
-!! {{{svn_tag}}}
-!! {{{cvs_getrepos}}}
-!! {{{cvs_geturl}}}
-!! {{{cvs_add}}}
-!! {{{cvs_remove}}}
-!! {{{cvs_copy}}}
-!! {{{cvs_move}}}
-!! {{{cvs_mkdir}}}
-!! {{{cvs_commit}}}
-!! {{{cvs_status}}}
-!! {{{cvs_update}}}
-!! {{{cvs_push}}}
-!! {{{cvs_diff}}}
-!! {{{cvs_tag}}}
-
-
-
!! {{{virsh_filter}}}
-{{{
-filtrer une sortie liste de virsh. En pratique, ne prendre que les lignes
-non vides à partir de la ligne "----*"
-}}}
-!! {{{virsh_list}}}
-!! {{{virsh_pool_list}}}
-!! {{{guess_vm_type}}}
-{{{
-Afficher hn, kvm, vmware, virtualbox ou openvz suivant que l'on est
-*probablement* respectivement sur une machine physique, une machine
-virtuelle kvm, vmware, virtualbox, openvz
-XXX pour le moment, seuls openvz, kvm et hn sont supportés
-}}}
-
-
-
!! {{{compute_webobjects_prefixes}}}
-!! {{{recompute_webobjects_prefixes}}}
-!! {{{get_NEXT_ROOT_prefix}}}
-!! {{{get_WOROOT_prefix}}}
-!! {{{get_LOCALROOT_prefix}}}
-!! {{{get_SYSTEMFRAMEWORKS_prefix}}}
-!! {{{get_WOEXTENSIONS_prefix}}}
-!! {{{get_WOFRAMEWORKS_prefix}}}
-!! {{{get_WOAPPLICATIONS_prefix}}}
-!! {{{get_WOCONFIGURATION_prefix}}}
-!! {{{get_WOAUTOSTART_prefix}}}
-!! {{{get_WOLOGS_prefix}}}
-!! {{{get_WOVERSION_prefix}}}
-!! {{{is_wobundle}}}
-{{{
-Tester si $1 a un nom de bundle valide, c'est à dire avec l'extension .woa
-ou .framework
-}}}
-!! {{{is_woappdir}}}
-{{{
-Tester si $1 est un répertoire d'application webobjects. Le test est
-effectué sur le contenu du bundle, pas sur le nom (utiliser is_wobundle()
-pour cela)
-}}}
-!! {{{is_wofwkdir}}}
-{{{
-Tester si $1 est un répertoire de framework webobjects. Le test est
-effectué sur le contenu du bundle, pas sur le nom (utiliser is_wobundle()
-pour cela)
-}}}
-!! {{{get_app_winclspth}}}
-{{{
-calculer la valeur de Contents/Windows/CLSSPATH.txt pour l'application $1
-}}}
-!! {{{get_infofile}}}
-{{{
-Obtenir le chemin vers le fichier Info.plist dans le répertoire de
-resource du bundle $1
-}}}
-!! {{{read_infofile}}}
-{{{
-Lire la version et le numéro de release dans le fichier $1 (chemin vers
-Info.plist) et les placer dans les variables $2(=version) et $3(=release)
-Retourner 1 si un erreur s'est produite, par exemple si le fichier $1
-n'existe pas ou n'est pas accessible en lecture
-}}}
-!! {{{write_infofile}}}
-{{{
-Ecrire $2 (la version) et $3 (le numéro de release) dans le fichier $1
-(chemin vers Info.plist)
-Retourner 1 si un erreur s'est produite, par exemple si le fichier $1
-n'existe pas
-}}}
-!! {{{get_jawotoolsfile}}}
-{{{
-Obtenir le chemin vers le fichier jawotools.properties dans le bundle $1
-}}}
-!! {{{read_jawotoolsfile}}}
-{{{
-lire le fichier de propriété $1 et placer les valeurs dans les variables
-$2(=version), $3(=releaseDate), $4(=description)
-}}}
-!! {{{save_jawotoolsfile}}}
-{{{
-écrire le fichier de propriété $1 avec les valeurs version ($2),
-releaseDate ($3) et description ($4)
-}}}
-!! {{{get_versionfile}}}
-{{{
-Obtenir le chemin vers le fichier VERSION.txt dans le répertoire de
-resource du bundle $1
-}}}
-!! {{{get_configfile}}}
-{{{
-obtenir le chemin vers le fichier de configuration du répertoire de
-resource du bundle
-$1=bundle ou resdir (appdir/Contents/Resources ou fwkdir/Resources)
-}}}
-!! {{{searchreplace_classpath}}}
-{{{
-Dans les fichiers classpath de l'application $1, remplacer $2 par $3. Si
-$3 est vide, la ligne est supprimée
-}}}
-!! {{{dump_jars}}}
-{{{
-Afficher les jars des frameworks utilisés par l'application $1
-}}}
-!! {{{dump_frameworks}}}
-{{{
-Afficher les frameworks utilisés par l'application $1
-}}}
-!! {{{remove_framework}}}
-{{{
-supprimer le framework $2 (nom de base) des fichiers de classpath du
-bundle d'application $1
-}}}
-!! {{{add_framework}}}
-{{{
-s'il n'y existe pas déjà, ajouter le framework $2 (nom de base ou chemin
-absolu) aux fichiers de classpath du bundle d'application $1
-}}}
-!! {{{fix_jars_case}}}
-{{{
-Vérifier que la casse des jars de tous les frameworks utilisés par
-l'application $1 est conforme au système de fichier
-}}}
-!! {{{verifix_bundle}}}
-{{{
-vérifier et corriger le bundle $1. Pour une application, on vérifie que le
-script est exécutable. Pour un framework, on vérifie que le framework est
-conforme au modèle des framework générés par WebObjects.
-}}}
-!! {{{compute_fapps}}}
-{{{
-Placer dans le tableau $1(=fappnames) la liste des noms de bundle
-d'applications qui dépendent du framework $2
-Cette opération est faite à partir des informations sur le système de
-fichier. Elle ne peut donc concerner qu'une installation locale.
-}}}
-!! {{{woraurl}}}
-{{{
-Faire une requête avec la méthode $1 sur l'url $2 avec le payload $3 (par
-exemple pour la méthode POST). la réponse est disponible dans le fichier
-$WORAURL_DATA, $4(=http_code) contient le code de réponse.
-Retourner 0 en cas de succès, ou une valeur différente de zéro si un
-erreur se produit (typiquement, 3 pour une erreur du serveur, 1 pour une
-réponse applicative, comme par exemple si l'application n'existe pas)
-Les codes de réponse 2xx et 417 sont des succès
-Les autres codes (à priori 4xx ou 5xx) sont des erreurs
-note: le code 417 est utilisé par le moniteur pour répondre "Non", par
-opposition à 200 utilisé pour répondre "OUI"
-}}}
-!! {{{wogeturl}}}
-!! {{{splitins}}}
-{{{
-Analyser le nom $1, qui peut être de forme '', 'Name.woa',
-'Name.framework', 'App' ou 'Instance-N' (où N est un nombre), et
-initialiser les variables $2(=type) et $3(=name)
-Si $1=="", type=all et name=""
-Si $1==Name.woa, type=woa et name=Name.woa
-Si $1==Name.framework, type=fwk et name=Name.framework
-Si $1==App, type=app et name=App
-si $1==App-N, type=ins et name=App-N
-}}}
-!! {{{create_wodirs_maybe}}}
-!! {{{check_autostart}}}
-{{{
-vérifier la présence du fichier $WOAUTOSTART. Si ce n'est pas le cas, le
-créer avec le contenu du tableau $1
-}}}
-!! {{{get_autostart_order}}}
-{{{
-Initialiser le tableau $1 avec la liste donnée dans le fichier
-$WOAUTOSTART
-}}}
-!! {{{apply_autostart_order}}}
-{{{
-Réordonner les valeurs $3..* selon la liste donnée dans le tableau $2,
-puis placer le résultat dans le tableau $1. $2 doit être construit avec
-get_autostart_order(). Si $2 n'est pas spécifié, la liste est construite
-localement.
-Si le tableau contient des lignes de délai @N, replacer les délais après
-les applications appropriées
-}}}
-!! {{{wotaskd_stop}}}
-!! {{{wotaskd_start}}}
-!! {{{javamonitor_stop}}}
-!! {{{womonitor_stop}}}
-!! {{{javamonitor_start}}}
-!! {{{womonitor_start}}}
-!! {{{woservices_stop}}}
-!! {{{woservices_start}}}
-
-
-
!! {{{date2version}}}
-!! {{{woconf}}}
-!! {{{wotag}}}
-!! {{{woinst}}}
-
-
-
!! {{{wom__statistics}}}
-{{{
-Afficher les statistiques pour le serveur $1, avec éventuellement le mot
-de passe $2
-}}}
-!! {{{wom__info}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et afficher des informations sur l'application $1 (par défaut, all)
-}}}
-!! {{{wom__info_filter}}}
-{{{
-filtrer le résultat de wom__info en ne gardant que les tags
-name, state, activeSessions, autoRecover, deaths, host, port
-}}}
-!! {{{wom_info}}}
-{{{
-Contacter le moniteur sur l'hôte $3, avec éventuellement le mot de passe
-$4, et initialiser le tableau $1 avec une liste de valeurs quotés de la
-forme:
-"'name' 'state' 'activeSessions' 'autoRecover' 'deaths' 'host' 'port'"
-concernant l'application $2 (par défaut, toutes les applications). Notez
-qu'il y a une ligne par instance d'application
-Ces valeurs peuvent être utilisées comme arguments d'une fonction. par
-exemple:
-wom_info appinfos "" host pw
-for args in "${appinfos[@]}"; do
-eval "userfunc $args"
-done
-}}}
-!! {{{wom_getValidAndRunning}}}
-{{{
-Placer la liste des applications valides dans le tableau $1(=valid_apps)
-et la liste des applications qui tournent dans le tableau
-$2=(running_apps), en contactant le moniteur sur l'hôte $3, avec
-éventuellement le mot de passe $4.
-}}}
-!! {{{show_appinfo}}}
-{{{
-Afficher des informations sur une application. Les arguments doivent être
-le résultat de la fonction wom_info()
-}}}
-!! {{{wom_running}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et tester si l'application $1 (par défaut, all) tourne actuellement
-}}}
-!! {{{wom_start}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et démarrer l'application $1 (par défaut, all)
-}}}
-!! {{{wom_stopped}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et tester si l'application $1 (par défaut, all) est actuellement arrêtée
-}}}
-!! {{{wom_stop}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et arrêter l'application $1 (par défaut, all)
-}}}
-!! {{{wom_forceQuit}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et forcer l'arrêt de l'application $1 (par défaut, all)
-}}}
-!! {{{wom_turnScheduledOn}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et activer le flag scheduled sur l'application $1 (par défaut, all)
-}}}
-!! {{{wom_turnScheduledOff}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et désactiver le flag scheduled sur l'application $1 (par défaut, all)
-}}}
-!! {{{wom_turnRefuseNewSessionOn}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et activer le flag refuseNewSession sur l'application $1 (par défaut,
-all)
-}}}
-!! {{{wom_turnRefuseNewSessionOff}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et désactiver le flag refuseNewSession sur l'application $1 (par
-défaut, all)
-}}}
-!! {{{wom_turnAutoRecoverOn}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et activer le flag autoRecover sur l'application $1 (par défaut, all)
-}}}
-!! {{{wom_turnAutoRecoverOff}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et désactiver le flag autoRecover sur l'application $1 (par défaut,
-all)
-}}}
-!! {{{wom_bounce}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et redémarrer l'application $1 (par défaut, all) en mode bounce
-}}}
-!! {{{wom_clearDeaths}}}
-{{{
-Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3, et effacer le compte des morts suspectes pour l'application $1 (par
-défaut, all)
-}}}
-!! {{{wom__getApplications}}}
-{{{
-Obtenir des information sur la définition de l'application $1 (ou de
-toutes les applications si $1=="") en contactant le moniteur sur l'hôte $2
-avec éventuellement le mot de passe $3. Le résultat est un flux xml,
-chaque application étant défini dans un tag <MApplications>. Si un erreur
-se produit, l'erreur est dans un tag <Strings>
-}}}
-!! {{{wom__getApplications_filter}}}
-{{{
-filtrer le résultat de wom__getApplications en ne gardant que les tags
-name, unixPath, macPath, winPath
-}}}
-!! {{{wom_getApplications}}}
-{{{
-Obtenir la liste des applications définies en contactant le moniteur sur
-l'hôte $3 avec éventuellement le mot de passe $4, et initialiser le
-tableau $1 avec une liste de valeurs quotées de la forme:
-"'name' 'unixPath' 'macPath' 'winPath'"
-concernant l'application $2 (par défaut, toutes les applications)
-Ces valeurs peuvent être utilisées comme arguments d'une fonction. par
-exemple:
-wom_getApplications appinfos "" host pw
-for args in "${appinfos[@]}"; do
-eval "userfunc $args"
-done
-}}}
-!! {{{wom_addApplication}}}
-{{{
-Ajouter une application nommée $1 en contactant le moniteur sur l'hôte $2,
-avec éventuellement le mot de passe $3.
-Soit le nom Name, par défaut l'exécutable se trouve dans
-WOAPPLICATIONS/Name.woa/Name et les logs dans /var/log/WebObjects, et le
-flag autoRecover est activé
-XXX supporter la possibilité de modifier les valeurs par défaut
-}}}
-!! {{{wom_addInstance}}}
-{{{
-Ajouter une instance sur localhost pour l'application nommée $1 en
-contactant le moniteur sur l'hôte $2, avec éventuellement le mot de passe
-$3.
-XXX supporter la possibilité de modifier les valeurs par défaut
-}}}
-!! {{{check_compute_apps_localhost}}}
-{{{
-si les arguments de compute_apps contiennent des bundles de framework, il
-faut avoir accès au système de fichier local. vérifier si l'un des
-arguments $2..* est un framework. si c'est le cas, vérifier que l'hôte $1
-est localhost.
-retourner 0 si c'est ok, 1 s'il y a des frameworks et que host n'est pas
-localhost
-}}}
-!! {{{compute_apps}}}
-{{{
-Remplir le tableau $1(=apps) avec la liste des applications correspondant
-aux arguments $3...*
-Un bundle de framework (Name.framework) est remplacé par la liste des
-bundles d'applications qui dépendent de ce framework. Cette information
-est obtenue en consultant le système de fichier local.
-Un bundle d'application est remplacé par la liste des applications qui
-sont définies pour ce bundle. Cette information est obtenue en consultant
-le tableau généré par wom_getApplications(), dont le nom est $2
-Les arguments de la forme @N sont ignorés, ils correspondent à des délais
-à respecter lors du démarrage de l'application
-}}}
-!! {{{get_error_msg}}}
-!! {{{start_apps}}}
-{{{
-Démarrer les applications $3..$* en contactant le moniteur sur l'hôte $1
-avec le mot de passe éventuel $2
-Les variables globales enable_autorecover et force_enable_autorecover
-permettent respectivement d'activer l'autoRecover après le démarrage de
-l'application et de forcer l'activation de l'autoRecover même si
-l'instance tournait déjà.
-Un argument de la forme @N provoque une attente de N secondes. Ceci permet
-de placer un temps d'attente entre le démarrage de certaines applications.
-}}}
-!! {{{stop_apps}}}
-{{{
-Arrêter les applications $3..$* en contactant le moniteur sur l'hôte $1
-avec le mot de passe éventuel $2
-Les variables globales disable_autorecover et force_disable_autorecover
-permettent respectivement de désactiver l'autoRecover après l'arrêt de
-l'application et de forcer la désactivation de l'autoRecover même si
-l'instance ne tournait pas.
-L'option {-a ARRAY} permet de remplir ARRAY avec la liste des applications
-qui ont été effectivement arrêtées. Cette option si elle est spécifiée
-doit être en premier
-Pour compatibilité avec start_apps, les arguments de la forme @N sont
-ignorés. Il n'y a pas de temps d'attente entre les applications lors de
-l'arrêt.
-}}}
-!! {{{bounce_apps}}}
-{{{
-Redémarrer les applications $3..$* en mode bounce en contactant le
-moniteur sur l'hôte $1 avec le mot de passe éventuel $2
-Pour compatibilité avec start_apps, les arguments de la forme @N sont
-ignorés. Il n'y a pas de temps d'attente entre les applications lors du
-redémarrage.
-}}}
-
-
-
!! {{{wosign_setup_maybe}}}
-!! {{{wosign_jar}}}
-!! {{{wosignable}}}
-!! {{{wosign}}}
-{{{
-Signer un bundle, les jars d'un répertoire, ou un jar
-L'option -f force la resignature des jars d'un répertoire ou d'un
-bundle. Elle force aussi la signature d'un jar, même s'il semble qu'il
-soit la version signée d'un autre jar
-on présuppose que wosignable a retourné true
-}}}
-
-
-
!! {{{wot_config}}}
-{{{
-Afficher la configuration de wotaskd
-}}}
-
-
-
{{{
-ulibshell: Lancer un shell après avoir chargé des modules de ulib
-
-USAGE
-    ulibshell [options] [args...]
-
-OPTIONS
-    -r module
-        Spécifier un module à charger avec urequire. Plusieurs modules peuvent
-        être spécifiés en les séparant par ':'
-
-Un shell est lancé dans lequel les modules spécifiés sont chargés. Par défaut,
-seul le module DEFAULTS est chargé. Les arguments sont passés inchangés au
-shell.
-}}}
-
-
-
{{{
-ulibsync: Copier les librairies ulib et/ou pyulib
-
-USAGE
-    ulibsync [options] destdir
-
-OPTIONS
-    -u  Copier ulib
-    -p  Copier pyulib
-}}}
-
-
-
{{{
-ulink: déplacer, supprimer, copier un fichier ou un lien
-
-Quand on déplace ou qu'on copie un lien, la destination du lien est mise à jour
-
-USAGE
-    ulink mv files... dest
-    ulink cp files... dest
-    ulink rm files...
-
-OPTIONS
-    -d UPDATEDIR
-        Chercher dans UPDATEDIR tous les liens qui pointent vers le fichier
-        concerné, et mettre à jour ces liens après avoir déplacé le fichier, ou
-        supprimer ces liens si le fichier est supprimé.
-}}}
-
-
-
{{{
-umatch: Afficher le résultat d'une recherche par regexp et compter
-éventuellement leurs occurences
-
-USAGE
-    umatch [options] [regexp]
-
-Chaque ligne *entière* de stdin est mise en correspondance avec l'expression
-regulière qui doit avoir la syntaxe de awk. S'il y a correspondance, afficher
-soit toute l'expression matchée, soit chaque groupe s'il y a des expressions
-parenthésées, chacun des groupes étant séparé par le caractère sep.
-
-Si l'expression régulière n'est pas spécifiée, elle vaut par défaut '.*' ce qui
-fait que toutes les lignes correspondent. Ceci peut être utile avec les options
--s et -c.
-
-Certaines expressions régulières sont prédéfinies. regexp peut avoir l'une des
-valeurs prédéfinies suivantes:
-
-    ip --> [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
-
-OPTIONS
-    -F sep
-        Spécifier le caractère séparateur en sortie s'il faut afficher des
-        champs multiples. Par défaut, utiliser le caractère ':'
-        Si un séparateur vide est spécifié, le séparateur standard de awk est
-        utilisé.
-    -s  Trier le résultat
-    -C FIELDNUM
-    -c, --count
-        Compter les occurences successives de la valeur du champ FIELDNUM, et
-        afficher une ligne de la forme 'count<sep>last_line' pour chaque groupe,
-        last_line étant la dernière occurence du groupe. L'option -c correspond
-        à '-C 0', c'est à dire compter les occurences successives de toute les
-        lignes.
-        Le séparateur utilisé pour calculer le numéro de champ est sep, spécifié
-        avec l'option -F.
-    -a, --all-lines
-        Avec les options -c/-C, afficher toutes les lignes des occurences
-        successives au lieu de seulement la ligne de la dernière occurence. Ceci
-        est utile surtout avec l'option -C, pour voir les différences avec les
-        différentes lignes.
-    -m, --multiple
-        Avec les options -c/-C, n'afficher que les lignes dont le compte est
-        supérieur à 1. Avec l'option -a, les groupes contigus sont séparés par
-        une ligne '--'
-}}}
-
-
-
{{{
-umirror: faire un miroir d'un site web
-
-USAGE
-    umirror [options] url [wget_options]
-
-OPTIONS
-    -l
-        Convertir les liens pour consultation locale
-}}}
-
-
-
{{{
-USAGE:
-    upassword -p [-f aeskeyfile] [clear [salts...]]
-    upassword -p [-f aeskeyfile] -j JKEY codetu [salts...]
-    upassword -p -f aeskeyfile -k crypted [salts...]
-    upassword -f aeskeyfile -G [password [salt]]
-    upassword -f aeskeyfile -s
-    upassword -f aeskeyfile -e clear
-    upassword -f aeskeyfile -d crypted
-    upassword --batch
-
-OPTIONS
-    -p, --hash-password
-        Crypter un mot de passe (option par défaut). Si le mot de passe en clair
-        et/ou le salt ne sont pas spécifiés, ils sont choisis au hasard.
-    -j, --clear-is-codetu JKEY
-        Indiquer que l'argument clear est un numéro d'étudiant, à partir duquel
-        il faut générer le mot de passe. Cette option n'est valide qu'avec -p
-    -k, --clear-is-crypted
-        Indiquer que l'argument clear doit d'abord être décrypté avec la clé AES
-        spécifiée avant utilisation. Cette option n'est valide qu'avec -p
-    -G, --aes-genkey
-        Générer une clé AES pour utilisation avec les options -s, -e, -d
-    -s, --aes-showkey
-        Afficher encodée en base64 la clé AES contenue dans le fichier spécifié
-    -e, --aes-encrypt
-        Crypter un mot de passe avec la clé AES spécifiée
-    -d, --aes-decrypt
-        Décrypter un mot de passe avec la clé AES spécifiée
-    -f, --aes-keyfile
-        Spécifier le fichier contenant la clé AES. Cette option est obligatoire
-        avec les options -G, -s, -e et -d
-    --shell
-        Afficher les valeurs pour évaluation par le shell
-
-MODE BATCH
-Utiliser l'option --batch active le mode batch. Dans ce mode, chaque ligne est
-un ensemble d'arguments, comme si on avait lancé le script à plusieurs reprises.
-L'analyseur est limité: le découpage des arguments est fait sur les espaces.
-Les lignes commençant par # sont ignorées.
-Si une ligne commence par --batch-after, alors cette ligne est affichée après
-chaque résultat. Ceci permet de générer un script qui peut être évalué.
-
-Voici un exemple:
-    upassword --batch <<EOF
-    --batch-after process_password1 args
-    --shell
-    --shell fixed-password1
-    --batch-after process_password2 args
-    --shell fixed-password2
-    EOF
-Le résultat serait quelque chose comme:
-    clear='<random-password>'
-    ... # toutes les valeurs lm, ntlm, crypt, sha, xsha, ssha, md5, smd5
-    process_password1 args
-    clear='fixed-password1'
-    ... # toutes les valeurs lm, ntlm, crypt, sha, xsha, ssha, md5, smd5
-    process_password1 args
-    clear='fixed-password2'
-    ... # toutes les valeurs lm, ntlm, crypt, sha, xsha, ssha, md5, smd5
-    process_password2 args
-}}}
-
-
-
{{{
-update-nutools: mettre à jour nutools
-}}}
-
-
-
{{{
-uprefix: Afficher les préfixes valides pour uinst
-
-USAGE
-    uprefix -l|--dump|prefix...
-
-OPTIONS
-    -l
-        Afficher la liste des préfixes valides
-    --dump
-        Afficher la liste des préfixes valides et leurs valeurs
-    prefix
-        Afficher la valeur du préfixe spécifié
-}}}
-
-
-
{{{
-uproject: Outil pour gérer des projets
-
-USAGE
-    uproject cmd [args]
-
-COMMANDS
-    getvcs [dir]
-        Afficher le type de VCS pour dir.
-    getroot [dir]
-        Si dir est un répertoire versionné, retourner le répertoire racine du
-        projet versionné.
-    getrepos [dir]
-        Si dir est un répertoire versionné, retourner l'url du repository du
-        projet versionné.
-    geturl [dir]
-        Si dir est un répertoire versionné, retourner son url dans le
-        repository.
-    fold [dir]
-    unfold [dir]
-        Utiliser uinc pour défaire (resp. refaire) toutes les inclusions des
-        fichiers de dir. Cela nécessite qu'un fichier .udir soit configuré à la
-        racine du projet avec uinc=true
-    vcs [args]
-        Appeler le gestionnaire de gestion approprié avec les arguments donnés.
-    add files...
-        Ajouter les fichiers files dans le gestionnaire de version.
-    remove files...
-        Supprimer les fichiers versionnés files.
-    copy from to
-        Copier le fichier versionné from vers le fichier to.
-    move from to
-        Renommer le fichier versionné from vers le fichier to.
-    mkdir dir
-        Créer un nouveau répertoire versionné.
-    commit message [files...]
-        Enregistrer les modifications (par défaut sur tous les fichiers
-        modifiés) avec le commentaire message.
-    status
-        Afficher l'état des fichiers versionnés et non versionnés.
-    update [-x]
-        Mettre à jour la copie locale avec la copie sur le serveur.
-        -x  Ne pas mettre à jour les références externes (si appliquable)
-        -n, --no-autoff
-            Ne pas faire de fast-forward automatique pour toutes les branches
-            traquées. Par défaut, s'il n'y a pas de modifications locales,
-            essayer de fast-fowarder toutes les branches locales traquées.
-    diff [options]
-        Afficher les différences.
-        -l  Afficher les différences non commitées (par défaut)
-        -c  Afficher les différences en passe d'être commitées (si appliquable)
-        -r REV
-            Afficher les différences depuis la révision REV.
-        -R  Afficher les modifications effectuées depuis la dernière release.
-
-    clone git@host:path/to/repo [destdir]
-        Cloner un dépôt distant. Initialiser git annex si le dépôt contient des
-        fichiers annexés. Récupérer aussi ces fichiers avec 'git annex get'
-
-    crone git@host:path/to/repo [destdir]
-        Créer un dépôt distant sur gitolite, puis le cloner
-
-    develop
-    release
-    hotfix
-        Démarrer le travail sur une branche respectivement de développement, de
-        release, ou de correction de bugs. Lancer chaque commande avec --help
-        pour les détails. Nécessite git.
-
-    archive
-        Créer une archive du projet courant. Nécessite git.
-
-    annex [args]
-        Lancer git annex avec les arguments spécifiés.
-    xadd
-    xunlock
-    xdrop
-    xwhereis
-    xwebapp
-        Chacune de ces commandes est un raccourci vers la commande
-        correspondante de git annex, sans le préfixe 'x'
-    xsync
-        Sur un dépot où git-annex est activé, lancer 'git annex sync' si on est
-        en mode indirect ou 'git annex sync --content' si on est en mode direct.
-        Sur un dépôt où git-annex n'est pas activé, faire l'équivalent des
-        commandes 'git add -A && git commit && git pull && git push'
-    xcopy
-    xmove
-    xget
-        Comme ci-dessus, mais si la commande s'exécute sans erreur, lancer
-        aussi 'git annex sync'
-    xinitial
-        Sur un dépôt fraichement cloné, initialiser le dépôt avec 'annex init'
-        s'il contient des fichiers annexés. Récupérer aussi ces fichiers avec
-        'annex get'
-    xconfig-export [dir]
-        Installer des hooks pour qu'un dépôt puisse être utilisé pour servir des
-        fichiers, par exemple avec un serveur web. Plus précisément, un hook
-        post-receive est créé avec la commande 'git annex merge', et un hook
-        post-update est créé avec la commande 'git update-server-info'
-
-    printml [-t TYPE]
-        Afficher le modeline pour un fichier du type spécifié
-    addml [-t TYPE] file
-        Ajouter un modele pour le fichier spécifié, s'il n'en a pas déjà un.
-        Si nécessaire, forcer le type du fichier au lieu de l'autodétecter
-    new [options] file [template options]
-        Créer un nouveau fichier à partir d'un modèle.
-        Avant le nom du fichier, les options suivantes sont valides:
-        -t TEMPLATE
-            Spécifier le modèle de fichier à utiliser. Par défaut, le modèle
-            à utiliser est déduit de l'extension ou du nom du fichier.
-        -e  Editer le fichier après l'avoir créé.
-        Après le nom du fichier, toutes les options sont spécifiques au modèle
-        utilisé pour créer le nouveau fichier. Utiliser l'option --help pour
-        avoir une description des options disponibles.
-}}}
-
-
-
{{{
-uscrontab: lancer une suite de commande en respectant une planification de type cron
-
-USAGE
-    uscrontab [options] [/path/to/uscrontab] [var=value...]
-    uscrontab -e [/path/to/uscrontab]
-    uscrontab -l
-
-La première forme du script doit normalement être lancé toutes les minutes par
-une tâche cron. Utiliser l'option --install pour ajouter automatique la ligne
-dans la crontab de l'utilisateur.
-
-Avec la première forme du script, le fichier spécifié est traité. Si aucun
-fichier n'est spécifié, fusionner s'il existe le fichier
-    /var/local/uscrontab/users/jclain
-avec chacun des fichiers du répertoire
-    /var/local/uscrontab/users.d/jclain
-dans un fichier temporaire, puis exécuter le fichier résultat avec le nom
-virtuel
-    /var/local/uscrontab/jclain
-note: le nom virtuel est utilisé pour le verrouillage avec --lock
-
-A chaque lancement de ce script, le fichier /path/to/uscrontab spécifié est
-examiné pour déterminer quels commandes doivent être exécutées. Ce fichier est
-composé de lignes dans un format particulier, qui sont analysées et traitées
-dans l'ordre.
-
-Quelles que soient les lignes qui sont sélectionnées pour l'exécution, elles
-sont garanties de s'exécuter dans l'ordre du fichier, l'une après l'autre.
-
-Les définitions var=value mentionnées sur la ligne de commande sont des
-définitions de variables à effectuer avant de lancer les commandes.
-
-Les lignes commençant par # sont des commentaires et sont ignorées
-
-== Définitions de variables et exécution de commandes ==
-
-    Les lignes de la forme suivante sont des définitions de variable:
-
-        [export] var="valeur de la variable"
-
-    Ces lignes sont des définitions de variable bash qui sont exécutées telles
-    quelles. Il n'est donc pas autorisé de mettre des espaces autour de =. Par
-    exemple, les lignes suivantes sont des erreurs de syntaxe:
-
-        var = bad
-        var=pas de quotes autour de la valeur
-
-    alors que celles-ci sont correctes:
-
-        var=ok
-        var="valeur avec des espaces"
-        var='on peut utiliser des quotes aussi'
-
-    Il est possible de manipuler les variables de type PATH avec une syntaxe
-    particulière de l'opérateur d'assignation. Les opérateurs += et %= utilisent
-    uaddpath(), #= utilise uinspath() et -= utilise udelpath(). Par exemple, les
-    lignes suivantes ajoutent respectivement /usr/local/nutools puis enlèvent
-    /opt/rogue au PATH:
-
-        PATH+=/usr/local/nutools
-        PATH-=/opt/rogue
-
-    Bien sûr, il ne faut pas oublier de quoter les espaces:
-
-        PATH+="/path/to/dir with spaces"
-
-    La syntaxe ?= permet de définir la valeur d'une variable si elle n'est pas
-    déjà définie:
-
-        var?=default
-
-    Les lignes de la forme suivante permettent d'exécuter une commande qui est
-    exécutée systématiquement et ignore la planification:
-
-        $one-line-command
-
-    Une variante permet de spécifier des commandes sur plusieurs lignes.
-    ATTENTION! ${ et $} doivent être tous seuls sur la ligne.
-
-        ${
-        several
-        commands
-        ...
-        $}
-
-    Ces commandes sont exécutées systématiquement et ignorent la planification.
-    On peut s'en servir notamment pour lire un fichier de configuration qui
-    définit des variables ou des fonctions:
-
-        $source path/to/file
-
-    Le code d'erreur de ces commandes est ignoré, contrairement à ce qui se
-    passe pour les commandes qui font l'objet d'une planification.
-
-== Planification de commandes ==
-
-    Les autres lignes doivent être au format d'une ligne de crontab:
-
-        minutes hours days months dows command-line
-
-    command-line peut être n'importe quelle ligne de commande bash, pourvu
-    qu'elle soit sur une seule ligne.
-
-    Certaines extensions par rapport à la syntaxe de crontab sont autorisées. Il
-    est en particulier possible de spécifier plusieurs planifications pour une
-    seule commande. Par exemple, les lignes suivantes permettent d'exécuter
-    'command' toutes les heures ET à 1h05:
-
-        0 * * * *
-        5 1 * * * command
-
-    Il est aussi possible d'utiliser la même planification pour plusieurs
-    commandes sans devoir répéter la définition de la planification. Les lignes
-    suivantes planifient command1 et command2 toutes les heures:
-
-        0 * * * * command1
-                  command2
-
-    Pour être prise en compte, la ligne command2 doit commencer par au moins un
-    espace ou une tabulation. Pour la lisibilité, la syntaxe suivante est
-    supportée aussi:
-
-        0 * * * *
-          command1
-          command2
-
-    Les deux formats peuvent être utilisés ensemble. Par exemple les lignes
-    suivantes exécutent command1 et command2 toutes les heures ET à 1h05:
-
-        0 * * * *
-        5 1 * * * command1
-                  command2
-
-    Par défaut, le script s'arrête à la première commande planifiée qui retourne
-    avec un code d'erreur. Il est possible d'ignorer le code d'erreur d'une
-    commande avec nostop, e.g:
-
-        0 * * * * nostop command
-
-    Cf aussi l'option --continuous pour modifier le comportement par défaut
-
-== Fonctions disponibles ==
-
-    La fonction check_pidfile() est disponible, et permet de vérifier qu'une
-    opération n'est pas déjà en cours. Si cette fonction est utilisée, il ne
-    faut pas modifier la valeur de -k. Par exemple:
-
-        0 1 * * *
-          check_pidfile /path/to/pid [args]
-          long-running-script
-
-    check_pidfile() doit être utilisée toute seule sur la ligne et s'utilise
-    avec les argument suivants:
-
-        check_pidfile PIDFILE [DESC] [BARRIER]
-
-    - PIDFILE est le fichier de PID qui est vérifié
-    - DESC est la description du traitement qui est effectué. La valeur par
-      défaut est "Une synchronisation". Si le fichier de PID est présent, le
-      message suivant est affiché:
-        DESC est en cours.
-        Si vous pensez que c'est une erreur, veuillez vérifier le process de pid PID
-        puis supprimez le cas échéant le fichier PIDFILE
-    - BARRIER est un fichier qui est créé avec le contenu 'PID' s'il n'existe
-      pas encore, et si la vérification du fichier de PID est faite avec succès.
-      La présence de ce fichier peut-être vérifiée par un processus externe pour
-      empêcher par exemple de mettre à jour les scripts pendant qu'il sont en
-      train de tourner.
-      Son contenu peut être examiné pour connaître le PID du processus qui l'a
-      créé initialement. Le fichier est automatiquement supprimé à la fin de ce
-      script.
-      Attention: ce fichier n'est pas un verrou, il peut être supprimé à tout
-      moment. Notamment, si deux scripts sont configurés pour créer le même
-      fichier barrière, le premier script supprimera le fichier barrière avant
-      la fin de l'exécution du second script.
-
-    La fonction remove_pidfile() permet de supprimer un fichier de pid pour
-    spécifier qu'une opération est terminée. Considérons l'exemple suivant:
-
-        0 1 * * *
-          check_pidfile /path/to/pid
-          script1
-          script2
-          remove_pidfile /path/to/pid
-          script3
-
-    Dans cet exemple, il ne faut pas qu'une autre occurence de script1 tourne
-    pendant que script2 tourne. Par contre, plusieurs occurences de script3
-    peuvent tourner en parallèle.
-
-    La fonction elogto() permet de spécifier un fichier vers lequel toutes les
-    sorties sont redirigées.
-
-OPTIONS
-    -A, --install
-        Installer une planification toutes les minutes du script dans la crontab
-        de l'utilisateur. Si l'argument /path/to/uscrontab n'est pas spécifié,
-        c'est une planification générique qui exécute les fichiers par défaut
-        qui est installée.
-    -R, --uninstall
-        Désinstaller la planification toutes les minutes du script de la crontab
-        de l'utilisateur. Si l'argument /path/to/uscrontab est spécifié, cette
-        instance est désinstallée. Sinon, ne désinstaller que la planification
-        générique.
-    -d, --disable-only
-        Avec l'option -R, désactiver la planification au lieu de la supprimer.
-    -e, --edit
-        Lancer un editeur pour modifier l'uscrontab spécifiée. Si aucun fichier
-        n'est spécifié, éditer /var/local/uscrontab/users/jclain
-    -a, --add
-        Installer un script uscrontab dans le répertoire approprié. L'argument
-        doit être de la forme [name:]/path/to/uscrontab
-        Si name n'est pas spécifié, le nom de base du fichier spécifié est
-        utilisé. Si name est vide ou vaut $USER (soit jclain en l'occurence),
-        copier le fichier spécifié vers le chemin /var/local/uscrontab/users/jclain
-        Sinon, copier le fichier spécifié vers /var/local/uscrontab/users.d/jclain/name
-    -r, --remove
-        Supprimer le script uscrontab spécifié. L'argument doit être le nom du
-        script à supprimer.  Si l'argument n'est pas spécifié ou vaut $USER
-        (soit jclain en l'occurence), supprimer le fichier /var/local/uscrontab/users/jclain
-        s'il existe
-    -l, --list
-        Si l'argument /path/to/crontab est spécifié, afficher le contenu de ce
-        fichier. Sinon, lister les contenus des fichiers crontab qui sont
-        exécutés avec la planification actuelle. Si une planification générique
-        est installée, ou si aucune planification n'est en cours, afficher le
-        contenu du fichier
-            /var/local/uscrontab/users/jclain
-        et chacun des fichiers du répertoire
-            /var/local/uscrontab/users.d/jclain
-    -n, --fake
-        Afficher au lieu de les exécuter les commandes qui doivent être lancées
-    -P, --pause-for NBMINS
-        Désactiver les planifications pendant NBMINS minutes. Utiliser -1 pour
-        désactiver les planifications sans limite de durée. Pendant la période
-        de pause, toutes les invocations de uscrontab n'ont aucun effet, sauf si
-        on utilise l'option --force
-    -Y, --unpause
-        Réactiver les planifications après une mise en pause
-    -p, --pause
-        Désactiver les planifications pendant 1 journée. Equivalent à -P 1440
-    -f, --force
-        Forcer l'exécution de la planification, même si elle a été mise en pause
-        avec l'option --pause
-
-OPTIONS AVANCEES
-    --lock LOCKFILE
-        Inscrire dans le fichier spécifié des informations permettant d'éviter
-        les invocations simultanées de ce script. Si selon ce fichier, le script
-        tourne depuis plus de 8 heures, un message d'erreur
-        est consigné et un message d'avertissement est affiché au plus une fois.
-        Utiliser --lock '' pour désactiver cette fonctionnalité
-        Par défaut, si ce script est lancé en root, le fichier utilisé pour le
-        verrouillage est de la forme /var/run/uscrontab/abspath/to/crontab
-        Si le script est lancé avec un compte utilisateur, aucun verrouillage
-        n'est effectué.
-    --lockdelay LOCKDELAY[=8]
-        Changer le nombre d'heures pendant lesquelles on autorise le script a
-        verrouiller l'exécution avant d'afficher un avertissement.
-    -c, --continuous
-        Par défaut, ce script s'arrête à la première commande planifiée qui
-        retourne avec un code d'erreur. Notez que les codes d'erreur des
-        commandes sans planification sont toujours ignorés. Avec cette option,
-        ce script ne s'arrête jamais, bien qu'il retourne toujours un code
-        d'erreur si une erreur s'est produite.  Il est possible d'ignorer le
-        code d'erreur pour une commande en particulier avec le préfixe nostop
-    -k, --stopec EXITCODE[=101]
-        Spécifier un code d'erreur spécial qui arrête ce script sans erreur, ou
-        '' pour désactiver cette fonctionnalité. Ceci permet en début de script
-        de faire des tests par exemple sur l'environnement avant de lancer les
-        scripts planifiés. Si l'environnement ne convient pas, il suffit au
-        script de contrôle de retourner le code d'erreur spécifique pour arrêter
-        le traitement.
-    --show-ctnow
-        Afficher l'heure de référence au format crontab 'min hou day mon dow'
-        Cette valeur peut être utilisée avec l'option --force-ctnow dans des
-        tests pour reproduire une condition spécifique.
-    --force-ctnow 'min hou day mon dow'
-        Pour le développement ou des tests, forcer la valeur de l'heure de
-        référence. Il faut respecter le format, sinon les résultats ne sont pas
-        garantis. Le mieux est de reprendre le résultat de l'option --show-ctnow
-        en le modifiant un peu si nécessaire.
-}}}
-
-
-
{{{
-ussh: se connecter par ssh à un ou plusieurs hôtes
-
-USAGE
-    ussh [options] hosts
-    ussh [options] @hostsfile
-    ussh -r hosts
-    ussh --parse hosts
-
-OPTIONS
-    hosts
-    @hostsfile
-        Spécifier un ou plusieurs hôtes distants sur lequels faire la connexion.
-        Pour spécifier plusieurs hôtes, il faut les séparer 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
-            'root@{host1,host2}.univ.run'
-        La forme @hostsfile permet de lire la liste des hôtes depuis le fichier
-        hostsfile, à raison d'un hôte par ligne.
-
-Toutes les options de ssh sont reconnues. Les options longues suivantes sont
-reconnues comme alias de certaines options courtes de ssh:
-    --quiet
-        alias de -q, activer le mode non verbeux
-    --tty
-        alias de -t, forcer l'allocation d'un TTY
-    --login USER
-        alias de -l, spécifier le user avec lequel se connecter
-    --port PORT
-        alias de -p, spécifier le port sur lequel se connecter
-
-Les options suivantes sont exclusives à ce script:
-    -d, --domain DOMAIN
-        Spécifier un domaine par défaut pour les hôtes qui sont spécifiés sans
-        domaine.
-    -z, --ssh SSH
-        Spécifier l'exécutable à utiliser pour lancer ssh.
-    -r, --remove
-        Lancer 'ssh-keygen -R' pour chacun des hôtes spécifiés avant de s'y
-        connecter. Par exemple:
-            ussh -r host.tld
-        est équivalent à:
-            ssh-keygen -R host.tld
-            ssh-keygen -R host
-            ssh-keygen -R 10.10.1.5
-            ssh host.tld
-        si l'adresse ip de host.tld est 10.10.1.5
-        Quand cette option est spécifié, l'option -j est reconnue et permet de
-        NE PAS se reconnecter à l'hôte juste après avoir nettoyé les clés. Avec
-        l'option -j, TOUS les arguments sont des noms d'hôte puisqu'aucune
-        connexion n'est effectuée.
-    --exec
-    --no-exec
-        Avec --exec, si un seul hôte est spécifié, lancer le processus ssh avec
-        exec, pour éviter d'encombrer la mémoire. C'est l'option par défaut.
-        Avec --no-exec, ne jamais utiliser exec pour lancer ssh.
-    --parse
-        Afficher la définition des variables ssh, options, hosts et args qui
-        permettent d'effectuer la connexion à partir d'un autre script. Exemple:
-            eval "$(ussh --parse args...)"
-            for host in "${hosts[@]}"; do
-                ${exec:+exec} "$ssh" "${options[@]}" "$host" "${args[@]}"
-            done
-    --cc
-        Assumer que nutools est installé sur l'hôte distant, et y lancer uwatch
-        avec l'option --cc, pour permettre de garder la connexion active dans le
-        cadre d'une redirection de port.
-
-Si la variable UTOOLS_USSH_RSYNC_SUPPORT contient une valeur non vide, l'analyse
-des arguments s'arrête à la première valeur qui n'est pas une option, afin de
-permettre l'utilisation de ce script avec l'option -e de rsync.
-}}}
-
-
-
{{{
-usysinfos: Afficher les informations sur le système
-
-USAGE
-    usysinfos [query]
-
-Si la requête est spécifiée, tester si le système courant correspond à la
-requête. Voir la doc de check_sysinfos() pour le format de la requête.
-
-Sinon, afficher les informations sur le système courant.
-}}}
-
-
-
{{{
-utempl: Créer un nouveau fichier à partir d'un modèle
-
-USAGE
-    utempl [options] file [template options]
-
-OPTIONS
-Avant le nom du nouveau fichier, les options suivantes peuvent être utilisées:
-    -t TEMPLATE
-        Spécifier le modèle de fichier à utiliser. Par défaut, le modèle
-        à utiliser est déduit de l'extension ou du nom du fichier.
-    -e, --edit
-        Editer le fichier après l'avoir créé
-    -g, --no-edit
-        Ne pas éditer le fichier après l'avoir créé
-
-Après le nom du fichier, toutes les options sont spécifiques au modèle
-utilisé pour créer le nouveau fichier. Utiliser l'option --help pour
-avoir une description des options disponibles.
-}}}
-
-
-
{{{
-utrigger: lancer une commande en différé
-
-USAGE
-    utrigger [options] -- command [args]
-
-La commande est lancée après un certain temps, sauf si ce script est rappelé
-(auquel cas le compte est réinitialisé), ou si l'opération est annulée.
-Attention! La commande est lancée en tâche de fond, et son entrée standard est
-connectée à un fichier qui peut être provisionné avec l'option -a
-
-note: ce script ne fonctionne que sous Linux puisqu'il utilise la commande flock
-
-OPTIONS
-    -n, --name NAME
-        Spécifier un nom identifiant la tâche. Par défaut, le nom est généré à
-        partir des détails de la tâche à lancer. Ce nom est utilisé pour
-        identifier les invocations successives.
-    -f, --cmdfile CMDFILE
-        Spécifier un fichier contenant les commandes à lancer. Le fichier est
-        sourcé dans un sous-shell. Utiliser - pour lire les commandes depuis
-        l'entrée standard.
-    --rundelay RUNDELAY[=5]
-        Nombre de secondes au bout desquelles la commande est lancée. Si ce
-        script est relancé avant la fin de ce décompte, le compte est remis à
-        zéro.
-        Utiliser --rundelay '' pour désactiver cette fonctionnalité, auquel cas
-        la commande est lancée immédiatement.
-    -s, --sudo
-        Forcer l'exécution de la commande avec l'utilisateur root si ce n'est
-        pas déjà le cas
-    -a, --datafile DATAFILE
-        Accumuler des données à fournir à la commande. Les informations du
-        fichier DATAFILE (utiliser - pour l'entrée standard) sont ajoutées à un
-        fichier temporaires, et sont fournies en une seule fois à la commande
-        sur son entrée standard.
-    -A, --data DATA
-        Variante de --datafile où les données sont fournies sur la ligne de
-        commande au lieu d'un fichier externe. Si les deux options -a et -A sont
-        spécifiées, les données sont accumulées dans l'ordre --datafile puis
-        --data
-    -k, --cancel
-        Annuler le lancement planifié d'une commande. Si la commande est déjà en
-        train de tourner, cette option n'a aucun effet.
-}}}
-
-
-
{{{
-uwatch: afficher l'heure
-
-USAGE
-    uwatch [options]
-
-OPTIONS
-    -t, --time
-        Afficher l'heure (par défaut)
-    -c, --count
-        Afficher le temps écoulé depuis le lancement de ce script
-    -u, --units
-        Avec l'option --count, afficher l'unité: sec., min. ou heures
-    -o, --offset NBSEC
-        Avec l'option --count, spécifier un nombre de secondes à partir duquel
-        compter
-    -s, --step NBSECS[=1]
-        Spécifier la période de rafraichissement de l'affichage
-    -a, --prefix PREFIX
-        Spécifier une chaine à afficher avant l'heure
-    -z, --suffix SUFFIX
-        Spécifier une chaine à afficher après l'heure
-    --cc
-        Equivalent à -c -s 5 -a 'Connecté sur $MYHOST depuis ' -z '...'
-        Permet de garantir une activité sur une connexion SSH utilisée
-        uniquement pour faire une redirection de port
-}}}
-
-
-
{{{
-vzusage: afficher des informations sur une machine virtuelle OpenVZ
-
-USAGE
-    vzusage [options] [params...]d
-
-OPTIONS
-    -b  Afficher les informations de /proc/user_beancounters
-    -f  N'afficher que les valeurs pour lesquelles failcnt > 0.
-        Implique -b
-    -z coef
-        Afficher les instructions à utiliser pour augmenter de coef% les
-        valeurs pour lesquelles failcnt > 0. Implique -f
-    -c config|veid
-        Afficher les informations du fichier de configuration plutôt que les
-        beancounters
-}}}
-
-
-
{{{
-woArchive: créer une archive de la distribution WebObjects en cours
-USAGE
-    woArchive [-n name] [-f files]
-
-OPTIONS
-    -n NAME
-        Nom de base de l'archive. Par défaut il s'agit de WebObjects-<version>
-
-    -f FILES
-        Nom de la liste des fichiers de l'archives. Par défaut il s'agit de
-        $NAME.files
-}}}
-
-
-
{{{
-woSwitch: Changer la version de WebObjects pour le système en cours
-USAGE
-    woSwitch [-f from.files] to-archive.tar.gz
-
-OPTIONS
-    -f from.files
-        Spécifier la liste des fichiers pour la version de WebObjects
-        installée. Par défaut, il s'agit de WebObjects-<version>.files
-        La liste doit correspondre à la version en cours.
-
-    -F  Forcer l'installation, même si la version en cours ne correspond pas à ce
-        qui est inscrit dans from.files
-
-    to-archive.tar.gz
-        Nom de l'archive qui contient la version à installer.
-
-Ce script ne fonctionne que sur MacOS X
-Le contenu des répertoires suivants est sauvegardé avant le changement:
-    /Library/WebObject/Applications
-    /Library/WebObject/Configuration
-    /Library/WebObject/Extensions
-Ensuite, les répertoires Applications et Configuration sont restaurés. Il faudra
-restaurer Extensions manuellement.
-}}}
-
-
-
{{{
-woctl: Contrôler des applications WebObjects
-
-USAGE
-    woctl [options] action args
-    wostart args...
-    wostop args...
-    wobounce args...
-    worestart args...
-
-OPTIONS
-    -h HOST
-        Spécifier l'hôte qui fait tourner le moniteur sous la forme host[:port]
-    -p PASSWORD
-        Spécifier le mot de passe pour le moniteur
-
-ACTIONS
-    Dans les arguments des actions ci-dessous, une application peut être
-    spécifiée sous la forme App ou App.woa. Spécifier une application revient à
-    spécifier toutes les instances configurées pour cette application.
-    Si on spécifie un framework sous la forme Fwk.framework, cela revient à
-    spécifier toutes les applications qui dépendent de ce framework.
-    Sinon, une instance individuelle est de la forme App-N, où N est un entier
-    positif.
-
-    status
-        afficher l'état des instances qui tournent actuellement
-    version
-        afficher la version de WebObjects installée
-    wotaskd
-    javamonitor
-    woservices
-        piloter wotaskd/javamonitor
-    _create
-        créer une instance par défaut dans javamonitor
-    configure
-        configurer un bundle
-    tag
-        ajouter une information de version à un bundle
-    run
-        lancer une application localement en mode debug
-    download
-        télécharger une application ou un framework
-    start apps...
-        démarrer une ou plusieurs applications
-    stop apps...
-        arrêter une ou plusieurs applications
-    restart apps...
-        relancer une ou plusieurs applications
-    bounce apps...
-        relancer une ou plusieurs applications en mode bounce
-}}}
-
-
-
{{{
-woinst: Déployer un bundle (application ou framework) de WebObjects
-
-USAGE
-    woinst [options] <file|archive|dir>...
-
-OPTIONS
-    PREFIX=value
-        Spécifier une valeur pour un préfixe, plutôt que de laisser uprefix
-        l'autodétecter. Utiliser uprefix -l pour une liste de préfixes valides.
-    -b  Redémarrer les instances en mode bounce.
-        Par défaut, les instances sont arrêtées avant le déploiement, et
-        redémarrées après
-    -W  Ne déployer que les resources web. Implique -n
-    -n  Ne pas tagger les bundles déployés avec un numéro de version. Par
-        défaut, l'utilisateur est invité à compléter des informations telles
-        que n° de version et date de release si ces informations ne sont pas
-        disponible.
-    -x CMD
-        Exécuter la commande CMD après avoir effectué le déploiement
-}}}
-
-
-
{{{
-wosign: signer les jars d'un bundle
-
-USAGE
-    wosign <app.woa|fwk.framework|file.jar>
-
-OPTIONS
-    -f  Forcer la (re)signature des jars
-    -d  Enlever la signature des jars originaux
-    -s  Signer les jar du bundle [PAR DEFAUT]
-    --init
-        Initialiser les fichiers de configuration pour la signature des bundles.
-    --sudo
-        Si le répertoire de destination des fichiers de configuration n'est
-        accessible en écriture, relancer le script en root.
-}}}
-
-
- - - - - - - - - - - -