📄 helper.cpp
字号:
}
break;
case SNMP_SYNTAX_NULL:
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
pValue->value.empty = 0;
break;
default:
break;
}
} //end of ConvertStringToSmiValue
//
// abstract: print a smiValue
// input : a pointer to smiValue
// output : none
//
void PrintOidValue( smiVALUE *pValue )
{
if ( pValue == NULL )
return;
switch( pValue->syntax )
{
case SNMP_SYNTAX_INT32:
printf( "INTEGER: %ld \n", pValue->value.sNumber );
break;
case SNMP_SYNTAX_UINT32:
printf( "UNSIGNED INTEGER: %ld \n", pValue->value.uNumber );
break;
case SNMP_SYNTAX_CNTR32:
printf( "COUNTER: %ld \n", pValue->value.uNumber );
break;
case SNMP_SYNTAX_GAUGE32:
printf( "GAUGE: %ld \n", pValue->value.uNumber );
break;
case SNMP_SYNTAX_TIMETICKS:
printf( "TIMETICKS: %ld \n", pValue->value.uNumber );
break;
case SNMP_SYNTAX_CNTR64:
printf( "COUNTER64: %ld%ld \n", pValue->value.hNumber.hipart,
pValue->value.hNumber.lopart );
break;
case SNMP_SYNTAX_OCTETS:
{
UINT J;
BOOL IsDisplayString = TRUE;
LPSTR StringFormat;
for ( J=0; J < pValue->value.string.len && IsDisplayString; J++ )
{
IsDisplayString = isprint( pValue->value.string.ptr[J] );
}
StringFormat = IsDisplayString ? "%c" : "<0x%02x>" ;
printf( "OCTET STRING - " );
for ( J=0; J < pValue->value.string.len; J++ )
{
printf( StringFormat, pValue->value.string.ptr[J] );
}
putchar( '\n' );
}
break;
case SNMP_SYNTAX_BITS:
{
UINT J;
printf( "Bits - " );
for ( J=0; J < pValue->value.string.len; J++ )
{
printf( "0x%x ", pValue->value.string.ptr[J] );
}
putchar( '\n' );
}
break;
case SNMP_SYNTAX_OPAQUE:
{
UINT J;
printf( "Opaque - " );
for ( J=0; J < pValue->value.string.len; J++ )
{
printf( "0x%x ", pValue->value.string.ptr[J] );
}
putchar( '\n' );
}
break;
case SNMP_SYNTAX_IPADDR:
{
printf( "IpAddress - " );
printf( "%d.%d.%d.%d ",
pValue->value.string.ptr[0] ,
pValue->value.string.ptr[1] ,
pValue->value.string.ptr[2] ,
pValue->value.string.ptr[3] );
putchar( '\n' );
}
break;
case SNMP_SYNTAX_NSAPADDR:
break;
case SNMP_SYNTAX_OID:
{
UINT J;
printf( "OBJECT IDENTIFIER - " );
for ( J=0; J < pValue->value.oid.len; J++ )
{
printf( ".%d", pValue->value.oid.ptr[J] );
}
putchar( '\n' );
}
break;
case SNMP_SYNTAX_NULL:
printf( "NULL - NULL \n" );
break;
case SNMP_SYNTAX_NOSUCHOBJECT:
printf( "No such object ..\n" );
break;
case SNMP_SYNTAX_NOSUCHINSTANCE:
printf( "No such instance ..\n" );
break;
case SNMP_SYNTAX_ENDOFMIBVIEW:
printf( " End of MibView ..\n " );
break;
default:
printf( "Invalid Type ..\n" );
break;
}
} //end of PrintOidValue
//
// abstarct: print the varBinds in pSession->hVbl
// input: a pointer to manager session
// output: none
//
BOOL PrintVarBind( PSNMP_MGR_SESSION pSession )
{
char szBuf[ MAX_BUFFER_LEN ];
char szSecString[ MAX_BUFFER_LEN ];
int oidCount;
int i;
smiINT result;
AsnObjectIdentifier Oid; //unfortunate that there is no better way
LPSTR string = NULL;
oidCount = SnmpCountVbl( pSession->hVbl );
// using gVars.oid for walk operation.
// doesnt hurt when using get, get next operations as well.
for( i = 1; i <= oidCount; i++ )
{
if (i > 1) //free the last gVars.oid before getting a new one
{
SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiLPOPAQUE)&gVars.oid);
if ( gVars.value.syntax == SNMP_SYNTAX_OCTETS )
{
SnmpFreeDescriptor ( SNMP_SYNTAX_OCTETS, (smiLPOPAQUE)&gVars.value.value.string);
}
if ( gVars.value.syntax == SNMP_SYNTAX_OID )
{
SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiLPOPAQUE)&gVars.value.value.oid);
}
}
SnmpGetVb( pSession->hVbl, i, &gVars.oid, &gVars.value );
// a special case for SUB_TREE walk.
if ( gVars.operation == SUB_TREE )
{
SnmpOidCompare( &gVars.startOid, &gVars.oid, ( gVars.startOid.len ), &result );
if ( result != 0 )
return FALSE;
}
// a special case for WALK operation.
if (gVars.operation == WALK && gVars.value.syntax == SNMP_SYNTAX_ENDOFMIBVIEW)
{
return FALSE;
}
if ( gVars.doSet == FALSE )
{
printf( "OID :" );
memset( szBuf, 0, MAX_BUFFER_LEN );
SnmpOidToStr( &gVars.oid, MAX_BUFFER_LEN, szBuf );
printf( szBuf );
printf ( "\n\r" );
// The old mgmtapi requires a leading dot....
strcpy( szSecString, "." );
strcat( szSecString, szBuf );
if ( SnmpMgrStrToOid( szSecString, &Oid ) )
{
SnmpMgrOidToStr( &Oid, &string );
}
if ( string )
{
printf( "%s \n", string );
SnmpUtilMemFree( string );
SnmpUtilOidFree ( &Oid);
}
PrintOidValue( &gVars.value );
printf( "\n\r\n\r" );
}
}
return TRUE;
} //PrintVarBind
//
// abstract : parse and print v2 trap in v1 form.
// assuming that the trap is sent by a v1 agent
//
// input: PSNMP_MGR_SESSION pointer to the session
// output: none
//
void ParseAndPrintv2Trap( PSNMP_MGR_SESSION pSession )
{
smiOID sysUpTime,
snmpTrapOid,
snmpTrapEnterprise,
snmpTraps,
snmpTrapEnterpriseOID,
tmpOid;
smiINT result;
smiVALUE value;
DWORD oidCount;
DWORD index;
int genTrap;
char szBuf[ MAX_BUFFER_LEN ];
char szSecString[ MAX_BUFFER_LEN ];
AsnObjectIdentifier Oid; //unfortunate that there is no better way
LPSTR string = NULL;
BOOL entOid = FALSE;
if ( pSession == NULL )
return;
// convert to oids.
if ( SNMP_FAILURE( SnmpStrToOid( "1.3.6.1.2.1.1.3", &sysUpTime ) ) )
return;
if ( SNMP_FAILURE( SnmpStrToOid( "1.3.6.1.6.3.1.1.4", &snmpTrapOid ) ) )
return;
if ( SNMP_FAILURE( SnmpStrToOid( "1.3.6.1.6.3.1.1.4", &snmpTrapEnterprise ) ) )
return;
if ( SNMP_FAILURE( SnmpStrToOid( "1.3.6.1.6.3.1.1.5", &snmpTraps ) ) )
return;
if ( SNMP_FAILURE( SnmpStrToOid( "1.3.6.1.6.3.1.1.4.3.0", &snmpTrapEnterpriseOID ) ) )
return;
oidCount = SnmpCountVbl ( pSession->hVbl );
for( index = 1; index <= oidCount; index++ )
{
// print out varbind (name, value) pair in format of:
// Name in numerical form
// Name in string form
// value
// generic trap name (if this varbind is a generic trap)
SnmpGetVb( pSession->hVbl, index, &tmpOid, &value );
printf( "OID :" );
memset( szBuf, 0, MAX_BUFFER_LEN );
SnmpOidToStr( &tmpOid, MAX_BUFFER_LEN, szBuf );
printf( szBuf );
printf ( "\n\r" );
if (index == oidCount)
{
// Check if the last variable binding equals to "snmpTrapEnterpriseOID.0"
SnmpOidCompare( &snmpTrapEnterpriseOID, &tmpOid, snmpTrapEnterpriseOID.len, &result );
entOid = (result == 0);
}
// The old mgmtapi requires a leading dot....
strcpy( szSecString, "." );
strcat( szSecString, szBuf );
if ( SnmpMgrStrToOid( szSecString, &Oid ) )
{
SnmpMgrOidToStr( &Oid, &string );
}
if ( string )
{
printf( "OID string: %s \n", string );
SnmpUtilMemFree( string );
SnmpUtilOidFree ( &Oid);
}
else
{
printf( "OID string: <Can't convert oid to string form>\n");
}
SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiLPOPAQUE)&tmpOid);
PrintOidValue( &value );
// process generic traps only ..
if ( value.syntax == SNMP_SYNTAX_OID )
{
tmpOid = value.value.oid; // structure copy ..
SnmpOidCompare( &snmpTraps, &tmpOid, snmpTraps.len, &result );
if ( !result )
{
if ( tmpOid.len == ( snmpTraps.len + 1 ) )
{
genTrap = tmpOid.ptr[ snmpTraps.len ];
switch( genTrap )
{
case 1:
PrintDbgMessage( "ColdStart \n" );
break;
case 2:
PrintDbgMessage( "WarmStart \n" );
break;
case 3:
PrintDbgMessage( "LinkDown \n" );
break;
case 4:
PrintDbgMessage( "LinkUp \n" );
break;
case 5:
PrintDbgMessage( "Authentication Failure \n" );
break;
case 6:
PrintDbgMessage( "EGP Neighbor Loss \n" );
break;
case 7:
PrintDbgMessage( "enterprise specific \n" );
break;
default:
break;
}
}
}
}
printf( "\n\r\n\r" );
if ( entOid )
{
PrintDbgMessage( "Enterprise specific oid from v1 trap \n" );
PrintDbgMessage( "\n\r\n\r" );
}
if ( value.syntax == SNMP_SYNTAX_OCTETS )
{
SnmpFreeDescriptor ( SNMP_SYNTAX_OCTETS, (smiLPOPAQUE)&value.value.string);
}
if ( value.syntax == SNMP_SYNTAX_OID )
{
SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiLPOPAQUE)&value.value.oid);
}
}
SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiLPOPAQUE)&sysUpTime);
SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiLPOPAQUE)&snmpTrapOid);
SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiLPOPAQUE)&snmpTrapEnterprise);
SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiLPOPAQUE)&snmpTraps);
SnmpFreeDescriptor ( SNMP_SYNTAX_OID, (smiLPOPAQUE)&snmpTrapEnterpriseOID);
} // end of ParseAndPrintv2Trap
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -