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

📄 adm_mon.c

📁 UNIX/LINUX平台下面SMS网管原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * file  	      : sysadm.c * srcipt by 	      : TANG  * recent modified by : TANG * and    modified on : April 1, 2003 * NOTICE             : the colorful dropdown menu * Platform 	      : Platform that supports ORACLE&OCI, thread, curses. * 			It has been tested on AIX. * 			A terminal is recommended , * 			but BLACK/WHITE mode is provided only. * Language	      : C and ORACLE OCI */#include <stdio.h>#include <termios.h>#include <setjmp.h>#include <unistd.h>#include <signal.h>#include <stdlib.h>#include <string.h>#include <memory.h>#include <fcntl.h>#include <errno.h>#include <varargs.h>#include <sys/types.h>#include <sys/times.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/stat.h>#include "adm_mon.h"#include "tool.h"#include "../incl/sl_main.h"#include "../incl/sl_types.h"#define SUCCESS		0#define FAILURE		-1#define APSERVER_FILE	"etc/apserver"#define APGROUP_FILE	"etc/apgroup"#define BMS_PROFILE	"etc/bms.cfg"#define TPNODE_FILE	"etc/tpnode"#define DELIMITER	':'#define MAXCONNECTNUM	512#define MSGSIZE		2048#define MAXSVRNUM	400#define MAXCONCURNUM	400#define NOUSER			'0'#define INUSER			'1'APSRV ApSrv[ MAXSVRNUM] ;APGRP ApGrp[ MAXSVRNUM] ;TPNODE TpNode[ MAXCONNECTNUM] ;char CmdLine[ MAXCONCURNUM][128] ;int NodeNum ;long pid[ MAXSVRNUM][ MAXCONCURNUM] ;int MyINTERVAL=0 ;long max_shm_size ;typedef struct {	char Pid[ 6] ;	char Stime[ 9] ;	char Rtime[ 9] ;	char Cmd[ 80] ;	long Port ;	short SysAccept ;	short Accept ;	short TimeOut ;} COMPROCINFO ;typedef struct {	int proto ;	long recv_q ;	long send_q ;	unsigned long local_address ;	char local_hostname[ 30] ;	unsigned long foreign_address ;	char foreign_node[ 30] ;	int state ;} NETSTATINFO ;struct {	int Accept ;	NETSTATINFO NetStatInfo[ MAXCONNECTNUM] ;} ConnectInfo ;struct {	int apg_id ;	int svr_num ;} ApSrvInfo[ MAXSVRNUM] ;char *get_substr( char *str, int posi) ;void pub_trim( char *buffer) ;void get_time( char *str) ;char Version[] = "中国包头商业银行系统管理控制台";COLORPATTERN MenuColor;COLORPATTERN PadColor;/**水平菜单及菜单项定义**/WINDOWS *tmpWin, *tmpWin1;PAD SysPAD;int manage_process_menu();int StartMon();int view_process_menu();int help_menu();ITEMS PadItems[] = {    { " 进程管理 ", "启动通讯进程和应用进程  ",      manage_process_menu },    { " 交易监控 ", "对当日的交易进行实时监控",      StartMon  },    { " 查看进程 ", "查看通讯进程和应用进程  ",      view_process_menu },    { " 系统帮助 ", "有关本管理系统的帮助信息",      NULL },    { " 退出系统 ", "退出本管理系统          ",      QuitSystem }};/**系统设置**/MENU Manage_Process_Menu;int StartPoll();int StartApp();int StopPoll();int StopApp();ITEMS Manage_Process_MenuItems[] = {    { " 1.启动通讯进程 ",   "启动通讯进程", 	StartPoll },    { " 2.启动应用进程 ",   "启动应用进程", 	StartApp },    { "-", NULL, NULL },    { " 3.停止通讯进程 ",   "停止通讯进程", 	StopPoll },    { " 4.停止应用进程 ",   "停止应用进程", 	StopApp },    { "-", NULL, NULL },    { " 0.退出系统 ", "退出系统                ", QuitSystem },    { "-", NULL, NULL }};MENU View_Process_Menu;int ViewPoll();int ViewApp();int ViewShm();ITEMS View_Process_MenuItems[] = {    { " 1.查看通讯进程 ",   "查看通讯进程", 	ViewPoll},    { " 2.查看服务进程 ",   "查看服务进程", 	ViewApp },    { " 3.查看共享内存 ",   "查看共享内存", 	ViewShm }};/* * function	: main */main(int argc, char **argv){    signal(SIGINT, SIG_IGN);    signal(SIGQUIT, SIG_IGN);    signal(SIGTSTP, SIG_IGN);    InitColorSystem();    SetColorPattern( &MenuColor,        BLACK, WHITE,  BLACK, WHITE, WHITE, WHITE, WHITE, MAGENTA );	    SetColorPattern( &PadColor,         BLACK, WHITE,  BLACK, WHITE, WHITE, WHITE, WHITE, MAGENTA );	    SetColor( &MenuColor );    SetColor( &PadColor );    ShowVersion( Version );    SetMessageShowMode( NOM_SHOW );    BackGround( WHITE, CYAN );    InitPad( stdscr, &SysPAD, 1, 2, PadItems, 5, &PadColor );    while( TRUE )	        ActivatePad( &SysPAD );}int manage_process_menu(){    InitMenu(&Manage_Process_Menu, 3, 2, Manage_Process_MenuItems, 7, REGULAR_BOARD, &MenuColor);    ActivateMenu(&Manage_Process_Menu);    return 0;}int view_process_menu(){    InitMenu( &View_Process_Menu, 3, 25, View_Process_MenuItems, 3, REGULAR_BOARD,     &MenuColor );    ActivateMenu( &View_Process_Menu );    return 0;}int help_menu(){    SystemOpen();    SystemClose();    DispTitle();    return (SYSTEM_RET);}int DispTitle(){    char blank[77];    BackGround( WHITE, CYAN );    ShowVersion( Version );    memset( blank, ' ', 76 );     blank[76] = 0;    attrset( COLOR_PAIR( VERSION_PATTERN ) );    mvaddstr( 1, 2, blank );    refresh();    InitPad( stdscr, &SysPAD, 1, 2, PadItems, 5, &PadColor );    return 0;}int StartPoll(){	int childpid, status ; 	char cmd[ 80] ;	int i ;	i = 0 ;	clear_pid() ;	if ( SearchPid( "poll.d", pid[ i]) > 0 ) {		MessageBX("通讯进程已经存在, 请查看通讯进程状态!") ;		return 0;	}	if ( find_bms_cfg() != SUCCESS ) {		MessageBX("find_bms_cfg error!") ;		return 0;	}	find_apserver_cfg() ;	/* check shm && sem */	if ( get_shm_id() == SUCCESS ) clr_shm() ;	if ( get_sem_id() == SUCCESS ) clr_sem() ;	childpid = fork() ;	if ( childpid < 0 ) {		MessageBX( "产生子进程错误!") ;		return 0;	} else if ( childpid == 0) {		sprintf( cmd, "%s/bin/poll.d", getenv("HOME")) ;		if ( execl( cmd, "poll.d", "-t", (char *)0) < 0 ) {			MessageBX( "启动通讯进程 FAIL!") ;			exit( 0) ;		}		exit( 0) ;	} else if ( childpid != wait( &status)) {		/*perror("") ; */	}	MessageBX( "启动通讯进程 OK!") ;	return 0;}int StartApp(){	int childpid, status ; 	int i, j, k, c, cc, n, m ;	char *p, filename[ 80], cmd[ 80] ;	if ( find_bms_cfg() != SUCCESS ) {		MessageBX( "find_bms_cfg error!") ;		return 0;	}	find_apserver_cfg() ;	i = 0 ;	clear_pid() ;	if ( SearchPid( "poll.d", pid[i]) <= 0 ) {		MessageBX( "通讯进程没有启动, 请先启动通讯进程!") ;		return 0;	}/**	i = 0 ;	n = 0 ;	k = 0 ;	clear_pid() ;	for ( i = 0; i < MAXSVRNUM && ApSrv[ i].apsrv_id != 0; i ++ ) {		if ( ApSrv[ i].start_mode == TRIGGER )  { k ++ ; continue ; }		p = strrchr( ApSrv[ i].pathname, '/') ;		p ++ ;		c=0 ;		if ( (c=SearchPid( p, pid[ i])) <= 0 ) c = 0 ;		if ( c >= ApSrv[ i].start_num )  {			n ++ ; continue ;		}		for ( j = 0; j < ApSrv[ i].start_num-c ; j++ ) {			childpid = fork() ;			if ( childpid < 0 ) {				MessageBX( "产生子进程错误!") ;				return 0;			} else if ( childpid == 0) {				sprintf( cmd, "%s/bin/%s", getenv("HOME"), p) ;				if ( execl(cmd,p,"-t",(char *)0) <0)					exit( 0) ;				exit( 0) ;			}		}		cc = m = 0 ;		clear_pid() ;		cc = SearchPid( p, pid[m]) ;		if ( cc <= 0 ) cc = 0 ;		if ( cc > 0 ) 			sprintf( cmd, "启动 %d 个\"%s\" OK!", ApSrv[ i].start_num-c, p) ;		 else 			sprintf( cmd, "启动 %d 个\"%s\" FAIL!", 						ApSrv[ i].start_num, p) ;		MessageBX( cmd) ;	}	if ( i == n+k ) {		MessageBX( "服务进程已经存在, 请查看服务进程状态!") ;		return 0;	}*	j = 0 ;	k = 0 ;	for ( i = 0; i < MAXSVRNUM && ApSrv[ i].apsrv_id != 0; i ++ ) {		if ( ApSrv[ i].start_mode == TRIGGER )  { k ++ ; continue ; }		p = strrchr( ApSrv[ i].pathname, '/') ;		p ++ ;		for ( j = 0; j < ApSrv[ i].start_num && j < MAXCONCURNUM; j++ )		{			childpid = fork() ;			if ( childpid < 0 ) {				MessageBX( "产生子进程错误!") ;				return 0;			} else if ( childpid == 0) {				sprintf( cmd, "%s/bin/%s", getenv("HOME"), p) ;				if ( execl(cmd,p,"-t",(char *)0) <0) {					exit( 0) ;				}				exit( 0) ;			}		}		c = n = 0 ;		clear_pid() ;		c = SearchPid( p, pid[n]) ;		if ( c <= 0 ) c = 0 ;		if ( c > 0 )			sprintf( cmd, "启动 %d 个\"%s\" OK!", c, p) ;		else 			sprintf( cmd, "启动 %d 个\"%s\" FAIL!", 						ApSrv[ i].start_num, p) ;		MessageBX( cmd) ;	}*	if ( i == 0 ) MessageBX( "没有定义应用服务!") ;	else if ( i == k ) {		sprintf(cmd, "无常驻式应用服务, 有 %d 个触发式应用服务!", k) ;		MessageBX( cmd) ;	}	else MessageBX( "启动服务进程完成!") ;*/	system("startabc");	MessageBX( "启动服务进程完成!") ;	return 0;}int StopPoll(){	char *p, cmd[80] ;	int i=0, j, c ;	i = 0 ;	clear_pid() ;	if ( SearchPid( "poll.d", pid[ i]) <= 0 ) {		MessageBX("通讯进程不存在!") ;		return 0;	}	if ( find_bms_cfg() != SUCCESS ) {		MessageBX("find_bms_cfg error!") ;		return 0;	}	find_apserver_cfg() ;	i = 0 ;	clear_pid() ;	for ( i = 0; i < MAXSVRNUM && ApSrv[ i].apsrv_id != 0; i ++ ) {		p = strrchr( ApSrv[ i].pathname, '/') ;		p ++ ;		if ( SearchPid( p, pid[ i]) > 0 ) {			MessageBX( "服务进程在线, 请先关闭服务进程!") ;			return 0;		}	}	i = 0 ;	clear_pid() ;	if ( SearchPid( "poll.d", pid[ i]) <= 0 ) {		MessageBX("通讯进程不存在!") ;		return 0;	}	if ( DialogBox( YES_NO_BOX, REGULAR_BOARD, "是否停止通讯进程 ? ") == YES ) {		for ( j = 0; pid[ i][ j] > 0; j++ ) {			sprintf( cmd, "kill -31 %d", pid[ i][ j]) ;			system( cmd) ;		}		MessageBX( "关闭通讯进程 OK!") ;		shmp = (char *)0 ;		if ( get_shm_id() == SUCCESS ) clr_shm() ;		if ( get_sem_id() == SUCCESS ) clr_sem() ;	}	return 0;}int StopApp(){	char *p, cmd[80] ;	int flag=0, i, j ;	if ( find_bms_cfg() != SUCCESS ) {		MessageBX( "find_bms_cfg error!") ;		return 0;	}	find_apserver_cfg() ;	i = 0 ;	clear_pid() ;	for ( i = 0; i < MAXSVRNUM && i < ApSrv[ i].apsrv_id != 0; i++ ) {		p = strrchr( ApSrv[ i].pathname, '/') ;		p ++ ;		if ( SearchPid( p, pid[ i]) <= 0 ) continue ;		flag ++ ;	}	if ( flag == 0 ) {		MessageBX( "服务进程不存在!") ;		return 0;	}	if ( DialogBox( YES_NO_BOX, REGULAR_BOARD, "是否停止服务进程 ? ") == NO )		return 0;	for ( i = 0; i < MAXSVRNUM && i < ApSrv[ i].apsrv_id != 0; i++ ) {		for ( j = 0; j < ApSrv[ i].start_num, pid[ i][ j] > 0; j++ ) {			sprintf( cmd, "kill -31 %d > /dev/null", pid[ i][ j]) ;			system( cmd) ; 		}		p = strrchr( ApSrv[ i].pathname, '/') ;		p ++ ;				sprintf( cmd, "关闭 %d 个\"%s\" OK!", j, p) ;		MessageBX( cmd) ;	}	/*add by yefei begin*/        if( get_sem_id()== SUCCESS )                semctl( semid, 0, SETVAL, 1 );//挂出信号灯        /*add by yefei end*/	MessageBX( "关闭全部服务进程 OK!") ;	return 0;}int ViewPoll(){	char *title = " 通讯进程信息 ";	COMPROCINFO ProcInfo ;	char *p, cmd[80] ;	int i=0, j, c ;	void viewpoll_action( int ) ;	i = 0 ;	clear_pid() ;	if ( SearchPid( "poll.d", pid[ i]) <= 0 ) 	{		MessageBX("通讯进程没有启动!") ;		return 0;	}	tmpWin = CreateWindow(4, 7, 19, 61, REGULAR_BOARD, title, NULL);	get_tpnode() ;	displaycomprocinfo( tmpWin->win, CmdLine[ 0]) ;	signal( SIGALRM, viewpoll_action) ;	alarm( 1) ;	while (getchar() != 27) ;	signal( SIGALRM, SIG_IGN) ;	alarm( 0) ;	DeleteWindow(tmpWin);	return 0;}void viewpoll_action( int sign){	COMPROCINFO ProcInfo ;	char *p ;	int  i ;	void viewpoll_action() ;	if ( SearchCmdLine( "poll.d") <= 0 ) {		MessageBX( "通讯进程没有启动!") ;		return ;	}	displaycomprocinfo( tmpWin->win, CmdLine[ 0]) ;	sleep( 1) ;	signal( SIGALRM, viewpoll_action) ;	alarm( 2) ;	return ;}int displaycomprocinfo( WINDOW *pwin, char *buf){	COMPROCINFO ProcInfo ;	NETSTATINFO *np ;	char psf[ 80], key[ 80], tmp[ 80] ;	int i, j, k ;		memset( (char *)&ProcInfo, '\0', sizeof( ProcInfo)) ;	sprintf( psf, "%s/%s", getenv("HOME"), BMS_PROFILE) ;	sprintf( key, "SL_PORT") ;	GetProfileString( psf, key, tmp) ;	ProcInfo.Port = atoi( tmp) ; 	sprintf( key, "SL_ACCEPT") ;	GetProfileString( psf, key, tmp) ;	ProcInfo.SysAccept = atoi( tmp) ; 	sprintf( key, "SocketTimeOut") ;	GetProfileString( psf, key, tmp) ;	ProcInfo.TimeOut = atoi( tmp) ; 	sscanf( buf, "%*s %s %*s %*s %s %*s %s", 		ProcInfo.Pid, ProcInfo.Stime, ProcInfo.Rtime) ;	strcpy( ProcInfo.Cmd, strstr( buf, "poll.d")) ;	viewconnectinfo( ProcInfo.Port) ;	ProcInfo.Accept = ConnectInfo.Accept ;		mvwprintw( pwin, 1, 2, "进程名: %s", "poll.d") ;	mvwprintw( pwin, 1, 22, "进程号: %s", ProcInfo.Pid) ;	mvwprintw( pwin, 1, 40, "命令行: %s", ProcInfo.Cmd) ;	mvwprintw( pwin, 2, 2, "启动时间: %s", ProcInfo.Stime) ;	mvwprintw( pwin, 2, 22, "CPU时间: %s", ProcInfo.Rtime) ;	mvwprintw( pwin, 3, 2, "通讯端口: %d", ProcInfo.Port) ;	mvwprintw( pwin, 3, 22, "最大连接数: %d", ProcInfo.SysAccept) ;	mvwprintw( pwin, 3, 40, "当前连接数: %d", ProcInfo.Accept) ;	mvwprintw( pwin, 4, 2, "------------------------------------------") ;	mvwprintw( pwin, 4, 40, "-------------------") ;	mvwprintw( pwin, 5, 2, "Protocol Send_Q Recv_Q   Remote_N     Remote_Ip") ;		mvwprintw( pwin, 18, 26, "第 [ 1] 页") ;	wrefresh( pwin) ;	for ( i = 0; i < ConnectInfo.Accept; i ++ ) {		np = (NETSTATINFO *)&ConnectInfo.NetStatInfo[ i] ;		switch( np->proto) {		case 0 : strcpy( tmp, "ip") ; break ;		case 1 : strcpy( tmp, "icmp") ; break ;		case 6 : strcpy( tmp, "tcp") ; break ;		case 17 : strcpy( tmp, "udp") ; break ;		default : strcpy( tmp, "oth") ; break ;		}		k = i / 12 ;		mvwprintw( pwin, 6 + (i-k*12), 2, "%-8s %6d %6d", tmp, np->send_q, np->recv_q) ;		get_addr( ntohl(np->foreign_address), tmp) ;		mvwprintw( pwin, 6 + (i-k*12), 27, "%-12s %s", np->foreign_node, tmp) ;		if ( i%12 == 0 ) mvwprintw( pwin, 18, 26, "第 [%2d] 页", k+1) ;		if ( (i+1)%12 == 0 ) {			if ( (ConnectInfo.Accept/12) > k ) 				sleep( 2) ;			ZWareaclear( pwin, 6, 2, 12, 57) ;		}		wrefresh( pwin) ;	}	return ;}int ZWareaclear( WINDOW *pwin, int row, int col, int height, int width){	int i, j ;	for (i = 0; i < height; i ++)		for ( j = 0; j <width; j ++)		mvwprintw( pwin, row + i, col + j, " ") ;	wrefresh( pwin) ;	return 0;	}int viewconnectinfo( long port){	FILE *pfp ;	char *p, cmd[ 80] ;	char buf[ 128] ;	NETSTATINFO *np ;	struct protoent *proto ;	struct hostent *node ;	struct in_addr in ;	char tmp[ 50] ;	unsigned long b=0L ;	sprintf( cmd, "netstat -n|grep %d", port) ;	if ((pfp=popen( cmd, "rb")) == NULL ) {		fprintf( stdout, "popen netstat output failure!\n") ;		return( -1) ;	}	ConnectInfo.Accept = 0 ;	while ( !feof( pfp)) {		memset( buf, '\0', sizeof( buf)) ;		if ( fgets( buf, 127, pfp) == NULL ) break ;		np = (NETSTATINFO *)&ConnectInfo.NetStatInfo[ ConnectInfo.Accept] ;		memset( np, '\0', sizeof( np)) ;		memset( cmd, '\0', sizeof( cmd)) ;		sscanf( buf, "%*s %*s %*s %s %s %s", np->local_hostname,					np->foreign_node, cmd) ; 		if (strcmp( cmd, "ESTABLISHED")) continue ;		p = strrchr( np->local_hostname, '.') ;		*p = 0 ;		p ++ ;		if ( atol( p) != port ) continue ;		p = strrchr( np->foreign_node, '.') ;		*p = 0 ;		node = gethostbyname( np->foreign_node) ;		memcpy( (char *)&in, (char *)node->h_addr, node->h_length) ;		np->foreign_address = in.s_addr ;		/*sprintf( cmd, inet_ntoa(in)) ; */		get_addr( ntohl(np->foreign_address), tmp) ;		get_net_b( tmp, &b) ;		check_cli_addr( b, np->foreign_node) ;		/*check_cli_addr( ntohl(np->foreign_address), np->foreign_node) ;*/		sscanf( buf, "%s %*s %*s %*s %*s %*s", cmd) ;		proto = getprotobyname( cmd) ;		np->proto = proto->p_proto ;		sscanf( buf, "%*s %s %*s %*s %*s %*s", cmd) ;		np->recv_q = atol( cmd) ;		sscanf( buf, "%*s %*s %s %*s %*s %*s", cmd) ;		np->send_q = atol( cmd) ;		ConnectInfo.Accept ++ ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -