📄 monitor.c
字号:
# include <curses.h># include <string.h># include <stdio.h># include <sys/types.h># include <sys/ipc.h># include <sys/msg.h># include <signal.h># include <setjmp.h># include <fcntl.h># include <errno.h># include <time.h>#define Q_MONITOR 0x1130#define SUCCESS 0#define FAILURE -1#define WARNING_PATTERN 1 #define VERSION_PATTERN 2#define BOX_PATTERN 3#define TITLE_PATTERN 4#define TEXT_PATTERN 5 #define BLACK ( short )COLOR_BLACK #define RED ( short )COLOR_RED #define GREEN ( short )COLOR_GREEN #define YELLOW ( short )COLOR_YELLOW #define BLUE ( short )COLOR_BLUE #define MAGENTA ( short )COLOR_MAGENTA #define CYAN ( short )COLOR_CYAN #define WHITE ( short )COLOR_WHITE static int _nMonQueueKey, _mon_msgid;static char _sVersion[80];static void Leave_mon();static WINDOW *win_frame;static WINDOW *win_mon;typedef struct pp{ long mtype; long stype; char mtext[250];} MSG_STRUCT;MSG_STRUCT _msgbuf;int HasColors = TRUE;char Warning[] = "<ctrl+c退出>";/*14 bytes*/#define SPE_CHAR '|'#define MAXCOL 76void get_curr_date( char *currdate) ;/*2 lines Added by ChenYu 2003/05/29*/int fd_lock;struct flock lock;FILE *moni;/* * main() -- 主程序 */main( int argc, char **argv ){ int num = 1; int result,port1; char msg[100]; char source[200]; char TrSite[12], TrZone[12], TrCode[5], TrName[14], TrAmt[13], Account[21], TrTime[9]; char RetCode[6], CodeMsg[31]; char TrZoneName[12]; char addr[20],port[10]; char moniname[80], tmp[ 20]; if (BuildOption(argc, argv) != 0) { fprintf(stdout, "Usage: %s [-q (0x1130)] [-v (version)]\r\n", argv[0]); exit(-1); } result=get_winmon_confg("servaddr","winmonitor.cfg",addr); if(result<0){ perror("get moni servaddr failure !\n"); exit(1); } result=get_winmon_confg("servport","winmonitor.cfg",port); if(result<0){ perror("get moni servport failure !\n"); exit(1); } port1=atoi(port);/*14 lines Added by ChenYu 2003/05/29*//* if( (fd_lock = open( "/tmp/lockmon", O_WRONLY|O_CREAT )) < 0 ) { fprintf( stdout, "Open lock file error!\n" ); exit(-1); } lock.l_type = F_WRLCK; lock.l_start = 0; lock.l_whence = SEEK_SET; lock.l_len = 0; if( fcntl( fd_lock, F_SETLK, &lock ) < 0 ) { fprintf( stdout, "Monitor is already running, it can not be started again!\n", argv[0] ); exit(2); }*/ /*Monitor监控日志文件初始化*/ get_curr_date( tmp) ; sprintf(moniname,"%s/log/monitor.%s",getenv("HOME"), tmp); if((moni=fopen(moniname,"a+")) == NULL ){ printf("文件创建失败,请检查路径!\n"); exit( -1 ); } signal(SIGINT,Leave_mon); signal(SIGCLD,SIG_IGN); if((_mon_msgid = msgget((key_t)_nMonQueueKey, IPC_CREAT|0666)) < 0) { perror("Creat message queue(KEY_MON) failure !\n"); fclose( moni ); exit(1); } InitColorSystem(); ShowVersion(); win_frame = newwin(19, 76, 4, 2); win_mon = newwin(15, 76, 6, 2); scrollok(win_mon, TRUE); CreateWindow(); while ( 1 ) { memset((char *)&_msgbuf,0,sizeof(_msgbuf)); if (msgrcv(_mon_msgid, &_msgbuf, 200, 0L, ~IPC_NOWAIT) < 0) continue; memset(source, 0, sizeof(source)); memcpy(source, _msgbuf.mtext, 200); memset(TrSite, 0, sizeof(TrSite)); memset(TrZone, 0, sizeof(TrZone)); memset(TrCode, 0, sizeof(TrCode)); memset(TrName, 0, sizeof(TrName)); memset(TrAmt, 0, sizeof(TrAmt)); memset(Account, 0, sizeof(Account)); memset(TrTime, 0, sizeof(TrTime)); memset(RetCode, 0, sizeof(RetCode)); memset(CodeMsg, 0, sizeof(CodeMsg)); FieldVar(source, 1, SPE_CHAR, TrZone); FieldVar(source, 2, SPE_CHAR, TrSite); FieldVar(source, 3, SPE_CHAR, TrCode); FieldVar(source, 4, SPE_CHAR, TrName); FieldVar(source, 5, SPE_CHAR, TrAmt); FieldVar(source, 6, SPE_CHAR, Account); FieldVar(source, 7, SPE_CHAR, TrTime); FieldVar(source, 8, SPE_CHAR, RetCode); FieldVar(source, 9, SPE_CHAR, CodeMsg); memset(TrZoneName, '\0', sizeof(TrZoneName)); Get_Errorinfo( atoi(RetCode) , CodeMsg); if(Get_Tradename( atoi(TrCode ) , TrName ) != SUCCESS ) continue;/* Get_Tradezone( atoi(TrZone ) , TrZoneName );*/ memset(msg, ' ', sizeof(msg)); TrName[ 14] = 0 ; sprintf(msg, "%-6s %-4s %-4s %14s %10s %19s %8s %4s", TrZone,TrSite, TrCode, TrName, TrAmt, Account, TrTime, RetCode); msg[MAXCOL] = 0; if ( HasColors ) { init_pair( TEXT_PATTERN, GREEN, BLACK ); wattrset( win_mon, COLOR_PAIR( TEXT_PATTERN ) ); wattron(win_mon,A_BOLD); } wprintw(win_mon, "%-.76s", msg); wrefresh(win_mon); mvwprintw(win_frame,17, 7, "%5d", num) ; wattron(win_frame,A_BOLD); mvwprintw(win_frame, 18, 6, "%-54s", CodeMsg); wattroff(win_frame,A_BOLD); wrefresh(win_frame);/*发送windows监控信息*/ SendToWin(msg,addr,port1);/*写监控日志文件*/ fprintf(moni,"%s\n",msg); fflush(moni); num ++ ; if (num > 99999) num = 1;/*added for tee monitor, delete it for need*/ wrefresh(curscr); }}CreateWindow(){ int i; if ( HasColors ) { init_pair(BOX_PATTERN, GREEN, BLACK); attrset(COLOR_PAIR(BOX_PATTERN)); } mvaddstr(3,0,"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"); for(i=4;i<23;++i) { mvaddstr(i,0,"┃"); mvaddstr(i,78,"┃"); } mvaddstr(23,0,"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"); refresh(); if ( HasColors ) { init_pair( TITLE_PATTERN, RED, BLUE ); wattrset( win_frame, COLOR_PAIR( TITLE_PATTERN ) ); } if ( !HasColors ) wstandout(win_frame); mvwprintw(win_frame,0,0,"%-.76s","城市号 渠道 交易码及名称 交易额 借方帐号 交易时间 返回"); if ( !HasColors ) wstandend(win_frame); wrefresh(win_frame); if ( HasColors ) { init_pair( TITLE_PATTERN, CYAN, BLACK ); wattrset( win_frame, COLOR_PAIR( TITLE_PATTERN ) ); } mvwprintw(win_frame,1,0,"----------------------------------------------------------------------------"); mvwprintw(win_frame,17,0,"--第【 】笔------------------------------------------------------------"); wrefresh(win_frame); if ( HasColors ) { init_pair( WARNING_PATTERN, YELLOW, BLACK ); wattrset( win_frame, COLOR_PAIR( WARNING_PATTERN ) ); } mvwprintw(win_frame, 18, 0, "提示:%-55s%.14s ", " ", Warning); wrefresh(win_frame);} InitColorSystem( ){ initscr(); start_color(); HasColors = has_colors(); clear();}ShowVersion( ){ int VerLen, pos; char ver[77]; char blank[81]; memset( ver, ' ', 76 ); memset( blank, ' ', 80 ); VerLen = strlen( _sVersion ); if ( VerLen < 76 ) pos = 37 - VerLen / 2; memcpy( ver + pos, _sVersion, VerLen ); ver[76] = 0; blank[80] = 0; if ( HasColors ) { init_pair( VERSION_PATTERN, CYAN, BLUE ); attrset( COLOR_PAIR( VERSION_PATTERN ) ); } mvaddstr(0,0,"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"); mvaddstr(1,0,"┃"); mvaddstr(1,78,"┃"); attron(A_BOLD); mvaddstr( 1, 2, ver ); attroff(A_BOLD); mvaddstr(2,0,"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"); if ( !HasColors ) standout(); mvaddstr(24, 1, " ◎ 包头商业银行 2005.10 服务热线:0472-96016 ◎ "); if ( !HasColors ) standend(); refresh(); return 0;}int FieldVar(buf, fldnum, sep, dest)unsigned char *buf, sep, *dest;int fldnum;{ int i; unsigned char *ptr = buf; for (i=1; i < fldnum; i++) { if ((ptr = (unsigned char *) strchr((char *)ptr,sep))) ptr++; else return(0); } for (i=0; (*ptr != sep) && (*ptr); i++) *dest++ = *ptr++; *dest = '\0'; if (*ptr != sep) return(0); return(i);}static void Leave_mon(){ char pathname[60]; if(msgctl(_mon_msgid, IPC_RMID, (struct msqid_ds *)NULL) < 0) perror("Remove mon_msgid queue failure ! \n"); fclose( moni ); signal(SIGCLD,SIG_DFL); signal(SIGINT,SIG_IGN); werase(win_mon); delwin(win_mon); wrefresh(win_mon); werase(win_frame); delwin(win_frame); wrefresh(win_frame); attrset(0); clear(); refresh(); endwin();/*11 lines Added by ChenYu 2003/05/29*/ lock.l_type = F_UNLCK; lock.l_start = 0; lock.l_whence = SEEK_SET; lock.l_len = 0; if( fcntl( fd_lock, F_SETLK, &lock ) < 0 ) { fprintf( stdout, "fcntl UNLOCK error!\n"); close(fd_lock); exit(-1); } close(fd_lock); exit(0);}/* * BuildOption() -- 检查命令参数 * in para -- argc: 命令参数个数 * argv: 命令参数 * out para -- 无 * return -- -1: 失败, 0: 成功 */BuildOption(int argc, char **argv){ char temp[20]; int ch, ret=-1; extern char *optarg; extern int optind; _nMonQueueKey = Q_MONITOR; strcpy(_sVersion, "★ 包头商业银行客户服务中心前置系统实时交易监控台 ★"); while ((ch=getopt(argc, argv, "q:v:d")) != -1) { switch ((char)ch) { case 'q': sscanf(optarg, "%hd", &_nMonQueueKey); break; case 'v': sscanf(optarg, "%s", &_sVersion); break; case '?': printf("Unknow option %s !\r\n", argv[optind]); return -1; } } return 0;}int Get_Errorinfo( int result, char *errinfo){ FILE *fp ; long errorno ; char notes1[ 80] ; char notes2[ 80] ; char str[ 256] ; char filename[ 80]; if( result == 0 ){ strcpy( errinfo,"交易成功"); return( SUCCESS ); } strcpy( errinfo, "未知的错误类型!") ; //sprintf( filename, "%s/dat/resu.dat", getenv("HOME") ); sprintf( filename, "%s/dat/error.dat", getenv("HOME") ); if ( (fp=fopen( filename, "rb")) == NULL ) return( FAILURE) ; errorno = 0 ; memset( str, '\0', sizeof( str)) ; memset( notes1, '\0', sizeof( notes1)) ; memset( notes2, '\0', sizeof( notes2)) ; while ( !feof( fp) ) { memset( str, '\0', sizeof( str)) ; if ( fgets( str, 256, fp) == NULL ) break ; if ( str[ 0] == '[' || str[ 0] == '#' ) continue ; if ( sscanf( str, "%ld %s %s\n", &errorno, notes1, notes2) != 3 ) continue ; if ( errorno == result ) { fclose( fp) ; strcpy( errinfo, notes1) ; return( SUCCESS) ; } errorno = 0 ; memset( notes1, '\0', sizeof( notes1)) ; } fclose( fp) ; strcpy( errinfo, "未知的错误类型!") ; return( SUCCESS) ;}int Get_Tradename( int TrCode, char *TrName){ FILE *fp ; long errorno ; char notes[ 80] ; char str[ 256] ; char filename[ 80]; strcpy( TrName, "未知交易") ; if( TrCode == 1009||TrCode==9613||TrCode==9616||TrCode==9617) return( FAILURE ); sprintf( filename, "%s/dat/trade.index", getenv("HOME") ); if ( (fp=fopen( filename, "rb")) == NULL ) return( FAILURE) ; errorno = 0 ; memset( str, '\0', sizeof( str)) ; memset( notes, '\0', sizeof( notes)) ; while ( !feof( fp) ) { memset( str, '\0', sizeof( str)) ; if ( fgets( str, 256, fp) == NULL ) break ; if ( str[ 0] == '[' || str[ 0] == '#' ) continue ; if ( sscanf( str, "%ld %s\n", &errorno, notes) != 2 ) continue ; if ( errorno == TrCode ) { fclose( fp) ; strcpy( TrName, notes) ; return( SUCCESS) ; } errorno = 0 ; memset( notes, '\0', sizeof( notes)) ; } fclose( fp) ; strcpy( TrName, "未知交易") ; return( SUCCESS) ;}int Get_Tradezone( int TrZone, char *TrZoneName){ FILE *fp ; long errorno ; char notes[ 80] ; char str[ 256] ; char filename[ 80]; strcpy( TrZoneName, "未知城市") ; sprintf( filename, "%s/dat/branch.info", getenv("HOME") ); if ( (fp=fopen( filename, "rb")) == NULL ) return( FAILURE) ; errorno = 0 ; memset( str, '\0', sizeof( str)) ; memset( notes, '\0', sizeof( notes)) ; while ( !feof( fp) ) { memset( str, '\0', sizeof( str)) ; if ( fgets( str, 256, fp) == NULL ) break ; if ( str[ 0] == '[' || str[ 0] == '#' ) continue ; if ( sscanf( str, "%ld %s %*s\n", &errorno, notes) != 2 ) continue ; if ( errorno == TrZone ) { fclose( fp) ; if( strlen( notes ) >8 ) notes[8]='\0'; strcpy( TrZoneName, notes) ; return( SUCCESS) ; } errorno = 0 ; memset( notes, '\0', sizeof( notes)) ; } fclose( fp) ; strcpy( TrZoneName, "未知城市") ; return( SUCCESS) ;}void get_curr_date( char *currdate){ struct tm *current_time, time_buf ; time_t t1 ; char str[ 11] ; current_time = &time_buf ; time( &t1) ; current_time = localtime ( &t1) ; memset( str, '\0', sizeof( str)) ; sprintf( str, "%04d%02d%02d", 1900+current_time -> tm_year, 1 + current_time -> tm_mon, current_time -> tm_mday) ; strcpy(currdate, str) ; return ;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -