497 lines
14 KiB
C
497 lines
14 KiB
C
/**************************************************/
|
|
/*Title: snmpdebug.c */
|
|
/*Descr: Debug Module of SNMP Agent */
|
|
/*Author: Liang Hanxi */
|
|
/*Create: 2002-4-1 */
|
|
/*Modify: */
|
|
/**************************************************/
|
|
#include "./include/heartbeat.h"
|
|
|
|
static char debug_buf[4096];
|
|
static char asc_in[256];
|
|
static DWORD title_id[20]={1,3,6,1,4,1,1373,1,3,2,3,1,2,13,8,1};
|
|
|
|
//private function
|
|
BYTE snmpDebugFull = 0;
|
|
static snmp_filter SnmpFilter[8];
|
|
static BYTE SnmpFilterIndex = 0;
|
|
static DWORD debug_mask = SNMP_DEBUG_MASK;
|
|
extern snmp_csta SnmpCsta[96];
|
|
extern heartbeat_shm *HbShm;
|
|
static char Type_Name[9][16] = {"Get", "GetNext"
|
|
, "Response", "Set", "Trap-V1", "GetBulk", "Inform", "Trap-V2", "Report"};
|
|
static char help_info[] = "Commands provided now:\r\n\
|
|
help\r\n\
|
|
log all Output all debug information\r\n\
|
|
log none Turn off all information\r\n\
|
|
log error on/off Show error information\r\n\
|
|
log noreg on/off Alarm if oid is not registered\r\n\
|
|
log value on/off Show value party of snmp message\r\n\
|
|
log alarm on/off Show alarm information of platform\r\n\
|
|
log sys on/off Show system information\r\n\
|
|
log type cond1 (and cond2...) Show message due to specified condition\r\n\
|
|
type should be snmp/trap/set/get/rsp\r\n\
|
|
One or more conditions could be taken:\r\n\
|
|
oid=x.x../ip=xx/local port=xx/remote port=xx\r\n\
|
|
For example:log trap oid=1.3.6.1.4.1373 and ip=172.18.98.1\r\n\
|
|
list register List all registered oid\r\n\
|
|
list status List system status\
|
|
";
|
|
|
|
int snmp_filter_msg(snmp_pdu *pMsg, snmp_addr *pAddr);
|
|
extern int Str2Oid(DWORD *pOid, char *pStr, BYTE maxLen);
|
|
|
|
/* by simon at 23/9/25 */
|
|
extern char SnmpVer[16];
|
|
|
|
void snmp_debug_setup()
|
|
{
|
|
DWORD asc_id[20]={1,3,6,1,4,1,1373,1,1,2,3,1,2,13,4};
|
|
DWORD ascin_id[20]={1,3,6,1,4,1,1373,1,1,2,3,1,2,13,3};
|
|
DWORD status_id[20]={1,3,6,1,4,1,1373,1,1,2,3,1,2,13,1};
|
|
DWORD name_id[20]={1,3,6,1,4,1,1373,1,1,2,3,1,2,13,2};
|
|
|
|
static BYTE debug_status=1;
|
|
|
|
debug_set_response(15,asc_id,debug_buf,1);
|
|
debug_set_response(15,ascin_id,asc_in,1);
|
|
debug_set_response(15,status_id,&debug_status,1);
|
|
debug_set_response(15,name_id, SnmpVer, strlen(SnmpVer));
|
|
}
|
|
|
|
void snmp_log(char *info)
|
|
{
|
|
if(strlen(debug_buf) + strlen(info) > 4096)
|
|
{
|
|
snmpDebugFull = 1;
|
|
return;
|
|
}
|
|
|
|
strncat(debug_buf, info, 4094);
|
|
strcat(debug_buf, "\r\n");
|
|
return;
|
|
}
|
|
|
|
int snmp_filter_msg(snmp_pdu *pMsg, snmp_addr *pAddr)
|
|
{
|
|
int i;
|
|
for(i = 0; i < SnmpFilterIndex % 9; i++)
|
|
{
|
|
if(SnmpFilter[i].type != pMsg->pdu_type && pMsg->pdu_type != 0xFF)
|
|
continue;
|
|
if(SnmpFilter[i].flag & 0x01)
|
|
{
|
|
if(SnmpFilter[i].ip != pAddr->remote_ip)
|
|
continue;
|
|
}
|
|
if(SnmpFilter[i].flag & 0x02)
|
|
{
|
|
if(memcmp(SnmpFilter[i].oid, pMsg->var[0].oid, SnmpFilter[i].oidlen * 4) != 0)
|
|
continue;
|
|
}
|
|
if(SnmpFilter[i].flag & 0x04)
|
|
{
|
|
if(SnmpFilter[i].local_port != pAddr->local_port)
|
|
continue;
|
|
}
|
|
if(SnmpFilter[i].flag & 0x08)
|
|
{
|
|
if(SnmpFilter[i].remote_port != pAddr->remote_port)
|
|
continue;
|
|
}
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void snmp_debug(DWORD mask, const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
char buf[1024];
|
|
|
|
if((mask & debug_mask) == 0 || snmpDebugFull)
|
|
return;
|
|
|
|
if(mask & SNMPDB_ERR)
|
|
strcat(debug_buf, "\33[31m");
|
|
|
|
va_start(ap, fmt);
|
|
vsprintf(buf, fmt, ap);
|
|
va_end(ap);
|
|
strcat(buf,"\33[37m");
|
|
snmp_log(buf);
|
|
}
|
|
|
|
void snmp_showbuf(DWORD mask, BYTE *buf, int len)
|
|
{
|
|
int i = 0, j = 0, linemax = 24;
|
|
char info[1024];
|
|
|
|
if((debug_mask & SNMPDB_VALUE) == 0 || (debug_mask & mask) == 0 || snmpDebugFull)
|
|
return;
|
|
|
|
if(len >= 256)
|
|
len = 256;
|
|
|
|
while(i * 24 < len)
|
|
{
|
|
if((linemax = len - 24 * i) > 24)
|
|
linemax = 24;
|
|
for(j = 0; j < linemax; j ++)
|
|
{
|
|
sprintf(info + 3 * j, "%02X ", buf[24 * i + j]);
|
|
}
|
|
snmp_log(info);
|
|
i ++;
|
|
}
|
|
}
|
|
int oid2str(char *pStr, DWORD *oid, BYTE oidlen)
|
|
{
|
|
int i;
|
|
char tmpstr[16];
|
|
|
|
pStr[0] = 0;
|
|
if(oidlen > OID_MAXLEN) oidlen = OID_MAXLEN;
|
|
|
|
for(i = 0; i < oidlen - 1; i++)
|
|
{
|
|
sprintf(tmpstr, "%ld.", oid[i]);
|
|
strcat(pStr, tmpstr);
|
|
}
|
|
sprintf(tmpstr, "%ld", oid[oidlen - 1]);
|
|
strcat(pStr, tmpstr);
|
|
return 1;
|
|
}
|
|
|
|
void snmp_logvalue(BYTE *msgbuf, short msglen)
|
|
{
|
|
int len, i = 0, j, linemax;
|
|
char info[1024];
|
|
|
|
len = msglen % 256;
|
|
while(i * 24 < len)
|
|
{
|
|
if((linemax = len - 24 * i) > 24)
|
|
linemax = 24;
|
|
for(j = 0; j < linemax; j ++)
|
|
{
|
|
sprintf(info + 3 * j, "%02X ", msgbuf[24 * i + j]);
|
|
}
|
|
snmp_log(info);
|
|
i ++;
|
|
}
|
|
}
|
|
|
|
void snmp_logmsg(DWORD mask, snmp_pdu *pdu, snmp_addr *addr)
|
|
{
|
|
struct in_addr inaddr;
|
|
int i = 0;
|
|
char info[1024], oidstr[64], desc[64] = "\0";
|
|
|
|
if((debug_mask & mask) == 0 && snmp_filter_msg(pdu, addr) == 0)
|
|
return;
|
|
|
|
if(snmpDebugFull)
|
|
return;
|
|
|
|
if(mask & SNMPDB_ERR)
|
|
strcat(debug_buf, "\33[31m");
|
|
|
|
inaddr.s_addr = addr->remote_ip;
|
|
if(mask & SNMPDB_IN)
|
|
sprintf(desc, "\r\nlocal:%d <== %s:%d ", addr->local_port, inet_ntoa(inaddr), addr->remote_port);
|
|
else if(mask & SNMPDB_OUT)
|
|
sprintf(desc, "\r\nlocal:%d ==> %s:%d ", addr->local_port, inet_ntoa(inaddr), addr->remote_port);
|
|
else
|
|
sprintf(desc, "\r\nlocal:%d <=> %s:%d ", addr->local_port, inet_ntoa(inaddr), addr->remote_port);
|
|
|
|
sprintf(info, "%sType=%s, RID=%ld, Error=%d, Bind=%d\33[37m", desc, Type_Name[pdu->pdu_type], pdu->request_id
|
|
, pdu->error_status, pdu->var_num);
|
|
snmp_log(info);
|
|
|
|
for(i = 0; i < pdu->var_num % 16; i++)
|
|
{
|
|
oid2str(oidstr, pdu->var[i].oid, pdu->var[i].oidlen);
|
|
sprintf(info, "oid[%d]=%s, vartype=%02x, msglen=%d", i, oidstr, pdu->var[i].vartype, pdu->var[i].msglen);
|
|
snmp_log(info);
|
|
|
|
if((debug_mask & SNMPDB_VALUE) == 0)
|
|
return;
|
|
snmp_logvalue(pdu->var[i].msg, pdu->var[i].msglen);
|
|
}
|
|
|
|
}
|
|
|
|
static int get_word(char *pWord, char *pInStr, BYTE max)
|
|
{
|
|
char *pStart = pInStr, *pCh = NULL;
|
|
|
|
while(*pStart == ' ' || *pStart == '\t')
|
|
pStart ++;
|
|
|
|
strncpy(pWord, pStart, max);
|
|
pCh = strchr(pWord, ' ');
|
|
if(pCh != NULL)
|
|
*pCh = 0;
|
|
return 1;
|
|
}
|
|
|
|
static int parsecond(char *cmdstr, BYTE type)
|
|
{
|
|
char *pKey = cmdstr, *pEQ, info[256], tmpStr[64], valStr[32];
|
|
|
|
if(SnmpFilterIndex >= 8)
|
|
{
|
|
snmp_log("only 8 pieces of condition can be set");
|
|
return 0;
|
|
}
|
|
|
|
sprintf(info, "type = 0x%02X", type);
|
|
SnmpFilter[SnmpFilterIndex].type = type;
|
|
SnmpFilter[SnmpFilterIndex].flag = 0;
|
|
|
|
if((pKey = strstr(cmdstr, "ip")) != NULL && (pEQ = strchr(pKey, '=')) != NULL)
|
|
{
|
|
get_word(valStr, pEQ + 1, 32);
|
|
SnmpFilter[SnmpFilterIndex].ip = inet_addr(valStr);
|
|
sprintf(tmpStr, " and ip = %s", valStr);
|
|
strcat(info, tmpStr);
|
|
SnmpFilter[SnmpFilterIndex].flag |= 0x01;
|
|
}
|
|
if((pKey = strstr(cmdstr, "oid")) != NULL && (pEQ = strchr(pKey, '=')) != NULL)
|
|
{
|
|
get_word(valStr, pEQ + 1, 32);
|
|
if(SnmpFilter[SnmpFilterIndex].flag > 0) strcat(info, " and ");
|
|
sprintf(tmpStr, " and oid = %s", valStr);
|
|
strcat(info, tmpStr);
|
|
SnmpFilter[SnmpFilterIndex].oidlen = Str2Oid(SnmpFilter[SnmpFilterIndex].oid, valStr, OID_MAXLEN) % OID_MAXLEN;
|
|
SnmpFilter[SnmpFilterIndex].flag |= 0x02;
|
|
}
|
|
if((pKey = strstr(cmdstr, "local port")) != NULL && (pEQ = strchr(pKey, '=')) != NULL)
|
|
{
|
|
get_word(valStr, pEQ + 1, 32);
|
|
SnmpFilter[SnmpFilterIndex].local_port = atoi(valStr);
|
|
if(SnmpFilter[SnmpFilterIndex].flag > 0) strcat(info, " and ");
|
|
sprintf(tmpStr, " and local port = %d", SnmpFilter[SnmpFilterIndex].local_port);
|
|
strcat(info, tmpStr);
|
|
SnmpFilter[SnmpFilterIndex].flag |= 0x04;
|
|
}
|
|
if((pKey = strstr(cmdstr, "remote port")) != NULL && (pEQ = strchr(pKey, '=')) != NULL)
|
|
{
|
|
get_word(valStr, pEQ + 1, 32);
|
|
SnmpFilter[SnmpFilterIndex].remote_port = atoi(valStr);
|
|
if(SnmpFilter[SnmpFilterIndex].flag > 0) strcat(info, " and ");
|
|
sprintf(tmpStr, " and remote port = %d", SnmpFilter[SnmpFilterIndex].remote_port);
|
|
strcat(info, tmpStr);
|
|
SnmpFilter[SnmpFilterIndex].flag |= 0x08;
|
|
}
|
|
|
|
SnmpFilterIndex ++;
|
|
snmp_log(info);
|
|
snmp_log("command OK");
|
|
return 1;
|
|
}
|
|
|
|
void snmp_debug_timer()
|
|
{
|
|
BYTE npage, nline;
|
|
char *cmdstr = asc_in + 1;
|
|
if(strlen(asc_in) <= 1)
|
|
return;
|
|
debug_buf[0] = '\0';
|
|
npage = asc_in[0] - 1;
|
|
|
|
if(npage > 0)
|
|
{
|
|
nline = atoi(asc_in + 1);
|
|
switch(npage)
|
|
{
|
|
case 1: //csta
|
|
snmp_debug_csta(1,nline);
|
|
break;
|
|
}
|
|
asc_in[0]='\0';
|
|
return;
|
|
}
|
|
|
|
asc_in[0]='\0';
|
|
if(strstr(cmdstr, "help") != NULL || strstr(cmdstr, "?") != NULL)
|
|
{
|
|
snmp_log(help_info);
|
|
return;
|
|
}
|
|
else if(strstr(cmdstr, "log all") != NULL)
|
|
{
|
|
SnmpFilterIndex = 0;
|
|
debug_mask = 0xFFFFFFFF;
|
|
}
|
|
else if(strstr(cmdstr, "log none") != NULL)
|
|
{
|
|
SnmpFilterIndex = 0;
|
|
debug_mask = 0;
|
|
}
|
|
else if(strstr(cmdstr, "log error on") != NULL)
|
|
debug_mask |= SNMPDB_ERR;
|
|
else if(strstr(cmdstr, "log error off") != NULL)
|
|
debug_mask &= (~SNMPDB_ERR);
|
|
else if(strstr(cmdstr, "log onreg on") != NULL)
|
|
debug_mask |= SNMPDB_NOREG;
|
|
else if(strstr(cmdstr, "log onreg off") != NULL)
|
|
debug_mask &= (~SNMPDB_NOREG);
|
|
else if(strstr(cmdstr, "log value on") != NULL)
|
|
debug_mask |= SNMPDB_VALUE;
|
|
else if(strstr(cmdstr, "log value off") != NULL)
|
|
debug_mask &= (~SNMPDB_VALUE);
|
|
else if(strstr(cmdstr, "log alarm on") != NULL)
|
|
debug_mask |= SNMPDB_ALARM;
|
|
else if(strstr(cmdstr, "log alarm off") != NULL)
|
|
debug_mask &= (~SNMPDB_ALARM);
|
|
else if(strstr(cmdstr, "log mib on") != NULL)
|
|
debug_mask |= SNMPDB_MIB;
|
|
else if(strstr(cmdstr, "log mib off") != NULL)
|
|
debug_mask &= (~SNMPDB_MIB);
|
|
else if(strstr(cmdstr, "log sys on") != NULL)
|
|
debug_mask |= SNMPDB_SYS;
|
|
else if(strstr(cmdstr, "log sys off") != NULL)
|
|
debug_mask &= (~SNMPDB_SYS);
|
|
else if(strstr(cmdstr, "log snmp") != NULL)
|
|
{
|
|
parsecond(cmdstr + 8, 0xFF);
|
|
return;
|
|
}
|
|
else if(strstr(cmdstr, "log get") != NULL)
|
|
{
|
|
parsecond(cmdstr + 7, 0);
|
|
return;
|
|
}
|
|
else if(strstr(cmdstr, "log set") != NULL)
|
|
{
|
|
parsecond(cmdstr + 7, 3);
|
|
return;
|
|
}
|
|
else if(strstr(cmdstr, "log rsp") != NULL)
|
|
{
|
|
parsecond(cmdstr + 7, 2);
|
|
return;
|
|
}
|
|
else if(strstr(cmdstr, "log trap") != NULL)
|
|
{
|
|
parsecond(cmdstr + 8, 7);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
snmp_log("Invalid command/parameter(s).");
|
|
return;
|
|
}
|
|
|
|
snmp_log("Command OK");
|
|
return;
|
|
}
|
|
|
|
void snmp_debug_info(BYTE npage, BYTE nline, BYTE *pt, BYTE len)
|
|
{
|
|
DWORD oid[20]={1,3,6,1,4,1,1373,1,1,2,3,1,2,13,5,2,2};
|
|
oid[14] = 5 + npage;
|
|
oid[15] = 2 + nline;
|
|
debug_set_response(17, oid, pt, len);
|
|
}
|
|
|
|
/*-----------------------------------------------*/
|
|
/*-------------------CSTA------------------------*/
|
|
/*-----------------------------------------------*/
|
|
void snmp_debug_csta(BYTE npage,int instance)
|
|
{
|
|
char title[256];
|
|
snmp_csta *pcsta;
|
|
|
|
instance=instance%96;
|
|
pcsta=&SnmpCsta[instance];
|
|
|
|
sprintf(title,"\tSNMP-%s\tPage %02d\t\tMIB-CSTA(ID:1 Instance:%d)\r\n\r\n"\
|
|
"trap in\r\n"\
|
|
"trap out\r\n"\
|
|
"set in\r\n"\
|
|
"set out\r\n"\
|
|
"get in\r\n"\
|
|
"get out\r\n"\
|
|
"rsp in\r\n"\
|
|
"rsp out\r\n"\
|
|
"fail to parse\r\n"\
|
|
"OID Not registered\r\n"\
|
|
"fail to build\r\n", SnmpVer, npage, instance);
|
|
|
|
title_id[14]=5+npage;
|
|
debug_set_response(16,title_id,title,strlen(title));
|
|
|
|
snmp_debug_info(npage,0,(BYTE *)&pcsta->trap_in,4);
|
|
snmp_debug_info(npage,1,(BYTE *)&pcsta->trap_out,4);
|
|
snmp_debug_info(npage,2,(BYTE *)&pcsta->set_in,4);
|
|
snmp_debug_info(npage,3,(BYTE *)&pcsta->set_out,4);
|
|
snmp_debug_info(npage,4,(BYTE *)&pcsta->get_in,4);
|
|
snmp_debug_info(npage,5,(BYTE *)&pcsta->get_out,4);
|
|
snmp_debug_info(npage,6,(BYTE *)&pcsta->rsp_in,4);
|
|
snmp_debug_info(npage,7,(BYTE *)&pcsta->rsp_out,4);
|
|
snmp_debug_info(npage,8,(BYTE *)&pcsta->fail_parse,4);
|
|
snmp_debug_info(npage,9,(BYTE *)&pcsta->not_register,4);
|
|
snmp_debug_info(npage,10,(BYTE *)&pcsta->fail_build,4);
|
|
|
|
}
|
|
|
|
void snmp_debug_hb(BYTE npage)
|
|
{
|
|
char title[512];
|
|
sprintf(title,"\tSNMP-%s\tPage %02d\t\tHeartBeat\r\n"\
|
|
"\r\n"\
|
|
"subsys id\r\n"\
|
|
"LED\r\n"\
|
|
"Component 0\r\n"\
|
|
"\r\n"\
|
|
"Component 1\r\n"\
|
|
"\r\n"\
|
|
"Component 2\r\n"\
|
|
"\r\n"\
|
|
"Component 3\r\n"\
|
|
"\r\n"\
|
|
"Component 4\r\n"\
|
|
"\r\n"\
|
|
"Component 5\r\n"\
|
|
"\r\n"\
|
|
"Component 6\r\n"\
|
|
"\r\n"\
|
|
"alarm num\r\n"\
|
|
"HB message\r\n\r\n", SnmpVer, npage);
|
|
|
|
title_id[14]=5+npage;
|
|
|
|
debug_set_response(16,title_id,title,strlen(title));
|
|
|
|
snmp_debug_info(npage,0,(BYTE *)&HbShm->sys_id,2);
|
|
snmp_debug_info(npage,1,(BYTE *)HbShm->led,LED_NUM);
|
|
snmp_debug_info(npage,2,(BYTE *)&HbShm->component[0],20);
|
|
snmp_debug_info(npage,3,(BYTE *)&HbShm->component[0]+20,20);
|
|
snmp_debug_info(npage,4,(BYTE *)&HbShm->component[1],20);
|
|
snmp_debug_info(npage,5,(BYTE *)&HbShm->component[1]+20,20);
|
|
snmp_debug_info(npage,6,(BYTE *)&HbShm->component[2],20);
|
|
snmp_debug_info(npage,7,(BYTE *)&HbShm->component[2]+20,20);
|
|
snmp_debug_info(npage,8,(BYTE *)&HbShm->component[3],20);
|
|
snmp_debug_info(npage,9,(BYTE *)&HbShm->component[3]+20,20);
|
|
snmp_debug_info(npage,10,(BYTE *)&HbShm->component[4],20);
|
|
snmp_debug_info(npage,11,(BYTE *)&HbShm->component[4]+20,20);
|
|
snmp_debug_info(npage,12,(BYTE *)&HbShm->component[5],20);
|
|
snmp_debug_info(npage,13,(BYTE *)&HbShm->component[5]+20,20);
|
|
snmp_debug_info(npage,14,(BYTE *)&HbShm->component[6],20);
|
|
snmp_debug_info(npage,15,(BYTE *)&HbShm->component[6]+20,20);
|
|
|
|
snmp_debug_info(npage,16,(BYTE *)&HbShm->alarm_num,1);
|
|
snmp_debug_info(npage,17,(BYTE *)&HbShm->msg,20);
|
|
snmp_debug_info(npage,18,(BYTE *)&HbShm->msg+20,20);
|
|
snmp_debug_info(npage,19,(BYTE *)&HbShm->msg+40,20);
|
|
snmp_debug_info(npage,20,(BYTE *)&HbShm->msg+60,20);
|
|
snmp_debug_info(npage,21,(BYTE *)&HbShm->msg+80,20);
|
|
|
|
}
|
|
|
|
|
|
|