📄 adm.cc
字号:
/******************************************************
* Copyright (c) 2002, 南京联创系统集成股份有限公司综合结算产品部
* All rights reserved.
*
* 文件名称:adm.cc
* 摘 要:监控平台用来和监控服务器通信,及显示监控信息
*
* 当前版本:通用版本,可以移植到aix,hpux,solaris,linux上
* 作 者:冯亮(feng@lianchuang.com)
* 完成日期:
*******************************************************/
#include "adm.h"
int gv_iHostCount;
int gv_iProcCount;
int gv_iDiskCount;
S_HostInfo *gv_HostInfo = 0;
S_ProcInfo *gv_ProcInfo = 0;
S_DiskInfo *gv_DiskInfo = 0;
S_TypeInfo gv_TypeInfo = {"","",0};
int gv_iStartRow = 1;
int gv_iSelectedRow = 1;
const int INTERVAL = 1;
char *g_Type = 0;
/****************************************************************
**
** Function: main
** Purpose: 主函数
** Input Parammeters:
** Return:
** datetime:
**
*****************************************************************/
int main(int argc,char *argv[])
{
C_BaseSock Socket;
int Key,i;
S_TypeInfo *Type = 0;
int lv_iStartRow;
int lv_iSelectedRow;
if(!LoadConfig())
{
DestroyGlobalVal();
return 0;
}
signal(SIGINT,SIG_IGN);
initscr();
noecho();
savetty();
keypad(stdscr,TRUE);
for(;;)
{
RebuildMenu();
signal(SIGALRM, MainTimeBreak);
alarm(INTERVAL);
Key = getch();
alarm(0);
if(Key == 27)
{
break;
}
switch(Key)
{
case '\n':
case '\r':
lv_iStartRow = gv_iStartRow;
lv_iSelectedRow = gv_iSelectedRow;
gv_iStartRow = 1;
gv_iSelectedRow = 1;
for(i = 1,Type = gv_TypeInfo.Next;((Type != 0)&&(i < lv_iSelectedRow));i++,Type = Type->Next)
{
;
}
if (strcmp(Type->MonitorType,"业务进程") == 0)
{
AdminProc(Type->Type);
}
else if (strcmp(Type->MonitorType,"磁盘空间") == 0)
{
AdminDisk(Type->Type);
}
gv_iStartRow = lv_iStartRow;
gv_iSelectedRow = lv_iSelectedRow;
break;
case KEY_UP:
gv_iSelectedRow--;
break;
case KEY_DOWN:
gv_iSelectedRow++;
break;
case KEY_LEFT:
gv_iStartRow -= 13;
gv_iSelectedRow -= 13;
break;
case KEY_RIGHT:
gv_iStartRow += 13;
gv_iSelectedRow += 13;
default :
break;
}
}
wclear(stdscr);
refresh();
resetty();
endwin();
system("clear");
for(i = 1;i <= gv_iHostCount;i++)
{
Socket.Close(gv_HostInfo[i].HostSocket);
}
DestroyGlobalVal();
return 0;
}
/*程序退出时销毁全局变量*/
void DestroyGlobalVal(void)
{
delete[] gv_HostInfo;
delete[] gv_ProcInfo;
delete[] gv_DiskInfo;
return;
}
/*调试程序时用*/
void dumpdebuginfo(const char * debug_info)
{
FILE *fp = fopen("debug.info","a+");
fprintf(fp,debug_info);
fprintf(fp,"\n");
fclose(fp);
return;
}
/****************************************************************
**
** Function: IsSpace
** Purpose: 判断空格
** Input Parammeters:
**
** Return: true -- 是 false -- 不是
** datetime:
**
*****************************************************************/
bool IsSpace(char c)
{
if ((c == ' ')||(c == '\t')||(c == '\0')||(c == '\r')||(c == '\n'))
{
return true;
}
else
{
return false;
}
}
/****************************************************************
**
** Function: LoadConfig
** Purpose: 读取配置文件数据
** Input Parammeters:
** Return: true -- 成功 false -- 失败
** datetime:
**
*****************************************************************/
bool LoadConfig(void)
{
C_Config Config;
char Section[STRING_LEN],Key[STRING_LEN],Value[STRING_LEN];
char Line[STRING_LEN];
S_TypeInfo *Type,*Next;
FILE *Cfp;
int i,j,k;
int ConfigType = 0;
char chConfigFile[255],*pchAppPath = 0;
//根据环境变量获得配置文件的位置
if((pchAppPath = getenv("SETTLE_HOME")) == 0)
{
printf("Not get the environment \"SETTLE_HOME\" in LoadConfig!\n");
return false;
}
strcpy(chConfigFile, pchAppPath);
strcat(chConfigFile, "/");
strcat(chConfigFile, CONFIG_FILE);
if (gv_HostInfo != 0)
{
delete[] gv_HostInfo;
}
if (gv_ProcInfo != 0)
{
delete[] gv_ProcInfo;
}
if (gv_DiskInfo != 0)
{
delete[] gv_DiskInfo;
}
Next = gv_TypeInfo.Next;
while(Next != 0)
{
Type = Next;
Next = Type->Next;
delete Type;
}
strcpy(Section,"Administrator");
strcpy(Key,"HostMonitorCount");
if (Config.GetParam(chConfigFile,Section,Key,Value) == false)
{
printf("Config file error at %s-->%s-->%s\n",CONFIG_FILE,Section,Key);
return false;
}
if(strlen(Value) == 0)
{
printf("\"HostMonitorCount\" is not configed in config file.");
return false;
}
gv_iHostCount = atoi(Value);
strcpy(Key,"ProcMonitorCount");
if (Config.GetParam(chConfigFile,Section,Key,Value) == false)
{
printf("Config file error at %s-->%s-->%s\n",CONFIG_FILE,Section,Key);
return false;
}
if(strlen(Value) == 0)
{
printf("\"ProcMonitorCount\" is not configed in config file.");
return false;
}
gv_iProcCount = atoi(Value);
strcpy(Key,"DiskMonitorCount");
if (Config.GetParam(chConfigFile,Section,Key,Value) == false)
{
printf("Config file error at %s-->%s-->%s\n",CONFIG_FILE,Section,Key);
return false;
}
if(strlen(Value) == 0)
{
printf("\"DiskMonitorCount\" is not configed in config file.");
return false;
}
gv_iDiskCount = atoi(Value);
gv_HostInfo = new S_HostInfo[gv_iHostCount + 1];
gv_ProcInfo = new S_ProcInfo[gv_iProcCount + 1];
gv_DiskInfo = new S_DiskInfo[gv_iDiskCount + 1];
memset(gv_HostInfo,0,sizeof(S_HostInfo) * (gv_iHostCount + 1));
memset(gv_ProcInfo,0,sizeof(S_ProcInfo) * (gv_iProcCount + 1));
memset(gv_DiskInfo,0,sizeof(S_DiskInfo) * (gv_iDiskCount + 1));
if ((Cfp = fopen(chConfigFile,"rb")) == 0)
{
return false;
}
while(feof(Cfp) == 0)
{
fgets(Line,STRING_LEN,Cfp);
/*去空格*/
for(i = 0;(IsSpace(Line[i])&&(Line[i] != 0));i++);
if ((Line[i] == '#')||(Line[i] == ';'))
{
continue;
}
if (Line[i] == '[')
{
i = 0;
sscanf(Line,"[MonitorHost%d]",&i);
if ((i != 0)&&(i <= gv_iHostCount))
{
k = i;
ConfigType = 1;
continue;
}
i = 0;
sscanf(Line,"[MonitorDisk%d]",&i);
if ((i != 0)&&(i <= gv_iDiskCount))
{
k = i;
ConfigType = 2;
continue;
}
i = 0;
sscanf(Line,"[MonitorProc%d]",&i);
if ((i != 0)&&(i <= gv_iProcCount))
{
k = i;
ConfigType = 3;
continue;
}
ConfigType = 0;
}
i = j = 0;
while((IsSpace(Line[i]))&&(Line[i] != 0))
{
i++;
}
while((Line[i] != '=')&&(Line[i] != 0))
{
Key[j++] = Line[i++];
}
Key[j] = 0;
while((IsSpace(Key[j - 1]))&&(j > 0))
{
Key[--j] = 0;
}
if (Line[i] == '=')
{
i++;
}
j = 0;
while((IsSpace(Line[i]))&&(Line[i] != 0))
{
i++;
}
while((Line[i] != '\r')&&(Line[i] != '\n')&&(Line[i] != 0))
{
Value[j++] = Line[i++];
}
Value[j] = 0;
switch(ConfigType)
{
/*主机信息*/
case 1:
if (strcmp(Key,"HostIP") == 0)
{
memcpy(gv_HostInfo[k].HostIP,Value,sizeof(gv_HostInfo[k].HostIP) - 1);
}
if (strcmp(Key,"HostPort") == 0)
{
gv_HostInfo[k].HostPort = atoi(Value);
}
break;
/*磁盘监控*/
case 2:
if (strcmp(Key,"Path") == 0)
{
memcpy(gv_DiskInfo[k].Path,Value,sizeof(gv_DiskInfo[i].Path) - 1);
}
if (strcmp(Key,"Type") == 0)
{
memcpy(gv_DiskInfo[k].Type,Value,sizeof(gv_DiskInfo[i].Type) - 1);
}
if (strcmp(Key,"HostID") == 0)
{
/*duxiangyu 指定第一台主机,以便通过这一台主机端口通讯*/
gv_DiskInfo[k].SocketId = atoi(Value);
if (gv_DiskInfo[k].SocketId > gv_iHostCount)
{
printf("Invalid value in config file %s-->%s-->%s\n",CONFIG_FILE,Section,Key);
return false;
}
}
break;
/*进程监控*/
case 3:
if (strcmp(Key,"Alias") == 0)
{
memcpy(gv_ProcInfo[k].Alias,Value,sizeof(gv_ProcInfo[i].Alias) - 1);/*[32+1]*/
}
if (strcmp(Key,"Type") == 0)
{
memcpy(gv_ProcInfo[k].Type,Value,sizeof(gv_ProcInfo[i].Type) - 1);
}
if (strcmp(Key,"HostID") == 0)
{
gv_ProcInfo[k].SocketId = atoi(Value);
if (gv_ProcInfo[k].SocketId > gv_iHostCount)
{
printf("Invalid value in config file %s-->%s-->%s\n",CONFIG_FILE,Section,Key);
return false;
}
}
if (strcmp(Key,"Index") == 0)
{
gv_ProcInfo[k].Index = atoi(Value);
}
break;
default:
break;
}
}
fclose(Cfp);
for(i = 1;i <= gv_iHostCount;i++)
{
sprintf(gv_HostInfo[i].HostAddr,"%s:%u",gv_HostInfo[i].HostIP,gv_HostInfo[i].HostPort);
gv_HostInfo[i].HostSocket = 0;
}
for(i = 1;i <= gv_iProcCount;i++)
{
strcpy(gv_ProcInfo[i].HostAddr,gv_HostInfo[gv_ProcInfo[i].SocketId].HostAddr);
Type = &gv_TypeInfo;
while(Type->Next != 0)
{
if ((strcmp(Type->Next->MonitorType,"业务进程") == 0)&&(strcmp(Type->Next->Type,gv_ProcInfo[i].Type) == 0))
{
break;
}
Type = Type->Next;
}
if (Type->Next == 0)
{
Type->Next = new S_TypeInfo;
Type->Next->Next = 0;
strcpy(Type->Next->MonitorType,"业务进程");
strcpy(Type->Next->Type,gv_ProcInfo[i].Type);
}
}
for(i = 1;i <= gv_iDiskCount;i++)
{
strcpy(gv_DiskInfo[i].HostAddr,gv_HostInfo[gv_DiskInfo[i].SocketId].HostAddr);
Type = &gv_TypeInfo;
while(Type->Next != 0)
{
if ((strcmp(Type->Next->MonitorType,"磁盘空间") == 0)&&(strcmp(Type->Next->Type,gv_DiskInfo[i].Type) == 0))
{
break;
}
Type = Type->Next;
}
if (Type->Next == 0)
{
Type->Next = new S_TypeInfo;
Type->Next->Next = 0;
strcpy(Type->Next->MonitorType,"磁盘空间");
strcpy(Type->Next->Type,gv_DiskInfo[i].Type);
}
}
return true;
}
/****************************************************************
**
** Function: RebuildMenu
** Purpose: 重建主菜单
** Input Parammeters:
** Return:
** datetime:
**
*****************************************************************/
void RebuildMenu(void)
{
int lv_iTotalRow = 0,lv_iCurrentRow = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -