📄 gwconsole.cpp
字号:
/********************************************************************** FileName : GWconsole.cpp Description : 网关控制台模块 Version : 1.0 Date : 2003年6月17日 Author : 刘荣辉 Other : ***********************************************************************/#include "GateWay.h"#define COMMAND_LIST "Input your Command as follows:\ \necho : To test the connection\ \nlist : To list out commands that can be used\ \ngwconfig : To reload the Gateway's configuration from ini file\ \nupconfig : To reload the Gateway's configuration from ini file\ \ndnconfig : To reload DnNode's information from database\ \nupalive : To list out alive UpNodes\ \ndnalive : To list out alive DnNodes\ \ncheckQ %d : To check queues of a Node, whose NodeID is %d\ \ncheckallQ : To check queues of all Nodes\ \nSTOP : To terminate Proxy Gateway\ \nquit : To quit this Administrator's console."void * CGateWay::Console(void * pGateway){ char sSysEvent[SYS_EVENT_LEN]; int RetCode; TCPsocket AdminSock; char Command[256]; int Login; char Message[1024]; struct sockaddr_in clientip; int mysock,iplen; int BadCommand; CGateWay *Gateway = (CGateWay *)pGateway; int threadid = pthread_self(); pthread_detach(threadid); sprintf(sSysEvent,"LOG: Console[%d] for Gateway is started.",threadid); Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); //写系统日志 while(1) { //打开监听管理命令监听端口 AdminSock.SetTimeOut(180); //远程管理连接连续3分钟不发送命令,则自动关闭连接 RetCode=AdminSock.Make_Listen_Sock(Gateway->GWIp, Gateway->AdminPort); if(RetCode<=0) { AdminSock.Close_sock(); printf("Error[%d]: Console Failed to Listen at [%s : %d].\n",RetCode,Gateway->GWIp, Gateway->AdminPort); Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); //写系统日志 return (void *)NULL; } #ifdef DEBUG printf("\n AdminUser=[%s], AdminPass=[%s], Socket=[%d]\n",Gateway->AdminUser,Gateway->AdminPass, AdminSock.sock); #endif iplen=sizeof(clientip); for(;;) //接收管理连接,接受执行命令 { sprintf(sSysEvent,"LOG: Console for Gateway is Listening at [%s : %d] for new connection...",Gateway->GWIp, Gateway->AdminPort); Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); //写系统日志 mysock=accept(AdminSock.sock,(struct sockaddr *)&clientip,(socklen_t *)&iplen); if(Gateway->ToExit) //检查系统退出标志 { close(mysock); goto ConsoleEnd; } if(mysock<0) { close(mysock); AdminSock.Close_sock(); break; //重新建立新的管理连接监听套接字 } sprintf(sSysEvent,"LOG: Console Got connection from [%s].\n",(char *)inet_ntoa(clientip.sin_addr)); Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); //写系统日志 //设置socket的最大阻塞时间,3分钟没有收到任何信息便断开连接????? //或设置socket为非阻塞,在程序中计时???? Login=0; for(int i=0;i<3;i++) //三次机会输入登录信息 { memset(Command,0,sizeof(Command)); memset(Message,0,sizeof(Message)); strcpy(Message,"Input your login authentication: "); if(write(mysock,Message,strlen(Message))!=(int)strlen(Message)) { printf("SysAdmin: Connection Lost when Writing to Sock!\n"); break; } RetCode=read(mysock, Command ,sizeof(Command)); if(RetCode<=0) { close(mysock); printf("SysAdmin: Connection Lost When reading on Sock.\n"); break; } printf("\n SysAdmin: Got Command=[%s].\n",Command); if(strcmp(Command,Gateway->AdminPass)==0) { Login=1; break; } //else printf("\n SysAdmin: Bad Login! \n"); } if(Login) { strcpy(Message, "Logined successfully!\n"); strcat(Message, COMMAND_LIST); if(write(mysock,Message,strlen(Message))!=(int)strlen(Message)) { printf("SysAdmin: Connection Lost when Writing to Sock!\n"); close(mysock); continue; } sprintf(sSysEvent,"LOG: Console Got good Login.\n"); Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); //写系统日志 } else //登录失败 { strcpy(Message,"Logined Failed! Connection is Lost!"); write(mysock,Message,strlen(Message)); close(mysock); sprintf(sSysEvent,"LOG: Console Got bad Login from [%s].\n",(char *)inet_ntoa(clientip.sin_addr)); Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); //写系统日志 continue; } BadCommand = 0; while(1) //不断接收命令 { memset(Command,0,sizeof(Command)); RetCode=read(mysock, Command ,sizeof(Command)); if(RetCode<=0) { close(mysock); printf("SysAdmin: Connection Lost When reading on Sock.\n"); break; } sprintf(sSysEvent,"LOG: Console Got Command=[%s].\n",Command); Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); //写系统日志 //===================返回连接存活回应信息=================== if(strcmp(Command,"echo")==0) { //memset(Message,0,sizeof(Message)); strcpy(Message,"echo! Connection is ok!"); if(write(mysock,Message,strlen(Message))!=(int)strlen(Message)) { printf("SysAdmin: Connection Lost when Writing to Sock!\n"); close(mysock); break; } } //======================返回命令列表====================== else if(strcmp(Command,"list")==0) { //memset(Message,0,sizeof(Message)); strcpy(Message,COMMAND_LIST); if(write(mysock,Message,strlen(Message))!=(int)strlen(Message)) { printf("SysAdmin: Connection Lost when Writing to Sock!\n"); close(mysock); break; } } /*/==================安全地停止网关系统的运行================== else if(strcmp(Command,"STOP")==0) { close(mysock); pthread_kill(Gateway->MainThr, SIGINT); goto ConsoleEnd; break; }*/ //=================从文件中重新装载网关的配置=============== else if(strcmp(Command,"gwconfig")==0) { Gateway->GetParam(); strcpy(Message,"Gateway's configuration is reloaded from ini file!"); if(write(mysock,Message,strlen(Message))!=(int)strlen(Message)) { printf("SysAdmin: Connection Lost when Writing to Sock!\n"); close(mysock); break; } } //===============从文件中重新装载所有上节点的配置============= else if(strcmp(Command,"upconfig")==0) { for(int i=0; i<UPNODE_NUM; i++) { RetCode = Gateway->UpNode[i].GetParam(Gateway->UpNode_IniFile[i]); if(RetCode) { sprintf(Message,"Error[%d]: Failed to load Parameters of UpNode[%s].",RetCode,Gateway->UpNode[i].NodeCode); Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); } else strcpy(Message,"UpNodes' configuration is reloaded from ini file!"); } if(write(mysock,Message,strlen(Message))!=(int)strlen(Message)) { printf("SysAdmin: Connection Lost when Writing to Sock!\n"); close(mysock); break; } } //===============从数据库中重新装载所有下节点的信息============ else if(strcmp(Command,"dnconfig")==0) { Gateway->DnNodeNum = Gateway->MyDB->GetDnNodeInfo(Gateway->CP_Array,MAX_DNNODE); if(Gateway->DnNodeNum > MAX_DNNODE) { Gateway->DnNodeNum = MAX_DNNODE; sprintf(sSysEvent,"Warning: DownNode records in Database is [%d],while MAX_DNNODE=[%d].",RetCode,MAX_DNNODE); Gateway->WrSystemLog->WriteLog(sSysEvent,SYSTEMLOG); } //修改Code_CP_Map中的下节点对象信息 for(int Num=0;Num<Gateway->DnNodeNum;Num++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -