📄 adm_mon.c
字号:
/* * 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 + -