Le port d'état est l'interface externe pour surveiller et contrôler le gatekeeper. Via cette interface, le gatekeeper enverra des messages à propos des appels en cours de tous les clients connectés et recevra des commandes.
Les messages envoyés par le gatekeeper au port d'état sont regroupés en trois niveaux de trace de sortie:
Notifications de rechargement et réponses directes aux commandes saisies.
Notifications de rechargement, réponses directes aux commandes saisies, CDRs et Requêtes de Routage.
Trace tout (notification des rechargement, réponses directes aux commandes saisies, CDRs, Requêtes de Routage, RAS, ...). Il s'agit du niveau de trace par défaut.
L'interface est un simple port TCP (par défaut: 7000), vous pouvez vous connecter avec telnet ou un autre client. Une exemple d'autre client est l'IHM Java, connue sous le nom de GnuGk ACD.
Ce que vous faîtes avec les pouvoirs de l'Interface d'Etat dépend de vous, mais voici quelques idées:
Voir GkGUI.
Voir GnuGk ACD.
Analyser les messages CDR et les transmettre à l'application de facturation.
Si vous ne voulez pas publier le code source de ces fonctions supplémentaires, publiez juste le noyau de la fonction et interfacez vous avec au travers de l'interface d'état et conservez les parties externes privées.
Supposons que vous êtes juste intéressés par les CDRs (enregistrement des détails des appels) et vous voulez les traiter en lot à intervalles réguliers.
Voici un script Perl simple (gnugk_cdr.pl
) qui lance le gatekeeper et un client
très simple pour l'Interface d'Etat et écrit juste les CDRs dans un fichier
de log. Vous aurez besoin de le modifier un peu pour qu'il corresponde à vos
besoins.
#!/usr/bin/perl # sample program that demonstrates how to write the CDRs to a log file use strict; use IO::Socket; use IO::Handle; my $logfile = "/home/jan/cdr.log"; # CHANGE THIS my $gk_host = "localhost"; my $gk_port = 7000; my $gk_pid; if ($gk_pid = fork()) { # parent will listen to gatekeeper status sleep(1); # wait for gk to start my $sock = IO::Socket::INET->new(PeerAddr => $gk_host, PeerPort => $gk_port, Proto => 'tcp'); if (!defined $sock) { die "Can't connect to gatekeeper at $gk_host:$gk_port"; } $SIG{HUP} = sub { kill 1, $gk_pid; }; # pass HUP to gatekeeper $SIG{INT} = sub { close (CDRFILE); kill 2, $gk_pid; }; # close file when terminated open (CDRFILE, ">>$logfile"); CDRFILE->autoflush(1); # don't buffer output while (!$sock->eof()) { my $msg = $sock->getline(); $msg = (split(/;/, $msg))[0]; # remove junk at end of line my $msgtype = (split(/\|/, $msg))[0]; if ($msgtype eq "CDR") { print CDRFILE "$msg\n"; } } close (CDRFILE); } else { # child starts gatekeeper exec("gnugk"); }
Rappelez-vous qu'il ne s'agit que d'un exemple pour montrer l'utilisation du port d'état. Vous pouvez utiliser le module FileAcct pour tracer les CDRs dans un système de production.
Il y a plusieurs Interfaces Home Machine (IHM - GUI) pour le gatekeeper.
Développé par Jan Willamowius. Vous pouvez surveiller les enregistrements et les appels qui passent par le gatekeeper. Un clic droit sur un bouton vous donne un menu déroulant pour ce terminal.
Cette IHM fonctionne avec Java 1.0 présent dans la plupart des navigateurs web. Pour des raisons de sécurité l'IHM doit fonctionner comme une application autonome ou être mise à disposition par un serveur web sur le même numéro IP que le gatekeeper (vous ne pouvez pas le lancer en tant qu'applet depuis un fichier local).
Le programme est disponible à GnuGk Java GUI
Un nouveau programme Java autonome développé par Citron Network Inc. Il nécessite Java 1.4. Les nouvelles fonctions comprennent:
Le GkGUI est distribué sous GNU General Public License, disponible à GnuGk Development
Cette section liste toutes les commandes que vous pouvez émettre sur le port d'état (manuellement ou avec une application externe). Les commandes ne tiennent pas compte de la casse (majuscules / minuscules). Mais certains paramètres peuvent en tenir compte.
La commande help
ou h
affichera la liste de toutes les commandes disponibles.
Reload
Recharge la configuration.
Version
, v
Afficher la version et des informations sur l'OS du gatekeeper.
Statistics
, s
Affiche des informations statistiques du gatekeeper.
Statistics
-- Endpoint Statistics --
Total Endpoints: 21 Terminals: 17 Gateways: 4 NATed: 2
Cached Endpoints: 1 Terminals: 1 Gateways: 0
-- Call Statistics --
Current Calls: 1 Active: 1 From Neighbor: 0 From Parent: 0
Total Calls: 1539 Successful: 1076 From Neighbor: 60 From Parent: 5
Startup: Fri, 21 Jun 2002 10:50:22 +0800 Running: 11 days 04:22:59
;
PrintAllRegistrations
, r
, ?
Affiche tous les terminaux enregistrés.
AllRegistrations
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
...
Number of Endpoints: n
;
AllRegistrations
RCF|10.1.1.10:1720|800:dialedDigits=Wei:h323_ID|terminal|1289_endp
RCF|10.0.1.43:1720|613:dialedDigits=Jacky Tsai:h323_ID|terminal|1328_endp
RCF|10.0.1.55:1720|705:dialedDigits=Sherry Liu:h323_ID|terminal|1333_endp
Number of Endpoints: 3
;
PrintAllRegistrationsVerbose
, rv
, ??
Affiche des détails sur tous les terminaux enregistrés.
AllRegistrations
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
Registration_Time C(Active_Call/Connected_Call/Total_Call) <r>
[Prefixes: ##] (gateway only)
...
Number of Endpoints: n
;
AllRegistrations
RCF|10.0.1.8:1720|Accel-GW2:h323_ID|gateway|1322_endp
Wed, 26 Jun 2002 16:40:03 +0800 C(1/5/33) <1>
Prefixes: 09,002
RCF|10.1.1.10:1720|800:dialedDigits=Wei:h323_ID|terminal|1289_endp
Wed, 26 Jun 2002 16:40:55 +0800 C(0/32/39) <1>
RCF|10.0.1.66:1720|716:dialedDigits=Vicky:h323_ID|terminal|1425_endp
Wed, 26 Jun 2002 16:40:58 +0800 C(1/47/53) <1>
Number of Endpoints: 2
;
PrintCurrentCalls
, c
, !
Affiche tous les appels en cours en utilisant la même syntaxe ACF que lors de l'établissement de l'appel.
CurrentCalls
Call No. # | CallID | Call_Duration | Left_Time
Dialed_Number
ACF|Caller_IP:Port|Caller_EPID|CRV|DestinationInfo|SrcInfo|IsAnswered;
ACF|Callee_IP:Port|Callee_EPID|CRV|DestinationInfo|SrcInfo|IsAnswered;
...
Number of Calls: Current_Call Active: Active_Call From Neighbor: Call_From_Neighbor \
From Parent: Call_From_Parent
;
CurrentCalls
Call No. 29 | CallID bd c6 17 ff aa ea 18 10 85 95 44 45 53 54 77 77 | 109 | 491
Dial 0953378875:dialedDigits
ACF|10.0.1.49:1720|4048_CGK1|25263|frank:h323_ID|gunter:h323_ID|false;
ACF|10.1.1.1:1720|4037_CGK1|25263|gunter:h323_ID|frank:h323_ID|true;
Call No. 30 | CallID 70 0e dd c0 9a cf 11 5e 00 01 00 05 5d f9 28 4d | 37 | 563
Dial 0938736860:dialedDigits
ACF|10.0.1.48:1032|4041_CGK1|11896|sue:h323_ID|peter:h323_ID|false;
ACF|10.1.1.1:1720|4037_CGK1|11896|peter:h323_ID|sue:h323_ID|true;
Number of Calls: 2 Active: 2 From Neighbor: 0 From Parent: 0
;
PrintCurrentCallsVerbose
, cv
, !!
Affiche des détails sur tous les appels en cours.
CurrentCalls
Call No. # | CallID | Call_Duration | Left_Time
Dialed_Number
ACF|Caller_IP:Port|Caller_EPID|CRV|DestinationInfo|SrcInfo|IsAnswered;
ACF|Callee_IP:Port|Callee_EPID|CRV|DestinationInfo|SrcInfo|IsAnswered;
# Caller_Aliases|Callee_Aliases|Bandwidth|Connected_Time <r>
...
Number of Calls: Current_Call Active: Active_Call From NB: Call_From_Neighbor
;
CurrentCalls
Call No. 48 | CallID 7d 5a f1 0a ad ea 18 10 89 16 00 50 fc 3f 0c f5 | 30 | 570
Dial 0225067272:dialedDigits
ACF|10.0.1.200:1720|1448_endp|19618|frank:h323_ID|gunter:h323_ID|false;
ACF|10.0.1.7:1720|1325_endp|19618|gunter:h323_ID|frank:h323_ID|true;
# Sherry:h323_ID|Accel-GW1:h323_ID|200000|Wed, 26 Jun 2002 17:29:55 +0800 <2>
Number of Calls: 1 Active: 1 From NB: 0
;
Find
, f
Trouve un terminal enregistré par un alias ou un préfixe.
Find Alias
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
;
f 800
RCF|10.1.1.10:1720|800:dialedDigits=Wei:h323_ID|terminal|1289_endp
;
f 801
SoftPBX: alias 801 not found!
FindVerbose
, fv
Trouve des détails d'un terminal enregistré par un alias ou un préfixe.
FindVerbose Alias
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
Registration_Time C(Active_Call/Connected_Call/Total_Call) <r>
[Prefixes: ##] (gateway only)
;
fv 02
RCF|10.0.1.100:1720|TFN:h323_ID|gateway|4037_CGK1
Wed, 26 Jun 2002 17:47:29 +0800 C(0/84/120) <1>
Prefixes: 02,09
;
UnregisterIP
Force l'annulation de l'enregistrement d'un terminal en fonction de son IP et appelle le port de signalisation.
UnregisterIP IP[:Port]
UnregisterIP 10.0.1.31:1720
URQ|10.0.1.31:1032|1326_endp|maintenance;
SoftPBX: Endpoint 10.0.1.31:1720 unregistered!
UnregisterAlias
Force l'annulation de l'enregistrement d'un terminal en fonction d'un de ses alias.
UnregisterAlias Alias
UnregisterAlias 601
URQ|10.0.1.31:1032|1326_endp|maintenance;
SoftPBX: Endpoint 601 unregistered!
UnregisterAllEndpoints
Force l'annulation de l'enregistrement de tous les terminaux enregistrés.
UnregisterAllEndpoints
URQ|10.0.1.7:1024|1325_endp|maintenance;
URQ|10.0.1.8:1024|1322_endp|maintenance;
URQ|10.0.1.32:1032|1324_endp|maintenance;
URQ|10.0.1.36:1032|1323_endp|maintenance;
URQ|10.0.1.42:1032|1318_endp|maintenance;
Done
;
DisconnectCall
Déconnecte un appel avec le numéro donné.
DisconnectCall Number
DisconnectCall 1533
DisconnectIP
Déconnecte tous les appels d'un terminal en fonction de son IP et appelle le port de signalisation.
DisconnectIP IP[:Port]
DisconnectIP 10.0.1.31:1720
DisconnectAlias
Déconnecte tous les appels d'un terminal en fonction d'un de ses alias.
DisconnectAlias Alias
DisconnectAlias 601
ClearCalls
Déconnecte tous les appels sur le gatekeeper.
GK
Affiche les informations sur le gatekeeper parent.
Trace
Règle le niveau de trace de sortie de l'interface d'état. Il contrôle quels messages sont envoyés à ce client:
trace 0
ou trace min
Seulement les réponses directes aux commandes et les notifications de rechargement
trace 1
CDRs, réponses directes aux commandes et notifications de rechargement.
trace 2
ou trace max
Affiche tout (RAS, CDRs, réponses directes aux commandes, notifications de rechargement, etc).
Debug
Utilisé uniquement à de buts de debug. Options:
trc [+|-|n]
Affiche/modifie le niveau de trace.
cfg SEC PAR
Lit et imprime un paramètre de configuration dans une section.
set SEC PAR VAL
Ecrit une valeur de paramètre de configuration dans une section.
remove SEC PAR
Supprime une valeur de paramètre de configuration dans une section.
remove SEC
Supprime une section.
printrm VERBOSE
Imprime tous les enregistrements de terminaux supprimès.
debug trc 3
debug set RoutedMode H245Routed 1
Who
Affiche toutes les personnes sur le port d'ètat.
RouteReject
Termine cette appel sur une file virtuelle. Cette commande est utilisée comme réponse à un événement RouteRequest (voir ci-dessous).
RouteReject CallingEndpointID CallRef
RouteReject endp_4711 1234
RouteToAlias
, rta
Route cet appel sur une file virtuel vers un alias donné. Cette commande est utilisée en réponse à un événement RouteRequest (voir ci-dessous).
RouteToAlias Alias CallingEndpointID CallRef
RouteToAlias Suzi endp_4711 1234
RouteToGateway
, rtg
Route cet appel sur une file virtuelle vers l'alias donné et positionne le destinationSignallAddress. Cette commande est utilisée en réponse à un événement RouteRequest (voir ci-dessous). Vous pouvez utiliser cette commande pour router des appels vers des passerelles hors de la zone ou des MCUs non enregistrés auprès du gatekeeper. Assurez-vous que la politique 'vqueue' et 'explicit' est en cours pour ces appels.
RouteToGateway Alias IP:Port CallingEndpointID CallRef
RouteToGateway Suzi 192.168.0.50 endp_4711 1234
Exit
, q
Quitte le port d'ètat.
TransferCall
Transfère un appel étable d'un alias A vers un alias B. Quand l'alias A parlait avec l'alias X, alors l'alias A parle avec l'alias B après le TransferCall.
Actuellement, ceci ne fonctionne qu'avec les terminaux qui supportent correctement les messages du mécanisme Q.931 (il ne fonctionne donc pas avec Netmeeting).
TransferCall Source-Alias New-Destination-Alias
TransferCall Frank Peter
Cette section décrit la sortie des messages sur l'interface d'état.
GCF|IP|Aliases|Endpoint_Type;
Le gatekeeper reçoit un GatekeeperRequest (GRQ) et répond avec un GatekeeperConfirm (GCF).
GRJ|IP|Aliases|Endpoint_Type|RejectReason;
Le gatekeeper reçoit un GatekeeperRequest (GRQ) et répond avec un GatekeeperReject (GRJ).
RCF|IP:Port|Aliases|Endpoint_Type|EndpointID;
Le gatekeeper reçoit un RegistrationRequest (RRQ) et répond avec un RegistrationConfirm (RCF).
RRJ|IP|Aliases|Endpoint_Type|RejectReason;
Le gatekeeper reçoit un RegistrationRequest (RRQ) et répond avec un RegistrationReject (RRJ).
ACF|Caller_IP:Port|Caller_EndpointID|CRV|DestinationInfo|SrcInfo|IsAnswered[|CallID];
Le gatekeeper reçoit un AdmissionRequest (ARQ) et répond avec un AdmissionConfirm (ACF). Le CallID est envoyé seulement quand SignalCallId=1.
ARJ|Caller_IP:Port|DestinationInfo|SrcInfo|IsAnswered|RejectReason[|CallID];
Le gatekeeper reçoit un AdmissionRequest (ARQ) et répond avec un AdmissionReject (ARJ). Le CallID est envoyé seulement quand SignalCallId=1.
DCF|IP|EndpointID|CRV|DisengageReason[|CallID];
Le gatekeeper reçoit un DisengageRequest (DRQ) et répond avec un DisengageConfirm (DCF). Le CallID est envoyé seulement quand SignalCallId=1.
DRJ|IP|EndpointID|CRV|RejectReason[|CallID];
Le gatekeeper reçoit un DisengageRequest (DRQ) et répond avec un DisengageReject (DRJ). Le CallID est envoyé seulement quand SignalCallId=1.
LCF|IP|EndpointID|DestinationInfo|SrcInfo;
Le gatekeeper reçoit un LocationRequest (LRQ) et répond avec un LocationConfirm (LCF).
LRJ|IP|DestinationInfo|SrcInfo|RejectReason;
Le gatekeeper reçoit un LocationRequest (LRQ) et répond avec un LocationReject (LRJ).
BCF|IP|EndpointID|Bandwidth;
Le gatekeeper reçoit un BandwidthRequest (BRQ) et répond avec un BandwidthConfirm (BCF).
BRJ|IP|EndpointID|Bandwidth|RejectReason;
Le gatekeeper reçoit un BandwidthRequest (BRQ) et répond avec un BandwidthReject (BRJ).
UCF|IP|EndpointID;
Le gatekeeper reçoit un UnregistrationRequest (URQ) et répond avec un UnregistrationConfirm (UCF).
URJ|IP|EndpointID|RejectReason;
Le gatekeeper reçoit un UnregistrationRequest (URQ) et répond avec un UnregistrationReject (URJ).
IRQ|IP:Port|EndpointID;
Le gatekeeper envoie un InfoRequest (IRQ) à un terminal pour lui demander si il est toujours en vie. Le terminal doit répondre avec un InfoRequestResponse (IRR) immédiatement.
URQ|IP:Port|EndpointID|Reason;
Le gatekeeper envoie un UnregistrationRequest (URQ) à un terminal pour annuler son enregistrement. Le terminal doit répondre avec un UnregistrationConfirm (UCF).
CDR|CallNo|CallId|Duration|Starttime|Endtime|CallerIP|CallerEndId|
\CalledIP|CalledEndId|DestinationInfo|SrcInfo|GatekeeperID;
Après un appel déconnecté, l'enregistrement du détail de l'appel est affiché (sur une ligne).
RouteRequest|CallerIP:Port|CallerEndpointId|CallRef|VirtualQueue|CallerAlias[|CallID];
Demande à une application externe de router un appel arrivant sur une file virtuelle. Ceci peut être fait avec une commande RouteToAlias ou RouteReject. Le CallID est envoyé seulement quand SignalCallId=1.