⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adm.cc

📁 此源代码只用于学习,不得用于其他商业活动 .
💻 CC
📖 第 1 页 / 共 4 页
字号:
/******************************************************
* 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 + -