snmpwalk 파싱하는 문제
snmp 웹 솔루션을 개발하고 있는 사람입니다. 궁금한 점이 몇가지 있어서 이렇게 몇자 적어 봅니다. 다름이 아니고 아래의 파일내용을 파싱하고 싶습니다.
각 mib 값에 대한 파싱하는 방법이 있는지 인터페이스당 더 늘어나기도 하고
더 줄어 들기도 하는데 파싱을 어떻게 해야할쥐. 궁금합니다..
언어는 c 언어로 하고 운영체제는 리눅스 입니다.
interfaces.ifNumber.0 = 2
interfaces.ifTable.ifEntry.ifIndex.1 = 1
interfaces.ifTable.ifEntry.ifIndex.2 = 2
interfaces.ifTable.ifEntry.ifDescr.1 = lo
interfaces.ifTable.ifEntry.ifDescr.2 = eth0
interfaces.ifTable.ifEntry.ifType.1 = softwareLoopback(24)
interfaces.ifTable.ifEntry.ifType.2 = ethernetCsmacd(6)
interfaces.ifTable.ifEntry.ifMtu.1 = 16436
interfaces.ifTable.ifEntry.ifMtu.2 = 1500
interfaces.ifTable.ifEntry.ifSpeed.1 = Gauge32: 10000000
interfaces.ifTable.ifEntry.ifSpeed.2 = Gauge32: 10000000
interfaces.ifTable.ifEntry.ifPhysAddress.1 =
interfaces.ifTable.ifEntry.ifPhysAddress.2 = 0:4:75:95:34:a8
interfaces.ifTable.ifEntry.ifAdminStatus.1 = up(1)
interfaces.ifTable.ifEntry.ifAdminStatus.2 = up(1)
interfaces.ifTable.ifEntry.ifOperStatus.1 = up(1)
interfaces.ifTable.ifEntry.ifOperStatus.2 = up(1)
interfaces.ifTable.ifEntry.ifInOctets.1 = Counter32: 3388
interfaces.ifTable.ifEntry.ifInOctets.2 = Counter32: 57955844
interfaces.ifTable.ifEntry.ifInUcastPkts.1 = Counter32: 52
interfaces.ifTable.ifEntry.ifInUcastPkts.2 = Counter32: 556011
interfaces.ifTable.ifEntry.ifInErrors.1 = Counter32: 0
interfaces.ifTable.ifEntry.ifInErrors.2 = Counter32: 0
interfaces.ifTable.ifEntry.ifOutOctets.1 = Counter32: 3388
interfaces.ifTable.ifEntry.ifOutOctets.2 = Counter32: 63297
interfaces.ifTable.ifEntry.ifOutUcastPkts.1 = Counter32: 52
interfaces.ifTable.ifEntry.ifOutUcastPkts.2 = Counter32: 819
interfaces.ifTable.ifEntry.ifOutDiscards.1 = Counter32: 0
interfaces.ifTable.ifEntry.ifOutDiscards.2 = Counter32: 0
interfaces.ifTable.ifEntry.ifOutErrors.1 = Counter32: 0
interfaces.ifTable.ifEntry.ifOutErrors.2 = Counter32: 0
interfaces.ifTable.ifEntry.ifOutQLen.1 = Gauge32: 0
interfaces.ifTable.ifEntry.ifOutQLen.2 = Gauge32: 0
interfaces.ifTable.ifEntry.ifSpecific.1 = OID: .ccitt.zeroDotZero
interfaces.ifTable.ifEntry.ifSpecific.2 = OID: .ccitt.zeroDotZero
혹시 lex와 yacc를 써보셨는지요.....복잡한 파싱이 필요하다면
혹시 lex와 yacc를 써보셨는지요.....
복잡한 파싱이 필요하다면 이걸 써보세요....
일단 lex와 yacc가 c언어 기반이니까 lex, yacc
문법만 익히시면 되겠네요.
번역서도 한빛미디어에서 나와 있으니 한번
보십시오.
그럼.
snmp소스를 보시면 간편하게 원하는 값들만 가져올 수 있습니다.
snmp소스를 보시면 간편하게 원하는 값들만 가져올 수 있습니다.
참조하세요
[하양] snmpwalk output format
참고로 -Ov 옵션 주고 출력하면 value 값들만 나옵니다.
그리고 위의 값들로 꼭 해야 한다면...
strtok() 함수를 사용하면 아주 간단히 해결 됩니다.
이걸 이용해서 해보시길...
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
이전에 그와 관련된 개발을 한적이 있는데..
원하는 항목만 가져올수도 잇지만 snmpwalk는 왕창 긁어와서 한꺼번에 9개?
의 항목(interface,tcp...)중 모든 결과를 가져올수 있어서 좋았던 기억이..
당시 저는 9개 항목중 하나를 고르면 그에 대한 결과를 차트로 출력하는 거였거덩요.
agent로 query를 날리면 위의 결과처럼 인터페이스에 대한 결과가 오구.
이를 버퍼에 저장하여
결과를 보시면 알지만 크게
항목 = 결과
의 형태이구.
큐를 만듭니다.
한 라인(항목=결과)를 읽어 이를 name과 value행태로 나누는 함수를 호출합니다.
리스트로 연결...
근데 문제는 같은 항목이 위의 예처럼 인터페이스가 두개이상인 , 동적인 경우가 있을때 , 이때는 큐의 두번째항목의 리스트..
queue
[ 2]
[1]
[0] -> list [name,value] -> ....
이런 모양새였던거 같아요.
당시 얻어낸 결과순서별로 box에 출력했던건데...
정확히는 기억이 안나는데 이랬던거 같아요 -,-;;
소스 백업할걸 --;;
\\(^^ )^^)// **
댓글 달기