#include #include #include #include #include "DumpAllHandler.h" #include "cdevGenericServerTags.h" FifoQueue results [MAX_SERVERS]; int completionCodes[MAX_SERVERS]; static char * NameServerDefinitionString = "service rns { tags {PV} }\n\ class RNS { messages { query rns; get rns; monitorOn rns; monitorOff rns; } }\n\ RNS :\nNameServer\n;\n"; cdevReactor DumpAllReactor; void ReportStandard ( char * Domain, char * Name, char * Server, int Port, int index ); void ReportBrief ( int index ); void ReportServerBrief ( cdevData & data ); void ReportClientBrief ( cdevData & data ); void ReportComplete ( int index ); void ReportServerComplete ( cdevData & data ); void ReportClientComplete ( cdevData & data ); void *getItem ( cdevData & data, char * tag, unsigned defaultItem); void *getItem ( cdevData & data, char * tag, float defaultItem); void *findItem ( cdevData & data, char * tag, cdevDataTypes type, size_t maxItems, void *defaultItem); int main (int argc, char ** argv) { char * cdevNameServer = getenv("CDEV_NAME_SERVER"); cdevGenericServerTagDef tags; typedef enum { STANDARD=0, BRIEF=1, COMPLETE=2, SIMPLE=4, BOGUS=8} ReportType; ReportType reportType = STANDARD; if(cdevNameServer==NULL) { fprintf(stdout, "-----------------------------------------------------------------------\n"); fprintf(stdout, "ERROR : CDEV_NAME_SERVER is not defined in the local environment.\n"); fprintf(stdout, " Set the CDEV_NAME_SERVER variable to indicate the host where \n"); fprintf(stdout, " the name server is running prior to executing this application.\n"); fprintf(stdout, "-----------------------------------------------------------------------\n"); fflush(stdout); exit(1); } for(int x=1; xsend(in, data)!=CDEV_SUCCESS) { cdevSystem::defaultSystem().reportError(CDEV_SEVERITY_ERROR, "DumpServer", NULL, "Failed to communicate with Name Server"); return 0; } size_t cnt = 0, cnt1 = 0; char ** domainPtr = NULL; char ** serverPtr = NULL; char ** hostPtr = NULL; int * portPtr = NULL; int * status = NULL; if(data.getElems("domain", &cnt1)==CDEV_SUCCESS && cnt1>cnt) cnt = cnt1; if(data.getElems("name", &cnt1)==CDEV_SUCCESS && cnt1>cnt) cnt = cnt1; if(data.getElems("host", &cnt1)==CDEV_SUCCESS && cnt1>cnt) cnt = cnt1; if(data.getElems("port", &cnt1)==CDEV_SUCCESS && cnt1>cnt) cnt = cnt1; if(data.getElems("status", &cnt1)==CDEV_SUCCESS && cnt1>cnt) cnt = cnt1; if(cnt>0) { domainPtr = new char *[cnt]; serverPtr = new char *[cnt]; hostPtr = new char *[cnt]; portPtr = new int [cnt]; status = new int [cnt]; memset(domainPtr, 0, sizeof(char *)*cnt); memset(serverPtr, 0, sizeof(char *)*cnt); memset(hostPtr, 0, sizeof(char *)*cnt); memset(portPtr, 0, sizeof(int)*cnt); memset(status, 0, sizeof(int)*cnt); data.get("domain", domainPtr); data.get("name", serverPtr); data.get("host", hostPtr); data.get("port", portPtr); data.get("status", status); int i, retry=0; if(reportType==SIMPLE) { fprintf(stdout, "\n================================================================================\n"); fprintf(stdout, " THIS DATA OBTAINED FROM CDEV NAME SERVER AT : %s\n", cdevNameServer); fprintf(stdout, "================================================================================\n\n"); fprintf(stdout, "\n-------------------------------------------------------------------------------\n"); fprintf(stdout, " DOMAIN NAME HOST PORT \n"); fprintf(stdout, "--------------------------------------------------------------------------------\n"); fflush(stdout); for(i=0; igetTransIndex()==1) { if(ServerInfo!=NULL) delete ServerInfo; ServerInfo = temp; } else if(temp->getTransIndex()==2) { if(ClientInfo!=NULL) delete ClientInfo; ClientInfo = temp; } } char domain[255]; char name [255]; char server[255]; char startTimeStr[255]; int port = 0; float utilization = 0; time_t startTime = 0; int clientCnt = 0; if(ServerInfo) { cdevData * data = ServerInfo->getData(); if(data->get("domain", domain, 255)!=CDEV_SUCCESS) strcpy(domain, Domain); if(data->get("server", name, 255)!=CDEV_SUCCESS) strcpy(name, Name); if(data->get("host", server, 255)!=CDEV_SUCCESS) strcpy(server, Server); if(data->get("port", &port)!=CDEV_SUCCESS) port = Port; if(data->get("pctcpu", &utilization)!=CDEV_SUCCESS) utilization = 0; if(data->get("starttime", &startTime)!=CDEV_SUCCESS) startTime = time(NULL); } else { strcpy(domain, Domain); strcpy(name, Name); strcpy(server, Server); port = Port; utilization = 0; startTime = time(NULL); } sprintf(startTimeStr, "%s", startTime?ctime(&startTime):"UNKNOWN"); if(strchr(startTimeStr, '\n')!=NULL) *(strchr(startTimeStr, '\n'))=0; if(!headerDefined) { fprintf(stdout, "\n--------------------------------------------------------------------------------\n"); fprintf(stdout, " DOMAIN NAME HOST PORT CPU%% START\n"); fprintf(stdout, "--------------------------------------------------------------------------------\n"); fflush(stdout); headerDefined = 1; } fprintf(stdout, " %-17s%-17s%-17s% 5i %5.2f %s\n", domain, name, server, port, utilization*100.0, startTimeStr); fflush(stdout); if(ServerInfo) delete ServerInfo; if(ClientInfo) delete ClientInfo; } void ReportBrief ( int index ) { static int headerDefined = 0; cdevMessage *ServerInfo=NULL, *ClientInfo=NULL, * temp; while(completionCodes[index]==1 && (temp = (cdevMessage *)results[index].dequeue())!=NULL) { if(temp->getTransIndex()==1) { if(ServerInfo!=NULL) delete ServerInfo; ServerInfo = temp; } else if(temp->getTransIndex()==2) { if(ClientInfo!=NULL) delete ClientInfo; ClientInfo = temp; } } cdevData * data; if(ServerInfo && (data=ServerInfo->getData())!=NULL) { if(!headerDefined) { fprintf(stdout, "\n--------------------------------------------------------------------------------"); headerDefined = 1; } fprintf(stdout, "\n DOMAIN NAME HOST PORT CPU%% START\n"); fprintf(stdout, "--------------------------------------------------------------------------------\n"); fflush(stdout); ReportServerBrief(*data); delete ServerInfo; } else return; if(ClientInfo && (data=ClientInfo->getData())!=NULL) { ReportClientBrief(*data); delete ClientInfo; } } void ReportServerBrief ( cdevData & data ) { char *unknown = "UNKNOWN"; char *domain = (char *)findItem(data, "domain", CDEV_STRING, 1, unknown);; char *server = (char *)findItem(data, "server", CDEV_STRING, 1, unknown);; char *host = (char *)findItem(data, "host", CDEV_STRING, 1, unknown);; int port = *(unsigned *)getItem(data, "port", 0U); time_t starttime = *(unsigned *)getItem(data, "starttime", (unsigned)time(NULL)); float pctcpu = *(float *)getItem(data, "pctcpu", (float)0.0); char startTimeStr[255]; sprintf(startTimeStr, "%s", starttime?ctime(&starttime):"UNKNOWN"); if(strchr(startTimeStr, '\n')!=NULL) *(strchr(startTimeStr, '\n'))=0; fprintf(stdout, " %-17s%-17s%-17s% 5i %5.2f %s\n", domain, server, host, port, pctcpu*100.0, startTimeStr); fflush(stdout); return; } void ReportClientBrief ( cdevData & data ) { static char * ClientInfoTags[]= { "username", "group", "uid", "gid", "pid", "program", "commandline", "starttime", "connecttime", "host", "os", "osversion", "osrelease", "machine", "shell", "socket", "sendPktCnt", "recvPktCnt", "\0", }; size_t i, j; size_t nClients = 0; data.getElems(ClientInfoTags[0], &nClients); for(i=0; *ClientInfoTags[i]!=0; i++) { data.getElems(ClientInfoTags[i], &j); if(j!=nClients) { fprintf(stdout, "ERROR : Inconsistent data in ClientInfo Structure\n"); fflush(stdout); return; } } if(nClients==0) return; unsigned * connecttime = (unsigned *)findItem(data, "connecttime", CDEV_UINT32, nClients, NULL); char ** username = NULL; char * usernamePtr = NULL; char ** program = NULL; char * programPtr = NULL; char ** host = NULL; char * hostPtr = NULL; if(nClients>1) { username = (char **) findItem(data, "username", CDEV_STRING, nClients, NULL); program = (char **) findItem(data, "program", CDEV_STRING, nClients, NULL); host = (char **) findItem(data, "host", CDEV_STRING, nClients, NULL); } else { username = &(usernamePtr = (char *)findItem(data, "username", CDEV_STRING, nClients, NULL)); program = &(programPtr = (char *)findItem(data, "program", CDEV_STRING, nClients, NULL)); host = &(hostPtr = (char *)findItem(data, "host", CDEV_STRING, nClients, NULL)); } if(username==NULL || program==NULL || connecttime==NULL || host==NULL) { fprintf(stdout, "ERROR : Inconsistent data in ClientInfo Structure\n"); fflush(stdout); return; } for(i=0; igetTransIndex()==1) { if(ServerInfo!=NULL) delete ServerInfo; ServerInfo = temp; } else if(temp->getTransIndex()==2) { if(ClientInfo!=NULL) delete ClientInfo; ClientInfo = temp; } } cdevData * data; if(ServerInfo && (data=ServerInfo->getData())!=NULL) { ReportServerComplete(*data); delete ServerInfo; } else return; if(ClientInfo && (data=ClientInfo->getData())!=NULL) { ReportClientComplete(*data); delete ClientInfo; } } void ReportServerComplete ( cdevData & data ) { char *unknown = "UNKNOWN"; char *username = (char *)findItem(data, "username", CDEV_STRING, 1, unknown); char *group = (char *)findItem(data, "group", CDEV_STRING, 1, unknown);; unsigned pid = *(unsigned *)getItem(data, "pid", 0U); unsigned uid = *(unsigned *)getItem(data, "uid", 0U); unsigned gid = *(unsigned *)getItem(data, "gid", 0U); char *domain = (char *)findItem(data, "domain", CDEV_STRING, 1, unknown);; char *server = (char *)findItem(data, "server", CDEV_STRING, 1, unknown);; char *host = (char *)findItem(data, "host", CDEV_STRING, 1, unknown);; int port = *(unsigned *)getItem(data, "port", 0U); char *os = (char *)findItem(data, "os", CDEV_STRING, 1, unknown);; char *osrelease = (char *)findItem(data, "osrelease", CDEV_STRING, 1, unknown);; char *osversion = (char *)findItem(data, "osversion", CDEV_STRING, 1, unknown);; char *machine = (char *)findItem(data, "machine", CDEV_STRING, 1, unknown);; char *shell = (char *)findItem(data, "shell", CDEV_STRING, 1, unknown);; char *program = (char *)findItem(data, "program", CDEV_STRING, 1, unknown);; char *commandline = (char *)findItem(data, "commandline", CDEV_STRING, 1, unknown);; time_t starttime = *(unsigned *)getItem(data, "starttime", (unsigned)time(NULL)); float pctcpu = *(float *)getItem(data, "pctcpu", (float)0.0); unsigned datasize = *(unsigned *)getItem(data, "datasize", 0U); unsigned sendPktCnt = *(unsigned *)getItem(data, "sendPktCnt", 0U); unsigned recvPktCnt = *(unsigned *)getItem(data, "recvPktCnt", 0U); char startTimeStr[255]; char userStr[255]; char groupStr[255]; char osStr[255]; sprintf (startTimeStr, "%s", starttime?ctime(&starttime):"UNKNOWN"); if(strchr(startTimeStr, '\n')!=NULL) *(strchr(startTimeStr, '\n'))=0; sprintf (userStr, "%s (%i)", username, uid); sprintf (groupStr, "%s (%i)", group, gid); if(!strcmp(os, "UNKNOWN")) strcpy(osStr, os); else sprintf (osStr, "%s %s %s %s", os, machine, osrelease, osversion); fprintf(stdout, "-------------------------------------------------------------------------------\n"); fprintf(stdout, "DOMAIN : %-35s SERVER : %-35s\n", domain, server); fprintf(stdout, "HOST : %-35s PORT : %i\n", host, port); fprintf(stdout, "OWNER : %-35s GROUP : %-35s\n", userStr, groupStr); fprintf(stdout, "OS : %-35s START : %-35s\n", osStr, startTimeStr); fprintf(stdout, "SHELL : %-35s PROGRAM : %s (%i)\n", shell, program, pid); fprintf(stdout, "%% CPU : %-35.2f SIZE : %i\n", pctcpu*100.0, datasize); fprintf(stdout, "PKT SENT: %-35i PKT RECV: %-35i\n", sendPktCnt, recvPktCnt); fprintf(stdout, "COMMAND : %s\n", commandline); fflush(stdout); }; void ReportClientComplete ( cdevData & data ) { static char * ClientInfoTags[]= { "username", "group", "uid", "gid", "pid", "program", "commandline", "starttime", "connecttime", "host", "os", "osversion", "osrelease", "machine", "shell", "socket", "sendPktCnt", "recvPktCnt", "\0", }; size_t i, j; size_t nClients = 0; data.getElems(ClientInfoTags[0], &nClients); for(i=0; *ClientInfoTags[i]!=0; i++) { data.getElems(ClientInfoTags[i], &j); if(j!=nClients) { fprintf(stdout, "ERROR : Inconsistent data in ClientInfo Structure\n"); fflush(stdout); return; } } if(nClients==0) return; unsigned * uid = (unsigned *)findItem(data, "uid", CDEV_UINT32, nClients, NULL); unsigned * gid = (unsigned *)findItem(data, "gid", CDEV_UINT32, nClients, NULL); unsigned * pid = (unsigned *)findItem(data, "pid", CDEV_UINT32, nClients, NULL); unsigned * starttime = (unsigned *)findItem(data, "starttime", CDEV_UINT32, nClients, NULL); unsigned * connecttime = (unsigned *)findItem(data, "connecttime", CDEV_UINT32, nClients, NULL); unsigned * socket = (unsigned *)findItem(data, "socket", CDEV_UINT32, nClients, NULL); unsigned * sendPktCnt = (unsigned *)findItem(data, "sendPktCnt", CDEV_UINT32, nClients, NULL); unsigned * recvPktCnt = (unsigned *)findItem(data, "recvPktCnt", CDEV_UINT32, nClients, NULL); char ** username = NULL; char * usernamePtr = NULL; char ** group = NULL; char * groupPtr = NULL; char ** program = NULL; char * programPtr = NULL; char ** commandline = NULL; char * commandlinePtr = NULL; char ** host = NULL; char * hostPtr = NULL; char ** os = NULL; char * osPtr = NULL; char ** osversion = NULL; char * osversionPtr = NULL; char ** osrelease = NULL; char * osreleasePtr = NULL; char ** machine = NULL; char * machinePtr = NULL; char ** shell = NULL; char * shellPtr = NULL; if(nClients>1) { username = (char **) findItem(data, "username", CDEV_STRING, nClients, NULL); group = (char **) findItem(data, "group", CDEV_STRING, nClients, NULL); program = (char **) findItem(data, "program", CDEV_STRING, nClients, NULL); commandline = (char **) findItem(data, "commandline", CDEV_STRING, nClients, NULL); host = (char **) findItem(data, "host", CDEV_STRING, nClients, NULL); os = (char **) findItem(data, "os", CDEV_STRING, nClients, NULL); osversion = (char **) findItem(data, "osversion", CDEV_STRING, nClients, NULL); osrelease = (char **) findItem(data, "osrelease", CDEV_STRING, nClients, NULL); machine = (char **) findItem(data, "machine", CDEV_STRING, nClients, NULL); shell = (char **) findItem(data, "shell", CDEV_STRING, nClients, NULL); } else { username = &(usernamePtr = (char *)findItem(data, "username", CDEV_STRING, nClients, NULL)); group = &(groupPtr = (char *)findItem(data, "group", CDEV_STRING, nClients, NULL)); program = &(programPtr = (char *)findItem(data, "program", CDEV_STRING, nClients, NULL)); commandline = &(commandlinePtr = (char *)findItem(data, "commandline", CDEV_STRING, nClients, NULL)); host = &(hostPtr = (char *)findItem(data, "host", CDEV_STRING, nClients, NULL)); os = &(osPtr = (char *)findItem(data, "os", CDEV_STRING, nClients, NULL)); osversion = &(osversionPtr = (char *)findItem(data, "osversion", CDEV_STRING, nClients, NULL)); osrelease = &(osreleasePtr = (char *)findItem(data, "osrelease", CDEV_STRING, nClients, NULL)); machine = &(machinePtr = (char *)findItem(data, "machine", CDEV_STRING, nClients, NULL)); shell = &(shellPtr = (char *)findItem(data, "shell", CDEV_STRING, nClients, NULL)); } if(username==NULL || group==NULL || uid==NULL || gid==NULL || pid==NULL || program==NULL || commandline==NULL || starttime==NULL || connecttime==NULL || host==NULL || os==NULL || osversion==NULL || osrelease==NULL || machine==NULL || shell==NULL || socket==NULL || sendPktCnt==NULL || recvPktCnt==NULL) { fprintf(stdout, "ERROR : Inconsistent data in ClientInfo Structure\n"); fflush(stdout); return; } fprintf(stdout, "CLIENTS : %i Clients Attached\n", nClients); for(i=0; i0 && actualItems<=maxItems) { data.find(actualTag, item); } return item; }