 | |
ÀλýÀº ´ÙÀ½ µÎ°¡Áö·Î ¼º¸³µÈ´Ù. ÇÏ°í ½ÍÁö¸¸ ÇÒ ¼ö ¾ø´Ù. ÇÒ ¼ö ÀÖÁö¸¸ ÇÏ°í ½ÍÁö ¾Ê´Ù. - ±«Å× -
SNMPÀÀ¿ë ÇÁ·Î±×·¥ Á¦ÀÛ Posted on 2003/5/20
Topic: ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö
|
SNMP¸¦ ÀÌ¿ëÇÏ¸é ³×Æ®¿öÅ©¿Í ½Ã½ºÅÛ °ü¸®¸¦ À§ÇÑ À¯¿ëÇÑ Á¤º¸¸¦ ½±°Ô ¾ò¾î¿Ã ¼ö ÀÖ´Ù. À̹ø ±â»ç´Â SNMP¸¦ ÀÌ¿ëÇØ¼ ³×Æ®¿öÅ© Á¤º¸¸¦ ¾ò¾î¿À´Â ¹æ¹ýÀ» ¿¹Á¦¸¦ ÅëÇØ¼ Á¦½ÃÇϰíÀÖ´Ù.
SNMP ÇÁ·Î±×·¡¹Ö| 교정 과정 |
|---|
| 교정 0.8 | 2003³â 4¿ù 15ÀÏ 23½Ã | | | ÃÖÃÊ ¹®¼ÀÛ¼º |
Áö³¹ø ±â»ç¿¡¼ °£´ÜÇÏ°Ô SNMPÀÇ °³¿ä¿Í ¼³Ä¡¹× ¿î¿ë¹æ¹ý¿¡ ´ëÇØ¼
¾Ë¾Æº¸¾Ò´Ù. À̹ø¿¡´Â ½ÇÁ¦ SNMPÀÀ¿ëÇÁ·Î±×·¥, ´õ Á¤È®È÷ ¸»Çؼ
SNMP Manager¸¦ ÀÛ¼ºÇÏ´Â ³»¿ëÀ» ´Ù·ç°Ô µÈ´Ù.
ÀÌ °ÁÂÀÇ ³»¿ëÀº TutorialÇü½ÄÀ» µû¸£°Ô µÉ°ÍÀÌ´Ù. ¾îµð±îÁö³ª SNMP¸¦ ÀÀ¿ëÇØ¼
¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϴ°Ϳ¡ ÃÐÁ¡À» ¸ÂÃâ°ÍÀ̸ç, SNMPÇÁ·ÎÅäÄÝ Â÷¿øÀÇ »ó¼¼ÇÑ
³»¿ë¿¡ ´ëÇØ¼´Â ´Ù·çÁö ¾ÊÀ»°ÍÀÌ´Ù. ¾î¶µç ÀÌ ¹®¼¸¦ ÅëÇØ¼ SNMP¾ÖÇø®ÄÉÀ̼Ç
Á¦ÀÛÀÇ ±âº»ÀûÀÎ ¾ÆÀ̵ð¾î¸¦ ¾òÀ»¼ö ÀÖÀ»°ÍÀÌ´Ù.
¸ÕÀú Á¢±ÙÇÒ¼ö ÀÖ´Â SNMP agent°¡ ÁغñµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ÀÚ½ÅÀÇ È£½ºÆ®¿¡ ¼³Ä¡µÇ¾î
ÀÖ´Ù¸é Å×½ºÆ®ÇÏ±â ÆíÇϰÚÁö¸¸
, ÀÚ½ÅÀÇ È£½ºÆ®¿¡ ¼³Ä¡µÇ¾î ÀÖÁö ¾Ê´Ù°í ÇÏ´õ¶óµµ Á¢±ÙÇÒ¼ö ÀÖ´Â snmp agent°¡
¼³Ä¡µÈ È£½ºÆ®°¡ ÀÖÀ¸¸é °ü°è¾ø´Ù.
ÀÌÃ¥ÀÇ ¸ðµç ³»¿ëÀº
±âº»ÀûÀ¸·Î ucd snmp 4.x¸¦ ±âÁØÀ¸·Î ÀÛ¼ºµÇ¾îÀÖ´Ù.
ucd snmpÀÇ ¼³Ä¡¿Í ¿î¿µ¹æ¹ý¿¡ ´ëÇØ¼´Â SNMP°³¿ä¹× ¼³Ä¡,¿î¿ë±â»ç¸¦ Âü°íÇϱ⠹ٶõ´Ù.
¿©·¯ºÐÀÌ ucd snmp¸¦ ¼º°øÀûÀ¸·Î ¼³Ä¡Çß´Ù¸é, snmp°³¹ß ¶óÀ̺귯¸®¿Í Çì´õÆÄÀϵéÀÌ ¼³Ä¡µÉ
°ÍÀÌ´Ù. snmp¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µé±â À§Çؼ´Â ÀÌµé ¶óÀ̺귯¸®¿Í Çì´õÆÄÀÏÀÇ À§Ä¡¸¦ ¾Ë°í
ÀÖ¾î¾ß ÇÑ´Ù. ucd snmp¸¦ ÄÄÆÄÀÏÇÒ¶§, --prefix ¿É¼ÇÀ» »ç¿ëÇÏÁö ¾Ê¾Ò´Ù¸é,
±âº»¼³Ä¡µð·ºÅ丮ÀÎ /usr/loca/lib, /usr/local/include/ucd-snmp¿¡ ¼³Ä¡µÉ°ÍÀÌ´Ù.
°¢ÀÚ È®ÀÎÇØº¸±â ¹Ù¶õ´Ù.
¾Õ¼ ÀÌ ¹®¼´Â tutorialÇü½ÄÀ» µû¸¥´Ù°í ÇßÀ½À¸·Î,
¿ì¼± °£´ÜÇÑ ¿¹Á¦ÇÁ·Î±×·¥À» ¸¸µé¾îº¸°í, ¿¹Á¦ÇÁ·Î±×·¥À»
¼³¸íÇÏ´Â ½ÄÀ¸·Î snmpÇùֿ¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
¿ì¸®°¡ ¸¸µé°íÀÚ ÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀº ÀÎÀÚ·Î OID¸¦ ÁÖ¸é agent·Î ¿¬°áÇØ¼ OID¿¡ ´ëÇÑ
°ªÀ» °¡Á®¿À´Â ÇÁ·Î±×·¥À¸·Î °¡Àå´Ü¼øÇÏÁö¸¸ snmpÇùÖÀÇ ±âº»ÀûÀÎ °ñ°ÝÀ» °¡Áö°í ÀÖÀ½À¸·Î
ÀÌ ¿¹Á¦¸¦ Àß ÀÌÇØÇÏ°Ô µÇ¸é ´Ù¸¥ ÀÀ¿ëµµ °¡´ÉÇÒ°ÍÀÌ´Ù.
¿¹Á¦ : simple_snmp.cc
/*
* ÀÌ ¾ÖÇø®ÄÉÀ̼ÇÀº snmp1 snmp2¸¦ ±âÁØÀ¸·Î
* ÀÛ¼ºÇÑ´Ù.
* ucd-snmp Çì´õÆÄÀϵéÀ» ÀÎŬ·çµå ½ÃŲ´Ù.
* ¾Æ±Ô¸ÕÆ®·Î MIDÀ̸§ ȤÀº ´ëÀÀµÇ´Â OIDÀ̸§À» ÀԷ¹޴´Ù.
*/
#include <ucd-snmp/ucd-snmp-config.h>
#include <ucd-snmp/ucd-snmp-includes.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char **argv)
{
struct snmp_session session, *ss;
struct snmp_pdu *pdu;
struct snmp_pdu *response;
oid anOID[MAX_OID_LEN];
size_t anOID_len = MAX_OID_LEN;
struct variable_list *vars;
int status;
if (argc < 2)
{
printf("Usage : simple_snmp OID\");
exit(0);
}
/*
*/
init_snmp("snmpapp");
/*
* sessionÀ» ÃʱâÈ ÇÑ´Ù. ¿ì¸®´Â ¸¸µé¾îÁø ¼¼¼ÇÀ» ÀÌ¿ëÇØ¼
* ÇÊ¿äÇÑ ÀÛ¾÷À» ÇÏ°Ô µÈ´Ù.
* ¼¼¼ÇÀ» ¸¸µé±â À§Çؼ SNMP±âº»Á¤º¸ÀÎ,
* È£½ºÆ®À̸§, Ä¿¹Â´ÏÄÉÀ̼Ç, ¹öÁ¯Á¤º¸µéÀ» ÀÔ·ÂÇÑ´Ù.
*/
snmp_sess_init(&session);
session.peername = "localhost";
session.version = SNMP_VERSION_2c;
session.community = "public";
session.community_len = strlen(session.community);
/*
* À§ÀÇ ÃʱâÈ Á¤º¸¸¦ Åä´ë·Î
* ¼¼¼ÇÀ» ¿¬´Ù
*/
SOCK_STARTUP;
ss = snmp_open(&session);
if (!ss)
{
snmp_perror("ack");
exit(0);
}
/* ¿äûÀ» À§ÇÑ PDU¸¦ ¸¸µç´Ù.
* PDU¿¡ ´ëÇÑ ³»¿ëÀº ÀÌ¹Ì ¾ÕÀüÀÇ ±â»ç¿¡¼
* ¼³¸íÇßÀ½À¸·Î Âü°íÇϱ⠹ٶõ´Ù.
*/
pdu = snmp_pdu_create(SNMP_MSG_GET);
read_objid(argv[1], anOID, &anOID_len);
snmp_add_null_var(pdu, anOID, anOID_len);
/*
* ¸¸µé¾îÁø ¿äûÀ» º¸³½´Ù.
* ÇÔ¼öÀ̸§¿¡¼ ¾Ë¼ö ÀÖµíÀÌ µ¿±â¿äûÀÌ´Ù.
* Áï ÀÀ´äÀÌ ¿Ã¶§±îÁö ±â´Ù¸°´Ù.
* ¹°·Ð ºñµ¿±â ¿äûµµ ÀÖ´Ù.
* ÇØ´ç ¼¼¼ÇÀ¸·Î pdu¸¦ º¸³»°í response·Î ÀÀ´äÀ»
* ¹Þ¾Æ¿Â´Ù.
*/
status = snmp_synch_response(ss, pdu, &response);
/*
* ¸®ÅϰªÀÌ ³Ñ¾î¿Ô´Ù¸é..
* °ªÀ» °Ë»çÇÑ´Ù.
*/
if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR)
{
int count = 1;
/*
* Àоî¿Â Á¤º¸¸¦ ºÐ¼®Çؼ Ãâ·ÂÇÑ´Ù.
*/
for (vars = response->variables; vars; vars = vars->next_variable)
{
char *sp = (char *)malloc(1 + vars->val_len);
memcpy(sp, vars->val.string, vars->val_len);
sp[vars->val_len] = ' ';
/*
* µû·Î ¼³¸íÇҰǵ¥,
* ÀÀ´äÀº ÀÚ½ÅÀÇ °íÀ¯Å¸ÀÔÀ» °¡Áö°í ÀÖ´Ù.
* Áï ÀÏ¹Ý ½ºÆ®¸µÀÎÁö, ¼ýÀÚÀÎÁö, ½Ã°£°ü·ÃµÈ
* °ªÀÎÁö¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù.
* ±×·³À¸·Î ŸÀÔ¿¡ µû¶ó¼ 󸮹æ¹ýÀ» ´Þ¸®ÇØ¾ß ÇÑ´Ù.
*/
switch(vars->type)
{
case ASN_OCTET_STR:
{
printf("value #%d is a string: %s\", count++, sp);
break;
}
case ASN_GAUGE:
case ASN_COUNTER:
case ASN_TIMETICKS:
case ASN_INTEGER:
{
int a;
memcpy((void *)&a, sp, 4);
printf("value #%d is a INTEGER: %d\", count++, a);
break;
}
case ASN_IPADDRESS:
{
int a;
struct in_addr st_addr;
memcpy((void *)&a, sp, 4);
st_addr.s_addr = a;
printf("value #%d is a IPADDR: %s\", count++, inet_ntoa(st_addr));
break;
}
}
free(sp);
}
}
else
{
if (status == STAT_SUCCESS)
{
fprintf(stderr, "Err : %s\", snmp_errstring(response->errstat));
}
else
{
snmp_sess_perror("snmpget", ss);
}
}
if (response)
{
snmp_free_pdu(response);
}
snmp_close(ss);
}
|
ÄÚµåÀÚü¸¦ ÀÌÇØÇÏ´Â µ¥¿¡´Â º°¾î·Á¿òÀÌ ¾øÀ»°ÍÀÌ´Ù.
À§ÀÇ snmpÀÀ¿ë ¾ÖÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇÏ´Â ÀüÇüÀûÀÎ ¸ð½ÀÀ» º¸¿©ÁØ´Ù.
Áï °¡Á¤ ¸ÕÀú snmp agent(ÀÌÇÏ ¿¡ÀÌÀüÆ®)¿Í ¿¬°áÀ» ¸Î±â À§ÇÑ
¼¼¼ÇÃʱâÈ ÀÛ¾÷ À¸·Î ¿©±â¿¡´Â È£½ºÆ®À̸§°ú, Ä¿¹Â´ÏƼÀ̸§,
±×¸®°í SNMP¹öÁ¯Á¤º¸°¡ µé¾î°¡°Ô µÈ´Ù.
SNMP¹öÁ¯Àº ´ÙÀ½°ú °°ÀÌ ÁغñµÇ¾î ÀÖ´Ù.
표 1. SNMP ¹öÁ¯ Á¤ÀÇ »ó¼ö | SNMP_VERSION_1 | snmp ¹öÁ¯ 1 | | SNMP_VERSION_2c | snmp ¹öÁ¯ 2 | | SNMP_VERSION_2u | Á¤ÀǸ¸µÇ¾î ÀÖ°í »ç¿ëµÇ¾îÁöÁö´Â ¾Ê´Â´Ù. | | SNMP_VERSION_3 | snmp ¹öÁ¯ 3 |
¼¼¼ÇÀ» ¸Î°íÀÚ ÇÏ´Â ¿¡ÀÌÀüÆ®ÀÇ snmp ¹öÁ¯Áö¿ø¿©ºÎ¿Í ¾î´À ¹öÁ¯¿¡¼ Áö¿øÇÏ´Â
snmpÁ¤º¸¸¦ °¡Áö°í ¿Ã°ÍÀÎÁö¸¦ È®ÀÎÇØ¼ Àû´çÇÑ ¹öÁ¯À¸·Î ¼±ÅÃÇÏ¸é µÈ´Ù.
º¸Åë SNMP_VERSION_1 ȤÀº SNMP_VERSION_2c¸¦ »ç¿ëÇÏ¸é ¹®Á¦¾øÀ¸¸ç, SNMP_VERSION_2c¸¦
»ç¿ëÇÏ´Â°Ô °¡À幫³ÇÏ´Ù. snmp3¿¡¼ Æ÷ÇÔÇÏ´Â ´Ù¸¥±â´Éµé(º¸¾È¹®Á¦, ȤÀº È®ÀåµÈ
´Ù¸¥Á¤º¸µé)À» ÀÌ¿ëÇÏÁö ¾Ê´Â´Ù¸é SNMP_VERSION_2c¸¦ »ç¿ëÇϵµ·Ï ÇÏÀÚ.
snmp_sess_init()ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
À§¿¡¼ ¸¸µç ¼¼¼ÇÁ¤º¸¸¦ »ç¿ëÇØ¼ ¼¼¼ÇÀ» ¿¬´Ù(open).
snmp_open()ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
¿©·¯ºÐÀÌ ¿¡ÀÌÀüÆ®·Î ºÎÅÍ Á¤º¸¸¦ ¿äûÇϱâ À§Çؼ´Â
PDU¸¦ ÀÛ¼ºÇؾßÇÑ´Ù. PDU¿¡´Â ¿äûÇϰíÀÚ ÇÏ´Â Á¤º¸ÀÇ
OID, ¿äûÁ¾·ù(GET, GET NEXT, SETµî)¸¦
¸í½ÃÇØ¾ß¸¸ ÇÑ´Ù.
»ç¿ëµÇ´Â ÇÔ¼ö´Â snmp_pdu_create()¿Í read_objid()°¡ ÀÖ´Ù.
PDU¸¦ ÀÛ¼ºÇß´Ù¸é, ÀÌÁ¦ ¿¡ÀÌÀüÆ®Ãø¿¡ SNMP¿äû(ÆÐŶ)À» º¸³»¾ß ÇÒ°ÍÀÌ´Ù.
¿äûÀ» À§Çؼ snmp_synch_response()ÇÔ¼ö°¡ Á¦°øµÈ´Ù. À̰ÍÀº µ¿±âÀûÀÎ
¿äûÀ» À§Çؼ »ç¿ëÇÑ´Ù. ºñµ¿±âÀûÀ¸·Î ¿äûÇÒ¼öµµ Àִµ¥,
À̰ÍÀº µû·Î ¾ð±ÞÇϵµ·Ï ÇϰڴÙ.
ÀÀ´äÀÌ ¿Ô´Ù¸é ÀÀ´äµ¥ÀÌŸ¸¦ ºÐ¼®ÇØ¾ß ÇÒ°ÍÀÌ´Ù. ÀÀ´äµ¥ÀÌŸ´Â
snmp_pdu ±¸Á¶Ã¼ÇüÅ·Π³Ñ¾î¿À°Ô µÈ´Ù. ÀÀ´äµ¥ÀÌŸ¸¦ ºÐ¼®ÇÒ¶§
Áß¿äÇÑ °ÍÀº ¹Ù·Î µ¥ÀÌŸÀÇ Å¸ÀÔÁ¤º¸ÀÌ´Ù. snmpÁ¤º¸¸¦ º¸¸é
¾î¶²°ÍÀº ÀÏ¹Ý ¹®ÀÚ¿ÀÎ ¹Ý¸é ¾î¶²°ÍÀº ¼ýÀÚ, ȤÀº ½Ã°£µîÀÇ
Á¤º¸¸¦ °¡Áø´Ù. ÀÌÀÇ ±¸ºÐÀ» À§Çؼ snmp_pdu±¸Á¶Ã¼¿¡´Â ÇØ´ç µ¥ÀÌŸÀÇ
ŸÀÔÁ¤º¸¸¦ °¡Áö´Â º¯¼ö°¡ ÁöÁ¤µÇ¾î ÀÖ´Ù. ÁÖ·Î »ç¿ëµÇ¾îÁö´Â
µ¥ÀÌŸŸÀÔ¿¡´Â ´ÙÀ½°ú °°Àº°ÍµéÀÌ ÀÖ´Ù.
표 2. SNMP µ¥ÀÌŸ ŸÀÔ | ASN_OCTET_STR | ÀÏ¹Ý ¹®ÀÚ¿ | | ASN_GAUGE | unsigned 32bit int | | ASN_INTEGER | signed 32bit int | | ASN_IPADDRESS | 32bit ÀÎÅͳÝÁÖ¼Ò | | ASN_COUNTER | unsigned 32bit int | | ASN_TIMETICKS | unsigned 32bit int | | ASN_OID | OID ¹®ÀÚ¿ |
À§ÀÇ SNMPµ¥ÀÌŸ ŸÀÔÇ¥¿¡¼ ASN_TIMETICKSÀÇ °æ¿ì 1/100ÃÊ ´ÜÀ§ÀÌ´Ù. ¿¹¸¦ µé¾î
½Ã½ºÅÛÀÇ UpŸÀÓÀ» °¡Á®¿À±â À§Çؼ simp_snmp¸¦ ½ÇÇà½ÃÄ״µ¥, ´ÙÀ½°ú °°Àº
°á°ú°¡ ³ª¿ÔÀ» °æ¿ì
[root@localhost test]# ./snmp3 system.sysUpTime.0
value #1 is a INTEGER: 32172
|
321.72Ãʰ¡ µÈ´Ù.
ÀÌÁ¦ À§ÀÇ ¿¹Á¦ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ°í º»°ÝÀûÀÎ Å×½ºÆ® ÇØº¸µµ·Ï ÇÏÀÚ.
ÄÄÆÄÀÏÀº ´ÙÀ½°ú °°ÀÌ ÇϸéµÈ´Ù.
[root@localhost test]# gcc -o simple_snmp simple_snmp.c -I/usr/local/include/ucd-snmp -lsnmp -lcrypto
|
´ÙÀ½Àº Å×½ºÆ® °á°úÀÌ´Ù. Áß°£Áß°£¿¡ °á°ú¿¡ ´ëÇÑ ¼³¸íÀ» ´Þ¾Æ³õ¾ÒÀ¸´Ï
Âü°íÇϱ⠹ٶõ´Ù.
# ÀÎÅÍÆäÀ̽º ÁÖ¼Ò°¡Á®¿À±â
[root@localhost test]# ./simple_snmp ip.ipAddrTable.ipAddrEntry.ipAdEntAddr.192.168.100.130
value #1 is a IPADDR: 192.168.100.130
# 2¹ø ÀÎÅÍÆäÀ̽º(eth0)¿¡ ´ëÇÑ MTU»çÀÌÁî °¡Á®¿À±â
# .2 ´ë½Å¿¡ .1À» »ç¿ëÇÒ°æ¿ì 1¹ø ÀÎÅÍÆäÀ̽º(loopback)¿¡ ´ëÇÑ MTU»çÀÌÁ
# ¾ò¾î¿Ã¼ö ÀÖ´Ù.
[root@localhost test]# ./simple_snmp interfaces.ifTable.ifEntry.ifMtu.2
value #1 is a INTEGER: 1500
# 2¹ø ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ¹Ù±ùÀ¸·Î Àü¼ÛµÈ ÆÐŶÀÇ °¹¼ö
[root@localhost test]# ./simple_snmp interfaces.ifTable.ifEntry.ifOutOctets.2
value #1 is a INTEGER: 1192344
# ½Ã½ºÅÛºÎÆÃÈÄ °æ°ú½Ã°£
[root@localhost test]# ./simple_snmp system.sysUpTime.0
value #1 is a INTEGER: 166258
# 2¹ø ÀÎÅÍÆäÀ̽ºÀÇ ¼Óµµ
# 10Mbps ·£ÀÓÀ» ¾Ë¼ö ÀÖ´Ù.
[root@localhost test]# ./simple_snmp interfaces.ifTable.ifEntry.ifSpeed.2
value #1 is a INTEGER: 10000000
|
Å×½ºÆ®¸¦ À§Çؼ ¾î¶² MIB(OID)°¡ ÇÊ¿äÇÑÁö Àß ¸ð¸£°Ú´Ù¸é,
ucd-snmp¿¡¼ Á¦°øÇÏ´Â ¸Þ´ÏÀú ÇÁ·Î±×·¥Áß snmpwalk¸¦ ÀÌ¿ëÇØ¼
Á¤º¸¸¦ ¿äÃ»ÇØ¼ ÀÌ°É ÆÄÀϵîÀ¸·Î ÀúÀåÇÑÈÄ Âü°íÇÏ¸é µÈ´Ù.
[root@localhost test]# snmpwalk localhost public > snmp_info.dump
|
snmpwalk ´Â GET NEXT¸¦ ÀÌ¿ëÇϸç À§ÀÇ °æ¿ì MIBÀ̸§À» ÁöÁ¤ÇÏÁö ¾Ê¾ÒÀ½À¸·Î
root³ëµå¸¦ ÁöÁ¤Çß´Ù°í °£ÁÖÇÏ°í ¸ðµç MIBµ¥ÀÌŸ¸¦ ±Ü¾î¿Â´Ù.
¸¸¾à systemÇÏÀ§¿¡ ÀÖ´Â µ¥ÀÌŸµéÀ» ¿äûÇÑ´Ù¸é public ´ÙÀ½¿¡ systemÀ» ÁöÁ¤ÇØ
ÁÖ¸é µÉ°ÍÀÌ´Ù.
¸¸¾à ¿ÜºÎ·Î ³ª°¡´Â ÆÐŶÀÇ ¾ç(Æ®·¡ÇÈ)À» °Ë»çÇÏ±æ ¿øÇÑ´Ù¸é ÀÏÁ¤½Ã°£°£°ÝÀ¸·Î
"interfaces.ifTable.ifEntry.ifOutOctets.2" Á¤º¸¸¦ ¿äÃ»ÇØ¼ Åë°è¸¦ ³»¸é µÈ´Ù.
ÀÌ·±½ÄÀ¸·Î ÇØ¼ ÃÖ¼ÒÇÑÀÇ ³×Æ®¿öÅ© °ü¸®¸¦ À§ÇÑ Á¤º¸¼öÁýÀÌ °¡´ÉÇØ Áø´Ù.
¿ì¸®´Â 2.2절¿¡¼ snmpÀÀ¿ë ¾ÖÇø®ÄÉÀ̼ÇÀ» ¸¸µé±â À§ÇÑ ±âº»ÀûÀÎ
³»¿ëµé¿¡ ´ëÇØ¼ ¾Ë¾Æº¸¾Ò´Ù. À§¿¡¼ ¸¸µé¾îÁø ¿¹Á¦ÇÁ·Î±×·¥Àº µ¿±âÇü½ÄÀ» °¡Áø´Ù.
Áï ¿äûÀ» º¸³»°í ÀÀ´äÀÌ ÀÖÀ»¶§±îÁö ÇØ´ç¿µ¿ª¿¡¼ ºí·°Å·µÇ´Âµ¥, ÀÌ·¯ÇÑ ¸ðµ¨Àº
´ÜÁö ¸î°³ÀÇ ¿¡ÀÌÀüÆ®·Î ºÎÅÍ µ¥ÀÌŸ¸¦ ¹ÞÀ» °æ¿ì ¹®Á¦°¡ ¾øÁö¸¸,
¿©·¯°³ÀÇ ¿¡ÀÌÀüÆ®·ÎºÎÅÍ µ¥ÀÌŸ¸¦ ¹ÞÀ» °æ¿ì ¹®Á¦ÀÇ ¼ÒÁö°¡ ÀÖ´Ù. NMSÀÇ Æ¯¼º»ó
´Ù¼öÀÇ ¿¡ÀÌÀüÆ®¸¦ ÇϳªÀÇ ¸Þ´ÏÀú¿¡¼ °ü¸®ÇؾßÇÏ´Â °æ¿ì°¡ ¸¹À½À¸·Î
µ¿±â¸ðµ¨·Î ¸Þ´ÏÀúÇÁ·Î±×·¥À» ¸¸µå´Â°ÍÀº ¾Æ¹«·¡µµ ¹®Á¦°¡ À־ÀδÙ.
ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ÇØ°áÀ» À§Çؼ ucd-snmp´Â ºñµ¿±â¸ðµ¨·Î ¸Þ´ÏÀú¸¦ ÀÛ¼ºÇÒ¼ö ÀÖµµ·Ï
¹æ¹ýÀ» Á¦°øÇϰí ÀÖ´Ù. ¾ð¶æ »ý°¢Çصµ udp¸¦ »ç¿ëÇÏ´Â snmp¿¡´Â ºñµ¿±â¸ðµ¨ÀÇ
¾îÇø®ÄÉÀ̼ÇÀÌ ´õ ¾î¿ï¸±°Å¶ó°í »ý°¢ÇÒ¼ö ÀÖ´Ù.
´ÙÀ½Àº ¿¹Á¦ÀÌ´Ù. Ưº°È÷ ¾î·Á¿öº¸ÀÌ´Â °Ç ¾øÀ»°ÍÀÌ´Ù. ³»¿ë¿¡ ´ëÇÑ ¼³¸íÀº ÁÖ¼®À¸·Î
´ë½ÅÇÑ´Ù.
asynch_snmp.c
#include <ucd-snmp/ucd-snmp-config.h>
#include <ucd-snmp/ucd-snmp-includes.h>
#include <stdio.h>
/*
* ¿¡ÀÌÀüÆ® È£½ºÆ® Á¤º¸
* È£½ºÆ® À̸§°ú Ä¿¹Â´ÏƼ À̸§À» Á¤ÀÇÇÑ´Ù.
*/
struct host
{
const char *name;
const char *community;
} hosts[] =
{
{"localhost", "public"},
{NULL}
};
/*
* °¡Á®¿À°íÀÚ ÇÏ´Â oid¸¦ Á¤ÀÇ ÇÑ´Ù.
* ¿©±â¿¡¼´Â ½Ã½ºÅÛ uptime°ú,
* eth0ÀÇ ½ºÇǵå(10Mbps)
* ¿ÜºÎ·Î ³ª°£ ÆÐŶÀÇ °¹¼ö¸¦ ¾ò¾î¿À±â À§ÇÑ oid¸¦ Á¤ÀÇ Çß´Ù.
*/
struct oid
{
const char *name;
oid Oid[MAX_OID_LEN];
int OidLen;
} oids[] =
{
{"system.sysUpTime.0"},
{"interfaces.ifTable.ifEntry.ifSpeed.2"},
{"interfaces.ifTable.ifEntry.ifOutOctets.2"},
{NULL}
};
/*
* snmp ÃʱâÈ
* snmp¸¦ ÃʱâÈ Çϰí
* oidÀ̸§À» ÀоîµéÀδÙ.
* ¸¸¾à oidÀ̸§¿¡ ¹®Á¦°¡ ÀÖ´Ù¸é ¿À·ù¸¦ ¹ß»ý½Ãų °ÍÀÌ´Ù.
*/
void initialize(void)
{
struct oid *op = oids;
init_snmp("asynchapp");
while(op->name)
{
op->OidLen = sizeof(op->Oid)/sizeof(op->Oid[0]);
if (!read_objid(op->name, op->Oid, &op->OidLen))
{
snmp_perror("read_objid");
exit(1);
}
op++;
}
}
/*
* ¿¡ÀÌÀüÆ®·Î ºÎÅÍ ³Ñ¾î¿Â °ªÀ» Ãâ·ÂÇÑ´Ù.
*/
int print_result(int status,
struct snmp_session *sp,
struct snmp_pdu *pdu)
{
char buf[1024];
struct variable_list *vp;
int ix;
struct timeval now;
struct timezone tz;
struct tm *tm;
/*
* ÃÖ±ÙÀÇ ÇÁ·Î±×·¥µéÀº
* timeÇÔ¼ö gettimeofday¸¦ ¼±È£ÇÑ´Ù.
*/
gettimeofday(&now, &tz);
tm = localtime(&now.tv_sec);
fprintf(stdout, "%.2d:%.2d:%.2d.%.6d ",
tm->tm_hour, tm->tm_min, tm->tm_sec,
now.tv_usec);
switch(status)
{
/*
* ¿¡ÀÌÀüÆ®·ÎºÎÅÍ ³Ñ¾î¿Â °ªÀ» Ãâ·ÂÇÑ´Ù.
*/
case STAT_SUCCESS:
vp = pdu->variables;
if (pdu->errstat == SNMP_ERR_NOERROR)
{
while(vp)
{
snprint_variable(buf, sizeof(buf),
vp->name, vp->name_length, vp);
fprintf(stdout, "%s: %s\", sp->peername, buf);
vp = vp->next_variable;
}
}
else
{
printf("error\");
}
return 1;
/*
* ³×Æ®¿öũȤÀº ´Ù¸¥ ¹®Á¦·Î ¿¡ÀÌÀüÆ®·Î ºÎÅÍ ÀÀ´äÀÌ
* ¹ß»ýÇÏÁö ¾Ê¾ÒÀ»°æ¿ì
*/
case STAT_TIMEOUT:
fprintf(stdout, "%s: Timeout\", sp->peername);
return 0;
case STAT_ERROR:
snmp_perror(sp->peername);
return 0;
}
return 0;
}
/*
* snmp oid ¼¼¼ÇÀ» ¸¸µç´Ù. Å©±â´Â ¿¡ÀÌÀüÆ®ÀÇ °¹¼ö¸¸ÅÀÌ´Ù.
*/
struct session
{
struct snmp_session *sess;
struct oid *current_oid;
} sessions[sizeof(hosts)/sizeof(hosts[0])];
int active_hosts;
/*
* ¿¡ÀÌÀüÆ®·ÎºÎÅÍÀÇ ºñµ¿±â ÀÀ´äÀ» ¹Þ¾ÒÀ»°æ¿ì
* À̸¦ ó¸®ÇÑ´Ù.
* °á°ú°¡ ³Ñ¾î¿Â´Ù¸é print_resultÇÔ¼ö¸¦ È£ÃâÇØ¼
* °á°ú¸¦ Ãâ·ÂÇÑ´Ù.
* ÀÌ ÇÔ¼ö´Â callbackÇü½ÄÀ¸·Î È£ÃâµÇ´Âµ¥,
* Áï ÀÓÀÇÀÇ ¿¡ÀÌÀüÆ®·ÎºÎÅÍ µ¥ÀÌŸÀÔ·ÂÀÌ ÀÖÀ»°æ¿ì È£ÃâµÇ´Â Çü½ÄÀÌ´Ù.
*/
int asynch_response(int operation, struct snmp_session *sp,
int reqid, struct snmp_pdu *pdu, void *magic)
{
struct session *host = (struct session *)magic;
struct snmp_pdu *req;
/*
* ¸¸¾à operationÀÌ µ¥ÀÌŸ ¹ÞÀ½À̶ó¸é
* print_result¸¦ È£ÃâÇØ¼ µ¥ÀÌŸ¸¦ Ãâ·ÂÇÑ´Ù.
*/
if (operation == RECEIVED_MESSAGE)
{
if (print_result(STAT_SUCCESS, host->sess, pdu))
{
host->current_oid++;
if (host->current_oid->name)
{
req = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(req, host->current_oid->Oid,
host->current_oid->OidLen);
if (snmp_send(host->sess, req))
{
return 1;
}
else
{
snmp_perror("snmp_send");
snmp_free_pdu(req);
}
}
}
}
else
{
print_result(STAT_TIMEOUT, host->sess, pdu);
}
active_hosts--;
return 1;
}
/*
* snmp sessionÀ» ¸¸µé°í
* ºñµ¿±â·Î °á°ú¸¦ ¹Þ±â À§Çؼ callback ÇÔ¼ö¸¦ µî·Ï½ÃŲ´Ù.
*/
void asynchronous(void)
{
struct session *hs;
struct host *hp;
for (hs = sessions, hp = hosts; hp->name; hs++, hp++)
{
/*
* ¿©±â´Â µ¿±âÇü½Ä°ú ¸¶Âù°¡Áö·Î ´ÜÁö snmp¼¼¼ÇÀ»
* ¸¸µé±â À§ÇÑ Á¤º¸¸¦ ÀÔ·ÂÇÑ´Ù.
*/
struct snmp_pdu *req;
struct snmp_session sess;
snmp_sess_init(&sess);
sess.version = SNMP_VERSION_2c;
sess.peername = strdup(hp->name);
sess.community = strdup(hp->community);
sess.community_len = strlen(sess.community);
// ¹Ù·Î ¿©±â callback ÇÔ¼ö¸¦ µî·ÏÇÑ´Ù.
sess.callback = asynch_response;
sess.callback_magic = hs;
if (!(hs->sess = snmp_open(&sess)))
{
snmp_perror("snmp_open");
continue;
}
hs->current_oid = oids;
req = snmp_pdu_create(SNMP_MSG_GET);
snmp_add_null_var(req, hs->current_oid->Oid, hs->current_oid->OidLen);
/*
* ºñµ¿±âÀ̱⠶§¹®¿¡ snmpµ¥ÀÌŸ¸¦ º¸³»°í..
* ÀÀ´äÀ» ±â´Ù¸®±â À§Çؼ ºí·°µÇÁö ¾Êµµ·Ï ÇÑ´Ù.
*/
if (snmp_send(hs->sess, req))
{
active_hosts++;
}
else
{
snmp_perror("snmp_send");
snmp_free_pdu(req);
}
}
/*
* ºñµ¿±â µ¥ÀÌŸ ÀÔ·ÂÀ» È®ÀÎÇϱâ À§Çؼ
* select¸¦ ÀÌ¿ëÇÑ´Ù.
* È£½ºÆ®ÀÇ °¹¼ö¸¸Æ´À» select¸¦ ÅëÇØ ±â´Ù¸°´Ù.
*/
while(active_hosts)
{
int fds = 0, block = 1;
fd_set fdset;
struct timeval timeout;
FD_ZERO(&fdset);
snmp_select_info(&fds, &fdset, &timeout, &block);
fds = select(fds, &fdset, NULL, NULL, block ? NULL : &timeout);
if (fds)
{
snmp_read(&fdset);
}
else
{
snmp_timeout();
}
}
for (hp = hosts, hs = sessions; hp->name; hs++, hp++)
{
if(hs->sess) snmp_close(hs->sess);
}
}
int main()
{
initialize();
asynchronous();
}
|
¿©·¯°³ÀÇ ¿¡ÀÌÀüÆ®¸¦ µî·Ï½ÃÄѼ Å×½ºÆ®ÇÒ¼ö ÀÖ¾úÀ¸¸é ÇßÀ¸³ª »ç¿ëÇÒ ¿¡ÀÌÀüÆ®°¡ ÇÑÁ¤µÈ
°ü°è·Î ÇϳªÀÇ ¿¡ÀÌÀüÆ®¸¸À» µî·Ï½ÃÄѼ Å×½ºÆ®Çß´Ù. ´ÙÀ½Àº Å×½ºÆ® °á°úÀÌ´Ù.
¸¸¾à ¿¡ÀÌÀüÆ®°¡ ½ÇÇàÁßÀÌÁö ¾Ê´Ù¸é ŸÀӾƿô ¿¡·¯°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù.
[root@localhost c_source]# ./snmp_as
23:54:48.463404 localhost: Timeout
|
¿¡ÀÌÀüÆ®°¡ ½ÇÇàÁßÀ̶ó¸é °ªÀ» °¡Á®¿À°Ô µÉ°ÍÀÌ´Ù.
[root@localhost c_source]# ./snmp_as
23:55:55.536827 localhost: system.sysUpTime.0 = Timeticks: (6401) 0:01:04.01
23:55:55.539176 localhost: interfaces.ifTable.ifEntry.ifSpeed.2 = Gauge32: 10000000
23:55:55.540540 localhost: interfaces.ifTable.ifEntry.ifOutOctets.2 = Counter32: 4236
|
ÀÌ»ó snmpµ¥ÀÌŸ¸¦ °¡Á®¿À±â À§ÇÑ ¸î°¡Áö ¹æ¾Èµé¿¡ ´ëÇØ¼ ¾Ë¾Æº¸¾Ò´Ù. ¿©±â¿¡¼´Â
´ÜÁö GET¸Þ¼µå¿¡ ´ëÇÑ ³»¿ë¸¸ ´Ù·ç°í Àִµ¥ GET NEXT´Â ´ÙÀ½¹ø¿¡ º°µµ·Î ´Ù·çµµ·Ï
ÇÒ°ÍÀÌ´Ù.
|
|
|
|