2017-10-26 20 views
0

전담 MIB의 95 %를 C 코드로 변환하여 하위 에이전트에서 실행할 수있었습니다. 이를 위해이 Net-SNMP tutorialSNMP 에이전트 : mib2c가 InetAddress 또는 String 유형의 코드를 생성 할 수 있습니까? (예 : 정수 유형이 아님)

의 마지막 부분은 자연스럽게가 (난 그냥 인형에 대한 MIB에 대한 MFD 스탠드 ... 모두이라고 읽어 보시기 바랍니다 ...)을 mib2c.mfd.conf

mib2c -I -c mib2c.mfd.conf my_mib_node 
를 사용

아래와 같은 거의 모든 oids가있는 긴 .c 파일을 생성했습니다.

가 거의없는 선이 VideoInetAddr OID

//ABSTRACT OF SOURCE FILE GENERATED BY MIB2C 
//... 

long VideoFormat = 0; /* XXX: set default value */ 
// <<<=== NOTHING GENERATED HERE FOR VideoInetAddr OF TYPE INETADDRESS 
// WHEREAS OTHER INTEGERS ARE NORMALLY PRESENT 
long VideoInetPort = 0; /* XXX: set default value */ 
//... 

void init_my_mib_node(void) 
{ 
//... 

    const oid VideoFormat_oid[] = { 1,3,6,1,4,1,a,b,c,d,e }; 
    static netsnmp_watcher_info VideoFormat_winfo; 
    // <<<=== NO OID GENERATED for VideoInetAddr OF TYPE INETADDRESS 
    // WHEREAS OTHER OIDs ARE NORMALLY GENERATED 
    static netsnmp_watcher_info VideoInetAddr_winfo; //We have the winfo after all 
    const oid VideoInetPort_oid[] = { 1,3,6,1,4,1,a,b,c,d,g }; 
    static netsnmp_watcher_info VideoInetPort_winfo; 

    DEBUGMSGTL(("my_mib_node", 
    "Initializing VideoFormat scalar integer. Default value = %d\n", 
       VideoFormat)); 

    reg = netsnmp_create_handler_registration(
     "VideoFormat", NULL, 
      VideoFormat_oid, OID_LENGTH(VideoFormat_oid), 
      HANDLER_CAN_RWRITE); 

    netsnmp_init_watcher_info(&VideoFormat_winfo, &VideoFormat, 
    sizeof(long),ASN_INTEGER, WATCHER_FIXED_SIZE); 

    if (netsnmp_register_watched_scalar(reg, &VideoFormat_winfo) < 0) { 
    snmp_log(LOG_ERR, "Failed to register watched VideoFormat"); 
    //... 
} 

에 대해 생성되지 않았다 이것은 (더 코드 그냥 초기화() 함수를 호출, 쓰기 없음)을 5 분 잘 작동하고 필요, 내가 얻을 수 있었다 정수 ...

일부 OID를가 생성되지 않은 유형의 InetAddress의입니다 ... 모든 SET 아니하며했다 문자열

가야 stion

내가 아닌 정수 OID를 위해 또한 코드를 생성하는 mib2c.old-api.conf을 시도 모든 유형 코드를 생성 할 수있는 MIB의 conf 파일이 있지만, 나는 그것이 편리하지 않다는 것을 안다. 작성할 보일러 코드가 더 있습니다.

답변

0

대답의 조각 그러나 나는 이해에서 아주 멀리이고 그래서면 문제가

을 지속 매우 실용적 나는 여전히 WATCHER_MAX_SIZE처럼 정확하게 옵션을 이해할 필요가

//I put here ONLY what I added, see question above to complete code 
#define STR_LENGTH_IPV4 sizeof("xxx.yyy.zzz.www") 
char VideoInetAddr[STR_LENGTH_IPV4] = "192.168.2.3"; 
//... 
const oid VideoInetAddr_oid[] = { 1,3,6,1,4,1,a,b,c,d,f }; 

reg = netsnmp_create_handler_registration(
     "VideoInetAddr", NULL, 
      VideoInetAddr_oid, OID_LENGTH(VideoInetAddr_oid), 
      HANDLER_CAN_RWRITE); 

netsnmp_init_watcher_info(&VideoInetAddr_winfo, &VideoInetAddr, sizeof(VideoInetAddr), 
       ASN_OCTET_STR, WATCHER_MAX_SIZE); 

if (netsnmp_register_watched_scalar(reg, &VideoInetAddr_winfo) < 0) { 
    snmp_log(LOG_ERR, "Failed to register watched VideoInetAddr"); 
} 

손으로 추가 관리 (그것은 좋은 것입니까?)

1

예, mib2c 이 IP 주소 용 코드를 생성 할 수 있습니다. mfd가이 작업을 수행한다고 말할 수는 없지만 확실히 mib2c.iterate.conf (테이블 용)는이 작업을 수행합니다.

SNMP에서 IP의 유형은 또한, 당신은 IP를 나타내는 객체에 대한 MIB 파일에, 당신이 있는지 확인해야 C. 에 unint32_t 으로 표시 ASN_IPADDRESS이다 "구문 IPADDRESS ". 내 MIB에있는 at the MIB file with IP objectimplementation in C

+0

는 IP 정의는'구문 InetAddress'입니다 :

은 보라. 나는 이것이 어디에 정의되어 있는지 정확히 알지 못한다. Net-SNMP 디렉토리에는 _INET-ADDRESS_MIB.txt_가있는 _mibs_ 디렉토리가 있습니다. 여기에'InetAddress :: = TEXTUAL-CONVENTION ... 구문 옥텟 문자열 (SIZE (0..255))'가 있습니다. 그래서 내 질문에 대한 대답은'ASN_OCTET_STR'을 사용하는 이유입니다._Net-SNMP/include/net-snmp/library/asn1.h_에서 'ASN_OCTET_STR'을 발견했으며 값은 0x04입니다. 'ASN_IPADDRESS'는 _Net-SNMP/include/net-snmp/library/libsnmp.h_ 또는 _snmp_impl.h_에 있고 값은 0x40입니다. – NGI

+0

MIB 파일은 타사에서 제공 한 파일이므로 대처하는 것 외에 다른 선택의 여지가 없습니다. "좋은"SNMP IP 주소 유형과 "나쁜"것일까? 아마도 ASN_IPADDRESS mib2c가 전용 코드를 생성했을 것입니까? – NGI

+0

"일부 oids는 InetAddress 유형이 생성되지 않았으며 문자열도 생성되지 않았습니다."충분한주의를 기울이지 않았습니다. this before. mib2c에서 가능한 최상의 코드를 생성하려면 MiB 파일에서 사용되는 모든 사용자 정의 유형을 정의하거나 MiB에서 가져 오는 것이 좋습니다. 여기에 추가해야하는 코드에 대한 몇 가지 정보 및 예 MIB (템플릿 코드 생성 용으로 임시 버전을 만들 수 있음) https://kb.paessler.com/en/topic/73515-import-mib-file:-missing-import-module:-rfc-1212 – UserBS2