Première version
This commit is contained in:
commit
43e6f0ee89
638
lib/liblog.3
Normal file
638
lib/liblog.3
Normal file
@ -0,0 +1,638 @@
|
||||
'\" t
|
||||
.\" @(#)LIBLOG.3 1.0 00/07/04 SMA;
|
||||
.TH LIBLOG 3 "07 Apr 2000"
|
||||
.SH NOM
|
||||
LIBLOG (librairie d'interface avec le systeme de suivi et de pilotage)
|
||||
.SH SYNOPSIS
|
||||
.LP
|
||||
.BI "cc [flag ...] file ... -lver -ldl -lnode -lshmem -ldatastr -lmsg -ladm -lgen -llog [library ...]"
|
||||
.LP
|
||||
.BI "#include <log.h>"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Library_Open ( int " Instance ", LOGT_Flags " Open_Mode ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Library_Close ( LOGT_Flags " Close_Mode ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Library_Stderr_Set ( FILE * " Out ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Channel_Open ( LOGT_Channel ** " Channel ", int " Pid ", int " Channel_Id ", char * " Module_Name ", char * " Master_Module_Name ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Channel_Enter ( LOGT_Channel * " Channel ", char * " Sub_Module_Name ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Channel_Leave ( LOGT_Channel * " Channel ", char * " Sub_Module_Name ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Channel_Close ( LOGT_Channel * " Channel ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_RTab_Alloc ( LOGT_RTab ** " Rtab ", char * " Name " );"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_RTab_Setup ( LOGT_RTab * " RTab ", LOGT_RuleClass " Rule_Class ", LOGT_Rule " Rule ", LOGT_Rooting " Value ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_RTab_Add ( LOGT_Channel * " Channel ", LOGT_RTab * " RTab ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_RTab_Remove ( LOGT_Channel * " Channel ", LOGT_RTab * " RTab ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_RTab_Free ( LOGT_RTab * " RTab ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Trigger_Add ( LOGT_Trigger ** " Trigger ", LOGT_Channel * " Channel ", LOGT_RTab * " RTab ", char * " Event_Type ", LOGT_Flags " Trigger_Mode ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Trigger_Remove ( LOGT_Trigger * " Trigger ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Event_Send ( LOGT_Channel * " Channel ", LOGT_RC * " Return_Code ", char * " Cd_Support ", va_list " Data ");"
|
||||
.LP
|
||||
.BI "LOGT_RC LOG_Event_External_Send ( LOGT_Channel * " Channel ", char * " Cd_Support ", char * " Data ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Event_Info_Get ( LOGT_Channel * " Channel ", LOGT_Info * " Info ", va_list " Data ");"
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Event_Cpt_Get ( LOGT_Channel * " Channel ", int * " Cpt "[LOGD_RC_SIZE], char * " Reg_Expr ");"
|
||||
.LP
|
||||
.SH FONCTIONS
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Library_Open ( int " Instance ", LOGT_Flags " Open_Mode ");"
|
||||
.LP
|
||||
.RS 3
|
||||
La librairie LIBLOG met en place des ressources partagees par tous les traitements qui utilise la meme instance de la librairie LIBLOG :
|
||||
.LP
|
||||
.RS 3
|
||||
- les tables de routage systeme (GMRT et GDRT)
|
||||
.LP
|
||||
- le cache des modules
|
||||
.LP
|
||||
- le cache des formats d'evenement
|
||||
.LP
|
||||
- la queue de messages pour inserer les evenements en base
|
||||
.RS -3
|
||||
.LP
|
||||
Cette fonction permet d'acceder a ces ressources partagees pour une instance particuliere de la librairie:
|
||||
.LP
|
||||
.RS 3
|
||||
- en creation si
|
||||
.I Open_Mode
|
||||
vaut
|
||||
.B LOGD_CREATE
|
||||
.LP
|
||||
- en ouverture simple si
|
||||
.I Open_Mode
|
||||
vaut
|
||||
.B LOGD_OPEN
|
||||
.RS -3
|
||||
.LP
|
||||
.I NB
|
||||
: l'indicateur d'ouverture
|
||||
.I Open_Mode
|
||||
pourra etre combinee avec un mode de debugging (
|
||||
.B MSGD_DEBUG_NONE
|
||||
: aucun message d'erreur n'est affiche
|
||||
.LP
|
||||
.B MSGD_DEBUG
|
||||
: les messages d'erreur generes par la librairie LIBMSG sont affiches sur la sortie standard d'erreur
|
||||
.LP
|
||||
.B MSGD_DEBUG_ALL
|
||||
: les messages d'erreur generes par toutes les librairies sous-jacentes a la LIBMSG sont affiches sur la sortie standard d'erreur
|
||||
.LP
|
||||
.I NB
|
||||
: l'appel a cette fonction est obligatoire avant d'utiliser toute autre fonction de la librairie LIBLOG.
|
||||
.LP
|
||||
Le mode
|
||||
.B LOGD_CREATE
|
||||
est exclusivement reserve aux administrateurs !
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_Library_Close ( LOGT_Flags " Close_Mode " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de fermer ou de supprimer les ressources partagees de l'instance qu a ete ouverte :
|
||||
.LP
|
||||
.RS 3
|
||||
- Suppression si
|
||||
.I Close_Mode
|
||||
vaut
|
||||
.B LOGD_DESTROY
|
||||
.LP
|
||||
- Fermeture simple si
|
||||
.I Close_Mode
|
||||
vaut
|
||||
.B LOGD_CLOSE
|
||||
.RS -3
|
||||
.LP
|
||||
.I NB
|
||||
: la fermeture de la librairie est absolument necessaire une fois qu'un traitement a fini de l'utiliser.
|
||||
.LP
|
||||
Le mode
|
||||
.B LOGD_DESTROY
|
||||
est exclusivement reserve aux administrateurs !
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_Library_Stderr_Set ( FILE * " Out " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de definir
|
||||
.I Out
|
||||
comme la sortie standard des messages d'erreur de la librarie.
|
||||
.RS -3
|
||||
.LP
|
||||
.BI "LOGT_Status LOG_Channel_Open ( LOGT_Channel ** " Channel ", int " Pid ", int " Channel_Id ", char * " Module_Name ", char * " Master_Module_Name ");"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de creer un channel a travers lequel des evenements seront envoyes au systeme de suivi.
|
||||
Elle requiert les arguments suivants :
|
||||
.RS 3
|
||||
.LP
|
||||
* (Out)
|
||||
.I Channel
|
||||
: l'adresse du pointeur sur le channel a creer
|
||||
.LP
|
||||
* (In)
|
||||
.I Pid
|
||||
: l'identifiant du processus proprietaire du channel
|
||||
.LP
|
||||
* (In)
|
||||
.I Channel_Id
|
||||
: l'identifiant du channel
|
||||
.LP
|
||||
* (In)
|
||||
.I Module_Name
|
||||
: le nom du module proprietaire du channel
|
||||
.LP
|
||||
* (In)
|
||||
.I Master_Module_Name
|
||||
: le nom du module maitre (facultatif)
|
||||
.RS -3
|
||||
.LP
|
||||
.I Pour info
|
||||
:
|
||||
Le nom du module proprietaire du channel permet de connaitre le traitement qui est a l'origine des evenements qui sont envoyes au suivi. Le nom du module maitre permet de connaitre le contexte de lancement de ce traitement.
|
||||
.LP
|
||||
Le numero du processus permet de distinguer differents processus realisant un meme traitement.
|
||||
.LP
|
||||
L'identifiant du channel permet de distinguer les differents channels d'un meme processus.
|
||||
.LP
|
||||
.I NB
|
||||
: si le numero de processus passe en parametre vaut 0, alors c'est le processus courant qui sera considere comme processus proprietaire.
|
||||
Ce parametre doit surtout etre renseigne pour les programmes shell, afin que ce ne soit pas le numero de processus demon qui soit pris en compte.
|
||||
.LP
|
||||
Par convention, en fonctionnement mono-thread, l'identifiant du channel sera fixe a 0. En fonctionnement multi-thread, l'utilisateur est libre de fixer ce parametre comme il le veut.
|
||||
.LP
|
||||
.I NB
|
||||
: si le nom du module maitre vaut NULL, alors il sera renseigne avec le nom du module proprietaire du channel.
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_Channel_Enter ( LOGT_Channel * " Channel ", char * " Sub_Module_Name " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet d'affecter un sous-module a un channel.
|
||||
Un sous-module correspond en general au nom d'une fonction du traitement. Il permet de mieux identifier la partie du traitement qui genere les evenements.
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.RS 3
|
||||
.LP
|
||||
* (In)
|
||||
.I Channel
|
||||
: le pointeur sur le channel de communication
|
||||
.LP
|
||||
* (In)
|
||||
.I Sub_Module_Name
|
||||
: le nom du sous-module a attacher au channel
|
||||
.RS -3
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_Channel_Leave ( LOGT_Channel * " Channel ", char * " Sub_Module_Name " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de supprimer un sous-module d'un channel.
|
||||
Le sous-module qui lui avait ete precedemment affecte est devient alors le sous-module actif.
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.RS 3
|
||||
.LP
|
||||
* (In)
|
||||
.I Channel
|
||||
: le pointeur sur le channel de communication
|
||||
.LP
|
||||
* (In)
|
||||
.I Sub_Module_Name
|
||||
: le nom du sous-module a supprimer du channel
|
||||
.RS -3
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_Channel_Close ( LOGT_Channel * " Channel " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de fermer un channel.
|
||||
.LP
|
||||
.I Channel
|
||||
est un pointeur sur le channel a fermer
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_RTab_Alloc ( LOGT_RTab ** " Rtab ", char * " Name " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de creer une table de routage utilisateur.
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.RS 3
|
||||
.LP
|
||||
* (Out) RTab
|
||||
: adresse d'un pointeur sur la table de routage a creer.
|
||||
.LP
|
||||
* (In) Name
|
||||
: nom de la table de routage.
|
||||
.RS -3
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_RTab_Setup ( LOGT_RTab * " RTab ", LOGT_RuleClass " Rule_Class ", LOGT_Rule " Rule ", LOGT_Rooting " Value " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de parametrer une table de routage utilisateur, par ajout d'une regle de routage.
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.LP
|
||||
.RS 3
|
||||
* (In)
|
||||
.I RTab
|
||||
: un pointeur sur la table de routage
|
||||
.LP
|
||||
* (In)
|
||||
.I Rule_Class
|
||||
: la classe de la nouvelle regle
|
||||
.LP
|
||||
* (In)
|
||||
.I Rule
|
||||
: la nouvelle regle
|
||||
.LP
|
||||
* (In)
|
||||
.I Value
|
||||
: la valeur de la nouvelle regle
|
||||
.RS -3
|
||||
.LP
|
||||
La classe de regle designe la maniere de selectionner les types d'evenement concernes par la nouvelle regle :
|
||||
.LP
|
||||
.RS 3
|
||||
-
|
||||
.B LOGD_SELECT_ALL
|
||||
: selection de tous les types d'evenements
|
||||
.LP
|
||||
-
|
||||
.B LOGD_SELECT_GRV
|
||||
: selection des types d'evenement selon leur gravite
|
||||
.LP
|
||||
-
|
||||
.B LOGD_SELECT_RC
|
||||
: selection des types d'evenement selon le code retour qui y est associe
|
||||
.LP
|
||||
-
|
||||
.B LOGD_SELECT_TYPE
|
||||
: selection des types d'evenement selon leur nom
|
||||
.RS -3
|
||||
.LP
|
||||
La regle depend de la classe de regle choisie:
|
||||
.LP
|
||||
.RS 3
|
||||
- NULL pour la classe
|
||||
.B LOGD_SELECT_ALL
|
||||
.LP
|
||||
- code gravite pour la classe
|
||||
.B LOGD_SELECT_GRV
|
||||
.LP
|
||||
- code retour pour la classe
|
||||
.B LOGD_SELECT_RC
|
||||
.LP
|
||||
- nom du type d'evenement (expression reguliere) pour la classe
|
||||
.B LOGD_SELECT_TYPE
|
||||
.RS -3
|
||||
.LP
|
||||
La valeur de la regle est le type de routage a appliquer aux types d'evenement concernes par la regle :
|
||||
.RS 3
|
||||
.LP
|
||||
-
|
||||
.B LOGD_NULL
|
||||
: routage vers /dev/null (aucun traitement de l'evenement)
|
||||
.LP
|
||||
-
|
||||
.B LOGD_STDERR
|
||||
: affichage de l'evenement sur la sortie standard d'erreur
|
||||
.LP
|
||||
-
|
||||
.B LOGD_DATABASE
|
||||
: insertion de l'evenement dans la base de donnees du suivi
|
||||
.LP
|
||||
-
|
||||
.B LOGD_DEFAULT
|
||||
: routage par defaut
|
||||
.LP
|
||||
-
|
||||
.B LOGD_PREVIOUS
|
||||
: routage defini dans la table de routage precedente
|
||||
.RS -3
|
||||
.LP
|
||||
Pour parametrer une table de routage utilisateur, on commencera par definir les regles les plus generales (LOGD_ALL) et finir avec les regles les plus specifiques.
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_RTab_Add ( LOGT_Channel * " Channel ", LOGT_RTab * " RTab " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet d'affecter une nouvelle table de routage utilisateur a un channel.
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.RS 3
|
||||
.LP
|
||||
* (In)
|
||||
.I Channel
|
||||
: un pointeur sur le channel
|
||||
.LP
|
||||
* (In)
|
||||
.I RTab
|
||||
: un pointeur sur la table de routage
|
||||
.RS -3
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_RTab_Remove ( LOGT_Channel * " Channel ", LOGT_RTab * " RTab " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de supprimer l'association d'une table de routage utilisateur a un channel.
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.RS 3
|
||||
.LP
|
||||
* (In)
|
||||
.I Channel
|
||||
: un pointeur sur le channel
|
||||
.LP
|
||||
* (In)
|
||||
.I RTab
|
||||
: un pointeur sur la table de routage
|
||||
.RS -3
|
||||
.LP
|
||||
L'utilisateur pourra utiliser la constante LOGD_TOP_RTAB comme deuxieme argument, pour supprimer la table de routage de tete (la plus recemment associee au channel).
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_RTab_Free ( LOGT_RTab * " RTab " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de supprimer une table de routage utilisateur.
|
||||
.LP
|
||||
.I RTab
|
||||
est un pointeur sur la table de routage a supprimer.
|
||||
.LP
|
||||
NB : avant de supprimer une table de routage, on verifiera qu'elle n'est attachee a aucun channel.
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_Trigger_Add ( LOGT_Trigger ** " Trigger ", LOGT_Channel * " Channel ", LOGT_RTab * "RTab ", char * " Event_Type ", LOGT_Flags " Trigger_Mode " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet d'ajouter un trigger a un channel.
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.RS 3
|
||||
.LP
|
||||
* (Out)
|
||||
.I Trigger
|
||||
: l'adresse du pointeur sur le nouveau trigger
|
||||
.LP
|
||||
* (In)
|
||||
.I Channel
|
||||
: un pointeur sur le channel
|
||||
.LP
|
||||
* (In)
|
||||
.I RTab
|
||||
: un pointeur sur la table de routage concernee
|
||||
.LP
|
||||
* (In)
|
||||
.I Event_Type
|
||||
: le type d'evenement declencheur (expression reguliere)
|
||||
.LP
|
||||
* (In)
|
||||
.I Trigger_Mode
|
||||
: le mode de fonctionnement du trigger
|
||||
.RS -3
|
||||
.LP
|
||||
.I Rappel
|
||||
:
|
||||
.LP
|
||||
Si un trigger fonctionne sur le mode
|
||||
.B LOGD_ONESHOT
|
||||
, il est automatiquement supprime des lors qu'il a ete active. En mode
|
||||
.B LOGD_PERMANENT
|
||||
, le trigger reste active en permanence.
|
||||
.LP
|
||||
Si un trigger fonctionne sur le mode
|
||||
.B LOGD_ADD
|
||||
, l'activation du trigger provoque l'association de la table de routage avec le channel. Avec le mode
|
||||
.B LOGD_REMOVE
|
||||
, l'activation du trigger correspond a leur dissociation.
|
||||
.LP
|
||||
Les differents modes de fonctionnement peuvent etre combines par addition binaire.
|
||||
.LP
|
||||
.I NB
|
||||
: plusieurs triggers peuvent etre poses sur un meme channel.
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_Trigger_Remove ( LOGT_Trigger * " Trigger " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de supprimer un trigger positionne sur un channel.
|
||||
.LP
|
||||
.I Trigger
|
||||
est un pointeur sur le trigger a supprimer.
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_Event_Send ( LOGT_Channel * " Channel ", LOGT_RC * " Return_Code ", char * " Cd_Support ", va_list " Data ");"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet d'envoyer un evenement a travers un channel et de recuperer le code retour associe au type d'evenement (pilotage).
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.LP
|
||||
.RS 3
|
||||
* (In)
|
||||
.I Channel
|
||||
: un pointeur sur le channel
|
||||
.LP
|
||||
* (Out)
|
||||
.I RC
|
||||
: un pointeur sur le code retour
|
||||
.LP
|
||||
* (In)
|
||||
.I Cd_Support
|
||||
: le code du support source
|
||||
.LP
|
||||
* (In)
|
||||
.I Data
|
||||
: une liste d'arguments contenant les donnees de l'evenement
|
||||
.RS -3
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_RC LOG_Event_External_Send ( LOGT_Channel * " Channel ", char * " Cd_Support ", char * " Data ");"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction est definie pour tous les appels a partir de programmes ecrits en PL/SQL.
|
||||
Elle permet d'envoyer un evenement a travers un channel et de recuperer le code retour associe au type d'evenement (pilotage).
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.LP
|
||||
.RS 3
|
||||
* (In)
|
||||
.I Channel
|
||||
: un pointeur sur le channel
|
||||
.LP
|
||||
* (In)
|
||||
.I Cd_Support
|
||||
: le code du support source
|
||||
.LP
|
||||
* (In)
|
||||
.I Data
|
||||
: une chaine de caracteres contenant les donnees de l'evenement
|
||||
.RS -3
|
||||
.LP
|
||||
.I NB
|
||||
: la fonction retourne le code retour associe au type d'evenement.
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_Event_Info_Get ( LOGT_Channel * " Channel ", LOGT_Info * " Info ", va_list " Data " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de simuler l'envoi d'un evenement et de recuperer toutes les informations concernant le type par lequel il a ete resolu.
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.LP
|
||||
.RS 3
|
||||
* (In)
|
||||
.I Channel
|
||||
: un pointeur sur le channel
|
||||
.LP
|
||||
* (Out)
|
||||
.I Info
|
||||
: un pointeur sur les informations a recuperer
|
||||
.LP
|
||||
* (In)
|
||||
.I Data
|
||||
: une liste d'arguments contenant les donnees de l'evenement a tester
|
||||
.RS -3
|
||||
.LP
|
||||
.I NB
|
||||
: le type LOGT_Info est une structure qui contient les informations suivantes :
|
||||
.LP
|
||||
.RS 3
|
||||
-
|
||||
.B EvtType
|
||||
(type d'evenement par lequel l'evenement est resolu) de type char *
|
||||
.LP
|
||||
-
|
||||
.B RC
|
||||
(code retour associe) de type
|
||||
.B LOGT_RC
|
||||
.LP
|
||||
-
|
||||
.B Gravite
|
||||
(code gravite associe) de type
|
||||
.B LOGT_Gravite
|
||||
.LP
|
||||
-
|
||||
.B Rooting
|
||||
(routage associe) de type
|
||||
.B LOGT_Rooting
|
||||
.RS -3
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_Event_Info_External_Get ( LOGT_Channel * " Channel ", LOGT_Info * " Info ", char * " Event_Name " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de simuler l'envoi d'un evenement et de recuperer toutes les informations concernant le type par lequel il a ete resolu.
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.LP
|
||||
.RS 3
|
||||
* (In)
|
||||
.I Channel
|
||||
: un pointeur sur le channel
|
||||
.LP
|
||||
* (Out)
|
||||
.I Info
|
||||
: un pointeur sur les informations a recuperer
|
||||
.LP
|
||||
* (In)
|
||||
.I Event_Name
|
||||
: le nom de l'evenement a tester
|
||||
.RS -3
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "LOGT_Status LOG_Event_Cpt_Get ( LOGT_Channel * " Channel ", int * " Cpt " [LOGD_RC_SIZE], char * " Reg_Expr " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de recuperer les compteurs d'evenements dont le nom correspond a une expression reguliere.
|
||||
.LP
|
||||
Elle requiert les arguments suivants :
|
||||
.LP
|
||||
.RS 3
|
||||
* (In)
|
||||
.I Channel
|
||||
: un pointeur sur le channel
|
||||
.LP
|
||||
* (Out)
|
||||
.I Cpt
|
||||
: un pointeur sur un tableau de compteurs
|
||||
.LP
|
||||
* (In)
|
||||
.I Reg_Expr
|
||||
: une expression reguliere
|
||||
.RS -3
|
||||
.LP
|
||||
.I NB
|
||||
: le tableau de compteurs doit etre alloue par l'utilisateur.
|
||||
.LP
|
||||
La fonction retourne dans ce tableau le nombre d'evenements correspondant a l'expression reguliere ayant ete envoyes via le channel pour chacun des codes retour.
|
||||
.LP
|
||||
.I Exemple
|
||||
: Cpt[LOGD_RC_OK] contiendra le nombre d'evenements envoyes ayant retourne le code LOGD_RC_OK.
|
||||
.SH CODES RETOUR
|
||||
.LP
|
||||
Toutes les fonctions constituant l'API de la librairie LIBLOG retournent un code de type
|
||||
.B LOGT_Status
|
||||
:
|
||||
.LP
|
||||
.RS 3
|
||||
-
|
||||
.B LOGS_OK
|
||||
: la fonction s'est correctement executee et a produit un resultat
|
||||
.LP
|
||||
-
|
||||
.B LOGS_KO
|
||||
: la fonction s'est correctement executee mais n'a pas produit de resultat
|
||||
.LP
|
||||
-
|
||||
.B LOGS_ERRAPI
|
||||
: la fonction a ete appelee avec des arguments de valeur incorrecte
|
||||
.LP
|
||||
-
|
||||
.B LOGS_ERRMEM
|
||||
: la fonction ne s'est pas correctement executee pour un probleme d'allocation memoire
|
||||
.LP
|
||||
-
|
||||
.B LOGS_ERRSHM
|
||||
: la fonction ne s'est pas correctement executee pour un probleme relatif a la memoire partagee
|
||||
.LP
|
||||
-
|
||||
.B LOGS_ERRSIG
|
||||
: une operation sur semaphore a ete interrompue par un signal
|
||||
.LP
|
||||
-
|
||||
.B LOGS_ERRSEM
|
||||
: la fonction ne s'est pas correctement executee pour un probleme relatif a l'utilisation des semaphores
|
||||
.LP
|
||||
-
|
||||
.B DSS_ERRDLL
|
||||
: la fonction ne s'est pas correctement executee pour un probleme de chargement dynamique d'objet
|
||||
.LP
|
||||
.RS -3
|
||||
.I NB
|
||||
: la macro
|
||||
.B LOG_ERROR()
|
||||
permet de tester si un code retour correspond a une erreur.
|
||||
.LP
|
||||
En cas d'erreur, la variable
|
||||
.B LOG_Error_Msg
|
||||
contient un message du type :
|
||||
.LP
|
||||
.RS 3
|
||||
Error <Nom fonction> : <message d'erreur>
|
||||
.RS -3
|
||||
.LP
|
4725
lib/liblog.c
Normal file
4725
lib/liblog.c
Normal file
File diff suppressed because it is too large
Load Diff
BIN
lib/liblog.doc
Normal file
BIN
lib/liblog.doc
Normal file
Binary file not shown.
179
lib/liblog.h
Normal file
179
lib/liblog.h
Normal file
@ -0,0 +1,179 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <unistd.h>
|
||||
#include <ctype.h>
|
||||
#include <ver.h>
|
||||
#include <log.h>
|
||||
|
||||
/* Expressions régulières */
|
||||
|
||||
#ifdef LINUX
|
||||
#include <regex.h>
|
||||
typedef regex_t RegExp_t;
|
||||
#define RegExp_Size sizeof (regex_t)
|
||||
#define RegExp_Compile(s, e) regcomp (e, s, REG_NOSUB) == 0
|
||||
#define RegExp_Match(s, e) regexec (e, s, 0, NULL, 0) != REG_NOMATCH
|
||||
#else
|
||||
#include <regexpr.h>
|
||||
typedef char RegExp_t;
|
||||
#define RegExp_Size 256
|
||||
#define RegExp_Compile(s, e) compile (s, e, e + RegExp_Size)
|
||||
#define RegExp_Match(s, e) step (s, e)
|
||||
#endif
|
||||
|
||||
extern char * strdup (const char *);
|
||||
|
||||
/* Nom de la variable d'environnement définissant la valeur par défaut du module maître */
|
||||
|
||||
#define MASTER_MODULE_ENV "MASTER"
|
||||
|
||||
#define LOG_FILE_MANAGER "liblog.so"
|
||||
|
||||
/* Tous les heaps et data structures générés par la librairie LIBLOG sont préfixés */
|
||||
|
||||
#define LOG_PREFIX "LOG"
|
||||
|
||||
/* Port de messages d'envoi des événements */
|
||||
|
||||
MSGT_Port * Send_Port;
|
||||
|
||||
/* Elément du cache des modules */
|
||||
|
||||
typedef struct {
|
||||
char * Name; /* Nom du module (sert à la recherche) */
|
||||
int Id; /* Identifiant numérique du type d'événement */
|
||||
} LOGT_Module;
|
||||
|
||||
/* Elément de la table de routage GDRT */
|
||||
|
||||
typedef struct {
|
||||
char * Name; /* Nom du type d'événement (base de recherche) */
|
||||
int Terminal; /* Signifie que le type d'événement existe sans contexte */
|
||||
int Id; /* Identifiant numérique du type d'événement */
|
||||
LOGT_Gravite Gravite; /* Code gravité */
|
||||
LOGT_RC RC; /* Code de retour servant au pilotage */
|
||||
LOGT_Rooting Rooting; /* Type de routage par défaut */
|
||||
NDT_Root * Next_Dim; /* Dimension suivante = pointeur sur un arbre */
|
||||
} LOGT_GDRT_Evt;
|
||||
|
||||
#define EVENT_NB_DIM 4
|
||||
|
||||
/* Elément d'une table de routage quelconque (hormis la GDRT) */
|
||||
|
||||
typedef struct {
|
||||
int Id; /* Identifiant numérique du type d'événement (sert à la recherche) */
|
||||
LOGT_Rooting Rooting; /* Type de routage */
|
||||
} LOGT_RTab_Evt;
|
||||
|
||||
|
||||
/* Définition du nom des différentes ressources de la librairie */
|
||||
|
||||
/*
|
||||
Heap dans lequel sera stockée la base de la librairie LIBLOG :
|
||||
Ce heap ne contient que la structure LOGT_Base qui permet de référencer
|
||||
les autres ressources système de la librairie.
|
||||
|
||||
Ce heap ne sera constitué que d'une unique segment très petit.
|
||||
*/
|
||||
|
||||
#define LOGD_BASE_HEAP_NAME "BASE"
|
||||
#define LOGD_BASE_HEAP_SEGMENT_SIZE 100
|
||||
|
||||
/*
|
||||
Heap dans lequel sont stockées les caches :
|
||||
Ces heaps contiennent à priori un grand nombre de valeurs.
|
||||
On les crée donc avec des segments de données suffisamment grands.
|
||||
*/
|
||||
|
||||
#define LOGD_KMOD_SEGMENT_SIZE 50000
|
||||
#define LOGD_KMOD_NAME "KMOD"
|
||||
|
||||
#define LOGD_KFORMAT_SEGMENT_SIZE 1100000
|
||||
#define LOGD_KFORMAT_NAME "KFORMAT"
|
||||
|
||||
#define LOGD_GDRT_SEGMENT_SIZE 400000
|
||||
#define LOGD_GDRT_NAME "GDRT"
|
||||
|
||||
/*
|
||||
En règle générale, les tables de routage suivantes resteront vides :
|
||||
Leur heap sont donc créés avec des segments de données relativement petits.
|
||||
*/
|
||||
|
||||
#define LOGD_EMPTY_RTAB_SEGMENT_SIZE 3000
|
||||
#define LOGD_GMRT_NAME "GMRT"
|
||||
#define LOGD_LDRT_NAME "LDRT"
|
||||
#define LOGD_LMRT_NAME "LMRT"
|
||||
|
||||
/*
|
||||
Heap dans lequel sera stockée les listes de tables de routage :
|
||||
Ces liste ne contiendront pas à priori un grand nombre de valeurs.
|
||||
Les heaps sous-jacents n'ont donc pas besoin besoin d'être très grands.
|
||||
*/
|
||||
|
||||
#define LOGD_RTAB_LIST_SEGMENT_SIZE 100240
|
||||
#define LOGD_CHANNEL_LIST_NAME "CHANNEL_REF"
|
||||
#define LOGD_LDRT_LIST_NAME "LDRT_REF"
|
||||
#define LOGD_LMRT_LIST_NAME "LMRT_REF"
|
||||
#define LOGD_URT_LIST_NAME "URT_REF"
|
||||
|
||||
/* Elément d'une structure de compteurs d'événement */
|
||||
|
||||
typedef struct {
|
||||
char * Name; /* Nom du type d'événement */
|
||||
int Total; /* Nombre total d'envois */
|
||||
} LOGT_Event_Cpt;
|
||||
|
||||
SMT_Heap * LOG_Base_Heap;
|
||||
|
||||
/* Compteur d'ouverture de la librairie */
|
||||
|
||||
unsigned int LOG_Open_Counter = 0;
|
||||
|
||||
/* Flux de sortie des messages d'erreur générés par la librairie */
|
||||
|
||||
FILE * LOG_stderr;
|
||||
|
||||
/* Entêtes des fonctions privées */
|
||||
|
||||
NDT_Status LOG_Base_RTabList_Manager (va_list args_ptr);
|
||||
NDT_Status LOG_Base_ChannelList_Manager (va_list args_ptr);
|
||||
|
||||
NDT_Status LOG_GDRT_Manager (va_list);
|
||||
NDT_Status LOG_GDRT_Dim_Manager (va_list);
|
||||
LOGT_Status LOG_GDRT_Event_Find (LOGT_GDRT_Evt **, char **, char *);
|
||||
LOGT_Status LOG_GDRT_Recursive_Find (char **, NDT_Root *, int, LOGT_GDRT_Evt **, char **);
|
||||
LOGT_Status LOG_GDRT_Event_Create (const char *, int, LOGT_Gravite, LOGT_RC, LOGT_Rooting, int *);
|
||||
LOGT_Status LOG_GDRT_Recursive_Select (int, NDT_Root *, LOGT_RTab *, LOGT_RuleClass, LOGT_Rule *, LOGT_Rooting, const char *, char *);
|
||||
|
||||
NDT_Status LOG_KMOD_Manager (va_list);
|
||||
|
||||
NDT_Status LOG_KFORMAT_Manager (va_list);
|
||||
NDT_Status LOG_KFORMAT_DataList_Manager (va_list);
|
||||
|
||||
NDT_Status LOG_Channel_RTabList_Manager (va_list);
|
||||
NDT_Status LOG_Channel_Event_CptList_Manager (va_list);
|
||||
NDT_Status LOG_Channel_SubModuleList_Manager (va_list);
|
||||
NDT_Status LOG_Channel_TriggerList_Manager (va_list);
|
||||
LOGT_Status LOG_Channel_Rooting_Find (LOGT_Channel *, int, LOGT_Rooting *);
|
||||
|
||||
NDT_Status LOG_RTab_Manager (va_list);
|
||||
|
||||
#define DATA_ARG_LIST 1
|
||||
#define DATA_STRING 2
|
||||
|
||||
LOGT_Status LOG_Event_Internal_Send (int, LOGT_Channel *, LOGT_RC *, char *, va_list, char *);
|
||||
LOGT_Status LOG_Event_Data_Get (int, char *, char **, size_t *, va_list *, char *);
|
||||
LOGT_Status LOG_Event_Data_Tag_Get (int, va_list *, char **, int *, char *);
|
||||
LOGT_Status LOG_Event_Data_Macro_Get (int, va_list *, char **, char *, char *);
|
||||
|
||||
int LOG_NextString_Get (char ** ptr, char * result);
|
||||
|
||||
char * LOG_RTType_Label_Get (LOGT_RTType);
|
||||
char * LOG_RC_Label_Get (LOGT_RC);
|
||||
char * LOG_Rooting_Label_Get (LOGT_Rooting);
|
||||
|
||||
void LOG_Error_Print(void);
|
||||
|
||||
static char * LOG_Name_Prefix (const char *);
|
424
lib/libtool.3
Normal file
424
lib/libtool.3
Normal file
@ -0,0 +1,424 @@
|
||||
'\" t
|
||||
.\" @(#)LIBTOOL.3 1.0 00/22/02 SMA;
|
||||
.TH LIBTOOL 3 "22 Feb 2000"
|
||||
.SH NOM
|
||||
LIBTOOL (utilitaires pour la librairie LIBLOG)
|
||||
.SH SYNOPSIS
|
||||
.LP
|
||||
.BI "cc [flag ...] file ... -lver -ldl -lnode -lshmem -ldatastr -ladm -llog -ltool [library ...]"
|
||||
.LP
|
||||
.BI "#include <tool.h>"
|
||||
.LP
|
||||
.BI "TLT_Status TL_Library_Stderr_Set ( FILE * " Out ");"
|
||||
.LP
|
||||
.BI "TLT_Status TL_LIBLOG_Load ( TL_Cache " To_Load " );"
|
||||
.LP
|
||||
.BI "TLT_Status TL_LIBLOG_Unload ( TL_Cache " To_Unload " );"
|
||||
.LP
|
||||
.BI "TLT_Status TL_Channel_RTab_Add ( LOGT_Channel * " Channel ", char * " Kunf_Name " );"
|
||||
.LP
|
||||
.BI "TLT_Status TL_Channel_Trigger_Add ( LOGT_Channel * " Channel ", char * " Kunf_Name " );"
|
||||
.LP
|
||||
.SH DESCRIPTION
|
||||
.LP
|
||||
La bibliotheque LIBTOOL fournit un ensemble d'utilitaires lies a la librairie LIBLOG :
|
||||
.LP
|
||||
.RS 3
|
||||
- Creation de tables de routage et de triggers a partir de fichiers de configuration KUNF
|
||||
.LP
|
||||
- Mise a jour des caches de donnees de la librairie LIBLOG (cache des modules, cache des formats d'evenement, table de routage par defaut
|
||||
.RS -3
|
||||
.LP
|
||||
.SH FONCTIONS
|
||||
.LP
|
||||
.BI "TLT_Status TL_Library_Stderr_Set ( FILE * " Out " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de definir
|
||||
.I Out
|
||||
comme la sortie standard des messages d'erreur de la librarie.
|
||||
.RS -3
|
||||
.LP
|
||||
.BI "TLT_Status TL_LIBLOG_Load ( TL_Cache " To_Load " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de charger les caches de donnees de la base de la librairie LIBLOG
|
||||
.LP
|
||||
L'argument
|
||||
.I To_Load
|
||||
represente la liste des caches de donnees a charger
|
||||
, sous forme d'une combinaison binaire des trois valeurs suivantes :
|
||||
.LP
|
||||
.RS 3
|
||||
-
|
||||
.B TLD_KMOD
|
||||
: pour charger le cache de modules
|
||||
.LP
|
||||
-
|
||||
.B TLD_KFORMAT
|
||||
: pour charger le cache de formats d'evenement
|
||||
.LP
|
||||
-
|
||||
.B TLD_GDRT
|
||||
: pour charger la table de routage par defaut
|
||||
.LP
|
||||
.RS -3
|
||||
NB : les caches doivent etre prealablement vides avant d'etre charges.
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "TLT_Status TL_LIBLOG_Unload ( TL_Cache " To_Unload " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet de vider les caches de donnees de la base de la librairie LIBLOG
|
||||
.LP
|
||||
L'argument
|
||||
.I To_Unload
|
||||
represente la liste des caches de donnees a vider
|
||||
, sous forme d'une combinaison binaire des trois valeurs suivantes :
|
||||
.RS 3
|
||||
.LP
|
||||
-
|
||||
.B TLD_KMOD
|
||||
: pour vider le cache de modules
|
||||
.LP
|
||||
-
|
||||
.B TLD_KFORMAT
|
||||
: pour vider le cache de formats d'evenement
|
||||
.LP
|
||||
-
|
||||
.B TLD_GDRT
|
||||
: pour vider la table de routage par defaut
|
||||
.RS -3
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "TLT_Status TL_Channel_RTab_Add ( LOGT_Channel * " Channel ", char * " Kunf_Name " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet d'ajouter toutes les tables de routage d'une section KUNF a un channel.
|
||||
.LP
|
||||
Elle attend les parametres suivants :
|
||||
.LP
|
||||
.RS 3
|
||||
* (In)
|
||||
.I Channel
|
||||
: un pointeur sur le channel
|
||||
.LP
|
||||
* (In)
|
||||
.I Kunf_Name
|
||||
: le nom de la section KUNF
|
||||
.RS -3
|
||||
.LP
|
||||
.RS -3
|
||||
.BI "TLT_Status TL_Channel_Trigger_Add ( LOGT_Channel * " Channel ", char * " Kunf_Name " );"
|
||||
.LP
|
||||
.RS 3
|
||||
Cette fonction permet d'ajouter tous les triggers d'une section KUNF a un channel.
|
||||
.LP
|
||||
Elle attend les parametres suivants :
|
||||
.RS 3
|
||||
.LP
|
||||
* (In)
|
||||
.I Channel
|
||||
: un pointeur sur le channel
|
||||
.LP
|
||||
* (In)
|
||||
.I Kunf_Name
|
||||
: le nom de la section KUNF
|
||||
.RS -3
|
||||
.LP
|
||||
.SH FICHIER DE CONFIGURATION
|
||||
.LP
|
||||
Le fichier KUNF contient deux types de sections:
|
||||
.RS 3
|
||||
.LP
|
||||
-
|
||||
.B [ROOTING_TABLE]
|
||||
: liste des tables de routage
|
||||
.LP
|
||||
-
|
||||
.B [TRIGGER]
|
||||
: liste des triggers
|
||||
.RS -3
|
||||
.LP
|
||||
Chaque table de routage est identifiee par une sous-section de la forme
|
||||
.B [ROOTING_TABLE:<table_name>]
|
||||
.
|
||||
.LP
|
||||
Les regles de routage sont designees par une section de la forme
|
||||
.B [ROOTING_TABLE:<table_name>:<rule_name>]
|
||||
.
|
||||
.LP
|
||||
Une regle de routage definit les proprietes suivantes :
|
||||
.RS 3
|
||||
.LP
|
||||
*
|
||||
.B class
|
||||
: ce tag definit la classe de la regle et peut prendre les valeurs suivantes :
|
||||
.LP
|
||||
.RS 3
|
||||
-
|
||||
.B ALL
|
||||
pour selectionner tous les evenements
|
||||
.LP
|
||||
-
|
||||
.B GRV
|
||||
pour selectionner les evenements selon leur gravite
|
||||
.LP
|
||||
-
|
||||
.B RC
|
||||
pour selectionner les evenements selon leur code retour associe
|
||||
.LP
|
||||
-
|
||||
.B TYPE
|
||||
pour selectionner les evenements selon leur type
|
||||
.RS -3
|
||||
.LP
|
||||
*
|
||||
.B rule
|
||||
: ce tag definit la regle elle-meme et peut prendre les valeurs suivantes :
|
||||
.LP
|
||||
.RS 3
|
||||
- pour la classe
|
||||
.B ALL
|
||||
: aucune valeur a definir
|
||||
.LP
|
||||
- pour la classe
|
||||
.B GRV
|
||||
:
|
||||
.B INFO
|
||||
,
|
||||
.B TRACE
|
||||
,
|
||||
.B FONCT
|
||||
,
|
||||
.B DETAIL
|
||||
,
|
||||
.B STAT
|
||||
,
|
||||
.B ERR
|
||||
,
|
||||
.B REJDON
|
||||
,
|
||||
.B REJENR
|
||||
,
|
||||
.B WARNING
|
||||
,
|
||||
.B RECYCLE
|
||||
,
|
||||
.B EXIT
|
||||
,
|
||||
.B ABEND
|
||||
.LP
|
||||
- pour la classe
|
||||
.B RC
|
||||
:
|
||||
.B OK
|
||||
,
|
||||
.B ANOERR
|
||||
,
|
||||
.B REJDON
|
||||
,
|
||||
.B REJENR
|
||||
,
|
||||
.B WARNING
|
||||
,
|
||||
.B RECYCLE
|
||||
,
|
||||
.B EXIT
|
||||
,
|
||||
.B ABEND
|
||||
.LP
|
||||
- pour la classe
|
||||
.B TYPE
|
||||
: expression reguliere sur le type d'evenement
|
||||
.LP
|
||||
.I Attention
|
||||
: le caractere ':' etant interdit dans les sections kunf, on le notera conventionnellement par "{2pts}".
|
||||
.LP
|
||||
Les expressions regulieres seront notees selon le standard UNIX (voir regexp).
|
||||
.LP
|
||||
.RS -3
|
||||
*
|
||||
.B rooting
|
||||
: ce tag definit le routage associe a la regle et peut prendre les valeurs suivantes :
|
||||
.LP
|
||||
.RS 3
|
||||
-
|
||||
.B DATABASE
|
||||
: routage de l'evenement vers la base de suivi
|
||||
.LP
|
||||
-
|
||||
.B STDERR
|
||||
: routage de l'evenement vers la sortie standard d'erreur
|
||||
.LP
|
||||
-
|
||||
.B NULL
|
||||
: routage de l'evenement vers /dev/null (i.e l'evenement n'est pas traite)
|
||||
.LP
|
||||
-
|
||||
.B DEFAULT
|
||||
: routage par defaut
|
||||
.LP
|
||||
-
|
||||
.B PREVIOUS
|
||||
: routage de la table precedente du channel
|
||||
.RS -3
|
||||
.LP
|
||||
.RS -3
|
||||
Chaque trigger est identifie par une section de la forme
|
||||
.B [ROOTING_TABLE:<trigger_name>]
|
||||
.
|
||||
.LP
|
||||
A un trigger sont associees plusieurs proprietes :
|
||||
.RS 3
|
||||
.LP
|
||||
*
|
||||
.B event
|
||||
: ce tag designe le type d'evenement declencheur du trigger (expression reguliere)
|
||||
.LP
|
||||
*
|
||||
.B type
|
||||
: ce tag definit le type du trigger et peut prendre les valeurs suivantes :
|
||||
.RS 3
|
||||
.LP
|
||||
-
|
||||
.B ADD
|
||||
pour un trigger qui ajoute une table de routage a un channel
|
||||
.LP
|
||||
-
|
||||
.B REMOVE
|
||||
pour un trigger qui supprime une table de routage d'un channel
|
||||
.RS -3
|
||||
.LP
|
||||
*
|
||||
.B mode
|
||||
: ce tag designe la persistance du trigger et peut prendre les valeurs suivantes :
|
||||
.RS 3
|
||||
.LP
|
||||
-
|
||||
.B ONE_SHOT
|
||||
pour un trigger qui ne fonctionne qu'une seule fois
|
||||
.LP
|
||||
-
|
||||
.B PERMANENT
|
||||
pour un trigger qui fonctionne tant qu'il n'est pas desactive
|
||||
.RS -3
|
||||
.LP
|
||||
*
|
||||
.B rooting_table
|
||||
: ce tag definit le nom de la table de routage concernee par le trigger
|
||||
.RS -3
|
||||
.LP
|
||||
.LP
|
||||
.I Exemple
|
||||
:
|
||||
.LP
|
||||
.RS 3
|
||||
[ROOTING_TABLE]
|
||||
.LP
|
||||
[ROOTING_TABLE:TOTO]
|
||||
.LP
|
||||
[ROOTING_TABLE:TOTO:RULE1]
|
||||
.LP
|
||||
class=ALL
|
||||
.LP
|
||||
rooting=DATABASE
|
||||
.LP
|
||||
[ROOTING_TABLE:TOTO:RULE2]
|
||||
.LP
|
||||
class=RC
|
||||
.LP
|
||||
rule=REJENR
|
||||
.LP
|
||||
rooting=STDERR+DATABASE
|
||||
.LP
|
||||
[ROOTING_TABLE:TOTO:RULE3]
|
||||
.LP
|
||||
class=TYPE
|
||||
.LP
|
||||
rule=COMPTEUR.*
|
||||
.LP
|
||||
rooting=NULL
|
||||
.LP
|
||||
[ROOTING_TABLE:TITI]
|
||||
.LP
|
||||
[ROOTING_TABLE:TOTO:RULE1]
|
||||
.LP
|
||||
class=ALL
|
||||
.LP
|
||||
rooting=PREVIOUS
|
||||
.LP
|
||||
[ROOTING_TABLE:TOTO:RULE2]
|
||||
.LP
|
||||
class=GRV
|
||||
.LP
|
||||
rule=WARNING
|
||||
.LP
|
||||
rooting=DEFAULT
|
||||
.LP
|
||||
[ROOTING_TABLE:TOTO:RULE3]
|
||||
.LP
|
||||
class=RC
|
||||
.LP
|
||||
rule=ABEND
|
||||
.LP
|
||||
rooting=STDERR
|
||||
.LP
|
||||
[ROOTING_TABLE:TOTO:RULE4]
|
||||
.LP
|
||||
class=TYPE
|
||||
.LP
|
||||
rule=*SQLERR*
|
||||
.LP
|
||||
rooting=STDERR
|
||||
.LP
|
||||
[TRIGGER]
|
||||
.LP
|
||||
[TRIGGER:TATA]
|
||||
.LP
|
||||
event=COMPTEUR.*@.*{2pts}.*{2pts}TB.*
|
||||
.LP
|
||||
type=ADD
|
||||
.LP
|
||||
rooting_table=TOTO
|
||||
.LP
|
||||
mode=ONE_SHOT
|
||||
.LP
|
||||
.RS -3
|
||||
Dans l'exemple ci-dessus, le fichier de configuration definit deux tables de routage nommees TOTO (3 regles) et TITI (4 regles) et un trigger nomme TATA.
|
||||
.LP
|
||||
.I NB
|
||||
: les noms des regles de routage sont libres. Ils doivent seulement etre differents les uns des autres pour une meme table de routage.
|
||||
.LP
|
||||
Pour davantage de precisions sur la notion de table de routage ou de trigger, le lecteur se referera a la documentation de la librairie LIBLOG.
|
||||
.LP
|
||||
.RS -3
|
||||
.SH CODES RETOUR
|
||||
.LP
|
||||
Toutes les fonctions constituant l'API de la librairie LIBTOOL retournent un code de type
|
||||
.B TLT_Status
|
||||
:
|
||||
.LP
|
||||
.RS 3
|
||||
-
|
||||
.B TLS_OK
|
||||
si la fonction s'est correctement executee
|
||||
.LP
|
||||
-
|
||||
.B TLS_KO
|
||||
si une erreur s'est produite
|
||||
.RS -3
|
||||
.LP
|
||||
En cas d'erreur, la variable
|
||||
.B TL_Error_Msg
|
||||
contient un message du type :
|
||||
.LP
|
||||
.RS 3
|
||||
Error <Nom fonction> : <message d'erreur>
|
||||
.RS -3
|
||||
.LP
|
||||
Dans une prochaine version, la librairie proposera des codes retour plus explicites, permettant de distinguer les differents types d'erreur.
|
||||
.LP
|
||||
.SH VOIR AUSSI
|
||||
.B liblog
|
||||
(3)
|
BIN
lib/libtool.doc
Normal file
BIN
lib/libtool.doc
Normal file
Binary file not shown.
49
lib/libtool.h
Normal file
49
lib/libtool.h
Normal file
@ -0,0 +1,49 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ver.h>
|
||||
#include <kunf.h>
|
||||
#include <shmem.h>
|
||||
#include <log.h>
|
||||
#include <tool.h>
|
||||
|
||||
extern char * strdup (const char *);
|
||||
|
||||
FILE * TL_stderr = NULL;
|
||||
|
||||
char TL_Info_Msg[256];
|
||||
|
||||
/* Déclarations pour ORACLE */
|
||||
|
||||
void pipo(void);
|
||||
void pipo(void)
|
||||
{
|
||||
unsigned int x;
|
||||
x = sqlstm.sqlvsn;
|
||||
}
|
||||
|
||||
#define sqlstm _sqlstm
|
||||
|
||||
extern void sqlglm(char *, size_t *, size_t *);
|
||||
|
||||
#define SQL_OK 0
|
||||
#define SQL_NO_DATA_FOUND 1403
|
||||
#define SQL_FETCHED_COLUMN_NULL -1405
|
||||
|
||||
char * oracx = NULL;
|
||||
|
||||
void TL_Info_Print (void);
|
||||
void TL_Error_Print (void);
|
||||
TLT_Status TL_RTab_Add (LOGT_Channel *, char *);
|
||||
TLT_Status TL_Trigger_Add (LOGT_Channel *, char *);
|
||||
TLT_Status TL_GDRT_Load(void);
|
||||
TLT_Status TL_KMOD_Load(void);
|
||||
TLT_Status TL_KFORMAT_Load(void);
|
||||
TLT_Status TL_GDRT_Unload(void);
|
||||
TLT_Status TL_KMOD_Unload(void);
|
||||
TLT_Status TL_KFORMAT_Unload(void);
|
||||
TLT_Status TL_Param_Get (void);
|
||||
TLT_Status TL_Database_Connect (void);
|
||||
char * Oracle_Message_Get (void);
|
||||
char * trim (char *);
|
||||
|
1369
lib/libtool.pc
Normal file
1369
lib/libtool.pc
Normal file
File diff suppressed because it is too large
Load Diff
516
lib/log.h
Normal file
516
lib/log.h
Normal file
@ -0,0 +1,516 @@
|
||||
#ifndef _LIBLOG
|
||||
#define _LIBLOG
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <node.h>
|
||||
#include <shmem.h>
|
||||
#include <datastr.h>
|
||||
#include <msg.h>
|
||||
|
||||
/*********** Anciennes librairies **************
|
||||
#include <logevt.h>
|
||||
#include <GetEvt.h>
|
||||
************************************************/
|
||||
|
||||
/* Codes retour des fonctions de l'API */
|
||||
|
||||
typedef int LOGT_Status;
|
||||
|
||||
#define LOGS_OK DSS_OK /* La fonction s'est correctement exécutée et a produit un résultat */
|
||||
#define LOGS_KO DSS_KO /* La fonction s'est correctement exécutée mais n'a pas produit de résultat */
|
||||
|
||||
#define LOGS_ERRMEM MSGS_ERRMEM /* Problème d'allocation mémoire */
|
||||
#define LOGS_ERRAPI MSGS_ERRAPI /* Utilisation incorrecte des API */
|
||||
#define LOGS_ERRSHM MSGS_ERRSHM /* Problème relatif aux segments de mémoire partagée */
|
||||
#define LOGS_ERRSEM MSGS_ERRSEM /* Problème relatif à l'utilisation des sémaphores */
|
||||
#define LOGS_ERRSIG MSGS_ERRSIG /* Opération sur sémpahore interrompue par un signal système */
|
||||
#define LOGS_ERRDLL MSGS_ERRDLL /* Problème de chargement dynamique de librairie */
|
||||
|
||||
#define LOG_ERROR(s) (s < 0) /* Tous les codes retour négatifs correspondent à des erreurs */
|
||||
|
||||
/* Notion de routage (possibilité de les combiner par addition binaire) */
|
||||
|
||||
typedef int LOGT_Rooting;
|
||||
|
||||
#define LOGD_ROOTING_DATABASE 0x01 /* Routage vers la base de suivi */
|
||||
#define LOGD_ROOTING_STDERR 0x02 /* Routage vers la sortie standard d'erreur */
|
||||
#define LOGD_ROOTING_DEFAULT 0x04 /* Routage de la table de routage par défaut */
|
||||
#define LOGD_ROOTING_PREVIOUS 0x08 /* Routage de la table de routage précédente */
|
||||
#define LOGD_ROOTING_NULL 0x10 /* Routage vers /dev/null */
|
||||
|
||||
#define LOGD_ROOTING_DATABASE_MSK(a) (LOGD_ROOTING_DATABASE & a)
|
||||
#define LOGD_ROOTING_STDERR_MSK(a) (LOGD_ROOTING_STDERR & a)
|
||||
|
||||
/* Notion de gravité (classe d'événement) */
|
||||
|
||||
typedef int LOGT_Gravite;
|
||||
|
||||
#define LOGD_GRV_INFO 'I'
|
||||
#define LOGD_GRV_TRACE 'T'
|
||||
#define LOGD_GRV_FONCT 'F'
|
||||
#define LOGD_GRV_DETAIL 'L'
|
||||
#define LOGD_GRV_STAT 'S'
|
||||
#define LOGD_GRV_ERR 'E'
|
||||
#define LOGD_GRV_REJDON 'D'
|
||||
#define LOGD_GRV_REJENR 'R'
|
||||
#define LOGD_GRV_WARNING 'W'
|
||||
#define LOGD_GRV_RECYCLE 'Y'
|
||||
#define LOGD_GRV_EXIT 'X'
|
||||
#define LOGD_GRV_ABEND 'A'
|
||||
|
||||
/* Notion de code retour (pour le pilotage) */
|
||||
|
||||
typedef int LOGT_RC;
|
||||
|
||||
#define LOGD_RC_OK 0 /* Continuation */
|
||||
#define LOGD_RC_ANOERR 4 /* Anomalie */
|
||||
#define LOGD_RC_REJDON 6 /* Rejet de la donnée */
|
||||
#define LOGD_RC_REJENR 7 /* Rejet de l'enregistrement */
|
||||
#define LOGD_RC_WARNING 8 /* Evénement inconnu */
|
||||
#define LOGD_RC_RECYCLE 10 /* Recyclage de l'enregistrement */
|
||||
#define LOGD_RC_EXIT 14 /* Sortie du traitement */
|
||||
#define LOGD_RC_ABEND 16 /* Interruption du traitement */
|
||||
|
||||
#define LOGD_RC_SIZE 17 /* Taille des tableaux de codes retour (voir fonction LOG_Event_Cpt_Get) */
|
||||
|
||||
/* Type de table de routage */
|
||||
|
||||
typedef int LOGT_RTType;
|
||||
|
||||
#define LOGD_GMRT 0 /* Global Master Rooting Table */
|
||||
#define LOGD_LMRT 1 /* Local Master Rooting Table */
|
||||
#define LOGD_URT 2 /* User Rooting Table */
|
||||
#define LOGD_LDRT 3 /* Local Default Rooting Table */
|
||||
#define LOGD_GDRT 4 /* Global Default Rooting Table */
|
||||
|
||||
/* Notion de table de routage */
|
||||
|
||||
typedef struct {
|
||||
char * Name; /* Nom de la table de routage */
|
||||
LOGT_RTType Type; /* Type de la table de routage */
|
||||
NDT_Root * Root; /* Pointeur sur la structure contenant les événements */
|
||||
int Nb_Channel; /* Nombre de canaux auquels est rattachée la table */
|
||||
pid_t Pid; /* Processus propriétaire de la table de routage (utile au garbage collector) */
|
||||
} LOGT_RTab;
|
||||
|
||||
|
||||
#define LOGD_RTAB_DEFAULT 0 /* Référence à la table de routage par défaut */
|
||||
#define LOGD_RTAB_PREVIOUS 1 /* Référence à la table de routage précédente */
|
||||
|
||||
/* Notion de classe de règle de sélection des événements */
|
||||
|
||||
typedef int LOGT_RuleClass;
|
||||
|
||||
#define LOGD_SELECT_ALL 1 /* Règle appliquée à tous les événements */
|
||||
#define LOGD_SELECT_GRV 2 /* Règle appliquée aux événements d'une certaine gravité */
|
||||
#define LOGD_SELECT_RC 3 /* Règle appliquée aux événements associés à un certain code retour */
|
||||
#define LOGD_SELECT_TYPE 4 /* Règle appliquée aux événements d'un certain type */
|
||||
|
||||
/* Notion de règle de sélection des événements */
|
||||
|
||||
typedef void LOGT_Rule; /* Contient le code gravité, code retour ou type d'événement selon la classe de la règle */
|
||||
|
||||
/* Différents indicateurs */
|
||||
|
||||
typedef int LOGT_Flags;
|
||||
|
||||
/* Modes d'ouverture et de fermeture */
|
||||
|
||||
#define LOGD_CREATE SMD_CREATE /* Création */
|
||||
#define LOGD_OPEN SMD_OPEN /* Ouverture simple */
|
||||
#define LOGD_DESTROY SMD_DESTROY /* Destruction */
|
||||
#define LOGD_CLOSE SMD_CLOSE /* Fermeture simple */
|
||||
|
||||
/* Flags de debug sur l'ouverture de la librairie */
|
||||
|
||||
#define LOGD_DEBUG_NONE SMD_DEBUG_NONE /* pour n'afficher aucun message généré par les diverses librairies */
|
||||
#define LOGD_DEBUG SMD_DEBUG /* pour afficher les messages générés par la librairie */
|
||||
#define LOGD_DEBUG_ALL SMD_DEBUG_ALL /* pour afficher les messages générés par toutes les librairies sous-jacentes */
|
||||
|
||||
#define LOGD_DEBUG_MSK (MSGD_DEBUG & MSGD_DEBUG_ALL)
|
||||
|
||||
/* Mode de fonctionnement d'un trigger */
|
||||
|
||||
#define LOGD_ADD 0x01 /* Trigger d'ajout de table de routage */
|
||||
#define LOGD_REMOVE 0x02 /* Trigger de suppression de table de routage */
|
||||
#define LOGD_ONE_SHOT 0x04 /* Trigger actif une seul fois */
|
||||
#define LOGD_PERMANENT 0x08 /* Trigger actif en permanence */
|
||||
|
||||
#define LOGD_ADD_MSK(a) (LOGD_ADD & a)
|
||||
#define LOGD_REMOVE_MSK(a) (LOGD_REMOVE & a)
|
||||
#define LOGD_ONE_SHOT_MSK(a) (LOGD_ONE_SHOT & a)
|
||||
#define LOGD_PERMANENT_MSK(a) (LOGD_PERMANENT & a)
|
||||
|
||||
/* Notion de channel */
|
||||
|
||||
typedef struct {
|
||||
pid_t Pid; /* Processus propriétaire du channel */
|
||||
int Id; /* Identifiant du channel */
|
||||
int ModuleId; /* Identifiant du module envoyeur */
|
||||
int Master_ModuleId; /* Identifiant du module primaire */
|
||||
NDT_Root * RTab_List; /* Liste de tables de routage */
|
||||
NDT_Root * SubModule_List; /* Liste des sous-modules */
|
||||
NDT_Root * Trigger_List; /* Liste des triggers posés sur le channel */
|
||||
NDT_Root * Event_Cpt_List; /* Liste de compteurs d'événements */
|
||||
} LOGT_Channel;
|
||||
|
||||
/* Notion de trigger (ajout ou suppression dynamique de tables de routage) */
|
||||
|
||||
typedef struct LOGT_Trigger
|
||||
{
|
||||
char * Event_Name; /* Evénement déclencheur du trigger */
|
||||
LOGT_RTab * RTab; /* Table de routage utilisateur concernée */
|
||||
LOGT_Flags Mode; /* Mode de fonctionnement du trigger */
|
||||
LOGT_Channel * Channel; /* Channel auquel est rattaché le trigger */
|
||||
} LOGT_Trigger;
|
||||
|
||||
/* Base système de la librairie LIBLOG */
|
||||
|
||||
typedef struct {
|
||||
NDT_Root * KMOD; /* Cache des modules */
|
||||
NDT_Root * KFORMAT; /* Cache des formats d'événement */
|
||||
LOGT_RTab * GDRT; /* Table GDRT */
|
||||
LOGT_RTab * GMRT; /* Table GMRT */
|
||||
NDT_Root * LMRT_List; /* Liste des LMRT */
|
||||
NDT_Root * LDRT_List; /* Liste des LDRT */
|
||||
NDT_Root * URT_List; /* Liste des URT */
|
||||
NDT_Root * Channel_List; /* Liste des channels */
|
||||
} LOGT_Base;
|
||||
|
||||
LOGT_Base * LOG_Base = NULL;
|
||||
|
||||
/* Informations sur un type d'événement */
|
||||
|
||||
typedef struct {
|
||||
unsigned int Event_Type; /* Identifiant du type d'événement */
|
||||
char * Event_Name; /* Nom du type d'événément */
|
||||
LOGT_Rooting Rooting; /* Routage associé */
|
||||
LOGT_Gravite Gravite; /* Code gravité associé */
|
||||
LOGT_RC RC; /* Code retour associé */
|
||||
NDT_Root * Data_List; /* Liste des données du format de l'événement */
|
||||
} LOGT_Info;
|
||||
|
||||
/* Format d'un type d'événement */
|
||||
|
||||
typedef struct {
|
||||
unsigned int Event_Type; /* Type d'événement */
|
||||
NDT_Root * Data_List; /* Liste des données du format */
|
||||
} LOGT_Event_Format;
|
||||
|
||||
/* Message explicite des erreurs générées par la librairie LINLOG */
|
||||
|
||||
char LOG_Error_Msg [256];
|
||||
|
||||
/* Identifiant du port de messages pour l'envoi des événements */
|
||||
|
||||
#define LOGD_EVENT_PORT_NAME "EVENT_PORT"
|
||||
|
||||
/* Type des messages qui contiennent les événements */
|
||||
|
||||
#define LOGD_EVENT_MSG_TYPE 100
|
||||
|
||||
/*
|
||||
Formatage des événements par les clients de la LIBLOG :
|
||||
|
||||
EVEN1[.EVEN2[.EVEN3]]@[MODULE1[.MODULE2[.MODULE3]]]:[MODE1[.MODE2[.MODE3]]]:[GEO1[.GEO2[.GEO3]]]
|
||||
|
||||
*/
|
||||
|
||||
#define EVEN1 0x00000101
|
||||
#define EVEN2 0x00000102
|
||||
#define EVEN3 0x00000103
|
||||
#define MODULE1 0x00000201
|
||||
#define MODULE2 0x00000202
|
||||
#define MODULE3 0x00000203
|
||||
#define MODE1 0x00000301
|
||||
#define MODE2 0x00000302
|
||||
#define MODE3 0x00000303
|
||||
#define GEO1 0x00000401
|
||||
#define GEO2 0x00000402
|
||||
#define GEO3 0x00000403
|
||||
|
||||
#define DEFAULT -1L
|
||||
#define CHAR 0L
|
||||
#define STRING 1L
|
||||
#define SHORT 2L
|
||||
#define INT 3L
|
||||
#define LONG 4L
|
||||
#define FLOAT 5L
|
||||
#define DOUBLE 6L
|
||||
|
||||
#define END_NAME -1
|
||||
#define END_DATA "END_DATA"
|
||||
|
||||
/* Format d'un message contenant un événement */
|
||||
|
||||
#define EVENT_FORMAT_VERSION_SIZE 10 /* sur 10 caractères max */
|
||||
#define EVENT_FORMAT_VERSION "V1.0"
|
||||
|
||||
/* Zone de données du message :
|
||||
|
||||
- Version de format de message : 10 octets |
|
||||
- Numéro de processus envoyeur : 4 octets | Entête
|
||||
- Identifiant du module envoyeur : 4 octets |
|
||||
- Identifiant du module primaire : 4 octets |
|
||||
|
||||
- Identifiant du type d'événement : 4 octets
|
||||
|
||||
- Taille du nom de l'événement : 1 octet |
|
||||
- Nom de l'événement |
|
||||
- Taille du code support : 1 octet |
|
||||
- Code support |
|
||||
- Taille du nom de la macro-donnée : 1 octet | Evénement |
|
||||
- Nom de la macro-donnée | |
|
||||
- Taille de la valeur de la macro-donnée : 1 octet | | N fois
|
||||
- Valeur de la macro-donnée | |
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
char Version [EVENT_FORMAT_VERSION_SIZE];
|
||||
unsigned int Sending_Pid;
|
||||
unsigned int ModuleId;
|
||||
unsigned int Master_ModuleId;
|
||||
} LOGT_Event_Msg_Header;
|
||||
|
||||
typedef struct {
|
||||
LOGT_Event_Msg_Header Header;
|
||||
unsigned int Event_Type;
|
||||
size_t Data_Size;
|
||||
char Event_Data;
|
||||
} LOGT_Event_Msg_Data;
|
||||
|
||||
/* Définition des alias de l'API */
|
||||
|
||||
#ifndef LOG_MODE
|
||||
#define LOG_MODE 0
|
||||
#endif
|
||||
|
||||
#if LOG_MODE == 1
|
||||
|
||||
/* API sans vérification des arguments */
|
||||
|
||||
# define LOG_Library_Open LOG_Library_Open_I
|
||||
# define LOG_Library_Close LOG_Library_Close_I
|
||||
# define LOG_Library_Stderr_Set LOG_Library_Stderr_Set_I
|
||||
# define LOG_Channel_Open LOG_Channel_Open_I
|
||||
# define LOG_Channel_Enter LOG_Channel_Enter_I
|
||||
# define LOG_Channel_Leave LOG_Channel_Leave_I
|
||||
# define LOG_Channel_Close LOG_Channel_Close_I
|
||||
# define LOG_RTab_Alloc LOG_RTab_Alloc_I
|
||||
# define LOG_RTab_Setup LOG_RTab_Setup_I
|
||||
# define LOG_RTab_Add LOG_RTab_Add_I
|
||||
# define LOG_RTab_Remove LOG_RTab_Remove_I
|
||||
# define LOG_RTab_Free LOG_RTab_Free_I
|
||||
# define LOG_Trigger_Add LOG_Trigger_Add_I
|
||||
# define LOG_Trigger_Remove LOG_Trigger_Remove_I
|
||||
# define LOG_Event_Send LOG_Event_Send_I
|
||||
# define LOG_Event_External_Send LOG_Event_External_Send_I
|
||||
# define LOG_Event_Info_Get LOG_Event_Info_Get_I
|
||||
# define LOG_Event_Cpt_Get LOG_Event_Cpt_Get_I
|
||||
|
||||
#else
|
||||
|
||||
/* API avec vérification des arguments */
|
||||
|
||||
# define LOG_Library_Open LOG_Library_Open_C
|
||||
# define LOG_Library_Close LOG_Library_Close_C
|
||||
# define LOG_Library_Stderr_Set LOG_Library_Stderr_Set_C
|
||||
# define LOG_Channel_Open LOG_Channel_Open_C
|
||||
# define LOG_Channel_Enter LOG_Channel_Enter_C
|
||||
# define LOG_Channel_Leave LOG_Channel_Leave_C
|
||||
# define LOG_Channel_Close LOG_Channel_Close_C
|
||||
# define LOG_RTab_Alloc LOG_RTab_Alloc_C
|
||||
# define LOG_RTab_Setup LOG_RTab_Setup_C
|
||||
# define LOG_RTab_Add LOG_RTab_Add_C
|
||||
# define LOG_RTab_Remove LOG_RTab_Remove_C
|
||||
# define LOG_RTab_Free LOG_RTab_Free_C
|
||||
# define LOG_Trigger_Add LOG_Trigger_Add_C
|
||||
# define LOG_Trigger_Remove LOG_Trigger_Remove_C
|
||||
# define LOG_Event_Send LOG_Event_Send_C
|
||||
# define LOG_Event_External_Send LOG_Event_External_Send_C
|
||||
# define LOG_Event_Info_Get LOG_Event_Info_Get_C
|
||||
# define LOG_Event_Cpt_Get LOG_Event_Cpt_Get_C
|
||||
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Ouverture de la librairie */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Instance : numéro de l'instance à ouvrir */
|
||||
/* (I) Context : contexte d'utilisation de la librairie */
|
||||
/* (I) Open_Mode : mode d'ouverture de la librairie */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Library_Open_I ( int Instance, const char * Context, LOGT_Flags Open_Mode );
|
||||
LOGT_Status LOG_Library_Open_C ( int Instance, const char * Context, LOGT_Flags Open_Mode );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Fermeture de l'instance de la librairie */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Close_Mode : mode de fermeture de la librairie */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Library_Close_I ( LOGT_Flags Close_Mode );
|
||||
LOGT_Status LOG_Library_Close_C ( LOGT_Flags Close_Mode );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Définition de la sortie standard des messages d'erreur de la librairie */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Out : flux de sortie des messages d'erreur */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Library_Stderr_Set_I ( FILE * Out );
|
||||
LOGT_Status LOG_Library_Stderr_Set_C ( FILE * Out );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Création d'un canal de communication */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (O) Channel : adresse du pointeur sur le canal créé */
|
||||
/* (I) Pid : numéro du processus propriétaire du canal */
|
||||
/* (I) Channel_Id : identifiant du canal au sein du processus */
|
||||
/* (I) Module_Name : nom du module propriétaire du canal */
|
||||
/* (I) Master_Module_Name : nom du module primaire */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Channel_Open_I (LOGT_Channel ** Channel, int Pid, int Channel_Id, const char * Module_Name, const char * Master_Module_Name);
|
||||
LOGT_Status LOG_Channel_Open_C (LOGT_Channel ** Channel, int Pid, int Channel_Id, const char * Module_Name, const char * Master_Module_Name);
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Entrée dans un sous-module pour un canal de communication */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Channel : pointeur sur le canal */
|
||||
/* (I) SubModule_Name : nom du sous-module */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Channel_Enter_I ( LOGT_Channel * Channel, const char * SubModule_Name );
|
||||
LOGT_Status LOG_Channel_Enter_C ( LOGT_Channel * Channel, const char * SubModule_Name );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Sortie d'un sous-module pour un canal de communication */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Channel : pointeur sur le canal */
|
||||
/* (I) SubModule_Name : nom du sous-module */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Channel_Leave_I ( LOGT_Channel * Channel, const char * SubModule_Name );
|
||||
LOGT_Status LOG_Channel_Leave_C ( LOGT_Channel * Channel, const char * SubModule_Name );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Fermeture d'un canal de communication */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Channel : pointeur sur le canal à fermer */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Channel_Close_I ( LOGT_Channel * Channel);
|
||||
LOGT_Status LOG_Channel_Close_C ( LOGT_Channel * Channel);
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Création d'une table de routage utilisateur */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (O) RTab : adresse du pointeur sur la table de routage */
|
||||
/* (I) Name : nom de la table de routage */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_RTab_Alloc_I ( LOGT_RTab ** RTab, char * Name );
|
||||
LOGT_Status LOG_RTab_Alloc_C ( LOGT_RTab ** RTab, char * Name );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Ajout d'une règle à une table de routage */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) RTab : pointeur sur la table de routage */
|
||||
/* (I) RuleClass : classe de la nouvelle règle */
|
||||
/* (I) Rule : pointeur sur la nouvelle règle */
|
||||
/* (I) Value : valeur de la nouvelle règle */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_RTab_Setup_I ( LOGT_RTab * RTab, LOGT_RuleClass RuleClass, LOGT_Rule * Rule, LOGT_Rooting Value );
|
||||
LOGT_Status LOG_RTab_Setup_C ( LOGT_RTab * RTab, LOGT_RuleClass RuleClass, LOGT_Rule * Rule, LOGT_Rooting Value );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Ajout d'une table de routage à un canal de communication */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Channel : pointeur sur le canal de communication */
|
||||
/* (I) RTab : pointeur sur la table de routage */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_RTab_Add_I ( LOGT_Channel * Channel, LOGT_RTab * RTab );
|
||||
LOGT_Status LOG_RTab_Add_C ( LOGT_Channel * Channel, LOGT_RTab * RTab );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Suppression d'une table de routage d'un canal de communication */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Channel : pointeur sur le canal de communication */
|
||||
/* (I) RTab : pointeur sur la table de routage */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_RTab_Remove_I ( LOGT_Channel * Channel, LOGT_RTab * RTab );
|
||||
LOGT_Status LOG_RTab_Remove_C ( LOGT_Channel * Channel, LOGT_RTab * RTab );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Destruction d'une table de routage */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) RTab : pointeur sur la table de routage */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_RTab_Free_I ( LOGT_RTab * RTab );
|
||||
LOGT_Status LOG_RTab_Free_C ( LOGT_RTab * RTab );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Ajout d'un trigger */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (O) Trigger : adresse du pointeur sur le trigger mis en place */
|
||||
/* (I) Channel : pointeur sur le canal de communication */
|
||||
/* (I) RTab : pointeur sur la table de routage à appliquer */
|
||||
/* (I) Type_Evt : type d'événement déclencheur ( expression régulière ) */
|
||||
/* (I) Mode : mode de fonctionnement du trigger */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Trigger_Add_I ( LOGT_Trigger ** Trigger, LOGT_Channel * Channel, LOGT_RTab * RTab, char * Type_Evt, LOGT_Flags Mode );
|
||||
LOGT_Status LOG_Trigger_Add_C ( LOGT_Trigger ** Trigger, LOGT_Channel * Channel, LOGT_RTab * RTab, char * Type_Evt, LOGT_Flags Mode );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Suppression d'un trigger */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Trigger : pointeur sur le trigger mis en place */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Trigger_Remove_I ( LOGT_Trigger * Trigger );
|
||||
LOGT_Status LOG_Trigger_Remove_C ( LOGT_Trigger * Trigger );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Envoi d'un événement */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Channel : pointeur sur un canal de communication */
|
||||
/* (O) RC : pointeur sur le code retour associé à l'événement */
|
||||
/* (I) Cd_Support : code du support source */
|
||||
/* (I) Data : données de l'événement */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Event_Send_I ( LOGT_Channel * Channel, LOGT_RC * RC, char * Cd_Support, va_list Data );
|
||||
LOGT_Status LOG_Event_Send_C ( LOGT_Channel * Channel, LOGT_RC * RC, char * Cd_Support, va_list Data );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Envoi d'un événement ( PL/SQL ou shell ) */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Channel : identifiant du channel */
|
||||
/* (I) Cd_Support : code du support source */
|
||||
/* (I) Data : données de l'événement */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (O) Retourne le code retour associé au type d'événement */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_RC LOG_Event_External_Send_I ( LOGT_Channel * Channel, char * Cd_Support, char * Data );
|
||||
LOGT_RC LOG_Event_External_Send_C ( LOGT_Channel * Channel, char * Cd_Support, char * Data );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Retourne les informations du type par lequel un événement est résolu */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Channel : pointeur sur un canal de communication */
|
||||
/* (O) Info : pointeur sur les informations à récupérer */
|
||||
/* (I) Event_Name : nom de l'événement */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Event_Info_Get_I ( LOGT_Channel * Channel, LOGT_Info ** Info, char * Event_Name );
|
||||
LOGT_Status LOG_Event_Info_Get_C ( LOGT_Channel * Channel, LOGT_Info ** Info, char * Event_Name );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Retourne le nombre d'événements envoyés par code retour */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Channel : pointeur sur un canal de communication */
|
||||
/* (O) Cpt : pointeur sur un tableau de compteurs d'événement */
|
||||
/* (I) RegExpr : expression régulière sur le nom d'événement */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
LOGT_Status LOG_Event_Cpt_Get_I ( LOGT_Channel * Channel, int * Cpt [LOGD_RC_SIZE], char * RegExpr );
|
||||
LOGT_Status LOG_Event_Cpt_Get_C ( LOGT_Channel * Channel, int * Cpt [LOGD_RC_SIZE], char * RegExpr );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
68
lib/tool.h
Normal file
68
lib/tool.h
Normal file
@ -0,0 +1,68 @@
|
||||
#ifndef _LIBTOOL
|
||||
#define _LIBTOOL
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <log.h>
|
||||
|
||||
/* Codes retour des fonctions de l'API */
|
||||
|
||||
typedef int TLT_Status;
|
||||
|
||||
#define TLS_OK LOGS_OK
|
||||
#define TLS_KO LOGS_KO
|
||||
|
||||
typedef int TLT_Cache;
|
||||
|
||||
#define TLD_KMOD 0001
|
||||
#define TLD_KFORMAT 0010
|
||||
#define TLD_GDRT 0100
|
||||
|
||||
char TL_Error_Msg[256];
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Définition de la sortie standard des messages d'erreur de la librairie */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Out : flux de sortie des messages d'erreur */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
TLT_Status TL_Library_Stderr_Set ( FILE * Out );
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Chargement des caches de la librairie LIBLOG */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) ToLoad : liste des caches de données à charger */
|
||||
/* (combinaison de TLD_KMOD, TLD_KFORMAT et TLD_GDRT) */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
TLT_Status TL_LIBLOG_Load (TLT_Cache ToLoad);
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Déchargement des caches de la librairie LIBLOG */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) ToUnload : liste des caches de données à décharger */
|
||||
/* (combinaison de TLD_KMOD, TLD_KFORMAT et TLD_GDRT) */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
TLT_Status TL_LIBLOG_Unload (TLT_Cache ToUnload);
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Affectation de toutes les tables de routage d'une section KUNF à un channel */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Channel : pointeur sur le channel */
|
||||
/* (I) Kunf_Nm : nom de la section KUNF */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
TLT_Status TL_Channel_RTab_Add (LOGT_Channel * My_Channel, const char * Kunf_Nm);
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* Affectation de tous les triggers d'une section KUNF à un channel */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* (I) Channel : pointeur sur le channel */
|
||||
/* (I) Kunf_Nm : nom de la section KUNF */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
TLT_Status TL_Channel_Trigger_Add (LOGT_Channel * My_Channel, const char * Kunf_Nm);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
426
util/logadmin.c
Normal file
426
util/logadmin.c
Normal file
@ -0,0 +1,426 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <sys/time.h>
|
||||
#include <log.h>
|
||||
#include <tool.h>
|
||||
|
||||
VER_INFO_EXPORT (logadmin, "$Revision: 1.1 $", "$Name: $", __FILE__, "$Author: smas $")
|
||||
|
||||
#define USAGE "Usage : %s [ --help | --version [-v] | --create | --destroy | --load [1|2|3] ] | --unload [1|2|3] ]\n"
|
||||
|
||||
typedef struct {
|
||||
double sec;
|
||||
struct timeval start;
|
||||
struct timeval stop;
|
||||
} cpt;
|
||||
|
||||
#define t_start(x){gettimeofday(&(x.start), NULL);}
|
||||
#define t_stop(x){gettimeofday(&(x.stop), NULL); x.sec = (double)(x.stop.tv_sec) - (double)(x.start.tv_sec) + ((double)(x.stop.tv_usec) - (double)(x.start.tv_usec)) / 1000000;}
|
||||
cpt t_exec;
|
||||
|
||||
#define QUIT 0
|
||||
#define BASE_INIT 1
|
||||
#define BASE_OPEN 2
|
||||
#define BASE_INFO 3
|
||||
#define BASE_CLOSE 4
|
||||
#define BASE_END 5
|
||||
#define BASE_LOAD 6
|
||||
#define BASE_UNLOAD 7
|
||||
#define SHOW_CHANNEL_LIST 8
|
||||
#define SHOW_RTAB_LIST 9
|
||||
#define CHANNEL_DUMP 10
|
||||
#define RTAB_DUMP 11
|
||||
#define TEST_EVENT 12
|
||||
|
||||
char menu [1000];
|
||||
char tmp [100];
|
||||
|
||||
void init_menu (void);
|
||||
int print_menu (void);
|
||||
char * Get_Rooting (LOGT_Rooting);
|
||||
char * Get_RC (LOGT_RC);
|
||||
|
||||
int main (int argc, char ** argv)
|
||||
{
|
||||
int choice, i;
|
||||
char Name [100];
|
||||
LOGT_Channel * My_Channel;
|
||||
char Answer[10];
|
||||
NDT_Node * Node;
|
||||
NDT_Root * Root;
|
||||
LOGT_RTab RTab;
|
||||
int Mode;
|
||||
LOGT_Info * Info;
|
||||
|
||||
TL_Library_Stderr_Set (stderr);
|
||||
|
||||
/* Lancement de commande d'administration ? */
|
||||
|
||||
if (argc >= 2)
|
||||
{
|
||||
if (!strcmp (argv [1], "--help"))
|
||||
{
|
||||
fprintf (stderr, USAGE, argv [0]);
|
||||
return -1;
|
||||
}
|
||||
else if (!strcmp (argv [1], "--version"))
|
||||
{
|
||||
if (argc >= 3 && !strcmp (argv [2], "-v"))
|
||||
return VER_Object_Print (stdout, VERD_VERBOSE);
|
||||
else
|
||||
return VER_Object_Print (stdout, VERD_MINIMAL);
|
||||
}
|
||||
else if (!strcmp (argv [1], "--create"))
|
||||
{
|
||||
if (SM_Library_Open (0, NULL, SMD_OPEN | SMD_DEBUG_ALL) != SMS_OK)
|
||||
{
|
||||
fprintf (stderr, "=> Impossible d'ouvrir l'instance de la LIBSHMEM\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (LOG_Library_Open (0, NULL, LOGD_CREATE | SMD_DEBUG_ALL) != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "=> Création de la LIBLOG impossible\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
else if (!strcmp (argv [1], "--load"))
|
||||
{
|
||||
Mode = 0;
|
||||
|
||||
if (argc > 2)
|
||||
{
|
||||
if (strchr (argv [2], '1')) Mode += TLD_KMOD;
|
||||
if (strchr (argv [2], '2')) Mode += TLD_KFORMAT;
|
||||
if (strchr (argv [2], '3')) Mode += TLD_GDRT;
|
||||
}
|
||||
|
||||
if (LOG_Library_Open (0, NULL, LOGD_OPEN | SMD_DEBUG_ALL) != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "=> Ouverture de la LIBLOG impossible\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (TL_LIBLOG_Load (Mode) != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "=> Chargement de la LIBLOG impossible\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else if (!strcmp (argv [1], "--unload"))
|
||||
{
|
||||
Mode = 0;
|
||||
|
||||
if (argc > 2)
|
||||
{
|
||||
if (strchr (argv [2], '1')) Mode += TLD_KMOD;
|
||||
if (strchr (argv [2], '2')) Mode += TLD_KFORMAT;
|
||||
if (strchr (argv [2], '3')) Mode += TLD_GDRT;
|
||||
}
|
||||
|
||||
if (LOG_Library_Open (0, NULL, LOGD_OPEN | SMD_DEBUG_ALL) != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "=> Ouverture de la LIBLOG impossible\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (TL_LIBLOG_Unload (Mode) != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "=> Déchargement de la LIBLOG impossible\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else if (!strcmp (argv [1], "--destroy"))
|
||||
{
|
||||
if (LOG_Library_Open (0, NULL, LOGD_OPEN | SMD_DEBUG_ALL) != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "=> Ouverture de la LIBLOG à détruire impossible\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (LOG_Library_Close (LOGD_DESTROY) != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "=> Destruction de la LIBLOG impossible\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (stderr, USAGE, argv [0]);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Lancement du menu intercatif */
|
||||
|
||||
init_menu ();
|
||||
|
||||
choice = print_menu ();
|
||||
|
||||
while (choice != QUIT)
|
||||
{
|
||||
strcpy (Answer, "yes");
|
||||
|
||||
switch (choice)
|
||||
{
|
||||
case BASE_INIT:
|
||||
fprintf (stdout, "\nReturn code = %s\n", \
|
||||
LOG_Library_Open (0, NULL, LOGD_CREATE | SMD_DEBUG_ALL) == LOGS_OK ? "OK" : "NOK" );
|
||||
break;
|
||||
|
||||
case BASE_OPEN:
|
||||
fprintf (stdout, "\nReturn code = %s\n", \
|
||||
LOG_Library_Open (0, NULL, LOGD_OPEN | SMD_DEBUG_ALL) == LOGS_OK ? "OK" : "NOK" );
|
||||
break;
|
||||
|
||||
case BASE_END:
|
||||
fprintf (stdout, "\nReturn code = %s\n", \
|
||||
LOG_Library_Close (LOGD_DESTROY) == LOGS_OK ? "OK" : "NOK" );
|
||||
break;
|
||||
|
||||
case BASE_CLOSE:
|
||||
fprintf (stdout, "\nReturn code = %s\n", \
|
||||
LOG_Library_Close (LOGD_CLOSE) == LOGS_OK ? "OK" : "NOK" );
|
||||
break;
|
||||
|
||||
case BASE_INFO:
|
||||
DS_DataStruct_Info_Print (LOG_Base->KMOD, stdout);
|
||||
DS_DataStruct_Info_Print (LOG_Base->KFORMAT, stdout);
|
||||
DS_DataStruct_Info_Print (LOG_Base->GDRT->Root, stdout);
|
||||
DS_DataStruct_Info_Print (LOG_Base->LMRT_List, stdout);
|
||||
DS_DataStruct_Info_Print (LOG_Base->LDRT_List, stdout);
|
||||
DS_DataStruct_Info_Print (LOG_Base->URT_List, stdout);
|
||||
DS_DataStruct_Info_Print (LOG_Base->Channel_List, stdout);
|
||||
break;
|
||||
|
||||
case BASE_LOAD:
|
||||
fprintf (stdout, "\nCache to load ? (KMOD=1, KFORMAT=2, GDRT=3) ");
|
||||
gets (Name);
|
||||
Mode = 0;
|
||||
if (strchr (Name, '1')) Mode |= TLD_KMOD;
|
||||
if (strchr (Name, '2')) Mode += TLD_KFORMAT;
|
||||
if (strchr (Name, '3')) Mode += TLD_GDRT;
|
||||
fprintf (stdout, "\nReturn code = %s\n", TL_LIBLOG_Load (Mode) == LOGS_OK ? "OK" : "NOK" );
|
||||
|
||||
break;
|
||||
|
||||
case BASE_UNLOAD:
|
||||
fprintf (stdout, "\nCache to unload ? (KMOD=1, KFORMAT=2, GDRT=3) ");
|
||||
gets (Name);
|
||||
Mode = 0;
|
||||
if (strchr (Name, '1')) Mode += TLD_KMOD;
|
||||
if (strchr (Name, '2')) Mode += TLD_KFORMAT;
|
||||
if (strchr (Name, '3')) Mode += TLD_GDRT;
|
||||
fprintf (stdout, "\nReturn code = %s\n", TL_LIBLOG_Unload (Mode) == LOGS_OK ? "OK" : "NOK" );
|
||||
|
||||
break;
|
||||
|
||||
case SHOW_RTAB_LIST:
|
||||
DS_DataStruct_Print (LOG_Base->LMRT_List, stdout);
|
||||
DS_DataStruct_Print (LOG_Base->LDRT_List, stdout);
|
||||
DS_DataStruct_Print (LOG_Base->URT_List, stdout);
|
||||
break;
|
||||
|
||||
case SHOW_CHANNEL_LIST:
|
||||
DS_DataStruct_Print (LOG_Base->Channel_List, stdout);
|
||||
break;
|
||||
|
||||
case CHANNEL_DUMP:
|
||||
fprintf (stdout, "\nChannel address ? ");
|
||||
gets (Name);
|
||||
i = atoi (Name);
|
||||
|
||||
if (DS_Node_Find (LOG_Base->Channel_List, &Node, (void *)i, NULL) != DSS_OK)
|
||||
fprintf (stdout, "Unable to find channel at address %d\n", i);
|
||||
else
|
||||
{
|
||||
My_Channel = (LOGT_Channel *)(Node->Value);
|
||||
|
||||
ND_Manager_Exec (LOG_Base->Channel_List->Manager, NDD_CMD_PRINT_VALUE, &My_Channel, stdout);
|
||||
|
||||
if (fprintf (stdout, "\n\nShow rooting tables ? (y/n) ") && gets (tmp) && *tmp == 'y')
|
||||
DS_DataStruct_Print (My_Channel->RTab_List, stdout);
|
||||
|
||||
if (fprintf (stdout, "\nShow submodules ? (y/n) ") && gets (tmp) && *tmp == 'y')
|
||||
DS_DataStruct_Print (My_Channel->SubModule_List, stdout);
|
||||
|
||||
if (fprintf (stdout, "\nShow triggers ? (y/n) ") && gets (tmp) && *tmp == 'y')
|
||||
DS_DataStruct_Print (My_Channel->Trigger_List, stdout);
|
||||
|
||||
if (fprintf (stdout, "\nShow event counters ? (y/n) ") && gets (tmp) && *tmp == 'y')
|
||||
DS_DataStruct_Print (My_Channel->Event_Cpt_List, stdout);
|
||||
}
|
||||
break;
|
||||
|
||||
case RTAB_DUMP:
|
||||
fprintf (stdout, "\nTable Name ? ");
|
||||
gets (Name);
|
||||
RTab.Name = Name;
|
||||
if ((DS_Node_Find (LOG_Base->LMRT_List, &Node, &RTab, NULL) == DSS_OK && (Root = LOG_Base->LMRT_List)) ||
|
||||
(DS_Node_Find (LOG_Base->LDRT_List, &Node, &RTab, NULL) == DSS_OK && (Root = LOG_Base->LDRT_List)) ||
|
||||
(DS_Node_Find (LOG_Base->URT_List, &Node, &RTab, NULL) == DSS_OK && (Root = LOG_Base->URT_List)))
|
||||
{
|
||||
ND_Manager_Exec (Root->Manager, NDD_CMD_PRINT_VALUE, (void **)&(Node->Value), stdout);
|
||||
|
||||
if (fprintf (stdout, "\n\nShow events ? (y/n) ") && gets (tmp) && *tmp == 'y')
|
||||
DS_DataStruct_Print (((LOGT_RTab *)(Node->Value))->Root, stdout);
|
||||
}
|
||||
else
|
||||
fprintf (stdout, "\nUnable to find rooting table \"%s\"\n", Name);
|
||||
|
||||
break;
|
||||
|
||||
case TEST_EVENT:
|
||||
fprintf (stdout, "\nEvent name ? ");
|
||||
gets (Name);
|
||||
Info = (LOGT_Info *)malloc(sizeof(LOGT_Info));
|
||||
t_start (t_exec);
|
||||
if (LOG_Event_Info_Get(NULL, &Info, Name) != LOGS_OK)
|
||||
{
|
||||
fprintf (stdout, "\nEvénement \"%s\" non résolu\n", Name);
|
||||
t_stop (t_exec);
|
||||
}
|
||||
else
|
||||
{
|
||||
t_stop (t_exec);
|
||||
fprintf (stdout, "\nEvénement \"%s\" résolu en %.4f sec :\n", Name, t_exec.sec);
|
||||
fprintf (stdout, "\t- Type : %s (%d)\n", Info->Event_Name, Info->Event_Type);
|
||||
fprintf (stdout, "\t- Routage : %s\n", Get_Rooting(Info->Rooting));
|
||||
fprintf (stdout, "\t- Gravité : %c\n", (char)Info->Gravite);
|
||||
fprintf (stdout, "\t- Code retour : %s\n", Get_RC(Info->RC));
|
||||
fprintf (stdout, "\t- Format :");
|
||||
if (Info->Data_List)
|
||||
{
|
||||
ND_Node_First_Get(Info->Data_List, &Node);
|
||||
i = 0;
|
||||
while (Node)
|
||||
{
|
||||
if (i > 0) fprintf (stdout, ",");
|
||||
fprintf (stdout, " %s", (char *)(Node->Value));
|
||||
ND_Node_Next_Get (Node, &Node);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
fprintf (stdout, "\n\n");
|
||||
}
|
||||
free(Info);
|
||||
break;
|
||||
|
||||
case QUIT:
|
||||
fprintf (stdout, "\nExiting program ...\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf (stdout, "\nUndefined choice %d\n", choice);
|
||||
}
|
||||
choice = print_menu ();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void init_menu (void)
|
||||
{
|
||||
sprintf (menu, "Menu :\n");
|
||||
sprintf (tmp, " - %2d) %-25s", QUIT, "Quit"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s\n", BASE_INIT, "Init library"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s", BASE_OPEN, "Open library"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s\n", BASE_INFO, "Info library"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s", BASE_CLOSE, "Close library"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s\n", BASE_END, "End library"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s", BASE_LOAD, "Load library cache"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s\n", BASE_UNLOAD, "Unload library cache"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s", SHOW_CHANNEL_LIST, "Show channels"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s\n", SHOW_RTAB_LIST, "Show rooting tables"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s", CHANNEL_DUMP, "Dump a channel"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s\n", RTAB_DUMP, "Dump a rooting table"); strcat (menu, tmp);
|
||||
sprintf (tmp, " - %2d) %-25s\n", TEST_EVENT, "Test an event"); strcat (menu, tmp);
|
||||
}
|
||||
|
||||
int print_menu (void)
|
||||
{
|
||||
fprintf (stdout, "---------------------------------------------------------------------------\n%s", menu);
|
||||
|
||||
tmp[0] = '\0';
|
||||
while (tmp[0] == '\0')
|
||||
{
|
||||
printf ("\nChoice ? ");
|
||||
gets (tmp);
|
||||
}
|
||||
|
||||
return atoi (tmp);
|
||||
}
|
||||
|
||||
char *Get_Rooting(LOGT_Rooting Rooting)
|
||||
{
|
||||
static char lib[20];
|
||||
|
||||
switch ((int)Rooting)
|
||||
{
|
||||
case LOGD_ROOTING_NULL:
|
||||
strcpy(lib, "NULL");
|
||||
break;
|
||||
case LOGD_ROOTING_STDERR:
|
||||
strcpy(lib, "STDERR");
|
||||
break;
|
||||
case LOGD_ROOTING_DATABASE:
|
||||
strcpy(lib, "BASE");
|
||||
break;
|
||||
case LOGD_ROOTING_DEFAULT:
|
||||
strcpy(lib, "DEFAULT");
|
||||
break;
|
||||
case LOGD_ROOTING_PREVIOUS:
|
||||
strcpy(lib, "PREVIOUS");
|
||||
break;
|
||||
default:
|
||||
strcpy(lib, "unknown");
|
||||
break;
|
||||
}
|
||||
|
||||
return lib;
|
||||
}
|
||||
|
||||
char *Get_RC(LOGT_RC RC)
|
||||
{
|
||||
static char lib[20];
|
||||
|
||||
switch ((int)RC)
|
||||
{
|
||||
case LOGD_RC_OK:
|
||||
strcpy(lib, "OK");
|
||||
break;
|
||||
case LOGD_RC_ANOERR:
|
||||
strcpy(lib, "ANOERR");
|
||||
break;
|
||||
case LOGD_RC_REJDON:
|
||||
strcpy(lib, "REJDON");
|
||||
break;
|
||||
case LOGD_RC_REJENR:
|
||||
strcpy(lib, "REJENR");
|
||||
break;
|
||||
case LOGD_RC_WARNING:
|
||||
strcpy(lib, "WARNING");
|
||||
break;
|
||||
case LOGD_RC_RECYCLE:
|
||||
strcpy(lib, "RECYCLE");
|
||||
break;
|
||||
case LOGD_RC_EXIT:
|
||||
strcpy(lib, "EXIT");
|
||||
break;
|
||||
case LOGD_RC_ABEND:
|
||||
strcpy(lib, "ABEND");
|
||||
break;
|
||||
default:
|
||||
strcpy(lib, "unknown");
|
||||
break;
|
||||
}
|
||||
|
||||
return lib;
|
||||
}
|
||||
|
504
util/logagent.c
Normal file
504
util/logagent.c
Normal file
@ -0,0 +1,504 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <ver.h>
|
||||
#define MSG_MODE 1
|
||||
#include <msg.h>
|
||||
#include <log.h>
|
||||
#include <logagent.h>
|
||||
|
||||
VER_INFO_EXPORT (logagent, "$Revision: 1.1 $", "$Name: $", __FILE__, "$Author: smas $")
|
||||
|
||||
void Parse_Arg (int , char **);
|
||||
void Event_Msg_Process ( MSGT_Message * );
|
||||
void System_Msg_Process ( MSGT_Message * );
|
||||
void Info_Trace ( void );
|
||||
|
||||
unsigned int End_Agent, Nb_Event, Nb_System_Msg;
|
||||
MSGT_Port * Private_Port, * Event_Port;
|
||||
MSGT_PortList * Private_PortList;
|
||||
|
||||
unsigned int Num_Agent, Status, Debug;
|
||||
char Debug_Trace [512];
|
||||
|
||||
/*--------------------------------------------------------------------------------------------------*/
|
||||
/* Fonction principale */
|
||||
/*--------------------------------------------------------------------------------------------------*/
|
||||
int main ( int argc, char ** argv )
|
||||
{
|
||||
MSGT_Message * Msg;
|
||||
char Private_Port_Name [256];
|
||||
|
||||
/* Récupération des arguments de la ligne de commande */
|
||||
|
||||
Parse_Arg (argc, argv);
|
||||
|
||||
/* Démarrage de l'agent */
|
||||
|
||||
Status = ACTIVE;
|
||||
|
||||
/* Ouverture de la librairie LIBMSG */
|
||||
|
||||
if (MSG_Library_Open (NULL, NULL, MSGD_OPEN) != MSGS_OK)
|
||||
{
|
||||
strcpy (Debug_Trace, "impossible d'ouvrir la librairie LIBMSG");
|
||||
Info_Trace ();
|
||||
return KO;
|
||||
}
|
||||
|
||||
/* Ouverture du port de message dans lequel sont envoyés les événements */
|
||||
|
||||
if (MSG_Port_Open (LOGD_EVENT_PORT_NAME, &Event_Port, MSGD_OPEN | MSGD_CREATE) != MSGS_OK)
|
||||
{
|
||||
strcpy (Debug_Trace, "impossible d'ouvrir le port de messages des événements");
|
||||
Info_Trace ();
|
||||
MSG_Library_Close (MSGD_CLOSE);
|
||||
return KO;
|
||||
}
|
||||
|
||||
/* Ouverture (cas du restart) ou création du port privé de l'agent */
|
||||
|
||||
sprintf (Private_Port_Name, "Agent_%d_port", Num_Agent);
|
||||
|
||||
if (MSG_Port_Open (Private_Port_Name, &Private_Port, MSGD_OPEN | MSGD_CREATE) != MSGS_OK)
|
||||
{
|
||||
strcpy (Debug_Trace, "impossible de d'ouvrir ou de créer mon port de messages privé");
|
||||
Info_Trace ();
|
||||
MSG_Port_Close (Event_Port, MSGD_CLOSE);
|
||||
MSG_Library_Close (MSGD_CLOSE);
|
||||
return KO;
|
||||
}
|
||||
|
||||
/* Création d'une liste de ports (port public + port privé) que l'agent va écouter */
|
||||
|
||||
if (MSG_PortList_Open (&Private_PortList) != MSGS_OK)
|
||||
{
|
||||
strcpy (Debug_Trace, "impossible de créer ma liste de ports");
|
||||
Info_Trace ();
|
||||
MSG_Port_Close (Event_Port, MSGD_CLOSE);
|
||||
MSG_Port_Close (Private_Port, MSGD_DESTROY);
|
||||
MSG_Library_Close (MSGD_CLOSE);
|
||||
return KO;
|
||||
}
|
||||
|
||||
if (MSG_PortList_Port_Add (Private_PortList, Private_Port) != MSGS_OK || MSG_PortList_Port_Add (Private_PortList, Event_Port) != MSGS_OK)
|
||||
{
|
||||
strcpy (Debug_Trace, "impossible d'ajouter les ports privé et public à ma liste de ports");
|
||||
Info_Trace ();
|
||||
MSG_PortList_Close (Private_PortList);
|
||||
MSG_Port_Close (Event_Port, MSGD_CLOSE);
|
||||
MSG_Port_Close (Private_Port, MSGD_DESTROY);
|
||||
MSG_Library_Close (MSGD_CLOSE);
|
||||
return KO;
|
||||
}
|
||||
|
||||
sprintf (Debug_Trace, "démarrage en mode trace %s", Debug == TRUE ? "activé" : "désactivé");
|
||||
Info_Trace ();
|
||||
|
||||
/* Boucle principale */
|
||||
|
||||
Nb_System_Msg = 0;
|
||||
Nb_Event = 0;
|
||||
End_Agent = FALSE;
|
||||
|
||||
while (End_Agent == FALSE)
|
||||
{
|
||||
unsigned int Expected_Type;
|
||||
|
||||
if (Status == ACTIVE)
|
||||
{
|
||||
/* Quand l'agent est actif, il traite tous les types de messages */
|
||||
|
||||
Expected_Type = MSGD_NO_TYPE;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Quand l'agent est stoppé, il ne traite que les messages système */
|
||||
|
||||
Expected_Type = MSGD_SYSTEM_GENERIC;
|
||||
}
|
||||
|
||||
/* Ecoute des ports de messages de la liste */
|
||||
|
||||
if (MSG_PortList_Listen (Private_PortList, Expected_Type, &Msg, MSGD_WAIT) != MSGS_OK)
|
||||
{
|
||||
strcpy (Debug_Trace, "impossible de réceptionner un message depuis l'un des ports écoutés");
|
||||
Info_Trace ();
|
||||
MSG_PortList_Close (Private_PortList);
|
||||
MSG_Port_Close (Private_Port, MSGD_DESTROY);
|
||||
MSG_Library_Close (MSGD_CLOSE);
|
||||
return KO;
|
||||
}
|
||||
|
||||
/* Traitement du message */
|
||||
|
||||
switch (Msg->Type)
|
||||
{
|
||||
case LOGD_EVENT_MSG_TYPE:
|
||||
|
||||
/* Il s'agit d'un événement */
|
||||
|
||||
Event_Msg_Process (Msg);
|
||||
Nb_Event ++;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Il s'agit d'un message système */
|
||||
|
||||
System_Msg_Process (Msg);
|
||||
Nb_System_Msg ++;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Suppression de la liste de ports de l'agent */
|
||||
|
||||
if (MSG_PortList_Close (Private_PortList) != MSGS_OK)
|
||||
{
|
||||
strcpy (Debug_Trace, "impossible de supprimer ma liste de ports");
|
||||
Info_Trace ();
|
||||
MSG_Port_Close (Private_Port, MSGD_DESTROY);
|
||||
MSG_Library_Close (MSGD_CLOSE);
|
||||
return KO;
|
||||
}
|
||||
|
||||
/* Suppression du port privé de l'agent */
|
||||
|
||||
if (MSG_Port_Close (Private_Port, MSGD_DESTROY) != MSGS_OK)
|
||||
{
|
||||
strcpy (Debug_Trace, "impossible de supprimer mon port de messages privé");
|
||||
Info_Trace ();
|
||||
MSG_Library_Close (MSGD_CLOSE);
|
||||
return KO;
|
||||
}
|
||||
|
||||
/* Fermeture de la librairie */
|
||||
|
||||
if (MSG_Library_Close (MSGD_CLOSE) != MSGS_OK)
|
||||
{
|
||||
strcpy (Debug_Trace, "impossible de fermer la librairie LIBMSG");
|
||||
Info_Trace ();
|
||||
return KO;
|
||||
}
|
||||
|
||||
strcpy (Debug_Trace, "terminé");
|
||||
Info_Trace ();
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------------------*/
|
||||
/* Récupération de la ligne de commande */
|
||||
/*--------------------------------------------------------------------------------------------------*/
|
||||
void Parse_Arg (int argc, char ** argv)
|
||||
{
|
||||
int i;
|
||||
|
||||
Debug = FALSE;
|
||||
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
if (!strcmp (argv[i], "--help") || !strcmp (argv[i], "-h"))
|
||||
{
|
||||
fprintf (stderr, "Usage : %s [ [--help|-h] | --version [-v] | -id <id_agent> [--debug] ]\n", argv [0]);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (!strcmp (argv[i], "-id"))
|
||||
{
|
||||
i++;
|
||||
if (i == argc)
|
||||
{
|
||||
fprintf (stderr, "Argument manquant après \"%s\"\n", argv[i - 1]);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
Num_Agent = atoi (argv[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strcmp (argv[i], "--version"))
|
||||
{
|
||||
if (i+1 < argc && !strcmp (argv[i+1], "-v"))
|
||||
{
|
||||
VER_Object_Print (stdout, VERD_VERBOSE);
|
||||
exit (0);
|
||||
}
|
||||
else
|
||||
{
|
||||
VER_Object_Print (stdout, VERD_MINIMAL);
|
||||
exit (0);
|
||||
}
|
||||
}
|
||||
|
||||
if (!strcmp (argv[i], "--debug"))
|
||||
{
|
||||
Debug = TRUE;
|
||||
continue;
|
||||
}
|
||||
|
||||
fprintf (stderr, "Option invalide \"%s\"\n", argv[i]);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (Num_Agent == 0)
|
||||
{
|
||||
fprintf (stderr, "Option \"-id\" manquante ou bien valeur incorrecte (doit être > 0)\n");
|
||||
exit (0);
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------------------*/
|
||||
/* Traitement d'un message contenant un événement */
|
||||
/*--------------------------------------------------------------------------------------------------*/
|
||||
void Event_Msg_Process (MSGT_Message * Msg)
|
||||
{
|
||||
LOGT_Event_Msg_Data * Msg_Data;
|
||||
unsigned int Length, Event_Type;
|
||||
char Event_Name [256];
|
||||
char Cd_Support [256];
|
||||
char Data_Name [256];
|
||||
char Data_Value [256];
|
||||
unsigned int i;
|
||||
char * Event_Data_Ptr;
|
||||
|
||||
/* Récupération des données de l'entête de l'événement */
|
||||
|
||||
Msg_Data = (LOGT_Event_Msg_Data *)(Msg->Data);
|
||||
|
||||
/* Vérification de la version du format */
|
||||
|
||||
if (strcmp (Msg_Data->Header.Version, EVENT_FORMAT_VERSION))
|
||||
{
|
||||
sprintf (Debug_Trace, "version du format de message \"%s\" incorrect (\"%s\" attendu)", Msg_Data->Header.Version, EVENT_FORMAT_VERSION);
|
||||
Info_Trace ();
|
||||
|
||||
/* Suppression du message */
|
||||
|
||||
MSG_Message_Free (Msg);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sprintf (Debug_Trace, "réception d'un événement de la part du processus %d (module %d/%d)",
|
||||
Msg_Data->Header.Sending_Pid,
|
||||
Msg_Data->Header.ModuleId,
|
||||
Msg_Data->Header.Master_ModuleId);
|
||||
|
||||
/* Récupération de l'identifiant du type d'événement */
|
||||
|
||||
Event_Type = Msg_Data->Event_Type;
|
||||
|
||||
/* Récupération du nom de l'événement */
|
||||
|
||||
Event_Data_Ptr = &(Msg_Data->Event_Data);
|
||||
|
||||
i = 0;
|
||||
Length = (unsigned int)(Event_Data_Ptr [i]);
|
||||
strncpy (Event_Name, Event_Data_Ptr + i + 1, Length);
|
||||
Event_Name [Length] = (char)0;
|
||||
|
||||
i += 1 + Length;
|
||||
|
||||
if (Debug == TRUE) fprintf (stderr, "%s\nEvénement \"%s\" (type=%d):", Debug_Trace, Event_Name, Event_Type);
|
||||
|
||||
Length = (unsigned int)(Event_Data_Ptr [i]);
|
||||
strncpy (Cd_Support, Event_Data_Ptr + i + 1, Length);
|
||||
Cd_Support [Length] = (char)0;
|
||||
|
||||
if (Debug == TRUE) fprintf (stderr, "%s\n\t- support=\"%s\"\n", Debug_Trace, Cd_Support);
|
||||
|
||||
i += 1 + Length;
|
||||
|
||||
/* Récupération des macro-données */
|
||||
|
||||
while (i < Msg_Data->Data_Size)
|
||||
{
|
||||
/* Récupération du nom de la macro-donnée */
|
||||
|
||||
Length = (unsigned int)(Event_Data_Ptr [i]);
|
||||
strncpy (Data_Name, Event_Data_Ptr + i + 1, Length);
|
||||
Data_Name [Length] = (char)0;
|
||||
|
||||
i += 1 + Length;
|
||||
|
||||
if (i < Msg->Size)
|
||||
{
|
||||
/* Récupération de la valeur de la macro-donnée */
|
||||
|
||||
Length = (unsigned int)(Event_Data_Ptr [i]);
|
||||
strncpy (Data_Value, Event_Data_Ptr + i + 1, Length);
|
||||
Data_Value [Length] = (char)0;
|
||||
|
||||
i += 1 + Length;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy (Debug_Trace, "mauvais format d'événement");
|
||||
Info_Trace ();
|
||||
}
|
||||
|
||||
if (Debug == TRUE) fprintf (stderr, "\t- %s=%s\n", Data_Name, Data_Value);
|
||||
}
|
||||
|
||||
/* Traitement de l'événement
|
||||
|
||||
...
|
||||
...
|
||||
...
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/* Renvoi du message à l'envoyeur */
|
||||
|
||||
if (MSG_Message_Reply (Msg) != MSGS_OK)
|
||||
{
|
||||
strcpy (Debug_Trace, "impossible de renvoyer le message de l'événement à son envoyeur");
|
||||
Info_Trace ();
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------------------*/
|
||||
/* Traitement d'un message système par un agent */
|
||||
/*--------------------------------------------------------------------------------------------------*/
|
||||
void System_Msg_Process (MSGT_Message * Msg)
|
||||
{
|
||||
/* Pour accuser réception du message système, on commence par remplir les données liées à l'agent */
|
||||
|
||||
((Agent_Stat *)(Msg->Data))->Num_Agent = Num_Agent;
|
||||
((Agent_Stat *)(Msg->Data))->Pid = getpid ();
|
||||
|
||||
switch (Msg->Type)
|
||||
{
|
||||
case MSGD_SYSTEM_STOP_REQUEST:
|
||||
|
||||
if (Status == ACTIVE)
|
||||
{
|
||||
/* On indique que la requête a bien été prise en compte */
|
||||
|
||||
((Agent_Stat *)(Msg->Data))->Answer = TRUE;
|
||||
|
||||
/* Pause de l'agent jusqu'à réception d'un message MSGD_SYSTEM_CONTINUE_REQUEST */
|
||||
|
||||
Status = STOPPED;
|
||||
|
||||
strcpy (Debug_Trace, "pause");
|
||||
Info_Trace ();
|
||||
}
|
||||
else
|
||||
{
|
||||
/* On indique que la requête n'a pas été prise en compte */
|
||||
|
||||
((Agent_Stat *)(Msg->Data))->Answer = FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case MSGD_SYSTEM_CONTINUE_REQUEST:
|
||||
|
||||
if (Status == STOPPED)
|
||||
{
|
||||
/* On indique que la requête a bien été prise en compte */
|
||||
|
||||
((Agent_Stat *)(Msg->Data))->Answer = TRUE;
|
||||
|
||||
/* Reprise de l'agent */
|
||||
|
||||
Status = ACTIVE;
|
||||
|
||||
strcpy (Debug_Trace, "reprise");
|
||||
Info_Trace ();
|
||||
}
|
||||
else
|
||||
{
|
||||
/* On indique que la requête n'a pas été prise en compte */
|
||||
|
||||
((Agent_Stat *)(Msg->Data))->Answer = FALSE;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case MSGD_SYSTEM_SHUTDOWN_REQUEST:
|
||||
|
||||
/* Fin de la boucle principale de l'agent */
|
||||
|
||||
End_Agent = TRUE;
|
||||
|
||||
strcpy (Debug_Trace, "terminaison en cours...");
|
||||
Info_Trace ();
|
||||
|
||||
break;
|
||||
|
||||
case MSGD_SYSTEM_STATUS_REQUEST:
|
||||
|
||||
/* On informe le superviseur sur l'état dans lequel on se trouve */
|
||||
|
||||
((Agent_Stat *)(Msg->Data))->Status = Status;
|
||||
((Agent_Stat *)(Msg->Data))->Debug = Debug;
|
||||
|
||||
break;
|
||||
|
||||
case MSGD_SYSTEM_INFO_REQUEST:
|
||||
|
||||
/* On informe le superviseur sur le nombre de messages (système et événement) traités */
|
||||
|
||||
((Agent_Stat *)(Msg->Data))->Cpt_Event = Nb_Event;
|
||||
((Agent_Stat *)(Msg->Data))->Cpt_System = Nb_System_Msg;
|
||||
|
||||
break;
|
||||
|
||||
case MSGD_SYSTEM_TRACEON_REQUEST:
|
||||
|
||||
Debug = TRUE;
|
||||
strcpy (Debug_Trace, "activation du mode trace");
|
||||
Info_Trace ();
|
||||
|
||||
break;
|
||||
|
||||
case MSGD_SYSTEM_TRACEOFF_REQUEST:
|
||||
|
||||
strcpy (Debug_Trace, "désactivation du mode trace");
|
||||
Info_Trace ();
|
||||
Debug = FALSE;
|
||||
|
||||
break;
|
||||
|
||||
default :
|
||||
|
||||
/* On indique que la requête n'a pas été prise en compte */
|
||||
|
||||
((Agent_Stat *)(Msg->Data))->Answer = FALSE;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* On accuse réception du message */
|
||||
|
||||
MSG_Message_Reply (Msg);
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------------------*/
|
||||
/* Affichage sur la sortie standard d'erreur d'un message généré par un agent */
|
||||
/*--------------------------------------------------------------------------------------------------*/
|
||||
void Info_Trace ( void )
|
||||
{
|
||||
time_t dts;
|
||||
struct tm * dt;
|
||||
char Current_Date [25];
|
||||
|
||||
if (Debug == TRUE)
|
||||
{
|
||||
/* Récupère la date courante */
|
||||
|
||||
time (&dts);
|
||||
dt = localtime (&dts);
|
||||
sprintf (Current_Date, "%02d/%02d/%04d %02d:%02d:%02d", dt->tm_mday, dt->tm_mon + 1, dt->tm_year + 1900, dt->tm_hour, dt->tm_min, dt->tm_sec);
|
||||
|
||||
fprintf (stderr, "[%s] Agent n°%d : %s\n", Current_Date, Num_Agent, Debug_Trace);
|
||||
}
|
||||
}
|
24
util/logagent.h
Normal file
24
util/logagent.h
Normal file
@ -0,0 +1,24 @@
|
||||
|
||||
#define ANSWER_SIZE 1000 /* Taille minimale des messages système adressés au superviseur */
|
||||
#define DEFAULT_TIMEOUT 5 /* Nombre de secondes avant lesquelles les agents devront répondre aux requêtes du superviseur */
|
||||
#define NB_MAX_AGENT 50 /* Nombre maximal d'agents pouvant être suivis par le superviseur */
|
||||
|
||||
/* Etats possibles d'un agent */
|
||||
|
||||
#define STOPPED 0
|
||||
#define ACTIVE 1
|
||||
|
||||
#define OK 1
|
||||
#define KO -1
|
||||
|
||||
/* Structure contenant les informations qu'un agent renvoie au superviseur */
|
||||
|
||||
typedef struct {
|
||||
unsigned int Num_Agent; /* Numéro de l 'agent */
|
||||
pid_t Pid; /* Identifiant du processus de l'agent */
|
||||
unsigned int Status; /* Etat dans lequel se trouve l'agent */
|
||||
unsigned int Debug; /* Mode debug dans lequel se trouve l'agent */
|
||||
unsigned int Cpt_Event; /* Nombre d'événements traités */
|
||||
unsigned int Cpt_System; /* Nombre de messages système traités */
|
||||
unsigned int Answer; /* Réponse de l'agent à la requête */
|
||||
} Agent_Stat;
|
150
util/logbench.c
Normal file
150
util/logbench.c
Normal file
@ -0,0 +1,150 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <sys/time.h>
|
||||
#define LOG_MODE 1
|
||||
#include <log.h>
|
||||
#include <tool.h>
|
||||
|
||||
typedef struct {
|
||||
double sec;
|
||||
long count;
|
||||
struct timeval start;
|
||||
struct timeval stop;
|
||||
} cpt;
|
||||
|
||||
#define t_init(x) {x.sec = 0; x.count = 0;}
|
||||
#define t_start(x) {gettimeofday(&(x.start), NULL);}
|
||||
#define t_stop(x) {gettimeofday(&(x.stop), NULL); x.sec += (double)(x.stop.tv_sec) - (double)(x.start.tv_sec) + ((double)(x.stop.tv_usec) - (double)(x.start.tv_usec)) / 1000000; x.count++;}
|
||||
|
||||
int main (int argc, char ** argv)
|
||||
{
|
||||
LOGT_Channel * My_Channel;
|
||||
char Line [1000], * Event_Data;
|
||||
FILE * fid;
|
||||
unsigned int Nb_Send, Line_Number, i;
|
||||
cpt Compteur;
|
||||
|
||||
if (argc != 2)
|
||||
{
|
||||
fprintf (stderr, "Usage : %s <event_list>\n", argv [0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Ouverture du fichier de test */
|
||||
|
||||
fid = fopen (argv [1], "r");
|
||||
if (!fid)
|
||||
{
|
||||
fprintf (stderr, "Unable to open file \"%s\" for reading\n", argv [1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Ouverture de la librairie */
|
||||
|
||||
if (LOG_Library_Open (0, NULL, LOGD_OPEN | LOGD_DEBUG_ALL) != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "\n=> Impossible d'ouvrir la librairie LIBLOG\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Ouverture d'un channel */
|
||||
|
||||
if (LOG_Channel_Open (&My_Channel, 0, 1, "IPR_CAVpopulate2.pc", "IPR_CAV") != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "\n=> Impossible d'ouvrir un channel\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Ajout des tables de routage utilisateur */
|
||||
|
||||
if (TL_Channel_RTab_Add (My_Channel, "UTILS:ROOTING:ROOTING_TABLE") != TLS_OK)
|
||||
{
|
||||
fprintf (stderr, "\n=> Impossible d'ajouter les tables de routage au channel\n");
|
||||
LOG_Channel_Close (My_Channel);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Ajout des triggers */
|
||||
|
||||
if (TL_Channel_Trigger_Add (My_Channel, "UTILS:ROOTING:TRIGGER") != TLS_OK)
|
||||
{
|
||||
fprintf (stderr, "\n=> Impossible d'ajouter les triggers au channel\n");
|
||||
LOG_Channel_Close (My_Channel);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Initialisation du compteur */
|
||||
|
||||
t_init (Compteur);
|
||||
|
||||
/* Envoi des événements paramétrés dans le fichier */
|
||||
|
||||
Line_Number = 1;
|
||||
|
||||
while (!feof (fid) && fgets (Line, 1000, fid))
|
||||
{
|
||||
/* Récupération des informations dans la ligne du fichier */
|
||||
|
||||
Event_Data = strchr (Line, '#');
|
||||
|
||||
if (Event_Data == NULL)
|
||||
{
|
||||
fprintf (stderr, "Warning ligne n°%d : format incorrect (caractère '#' manquant)\n", Line_Number);
|
||||
}
|
||||
else
|
||||
{
|
||||
*Event_Data = (char)0;
|
||||
|
||||
Nb_Send = atoi (Line);
|
||||
|
||||
if (Nb_Send <= 0)
|
||||
{
|
||||
fprintf (stderr, "Warning ligne n°%d : valeur (%d) incorrecte avant le caracatère '#'\n", Line_Number, Nb_Send);
|
||||
Nb_Send = 1;
|
||||
}
|
||||
|
||||
Event_Data++;
|
||||
|
||||
for (i = 0; i < Nb_Send; i++)
|
||||
{
|
||||
t_start (Compteur);
|
||||
|
||||
/* Envoi de l'événement proprement dit */
|
||||
|
||||
if (LOG_Event_External_Send (My_Channel, argv [1], Event_Data) == LOGD_RC_WARNING)
|
||||
fprintf (stderr, "Warning ligne n°%d : code retour WARNING sur envoi de l'événement\n", Line_Number);
|
||||
|
||||
t_stop (Compteur);
|
||||
}
|
||||
}
|
||||
|
||||
Line_Number++;
|
||||
}
|
||||
|
||||
fclose (fid);
|
||||
|
||||
/* Affichage du résultat du benchmark */
|
||||
|
||||
fprintf (stdout, "%ld événements envoyés en %.2f sec (%.2f évt/sec)\n", Compteur.count, Compteur.sec, Compteur.count / Compteur.sec);
|
||||
|
||||
/* Fermeture du channel */
|
||||
|
||||
if (LOG_Channel_Close (My_Channel) != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "\n=> Impossible de fermer le channel\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Fermeture de la librairie */
|
||||
|
||||
if (LOG_Library_Close (LOGD_CLOSE) != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "\n=> Impossible de fermer la librairie LIBLOG\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
187
util/logresolve.c
Normal file
187
util/logresolve.c
Normal file
@ -0,0 +1,187 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#include <stdarg.h>
|
||||
#include <ver.h>
|
||||
#define ND_MODE 1
|
||||
#include <node.h>
|
||||
#define LOG_MODE 1
|
||||
#include <log.h>
|
||||
|
||||
VER_INFO_EXPORT (logresolve, "$Revision: 1.1 $", "$Name: $", __FILE__, "$Author: smas $")
|
||||
|
||||
typedef struct {
|
||||
double sec;
|
||||
struct timeval start;
|
||||
struct timeval stop;
|
||||
} cpt;
|
||||
|
||||
#define t_start(x){gettimeofday (&(x.start), NULL);}
|
||||
#define t_stop(x){gettimeofday (&(x.stop), NULL); x.sec = (double)(x.stop.tv_sec) - (double)(x.start.tv_sec) + \
|
||||
((double)(x.stop.tv_usec) - (double)(x.start.tv_usec)) / 1000000;}
|
||||
cpt t_exec;
|
||||
|
||||
char * Get_Rooting (LOGT_Rooting);
|
||||
char * Get_RC (LOGT_RC);
|
||||
|
||||
#define USAGE "Usage : %s [ --help | --version [-v] | --event <event name> ]\n"
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
LOGT_Info * Info;
|
||||
char * Event;
|
||||
int i;
|
||||
|
||||
if (argc >= 2)
|
||||
{
|
||||
if (!strcmp (argv [1], "--help"))
|
||||
{
|
||||
fprintf (stderr, USAGE, argv [0]);
|
||||
return 1;
|
||||
}
|
||||
else if (!strcmp (argv [1], "--version"))
|
||||
{
|
||||
if (argc >= 3 && !strcmp (argv [2], "-v"))
|
||||
return VER_Object_Print (stdout, VERD_VERBOSE);
|
||||
else
|
||||
return VER_Object_Print (stdout, VERD_MINIMAL);
|
||||
}
|
||||
else if (!strcmp (argv [1], "--event"))
|
||||
{
|
||||
if (argc != 3)
|
||||
{
|
||||
fprintf (stderr, USAGE, argv [0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Event = argv [2];
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (stderr, USAGE, argv [0]);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (stderr, USAGE, argv [0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Récupération des informations sur un événement */
|
||||
|
||||
Info = (LOGT_Info *) malloc (sizeof (LOGT_Info));
|
||||
|
||||
if (LOG_Library_Open (0, NULL, LOGD_OPEN | LOGD_DEBUG_ALL) != LOGS_OK)
|
||||
{
|
||||
fprintf (stderr, "=> Ouverture de la librairie LIBLOG impossible\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
t_start (t_exec);
|
||||
|
||||
if (LOG_Event_Info_Get (NULL, &Info, Event) != LOGS_OK)
|
||||
{
|
||||
t_stop (t_exec);
|
||||
fprintf (stderr, "=> Impossible de résoudre l'événement \"%s\"\n", Event);
|
||||
}
|
||||
else
|
||||
{
|
||||
NDT_Node * Node;
|
||||
|
||||
t_stop (t_exec);
|
||||
fprintf (stdout, "\nEvénement \"%s\" résolu en %.4f sec :\n", Event, t_exec.sec);
|
||||
fprintf (stdout, "\t- Type : %s (Id=%d)\n", Info->Event_Name, Info->Event_Type);
|
||||
fprintf (stdout, "\t- Routage : %s\n", Get_Rooting (Info->Rooting));
|
||||
fprintf (stdout, "\t- Gravité : %c\n", (char)Info->Gravite);
|
||||
fprintf (stdout, "\t- Code retour : %s\n", Get_RC (Info->RC));
|
||||
fprintf (stdout, "\t- Format :");
|
||||
if (Info->Data_List)
|
||||
{
|
||||
ND_Node_First_Get (Info->Data_List, &Node);
|
||||
i = 0;
|
||||
while (Node)
|
||||
{
|
||||
if (i > 0) fprintf (stdout, ",");
|
||||
fprintf (stdout, " %s", (char *)(Node->Value));
|
||||
ND_Node_Next_Get (Node, &Node);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
fprintf (stdout, "\n\n");
|
||||
}
|
||||
|
||||
LOG_Library_Close (LOGD_CLOSE);
|
||||
|
||||
free (Info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char * Get_Rooting (LOGT_Rooting Rooting)
|
||||
{
|
||||
static char lib [20];
|
||||
|
||||
switch ((int)Rooting)
|
||||
{
|
||||
case LOGD_ROOTING_NULL:
|
||||
strcpy (lib, "NULL");
|
||||
break;
|
||||
case LOGD_ROOTING_STDERR:
|
||||
strcpy (lib, "STDERR");
|
||||
break;
|
||||
case LOGD_ROOTING_DATABASE:
|
||||
strcpy (lib, "BASE");
|
||||
break;
|
||||
case LOGD_ROOTING_DEFAULT:
|
||||
strcpy (lib, "DEFAULT");
|
||||
break;
|
||||
case LOGD_ROOTING_PREVIOUS:
|
||||
strcpy (lib, "PREVIOUS");
|
||||
break;
|
||||
default:
|
||||
strcpy (lib, "unknown");
|
||||
break;
|
||||
}
|
||||
|
||||
return lib;
|
||||
}
|
||||
|
||||
char * Get_RC (LOGT_RC RC)
|
||||
{
|
||||
static char lib [20];
|
||||
|
||||
switch ((int)RC)
|
||||
{
|
||||
case LOGD_RC_OK:
|
||||
strcpy (lib, "OK");
|
||||
break;
|
||||
case LOGD_RC_ANOERR:
|
||||
strcpy (lib, "ANOERR");
|
||||
break;
|
||||
case LOGD_RC_REJDON:
|
||||
strcpy (lib, "REJDON");
|
||||
break;
|
||||
case LOGD_RC_REJENR:
|
||||
strcpy (lib, "REJENR");
|
||||
break;
|
||||
case LOGD_RC_WARNING:
|
||||
strcpy (lib, "WARNING");
|
||||
break;
|
||||
case LOGD_RC_RECYCLE:
|
||||
strcpy (lib, "RECYCLE");
|
||||
break;
|
||||
case LOGD_RC_EXIT:
|
||||
strcpy (lib, "EXIT");
|
||||
break;
|
||||
case LOGD_RC_ABEND:
|
||||
strcpy (lib, "ABEND");
|
||||
break;
|
||||
default:
|
||||
strcpy (lib, "unknown");
|
||||
break;
|
||||
}
|
||||
|
||||
return lib;
|
||||
}
|
1246
util/logsupervisor.c
Normal file
1246
util/logsupervisor.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user