![]() |
Documentation scripting LoriotPro Extensions du language LUA |
![]() |
Sommaire
Intégration de script LUA dans des pages du serveur Web
Configuration globale de l’option HLUA XLUA
Configuration du profil utilisateur
Accès aux pages WEB définies en tant que fichiers HLUA et XLUA
Page WEB en accès par URL standard
Page WEB (report ) dédiée à un utilisateur
Page WEB (Report) accessible à tous
Création de page WEB en fichiers HLUA / XLUA
Exemple simple de page WEB hlua (La page “Hello World”)
Exemple simple de page WEB xlua (La page “Hello World”)
Nommage des fichiers de script
Test de page WEB avec l’éditeur de script LUA
Exemple complexe de pages Web avec script LUA.
Limitation lié au fichier HLUA, XLUA
LoriotPro inclut un serveur WEB permettant ainsi aux utilisateurs distants d’accéder à toute l’information de supervision disponible sur la console.
Depuis la version 6 de LoriotPro Extended Edition, la création de pages WEB dynamique dédiées à l’affichage des informations de supervision de réseaux et de systèmes est accessible à tous. L’interface WEB peut maintenant être étendue à volonté et à l’infini en fonction de vos besoins.
Les pages WEB dynamique de LoriotPro offrent une information de première main, car les collectes d’informations par SNMP peuvent être réalisées en temps réel lors de l’appel des pages WEB.
Cette fonctionnalité est possible grâce à l’intégration et au support du langage de script LUA directement au sein du code HTML, à l’équivalent des autres technologies comme ASP, JAVASCRIPT ou PHP. Les scripts ainsi intégrés sont exécutés coté serveur, c'est-à-dire par LoriotPro, l’utilisateur reçoit des pages WEB formatées soit en HTML ou avec XML/XSL.
L’interprétation de script LUA directement par le serveur WEB de LoriotPro permet de générer des pages dynamiques à destination du navigateur WEB de l’utilisateur qui demande la page.
Pour que le serveur WEB LoriotPro identifie les pages demandées comme des pages à interpréter avec LUA deux nouvelles extensions de fichier sont donc disponibles, HLUA pour les pages codées en HTML et XLUA pour des pages codés en XML.
A réception d’une requête de la part d’un navigateur pour une page de ces types, le serveur WEB de LoriotPro interprète dans la page les sections contenant du code LUA et génère dynamiquement la page en langage HTML ou XML.
Pour rappel, le langage LUA intégré à LoriotPro ainsi que les centaines de fonctions LUA propriétaires à la solution LoriotPro offrent un environnement de développement dédié au tâches d’administration, de supervision et d’automation des réseaux d’entreprises, des serveurs et des architectures intelligentes. Les fonctions d’extensions disponibles exploitent les standards de communication et de management que sont IP, TCP et SNMP.
L’usage de script LUA au sein des pages Web fournies par le server Web intégré à LoriotPro permet de réaliser tout type de page dédié ou non utilisant les ressources ou les collectes du logiciel.
Le synopsis ci-dessous retrace le principe de fonctionnement.
Étape
1 - Le navigateur client demande une page web avec une l'extension hlua ou xlua.
Étape
2 - Le serveur WEB LoriotPro reconnaît l'extension et donne le code LUA à l’interpréteur
LUA interne de LoriotPro.
Étape
3 - le code est exécuté et les demandes sont soumises à LoriotPro (fonctions
LUA standard et fonctions propriétaires de LoriotPro).
Étape
4 - Si l'étape 3 comprennent des fonctions SNMP, les étapes 4 et 5 sont réalisées. Les
requêtes SNMP
sont envoyées vers le périphérique réseau.
Étape
5 - Les réponses SNMP sont renvoyées à LoriotPro par le périphérique réseau.
Étape
6 - LoriotPro présente les résultats à l'interpréteur LUA.
Étape
7 - La page Web est créée de façon dynamique avec les valeurs SNMP collectés et
fournis au serveur WEB.
Étape 8 - La page
est envoyée au navigateur client par le serveur WEB.
Pour activer ou désactiver globalement le support de page WEB avec du LUA intégré, il faut cocher l’option « Permit LUA Process » dans la fenêtre de propriétés du serveur Web intégré à LoriotPro.
Le serveur WEB est disponible en tant que service dans l’onglet services sous le nom http ISAPI server.
Les accès au serveur WEB peuvent être authentifiés par utilisateur.
Il est possible de définir deux options au niveau du profil de l’utilisateur. Ces options seront utilisées par LoriotPro pour contrôler les droits d’exécution de script LUA pour cet utilisateur.
La configuration du serveur WEB est accessible par le service dans l’onglet services sous le nom HTTP ISAPI server.
Il faut cliquer sur le bouton « User Right Manager » dans la fenêtre d’option du module HTTPD.
On peut aussi y accéder par le bouton « User Manager » de la boite de dialogue du serveur WEB.
Le gestionnaire d’utilisateur et de leurs droits s’affiche.
Le profil utilisateur contient une liste d’options définissant ces accès au server Web. Les options concernant l’exécution de scripts LUA sont situées à la fin de la liste.
Il y a deux options possibles : Global LUA et Local LUA.
Remarque : Ces options peuvent être récupérées en tant que variables dans le script LUA et intégré à la page pour autoriser ou non le lancement du script ou tout autre type de contrôle.
Modes |
fonctions |
Global LUA |
Ce profil peut exploiter globalement des scripts LUA |
Local LUA |
Ce profil ne peut exploiter que les scripts LUA placer dans le répertoire dédié de l’utilisateur : Si l’utilisateur a comme login : admin Le répertoire dédié est : Bin/www/user/admin |
Les fichiers d’extension HLUA sont utilisé pour générer des fichiers de type HTLM, les fichiers XLUA sont utilisé pour générer des fichiers de type XML.
Extension sur le serveur |
Type de fichier généré pour le browser client |
HLUA hlua |
html |
XLUA xlua |
xml |
Les fichiers contenant du scripting LUA sont lancés comme n’importe quel fichier à travers une URL standard :
Exemple à partir du browser web client.
http://127.0.0.1:8010/hlua/sample01.hlua?host1=dns.domain.fr&host2=123.8.1.1
Il est possible de placer les fichiers HLUA, XLUA directement dans le répertoire d’un utilisateur possédant un profil.
Remarque : Pour mémoire chaque utilisateur déclaré possède un répertoire dédié dans l’arborescence : bin/www/user/xxx
Si un fichier HLUA est placé dans le répertoire utilisateur (ici admin) il est alors visible dans la liste des fichiers disponibles.
L’icône par défaut représentant ce type de script est.
On peut remarquer qu’un commentaire est affiché
Ce commentaire est modifiable simplement en modifiant la partie haute du fichier concerné.
Voici les cinq premières lignes du fichier :
--<!-- <img border=0 src='/img/status11.jpg'>your comment here !!-->
--<!-- level 0 -->
--<!--
-- OEMSNMPManager V6.00 Web File To Script LUA File
-- Generated by the OEMSNMPManager Editor Wizard at : Thu Dec 10 16:33:55 2009
Il est possible de changer l’icône et le commentaire directement dans le fichier :
--<!-- <img border=0 src='/img/PollerProcess32.jpg'>Sample comment !!-->
--<!-- level 0 -->
--<!--
-- OEMSNMPManager V6.00 Web File To Script LUA File
-- Generated by the OEMSNMPManager Editor Wizard at : Thu Dec 10 16:33:55 2009
De la même manière il est possible de mettre à disposition des utilisateurs des pages WEB avec scripts LUA (HLUA, XLUA) en temps que Report globaux en les plaçant tous simplement dans l’arborescence : bin/www/rep/
Le fichier est alors disponible dans les pages web dédiées à la génération des rapports de type REP.
L’éditeur intégré à LoriotPro permet de générer et tester des fichiers de type HLUA ou XLUA.
Remarque : l’utilisation de fichier HLUA ou XLUA est possible dans les différentes éditions de LoriotPro mais l’éditeur intégré n’est disponible quand version Extended.
Le lancement de l’éditeur s’effectue depuis le menu principal du logiciel.
tools>Script Editor
L’utilisation standard de l’éditeur est décrite dans le « tome 1 » des manuels d’utilisation de LUA intégrés à LoriotPro et sont disponibles à partie du menu help de l’éditeur.
Cette section présente les extensions spécifiques au fichier de type HLUA ou XLUA.
L’éditeur propose un Wizard pour créer un nouveau fichier de type Web.
Les fichiers de type HLUA ou XLUA sont logiquement placés dans l’arborescence bin/www/hlua.
Le Wizard intégré propose un squelette de fichier contenant le minimum nécessaire à la génération d’un fichier de ce type.
Le fichier proposé contient les fonctions de bases facilitant l’intégration de texte dans le fichier HTML généré. L’ensemble du code est placé en commentaire.
La suppression des tags --[[ et ]]— rende ce fichier minimum opérationnel.
Le fichier peut mixer du code HTML natif et du code LUA. Il faut simplement encadrer les sections de code LUA avec les tags <lua> </lua>. Le tag <lua> est placé en début de code et le tag </lua> en fin de portion du code LUA. Il peut y avoir plusieurs sections de code XML ou HTML natif et/ou LUA.
L’objectif recherché est de générer en mode ajout « append » des écritures de type HTML dans un fichier de sortie dont le nom est définit avec la variable HLUA_outputfile.
Le serveur Web fournit au script un ensemble de variables permettant de réaliser le codage.
Pour l’interpréteur l’ensemble des sections de code LUA est vue comme un seul morceau et l’ensemble des variables définies dans une section de code sont utilisable dans la section suivante. Le langage LUA étant interprété, les variables sont à définir dans l’ordre du code.
Quelques fonctions sont fournies par le Wizard pour faciliter l’écriture du texte HTML dans le fichier de sortie. Seule la fonction w(val) peut être utilisé pour écrire dans le fichier de sortie.
fp=nil;
function open()
if fp~=nil then close() end
fp=lp.Fopen(HLUA_outputfile,'at');
return fp;
end
function close()
if fp==nil then return end
lp.Fclose(fp);
fp=nil;
end
function w(val)
open();
if fp==nil then return end
lp.Fprintf(fp,val);
close();
end
Il peut être nécessaire de modifier ces fonctions pour réaliser des tests ou des formatages spécifiques du texte écrit dans le fichier de sortie.
En utilisant l’éditeur de script LUA nous allons créer une page WEB en HTML très simple qui affiche le texte “Hello World”.
Dans l’éditeur nous créons une page WEB que nous appelons test.hlua et qui contient le code suivant:
<lua>
-- Input values
-- lp_index index for this script ".1"
-- lp_oid SNMP OID for this script "ifnumber"
-- lp_host default ip address for this script "127.0.0.1"
-- Output Values
lp_value = 0;
lp_buffer ="error";
-- dofile(lp.GetPath().."/config/script/loriotinit.lua"); -- to support define
-- lp.InitLuaPath(); -- to support luaforwindows librairies and hook print function
function open()
if fp~=nil then close() end
fp=lp.Fopen(HLUA_outputfile,'at');
return fp;
end
function close()
if fp==nil then return end
lp.Fclose(fp);
fp=nil;
end
function w(val)
open();
if fp==nil then return end
lp.Fprintf(fp,val);
close();
end
w("<html><body><h1>Hello world</h1></body></html>");
</lua>
Nous utilisons en premier les 3 finctions (w, close,open) qui nous aide a écrire du texte dans le fichier de sortie, la page WEB a envoyé au navigateur du client.
La fonction w est utilize pour générer les balises HTML de mise en forme de la page WEB.
Le fichier test.hlua est ensuite sauvé dans le répertoire /bin/www/hlua.
Dans le navigateur client il faut simplement appelé la page nouvellement créée.
http://127.0.0.1:8010/hlua/test.hlua
Le texte est affiché.
Dans ce deuxième exemple, en utilisant l’éditeur de script LUA nous allons créer une page WEB en XML très simple qui affiche le texte “Hello World”.
Attention, utilisez de simple guillemet pour délimiter une valeur d’attribut d’une balise XML.
<lua>
-- Input values
-- lp_index index for this script ".1"
-- lp_oid SNMP OID for this script "ifnumber"
-- lp_host default ip address for this script "127.0.0.1"
-- Output Values
lp_value = 0;
lp_buffer ="error";
-- dofile(lp.GetPath().."/config/script/loriotinit.lua"); -- to support define
-- lp.InitLuaPath(); -- to support luaforwindows librairies and hook print function
function open()
if fp~=nil then close() end
fp=lp.Fopen(HLUA_outputfile,'at');
return fp;
end
function close()
if fp==nil then return end
lp.Fclose(fp);
fp=nil;
end
function w(val)
open();
if fp==nil then return end
lp.Fprintf(fp,val);
close();
end
w("<?xml version='1.0' encoding='utf-8'?>");
w("<WebPage>");
w(" <PageTitle>Hello world</PageTitle>");
w("</WebPage>");
</lua>
La page est simplement appelé en entrant le lien dans le navigateur : http://127.0.0.1:8010/hlua/test.xlua
Comme il n’y a pas de feuille de style XSL attaché a ce fichier XML aucun formatage n’est appliqué et le code brut est affiché dans le navigateur.
Pour formater le XML nous créons une feuille de style XSL que nous sauvegardons directement dans le répertoire du fichier test.xlua.
Code de la feuille de style XSL.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Test example of xlua</title>
</head>
<body>
<h1>
<xsl:value-of select="WebPage/PageTitle"/>
</h1>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Pour que la feuille de style soit appelée lors du chargement du fichier XML on doit ajouter la ligne de code (en rouge) dans le fichier xlua.
w("<?xml version='1.0' encoding='utf-8'?>");
w("<?xml-stylesheet href='test.xsl' type='text/xsl'?>");
w("<WebPage>");
w(" <PageTitle>Hello world</PageTitle>");
w("</WebPage>");
</lua>
Miantenant l’exécution du code à lapel du lien http://127.0.0.1:8010/hlua/test.xlua affiche une page formatée.
Remarque: des caractères d’échappement \n et \t peuvent être utilize pour le formatage du code source XML.
Les fichiers ont l’extension HLUA ou XLUA en fonction du type de fichier à générer.
Extension sur le serveur |
Type de fichier généré pour le browser client |
HLUA hlua |
html |
XLUA xlua |
xml |
Les fichiers sont placés dans le répertoire bin/www/hlua ou dans les répertoires dédiés aux utilisateurs et fichiers de rapports globaux.
Si le fichier HLUA est utilisé dans les répertoires de rapports globaux ou les répertoires propres à chaque utilisateur, il est possible de fournir un icône et un titre aux liens qui seront affichés dans l’interface web. Il faut alors modifier les deux premières lignes du code du fichier pour fournir au serveur Web des indications lui permettant de présenter correctement le lien dans l’interface.
--<!-- <img border=0 src='/img/status11.jpg'>your comment here !!-->
--<!-- level 0 -->
Il y a trois zones modifiables dans ces deux lignes.
Zone 1 : Définition de l’icône associé au script.
Zone 2 : Le commentaire associé au script.
Zone 3 : Le « level » du script : Le script d’un « level » supérieur à celui définit dans le profil d’un utilisateur ne doit pas pouvoir être lancé.
--<!-- <img border=0 src='/img/status11.jpg'>your comment here !!-->
--<!-- level 0 -->
Exemple de fichier multi sections, les sections LUA sont en vert les sections en HTML natif sont en noir.
<html>
<title>sample HLUA multi session script</title>
<Head></head>
<body>
<lua>
fp=nil;
function open()
if fp~=nil then close() end
fp=lp.Fopen(HLUA_outputfile,'at');
return fp;
end
function close()
if fp==nil then return end
lp.Fclose(fp);
fp=nil;
end
function w(val)
open();
if fp==nil then return end
lp.Fprintf(fp,val);
close();
end
</lua>
<b>start of the HTML page</b><br>
<lua>
for i=0,5 do
str=string.format("first session line %i<br>",i);
w(str);
end
</lua>
<b>Middle of the HTML page</b><br>
<lua>
for i=0,5 do
str=string.format("second session line %i<br>",i);
w(str);
end
</lua>
<b>end of the HTML page</b><br>
</body>
</html>
Liste des variables globales fournies aux sections LUA de pages WEB :
Remarque : Certains paramètres ne sont pas forcement renseignés, cela dépend du type de browser client utilisé et de l’URL demandée.
Variables |
Description |
HLUA_outputfile |
C’est le nom du fichier temporaire qui sera envoyé au browser web distant. L’ensemble des écritures devant générer la page web dynamique sera sauvegardé dans ce fichier en mode append. Pour simplifier l’opération quelques fonctions LUA sont définit dans une portion du code pour simplifier l’opération d’écriture. --<lua> function open() if fp~=nil then close() end fp=lp.Fopen(HLUA_outputfile,'at'); return fp; end function close() if fp==nil then return end lp.Fclose(fp); fp=nil; end function w(val) open(); if fp==nil then return end lp.Fprintf(fp,val); lp.Print(val); close(); end function g(val) v=lp.atof(val); if v==0 then return ("0"); end str1=string.format("%.1f",v); --replace les .0 en rien return(str1); end </lua> |
HLUA_IP |
Fournit l’adresse IP du poste distant (le browser) |
HLUA_Username |
Fournit le nom du login pour cette page |
HLUA_URL |
L’URL de cette page |
HLUA_Cookie |
Le cookie associé s’il existe |
HLUA_Extra |
Des paramètres passés avec l’URL |
HLUA_Referer |
La page web précédente demandé par le browser distant |
HLUA_RemoteHost |
Le nom DNS du browser distant s’il existe |
HLUA_Request |
|
HLUA_user_name |
Le nom de login trouvé dans le profil de la session |
HLUA_user_uid |
L’UID de l’objet de la Directory associé a cette session. |
HLUA_user_database |
La session a t’elle le droit d’accéder a la database local : 1 oui 0 non |
HLUA_user_browsedir |
La session a t’elle le droit d’accéder au répertoire : 1 oui 0 non |
HLUA_user_events |
La session a t’elle le droit d’accéder aux fichiers d’événements : 1 oui 0 non |
HLUA_user_level |
La session a quel niveau d’accès |
HLUA_user_map |
La session a t’elle le droit d’accéder à la MAP de niveau 3 : 1 oui 0 non |
HLUA_user_php |
La session a t’elle le droit d’accéder au PHP (obsolète) : 1 oui 0 non |
HLUA_user_script |
La session a t’elle le droit d’exécuter des scripts de type REP : 1 oui 0 non |
HLUA_user_syslog |
La session a t’elle le droit d’accéder aux fichiers syslog : 1 oui 0 non |
HLUA_user_traps |
La session a t’elle le droit d’accéder aux fichiers de TRAP : 1 oui 0 non |
HLUA_user_global_lua |
La session a t’elle le droit d’exécuter globalement des scripts LUA : 1 oui 0 non |
HLUA_user_local_lua |
La session a t’elle le droit d’exécuter localement des scripts LUA : 1 oui 0 non |
HLUA_Value |
C’est une table LUA ou les variables passées par l’URL en ligne sont interprété sous la forme de variables. for key,value in pairs(HLUA_Value) do lp.Fprintf(fp,'[',key,'] [',value,']<br>') end |
Voici un exemple de code qui exploite ces paramètres.
--<!-- <img border=0 src='/img/status11.jpg'>your comment here !!-->
--<!-- level 0 -->
--<!--
-- OEMSNMPManager V6.00 Web File To Script LUA File
-- Generated by the OEMSNMPManager Editor Wizard at : Thu Dec 10 16:33:55 2009
--------------------------------------------------------------------
-- if global to run correctly this file is located to path bin/www/hlua/xxxx.hlua
-- if local to run correctly this file is located to path bin/www/usr/username/xxxx.hlua
--------------------------------------------------------------------
-- Use this line of code if you want use some defined OEMSNMPManager LUA Define
-- dofile(lp.GetPath().."/config/script/loriotinit.lua");
--------------------------------------------------------------------
-- Input values imported by the Web Server and passed to this script
--------------------------------------------------------------------
-- HLUA_outputfile the file name to append (sending by the server to the client)
-- HLUA_IP IP address of the client
-- HLUA_Username client login user name
-- HLUA_URL The URL for this page
-- HLUA_Cookie The Cookie if exist
-- HLUA_Extra The URL value part no parsed
-- HLUA_Referer The last URL used by the client
-- HLUA_RemoteHost The DNS Name of the client if exist
-- HLUA_Request The number of this Trap received (no acked)
-- HLUA_user_name The name find in policy
-- HLUA_user_uid The available directory root for this client
-- HLUA_user_database The database access : 1 Yes 0 No
-- HLUA_user_browsedir The web directory browsing access : 1 Yes 0 No
-- HLUA_user_events The events files access : 1 Yes 0 No
-- HLUA_user_level The client level : 1 Yes 0 No
-- HLUA_user_map The network MAP access : 1 Yes 0 No
-- HLUA_user_php The PHP access : 1 Yes 0 No
-- HLUA_user_script The REP script access : 1 Yes 0 No
-- HLUA_user_syslog The syslog files access : 1 Yes 0 No
-- HLUA_user_traps The traps files access : 1 Yes 0 No
-- HLUA_user_global_lua The global lua web access : 1 Yes 0 No
-- HLUA_user_local_lua The local lua web access : 1 Yes 0 No
-- HLUA_Value The table with parsed URL value (value name is index)
-- use this part to simulate an Event to debug your script
--[[
HLUA_outputfile='c:/test.html'; --
HLUA_IP=''; --
HLUA_Username=''; --
HLUA_URL=''; --
HLUA_Cookie=''; --
HLUA_Extra=''; --
HLUA_Referer=''; --
HLUA_RemoteHost=''; --
HLUA_Username=''; --
HLUA_Request=''; --
HLUA_user_name=''; --
HLUA_user_uid=''; --
HLUA_user_database=''; --
HLUA_user_browsedir=''; --
HLUA_user_events=''; --
HLUA_user_host_event=''; --
HLUA_user_level=''; --
HLUA_user_map=''; --
HLUA_user_php=''; --
HLUA_user_script=''; --
HLUA_user_syslog=''; --
HLUA_user_traps=''; --
HLUA_user_syslog=''; --
HLUA_user_global_lua=''; --
HLUA_user_local_lua=''; --
HLUA_Value={}; --
HLUA_Value['ip']='127.0.0.1'; --
-- use this part to simulate an Event to debug your script
]]--
--------------------------------------------------------------------
-- Start of your program ------------------------------------------
--------------------------------------------------------------------
-- TODO: Add your message handler code here and/or call default
-- use this part to simulate an Event to debug your script
-->
--<lua>
function open()
--lp.Print(HLUA_outputfile,'\n');
fp=lp.Fopen(HLUA_outputfile,'at');
--if (fp) then lp.Print('test open file'); end
return fp;
end
function write(fp,val)
if fp==nil then return nil end
lp.Fprintf(fp,val);
return 1
end
function close(fp)
if fp==nil then return nil end
lp.Fclose(fp);
return 1;
end
function f1(fp)
--lp.SendSyslog(lp_host,'test 1');
--lp.SendSyslog(lp_host,HLUA_outputfile);
if fp then
--lp.Print('test f1 \n');
lp.Fprintf(fp,'HLUA_outputfile=',HLUA_outputfile ,'<br>');
lp.Fprintf(fp,'HLUA_IP=',HLUA_IP ,'<br>');
lp.Fprintf(fp,'HLUA_Username=',HLUA_Username,'<br>');
lp.Fprintf(fp,'HLUA_URL=',HLUA_URL,'<br>');
lp.Fprintf(fp,'HLUA_Cookie=',HLUA_Cookie,'<br>');
lp.Fprintf(fp,'HLUA_Extra=',HLUA_Extra,'<br>');
lp.Fprintf(fp,'HLUA_Referer=',HLUA_Referer,'<br>');
lp.Fprintf(fp,'HLUA_RemoteHost=',HLUA_RemoteHost,'<br>');
lp.Fprintf(fp,'HLUA_Username=',HLUA_Username,'<br>');
lp.Fprintf(fp,'HLUA_Request=',HLUA_Request,'<br>');
lp.Fprintf(fp,'HLUA_user_name=',HLUA_user_name,'<br>');
lp.Fprintf(fp,'HLUA_user_uid=',HLUA_user_uid,'<br>');
lp.Fprintf(fp,'HLUA_user_database=',HLUA_user_database,'<br>');
lp.Fprintf(fp,'HLUA_user_browsedir=',HLUA_user_browsedir,'<br>');
lp.Fprintf(fp,'HLUA_user_events=',HLUA_user_events,'<br>');
lp.Fprintf(fp,'HLUA_user_host_event=',HLUA_user_host_event,'<br>');
lp.Fprintf(fp,'HLUA_user_level=',HLUA_user_level,'<br>');
lp.Fprintf(fp,'HLUA_user_map=',HLUA_user_map,'<br>');
lp.Fprintf(fp,'HLUA_user_php=',HLUA_user_php,'<br>');
lp.Fprintf(fp,'HLUA_user_script=',HLUA_user_script,'<br>');
lp.Fprintf(fp,'HLUA_user_syslog=',HLUA_user_syslog,'<br>');
lp.Fprintf(fp,'HLUA_user_traps=',HLUA_user_traps,'<br>');
lp.Fprintf(fp,'HLUA_user_global_lua=',HLUA_user_global_lua,'<br>');
lp.Fprintf(fp,'HLUA_user_local_lua=',HLUA_user_local_lua,'<br>');
lp.Fprintf(fp,'<hr>');
for key,value in pairs(HLUA_Value) do lp.Fprintf(fp,'[',key,'] [',value,']<br>') end
end
end
--</lua>
<b> put some html tag </b><br>
--<lua>
open(); f1(fp); close(fp);
--</lua>
Voici le résultat dans le browser distant.
Pour tester le fichier HLUA ou XLUA créer il est possible de le lancer directement à partir de l’éditeur. Contrairement à un fichier LUA classique LoriotPro, le fichier doit être exécuté avec la touche F6.
L’exécution du script sera réalisée et votre browser web local par défaut lancé pour afficher le résultat de la génération.
Pour debogguer ce type de script il est possible d’utiliser la commande lp.Print(xxx) dans le code pour avoir un affichage dans la fenêtre de sortie classique de l’éditeur.
Si nous rajoutons la ligne suivante au code précédent.
<lua>
for i=0,5 do
str=string.format("first session line %i<br>",i);
lp.Print(str,"\n");
w(str);
end
</lua>
Nous aurons un contrôle possible du code dans la fenêtre standard de sortie à l’exécution.
Il est possible que l’interpréteur LUA détecte une erreur de syntaxe dans votre code. Dans ce cas un message est affiché dans la fenêtre standard pour vous indiquer l’emplacement de l’erreur.
Remarque : dans ce cas la page HTML générée n’est pas affichée.
Exemple : une erreur de syntaxe est introduite dans le code :
<lua>
for i=0,5 do
str=string.format("first session line %i<br>",i);
lp.rPrint(str,"\n");
w(str);
end
</lua>
A l ‘exécution nous obtenons un message d’erreur et une fenêtre notepad est affiché avec une copie de la section du code concerné par l’erreur. Le numéro de ligne fournit dans la fenêtre standard de sortie correspond à la section de code copiée dans le fichier texte ouvert avec notepad. Cette méthode est utilisé pour faciliter le débogage de fichier multi sections complexes.
Lorsqu’un browser distant demande une page possédant les extensions HLUA ou XLUA au serveur Web intégré à LoriotPro, si le fichier existe, LoriotPro interprète ce fichier pour transformer les sections contenant du script LUA en texte compréhensible par le browser distant (HTML ou XML).
Exemple :
Cette exemple complexe browse la Directory de LoriotPro et génère dynamiquement des barre graphe des statuts des équipements présent en fonction de leurs usages.
Cet exemple est disponible sur http://127.0.0.1:8010/hlua/AvailabilityOverview.xlua
Dans cet exemple le fichier AvailabilityOverview.xlua appelé par le browser Mozilla possède une extension indiquant au server Web que ce fichier contient du code LUA et qu’il doit être interprété avant d’être envoyé au browser.
Voici le code XML résultant généré pour le browser
<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet href='AvailabilityOverview.xsl' type='text/xsl'?>
<AvailabilityOverview>
<AvailNode>
<Icon>Root32.jpg</Icon>
<Desc><![CDATA[total]]></Desc>
<UnTo lnk='TotalOverview.xlua'><![CDATA[20/20]]></UnTo>
<AvailBlue lnk="testblue"><![CDATA[5]]></AvailBlue>
<AvailGreen lnk="testgreen"><![CDATA[25]]></AvailGreen>
<AvailRed lnk="testred"><![CDATA[70]]></AvailRed>
</AvailNode>
<AvailNode>
<Icon>d_server.gif</Icon>
<Desc><![CDATA[server]]></Desc>
<UnTo lnk='ServerOverview.xlua'><![CDATA[1/20]]></UnTo>
<AvailBlue lnk="testblue"><![CDATA[100]]></AvailBlue>
</AvailNode>
<AvailNode>
<Icon>d_router.gif</Icon>
<Desc><![CDATA[router]]></Desc>
<UnTo lnk='RouterOverview.xlua'><![CDATA[5/20]]></UnTo>
<AvailGreen lnk="testgreen"><![CDATA[40]]></AvailGreen>
<AvailRed lnk="testred"><![CDATA[60]]></AvailRed>
</AvailNode>
<AvailNode>
<Icon>Interro.gif</Icon>
<Desc><![CDATA[other]]></Desc>
<UnTo lnk='OtherOverview.xlua'><![CDATA[14/20]]></UnTo>
<AvailGreen lnk="testgreen"><![CDATA[21]]></AvailGreen>
<AvailRed lnk="testred"><![CDATA[79]]></AvailRed>
</AvailNode>
</AvailabilityOverview>
Remarque : Nous n’avons reproduit ici les fichiers CSS et XSL (il se trouve dans le répertoire www/hlua).
Voici le contenue du fichier XLUA utilisé pour la génération :
Les sections de code LUA sont encadrées des balises <lua> ….. </lua>.
Dans cette exemple les sections de code LUA seront interprétées par le server Web avant d’être envoyé au browser distant.
<lua>
-- OEMSNMPManager V6.00
-- To run correctly this file is located to bin/config/script
-- Input values
-- lp_index index for this script ".1"
-- lp_oid SNMP OID for this script "ifnumber"
-- lp_host default ip address for this script "127.0.0.1"
-- Output Values
lp_value = 0;
lp_buffer ="error";
-- dofile(lp.GetPath().."/config/script/loriotinit.lua"); -- to support define
-- lp.InitLuaPath(); -- to support luaforwindows librairies and hook print function
--HLUA_outputfile="c:\test.html"
icon={};link={};
LP_LUA_ISDEVICE_AUTO = 0;icon[0]="Interro.gif";link[0]="OtherOverview.xlua";
LP_LUA_ISDEVICE_HOST = 1;icon[1]="d_host01.gif";link[1]="HostOverview.xlua";
LP_LUA_ISDEVICE_SERVER = 2;icon[2]="d_server.gif";link[2]="ServerOverview.xlua";
LP_LUA_ISDEVICE_HUB = 3;icon[3]="d_hub.gif";link[3]="HubOverview.xlua";
LP_LUA_ISDEVICE_SWITCH = 4;icon[4]="d_switch.gif";link[4]="SwitchOverview.xlua";
LP_LUA_ISDEVICE_ROUTER = 5;icon[5]="d_router.gif";link[5]="RouterOverview.xlua";
LP_LUA_ISDEVICE_PRINTER = 6;icon[6]="d_printer.gif";link[6]="PrinterOverview.xlua";
LP_LUA_ISDEVICE_PHONE = 7;icon[7]="d_phone.gif";link[7]="PhoneOverview.xlua";
LP_LUA_ISDEVICE_TOTAL = 8;icon[8]="Root32.jpg";link[8]="TotalOverview.xlua";
function open()
if fp~=nil then close() end
fp=lp.Fopen(HLUA_outputfile,'at');
return fp;
end
function close()
if fp==nil then return end
lp.Fclose(fp);
fp=nil;
end
function w(val)
open();
if fp==nil then return end
lp.Fprintf(fp,val);
lp.Print(val);
close();
end
function g(val)
v=lp.atof(val);
if v==0 then return ("0"); end
str1=string.format("%.1f",v);
--replace les .0 en rien
return(str1);
end
function GetStat(uid)
lp.Print(uid," start\n");
stat[LP_LUA_ISDEVICE_AUTO][6]="other";
stat[LP_LUA_ISDEVICE_HOST][6]="host";
stat[LP_LUA_ISDEVICE_SERVER][6]="server";
stat[LP_LUA_ISDEVICE_HUB][6]="hub";
stat[LP_LUA_ISDEVICE_SWITCH][6]="switch";
stat[LP_LUA_ISDEVICE_ROUTER][6]="router";
stat[LP_LUA_ISDEVICE_PRINTER][6]="printer";
stat[LP_LUA_ISDEVICE_PHONE][6]="phone";
stat[LP_LUA_ISDEVICE_TOTAL][6]="total";
a=lp.GetAllHostFromContainer(uid,"ar");
if (a~=nil) then
host_number=a;
for i=0,a-1 do
--lp.Print(string.format("ip(%i) = %s %s\n",i+1,ar[i]));
if lp.GetIPInformation(ar[i],"b") then
lp.Print(string.format("Device type = %s \n",b.device_type));
r=LP_LUA_ISDEVICE_TOTAL;
if b.status ~= 0 then stat[r][5]=stat[r][5]+1; end
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
if b.device_type == LP_LUA_ISDEVICE_AUTO then
r=LP_LUA_ISDEVICE_AUTO;
if b.status ~= 0 then stat[r][5]=stat[r][5]+1; end
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_HOST then
r=LP_LUA_ISDEVICE_HOST;
if b.status ~= 0 then stat[r][5]=stat[r][5]+1; end
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_SERVER then
r=LP_LUA_ISDEVICE_SERVER;
if b.status ~= 0 then stat[r][5]=stat[r][5]+1; end
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_HUB then
r=LP_LUA_ISDEVICE_HUB;
if b.status ~= 0 then stat[r][5]=stat[r][5]+1; end
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_SWITCH then
r=LP_LUA_ISDEVICE_AUTO;
if b.status ~= 0 then stat[r][5]=stat[r][5]+1; end
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_ROUTER then
r=LP_LUA_ISDEVICE_ROUTER;
if b.status ~= 0 then stat[r][5]=stat[r][5]+1; end
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_PRINTER then
r=LP_LUA_ISDEVICE_PRINTER;
if b.status ~= 0 then stat[r][5]=stat[r][5]+1; end
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_PHONE then
r=LP_LUA_ISDEVICE_PHONE;
if b.status ~= 0 then stat[r][5]=stat[r][5]+1; end
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
end
end
--callcul des moyennes
for i=0,8 do -- pour chaque type d'objet
for j=1,4 do -- pour chaque statut du bleu au rouge (violet non pris en compte
if stat[i][5]>0 then
--stat[i][7+j]= math.ceil((stat[i][j]/stat[i][5])*100);
if (stat[i][j]/stat[i][5])*100 > math.floor((stat[i][j]/stat[i][5])*100)+ 0.5 then
stat[i][7+j]= math.ceil((stat[i][j]/stat[i][5])*100);
else stat[i][7+j]= math.floor((stat[i][j]/stat[i][5])*100);
end
else
stat[i][7+j]=0;
end
lp.Print(stat[i][7+j],' ');
end
lp.Print('\n');
end
lp.Print("end\n");
return (host_number);
end
return (nil);
end
stat={};
--init les values de la matrice
for i=0,8 do -- tableau des types de host excepté le total
stat[i]={}; --status
for j=0,10 do
stat[i][j]=0;
end
end
if (GetStat("world")) then
for i=0,8 do
for j=0,10 do
lp.Print(g(stat[i][j]),' ');
end
lp.Print('\n');
end
end
--génération du fichier de sortie xml
xsltemplate = "AvailabilityOverview.xsl";
--xsltemplate = nil;
w("<?xml version='1.0' encoding='utf-8'?>\n");
if xsltemplate ~= nil then
w("<?xml-stylesheet href='"..xsltemplate.."' type='text/xsl'?>\n");
end
w("<AvailabilityOverview>\n");
ordre={};
ordre[0]=8;--LP_LUA_ISDEVICE_TOTAL
ordre[1]=1;--LP_LUA_ISDEVICE_SERVER
ordre[2]=2;--LP_LUA_ISDEVICE_HOST
ordre[3]=5;--LP_LUA_ISDEVICE_ROUTER
ordre[4]=4;--LP_LUA_ISDEVICE_SWITCH
ordre[5]=3;--LP_LUA_ISDEVICE_HUB
ordre[6]=6;--LP_LUA_ISDEVICE_PRINTER
ordre[7]=7;--LP_LUA_ISDEVICE_PHONE
ordre[8]=0;--LP_LUA_ISDEVICE_AUTO
for i=0,8 do
if (stat[ordre[i]][5]>0) then
w("\t<AvailNode>\n");
w("\t<Icon>"..icon[ordre[i]].."</Icon>\n");
w("\t<Desc><![CDATA["..stat[ordre[i]][6].."]]></Desc>\n");
w("\t<UnTo lnk='"..link[ordre[i]].."'><![CDATA["..stat[ordre[i]][5].."/"..stat[ordre[0]][5].."]]></UnTo>\n");
--w("\t<AvailMagenta lnk=".."\"testmagenta\"".."><![CDATA["..stat[ordre[i]][7].."]]></AvailMagenta>\n");
if stat[ordre[i]][8] > 0 then
w("\t<AvailBlue lnk=".."\"testblue\"".."><![CDATA["..stat[ordre[i]][8].."]]></AvailBlue>\n");
end
if stat[ordre[i]][9] > 0 then
w("\t<AvailGreen lnk=".."\"testgreen\"".."><![CDATA["..stat[ordre[i]][9].."]]></AvailGreen>\n");
end
if stat[ordre[i]][10] > 0 then
w("\t<AvailYellow lnk=".."\"testyellow\"".."><![CDATA["..stat[ordre[i]][10].."]]></AvailYellow>\n");
end
if stat[ordre[i]][11] > 0 then
w("\t<AvailRed lnk=".."\"testred\"".."><![CDATA["..stat[ordre[i]][11].."]]></AvailRed>\n");
end
w("\t</AvailNode>\n");
end
end
w("</AvailabilityOverview>\n");
</lua>
Dans cet exemple l’ensemble du fichier est réalisé en LUA et il n’y a qu’une portion de code. Il est possible de réaliser des fichiers mixtes qui vont contenir des sections de code de type HTML ou XML et du script LUA. Dans cette autre exemple le code est mixte (les parties LUA sont en vert).
--<lua>
-- OEMSNMPManager V6.00
-- To run correctly this file is located to bin/config/script
-- Input values
-- lp_index index for this script ".1"
-- lp_oid SNMP OID for this script "ifnumber"
-- lp_host default ip address for this script "127.0.0.1"
-- Output Values
lp_value = 0;
lp_buffer ="error";
-- dofile(lp.GetPath().."/config/script/loriotinit.lua"); -- to support define
-- lp.InitLuaPath(); -- to support luaforwindows librairies and hook print function
--HLUA_outputfile="c:\test.html"
LP_LUA_ISDEVICE_AUTO = 0;
LP_LUA_ISDEVICE_HOST = 1;
LP_LUA_ISDEVICE_SERVER = 2;
LP_LUA_ISDEVICE_HUB = 3;
LP_LUA_ISDEVICE_SWITCH = 4;
LP_LUA_ISDEVICE_ROUTER = 5;
LP_LUA_ISDEVICE_PRINTER = 6;
LP_LUA_ISDEVICE_PHONE = 7;
LP_LUA_ISDEVICE_TOTAL = 8;
function open()
if fp~=nil then close() end
fp=lp.Fopen(HLUA_outputfile,'at');
return fp;
end
function close()
if fp==nil then return end
lp.Fclose(fp);
fp=nil;
end
function w(val)
open();
if fp==nil then return end
lp.Fprintf(fp,val);
lp.Print(val);
close();
end
function g(val)
v=lp.atof(val);
if v==0 then return ("0"); end
str1=string.format("%.1f",v);
--replace les .0 en rien
return(str1);
end
function GetStat(uid)
lp.Print(uid," start\n");
stat[LP_LUA_ISDEVICE_AUTO][6]="other";
stat[LP_LUA_ISDEVICE_HOST][6]="host";
stat[LP_LUA_ISDEVICE_SERVER][6]="server";
stat[LP_LUA_ISDEVICE_HUB][6]="hub";
stat[LP_LUA_ISDEVICE_SWITCH][6]="switch";
stat[LP_LUA_ISDEVICE_ROUTER][6]="router";
stat[LP_LUA_ISDEVICE_PRINTER][6]="printer";
stat[LP_LUA_ISDEVICE_PHONE][6]="phone";
stat[LP_LUA_ISDEVICE_TOTAL][6]="total";
a=lp.GetAllHostFromContainer(uid,"ar");
if (a~=nil) then
host_number=a;
for i=0,a-1 do
--lp.Print(string.format("ip(%i) = %s \n",i+1,ar[i]));
if lp.GetIPInformation(ar[i],"b") then
r=LP_LUA_ISDEVICE_TOTAL;
stat[r][5]=stat[r][5]+1;
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
if b.device_type == LP_LUA_ISDEVICE_AUTO then
r=LP_LUA_ISDEVICE_AUTO;
stat[r][5]=stat[r][5]+1;
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_HOST then
r=LP_LUA_ISDEVICE_HOST;
stat[r][5]=stat[r][5]+1;
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_SERVER then
r=LP_LUA_ISDEVICE_SERVER;
stat[r][5]=stat[r][5]+1;
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_HUB then
r=LP_LUA_ISDEVICE_HUB;
stat[r][5]=stat[r][5]+1;
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_SWITCH then
r=LP_LUA_ISDEVICE_AUTO;
stat[r][5]=stat[r][5]+1;
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_ROUTER then
r=LP_LUA_ISDEVICE_ROUTER;
stat[r][5]=stat[r][5]+1;
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_PRINTER then
r=LP_LUA_ISDEVICE_PRINTER;
stat[r][5]=stat[r][5]+1;
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
if b.device_type == LP_LUA_ISDEVICE_PHONE then
r=LP_LUA_ISDEVICE_PHONE;
stat[r][5]=stat[r][5]+1;
if b.status == 0 then stat[r][0]=stat[r][0]+1; end
if b.status == 1 then stat[r][1]=stat[r][1]+1; end
if b.status == 2 then stat[r][2]=stat[r][2]+1; end
if b.status == 3 then stat[r][3]=stat[r][3]+1; end
if b.status == 4 then stat[r][4]=stat[r][4]+1; end
end
end
end
--callcul des moyennes
for i=0,8 do
for j=0,4 do
if stat[i][5]>0 then
stat[i][7+j]=(stat[i][j]/stat[i][5])*100;
else
stat[i][7+j]=0;
end
lp.Print(stat[i][7+j],' ');
end
lp.Print('\n');
end
lp.Print("end\n");
return (host_number);
end
return (nil);
end
stat={};
--init les values de la matice
for i=0,8 do -- tableau des types de host
stat[i]={}; --status
for j=0,11 do
stat[i][j]=0;
end
end
if (GetStat("world")) then
for i=0,8 do
for j=0,11 do
lp.Print(g(stat[i][j]),' ');
end
lp.Print('\n');
end
end
--</lua>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<META HTTP-EQUIV='Refresh' CONTENT='5'>
<META HTTP-EQUIV='Pragma' CONTENT='no-cache' >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans nom</title>
<link href="sample.css" rel="stylesheet" type="text/css" />
</head>
<body>
<table class="tbdef" border="0" cellspacing="0" cellpadding="0">
<tr>
<td colspan="4"><span class="tdtitle1">Availability Overview</span></td>
</tr>
<tr>
<td colspan="4"> </td>
</tr>
<tr>
<td colspan="4" class="tdtitle2">Current status</td>
</tr>
<tr>
<th class="tbdef"> </th>
<th class="tbdef">Description</th>
<th class="tbdef">Units/Total</th>
<th class="tbdef">Availability in % of total</th>
</tr>
<tr>
<td class="tdtxt"> </td>
<td class="tdtxt">Global Availability</td>
<td class="tdtxt">254/254</td>
<td class="tdtxt">
<div class="apDiv1">
<div class="bg1" style="width:10%;"><a href="/lien">10</a></div>
<div class="bg2" style="width:25%;">25</div>
<div class="bg3" style="width:15%;">15</div>
<div class="bg4" style="width:50%;">50</div>
</div></td>
</tr>
<lua>
for i=0,8 do
if (stat[i][5]>0) then
w(string.format("<tr>"));
w(string.format('<td class="tdtxt"><img src="img/Interro.gif" alt="interrop->" width="32" height="32" /></td>'));
w(string.format('<td class="tdtxt">%s Availability</td>',stat[i][6]));
w(string.format('<td class="tdtxt">%i/%i</td>',stat[i][5],stat[8][5]));
w(string.format('<td class="tdtxt">'));
w(string.format('<div class="apDiv1">'));
w(string.format('<div class="bg0" style="width:%i%%;">%i</div>',stat[i][7],stat[i][7]));
w(string.format('<div class="bg1" style="width:%i%%;">%i</div>',stat[i][8],stat[i][8]));
w(string.format('<div class="bg2" style="width:%i%%;">%i</div>',stat[i][9],stat[i][9]));
w(string.format('<div class="bg3" style="width:%i%%;">%i</div>',stat[i][10],stat[i][10]));
w(string.format('<div class="bg4" style="width:%i%%;">%i</div>',stat[i][11],stat[i][11]));
w(string.format('</div></td>'));
w(string.format("</tr>\n"));
end
end
</lua>
</table>
<p> </p>
</body>
</html>
Lors de l’interprétation du fichier HLUA ou XLUA, le serveur web reproduit les sections hors balise <lua> … </lua> sans modification et interprète les sections <lua>…</lua>. Pour réaliser cette opération le serveur Web génère des fichiers temporaires et fournit au script LUA un certain nombre de paramètre lui permettant de réaliser l’insertion dynamique.
Les fichiers HLUA ou XLUA permettent d’accéder à l’ensemble des fonctions LUA LoriotPro. Ils peuvent donc écrire et lire dans la Directory et réaliser tout type de traitement. Cependant du fait de leur mode d’utilisation les librairies LPAV propre au active-view n’est pas utilisable. L’usage de fenêtre et de libraires générant des Popup ou dialogue box ne sont pas utilisable car la fenêtre apparaitrait sur le poste ou tourne LoriotPro et bloquerais la session.
Il est recommandé d’écrire des codes simples et rapides pour ne pas bloquer et saturer les threads alloués au serveur WEB. Les fichiers de script HLUA et XLUA doivent donc être écrit dans une logique non bloquante et d’exécution rapide.
La page Web générée par le script est envoyée au browser client une fois terminé. Il est donc nécessaire que la génération soit rapide pour éviter un timeout du coté du poste client.
![]() |
|