system_mib.c
上传用户:cxs890
上传日期:2021-05-22
资源大小:347k
文件大小:9k
源码类别:

SNMP编程

开发平台:

C/C++

  1. /*
  2.  *  System MIB group implementation - system.c
  3.  *
  4.  */
  5. #include <ctype.h>
  6. #include <config.h>
  7. #if HAVE_STDLIB_H
  8. #include <stdlib.h>
  9. #endif
  10. #ifdef HAVE_UNISTD_H
  11. #include <unistd.h>
  12. #endif
  13. #if HAVE_STRING_H
  14. #include <string.h>
  15. #else
  16. #include <strings.h>
  17. #endif
  18. #if HAVE_WINSOCK_H
  19. #ifdef OS_VXWORKS
  20. #include <sys/times.h>
  21. #endif
  22. #include <ip/socket.h>
  23. #endif
  24. #ifdef HAVE_SYS_TIME_H
  25. #include <time.h>
  26. #endif
  27. #if HAVE_UTSNAME_H
  28. #include <utsname.h>
  29. #else
  30. #if HAVE_SYS_UTSNAME_H
  31. #include <sys/utsname.h>
  32. #endif
  33. #endif
  34. #if HAVE_NETINET_IN_H
  35. #include <netinet/in.h>
  36. #endif
  37. #include <libres/resource.h>
  38. #if HAVE_DMALLOC_H
  39. #include <dmalloc.h>
  40. #endif
  41. #include "asn1.h"
  42. #include "config_struct.h"
  43. #include "mibincl.h"
  44. #include "system_mib.h"
  45. #include "../struct.h"
  46. #include "../util_funcs.h"
  47. #include "read_config.h"
  48. #include "agent_read_config.h"
  49. #include "system.h"
  50. #include "sysORTable.h"
  51. #include "assert.h"
  52. #ifdef SWITCH
  53. #include <sys_conf.h> /* for hostname */
  54. #include <bspfuncs.h> /* for get_sys_info() */
  55. #endif
  56. /*********************
  57.  *
  58.  *  Kernel & interface information,
  59.  *   and internal forward declarations
  60.  *
  61.  *********************/
  62. static u_char *sysContact;
  63. static u_char *sysName;
  64. static u_char *sysLocation;
  65. static int writeSystem (int, u_char *,u_char, int, u_char *,oid*, int);
  66. #ifndef SWITCH
  67. int header_system (struct variable *,oid *, int *, int, int *, WriteMethod **write_method);
  68. extern unsigned long get_sys_info(unsigned char* output_buf,unsigned long buf_len);/*** sun define 2000.07.28 ***/
  69. static char old_sys_version[128];
  70. #endif
  71. static char old_sys_contact[SNMP_MAX_SYSCON_LEN];
  72. static char old_sys_location[SNMP_MAX_SYSLOC_LEN];
  73. static char old_host_name[HOSTNAME_MAX_LEN];
  74. /*** sun define 2000.03.14 ***/
  75. struct variable2 system_variables[] = {
  76.     {SYSDESCR, ASN_OCTET_STR, RONLY, var_system, 1, {SYSDESCR}},
  77.     {SYSOBJECTID, ASN_OBJECT_ID, RONLY, var_system, 1, {SYSOBJECTID}},
  78.     {SYSUPTIME, ASN_TIMETICKS, RONLY, var_system, 1, {SYSUPTIME}},
  79.     {SYSCONTACT, ASN_OCTET_STR, RWRITE, var_system, 1, {SYSCONTACT}},
  80.     {SYSNAME, ASN_OCTET_STR, RWRITE, var_system, 1, {SYSNAME}},
  81.     {SYSLOCATION, ASN_OCTET_STR, RWRITE, var_system, 1, {SYSLOCATION}},
  82.     {SYSSERVICES, ASN_INTEGER, RONLY, var_system, 1, {SYSSERVICES}}
  83. };
  84. /* Define the OID pointer to the top of the mib tree that we're
  85.    registering underneath */
  86. oid system_variables_oid[] ={ MIB, 1 };
  87. void init_system_mib(void)
  88. {
  89.   /* register ourselves with the agent to handle our mib tree */
  90.   REGISTER_MIB("mibII/system", system_variables, variable2, 
  91.                system_variables_oid);
  92. }
  93. /*********************
  94.  *
  95.  *  Initialisation & common implementation functions
  96.  *
  97.  *********************/
  98. void init_mib_system()
  99. {
  100. int rc;
  101. SNMP_DEBUG_ROUTINES("init_mib_system()");
  102. sysContact  = snmp_para.syscontact;
  103. rc = resource_read (RESOURCE_TYPE_HOSTNAME, RESOURCE_INDEX_TYPE_NONE, 
  104. NULL,(unsigned long)&sysName, 0, 0, 0);
  105. if (!rc) {
  106. /* get the pointer to hostname here. */
  107. }
  108. sysLocation = snmp_para.syslocation;
  109. }
  110. #define SNMP_SERVICE_BITMASK_PHY 0x01
  111. #define SNMP_SERVICE_BITMASK_DL 0x02
  112. #define SNMP_SERVICE_BITMASK_INET 0x04
  113. #define SNMP_SERVICE_BITMASK_E2E 0x08
  114. #define SNMP_SERVICE_BITMASK_APP 0x40
  115. #define SNMP_SERVICE_BITS 0
  116. /*根据产品不同设置成不同的值*/
  117. #ifdef SWITCH
  118. #ifdef L2SWITCH
  119. #undef SNMP_SERVICE_BITS
  120. #define SNMP_SERVICE_BITS SNMP_SERVICE_BITMASK_DL
  121. #else
  122. #undef SNMP_SERVICE_BITS
  123. #define SNMP_SERVICE_BITS SNMP_SERVICE_BITMASK_DL|SNMP_SERVICE_BITMASK_INET
  124. #endif
  125. #else
  126. /*router*/
  127. #undef SNMP_SERVICE_BITS
  128. #define SNMP_SERVICE_BITS SNMP_SERVICE_BITMASK_DL|SNMP_SERVICE_BITMASK_INET|SNMP_SERVICE_BITMASK_E2E|SNMP_SERVICE_BITMASK_APP
  129. #endif
  130. /*********************
  131.  *
  132.  *  System specific implementation functions
  133.  * (actually common!)
  134.  *
  135.  *********************/
  136. u_char *
  137. var_system(struct variable *vp,
  138.    oid *name,
  139.    int *length,
  140.    int exact,
  141.    int *var_len,
  142.    WriteMethod **write_method)
  143. {
  144. static u_char sys_desc[SNMP_MAX_DESCR_LEN+1];
  145. u_char *p_char;
  146. SNMP_DEBUG_ROUTINES("var_system()");
  147.      if (header_generic(vp, name, length, exact, var_len, write_method) == MATCH_FAILED )
  148. return NULL;
  149. switch (vp->magic)
  150. {
  151. case SYSDESCR:
  152.      *var_len = strlen(version_descr);
  153.      /*RFC规定这个值  SIZE ( 0 .. 255  ),  现在超出255 */
  154.      if (*var_len > SNMP_MAX_DESCR_LEN)
  155.      {
  156. p_char = (u_char *)&sys_desc;
  157. strncpy(p_char, version_descr, SNMP_MAX_DESCR_LEN);
  158. *var_len = SNMP_MAX_DESCR_LEN;
  159. return (u_char *)p_char;
  160.      }
  161.      return (u_char *)version_descr;
  162. case SYSOBJECTID:
  163. {
  164. int i = sizeof(oid)*default_enterprise_len;
  165. #if 0
  166. /*Some NMS(nateks,Nov 5,2007) doesn't work with OID followed by ".0" which is necessary for BD-NMS!!!*/
  167. int j;
  168. for(j = sizeof(default_enterprise) / sizeof(default_enterprise[0]) - 1; j > 0; j--)
  169. {
  170. if (default_enterprise[j] == 0)
  171. i -= sizeof(default_enterprise[0]);
  172. else
  173. break;
  174. }
  175. #endif
  176. *var_len = i;
  177. return (u_char *)default_enterprise;
  178. }
  179. case SYSUPTIME:
  180. long_return = get_uptime();
  181. return ((u_char *) &long_return);
  182. case SYSCONTACT:
  183. *write_method = writeSystem;
  184. if (snmp_para.syscontact[0])
  185. {
  186. *var_len = strlen(snmp_para.syscontact);
  187. return (u_char *)(snmp_para.syscontact);
  188. }
  189. else
  190. {
  191. *var_len = strlen(def_syscontact);
  192. return (u_char *)(def_syscontact);
  193. }
  194. case SYSNAME:
  195. *var_len = strlen(sysName);
  196. *write_method = writeSystem;
  197. return (u_char *)sysName;
  198. case SYSLOCATION:
  199. if (snmp_para.syslocation[0])
  200. p_char =  snmp_para.syslocation;
  201. else
  202. p_char = def_syslocation;
  203. *var_len = strlen(p_char);
  204. *write_method = writeSystem;
  205. return (u_char *)(p_char);
  206. case SYSSERVICES:
  207. long_return = SNMP_SERVICE_BITS;
  208. return (u_char *)&long_return;
  209. default:
  210. ERROR_MSG("");
  211. }
  212. return NULL;
  213. }
  214. static int
  215. writeSystem(
  216.    int      action,
  217.    u_char   *var_val,
  218.    u_char   var_val_type,
  219.    int      var_val_len,
  220.    u_char   *statP,
  221.    oid      *name,
  222.    int      name_len)
  223. {
  224.     u_char buf[sizeof(version_descr)], *cp;
  225.     int count, size;
  226.     long rc;
  227.     char hostname[64];
  228. size = sizeof(buf);
  229. size = size > var_val_len?var_val_len:size;
  230. strncpy (buf, var_val, size);
  231. for(cp = var_val, count = 0; count < var_val_len; count++, cp++){
  232. if (!isprint(*cp)){
  233. if(SNMP_TRACE(SNMP_DEBUG_EVENT))
  234. snmp_trace("not print %xn", *cp);
  235. return SNMP_ERR_WRONGVALUE;
  236. }
  237. }
  238.     buf[size] = 0;
  239.     switch (action){
  240. case RESERVE1:
  241. SNMP_DEBUG_ROUTINES("writeSystem()");
  242. if (var_val_type != ASN_OCTET_STR){
  243. if(SNMP_TRACE(SNMP_DEBUG_EVENT))
  244. snmp_trace("not stringn");
  245. return SNMP_ERR_WRONGTYPE;
  246. }
  247. switch((char)name[7]){
  248.   case SYSCONTACT:
  249. if (var_val_len > SNMP_MAX_SYSCON_LEN-1){
  250. if(SNMP_TRACE(SNMP_DEBUG_EVENT))
  251. snmp_trace("bad lengthn");
  252. return SNMP_ERR_WRONGLENGTH;
  253. }
  254. break;
  255.   case SYSNAME:
  256. if (var_val_len > MAX_NAME_LEN-1){
  257. if(SNMP_TRACE(SNMP_DEBUG_EVENT))
  258. snmp_trace("bad lengthn");
  259. return SNMP_ERR_WRONGLENGTH;
  260. }
  261. break;
  262.   case SYSLOCATION:
  263. if (var_val_len > SNMP_MAX_SYSLOC_LEN-1){
  264. if(SNMP_TRACE(SNMP_DEBUG_EVENT))
  265. snmp_trace("bad lengthn");
  266. return SNMP_ERR_WRONGLENGTH;
  267. }
  268. break;
  269. }
  270. /** old 
  271. if (var_val_len > sizeof(version_descr)-1){
  272. snmp_trace("bad lengthn");
  273. return SNMP_ERR_WRONGLENGTH;
  274. }
  275. **/
  276. break;
  277. case RESERVE2:
  278. break;
  279. case ACTION:
  280. switch((char)name[7]){
  281.   case SYSCONTACT:
  282. strncpy (old_sys_contact, sysContact, SNMP_MAX_SYSCON_LEN - 1);
  283. old_sys_contact[SNMP_MAX_SYSCON_LEN - 1] ='';
  284. strcpy(sysContact, (char *) buf);
  285. break;
  286.   case SYSNAME:
  287. strncpy (old_host_name, sysContact, HOSTNAME_MAX_LEN);
  288. old_host_name[HOSTNAME_MAX_LEN - 1] ='';
  289. strncpy(hostname, (char *) buf, HOSTNAME_MAX_LEN);
  290. hostname[HOSTNAME_MAX_LEN - 1]='';
  291. rc = resource_write (RESOURCE_TYPE_HOSTNAME, RESOURCE_INDEX_TYPE_NONE, NULL, (UINT32)hostname, 0, 0, 0);
  292. if (rc != 0)
  293. return SNMP_ERR_RESOURCEUNAVAILABLE;
  294. break;
  295.   case SYSLOCATION:
  296. strncpy (old_sys_location, sysContact, SNMP_MAX_SYSLOC_LEN - 1);
  297. old_sys_location[SNMP_MAX_SYSLOC_LEN - 1] ='';
  298. strcpy(sysLocation, (char *) buf);
  299. break;
  300.   default:
  301. break;
  302. }
  303. break;
  304. case UNDO:
  305. switch((char)name[7]){
  306.   case SYSCONTACT:
  307. strcpy(sysContact, old_sys_contact);
  308. break;
  309.   case SYSNAME:
  310. strncpy(hostname, (char *) old_host_name, HOSTNAME_MAX_LEN);
  311. hostname[HOSTNAME_MAX_LEN - 1]='';
  312. rc = resource_write (RESOURCE_TYPE_HOSTNAME, RESOURCE_INDEX_TYPE_NONE, NULL, (UINT32)hostname, 0, 0, 0);
  313. if (rc != 0)
  314. return SNMP_ERR_UNDOFAILED;
  315. break;
  316.   case SYSLOCATION:
  317. strcpy(sysLocation, (char *) old_sys_location);
  318. break;
  319.   default:
  320. break;
  321. }
  322. break;
  323. case COMMIT:
  324. break;
  325. case ACTION_FREE:
  326. break;
  327. default:
  328. break;
  329.     }
  330.     return SNMP_ERR_NOERROR;
  331. } /* end of writeSystem */
  332. /*********************
  333.  *
  334.  *  Internal implementation functions - None
  335.  *
  336.  *********************/
  337. void hostname_callback (RESOURCE_ID id, unsigned long arg1, unsigned long arg2, unsigned long param1, unsigned long param2)
  338. {
  339. sysName =(char *)param1;
  340. return ;
  341. }
  342. long snmp_get_sysUpTime(void)
  343. {
  344.     return get_uptime();
  345. }