net-snmp 모듈 이용 의문점


(김동욱) #1

안녕하세요? 제조업에서 전산부서로 근무하는 직원 입니다.
net-snmp를 이용한 네트워크 장치에서 oid를 이용하여 쿼링하는것을 성공하고…
이를 프로그램으로 만들려고 하는데 너무 힘드네요…ㅜㅜ
자바스크립트가 첨이라 그런지 너무 어렵습니다… 지금 3일째 막혀 있어…너무 답답해서 문의 드립니다.

우선 소스는 아래와 같습니다.

cmnty_string = “xxxxxxx”
var snmp = require (“net-snmp”);
var get_value_m = 0;
var options = {
port: 161,
retries: 2,
timeout: 5000,
transport: “udp4”,
trapPort: 162,
version: snmp.Version2c,
idBitsSize: 32
};
var session = snmp.createSession (“192.168.250.3”,cmnty_string,options);

var oids = [“1.3.6.1.4.1.6296.9.1.1.1.10.0”];
var get_value =
session.get (oids, function (error, varbinds) {
if (error) {
console.error (error);
} else {
for (var i = 0; i < varbinds.length; i++)
if (snmp.isVarbindError (varbinds[i]))
console.error (snmp.varbindError (varbinds[i]))
else
console.log (varbinds[i].value);
get_value_m = varbinds[i].value;
//return varbinds[i].value;

}
// If done, close the session
session.close ();

});

console.log (get_value_m); // 값을 확인하기 위해서 찍어보면 출력이 초기값으로 출력됨…


session.get <- 이 부분은 위에 모듈 불러온 net-snmp 모듈에 있는 메소드? 입니다.
var snmp = require (“net-snmp”); <<----

여튼 문제는 볼드한 부분인데요.
session.get에서 실행한 OID쿼리값이 varbind.value에 저장되어 있는데 이 지역변수가 전역변수
get_value_m에 들어가지가 않습니다. 초기값에 0으로 해놓았는데…계속 초기 값만 출력이 됩니다.
그래서 리턴으로 넘겨 볼려고 시도해 보았으나 역시 실패…

대체 왜 그런걸까요? 제가 대체 어느부분을 놓치고 있는건지 모르겠습니다… ㅜㅜ

참고로 해당 변수(varbind[i].value)를 직접 로그로 찍어보면 정상적으로 값이 나옵니다.

고수님들의 고견 부탁 드리겠습니다! 감사합니다.


(이종은(Jong Lee)) #2

session.get 함수는 비동기로 동작하기 때문에 콜백 함수를 넘겨서 결과를 파라미터로 받게 됩니다. 콜백은 바로 실행되는 것이 아니라 최소한 현재 콜스택이 완전히 비워진 다음에야 실행되기 때문에 callback으로 넘긴 함수의 코드보다 하단에 있는 console.log (get_value_m);가 먼저 실행됩니다.

javascript의 동기/비동기에 찾아보시면 도움이 되실 겁니다.

코드종의 다음 영상을 먼저 시청해보세요. :slight_smile:


(김동욱) #3

와~ 너무 감사 드립니다. 개념은 좀처럼 잡기가 힘든데 ㅎㅎ
사실 영상봐도 무슨 말씀인지 잘 모르겠지만…ㅜㅜ
더 공부해야 겠다라는 생각은 확 듭니다!!
감사합니다!!