////////////////////////////////////////////////////////////////// // // GkStatus.h thread listening for connections to receive // status updates from the gatekeeper // // This work is published under the GNU Public License (GPL) // see file COPYING for details. // We also explicitely grant the right to link this code // with the OpenH323 library. // // History: // 990913 initial version (Jan Willamowius) // 991025 Added command thread (Ashley Unitt) // 030511 redesign based on new architecture (cwhuang) // ////////////////////////////////////////////////////////////////// #ifndef GKSTATUS_H #define GKSTATUS_H "@(#) $Id: GkStatus.h,v 1.22 2006/04/14 13:56:19 willamowius Exp $" #include #include "yasocket.h" #include "singleton.h" /** The idea of status interface output trace levels allows to select the kind of output received by a status interface client. Level 0 - no broadcast messages (except reload notifications and yell) Level 1 - only CDRs and Route Requests Level 2 - everything */ #define MIN_STATUS_TRACE_LEVEL 0 #define MAX_STATUS_TRACE_LEVEL 2 #define STATUS_TRACE_LEVEL_CDR 1 #define STATUS_TRACE_LEVEL_RAS 2 #define STATUS_TRACE_LEVEL_ROUTEREQ 1 class TelnetSocket; class StatusClient; /** Singleton class that listens for the status interface connections and maintains a list of connected status interface clients. */ class GkStatus : public Singleton, public SocketsReader { public: GkStatus(); /** Authenticate new telnet connection. Ask for username/password if required. If the authentication is successful, the client is added to the list of active clients. If it fails, client instance is deleted. */ void AuthenticateClient( /// new status interface client to be authenticated StatusClient* newClient ); /** Broadcast the message to all active client connected to the status interface. The message is sent to each client only if client trace level is greater or equal to the trace level of the message. */ void SignalStatus( /// message string to be broadcasted const PString& msg, /// trace level at which the message should be broadcasted /// if the current output trace level is less than this value, /// the client will not receive this message int level = MIN_STATUS_TRACE_LEVEL ); /** Disconnect the specified status interface client. @return true if the status interface client with the given session ID has been found and disconnected. */ bool DisconnectSession( /// session ID (instance number) for the status client to be disconnected int instanceNo, /// status interface client that requested disconnect StatusClient* requestingClient ); /** Print a list of all connected status interface users to the requesting client. */ void ShowUsers( /// client that requested the list of all active clients StatusClient* requestingClient ) const; /** Print help (list of status interface commands) to the requesting client. */ void PrintHelp( /// client that requested the help message StatusClient* requestingClient ) const; enum StatusInterfaceCommands { e_PrintAllRegistrations, e_PrintAllRegistrationsVerbose,/// extra line per reg starting with '#'. yeah #. e_PrintAllCached, e_PrintCurrentCalls, e_PrintCurrentCallsVerbose, /// extra line per call starting with '#'. yeah #. e_Find, /// find an endpoint e_FindVerbose, e_DisconnectIp, /// disconnect a call by endpoint IP number e_DisconnectAlias, /// disconnect a call by endpoint alias e_DisconnectCall, /// disconnect a call by call number e_DisconnectEndpoint, /// disconnect a call by endpoint ID e_DisconnectSession, /// disconnect a user from status port e_ClearCalls, /// disconnect all calls e_UnregisterAllEndpoints, /// force unregisterung of all andpoints e_UnregisterIp, /// force unregisterung of one andpoint by IP number e_UnregisterAlias, /// force unregisterung of one andpoint by alias e_TransferCall, /// transfer call from one endpoint to another e_MakeCall, /// establish a new call from endpoint A to endpoint B e_Yell, /// write a message to all status clients e_Who, /// list who is logged on at a status port e_GK, /// show my parent gatekeeper e_Help, /// List all commands e_Version, /// GkStatus Protocol Info e_Debug, /// Debugging commands e_Statistics, /// Show Statistics e_Exit, /// Close Connection e_Reload, /// Reload Config File e_Shutdown, /// Shutdown the program e_RouteToAlias, /// Route a call upon ARQ to a specified alias eg. a free CTI agent e_RouteToGateway, /// Route a call upon ARQ to a specified alias + destinationCallSignalAddr e_RouteReject, /// Reject to Route a call upon ARQ (send ARJ) e_Trace, /// change trace level for status interface output #if PTRACING e_RotateLog, /// Force log file rotation e_SetLogFilename, /// Change log file location #endif e_numCommands /// Number of different strings }; /** Parse the text message into the status interface command. @return The command code (see #StatusInterfaceCommands enum#) and 'args' filled with command tokens or -1 if no corresponding command has been found. */ int ParseCommand( /// message to be parsed const PString& msg, /// message split into tokens upon successful return PStringArray& args ); private: // override from class RegularJob virtual void OnStart(); // override from class SocketsReader virtual void ReadSocket(IPSocket *); virtual void CleanUp(); /// map for fast (and easy) 'parsing' the commands from the user std::map m_commands; }; /** Listen for incoming connections to the status interface port and create StatusClients for each new connection. */ class StatusListener : public TCPListenSocket { #ifndef LARGE_FDSET PCLASSINFO ( StatusListener, TCPListenSocket ) #endif public: /// create the new listener socket StatusListener( /// address the socket is to be bound to const Address& addr, /// port number the socket is to be bound to WORD port ); /** Create a new StatusClient socket that will be used to accept a next incoming connection. Override from class TCPListenSocket. */ virtual ServerSocket *CreateAcceptor() const; }; #endif // GKSTATUS_H