Compare commits
36 Commits
70f77c883b
...
xelatex/ND
Author | SHA1 | Date | |
---|---|---|---|
f65c2f49ee | |||
e0f8d7dce2 | |||
2d620e845d | |||
4c0a9655de | |||
65a2d207cc | |||
d9bcf32296 | |||
8b6d7908e8 | |||
0f63031575 | |||
14cbf47527 | |||
983a8f3cf6 | |||
7edb5ee916 | |||
30a6389514 | |||
7e0d5c15e5 | |||
619b74c815 | |||
231394b1cd | |||
70ad496b06 | |||
b6a5963a3e | |||
99c62ebfce | |||
d01c139026 | |||
6345c3d081 | |||
d509550f69 | |||
3c860a893b | |||
8ad3dbba85 | |||
72d42ec54c | |||
3563d18c0c | |||
3d9fb7b622 | |||
95277a2891 | |||
eb6ee9c947 | |||
c10d63b115 | |||
277ec60b8b | |||
7377037c1a | |||
bb699bf2ee | |||
4b691783be | |||
30b3986d0e | |||
9a806c1c13 | |||
a2db5cca70 |
196
README.md
196
README.md
@ -36,3 +36,199 @@ L'ensemble des plans est regroupé et compressé sous le nom plans_de_formation.
|
||||
- compléter ces fichiers
|
||||
|
||||
Penser à générer de nouveau les plans
|
||||
|
||||
# Révision du processus de production des supports de formation
|
||||
|
||||
## Organisation du dépôt
|
||||
|
||||
Le dépôt encourage autant que possible la réutilisation et la mutualisation du contenu.
|
||||
Les éléments de contenu à inclure sont dans les dossiers _content_ et _slides_ pour les documents de type _article_ et _beamer_ respectivement.
|
||||
|
||||
Les figures sont placées à part dans le répertoire _figures_.
|
||||
|
||||
Ces éléments de contenu sont inclus dans des fichiers principaux placés dans le répertoire _presentations_.
|
||||
|
||||
Le répertoire _template_ contient des modèles de document au format jinja utilisés par le script _setup_main_tex_file.py_.
|
||||
|
||||
## setup_main_tex_file.py
|
||||
|
||||
Le script setup_main_tex_file.py permet d’organiser la procédure en proposant :
|
||||
- la création du fichier maître pour une formation
|
||||
- la création des fichiers de contenu à inclure si nécessaire
|
||||
- la mise à jour du plan de formation en fonction des éléments inclus.
|
||||
|
||||
Pour chacune de ses sous-étapes, le script propose une sous-commande.
|
||||
|
||||
### Démarrer une formation (sous-commande init)
|
||||
|
||||
```
|
||||
./setup_main_tex_file.py init -f beamer -a Cadoles -t "Formation personnalisée Scribe" -c "Conseil départemental" -d modules_EOLE_envole/Conseil_Départemental -i Cadoles -l cc-by-sa -n CD_Formation_Scribe
|
||||
```
|
||||
|
||||
Les options obligatoires sont :
|
||||
- le format (beamer ou article) : -f
|
||||
- le titre qui apparaîtra sur la page de garde ou la première diapositive : -t
|
||||
- l’emplacement, soit le sous-répertoire du répertoire presentations : -d
|
||||
- le nom du fichier (sans l’extension) qui sera créé à l’emplacement indiqué.
|
||||
|
||||
Les autres options prendront des valeurs par défaut si elles ne sont pas fournies :
|
||||
- l’auteur est Cadoles par défaut
|
||||
- l’institut, qui détermine les logos à intégrer, est Cadoles par défaut
|
||||
- la licence est la Creative Commons CC-BY-SA v2 par défaut
|
||||
- le client est XXX par défaut
|
||||
|
||||
À noter, pour la licence, que seule la CC-BY-SA v2 est disponible dans les contenus à inclure pour l’instant.
|
||||
|
||||
L’exécution de la commande précédente produit le fichier presentations/modules_EOLE_envole/Conseil_Départemental/CD_Formation_Scribe.tex
|
||||
|
||||
### Construire le contenu d’une formation
|
||||
|
||||
On peut construire une formation en éditant le fichier maître créé précédemment.
|
||||
|
||||
Ce fichier présente la configuration du module skb
|
||||
```
|
||||
\documentclass{beamer}
|
||||
|
||||
\usepackage{skb}
|
||||
|
||||
\skbconfig[
|
||||
root = ../../../,
|
||||
rep = content,
|
||||
pub = presentations,
|
||||
fig = figures,
|
||||
sli = slides,
|
||||
acr = database/acr,
|
||||
bib = database/bib
|
||||
]{skblocal.tex}
|
||||
```
|
||||
|
||||
Ces variables sont utilisées pour l’inclusion des éléments de contenu répartis dans les différents sous-dossier du dépôt.
|
||||
|
||||
Le corps du document qui est principalement intéressant est minimaliste au départ
|
||||
```
|
||||
\begin{document}
|
||||
|
||||
\skbinput[from=sli]{style/title}
|
||||
|
||||
% Corps de la formation
|
||||
%\skbinput[from=sli]{}
|
||||
|
||||
\skbinput[from=sli]{licences/license-cc-by-sa-2.0}
|
||||
|
||||
\end{document}
|
||||
```
|
||||
|
||||
Pour ajouter du contenu, on ajoute principalement des directives skbinput avec l’option from=sli (pour les documents de type beamer) et l’emplacement du fichier à partir du répertoire slides (puisque from=sli et sli = slides dans la configuration skb)
|
||||
|
||||
On peut également structurer la présentation en intercalant des directives section, subsection, etc.
|
||||
|
||||
Ces directives section, subsection, ainsi que le contenu inclu permet ensuite de construire le plan.
|
||||
|
||||
Les directives skbinput peuvent pointer vers un fichier inexistant dans un premier temps (une tentative de compilation du document dans cet état échouera bien évidemment).
|
||||
|
||||
### Consolider le contenu d’une formation (sous-commande update)
|
||||
|
||||
Par exemple, avec le corps de document suivant
|
||||
```
|
||||
\section{Introduction}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/commun/intro}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/commun/nouveautes27}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/commun/panorama-module}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/scribe/description}
|
||||
\section{Outils pédagogique Scribe}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/scribeAD/eop}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/scribeAD/eop-pratique}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/scribeAD/veyon}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/scribeAD/veyon-pratique}
|
||||
\section{Les quatre phases}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/commun/quatre_phases}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/eolebase/virtualbox}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/commun/quatre_phases-pratique}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/commun/configuration-pratique}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/commun/02-gen_config}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/commun/instance-pratique}
|
||||
\skbinput[from=sli]{modules_EOLE_envole/commun/du-contenu-inexistant}
|
||||
```
|
||||
|
||||
La plupart du contenu existe déjà.
|
||||
Seule la dernière inclusion poserait problème lors de la compilation.
|
||||
|
||||
Pour permettre de lancer des compilations sans attendre que tout le contenu soit prêt, le script propose une sous commande qui prépare le terrain en créant les fichiers de contenu manquant.
|
||||
```
|
||||
./setup_main_tex_file.py update -m presentations/modules_EOLE_envole/Conseil_Départemental/CD_Formation_Scribe.tex
|
||||
```
|
||||
|
||||
Le seul argument de cette sous-commande _update_ permet d’identifier le fichier maître.
|
||||
|
||||
Cette commande traiter toutes les directives skbinput et créer le fichier à inclure si il n’existe pas déjà.
|
||||
Elle affiche la liste des fichiers créés en retour de commande.
|
||||
|
||||
```
|
||||
$ ./setup_main_tex_file.py update -m presentations/modules_EOLE_envole/Conseil_Départemental/CD_Formation_Scribe.tex
|
||||
slides/modules_EOLE_envole/commun/du-contenu-inexistant.tex
|
||||
```
|
||||
|
||||
Ce fichier contient du texte permettant de le repérer facilement dans le document généré
|
||||
```
|
||||
\begin{frame}
|
||||
\frametitle{du-contenu-inexistant.tex}
|
||||
fichier slides/modules\_EOLE\_envole/commun/du-contenu-inexistant.tex à éditer
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
||||
```
|
||||
|
||||
### Affichage du plan (sous-commande outline)
|
||||
|
||||
À ce stade, le script propose un simple affichage sur la sortie standard du plan déduit du contenu
|
||||
```
|
||||
Introduction
|
||||
EOLE
|
||||
En quatre points
|
||||
Ce qui caractérise EOLE
|
||||
Nouveautés 2.7
|
||||
Modules disponibles en 2.7.0
|
||||
Modules disponibles à partir de la 2.7.1
|
||||
Eclair
|
||||
Zéphir/Sentinelle
|
||||
Zéphir
|
||||
Seshat
|
||||
Thot
|
||||
Seth
|
||||
Hapy
|
||||
Scribe
|
||||
Outils pédagogique Scribe
|
||||
EOP
|
||||
Mise en pratique
|
||||
Veyon
|
||||
Les fonctionnalités
|
||||
Préparation
|
||||
Mise en pratique
|
||||
Les quatre phases
|
||||
La phase d'installation
|
||||
La phase de configuration
|
||||
La phase d'instanciation
|
||||
La phase d’instanciation
|
||||
les étapes de l’instanciation
|
||||
Les comptes administrateurs locaux
|
||||
Les mots de passe
|
||||
La phase d'administration
|
||||
La phase d’administration
|
||||
VirtualBox
|
||||
Configuration de la VM Eolebase
|
||||
Configuration autonome
|
||||
Nature d’une configuration
|
||||
Types de variables
|
||||
Contraintes
|
||||
Application de configuration du module
|
||||
Les modes de l’application de configuration du module
|
||||
Les informations de debug
|
||||
sauvegarde et chargement de la configuration
|
||||
Instance
|
||||
```
|
||||
|
||||
### Génération du document
|
||||
|
||||
En alternative à la recette Makefile pas encore adaptée pour la compilation de ce nouveau format, on peut utiliser la commande rubber (paquet supplémentaire à installer)
|
||||
```
|
||||
rubber --inplace --module=xelatex presentations/modules_EOLE_envole/Conseil_Départemental/CD_Formation_Scribe.tex
|
||||
```
|
||||
|
@ -0,0 +1,7 @@
|
||||
\skbheading{Explorer la structure d’un dictionnaire Creole}
|
||||
|
||||
Un dictionnaire Creole est une description de la configuration à l’aide du format de fichier \emph{xml}.
|
||||
|
||||
fichier content/modules\_EOLE\_envole/exercices/creole-dictionnaire-structure.tex à éditer
|
||||
|
||||
\inputminted[]{xml}{./content/modules_EOLE_envole/exercices/creole.dtd}
|
237
content/modules_EOLE_envole/exercices/creole.dtd
Normal file
237
content/modules_EOLE_envole/exercices/creole.dtd
Normal file
@ -0,0 +1,237 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<!-- ===================================================================== -->
|
||||
|
||||
<!-- Definition de la DTD du fichier creole -->
|
||||
|
||||
<!-- ===================================================================== -->
|
||||
|
||||
<!--
|
||||
# Conception :
|
||||
# Eole (http://eole.orion.education.fr)
|
||||
|
||||
# Copyright (C) 2005-2018
|
||||
|
||||
# distribue sous la licence GPL-2
|
||||
|
||||
# En attendant une traduction officielle de la GPL, la notice de
|
||||
# copyright demeure en anglais.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
# Se reporter a la documentation envoyee avec le programme pour la notice.
|
||||
|
||||
-->
|
||||
<!--================ -->
|
||||
<!-- root element -->
|
||||
<!-- =============== -->
|
||||
|
||||
<!ELEMENT creole (containers | files | family_action | variables | constraints | help)*>
|
||||
|
||||
<!-- ============== -->
|
||||
<!-- files element -->
|
||||
<!-- ============== -->
|
||||
|
||||
<!ELEMENT family_action (action)>
|
||||
<!ATTLIST family_action name CDATA #REQUIRED>
|
||||
<!ATTLIST family_action description CDATA #IMPLIED>
|
||||
<!ATTLIST family_action color CDATA #IMPLIED>
|
||||
<!ATTLIST family_action image CDATA #IMPLIED>
|
||||
<!ELEMENT action ((input* | profile* | ewtapp* | tag* | saltaction*)*)>
|
||||
<!ATTLIST action type (form|custom|external|reader|apache) "custom">
|
||||
<!ATTLIST action title CDATA #REQUIRED>
|
||||
<!ATTLIST action description CDATA #REQUIRED>
|
||||
<!ATTLIST action rewrite CDATA #IMPLIED>
|
||||
<!ATTLIST action image CDATA #IMPLIED>
|
||||
<!ATTLIST action actionlist CDATA #IMPLIED>
|
||||
<!-- for apache action -->
|
||||
<!ATTLIST action apache_path CDATA #IMPLIED>
|
||||
<!ATTLIST action apache_path_type (FilenameOption|SymLinkOption) "FilenameOption">
|
||||
<!-- for external action -->
|
||||
<!ATTLIST action url CDATA #IMPLIED>
|
||||
<!ATTLIST action url_type (URLOption|SymLinkOption) "URLOption">
|
||||
<!-- for form action -->
|
||||
<!ATTLIST action save (True|False) "False">
|
||||
<!ELEMENT files ((service* | service_access* | service_restriction* | package* | file*)*)>
|
||||
|
||||
<!ELEMENT containers ((container* | all*)*)>
|
||||
|
||||
<!ELEMENT container ((service* | service_access* | service_restriction* | interface* | package* | file* | disknod* | host* | fstab*)*) >
|
||||
<!ATTLIST container name CDATA #REQUIRED >
|
||||
<!ATTLIST container id CDATA #IMPLIED >
|
||||
<!ATTLIST container group CDATA #IMPLIED >
|
||||
|
||||
<!ELEMENT all ((service* | interface* | package* | file* | disknod* | host* | fstab*)*) >
|
||||
|
||||
<!ELEMENT service (#PCDATA)>
|
||||
<!ATTLIST service servicelist CDATA #IMPLIED >
|
||||
<!ATTLIST service instance_mode (when_container|when_no_container|always) "always">
|
||||
<!ATTLIST service method (systemd|upstart|apache|network|restartonly) "systemd">
|
||||
<!ATTLIST service redefine (True|False) "False">
|
||||
|
||||
<!ELEMENT input (#PCDATA)>
|
||||
<!ELEMENT profile (#PCDATA)>
|
||||
<!ELEMENT ewtapp (#PCDATA)>
|
||||
<!ELEMENT tag (#PCDATA)>
|
||||
<!ELEMENT saltaction (#PCDATA)>
|
||||
|
||||
<!ELEMENT service_access ((port | tcpwrapper)*)>
|
||||
<!ATTLIST service_access service CDATA #REQUIRED >
|
||||
|
||||
<!ELEMENT port (#PCDATA)> <!--port_type-->
|
||||
<!ATTLIST port port_type (PortOption|SymLinkOption) "PortOption">
|
||||
<!ATTLIST port service_accesslist CDATA #IMPLIED >
|
||||
<!ATTLIST port protocol (tcp|udp) "tcp">
|
||||
|
||||
<!ELEMENT tcpwrapper (#PCDATA)> <!--tcpwrapper_type-->
|
||||
<!ATTLIST tcpwrapper tcpwrapper_type (UnicodeOption|SymLinkOption) "UnicodeOption">
|
||||
<!ATTLIST tcpwrapper service_accesslist CDATA #IMPLIED >
|
||||
|
||||
<!ELEMENT service_restriction (ip*)>
|
||||
<!ATTLIST service_restriction service CDATA #REQUIRED >
|
||||
|
||||
<!ELEMENT ip (#PCDATA)> <!--ip_type-->
|
||||
<!ATTLIST ip service_restrictionlist CDATA #IMPLIED >
|
||||
<!ATTLIST ip ip_type (NetworkOption|SymLinkOption) "NetworkOption">
|
||||
<!ATTLIST ip interface_type (UnicodeOption|SymLinkOption) "UnicodeOption">
|
||||
<!ATTLIST ip interface CDATA #REQUIRED> <!--interface_type-->
|
||||
<!ATTLIST ip netmask_type (NetmaskOption|SymLinkOption) "NetmaskOption">
|
||||
<!ATTLIST ip netmask CDATA "255.255.255.255"> <!--netmask_type-->
|
||||
|
||||
<!ELEMENT interface (#PCDATA)>
|
||||
<!ATTLIST interface interfacelist CDATA #IMPLIED >
|
||||
<!ATTLIST interface linkto CDATA #REQUIRED >
|
||||
<!ATTLIST interface ip CDATA #REQUIRED> <!--SymLinkOption-->
|
||||
<!ATTLIST interface ip_type (SymLinkOption) "SymLinkOption">
|
||||
<!ATTLIST interface mask CDATA #REQUIRED> <!--SymLinkOption-->
|
||||
<!ATTLIST interface mask_type (SymLinkOption) "SymLinkOption">
|
||||
<!ATTLIST interface bcast CDATA #IMPLIED> <!--SymLinkOption-->
|
||||
<!ATTLIST interface bcast_type (SymLinkOption) "SymLinkOption">
|
||||
<!ATTLIST interface gateway CDATA #IMPLIED> <!--SymLinkOption-->
|
||||
<!ATTLIST interface gateway_type (SymLinkOption) "SymLinkOption">
|
||||
<!ATTLIST interface method (bridge|macvlan) "macvlan" >
|
||||
<!ATTLIST interface redefine (True|False) "False">
|
||||
|
||||
<!ELEMENT host EMPTY >
|
||||
<!ATTLIST host hostlist CDATA #IMPLIED >
|
||||
<!ATTLIST host name CDATA #REQUIRED > <!--SymLinkOption-->
|
||||
<!ATTLIST host name_type (SymLinkOption) "SymLinkOption">
|
||||
<!ATTLIST host ip CDATA #REQUIRED > <!--SymLinkOption-->
|
||||
<!ATTLIST host ip_type (SymLinkOption) "SymLinkOption">
|
||||
<!ATTLIST host crossed (True|False) "True" >
|
||||
<!ATTLIST host instance_mode (when_container|when_no_container|always) "always">
|
||||
<!ATTLIST host comment CDATA #IMPLIED >
|
||||
|
||||
<!ELEMENT fstab EMPTY >
|
||||
<!ATTLIST fstab name CDATA #REQUIRED> <!--name_type-->
|
||||
<!ATTLIST fstab name_type (FilenameOption|SymLinkOption) "FilenameOption">
|
||||
<!ATTLIST fstab type (bind|normal) "bind">
|
||||
<!ATTLIST fstab fstype (auto|ext3|ext4|nfs|smb) "auto">
|
||||
<!ATTLIST fstab mount_point CDATA #IMPLIED> <!--mount_point_type-->
|
||||
<!ATTLIST fstab mount_point_type (FilenameOption|SymLinkOption) "FilenameOption">
|
||||
<!ATTLIST fstab options CDATA #IMPLIED>
|
||||
<!ATTLIST fstab checks CDATA #IMPLIED>
|
||||
<!ATTLIST fstab fstablist CDATA #IMPLIED>
|
||||
<!ATTLIST fstab instance_mode (when_container|when_no_container|always) "when_container">
|
||||
|
||||
<!ELEMENT package (#PCDATA)>
|
||||
<!ATTLIST package instance_mode (when_container|when_no_container|always) "always">
|
||||
|
||||
<!ELEMENT disknod (#PCDATA)>
|
||||
|
||||
<!ELEMENT file EMPTY>
|
||||
<!ATTLIST file name CDATA #REQUIRED >
|
||||
<!ATTLIST file name_type (UnicodeOption|SymLinkOption) "UnicodeOption">
|
||||
<!ATTLIST file source CDATA #IMPLIED>
|
||||
<!ATTLIST file mode CDATA #IMPLIED >
|
||||
<!ATTLIST file owner CDATA #IMPLIED >
|
||||
<!ATTLIST file group CDATA #IMPLIED >
|
||||
<!ATTLIST file filelist CDATA #IMPLIED >
|
||||
<!ATTLIST file mkdir (True|False) "False">
|
||||
<!ATTLIST file instance_mode (when_container|when_no_container|always) "always">
|
||||
<!ATTLIST file rm (True|False) "False">
|
||||
<!ATTLIST file del_comment CDATA #IMPLIED >
|
||||
<!ATTLIST file redefine (True|False) "False">
|
||||
|
||||
<!ELEMENT variables (family*, separators*)>
|
||||
<!ELEMENT family (#PCDATA | variable)*>
|
||||
<!ATTLIST family name CDATA #REQUIRED>
|
||||
<!ATTLIST family description CDATA #IMPLIED>
|
||||
<!ATTLIST family mode (basic|normal|expert) "basic">
|
||||
<!ATTLIST family icon CDATA #IMPLIED>
|
||||
<!ATTLIST family hidden (True|False) "False">
|
||||
<!ATTLIST family dynamic CDATA #IMPLIED>
|
||||
|
||||
<!ELEMENT variable (#PCDATA | value)*>
|
||||
<!ATTLIST variable name CDATA #REQUIRED>
|
||||
<!ATTLIST variable type CDATA #IMPLIED>
|
||||
<!ATTLIST variable description CDATA #IMPLIED>
|
||||
<!ATTLIST variable hidden (True|False) "False">
|
||||
<!ATTLIST variable disabled (True|False) "False">
|
||||
<!ATTLIST variable multi (True|False) "False">
|
||||
<!ATTLIST variable redefine (True|False) "False">
|
||||
<!ATTLIST variable exists (True|False) "True">
|
||||
<!ATTLIST variable mandatory (True|False) "False">
|
||||
<!ATTLIST variable auto_freeze (True|False) "False">
|
||||
<!ATTLIST variable auto_save (True|False) "False">
|
||||
<!ATTLIST variable mode (basic|normal|expert) "normal">
|
||||
<!ATTLIST variable remove_check (True|False) "False">
|
||||
<!ATTLIST variable remove_condition (True|False) "False">
|
||||
|
||||
<!ELEMENT separators (separator*)>
|
||||
|
||||
<!ELEMENT separator (#PCDATA)>
|
||||
<!ATTLIST separator name CDATA #REQUIRED>
|
||||
<!ATTLIST separator never_hidden CDATA #IMPLIED>
|
||||
|
||||
<!ELEMENT value (#PCDATA)>
|
||||
|
||||
<!ELEMENT constraints ((fill* | check* | condition* | auto* | group*)*)>
|
||||
<!ELEMENT fill (param*)>
|
||||
<!ATTLIST fill name CDATA #REQUIRED>
|
||||
<!ATTLIST fill target CDATA #REQUIRED>
|
||||
|
||||
<!ELEMENT check (param*)>
|
||||
<!ATTLIST check name CDATA #REQUIRED>
|
||||
<!ATTLIST check target CDATA #REQUIRED>
|
||||
<!ATTLIST check level (error|warning) "error">
|
||||
|
||||
<!ELEMENT auto ((param)*)>
|
||||
<!ATTLIST auto name CDATA #REQUIRED>
|
||||
<!ATTLIST auto target CDATA #REQUIRED>
|
||||
|
||||
<!ELEMENT condition ((target | param)+ )>
|
||||
<!ATTLIST condition name CDATA #REQUIRED>
|
||||
<!ATTLIST condition source CDATA #REQUIRED>
|
||||
<!ATTLIST condition fallback (True|False) "False">
|
||||
|
||||
<!ELEMENT group (slave+)>
|
||||
<!ATTLIST group master CDATA #REQUIRED>
|
||||
<!ATTLIST group description CDATA #IMPLIED>
|
||||
|
||||
<!ELEMENT param (#PCDATA)>
|
||||
<!ATTLIST param type (string|eole|number|container|context|python) "string">
|
||||
<!ATTLIST param name CDATA #IMPLIED>
|
||||
<!ATTLIST param hidden (True|False) "True">
|
||||
<!ATTLIST param optional (True|False) "False">
|
||||
|
||||
<!ELEMENT target (#PCDATA)>
|
||||
<!ATTLIST target type (family|filelist|servicelist|interfacelist|variable|service_accesslist|service_restrictionlist|hostlist|fstablist|actionlist) "variable">
|
||||
<!ATTLIST target optional (True|False) "False">
|
||||
|
||||
<!ELEMENT slave (#PCDATA)>
|
||||
|
||||
<!ELEMENT help ((variable* | family*)*)>
|
||||
|
@ -0,0 +1,2 @@
|
||||
\skbheading{vnstat-activation.tex}
|
||||
fichier content/modules\_EOLE\_envole/exercices/vnstat-activation.tex à éditer
|
@ -0,0 +1,2 @@
|
||||
\skbheading{vnstat-contrainte.tex}
|
||||
fichier content/modules\_EOLE\_envole/exercices/vnstat-contrainte.tex à éditer
|
@ -0,0 +1,2 @@
|
||||
\skbheading{vnstat-documentation.tex}
|
||||
fichier content/modules\_EOLE\_envole/exercices/vnstat-documentation.tex à éditer
|
@ -0,0 +1,2 @@
|
||||
\skbheading{vnstat-gestion-reseau.tex}
|
||||
fichier content/modules\_EOLE\_envole/exercices/vnstat-gestion-reseau.tex à éditer
|
@ -0,0 +1,2 @@
|
||||
\skbheading{vnstat-gestion-service.tex}
|
||||
fichier content/modules\_EOLE\_envole/exercices/vnstat-gestion-service.tex à éditer
|
@ -0,0 +1,2 @@
|
||||
\skbheading{vnstat-template.tex}
|
||||
fichier content/modules\_EOLE\_envole/exercices/vnstat-template.tex à éditer
|
16
content/modules_eole_envole/ressources/vnstat/90-vnstat
Executable file
16
content/modules_eole_envole/ressources/vnstat/90-vnstat
Executable file
@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
|
||||
#set -e
|
||||
. /usr/lib/eole/diagnose.sh
|
||||
EchoGras "*** Service de statistique réseau"
|
||||
|
||||
if [ "$(CreoleGet activer_vnstat)" = "oui" ]; then
|
||||
TestPid vnStat vnstatd
|
||||
echo
|
||||
vnstat
|
||||
else
|
||||
Inactif vnStat
|
||||
fi
|
||||
|
||||
echo
|
||||
exit 0
|
170
content/modules_eole_envole/ressources/vnstat/vnstat.conf
Normal file
170
content/modules_eole_envole/ressources/vnstat/vnstat.conf
Normal file
@ -0,0 +1,170 @@
|
||||
# vnStat 1.18 config file
|
||||
##
|
||||
|
||||
# default interface
|
||||
%set %%interfaces = []
|
||||
%for interface in %%vnstat_interface
|
||||
%set %%zone = 'nom_zone_eth' + interface
|
||||
%silent %%interfaces.append(%%getVar(%%zone))
|
||||
%end for
|
||||
Interface "%%custom_join(%%interfaces,'+']"
|
||||
|
||||
# location of the database directory
|
||||
DatabaseDir "/var/lib/vnstat"
|
||||
|
||||
# locale (LC_ALL) ("-" = use system locale)
|
||||
Locale "-"
|
||||
|
||||
# on which day should months change
|
||||
MonthRotate 1
|
||||
|
||||
# date output formats for -d, -m, -t and -w
|
||||
# see 'man date' for control codes
|
||||
DayFormat "%x"
|
||||
MonthFormat "%b '%y"
|
||||
TopFormat "%x"
|
||||
|
||||
# characters used for visuals
|
||||
RXCharacter "%"
|
||||
TXCharacter ":"
|
||||
RXHourCharacter "r"
|
||||
TXHourCharacter "t"
|
||||
|
||||
# how units are prefixed when traffic is shown
|
||||
# 0 = IEC standard prefixes (KiB/MiB/GiB/TiB)
|
||||
# 1 = old style binary prefixes (KB/MB/GB/TB)
|
||||
UnitMode 0
|
||||
|
||||
# how units are prefixed when traffic rate is shown
|
||||
# 0 = IEC binary prefixes (Kibit/s...)
|
||||
# 1 = SI decimal prefixes (kbit/s...)
|
||||
RateUnitMode 1
|
||||
|
||||
# output style
|
||||
# 0 = minimal & narrow, 1 = bar column visible
|
||||
# 2 = same as 1 except rate in summary and weekly
|
||||
# 3 = rate column visible
|
||||
OutputStyle 3
|
||||
|
||||
# used rate unit (0 = bytes, 1 = bits)
|
||||
RateUnit 1
|
||||
|
||||
# number of decimals to use in outputs
|
||||
DefaultDecimals 2
|
||||
HourlyDecimals 1
|
||||
|
||||
# spacer for separating hourly sections (0 = none, 1 = '|', 2 = '][', 3 = '[ ]')
|
||||
HourlySectionStyle 2
|
||||
|
||||
# try to detect interface maximum bandwidth, 0 = disable feature
|
||||
# MaxBandwidth will be used as fallback value when enabled
|
||||
BandwidthDetection 1
|
||||
|
||||
# maximum bandwidth (Mbit) for all interfaces, 0 = disable feature
|
||||
# (unless interface specific limit is given)
|
||||
MaxBandwidth 1000
|
||||
|
||||
# interface specific limits
|
||||
# example 8Mbit limit for eth0 (remove # to activate):
|
||||
#MaxBWeth0 8
|
||||
|
||||
# how many seconds should sampling for -tr take by default
|
||||
Sampletime 5
|
||||
|
||||
# default query mode
|
||||
# 0 = normal, 1 = days, 2 = months, 3 = top10
|
||||
# 4 = exportdb, 5 = short, 6 = weeks, 7 = hours
|
||||
QueryMode 0
|
||||
|
||||
# filesystem disk space check (1 = enabled, 0 = disabled)
|
||||
CheckDiskSpace 1
|
||||
|
||||
# database file locking (1 = enabled, 0 = disabled)
|
||||
UseFileLocking 1
|
||||
|
||||
# how much the boot time can variate between updates (seconds)
|
||||
BootVariation 15
|
||||
|
||||
# log days without traffic to daily list (1 = enabled, 0 = disabled)
|
||||
TrafficlessDays 1
|
||||
|
||||
|
||||
# vnstatd
|
||||
##
|
||||
|
||||
# switch to given user when started as root (leave empty to disable)
|
||||
DaemonUser "%%vnstat_user"
|
||||
|
||||
# switch to given user when started as root (leave empty to disable)
|
||||
DaemonGroup "%%vnstat_group"
|
||||
|
||||
# how many minutes to wait during daemon startup for system clock to
|
||||
# sync time if most recent database update appears to be in the future
|
||||
TimeSyncWait 5
|
||||
|
||||
# how often (in seconds) interface data is updated
|
||||
UpdateInterval 30
|
||||
|
||||
# how often (in seconds) interface status changes are checked
|
||||
PollInterval 5
|
||||
|
||||
# how often (in minutes) data is saved to file
|
||||
SaveInterval 5
|
||||
|
||||
# how often (in minutes) data is saved when all interface are offline
|
||||
OfflineSaveInterval 30
|
||||
|
||||
# how often (in minutes) bandwidth detection is redone when
|
||||
# BandwidthDetection is enabled (0 = disabled)
|
||||
BandwidthDetectionInterval 5
|
||||
|
||||
# force data save when interface status changes (1 = enabled, 0 = disabled)
|
||||
SaveOnStatusChange 1
|
||||
|
||||
# enable / disable logging (0 = disabled, 1 = logfile, 2 = syslog)
|
||||
UseLogging 2
|
||||
|
||||
# create dirs if needed (1 = enabled, 0 = disabled)
|
||||
CreateDirs 1
|
||||
|
||||
# update ownership of files if needed (1 = enabled, 0 = disabled)
|
||||
UpdateFileOwner 1
|
||||
|
||||
# file used for logging if UseLogging is set to 1
|
||||
LogFile "/var/log/vnstat/vnstat.log"
|
||||
|
||||
# file used as daemon pid / lock file
|
||||
PidFile "/var/run/vnstat/vnstat.pid"
|
||||
|
||||
|
||||
# vnstati
|
||||
##
|
||||
|
||||
# title timestamp format
|
||||
HeaderFormat "%x %H:%M"
|
||||
|
||||
# show hours with rate (1 = enabled, 0 = disabled)
|
||||
HourlyRate 1
|
||||
|
||||
# show rate in summary (1 = enabled, 0 = disabled)
|
||||
SummaryRate 1
|
||||
|
||||
# layout of summary (1 = with monthly, 0 = without monthly)
|
||||
SummaryLayout 1
|
||||
|
||||
# transparent background (1 = enabled, 0 = disabled)
|
||||
TransparentBg 0
|
||||
|
||||
# image colors
|
||||
CBackground "FFFFFF"
|
||||
CEdge "AEAEAE"
|
||||
CHeader "606060"
|
||||
CHeaderTitle "FFFFFF"
|
||||
CHeaderDate "FFFFFF"
|
||||
CText "000000"
|
||||
CLine "B0B0B0"
|
||||
CLineL "-"
|
||||
CRx "92CF00"
|
||||
CTx "606060"
|
||||
CRxD "-"
|
||||
CTxD "-"
|
@ -46,6 +46,7 @@
|
||||
\usepackage{graphicx}
|
||||
\usepackage{pdfpages}
|
||||
\usepackage{menukeys}
|
||||
\usepackage{minted}
|
||||
\makeindex
|
||||
|
||||
%
|
||||
|
203
content/style/preambule-programme.tex
Normal file
203
content/style/preambule-programme.tex
Normal file
@ -0,0 +1,203 @@
|
||||
\usepackage{ifxetex}
|
||||
\ifxetex
|
||||
\usepackage{fontspec}
|
||||
%\usepackage{microtype}
|
||||
%\usepackage{xunicode}
|
||||
\usepackage{polyglossia}
|
||||
\usepackage{xltxtra}
|
||||
\setdefaultlanguage{french}
|
||||
\setotherlanguage{english}
|
||||
\defaultfontfeatures{Mapping=tex-text} % To support LaTeX quoting style
|
||||
%\setmainfont{Caviar Dreams}
|
||||
\newfontfamily\headingfont[]{Caviar Dreams}
|
||||
\usepackage{titlesec}
|
||||
\defaultfontfeatures{Ligatures=TeX}
|
||||
% Set sans serif font to Calibri
|
||||
\setsansfont{LiberationSans}
|
||||
% Set serifed font to Cambria
|
||||
\setmainfont{LiberationSans}
|
||||
\else
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage[english, francais]{babel}
|
||||
\fi
|
||||
\usepackage{pifont}
|
||||
\usepackage{geometry}
|
||||
\usepackage{fancybox}
|
||||
\usepackage{verbatim}
|
||||
\usepackage{eurosym}
|
||||
%\usepackage{color}
|
||||
\usepackage[svgnames,table]{xcolor}
|
||||
\usepackage{listings}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{hyperref}
|
||||
\usepackage{titlesec}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{lastpage}
|
||||
%\usepackage{enumitem}
|
||||
\usepackage{makeidx}
|
||||
\usepackage{tocbibind}
|
||||
\usepackage[backend=biber,hyperref=true,backref=true]{biblatex}
|
||||
\addbibresource{biblio.bib}
|
||||
\usepackage{url}
|
||||
\renewcommand{\baselinestretch}{1.3}
|
||||
\addto\captionsfrench{\renewcommand{\contentsname}{Sommaire}}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{pdfpages}
|
||||
\makeindex
|
||||
|
||||
%
|
||||
% Tableaux
|
||||
%
|
||||
\usepackage{array}
|
||||
\usepackage{booktabs}
|
||||
\usepackage{colortbl}
|
||||
|
||||
% Default
|
||||
\newcolumntype{1}{l}
|
||||
\newcolumntype{2}{l}
|
||||
\newcolumntype{3}{l}
|
||||
\newcolumntype{4}{l}
|
||||
\newcolumntype{5}{l}
|
||||
\newcolumntype{6}{l}
|
||||
\newcolumntype{7}{l}
|
||||
\newcolumntype{8}{l}
|
||||
\newcommand*\heading{}
|
||||
\newcommand*\beforeheading{}
|
||||
\newcommand*\afterheading{}
|
||||
\newcommand*\normalline{}
|
||||
\newcommand*\lastline{}
|
||||
|
||||
%\renewcommand*\toprule{\arrayrulecolor{red}{\hline}}
|
||||
|
||||
% Nice looking rules, centered cells
|
||||
\newcolumntype{1}{c}
|
||||
\newcolumntype{2}{c}
|
||||
\newcolumntype{3}{c}
|
||||
\newcolumntype{4}{c}
|
||||
\newcolumntype{5}{c}
|
||||
\newcolumntype{6}{c}
|
||||
\newcolumntype{7}{c}
|
||||
\newcolumntype{8}{c}
|
||||
\renewcommand*\heading[1]{\chapterfont\MakeUppercase{#1}}
|
||||
\renewcommand*\beforeheading{\arrayrulecolor{CadolesBlue}\toprule}
|
||||
\renewcommand*\afterheading{\midrule}
|
||||
\renewcommand*\normalline{}
|
||||
\renewcommand*\lastline{\bottomrule}
|
||||
|
||||
\definecolor{CadolesBlue}{rgb}{.16,.50,.69}
|
||||
\definecolor{CadolesLightBlue}{rgb}{.31,.506,.741}
|
||||
\newfontfamily\cadolesfont{Caviar Dreams}
|
||||
\newfontfamily\chapterfont[Color=CadolesBlue]{Caviar Dreams}
|
||||
\newfontfamily\sectionfont[Color=CadolesBlue]{Caviar Dreams}
|
||||
\newfontfamily\subsectionfont[Color=CadolesLightBlue]{Caviar Dreams}
|
||||
\newfontfamily\subsubsectionfont[Color=CadolesLightBlue]{Caviar Dreams}
|
||||
|
||||
\newcommand{\tickYes}{\color{Green}\checkmark}
|
||||
\newcommand{\tickNo}{\color{red}{\hspace{1pt}\ding{55}}}
|
||||
\newcommand{\wlink}[1]{\textcolor{CadolesBlue}{\underline{#1}}}
|
||||
\newcommand{\classname}[1]{\texttt{\textbf{#1}}}
|
||||
%\newcommand{\cadoles}{\chapterfont{Cadoles}}
|
||||
\newcommand{\cadoles}{\cadolesfont\textcolor{black}{Cad}\textcolor{CadolesBlue}{ole}\textcolor{black}{s}}
|
||||
\newcommand{\TitleRule}{\rule[0.5ex]{12cm}{0.5mm}}
|
||||
\newcommand\espace{\vrule height 20pt width 0pt}
|
||||
\newcommand{\titre}[1]{{\color{DarkBlue}\normalfont\LARGE\bfseries #1\smallskip\hrule height 1pt}\bigskip}
|
||||
\renewcommand*\abstractname{Summary}
|
||||
%\renewcommand{\FrenchLabelItem}{\color{DarkBlue}{\ding{68}}}
|
||||
\let\oldfootnoterule\footnoterule
|
||||
\renewcommand\footnoterule{\vspace*{-3pt}%
|
||||
\noindent\rule{3in}{0.4pt}\vspace*{2.6pt}}% -3 + 0.4 + 2.6 = 0
|
||||
|
||||
%\pagestyle{headings}
|
||||
\makeatletter
|
||||
\renewcommand{\thesection}{}
|
||||
\titleformat{\chapter}{\LARGE\chapterfont}{\thesection}{0ex}{}[\color{CadolesBlue}\hrule height 1pt]
|
||||
\titleformat{\section}{\Large\sectionfont}{\thesection}{0ex}{}[\color{CadolesBlue}\hrule height 1pt]
|
||||
\titleformat{\subsection}{\large\subsectionfont}{\thesection}{0ex}{}
|
||||
\titleformat{\subsubsection}{\itshape\subsubsectionfont}{\thesection}{0ex}{}
|
||||
|
||||
\skbinput[from=rep]{style/00-entete-pied-de-page}
|
||||
|
||||
\def\maketitle{
|
||||
\skbfigure[center]{logos/Cadoles}
|
||||
\vspace{4.5cm}
|
||||
|
||||
\begin{flushleft}
|
||||
\textbf{\Huge \cadolesfont\textcolor{CadolesBlue}{\@title}}
|
||||
\end{flushleft}
|
||||
\begin{center}
|
||||
\color{CadolesBlue}\TitleRule
|
||||
\end{center}
|
||||
\begin{flushright}
|
||||
\vspace{-1.5ex}
|
||||
\textbf{\huge \cadolesfont\textcolor{DarkGrey}{\departement}}
|
||||
\end{flushright}
|
||||
\vspace{2.5cm}
|
||||
\pagebreak
|
||||
}
|
||||
|
||||
|
||||
\def\origine{
|
||||
\vspace{1.5cm}
|
||||
\begin{flushleft}
|
||||
\begin{minipage}[l]{8cm}
|
||||
\skbinput[from=rep]{style/00-Coordonnees}
|
||||
\end{minipage}
|
||||
\end{flushleft}
|
||||
}
|
||||
|
||||
%
|
||||
% Itemize avec la petite cadoles
|
||||
%
|
||||
%\newenvironment{citemize}{\renewcommand{\labelitemi{$\odot$}}}
|
||||
%\newenvironment{citemize}{\renewcommand{\labelitemi{\includegraphics[height=1.6ex]{inc/cadole.png}}}}
|
||||
\newenvironment{citemize}{\renewcommand
|
||||
\labelitemi{\includegraphics[height=1ex]{inc/cadole.png}}\begin{itemize}}{\end{itemize}}
|
||||
|
||||
|
||||
%
|
||||
% Box pour citations
|
||||
%
|
||||
\newsavebox{\fmbox}
|
||||
\newenvironment{fmpage}[1]
|
||||
{\begin{lrbox}{\fmbox}\begin{minipage}{#1}}
|
||||
{\end{minipage}\end{lrbox}\fbox{\usebox{\fmbox}}}
|
||||
|
||||
\hypersetup{
|
||||
backref=true, % Permet d'ajouter des liens dans
|
||||
pagebackref=true, % les bibliographies
|
||||
hyperindex=true, % Ajoute des liens dans les index.
|
||||
colorlinks=true, % Colorise les liens.
|
||||
breaklinks=true, % Permet le retour à la ligne dans les liens trop longs.
|
||||
urlcolor= CadolesBlue, % Couleur des hyperliens.
|
||||
linkcolor= CadolesBlue, % Couleur des liens internes.
|
||||
bookmarks=true, % Créé des signets pour Acrobat.
|
||||
bookmarksopen=true, % Si les signets Acrobat sont créés,
|
||||
% les afficher complètement.
|
||||
pdftitle={\@title}, % Titre du document.
|
||||
% Informations apparaissant dans
|
||||
pdfauthor={Cadoles}, % dans les informations du document
|
||||
pdfsubject={Proposition Commerciale} % sous Acrobat.
|
||||
}
|
||||
|
||||
|
||||
|
||||
%\topmargin 0in
|
||||
%\leftmargin 2.5cm
|
||||
%\rightmargin 2.5cm
|
||||
|
||||
\setlength{\hoffset}{-18pt}
|
||||
\setlength{\oddsidemargin}{0pt} % Marge gauche sur pages impaires
|
||||
\setlength{\evensidemargin}{9pt} % Marge gauche sur pages paires
|
||||
\setlength{\marginparwidth}{54pt} % Largeur de note dans la marge
|
||||
%\setlength{\textwidth}{481pt} % Largeur de la zone de texte (17cm)
|
||||
\setlength{\voffset}{-18pt} % Bon pour DOS
|
||||
\setlength{\marginparsep}{7pt} % Séparation de la marge
|
||||
\setlength{\topmargin}{0pt} % Pas de marge en haut
|
||||
\setlength{\headheight}{13pt} % Haut de page
|
||||
\setlength{\headsep}{10pt} % Entre le haut de page et le texte
|
||||
\setlength{\footskip}{27pt} % Bas de page + séparation
|
||||
\setlength{\textheight}{708pt} % Hauteur de la zone de texte (25cm)
|
||||
|
||||
|
BIN
figures/logos/missing.png
Normal file
BIN
figures/logos/missing.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.7 KiB |
91
presentations/NDV/scribe-amon-hapy/diaporama.tex
Normal file
91
presentations/NDV/scribe-amon-hapy/diaporama.tex
Normal file
@ -0,0 +1,91 @@
|
||||
\documentclass{beamer}
|
||||
|
||||
\usepackage{skb}
|
||||
|
||||
\skbconfig[
|
||||
root = ../../../,
|
||||
rep = content,
|
||||
pub = presentations,
|
||||
fig = figures,
|
||||
sli = slides,
|
||||
acr = database/acr,
|
||||
bib = database/bib
|
||||
]{skblocal.tex}
|
||||
|
||||
\newcommand{\pdfauthor}{Cadoles}
|
||||
\newcommand{\pdftitle}{Formation Scribe-Amon-Hâpy}
|
||||
\newcommand{\pdfkeywords}{EOLE}
|
||||
|
||||
|
||||
\skbinput[from=sli]{style/preambule}
|
||||
|
||||
\newlength{\logospacing}
|
||||
\setlength{\logospacing}{(\textwidth - 2cm*1)/0}
|
||||
|
||||
\logo{
|
||||
\skbfigure[width=2cm]{logos/Cadoles.png}~
|
||||
}
|
||||
|
||||
\title[]{Formation Scribe-Amon-Hâpy}
|
||||
\subtitle{Notre Dame des Vertus}
|
||||
|
||||
\author[Equipe Auteur]{Cadoles}
|
||||
|
||||
\institute[Cadoles]{\skbfigure[width=2cm]{logos/Cadoles.png}}
|
||||
|
||||
\date{{\small \today}}
|
||||
|
||||
\subject{Talks}
|
||||
|
||||
\AtBeginSubsection[]
|
||||
{
|
||||
\begin{frame}<beamer>
|
||||
\frametitle{}
|
||||
\tableofcontents[currentsection,currentsubsection]
|
||||
\end{frame}
|
||||
}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\skbinput[from=sli]{style/title}
|
||||
|
||||
% Corps de la formation
|
||||
%\skbinput[from=sli]{}
|
||||
\section{Introduction}
|
||||
\subsection{La distribution EOLE}
|
||||
|
||||
\section{Tronc commun}
|
||||
\subsection{Les quatre phases}
|
||||
\subsection{L’administration courante}
|
||||
\subsubsection{Mise à jour}
|
||||
\subsubsection{Sauvegarde}
|
||||
\subsubsection{Tâches plannifiées}
|
||||
\subsection{Les interfaces d’administration}
|
||||
|
||||
\section{Infrastructure déployée}
|
||||
\subsection{Concepts}
|
||||
\subsection{Mise en place}
|
||||
\subsection{Évolutivité}
|
||||
|
||||
\section{Hâpy}
|
||||
\subsection{Configuration}
|
||||
\subsection{Maintenance}
|
||||
\subsection{Gestion des VM}
|
||||
|
||||
\section{Amon}
|
||||
\subsection{Configuration}
|
||||
\subsection{Maintenance}
|
||||
\subsection{Gestion du proxy}
|
||||
\subsection{Gestion du pare-feu}
|
||||
|
||||
\section{Scribe}
|
||||
\subsection{Configuration}
|
||||
\subsection{Maintenance}
|
||||
\subsection{Gestion du domaine}
|
||||
\subsubsection{Gestion des utilisateurs}
|
||||
\subsubsection{Gestion des machines et sessions}
|
||||
\subsection{Services pédagogiques}
|
||||
|
||||
\skbinput[from=sli]{licences/license-cc-by-sa-2.0}
|
||||
|
||||
\end{document}
|
54
presentations/NDV/scribe-amon-hapy/programme.tex
Normal file
54
presentations/NDV/scribe-amon-hapy/programme.tex
Normal file
@ -0,0 +1,54 @@
|
||||
\documentclass[a4paper,11pt]{report}
|
||||
|
||||
\usepackage{skb}
|
||||
|
||||
\skbconfig[
|
||||
root = ../../../,
|
||||
rep = content,
|
||||
pub = presentations,
|
||||
fig = figures,
|
||||
sli = slides,
|
||||
acr = database/acr,
|
||||
bib = database/bib
|
||||
]{skblocal.tex}
|
||||
|
||||
\newcommand{\departement}{Cadoles Formations}
|
||||
\newcommand{\numeroversion}{1.0}
|
||||
\newcommand{\adresse}{29 bis, rue de l’Arquebuse}
|
||||
\newcommand{\codepostal}{21000}
|
||||
\newcommand{\ville}{Dijon}
|
||||
\newcommand{\telephone}{Tél : 03 73 27 02 86}
|
||||
\newcommand{\fax}{Fax : 09 72 29 61 11}
|
||||
\newcommand{\siteweb}{Site : http://www.cadoles.com/}
|
||||
\newcommand{\formateur}{Emmanuel Garette}
|
||||
|
||||
\skbinput[from=rep]{style/preambule-programme}
|
||||
|
||||
% TITRE DU DOCUMENT !
|
||||
\title{Programme de Formation}
|
||||
|
||||
\author{Emmanuel Garette}
|
||||
|
||||
%\date{}
|
||||
|
||||
\begin{document}
|
||||
\maketitle
|
||||
\newpage
|
||||
\section{Public visé}
|
||||
\input{./programme/public.tex}
|
||||
\section{Conditions préalables}
|
||||
\input{./programme/prerequis.tex}
|
||||
\section{Objectifs de la formation}
|
||||
\input{./programme/objectifs.tex}
|
||||
\section{Durée de la formation}
|
||||
\input{./programme/duree.tex}
|
||||
\section{Évaluation des acquis}
|
||||
\input{./programme/evaluation.tex}
|
||||
\newpage
|
||||
\section{Contenu de la formation}
|
||||
\input{./programme/contenu.tex}
|
||||
\IfFileExists{./programme/moyens.tex}{%
|
||||
\section{Moyens pédagogiques, techniques et d'encadrement}
|
||||
\input{./programme/moyens.tex}
|
||||
}{}
|
||||
\end{document}
|
39
presentations/NDV/scribe-amon-hapy/programme/contenu.tex
Normal file
39
presentations/NDV/scribe-amon-hapy/programme/contenu.tex
Normal file
@ -0,0 +1,39 @@
|
||||
|
||||
\begin{itemize}
|
||||
\item Introduction
|
||||
\begin{itemize}
|
||||
\item La distribution EOLE
|
||||
\end{itemize}
|
||||
\item Tronc commun
|
||||
\begin{itemize}
|
||||
\item Les quatre phases
|
||||
\item L’administration courante
|
||||
\item Les interfaces d’administration
|
||||
\end{itemize}
|
||||
\item Infrastructure déployée
|
||||
\begin{itemize}
|
||||
\item Concepts
|
||||
\item Mise en place
|
||||
\item Évolutivité
|
||||
\end{itemize}
|
||||
\item Hâpy
|
||||
\begin{itemize}
|
||||
\item Configuration
|
||||
\item Maintenance
|
||||
\item Gestion des VM
|
||||
\end{itemize}
|
||||
\item Amon
|
||||
\begin{itemize}
|
||||
\item Configuration
|
||||
\item Maintenance
|
||||
\item Gestion du proxy
|
||||
\item Gestion du pare-feu
|
||||
\end{itemize}
|
||||
\item Scribe
|
||||
\begin{itemize}
|
||||
\item Configuration
|
||||
\item Maintenance
|
||||
\item Gestion du domaine
|
||||
\item Services pédagogiques
|
||||
\end{itemize}
|
||||
\end{itemize}
|
1
presentations/NDV/scribe-amon-hapy/programme/duree.tex
Normal file
1
presentations/NDV/scribe-amon-hapy/programme/duree.tex
Normal file
@ -0,0 +1 @@
|
||||
40 heures.
|
@ -0,0 +1 @@
|
||||
L'appropriation des connaissances est contrôlée par des travaux pratiques durant la formation.
|
4
presentations/NDV/scribe-amon-hapy/programme/moyens.tex
Normal file
4
presentations/NDV/scribe-amon-hapy/programme/moyens.tex
Normal file
@ -0,0 +1,4 @@
|
||||
\begin{itemize}
|
||||
\item une salle de formation équipée d'ordinateurs avec infrasctructure de démonstration pour les travaux pratiques ;
|
||||
\item un formateur avec l'expérience de l'installation et de la maintenance des solutions présentées.
|
||||
\end{itemize}
|
@ -0,0 +1 @@
|
||||
Le participant à la formation est autonome pour l'administration des serveurs et la recherche d'informations en vue de résoudre les incidents.
|
@ -0,0 +1 @@
|
||||
Connaissance basique des systèmes d’exploitation GNU/Linux.
|
1
presentations/NDV/scribe-amon-hapy/programme/public.tex
Normal file
1
presentations/NDV/scribe-amon-hapy/programme/public.tex
Normal file
@ -0,0 +1 @@
|
||||
La formation vise toute personne ayant en charge des tâches d'administration sur des serveurs équipés des modules EOLE Hâpy, Amon et Scribe.
|
41
presentations/NDV/scribe-amon-hapy/support.tex
Normal file
41
presentations/NDV/scribe-amon-hapy/support.tex
Normal file
@ -0,0 +1,41 @@
|
||||
\documentclass{article}
|
||||
|
||||
\usepackage{skb}
|
||||
|
||||
\skbconfig[
|
||||
root = ../../../,
|
||||
rep = content,
|
||||
pub = presentations,
|
||||
fig = figures,
|
||||
sli = slides,
|
||||
acr = database/acr,
|
||||
bib = database/bib
|
||||
]{skblocal.tex}
|
||||
|
||||
\skbinput[from=rep]{style/preambule-article}
|
||||
\newcommand{\departement}{Cadoles Formations}
|
||||
\newcommand{\numeroversion}{0.1}
|
||||
\newcommand{\adresse}{170, avenue Jean Jaurès}
|
||||
\newcommand{\codepostal}{21000}
|
||||
\newcommand{\ville}{Dijon}
|
||||
\newcommand{\telephone}{03 73 27 02 86}
|
||||
|
||||
|
||||
\begin{document}
|
||||
\title{Formation Scribe-Amon-Hâpy}
|
||||
|
||||
\author{Cadoles}
|
||||
|
||||
|
||||
|
||||
\date{{\small \today}}
|
||||
\maketitle
|
||||
|
||||
\skbinput[from=rep]{style/title}
|
||||
|
||||
% Corps de la formation
|
||||
%\skbinput[from=rep]{}
|
||||
|
||||
\skbinput[from=rep]{licences/license-cc-by-sa-2.0}
|
||||
|
||||
\end{document}
|
@ -18,12 +18,20 @@
|
||||
|
||||
\skbinput[from=sli]{style/preambule}
|
||||
|
||||
\newlength{\logospacing}
|
||||
\setlength{\logospacing}{(\textwidth - 2cm*2)/1}
|
||||
|
||||
\logo{
|
||||
\skbfigure[width=2cm]{logos/MENJ.jpg}~ \hspace{\logospacing}
|
||||
\skbfigure[width=2cm]{logos/Cadoles.png}~
|
||||
}
|
||||
|
||||
\title[]{Formation tronc commun niveau 1}
|
||||
\subtitle{XXX CLIENT XXX}
|
||||
|
||||
\author[Equipe Auteur]{Cadoles}
|
||||
|
||||
\institute[Cadoles]{\skbfigure[width=2cm]{cadoles/logo_01.png}}
|
||||
\institute[Cadoles]{\skbfigure[width=2cm]{logos/Cadoles.png}}
|
||||
|
||||
\date{{\small \today}}
|
||||
|
||||
|
@ -18,12 +18,20 @@
|
||||
|
||||
\skbinput[from=sli]{style/preambule}
|
||||
|
||||
\newlength{\logospacing}
|
||||
\setlength{\logospacing}{(\textwidth - 2cm*2)/1}
|
||||
|
||||
\logo{
|
||||
\skbfigure[width=2cm]{logos/MENJ.jpg}~ \hspace{\logospacing}
|
||||
\skbfigure[width=2cm]{logos/Cadoles.png}~
|
||||
}
|
||||
|
||||
\title[]{Formation tronc commun niveau 2}
|
||||
\subtitle{XXX CLIENT XXX}
|
||||
|
||||
\author[Equipe Auteur]{Cadoles}
|
||||
|
||||
\institute[Cadoles]{\skbfigure[width=2cm]{cadoles/logo_01.png}}
|
||||
\institute[Cadoles]{\skbfigure[width=2cm]{logos/Cadoles.png}}
|
||||
|
||||
\date{{\small \today}}
|
||||
|
||||
|
@ -5,8 +5,10 @@ import argparse
|
||||
import re
|
||||
import random
|
||||
import time
|
||||
from os import path, makedirs
|
||||
import subprocess
|
||||
from os import path, makedirs, listdir
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
import pygit2
|
||||
|
||||
LICENSES = {'CC-by-sa-2.0': 'license-cc-by-sa-2.0',
|
||||
}
|
||||
@ -26,6 +28,9 @@ TEMPLATES = {
|
||||
LATEX_SUBS = [(re.compile('_'), '\\_'),
|
||||
]
|
||||
|
||||
DOCUMENTCLASS_RE = re.compile(r'\\documentclass\{(?P<document_class>.+?)\}')
|
||||
SKBCONFIG_RE = re.compile(r'\\skbconfig\[\n\s*root\s*=\s*(?P<root>.*),\n\s*rep\s*=\s*(?P<rep>.*),\n\s*pub\s*=\s*(?P<pub>.*),\n\s*fig\s*=\s*(?P<fig>.*),\n\s*sli\s*=\s*(?P<sli>.*),\n\s*acr\s*=\s*(?P<acr>.*),\n\s*bib\s*=\s*(?P<bib>.*)\n\s*\]\{skblocal.tex\}', re.M)
|
||||
SKBINPUT_RE = re.compile(r'[^%]\\skbinput\[from=(?P<rep>.*?)(,.*)?\]\{(?P<tex>.*?)\}', re.M)
|
||||
|
||||
def get_unique_name(base):
|
||||
now = time.localtime()
|
||||
@ -43,42 +48,158 @@ def escape_tex(value):
|
||||
return newval
|
||||
|
||||
|
||||
def normalize_branch(args):
|
||||
if 'master' in args:
|
||||
return path.join('xelatex', path.dirname(args.master))
|
||||
elif 'directory' in args:
|
||||
return path.join('xelatex', args.directory)
|
||||
else:
|
||||
raise Exception('No sufficient information to create branch')
|
||||
|
||||
|
||||
def git_integration(func):
|
||||
|
||||
def commit_into_master(paths, repo, comment):
|
||||
author = repo.default_signature
|
||||
committer = author
|
||||
repo.checkout('refs/heads/master')
|
||||
index = repo.index
|
||||
for fp in paths:
|
||||
index.add(fp)
|
||||
index.write()
|
||||
tree = index.write_tree()
|
||||
master_ref = repo.references['refs/heads/master']
|
||||
parents = [master_ref.peel().hex]
|
||||
master_head = repo.create_commit('refs/heads/master',
|
||||
author,
|
||||
committer,
|
||||
comment,
|
||||
tree,
|
||||
parents)
|
||||
return master_head
|
||||
|
||||
def commit_into_branch(paths, branch, repo, comment):
|
||||
author = repo.default_signature
|
||||
committer = author
|
||||
repo.checkout(f'refs/heads/{branch}')
|
||||
index = repo.index
|
||||
for fp in paths:
|
||||
index.add(fp)
|
||||
index.write()
|
||||
tree = index.write_tree()
|
||||
branch_ref = repo.references[f'refs/heads/{branch}']
|
||||
parents = [branch_ref.peel().hex]
|
||||
branch_commit = repo.create_commit(f'refs/heads/{branch}',
|
||||
author,
|
||||
committer,
|
||||
comment,
|
||||
tree,
|
||||
parents)
|
||||
return branch_commit
|
||||
|
||||
def merge_master_into_branch(master_commit, branch, repo):
|
||||
author = repo.default_signature
|
||||
committer = author
|
||||
repo.checkout(f'refs/heads/{branch}')
|
||||
repo.merge(master_commit)
|
||||
tree = repo.index.write_tree()
|
||||
merge_commit = repo.create_commit('HEAD', author, committer, 'Merge master into xelatex/*', tree, [repo.head.target, master_commit])
|
||||
|
||||
def inner(args):
|
||||
try:
|
||||
repo = pygit2.Repository('./')
|
||||
except:
|
||||
repo = None
|
||||
if repo:
|
||||
branch_name = normalize_branch(args)
|
||||
if not branch_name in repo.branches.local:
|
||||
master_ref = repo.references['refs/heads/master']
|
||||
commit = master_ref.peel()
|
||||
repo.branches.local.create(branch_name, commit)
|
||||
func(args)
|
||||
if repo:
|
||||
repo_status = repo.status()
|
||||
to_add_status = [pygit2.GIT_STATUS_WT_NEW,
|
||||
pygit2.GIT_STATUS_WT_MODIFIED]
|
||||
branch_add_paths = [fp for fp in repo_status
|
||||
if fp.startswith(f'presentations/') and repo_status[fp] in to_add_status]
|
||||
master_add_paths = [fp for fp in repo_status
|
||||
if (fp.startswith('content/') or fp.startswith('slides/')) and repo_status[fp] in to_add_status]
|
||||
|
||||
|
||||
if func.__name__ == 'init':
|
||||
comment = 'Initialisation de la formation'
|
||||
elif func.__name__ == 'update':
|
||||
comment = 'Construction de la formation'
|
||||
elif func.__name__ == 'outline':
|
||||
comment = 'Mise à jour du programme'
|
||||
else:
|
||||
comment = 'Travail sur la formation'
|
||||
|
||||
if repo.branches['master'].is_checked_out():
|
||||
if master_add_paths:
|
||||
master_head = commit_into_master(master_add_paths, repo, comment)
|
||||
else:
|
||||
master_head = repo.revparse_single('refs/heads/master')
|
||||
if branch_add_paths:
|
||||
commit_into_branch(branch_add_paths, branch_name, repo, comment)
|
||||
elif repo.branches[branch_name].is_checked_out():
|
||||
if branch_add_paths:
|
||||
commit_into_branch(branch_add_paths, branch_name, repo, comment)
|
||||
if master_add_paths:
|
||||
master_head = commit_into_master(master_add_paths, repo, comment)
|
||||
else:
|
||||
master_head = repo.revparse_single('refs/heads/master')
|
||||
branch_ref = repo.references[f'refs/heads/{branch_name}']
|
||||
if master_head not in repo.walk(branch_ref.target):
|
||||
merge_master_into_branch(master_head, branch_name, repo)
|
||||
|
||||
|
||||
|
||||
|
||||
return inner
|
||||
|
||||
def main():
|
||||
|
||||
@git_integration
|
||||
def init(args):
|
||||
"""
|
||||
init function
|
||||
"""
|
||||
def get_institutes_logos(institutes_list=None):
|
||||
if not institutes_list:
|
||||
return []
|
||||
institutes_logos = []
|
||||
known_logos = {path.splitext(path.basename(l))[0]:l for l in listdir('./figures/logos')}
|
||||
for institute in institutes_list:
|
||||
if institute in known_logos:
|
||||
institutes_logos.append(known_logos[institute])
|
||||
else:
|
||||
print(f'Unknown institute {institute}')
|
||||
print(f'Replacing with missing.png')
|
||||
institutes_logos.append('missing.png')
|
||||
return institutes_logos
|
||||
|
||||
root = '../'
|
||||
if args.directory:
|
||||
root = root + re.sub(r'[\w-]+/?', '../', args.directory)
|
||||
else:
|
||||
root = '../'
|
||||
|
||||
name = args.name
|
||||
if name:
|
||||
if path.splitext(name)[1] == '':
|
||||
name = name + '.tex'
|
||||
else:
|
||||
name = get_unique_name('formation')
|
||||
name = 'diaporama.tex'
|
||||
|
||||
title = args.title
|
||||
if not title:
|
||||
title = 'FIXME'
|
||||
else:
|
||||
title = title
|
||||
|
||||
author = args.author
|
||||
if not author:
|
||||
author = 'Cadoles'
|
||||
else:
|
||||
author = author
|
||||
|
||||
client = args.client
|
||||
if not client:
|
||||
client = 'FIXME'
|
||||
else:
|
||||
client = client
|
||||
|
||||
institutes = get_institutes_logos(args.institutes)
|
||||
logos_count = len(institutes) + 1
|
||||
|
||||
directory = args.directory
|
||||
if not directory:
|
||||
@ -95,11 +216,15 @@ def main():
|
||||
'title': title,
|
||||
'author': author,
|
||||
'client': client,
|
||||
'license': license}
|
||||
'license': license,
|
||||
'institutes': institutes,
|
||||
'logos_count': logos_count}
|
||||
master = TEMPLATES[document_class]['master']
|
||||
master_dir = path.join('presentations', directory)
|
||||
programme_dir = path.join(master_dir, 'programme')
|
||||
resources = [(path.join('presentations', directory), master),
|
||||
resources = [(master_dir, master),
|
||||
(master_dir, 'programme.tex'),
|
||||
(master_dir, 'support.tex'),
|
||||
(programme_dir, 'contenu.tex'),
|
||||
(programme_dir, 'duree.tex'),
|
||||
(programme_dir, 'evaluation.tex'),
|
||||
@ -108,9 +233,6 @@ def main():
|
||||
(programme_dir, 'prerequis.tex'),
|
||||
(programme_dir, 'public.tex'),
|
||||
]
|
||||
#('slides', 'license-cc-by-sa-2.0.tex'),
|
||||
#('slides', 'preambule.tex'),
|
||||
#('slides', 'title.tex')]
|
||||
for directory, template_file in resources:
|
||||
template = jinja_env.get_template(template_file)
|
||||
rendered_template = template.render(**env)
|
||||
@ -120,19 +242,18 @@ def main():
|
||||
with open(path.join(directory, template_dest_name), 'w') as rendered_file:
|
||||
rendered_file.write(rendered_template)
|
||||
|
||||
@git_integration
|
||||
def update(args):
|
||||
"""
|
||||
update function
|
||||
"""
|
||||
re_class = re.compile(r'\\documentclass\{(?P<document_class>.*)\}')
|
||||
#skbconfig_re = re.compile(r'\\skbconfig\[\s*root\s*=\s*(?P<root>.*),\s*rep\s*=\s*(?P<rep>.*),\s*pub\s*=\s*(?P<pub>.*),\s*fig\s*=\s*(?P<fig>.*),\s*sli\s*=\s*(?P<sli>.*),\s*acr\s*=\s*(?P<acr>.*),\s*bib\s*=\s*(?P<bib>.*),\s*\]\{skblocal.tex\}', re.M)
|
||||
skbconfig_re = re.compile(r'\\skbconfig\[\n\s*root\s*=\s*(?P<root>.*),\n\s*rep\s*=\s*(?P<rep>.*),\n\s*pub\s*=\s*(?P<pub>.*),\n\s*fig\s*=\s*(?P<fig>.*),\n\s*sli\s*=\s*(?P<sli>.*),\n\s*acr\s*=\s*(?P<acr>.*),\n\s*bib\s*=\s*(?P<bib>.*)\n\s*\]\{skblocal.tex\}', re.M)
|
||||
skbinput_re = re.compile(r'[^%]\\skbinput\[from=(?P<rep>.*?)(,.*)?\]\{(?P<tex>.*?)\}', re.M)
|
||||
with open(args.master, 'r') as master:
|
||||
master_file = path.join('presentations', args.directory, 'diaporama.tex')
|
||||
|
||||
with open(master_file, 'r') as master:
|
||||
tex_master = master.read()
|
||||
tex_class = re_class.search(tex_master)
|
||||
tex_skbconfig = skbconfig_re.search(tex_master)
|
||||
tex_skbinputs = skbinput_re.finditer(tex_master)
|
||||
tex_class = DOCUMENTCLASS_RE.search(tex_master)
|
||||
tex_skbconfig = SKBCONFIG_RE.search(tex_master)
|
||||
tex_skbinputs = SKBINPUT_RE.finditer(tex_master)
|
||||
fragment = TEMPLATES[tex_class.group('document_class')]['fragment']
|
||||
fragment_pratique = TEMPLATES[tex_class.group('document_class')]['fragment_pratique']
|
||||
|
||||
@ -153,19 +274,128 @@ def main():
|
||||
with open(dest, 'w') as rendered_file:
|
||||
rendered_file.write(rendered_template)
|
||||
|
||||
def tex_compile(args):
|
||||
master_files = [path.join('presentations', args.directory, tex_file)
|
||||
for tex_file in ['diaporama.tex', 'programme.tex', 'support.tex']]
|
||||
|
||||
for master_file in master_files:
|
||||
subprocess.call(['rubber', '--inplace', '-c shell_escape', '--unsafe', '--module=xelatex', master_file])
|
||||
|
||||
@git_integration
|
||||
def outline(args):
|
||||
"""
|
||||
outline creation
|
||||
"""
|
||||
part_level = 0
|
||||
section_level = 1
|
||||
subsection_level = 2
|
||||
frametitle_level = 3
|
||||
framesubtitle_level = 4
|
||||
def file_path_from_skbinput(skbinput_re, master, skbconfig):
|
||||
rel_path = path.join(skbconfig.group('root'), skbconfig.group(skbinput_re.group('rep')), skbinput_re.group('tex')) + '.tex'
|
||||
root_path = path.abspath(path.dirname(master))
|
||||
return path.normpath(path.join(root_path, rel_path))
|
||||
|
||||
def reorder_lists(*args):
|
||||
reordered_list = []
|
||||
for l in args:
|
||||
reordered_list.extend(l)
|
||||
reordered_list.sort(key=lambda x: x[0])
|
||||
return reordered_list
|
||||
|
||||
def outline_from_include(include, start, document_class):
|
||||
frametitle_re = re.compile(r'\\frametitle\{(?P<name>.*?)\}')
|
||||
framesubtitle_re = re.compile(r'\\framesubtitle\{(?P<name>.*?)\}')
|
||||
skbheading_re = re.compile(r'\\skbheading\{(?P<name>.*?)\}')
|
||||
with open(include, 'r') as include_fh:
|
||||
content = include_fh.read()
|
||||
if document_class == 'beamer':
|
||||
frametitles = frametitle_re.finditer(content)
|
||||
framesubtitles = framesubtitle_re.finditer(content)
|
||||
frametitles_list = [(ft.start(), frametitle_level, ft.group('name')) for ft in frametitles]
|
||||
framesubtitles_list = [(fs.start(), framesubtitle_level, fs.group('name')) for fs in framesubtitles]
|
||||
frame_list = reorder_lists(frametitles_list, framesubtitles_list)
|
||||
if frame_list:
|
||||
div = int('1{}'.format('0'*len(str(frame_list[-1][0]))))
|
||||
return [(start + f[0]/div, f[1], f[2]) for f in frame_list]
|
||||
else:
|
||||
return []
|
||||
|
||||
def filter_outlines(headers_list, max_level=None):
|
||||
filtered_outlines = []
|
||||
default_max_level = max([hl[1] for hl in headers_list])
|
||||
if not max_level:
|
||||
max_level = default_max_level
|
||||
temp_max_level = default_max_level
|
||||
buffered_header = {l: None for l in range(max_level + 1)}
|
||||
filtered_out = ['Pratique', 'Plan', 'Licence du document']
|
||||
|
||||
for header in headers_list:
|
||||
if header[1] <= min(max_level, default_max_level, temp_max_level):
|
||||
if header[2] in filtered_out:
|
||||
temp_max_level = header[1] + 1
|
||||
continue
|
||||
elif header[2] != buffered_header[header[1]]:
|
||||
buffered_header[header[1]] = header[2]
|
||||
for bf in buffered_header:
|
||||
if bf > header[1]:
|
||||
buffered_header[bf] = None
|
||||
filtered_outlines.append(header)
|
||||
temp_max_level = default_max_level
|
||||
return filtered_outlines
|
||||
|
||||
def outline_format(headers_list):
|
||||
levels = list(set([hl[1] for hl in headers_list]))
|
||||
levels.sort()
|
||||
flattened_levels = {l: levels.index(l) for l in levels}
|
||||
for header in headers_list:
|
||||
print('{}{}'.format('\t' * flattened_levels[header[1]], header[2]))
|
||||
|
||||
def render_outline(header_list, master):
|
||||
item = "\\item {content}"
|
||||
itemize = "\\begin{{itemize}}\n{content}\n\\end{{itemize}}"
|
||||
content_file = path.join(path.dirname(path.abspath(master)), 'programme', 'contenu.tex')
|
||||
with open(content_file, 'w') as content_fh:
|
||||
content_fh.write(itemize.format(content='\n'.join([item.format(content=c[2]) for c in header_list])))
|
||||
|
||||
def structure_outline(header_list):
|
||||
root = Outline('Contenu')
|
||||
current_outline = root
|
||||
for header in header_list:
|
||||
if header[1] > current_outline.level:
|
||||
parent = current_outline
|
||||
elif header[1] == current_outline.level:
|
||||
parent = current_outline.get_parent()
|
||||
elif header[1] == current_outline.level - 1:
|
||||
parent = current_outline.get_parent().get_parent()
|
||||
else:
|
||||
parent = root
|
||||
current_outline = Outline(header[2], parent, header[1])
|
||||
parent.add_child(current_outline)
|
||||
return root
|
||||
|
||||
|
||||
section_re = re.compile(r'\\section\{(?P<name>.*?)\}')
|
||||
part_re = re.compile(r'\\part\{(?P<name>.*?)}')
|
||||
subsection_re = re.compile(r'\\subsection\{(?P<name>.*?)\}')
|
||||
with open(args.master, 'r') as master_tex:
|
||||
master_file = path.join('presentations', args.directory, 'diaporama.tex')
|
||||
with open(master_file, 'r') as master_tex:
|
||||
master = master_tex.read()
|
||||
skbconfig = SKBCONFIG_RE.search(master)
|
||||
|
||||
document_class = DOCUMENTCLASS_RE.search(master).group('document_class')
|
||||
parts = part_re.finditer(master)
|
||||
section = section_re.finditer(master)
|
||||
subsection_re = subsection_re.finditer(master)
|
||||
sections = section_re.finditer(master)
|
||||
subsections = subsection_re.finditer(master)
|
||||
includes = SKBINPUT_RE.finditer(master)
|
||||
parts_list = [(part.start(), part_level, part.group('name')) for part in parts]
|
||||
sections_list = [(section.start(), section_level, section.group('name')) for section in sections]
|
||||
includes_list = [element for skbinput in includes for element in outline_from_include(file_path_from_skbinput(skbinput, master_file, skbconfig), skbinput.start(), document_class)]
|
||||
subsections_list = [(subsection.start(), subsection_level, subsection.group('name')) for subsection in subsections]
|
||||
structured_outline = structure_outline(filter_outlines(reorder_lists(parts_list, sections_list, includes_list, subsections_list)))
|
||||
content_file = path.join(path.dirname(path.abspath(master_file)), 'programme', 'contenu.tex')
|
||||
with open(content_file, 'w') as content_fh:
|
||||
content_fh.write(structured_outline.render())
|
||||
|
||||
|
||||
jinja_loader = FileSystemLoader('./templates')
|
||||
@ -183,23 +413,68 @@ def main():
|
||||
subparsers = parser.add_subparsers(help='Aide des sous-commandes')
|
||||
parser_init = subparsers.add_parser('init', help='Initialisation du fichier maître')
|
||||
parser_init.add_argument('-f', '--format', help="Format du document", required=True)
|
||||
parser_init.add_argument('-n', '--name', help="Nom du fichier à créer", required=True)
|
||||
parser_init.add_argument('-a', '--author', help="Auteur de la formation")
|
||||
parser_init.add_argument('-c', '--client', help="Client")
|
||||
parser_init.add_argument('-t', '--title', help="Titre de la formation")
|
||||
parser_init.add_argument('-l', '--license', help="Termes de mise à disposition de la formation")
|
||||
parser_init.add_argument('-d', '--directory', help="Sous-répertoires où créer le fichier", required=True)
|
||||
parser_init.add_argument('-i', '--institutes', nargs='*', help="Instituts dont les logos sont requis")
|
||||
parser_init.set_defaults(func=init)
|
||||
|
||||
parser_update = subparsers.add_parser('update', help='Mise à jour des fichiers inclus')
|
||||
parser_update.add_argument('-m', '--master', help="Emplacement du fichier maître", required=True)
|
||||
parser_update.add_argument('-d', '--directory', help="Sous-répertoires contenant le diaporama", required=True)
|
||||
parser_update.set_defaults(func=update)
|
||||
|
||||
parser_outline = subparsers.add_parser('outline', help="Création du programme à partir du fichier maître")
|
||||
parser_outline.add_argument('-m', '--master', help="Emplacement du fichier maître", required=True)
|
||||
parser_outline.add_argument('-d', '--directory', help="Sous-répertoires contenant le diaporama", required=True)
|
||||
parser_outline.set_defaults(func=outline)
|
||||
|
||||
if subprocess.check_output(['rubber', '--version']):
|
||||
parser_compile = subparsers.add_parser('compile', help='Compiler les différents documents en faisant appel à rubber')
|
||||
parser_compile.add_argument('-d', '--directory', help="Sous-répertoires contenant les documents", required=True)
|
||||
parser_compile.set_defaults(func=tex_compile)
|
||||
|
||||
args = parser.parse_args()
|
||||
args.func(args)
|
||||
|
||||
|
||||
class Outline:
|
||||
item = "{indent}\\item {content}"
|
||||
itemize = "\n{indent}\\begin{{itemize}}\n{content}\n{indent}\\end{{itemize}}"
|
||||
|
||||
def __init__(self, content, parent=None, level=-1):
|
||||
self.children = []
|
||||
self.parent = parent
|
||||
self.level = level
|
||||
self.content = content
|
||||
|
||||
|
||||
def is_leaf(self):
|
||||
if self.children:
|
||||
return False
|
||||
return True
|
||||
|
||||
def add_child(self, child):
|
||||
self.children.append(child)
|
||||
|
||||
def get_children(self):
|
||||
return self.children
|
||||
|
||||
def get_parent(self):
|
||||
return self.parent
|
||||
|
||||
def render(self):
|
||||
if self.get_parent():
|
||||
rendered = self.item.format(indent=' '*self.level, content=self.content)
|
||||
else:
|
||||
rendered = ''
|
||||
if not self.is_leaf():
|
||||
rendered += self.itemize.format(indent=' '*self.level, content='\n'.join([c.render() for c in self.get_children()]))
|
||||
return rendered
|
||||
|
||||
|
||||
def __repr__(self):
|
||||
return f"<Outline {self.content} - {self.level}>"
|
||||
|
||||
|
||||
|
||||
|
@ -12,5 +12,4 @@
|
||||
ou écrivez à Creative Commons, 444 Castro Street, Suite 900,
|
||||
Mountain View, California, 94041, USA.
|
||||
\end{block}
|
||||
\pnote{test des notes standard}
|
||||
\end{frame}
|
||||
|
@ -37,7 +37,7 @@
|
||||
\frametitle{Gestion des services}
|
||||
\begin{itemize}
|
||||
\item from pyeole.service import *
|
||||
\item manage\_service :
|
||||
\item manage\_services :
|
||||
\begin{itemize}
|
||||
\item action : start|stop|restart|status,
|
||||
\item service : nom du service,
|
||||
@ -46,15 +46,6 @@
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Pratique}
|
||||
\begin{itemize}
|
||||
\item a=service\_out('ntp', 'stop')
|
||||
\item a=service\_code('smbd', 'stop', 'fichier')
|
||||
\item a=service\_code\_no\_container('apache2', 'restart')
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Execution de commande}
|
||||
\begin{itemize}
|
||||
@ -72,6 +63,15 @@
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Pratique}
|
||||
\begin{itemize}
|
||||
\item a=service\_out('ntp', 'stop')
|
||||
\item a=service\_code('smbd', 'stop', 'fichier')
|
||||
\item a=service\_code\_no\_container('apache2', 'restart')
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
%\begin{frame}
|
||||
% \frametitle{Execution de commande}
|
||||
% \begin{itemize}
|
||||
|
@ -80,54 +80,3 @@
|
||||
\item test service : tcpcheck 2 192.0.2.52:80
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Gestion des locks}
|
||||
\begin{itemize}
|
||||
%FIXME
|
||||
\item CreoleLock acquire "nom\_du\_lock"
|
||||
\item CreoleLock release "nom\_du\_lock"
|
||||
\item CreoleLock is\_locked "nom\_du\_lock"
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Pratique}
|
||||
\begin{itemize}
|
||||
\item Créé un lock "test" ;
|
||||
\item Supprimé le lock "test".
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Valeur d'une variable}
|
||||
\begin{itemize}
|
||||
\item CreoleGet nom\_variable
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Pratique}
|
||||
\begin{itemize}
|
||||
\item Récupérer la valeur de la variable adresse\_ip\_eth0
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Modifier la valeur}
|
||||
\begin{itemize}
|
||||
\item CreoleSet nom\_variable valeur ;
|
||||
\item Pour une liste : CreoleSet nom\_variable """valeur1
|
||||
\item valeur2""" ;
|
||||
\item attention, ne peut changer la longueur de esclave.
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Pratique}
|
||||
\begin{itemize}
|
||||
\item Modifier la valeur de la variable de vm\_swappiness à 10 ;
|
||||
\item modifier ubuntu\_update\_mirrors à "eole.ac-dijon.fr inconnu.lan"
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
|
@ -2,8 +2,8 @@
|
||||
\begin{frame}
|
||||
\frametitle{Pratique}
|
||||
\begin{itemize}
|
||||
\item Modifié dans le template de configure sshd\_config : "LoginGraceTime" de "30" à "60"
|
||||
\item créé le patch.
|
||||
\item Modifier dans le template de configure sshd\_config : "LoginGraceTime" de "30" à "60"
|
||||
\item créer le patch.
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
}
|
||||
|
@ -1,4 +1,20 @@
|
||||
{\setbeamercolor{background canvas}{bg=TravauxPratiques}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Pratique}
|
||||
\begin{itemize}
|
||||
\item Récupérer la valeur de la variable adresse\_ip\_eth0
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Pratique}
|
||||
\begin{itemize}
|
||||
\item Modifier la valeur de la variable de vm\_swappiness à 10 ;
|
||||
\item modifier ubuntu\_update\_mirrors à "eole.ac-dijon.fr inconnu.lan"
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Pratique}
|
||||
\framesubtitle{Gérer le service vnstat}
|
||||
|
@ -26,6 +26,28 @@
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{CreoleGet}
|
||||
\framesubtitle{Récupérer la valeur d’une variable}
|
||||
\begin{itemize}
|
||||
\item \commande{CreoleGet nom\_variable}
|
||||
\item \commande{CreoleGet --list}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{CreoleSet}
|
||||
\framesubtitle{Assigner une valeur à une variable}
|
||||
\begin{itemize}
|
||||
\item \commande{CreoleSet <nom\_variable> <valeur>} ;
|
||||
\item Pour une liste : \commande{CreoleSet nom\_variable """valeur1}
|
||||
\item \commande{> valeur2"""} ;
|
||||
\end{itemize}
|
||||
\begin{alertblock}{Manipulation des listes esclaves}
|
||||
\commande{CreoleSet} ne permet pas de changer la longueur de esclave. Une assignation de valeur pour une liste doit respecter la longueur initiale.
|
||||
\end{alertblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Dictionnaires Creole}
|
||||
\frametitle{Les paquets}
|
||||
|
@ -5,7 +5,7 @@
|
||||
\item permet de distinger les tâches avant sauvegarde/après sauvegarde ;
|
||||
\item principe :
|
||||
\begin{itemize}
|
||||
\item extration avant sauvegarde,
|
||||
\item extraction avant sauvegarde,
|
||||
\item suppression de fichier/mise à jour/ ... après la sauvegarde.
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
@ -24,7 +24,6 @@
|
||||
\begin{frame}
|
||||
\frametitle{Pratique}
|
||||
\begin{itemize}
|
||||
\item Faire un Schedule qui stop IRCD avant la sauvegarde ;
|
||||
\item faire un script qui démarre IRCD après la sauvegarde.
|
||||
\item Faire un schedule qui extrait les données de vnStat en vue de leur sauvegarde,
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
@ -16,6 +16,7 @@
|
||||
\usepackage{xcolor}
|
||||
\usepackage{hyperref}
|
||||
\usepackage{hyperxmp}
|
||||
\usepackage{calc}
|
||||
%\usepackage{pdfpcnotes} % Indisponible dans les paquets, installation manuelle requise
|
||||
|
||||
\hypersetup{%
|
||||
@ -47,8 +48,6 @@
|
||||
{\skbinput[from=fig]{cadoles/simple_dash}}
|
||||
|
||||
|
||||
\institute[Cadoles]{\skbfigure[width=2cm]{cadoles/logo-01.png}}
|
||||
\institute[MENJ]{\skbfigure[width=2cm]{en/logo_MENJ.jpg}}
|
||||
|
||||
\date{{\small \today}}
|
||||
|
||||
@ -84,11 +83,6 @@
|
||||
\end{frame}
|
||||
}
|
||||
|
||||
\logo{
|
||||
\skbfigure[width=2cm]{en/logo_MENJ.jpg}~ \hspace{220pt}
|
||||
\skbfigure[width=2cm]{cadoles/logo_01.png}~
|
||||
}
|
||||
|
||||
\addtobeamertemplate{frametitle}{%
|
||||
\begin{tikzpicture}[remember picture,overlay]
|
||||
\node[anchor=north west,yshift=2pt,text opacity=0.5, scale=0.8] at (current page.north west) {\insertsubsection};
|
||||
|
@ -15,7 +15,7 @@
|
||||
\skbinput[from=(((content)))]{style/preambule-(((class)))}
|
||||
\newcommand{\departement}{Cadoles Formations}
|
||||
\newcommand{\numeroversion}{0.1}
|
||||
\newcommand{\adresse}{29 bis, rue de l’Arquebuse}
|
||||
\newcommand{\adresse}{170, avenue Jean Jaurès}
|
||||
\newcommand{\codepostal}{21000}
|
||||
\newcommand{\ville}{Dijon}
|
||||
\newcommand{\telephone}{03 73 27 02 86}
|
||||
|
@ -16,15 +16,25 @@
|
||||
\newcommand{\pdftitle}{(((title)))}
|
||||
\newcommand{\pdfkeywords}{EOLE}
|
||||
|
||||
|
||||
\skbinput[from=(((content)))]{style/preambule}
|
||||
|
||||
\newlength{\logospacing}
|
||||
\setlength{\logospacing}{(\textwidth - 2cm*(((logos_count))))/(((logos_count - 1)))}
|
||||
|
||||
\logo{
|
||||
((* for institute in institutes *))
|
||||
\skbfigure[width=2cm]{logos/(((institute)))}~ \hspace{\logospacing}
|
||||
((* endfor *))
|
||||
\skbfigure[width=2cm]{logos/Cadoles.png}~
|
||||
}
|
||||
|
||||
\title[]{(((title)))}
|
||||
\subtitle{(((client)))}
|
||||
|
||||
\author[Equipe Auteur]{(((author)))}
|
||||
|
||||
\institute[Cadoles]{\skbfigure[width=2cm]{cadoles/logo_01.png}}
|
||||
|
||||
\institute[Cadoles]{\skbfigure[width=2cm]{logos/Cadoles.png}}
|
||||
|
||||
\date{{\small \today}}
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
\skbinput[from=(((content)))]{style/preambule-(((class)))}
|
||||
\newcommand{\departement}{Cadoles}
|
||||
\newcommand{\numeroversion}{0.1}
|
||||
\newcommand{\adresse}{29 bis, rue de l’Arquebuse}
|
||||
\newcommand{\adresse}{170, avenue Jean Jaurès}
|
||||
\newcommand{\codepostal}{21000}
|
||||
\newcommand{\ville}{Dijon}
|
||||
\newcommand{\telephone}{03 73 27 02 86}
|
||||
|
56
templates/programme.tex
Normal file
56
templates/programme.tex
Normal file
@ -0,0 +1,56 @@
|
||||
\documentclass[a4paper,11pt]{report}
|
||||
|
||||
\usepackage{skb}
|
||||
|
||||
\skbconfig[
|
||||
root = (((root))),
|
||||
rep = content,
|
||||
pub = presentations,
|
||||
fig = figures,
|
||||
sli = slides,
|
||||
acr = database/acr,
|
||||
bib = database/bib
|
||||
]{skblocal.tex}
|
||||
|
||||
\newcommand{\departement}{Cadoles Formations}
|
||||
\newcommand{\numeroversion}{1.0}
|
||||
\newcommand{\adresse}{170, avenue Jean Jaurès}
|
||||
\newcommand{\codepostal}{21000}
|
||||
\newcommand{\ville}{Dijon}
|
||||
\newcommand{\telephone}{Tél : 03 73 27 02 86}
|
||||
\newcommand{\fax}{Fax : 09 72 29 61 11}
|
||||
\newcommand{\siteweb}{Site : http://www.cadoles.com/}
|
||||
\newcommand{\formateur}{Emmanuel Garette}
|
||||
|
||||
\skbinput[from=rep]{style/preambule-programme}
|
||||
|
||||
% TITRE DU DOCUMENT !
|
||||
\title{Programme de Formation}
|
||||
|
||||
\author{Emmanuel Garette}
|
||||
|
||||
%\date{}
|
||||
|
||||
\begin{document}
|
||||
\maketitle
|
||||
\newpage
|
||||
\section{Public visé}
|
||||
\input{./programme/public.tex}
|
||||
\section{Conditions préalables}
|
||||
\input{./programme/prerequis.tex}
|
||||
\section{Objectifs de la formation}
|
||||
\input{./programme/objectifs.tex}
|
||||
\section{Durée de la formation}
|
||||
\input{./programme/duree.tex}
|
||||
\section{Évaluation des acquis}
|
||||
\input{./programme/evaluation.tex}
|
||||
\newpage
|
||||
\section{Contenu de la formation}
|
||||
\input{./programme/contenu.tex}
|
||||
\IfFileExists{./programme/moyens.tex}{%
|
||||
\section{Moyens pédagogiques, techniques et d'encadrement}
|
||||
\input{./programme/moyens.tex}
|
||||
\section{Évaluation des acquis}
|
||||
}{}
|
||||
\end{document}
|
||||
|
42
templates/support.tex
Normal file
42
templates/support.tex
Normal file
@ -0,0 +1,42 @@
|
||||
\documentclass{article}
|
||||
|
||||
\usepackage{skb}
|
||||
|
||||
\skbconfig[
|
||||
root = (((root))),
|
||||
rep = content,
|
||||
pub = presentations,
|
||||
fig = figures,
|
||||
sli = slides,
|
||||
acr = database/acr,
|
||||
bib = database/bib
|
||||
]{skblocal.tex}
|
||||
|
||||
\skbinput[from=rep]{style/preambule-article}
|
||||
\newcommand{\departement}{Cadoles Formations}
|
||||
\newcommand{\numeroversion}{0.1}
|
||||
\newcommand{\adresse}{170, avenue Jean Jaurès}
|
||||
\newcommand{\codepostal}{21000}
|
||||
\newcommand{\ville}{Dijon}
|
||||
\newcommand{\telephone}{03 73 27 02 86}
|
||||
|
||||
|
||||
\begin{document}
|
||||
\title{(((title)))}
|
||||
|
||||
\author{(((author)))}
|
||||
|
||||
|
||||
|
||||
\date{{\small \today}}
|
||||
\maketitle
|
||||
|
||||
\skbinput[from=rep]{style/title}
|
||||
|
||||
% Corps de la formation
|
||||
%\skbinput[from=rep]{}
|
||||
|
||||
\skbinput[from=rep]{licences/(((license)))}
|
||||
|
||||
\end{document}
|
||||
|
31
utils/hooks/pre-commit
Executable file
31
utils/hooks/pre-commit
Executable file
@ -0,0 +1,31 @@
|
||||
#!/bin/sh
|
||||
|
||||
checkout_branch="$(git branch --show-current)"
|
||||
presentations_indexed_files="$(git diff --cached --name-only -- presentations/ | wc -l)"
|
||||
indexed_files="$(git diff --cached --name-only | wc -l)"
|
||||
|
||||
case "$checkout_branch" in
|
||||
master)
|
||||
if [ "${presentations_indexed_files}" -gt 0 ]
|
||||
then
|
||||
cat <<\EOF
|
||||
Error: Attempt to add files in presentations folder in master branch.
|
||||
Files in presentations folder are to be added in special branches xelatex/*.
|
||||
EOF
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
xelatex/*)
|
||||
if [ $presentations_indexed_files -ne $indexed_files ]
|
||||
then
|
||||
cat <<\EOF
|
||||
Error: Attempt to add files outside presentations folder in special branch xelatex/*.
|
||||
This branch follows only files in presentations folder.
|
||||
EOF
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
*) exit 0;;
|
||||
esac
|
||||
|
||||
exit 0
|
Reference in New Issue
Block a user