📄 admserver.cc
字号:
Reply,
"@%lu@%lu\0",
ulTotalBlocks,
ulAvailBlocks
);
}
else
{
strcpy(Reply,"@0@0\0");
}
}
/****************************************************************
**
** Function: ExecuteProcess
** Purpose: 运行进程
** Input Parammeters:
Object -- 需运行进程的命令行
ConnectSocket -- 连接句柄
** Return:
** datetime:
**
*****************************************************************/
void ExecuteProcess(const char *Object,int ConnectSocket)
{
char Command[BUF_SIZE],Temp[BUF_SIZE];
char *Param[BUF_SIZE];
int j,i;
char *pchTemp = 0;
memset(Command, 0, sizeof(Command));
memset(Temp, 0, sizeof(Temp));
if (fork() == 0)
{
return;
}
if(ConnectSocket != 0)
{
close(ConnectSocket);
}
if (fork() != 0)
{
exit(0);
}
strcpy(Temp, Object);
Trim(Temp);
if('$' == Temp[0])
{
char szEnv[BUF_SIZE];
memset(szEnv, 0, sizeof(szEnv));
pchTemp = strchr(Temp, '/');
memcpy(szEnv, Temp + 1, (pchTemp - 1) - (Temp + 1) + 1);
strcpy(Command, getenv(szEnv));
strcat(Command, pchTemp);
}
else
{
strcpy(Command,Object);
}
i=0;
/*去掉最前面的空格*/
while((Command[i])&&(isspace(Command[i])))
{
i++;
}
j = 0;
for(j = 0;;j++)
{
while(isspace(Command[i]))
{
Command[i++] = '\0';
}
if (Command[i] == '\0')
{
break;
}
if(Command[i] == '"')
{
i++;
}
Param[j] = Command + i;
if(Command[i-1] == '"')
{
i++;
while((Command[i])&&(Command[i]!='"'))
{
i++;
}
Command[i++] = '\0';
}
while((Command[i])&&(isspace(Command[i]) == 0)&&(Command[i]!='"'))
{
i++;
}
}
execvp(Command,Param);
exit(1);
}
/****************************************************************
**
** Function: StartProcess
** Purpose: 启动对应进程
** Input Parammeters:
ProcessIndex -- 需运行进程的索引号
ConnectSocket -- 连接句柄
** Return:
** datetime:
**
*****************************************************************/
void StartProcess(int ProcessIndex, int ConnectSocket)
{
C_Config Config;
char CommandLine[STRING_LEN];
char Command[STRING_LEN];
char chTemp[STRING_LEN];
char *pchTemp = 0;
if(!ProcessExist(ProcessIndex))
{
/*获取进程执行命令行*/
sprintf(Command, "CommandLine%d", ProcessIndex);
if (Config.GetParam((char *)gv_chConfigFile,(char *)"AdmServer",Command,CommandLine) == false)
{
return;
}
Trim(CommandLine);
if(pchTemp = strchr(CommandLine, ' '))
{
*pchTemp = '\0';
pchTemp++;
strcpy(chTemp, pchTemp);
Trim(chTemp);
if(pchTemp = strchr(chTemp, ' '))
{
*pchTemp = '\0';
pchTemp++;
Trim(pchTemp);
sprintf(CommandLine, "%s %s %d %s", CommandLine, chTemp, ProcessIndex, pchTemp);
}
else
{
sprintf(CommandLine, "%s %s %d", CommandLine, chTemp, ProcessIndex);
}
}
else
{
sprintf(CommandLine, "%s %d", CommandLine, ProcessIndex);
}
Trim(CommandLine);
ExecuteProcess(CommandLine,ConnectSocket);
}
}
/****************************************************************
**
** Function: StopProcess
** Purpose: 停止对应进程
** Input Parammeters:
ProcessIndex -- 需停止进程的索引号
** Return:
** datetime:
**
*****************************************************************/
void StopProcess(int ProcessIndex,int)
{
S_ShareMemoryInformation ShareMemoryInformation;
memset(&ShareMemoryInformation,0,sizeof(ShareMemoryInformation));
if (ProcessExist(ProcessIndex) == true)
{
gv_ShareMemory.ReadShareMemory(ProcessIndex,&ShareMemoryInformation);
if(atoi(ShareMemoryInformation.procid) != 0)
{
kill(atoi(ShareMemoryInformation.procid),SIGTERM);
}
}
return;
}
/****************************************************************
**
** Function: GetConfigString
** Purpose: 得到配置文件中的参数
** Input Parammeters:
ConnectSocket -- socket连接句柄
** Return:
** datetime:
**
*****************************************************************/
void GetConfigString(int ConnectSocket)
{
C_Config Config;
C_BaseSock Socket;
char FileName[STRING_LEN],Section[STRING_LEN],Key[STRING_LEN],Value[STRING_LEN],Result[STRING_LEN];
if (Socket.ReadLine(ConnectSocket,FileName,STRING_LEN) <= 0)
{
close(ConnectSocket);
return;
}
if (Socket.ReadLine(ConnectSocket,Section,STRING_LEN) <= 0)
{
close(ConnectSocket);
return;
}
if (Socket.ReadLine(ConnectSocket,Key,STRING_LEN) <= 0)
{
close(ConnectSocket);
return;
}
if (Config.GetParam(FileName,Section,Key,Value) == false)
{
strcpy(Result,"Failure");
}
else
{
strcpy(Result,"Success");
}
if (Socket.WriteLine(ConnectSocket,Result,sizeof(Result)) <= 0)
{
close(ConnectSocket);
return;
}
if (Socket.WriteLine(ConnectSocket,Value,sizeof(Value)) <= 0)
{
close(ConnectSocket);
}
return;
}
/****************************************************************
**
** Function: SetConfigString
** Purpose: 设置配置文件中的参数
** Input Parammeters:
ConnectSocket -- socket连接句柄
** Return:
** datetime:
**
*****************************************************************/
void SetConfigString(int ConnectSocket)
{
C_Config Config;
C_BaseSock Socket;
char FileName[STRING_LEN],Section[STRING_LEN],Key[STRING_LEN],Value[STRING_LEN],Result[STRING_LEN];
if(Socket.ReadLine(ConnectSocket,FileName,STRING_LEN) <= 0)
{
close(ConnectSocket);
return;
}
if(Socket.ReadLine(ConnectSocket,Section,STRING_LEN) <= 0)
{
close(ConnectSocket);
return;
}
if(Socket.ReadLine(ConnectSocket,Key,STRING_LEN) <= 0)
{
close(ConnectSocket);
return;
}
if(Socket.ReadLine(ConnectSocket,Value,STRING_LEN) <= 0)
{
close(ConnectSocket);
return;
}
if(Socket.WriteLine(ConnectSocket,Result,sizeof(Result)) <= 0)
{
close(ConnectSocket);
return;
}
return;
}
/****************************************************************
**
** Function: ConnectionService
** Purpose: 接收客户端传来的数据并作出相应的处理
** Input Parammeters:
ConnectSocket -- socket连接句柄
** Return:
** datetime:
**
*****************************************************************/
void ConnectionService(int ConnectSocket)
{
C_BaseSock Socket;
S_ShareMemoryInformation ShareMemoryInformation;
memset(&ShareMemoryInformation, 0, sizeof(ShareMemoryInformation));
char RecvBuffer[BUF_SIZE],SendBuffer[BUF_SIZE],Object[BUF_SIZE];
memset(RecvBuffer, 0, sizeof(RecvBuffer));
memset(SendBuffer, 0, sizeof(SendBuffer));
memset(Object, 0, sizeof(Object));
char *Command,*Objects;
int i,j,k;
char chRecycleOrRedo[10],chMemoryIndex[5],*pchTemp;
memset(chRecycleOrRedo, 0, sizeof(chRecycleOrRedo));
memset(chMemoryIndex, 0, sizeof(chMemoryIndex));
char chChannelCode[5];
memset(chChannelCode, 0, sizeof(chChannelCode));
char chCommand[BUF_SIZE];
memset(chCommand, 0, sizeof(chCommand));
for(;;)
{
i = Socket.ReadLine(ConnectSocket,RecvBuffer,sizeof(RecvBuffer));
if (i <= 0)
{
if(ConnectSocket != -1)
{
close(ConnectSocket);
}
return;
}
if(strncmp(RecvBuffer,"Command",7)==0)
{
Trim(RecvBuffer);
Command = strchr(RecvBuffer,'@') + 1;
Trim(Command);
Objects = strchr(Command,'@') + 1;
Trim(Objects);
if(strncmp(Command,"Configsrv@", 10) == 0)
{
//前台启动后台配置服务器
strcpy(Object, "configsrv");
strcpy(SendBuffer, "ConfigsrvStart");
Socket.WriteLine(ConnectSocket, SendBuffer, sizeof(SendBuffer));
ExecuteProcess(Object, ConnectSocket);
close(ConnectSocket);
ConnectSocket = -1;
}
else if(strncmp(Command, "Dispense@", 9) == 0)
{
//前台启动数据分发
char chStartDateTime[STRING_LEN];
char chStartDate[10+1];
char chStartTime[8+1];
memset(chStartDate, 0, sizeof(chStartDate));
memset(chStartTime, 0, sizeof(chStartTime));
memset(chStartDateTime, 0, sizeof(chStartDateTime));
pchTemp = strchr(Objects, ' ');
pchTemp++;
for(j = 0; *pchTemp != ' '; pchTemp++)
{
chChannelCode[j++] = *pchTemp;
}
Trim(chChannelCode);
pchTemp++;
for(j = 0; *pchTemp != '\0'; pchTemp++)
{
chMemoryIndex[j++] = *pchTemp;
}
Trim(chMemoryIndex);
memset(&ShareMemoryInformation, 0, sizeof(ShareMemoryInformation));
gv_ShareMemory.WriteShareMemory(atoi(chMemoryIndex),&ShareMemoryInformation);
pchTemp = strchr(Objects, '/');
for(j = 0; *pchTemp != '\0'; pchTemp++)
{
chCommand[j++] = *pchTemp;
}
Trim(chCommand);
ExecuteProcess(chCommand, ConnectSocket);
//这个for循环用来判断程序是否启动成功
for(;;)
{
gv_ShareMemory.ReadShareMemory(atoi(chMemoryIndex),&ShareMemoryInformation);
memset(chStartDate, 0, sizeof(chStartDate));
memset(chStartTime, 0, sizeof(chStartTime));
memset(chStartDateTime, 0, sizeof(chStartDateTime));
strcpy(chStartDateTime, ShareMemoryInformation.startdate);
strcat(chStartDateTime, ShareMemoryInformation.starttime);
if(strlen(chStartDateTime) != 0)
{
break;
}
sleep(1);
}
//这个for循环用来给前台不停地发送消息
for(;;)
{
gv_ShareMemory.ReadShareMemory(atoi(chMemoryIndex),&ShareMemoryInformation);
sprintf(SendBuffer,"%s@%s",ShareMemoryInformation.status,ShareMemoryInformation.object);
Trim(SendBuffer);
Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
if(strncmp(ShareMemoryInformation.status, IDLE, strlen(IDLE)) == 0)
{
kill(atoi(ShareMemoryInformation.procid), SIGTERM);
break;
}
if(ShareMemoryInformation.procid == 0)
{
gv_ShareMemory.ReadShareMemory(atoi(chMemoryIndex),&ShareMemoryInformation);
sprintf(SendBuffer,"%s@%s",ShareMemoryInformation.status,ShareMemoryInformation.object);
Trim(SendBuffer);
Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
break;
}
sleep(1);
}
Socket.WriteLine(ConnectSocket,(char *)"End@",strlen("End@"));
close(ConnectSocket);
ConnectSocket = -1;
}
else if(strncmp(Command, "AccPrep@", 8) == 0)
{
//启动对帐预处理
ExecuteProcess(Objects, ConnectSocket);
Socket.WriteLine(ConnectSocket,(char *)"End@",strlen("End@"));
close(ConnectSocket);
ConnectSocket = -1;
}
else if(strncmp(Command, "AccOrder@", 9) == 0)
{
//启动对帐排序
ExecuteProcess(Objects, ConnectSocket);
Socket.WriteLine(ConnectSocket,(char *)"End@",strlen("End@"));
close(ConnectSocket);
ConnectSocket = -1;
}
else if(strncmp(Command, "AccCount@", 9) == 0)
{
//启动对帐
ExecuteProcess(Objects, ConnectSocket);
Socket.WriteLine(ConnectSocket,(char *)"End@",strlen("End@"));
close(ConnectSocket);
ConnectSocket = -1;
}
else if(strncmp(Command, "AccIndb@", 8) == 0)
{
printf("Command = %s\n", Command);
//停止对帐入库
char chChannelCode[3][10];
char chMemoryIndex[3][10];
pchTemp = Objects;
for(j = 0; j < 3; j++)
{
k = 0;
while(*pchTemp != ',')
{
chChannelCode[j][k] = *pchTemp;
k++;
pchTemp++;
}
Trim(chChannelCode[j]);
printf("chChannelCode[%d] = %s\n", j, chChannelCode[j]);
k = 0;
pchTemp++;
while((*pchTemp != ';') && (*pchTemp != '\0'))
{
chMemoryIndex[j][k] = *pchTemp;
k++;
pchTemp++;
}
pchTemp++;
Trim(chMemoryIndex[j]);
printf("chMemoryIndex[%d] = %s\n", j, chMemoryIndex[j]);
}
S_ShareMemoryInformation ShareMemoryInformation;
for(i = 0; i < 3; i++)
{
for(;;)
{
memset(&ShareMemoryInformation, 0, sizeof(ShareMemoryInformation));
gv_ShareMemory.ReadShareMemory(atoi(chMemoryIndex[i]), &ShareMemoryInformation);
printf("atoi(chMemoryIndex[%d]) = %d\n", i, atoi(chMemoryIndex[i]));
printf("ShareMemoryInformation.status = %s\n", ShareMemoryInformation.status);
if(strncmp(ShareMemoryInformation.status, IDLE, strlen(IDLE)) == 0)
{
printf("kill %d success!\n", atoi(ShareMemoryInformation.procid));
kill(atoi(ShareMemoryInformation.procid), SIGTERM);
break;
}
if(strncmp(ShareMemoryInformation.status, ERROR, strlen(ERROR)) == 0)
{
memset(&ShareMemoryInformation, 0, sizeof(ShareMemoryInformation));
gv_ShareMemory.ReadShareMemory(atoi(chMemoryIndex[i]), &ShareMemoryInformation);
strcpy(SendBuffer,"ERROR@");
Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
break;
}
sleep(1);
}
}
strcpy(SendBuffer,"END@");
Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
close(ConnectSocket);
ConnectSocket = -1;
}
else if((strncmp(Command, "ProcessStatus@", 14) == 0)
||strncmp(Command, "HostStatus@", 11) ==0)
{
/*监控台发来的指令为请求进程状态或者是请求主机状态*/
while (*Objects)
{
Objects = GetNextObject(Object,Objects);
memset(SendBuffer, 0, sizeof(SendBuffer));
GetShareMemInfo(SendBuffer,Object);
Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
}
strcpy(SendBuffer,"DataFinished");
Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
}
else if((strncmp(Command,"DiskStatus@",11)==0))
{
/*监控台发来的指令为请求磁盘状态*/
while(*Objects)
{
Objects = GetNextObject(Object,Objects);
GetDiskInfo(SendBuffer,Object);
Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
}
strcpy(SendBuffer,"DataFinished");
Socket.WriteLine(ConnectSocket,SendBuffer,sizeof(SendBuffer));
}
else if(strncmp(Command,"Start@",6)==0)
{
/*启动进程*/
while(*Objects)
{
Objects = GetNextObject(Object,Objects);
StartProcess(atoi(Object),ConnectSocket);
}
}
else if(strncmp(Command,"Stop@",5)==0)
{
/*停止进程*/
while(*Objects)
{
Objects = GetNextObject(Object,Objects);
StopProcess(atoi(Object),ConnectSocket);
}
}
else if(strncmp(Command, "Reset@",6) == 0)
{
/*重启当前系统的所有正在运行的进程*/
ResetAllProcess();
Socket.WriteLine(ConnectSocket,(char *)"End@",strlen("End@"));
}
else if((strncmp(Command,"Execute@",8)==0))
{
/*执行命令*/
while(*Objects)
{
Objects = GetNextObject(Object,Objects);
ExecuteProcess(Object,ConnectSocket);
}
}
else if((strncmp(Command, "Outdb@", 6)==0))
{
cout<<"Command = "<<Command<<endl;
cout<<"Objects = "<<Objects<<endl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -