Pour les utilisateurs de Zend, petite astuce pour ajouter et afficher une signature dans un e-mail généré.
$mypicture = file_get_contents('img/signature.jpg') ;
$pictureAttachment = $mail->createAttachment($mypicture) ;
$pictureAttachment->type = 'application/jpg' ;
$pictureAttachment->encoding = Zend_Mime::ENCODING_BASE64;
$pictureAttachment->filename = 'signature.jpg';
$bodyhtml .= '<div style="margin-top:20px ;">
<img width=300 src="cid:signature.jpg" alt="signature.jpg" >
</div>' ;
Le client qui réceptionne l'e-mail doit être configurer en html et doit bien sûr "afficher les images" pour pouvoir apercevoir la signature. (fonctionne pour autre chose qu'une signature d'ailleurs, il suffit de placer l'img src=cid où vous voulez dans votre structure html du mail)
Commande non reconnu par le système : Si le programme psexec n’est pas reconnu en passant par VTOM (même en mettant le path dans les variables d’environnement ou full path dans un script), il faut installer le psexec.exe dans %systemroot%SysWOW64 au lieu de system32.
Par défaut, wordpress n'autorise pas l'importation et l'ajout de média XML (entre autres). Je me fais un petit reminder dans cet article pour ne pas oublier qu'on peut rajouter simplement des mimes types grâce à un filtre dans functions.php. Rajouter ces lignes :
function custom_upload_mimes( $mimes_par_defaut ) {
$mimes_par_defaut['xml'] = 'text/xml';
return $mimes_par_defaut;
}
add_filter( 'mime_types', 'custom_upload_mimes' );
Je suis sûr que vous avez vos Dossiers d’Exploitation ou vos consignes en cas d’abort bien rangé sur votre site de production ou de gestion électronique de document. Et vous aimeriez bien faire un clique droit sur votre application ou traitement, puis Consignes pour avoir la page ou le document en rapport avec ces derniers.
Créez votre consigne dans VTOM et donner lui le nom que vous voulez (consigne_monsite par exemple)
Donnez lui la page php qui va traiter votre requête et les noms d’environnement, application et traitement en paramètres comme ceci : http://votresite/vtom.php?{VT_ENVIRONMENT_NAME}.{VT_APPLICATION_NAME}.{VT_JOB_NAME} Vous appliquerez cette consigne sur tous les traitements ou applications que vous souhaitez. Il suffit de la rajouter dans la définition.
Petit exemple de ma page vtom.php
<?php
$repBase = 'f:/DE/DE/' ; // répertoire de base des Dossiers d'Exploitation
$isFilePresent = $env = $app = $job = false ;
$EnvAppJobTab = split('\.',$_SERVER['QUERY_STRING']); // QUERY_STRING = retour du clique droit sur un élément dans VTOM
if($EnvAppJobTab[0])
$env = $EnvAppJobTab[0] ;
if($EnvAppJobTab[1])
$app = $EnvAppJobTab[1] ;
if($EnvAppJobTab[2])
$job = $EnvAppJobTab[2] ;
if($env){
if($handle = opendir($repBase . $env )){
while( false !== ( $entry = readdir($handle) ) ){
if( $entry != "." && $entry != ".." ){
if($job){
$pattern = "/$job/" ;
}elseif($app){
$pattern = "/$app/" ;
}else{
echo "l'application ou le job doivent être renseigné" ;
die ;
}
if( preg_match($pattern,$entry) ){
$filename = split('\.',$entry) ;
$extension = array_pop($filename);
$media = false ;
switch($extension){
case "doc":
case "pdf":
$media = "application/".$extension;
break;
case "html":
case "htm" :
$media = "text/html" ;
break;
default:
echo "Ce format n'est pris en compte" ;
die ;
}
$isFilePresent = true ;
header("Content-type: ${media}");
if(${media} != "text/html"){
header("Content-Disposition: attachment; filename=\"${repBase}${env}/${entry}\"");
}
readfile("${repBase}${env}/${entry}") ;
}
}
}
}else{
echo "Ne peut pas ouvrir ".$repBase . $env ;
}
}else{
echo "Manque nom d'environnement" ;
}
if(!$isFilePresent){
echo "Fichier non present pour $env $app $job dans $repBase" ;
}
Ce tutorial est un exemple. Vous pouvez adapter le code à vos besoins sans problème. J'utilise les fonctions de base de Wordpress. Pas de plugin. Avec mon propre shortcode (que vous allez apprendre à faire).
// votrethemes/functions.php
/*
* My Shortcode
*
*/
function myGallery( $atts ) {
// Modification article suite aux commentaires de Dominique
// Ici rajout de l'attribut columns pour définir le nombre de colonnes à l'affichage
// On peut rajouter autant d'attribut que l'on veut (voir sur http://codex.wordpress.org/Gallery_Shortcode pour la liste des attributs de gallery par défaut de Wordpress)
(isset($atts['columns'])) ? $columns = $atts['columns'] : $columns = "3" ; // Rajout de l'attribut columns (3 par défaut, sinon le définir dans votre shortcode)
$categoryName = $atts['category'] ;
$htmlOut = "" ;
$the_query = new WP_Query('category_name='. $categoryName) ;
while ( $the_query->have_posts() ) : $the_query->the_post();
$childrenPosts = get_children('post_parent='. get_the_ID()) ;
foreach($childrenPosts as $childrenPost){
$childrenPostsId[] = $childrenPost->ID ;
}
endwhile; // end of the loop.
$childrenPostsIdImplode = implode(",",$childrenPostsId) ;
$htmlOut .= do_shortcode('[gallery include="'.$childrenPostsIdImplode.'" columns="'.$columns.'"]') ; // Modification article suite commentaires Dominique
wp_reset_postdata();
return ($htmlOut) ;
}
add_shortcode( 'myGallery', 'myGallery' );
[myGallery category="galerie-saisons-hiver" columns="3"]La catégorie devra être le nom court, c'est l'identifiant de la catégorie, vous le verrez dans Articles > Catégories Et voilà le résultat :
On ne s’en sert pas souvent mais ça a le mérite d’exister et c’est bien pratique dans certains cas : les horaires en format cron dans les cycliques VTOM.
MM HH1,HH2 -> se lance à HH1:MM, et HH2:MM
MM1,MM2 HH1,HH2 -> se lance à HH1:MM1, HH1:MM2, HH2:MM1, et HH2:MM2
Pour l’exemple de Guillaume, pour un lancement à 13h, 16h et 19h, il faudra définir un cycle comme cela :
00 13,16,19
Attention cependant :
Dans la crontab, il me semble que l’exécution peut s’effectuer en parallèle et plusieurs occurences peuvent se lancer en parralèle si le temps d’exécution est supérieur au temps du cycle.
Sous VTOM, non. La prochaine heure du cycle est evaluée à la fin du cycle précédant. Idem si on éteint le moteur, on peut perdre les cycles qui ont dépassé les heures cron.
(mais ça peut être bien si c’est voulu : on ne veut lancer le job qu’à ces heures précises et pas en dehors)
Merci à ma référence au sommet, alias Dieu, pour les confirmations.
Value: MINUTES [HOURS]. The job starts as soon as the minute indicated in the format corresponds to that of the system.
Remarks:
Example:
The “1,3,5,6 * value corresponds to the declaration of the minutes 1,3,5 and 6 of all the hours.
Example: The value “10-15 *” corresponds to all the minutes between 10 and 15 (inclusive) of all the hours.
Examples:
Vous voulez tester vos e-mails et/ou le serveur smtp (port 25 en général)
telnet @IP 25 MAIL From: <sender@gmail.fr> RCPT To: <receiver@gmail.fr> DATA Subject: test catalogue From: <sender@gmail.fr> "Mr Sender" To: <receiver@gmail.fr> "Mr Receiver" Test pour mail catalogue [touche entrée] . [touche entrée]
Pour mettre en place des clés ssh entre windows et linux, j’utilise Cygwin. Les clés ssh permettent notamment de copier, via scp, ou de se connecter, sans besoin de mettre de mot de passe (très utile dans les scripts). Tout dépend dans quel sens vous voulez effectuer les connexions, mais globalement, si vous voulez faire du scp ou du ssh de linux vers votre windows, il vous faut un serveur sshd sur votre Windows. (Dans l’autre sens c’est moins compliqué)
Pour l’installation de Cygwin et la mise en place d’un serveur sshd sur Windows, j’ai suivi le très bon tutoriel de CommentCaMarche. Lien vers la page : Installation d’un serveur ssh sous Windows Comme c’est expliqué dans ce tutoriel, la sécurité semble ne pas être de mise. Mais cela reste bien pratique pour des environnements qui ne sont pas en production.
Vérifiez aussi que votre port 22 est bien ouvert (pare-feu) J’ai rencontré quelques difficultés au niveau des droits de sécurité sous Windows (surtout pour lancer le service sshd). Exécutez en tant qu’Administrateur votre console Cygwin pour lancer ssh-host-config -y. Une fois installé, vérifiez à ce que vos fichiers /etc/ssh* ne soient pas trop permissif. L’idéal semble être 600. Si vous avez des problèmes lors du lancement du service CYGWIN sshd, regardez le log /var/log/sshd.log. Il donne de bonnes pistes.
Mise en place des clés ssh :
useradd nomuser
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nomuser/.ssh/id_rsa): (appuyez sur entrée)
Enter passphrase (empty for no passphrase): (laissez vide sinon il faudra taper cette passphrase lors du ssh)
Enter same passphrase again:
Your identification has been saved in /home/nomuser/.ssh/id_rsa
Your public key has been saved in /home/nomuser/.ssh/id_rsa.pub
Et modifiez les permissions des fichiers du répertoire /home/nomuser/.ssh/
chmod 600 /home/nomuser/.ssh/*
(attention si comme moi vous avez eu des problèmes, le groupe ne voulait pas être modifié. Il faut le passer de Aucun à Administrateurs.)
(chown -R :Administrateurs /home/nomuser/.ssh/*)
Sinon vous aurez ce genre de message :
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0660 for '/home/nomuser/.ssh/id_rsa' are too open.
ssh nommachine
The authenticity of host 'nommachine (10.0.0.1)' can't be established.
RSA key fingerprint is xx:xx:xx:xxx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'nommachine,10.0.0.1' (RSA) to the list of known hosts.
cat ~/.ssh/id_rsa.pub | ssh nommachine "cat >> ~/.ssh/authorized_keys"
A la demande de certains clients, j’ai écrit un script qui récupère les logs d’exécutions des jobs et les mets en forme en page web xml. Le principe est simple. Insérer de la data XML dans un fichier de feuille de style XSLT et transformer les data directement. On peut dire aussi que la feuille de transformation XSL est embarquée dans le fichier data XML.
Vous pouvez télécharger le résultat XML : exemple_log.xml
Les besoins des clients nous obligent parfois à effectuer un peu de “développement” perso. Voici ma recette pour récupérer et ordonner les logs d’exécution. Dans l’ordre d’affichage, JOBS EN COURS, JOBS EN ERREUR, JOBS TERMINES. La sortie finale en xml a l’avantage d’être visible sur la plupart des navigateurs web et intègre directement la mise en forme sans autre fichier (transformation xsl directement).
Je vous propose de regarder dans un premier temps le résultat final. Dans un deuxième temps, je vous montrerai mon script en shell qui génère ce fichier xml.
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="#stylesheet" type="text/xsl"?>
<!DOCTYPE xsl:stylesheet [
<!ATTLIST xsl:stylesheet
id ID #REQUIRED>
]>
<!-- balises de transformation xsl -->
<xsl:stylesheet version="2.0" id="stylesheet" xmlns:data="localhost"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<!-- définition du template principal avec le rendu html -->
<xsl:template match="/">
<html>
<head>
<title>Rapport log d execution job VTOM</title>
<style type="text/css">
h1 a {
background-color : #339933 ;
border : 1pt solid black ;
margin : 0 0 0 10pt ;
padding : 2pt ;
}
h2 a {
background-color : #33FF66 ;
border : 1pt solid black ;
margin : 0 0 0 20pt ;
padding : 2pt ;
}
div.in{
border: inset 5pt green;
}
div.pair{
border: outset 5pt green;
border-collapse: separate;
border-spacing: 5pt ;
margin : 0 0 10pt 0 ;
background-color: #33FF66 ;
}
div.impair{
border: outset 5pt green;
border-collapse: separate;
border-spacing: 5pt ;
margin : 0 0 10pt 0 ;
background-color: #339933 ;
}
div.erreur1{
border: outset 5pt red;
border-collapse: separate;
border-spacing: 5pt ;
margin : 0 0 10pt 0 ;
background-color: brown ;
}
div.erreur2{
border: outset 5pt red;
border-collapse: separate;
border-spacing: 5pt ;
margin : 0 0 10pt 0 ;
background-color: coral ;
}
div.encours1{
border: outset 5pt aqua;
border-collapse: separate;
border-spacing: 5pt ;
margin : 0 0 10pt 0 ;
background-color: blue ;
}
div.encours2{
border: outset 5pt aqua;
border-collapse: separate;
border-spacing: 5pt ;
margin : 0 0 10pt 0 ;
background-color: aqua ;
}
div.logok{
border : 1pt solid black ;
margin : 5pt ;
padding : 10pt ;
}
div.logok a{
font : 12pt ;
color : lawngreen ;
text-decoration : underline ;
background-color : darkgreen ;
padding : 5 pt ;
}
div.logko {
border : 1pt solid black ;
margin : 5pt ;
padding : 10pt ;
}
div.logko a{
text-decoration : underline ;
color : red ;
background-color : yellow ;
padding : 5 pt ;
}
</style>
</head>
<body>
<!-- appel des templates qui vont chercher dans les datas (les logs) -->
<xsl:apply-templates select="/xsl:stylesheet/data:data" />
</body>
</html>
</xsl:template>
<xsl:template match="/xsl:stylesheet/data:data">
<!--
Ce premier appel de template va définir le layout de l état de l enregistrement
1 row = un log d exécution
-->
<xsl:if test="count(row) = 0">
<a>Aucun traitement</a>
</xsl:if>
<!-- JOBS EN COURS
j ai défini dans mon script
que les jobs en cours ont un exit 321321
-->
<xsl:for-each select="row[exit = 321321]">
<!-- le modulo est juste là pour faire une couleur un peu différente
si plusieurs enregistrements de même type sont à la suite -->
<xsl:choose>
<xsl:when test="position() mod 2 = 0" >
<div class="encours1">
<div class="in">
<!-- appel du template pour le contenu du log -->
<xsl:call-template name="rapport" />
</div>
</div>
</xsl:when>
<xsl:otherwise>
<div class="encours2">
<div class="in">
<!-- appel du template pour le contenu du log -->
<xsl:call-template name="rapport" />
</div>
</div>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each> <!-- fin des row EN COURS -->
<!-- JOB EN ERREUR -->
<xsl:for-each select="row[exit != 0 and exit != 321321]">
<xsl:choose>
<xsl:when test="position() mod 2 = 0" >
<div class="erreur1">
<div class="in">
<xsl:call-template name="rapport" />
</div>
</div>
</xsl:when>
<xsl:otherwise>
<div class="erreur2">
<div class="in">
<xsl:call-template name="rapport" />
</div>
</div>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each> <!-- fin des row EN ERREUR -->
<!-- JOB TERMINES -->
<xsl:for-each select="row[exit = 0]">
<xsl:choose>
<xsl:when test="position() mod 2 = 0" >
<div class="pair">
<div class="in">
<xsl:call-template name="rapport" />
</div>
</div>
</xsl:when>
<xsl:otherwise>
<div class="impair">
<div class="in">
<xsl:call-template name="rapport" />
</div>
</div>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each> <!-- fin des row TERMINES -->
</xsl:template> <!-- fin du template des datas -->
<!-- appel du template pour le contenu du log -->
<xsl:template name="rapport">
<h1><a>Application : <xsl:value-of select="app" /></a></h1>
<h2><a>Traitement : <xsl:value-of select="job" /></a></h2>
<div class="logok">
<a>Log d execution : sortie standard : </a><br />
<pre>
<xsl:value-of select="logok" />
</pre>
</div>
<div class="logko">
<a>Log d execution : sortie en erreur : </a><br />
<pre>
<xsl:value-of select="logko" />
</pre>
</div>
</xsl:template> <!-- fin du template rapport -->
<!-- les datas, les logs d'exécutions
1 row = 1 enregistrement
1 enregistrement = nom de l'application et job, le n°exit
les logs d'exécution
-->
<data:data>
<row>
<app>
APPLICATION_1
</app>
<job>
TRAITEMENT_1
</job>
<exit>
0
</exit>
<logok>
_______________________________________________________________________
Contexte Visual TOM du traitement
Machine : machine-la01
Utilisateur : root
Script : /path/monscript.sh
Shell : /bin/ksh
Serveur Visual TOM : serveur-vtom
Traitement : TRAITEMENT_1
Application : APPLICATION_1
Environnement : ENVIRONNEMENT_A
Job ID : 3348
Nombre de relances : 0
Label de reprise : 0
Mode Execution : NORMAL
Date d'exploitation : DATE_PROD
Valeur de la date : 31/08/2012
_______________________________________________________________________
vendredi 31/08/2012 - 04:29:58
Debut de l'execution du script ...
_______________________________________________________________________
LUKE aime LEIA sortie standard
_______________________________________________________________________
vendredi 31/08/2012 - 04:30:59
Fin de l'execution du script.
--> Exit [0] donc acquitement
</logok>
<logko>
</logko>
</row>
<row>
<app>
APPLICATION_1
</app>
<job>
TRAITEMENT_2
</job>
<exit>
123
</exit>
<logok>
_______________________________________________________________________
Contexte Visual TOM du traitement
Machine : machine-la01
Utilisateur : root
Script : /path/monscript.sh
Shell : /bin/ksh
Serveur Visual TOM : serveur-vtom
Traitement : TRAITEMENT_2
Application : APPLICATION_1
Environnement : ENVIRONNEMENT_A
Job ID : 3349
Nombre de relances : 0
Label de reprise : 0
Mode Execution : NORMAL
Date d'exploitation : DATE_PROD
Valeur de la date : 31/08/2012
_______________________________________________________________________
vendredi 31/08/2012 - 04:29:58
Debut de l'execution du script ...
_______________________________________________________________________
LUKE aime LEIA sortie standard
_______________________________________________________________________
vendredi 31/08/2012 - 04:30:59
Fin de l'execution du script.
--> Exit [123] donc acquitement
</logok>
<logko>
JE SUIS TON PERE sortie erreur
</logko>
</row>
<row>
<app>
APPLICATION_1
</app>
<job>
TRAITEMENT_3
</job>
<exit>
321321
</exit>
<logok>
_______________________________________________________________________
Contexte Visual TOM du traitement
Machine : machine-la01
Utilisateur : root
Script : /path/monscript.sh
Shell : /bin/ksh
Serveur Visual TOM : serveur-vtom
Traitement : TRAITEMENT_3
Application : APPLICATION_1
Environnement : ENVIRONNEMENT_A
Job ID : 3350
Nombre de relances : 0
Label de reprise : 0
Mode Execution : NORMAL
Date d'exploitation : DATE_PROD
Valeur de la date : 31/08/2012
_______________________________________________________________________
vendredi 31/08/2012 - 04:29:58
Debut de l'execution du script ...
_______________________________________________________________________
LUKE aime ...
</logok>
<logko>
</logko>
</row>
</data:data> <!-- fin des datas -->
</xsl:stylesheet> <!-- fin du fichier xml -->
Pour aller plus loin dans l’explication du XML, c’est en réalité un xml qui fait appel à une feuille de style XSL, non pas extérieure mais dans le XML, grâce à son ID.
De plus la feuille de style xsl:stylesheet intègre directement les données. Il suffit de définir le namespace dans la déclaration du xsl:stylesheet.
Appel de la feuille de style xsl:stylesheet dans le fichier xml :
<?xml-stylesheet href="#stylesheet" type="text/xsl"?>
vers le href #stylesheet => id=stylesheet
<xsl:stylesheet version="2.0" id="stylesheet" xmlns:data="localhost"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Déclaration normale pour les balises de transformation xsl
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
Déclaration de ma balise perso.
Cela va permettre de faire mes balises du type
Les templates vont matcher à partir de cette arborescence.
xmlns:data="localhost"
Passons maintenant au script shell exécuté sur chaque machine dont vous voulez récupérer les logs.
Voici le script generexml.sh
Je me base sur la structure du nom des logs d’exécution VTOM. Il y aura surement quelques adaptations à effectuer chez vous.
Attention, je ne test pas la volumétrie des logs.
#!/bin/sh
#
# AUTEUR : Virtual Thom
# VERSION : 1.0
# DATE : 20/05/2011
#
# set -n # Decommenter pour debug syntax sans execution
# NOTE: Ne pas oublier de recommenter !
# set -x # Decommenter pour debug
#
##########################################################
# SCRIPT
##########################################################
usage(){
# exemple d'usage
script=${0##*/} ;
#script=${script%.*} ;
echo "" ;
echo "${script} - permet de recuperer des logs d'execution et de les mettre en forme" ;
echo ""
echo "Usage :" ;
echo " ${script} machine environnement tempsenseconde" ;
echo "1er parametre : nom de la machine" ;
echo "2eme parametre : filtre pour la recuperation des logs, peut etre l'environnement par exemple" ;
echo "3eme parametre : temps en secondes depuis l'execution du script jusqu'au temps de recuperation" ;
echo "" ;
exit 123 ;
}
if test "$1" = "--help" -o "$1" = "-help" -o "$1" = "-h" -o -z "$1"
then
usage
fi
machine=${1} #Par defaut machine
environnement=${2:-PROD} #Par defaut PROD
retour_tps=${3:-86400} #Par defaut 86400 s soit 24h
LOGS_REP=${TOM_LOG_DIR:-/opt/vtom/logs/}
LOGS_SCRIPTS=/opt/vtom/scripts/
INFILE=/opt/vtom/scripts/infile
OUTFILE=/opt/vtom/scripts/outfile
XML=/opt/vtom/scripts/${machine}_${environnement}.xml
thisday=`date +%s` #date du jour en timestamp
dayminusday=`expr $thisday - ${retour_tps}` #calcul date du jour - 24h (en s) en timestamp
> $OUTFILE
ls ${LOGS_REP} | grep "${environnement}.*.o" | sort > $INFILE #liste des logs
#chargement de l entete xml xsl
entete='<?xml version="1.0" encoding="ISO-8859-1"?>\n
<?xml-stylesheet href="#stylesheet" type="text/xsl"?>\n
\n
<!DOCTYPE xsl:stylesheet [\n
<!ATTLIST xsl:stylesheetn
id ID #REQUIRED>\n
]>\n
\n
<!-- balises de transformation xsl -->\n
<xsl:stylesheet version="2.0" id="stylesheet" xmlns:data="localhost" \n
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\n
<xsl:output method="html" indent="yes"/>\n
\n
<!-- définition du template principal avec le rendu html -->\n
<xsl:template match="/">\n
<html>\n
<head>\n
<title>Rapport log d execution job VTOM</title>\n
<style type="text/css">\n
h1 a {\n
background-color : #339933 ;\n
border : 1pt solid black ;\n
margin : 0 0 0 10pt ; \n
padding : 2pt ;\n
}\n
h2 a {\n
background-color : #33FF66 ;\n
border : 1pt solid black ;\n
margin : 0 0 0 20pt ;\n
padding : 2pt ;\n
}\n
div.in{ \n
border: inset 5pt green;\n
}\n
div.pair{\n
border: outset 5pt green; \n
border-collapse: separate;\n
border-spacing: 5pt ;\n
margin : 0 0 10pt 0 ;\n
background-color: #33FF66 ;\n
}\n
div.impair{\n
border: outset 5pt green; \n
border-collapse: separate;\n
border-spacing: 5pt ;\n
margin : 0 0 10pt 0 ;\n
background-color: #339933 ;\n
}\n
div.erreur1{\n
border: outset 5pt red; \n
border-collapse: separate;\n
border-spacing: 5pt ;\n
margin : 0 0 10pt 0 ;\n
background-color: brown ;\n
}\n
div.erreur2{\n
border: outset 5pt red; \n
border-collapse: separate;\n
border-spacing: 5pt ;\n
margin : 0 0 10pt 0 ;\n
background-color: coral ;\n
}\n
div.encours1{\n
border: outset 5pt aqua; \n
border-collapse: separate;\n
border-spacing: 5pt ;\n
margin : 0 0 10pt 0 ;\n
background-color: blue ;\n
}\n
div.encours2{\n
border: outset 5pt aqua; \n
border-collapse: separate;\n
border-spacing: 5pt ;\n
margin : 0 0 10pt 0 ;\n
background-color: aqua ;\n
}\n
div.logok{\n
border : 1pt solid black ;\n
margin : 5pt ; \n
padding : 10pt ;\n
}\n
div.logok a{\n
font : 12pt ;\n
color : lawngreen ;\n
text-decoration : underline ;\n
background-color : darkgreen ;\n
padding : 5 pt ;\n
}\n
div.logko {\n
border : 1pt solid black ;\n
margin : 5pt ; \n
padding : 10pt ;\n
}\n
div.logko a{\n
text-decoration : underline ;\n
color : red ;\n
background-color : yellow ;\n
padding : 5 pt ;\n
}\n
</style>\n
</head>\n
<body>\n
<!-- appel des templates qui vont chercher dans les datas (les logs) --> \n
<xsl:apply-templates select="/xsl:stylesheet/data:data" />\n
</body>\n
</html>\n
</xsl:template>\n
\n
\n
<xsl:template match="/xsl:stylesheet/data:data">\n
<!--\n
Ce premier appel de template va définir le layout de l état de l enregistrement
1 row = un log d exécutionn
-->\n
\n
<xsl:if test="count(row) = 0"> \n
<a>Aucun traitement</a> \n
</xsl:if>\n
\n
<!-- JOBS EN COURSn
j ai défini dans mon scriptn
que les jobs en cours ont un exit 321321n
-->\n
<xsl:for-each select="row[exit = 321321]">\n
<!-- le modulo est juste là pour faire une couleur un peu différente \n
si plusieurs enregistrements de même type sont à la suite -->\n
<xsl:choose>\n
<xsl:when test="position() mod 2 = 0" >\n
<div class="encours1">\n
<div class="in">\n
<!-- appel du template pour le contenu du log -->\n
<xsl:call-template name="rapport" />\n
</div>\n
</div>\n
</xsl:when>\n
<xsl:otherwise>\n
<div class="encours2">\n
<div class="in">\n
<!-- appel du template pour le contenu du log -->\n
<xsl:call-template name="rapport" />\n
</div>\n
</div>\n
</xsl:otherwise>\n
</xsl:choose>\n
</xsl:for-each> <!-- fin des row EN COURS -->\n
\n
\n
<!-- JOB EN ERREUR -->\n
<xsl:for-each select="row[exit != 0 and exit != 321321]">\n
\n
<xsl:choose>\n
<xsl:when test="position() mod 2 = 0" >\n
<div class="erreur1">\n
<div class="in">\n
<xsl:call-template name="rapport" />\n
</div>\n
</div>\n
</xsl:when>\n
<xsl:otherwise>\n
<div class="erreur2">\n
<div class="in">\n
<xsl:call-template name="rapport" />\n
</div>\n
</div>\n
</xsl:otherwise>\n
</xsl:choose>\n
</xsl:for-each> <!-- fin des row EN ERREUR -->\n
\n
<!-- JOB TERMINES -->\n
<xsl:for-each select="row[exit = 0]">\n
\n
<xsl:choose>\n
<xsl:when test="position() mod 2 = 0" >\n
<div class="pair">\n
<div class="in">\n
<xsl:call-template name="rapport" />\n
</div>\n
</div>\n
</xsl:when>\n
<xsl:otherwise>\n
<div class="impair">\n
<div class="in">\n
<xsl:call-template name="rapport" />\n
</div>\n
</div>\n
</xsl:otherwise>\n
</xsl:choose>\n
</xsl:for-each> <!-- fin des row TERMINES -->\n
\n
</xsl:template> <!-- fin du template des datas -->\n
\n
<!-- appel du template pour le contenu du log -->\n
<xsl:template name="rapport">\n
<h1><a>Application : <xsl:value-of select="app" /></a></h1>\n
<h2><a>Traitement : <xsl:value-of select="job" /></a></h2>\n
<div class="logok">\n
<a>Log d execution : sortie standard : </a><br />\n
<pre>\n
<xsl:value-of select="logok" />\n
</pre>\n
</div>\n
<div class="logko">\n
<a>Log d execution : sortie en erreur : </a><br />\n
<pre>\n
<xsl:value-of select="logko" />\n
</pre>\n
</div>\n
</xsl:template> <!-- fin du template rapport -->\n
'
echo -e $entete > $XML
echo "<data:data>" >> $XML #arbre xslt : /stylesheet/data:data/row
for LIGNE in $(cat $INFILE)
do
nom_exec=${LIGNE%.*}
nom_traitement=${LIGNE%.*} #recuperation nom du fichier sans extension chaine la plus courte a droite du . suivi de n caracteres
nom_traitement=`echo $nom_traitement | sed 's/_[0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]$//'` #suppression de la date et heure exemple de sed
date_exec=`echo $LIGNE | awk -F "_" '{print $NF}' | awk -F "." '{print $1}' | awk -F "-" '{print $1}'` #je laisse un exemple avec awk -F est le delemiter $NF le dernier argument
heure_exec=${nom_exec##*-} #chaine la plus longue a gauche de - suivi de n caracteres
heure_exec=`echo $heure_exec | sed 's/^[0-9][0-9]/&:/' | sed 's/[0-9][0-9]$/:&/'` #trick pour rajouter : entre heures et minutes avec sed
date_traitement=`date --date="$date_exec $heure_exec" +"%d/%m/%y %H:%M:%S"` #interpretation de la date par --date et remise en format classique
date_exec=`date --date="$date_exec $heure_exec" +%s` #timestamp pour tester avec le timestamp minimum requis
if test "$date_exec" > "$dayminusday" -a $LIGNE != ""
then
echo " <row>" >> $XML
echo " <app>" >> $XML
app=`head -n 20 "$LOGS_REP$LIGNE" | grep "Application" | awk -F ":" '{print $2}'` #head comme tail mais en partant du debut recuperation du nom application dans les logs
echo " $app" >> $XML
echo " </app>" >> $XML
echo " <job>" >> $XML
job=`head -n 20 "$LOGS_REP$LIGNE" | grep "Traitement" | awk -F ":" '{print $2}'` #recuperation du nom traitement dans les logs
echo " $job" >> $XML
echo " </job>" >> $XML
echo " <exit>" >> $XML
num_exit=`tail -n 5 "$LOGS_REP$LIGNE" | grep "Exit" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}'` #recuperation du numero exit dans les logs
if test "${num_exit}" != ""
then
echo " $num_exit" >> $XML
else
echo " 321321" >> $XML
fi
echo " </exit>" >> $XML
echo " <logok>" >> $XML
#cat ${LOGS_REP}$LIGNE | sed 's#<#<#g' | sed 's#>#>#g' | sed 's#&#&#g' >> $XML #sed remplace les < et les > par les notations xml pour ces caracteres speciaux
cat ${LOGS_REP}$LIGNE | sed 's#&#&#g' | sed 's#<#<#g' | sed 's#>#>#g' >> $XML
echo " </logok>" >> $XML
logko=`echo $LIGNE | sed 's/.o$/.e/'` #exemple de sed j aurai pu mettre ${nom_exec}.e
echo " <logko>" >> $XML
cat ${LOGS_REP}$logko | sed 's#&#&#g' | sed 's#<#<#g' | sed 's#>#>#g' >> $XML
echo " </logko>" >> $XML
echo " </row>" >> $XML
fi
done
echo "</data:data>" >> $XML
echo "</xsl:stylesheet>" >> $XML #arbre xslt : /stylesheet/data:data/row
rm -f $INFILE #nettoyage fichiers temp
rm -f $OUTFILE