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

SNMP编程

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #include <sys/types.h>
  6. #include <libsys/misc.h>
  7. #include <ctype.h>
  8. #ifdef SWITCH
  9. #include <libvty/vty.h>
  10. #endif
  11. #include <libcmd/cmdparse.h>
  12. #include <libcmd/cmderror.h>
  13. #include <libcmd/argparse.h>
  14. #ifndef SWITCH
  15. #include <libcmd/cmdiface.h>
  16. #endif
  17. #include <ip/socket.h>
  18. #include <ip/netdb.h>
  19. #include <ip/inet.h>
  20. #ifdef SWITCH
  21. #include <ip/ip_misc.h>
  22. #endif
  23. #include <libsys/memory.h>
  24. #include <ip/ip_externs.h>
  25. #include "config.h"
  26. #include "types.h"
  27. #include "asn1.h"
  28. #include "snmp_vars.h"
  29. #include "config_struct.h"
  30. #include "snmp_command.h"
  31. #include "view.h"
  32. #include "mib.h"
  33. #include "snmp_debug.h"
  34. #include "agent_trap.h"
  35. /*** sun define for snmp trap-timeout ,because i move structure trap_sink to snmpd.h 2000.03.21 ***/
  36. #include "snmpd.h"
  37. #include "snmp_api.h"
  38. #include "vacm.h"
  39. #include "snmp.h"
  40. #include <snmp/snmp_util.h>
  41. /*#include "snmp_util.h"*/
  42. #include <snmplib/transform_oids.h>
  43. #include <snmplib/tools.h>
  44. #include <snmplib/callback.h>
  45. #include <snmplib/snmpusm.h>
  46. #include <snmplib/snmp-tc.h>
  47. #include <snmplib/snmpv3.h>
  48. #include <snmplib/keytools.h>
  49. #include <snmplib/scapi.h>
  50. #ifdef OS_VXWORKS
  51. extern int32 set_trace_flag(MODULE_TYPE module, uint32 debug_flag, void (*show_debug)(uint32), void (*no_debug)(), uint8 bStatus);
  52. #endif
  53. /*added by sxf*/
  54. /*in vacm_vars.c*/
  55. extern void vacm_parse_security (const char *, char *);
  56. extern void vacm_parse_group (const char *, char *);
  57. extern void vacm_parse_access (const char *, char *);
  58. extern void vacm_parse_view (const char *, char *);
  59. extern BOOL vacm_walkThrSecEntry (void (*thrMethod)(struct vacm_securityEntry*));
  60. extern struct vacm_securityEntry *vacm_FindSecEntryByCommName (char *);
  61. extern void vacm_DestroyCommunity (char*);
  62. extern void vacm_DestroyCommunityAll (void);
  63. extern int createV1TrapSession (char *sink,char * com,unsigned short trapflags, char *vrfname);
  64. extern void set_trapsinks(int cmd,long long value);
  65. extern u_char * translate_objid(u_char *buf);
  66. extern char *snmp_ntoa (long );
  67. /*in vacm.c*/
  68. BOOL vacm_walkThrViewEntry (void (*thrMethod)(struct vacm_viewEntry*));
  69. /*in agent_registry.c*/
  70. BOOL ReadObjidFromSubtree (char *str, oid name[], int *name_len);
  71. /*** sun define end ***/
  72. static int dosnmp_community(int argc,char *argv[],struct user *u);
  73. #ifdef INCLUDE_SNMPV3
  74. static int dosnmp_group(int argc,char *argv[],struct user *u);
  75. static int dosnmp_user(int argc,char *argv[],struct user *u);
  76. #endif
  77. extern int delete_v1_trap_session(char *peer, char *community);
  78. long snmp_showrunning(DEVICE_ID diID);
  79. static int dosnmp_contact(int argc,char *argv[],struct user *u);
  80. #if 0
  81. static int dosnmp_contact_name(int argc,char *argv[],struct user *u);
  82. #endif
  83. void display_snmp_contact(void);
  84. static int dosnmp_location(int argc,char *argv[],struct user *u);
  85. static int dosnmp_location_name(int argc,char *argv[],struct user *u);
  86. void display_snmp_location(void);
  87. static int dosnmp_packetsize(int argc,char *argv[],struct user *u);
  88. static int dosnmp_queuelen(int argc,char *argv[],struct user *u);
  89. static int dosnmp_trap_source(int argc,char *argv[],struct user *u);
  90. static int dosnmp_trap_timeout(int argc,char *argv[],struct user *u);
  91. static int dosnmp_host(int argc,char *argv[],struct user *u);
  92.  /*** sun define 2000.03.16 ***/
  93. static int dosnmp_view(int argc,char *argv[],struct user *u);
  94. /*** sun define 2000.03.19 ***/
  95. static int dosnmp_trace(int argc,char *argv[],struct user *u);
  96. static void CreateSnmpComm (SNMP_COMMUNITY *snmp_para_comm);
  97. static int dosnmp_engineID(int argc,char *argv[],struct user *u);
  98. static BOOL display_snmp_user();
  99. static int display_snmp_group();
  100. static int resolve_commmunity(char* name,int *index);
  101. static int dosnmp_srcipaddr(int argc, char *argv[],struct user* u);
  102. static char *snmp_storage_trans[] = {"nonexistent", "other", "volatile", "nonvolatile",
  103. "permanent", "readonly"};
  104. static char *snmp_status_trans[] = {"nonexistent", "active", "not-in-service",
  105. "not-ready", "create-and-go", "create-and-wait", "destroy"};
  106. struct cmds Snmpcmds[] = {
  107. { "community", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  108. dosnmp_community,NULL,NULL, 0, 0, 
  109. "community        --  Enable SNMP; set community string and access privs", 
  110. "community        --  启用 SNMP; 设置 community 字符串", 
  111. NULLCHAR ,NULLCHAR },
  112. { "contact", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  113. dosnmp_contact,NULL,NULL, 0, cmdArgc(2,1,0), 
  114. "contact          --  Text for mib object sysContact", 
  115. "contact          --  设置 mib 对象 sysContact", 
  116. "LINE             --  identification of the contact person for this managed node",
  117. "LINE             --  该管理节点联系人" },
  118. #ifdef INCLUDE_SNMPV3
  119. { "engineID", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  120. dosnmp_engineID,NULL,NULL, 0, 0, 
  121. "engineID         --  Configure a local or remote SNMPv3 engineID",
  122. "engineID         --  配置本地或远端的SNMP引擎ID", 
  123.   NULLCHAR,NULLCHAR},
  124. { "group", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  125. dosnmp_group,NULL,NULL, 0, 0, 
  126. "group            --  Define a User Security Model group",
  127. "group            --  定义基于用户的安全模型的组", 
  128.   NULLCHAR,NULLCHAR},
  129. #endif
  130. { "host", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  131. dosnmp_host,NULL,NULL, 0, 0, 
  132. "host             --  Specify hosts to receive SNMP TRAPs", 
  133. "host             --  指定接收 SNMP TRAPs 的目的主机", 
  134. NULLCHAR,NULLCHAR},
  135. /*** 2000.03.16  ***
  136. "?Hostname or A.B.C.D  --  IP address of SNMP TRAP host" ,
  137. "Hostname or A.B.C.D  --  IP address of SNMP TRAP host" },
  138. ******/
  139. { "location", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  140. dosnmp_location,NULL,NULL, 0, cmdArgc(2,1,0), 
  141. "location         --  Text for mib object sysLocation", 
  142. "location         --  设置 mib 对象 sysLocation", 
  143. NULLCHAR,NULLCHAR },
  144.            
  145. { "packetsize", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  146. dosnmp_packetsize,NULL,NULL, 0, cmdArgc(0,1,0), 
  147. "packetsize       --  Largest SNMP packet size", 
  148. "packetsize       --  设置最大的 SNMP 数据包尺寸", 
  149. "<484-17940>    --  Packet size",
  150. "<484-17940>    --  数据包尺寸" },
  151.          
  152. { "queue-length", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  153. dosnmp_queuelen,NULL,NULL, 0, cmdArgc(0,1,0), 
  154. "queue-length     --  Message queue length for each TRAP host", 
  155. "queue-length     --  设置针对每个 TRAP 主机的消息队列长度", 
  156. "<1-1000>    --  Queue length (default 10)",
  157. "<1-1000>    --  队列长度 (缺省 10)" },
  158. { "trap-source", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  159. dosnmp_trap_source,NULL,NULL, cmdArgc(2,2,0), cmdArgc(0,0,0), 
  160. "trap-source      --  Assign an interface for the source address of all traps", 
  161. "trap-source      --  指定一个 interface 用于所有 trap 的源地址", 
  162. NULLCHAR,NULLCHAR},
  163.          
  164. { "trap-timeout", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  165. dosnmp_trap_timeout,NULL,NULL, 0, cmdArgc(0,1,0), 
  166. "trap-timeout     --  Set timeout for TRAP message retransmissions", 
  167. "trap-timeout     --  设置重发 TRAP 消息的超时值", 
  168. "<1-1000>    --  Timeout (default 30 seconds)",
  169. "<1-1000>    --  超时值 (缺省 30 秒)"},
  170. #ifdef INCLUDE_SNMPV3
  171. { "user", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  172. dosnmp_user,NULL,NULL, 0, 0, 
  173. "user             --  Define a user who can access the SNMP engine",
  174. "user             --  定义能够访问本SNMP引擎的用户", 
  175.   NULLCHAR,NULLCHAR},
  176. #endif
  177. { "view", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  178. dosnmp_view,NULL,NULL, cmdArgc(0,2,0), 0, 
  179. "view             --  Define an SNMP MIB view", 
  180. "view             --  定义 SNMP MIB view", 
  181.   NULLCHAR,NULLCHAR},
  182.  
  183.    { "source-addr", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  184. dosnmp_srcipaddr,NULL,NULL, 2, 0, 
  185. "source-addr                 -- Set source IP Address", 
  186. "source-addr                  -- 设置源IP地址", 
  187.   NULLCHAR,NULLCHAR},
  188. { NULLCHAR }
  189. };
  190. /*************************************************/
  191. /** snmp top command */
  192. int do_snmp(int argc, char *argv[], struct user *u)
  193. {
  194. return subcmd(Snmpcmds,NULL, argc, argv, u);
  195. }
  196. /* snmp command
  197. * snmp community ****
  198. */
  199. #if 0
  200. static int dosnmp_community_name(int argc, char *argv[], struct user *u);
  201. #endif
  202. static int dosnmp_community_acl(int argc,char *argv[],struct user *u);
  203. static int dosnmp_community_ro(int argc,char *argv[],struct user *u);
  204. static int dosnmp_community_rw(int argc,char *argv[],struct user *u);
  205. static int dosnmp_community_view(int argc,char *argv[],struct user *u);
  206. static int display_snmp_community(void);
  207. static void init_a_community(SNMP_COMMUNITY *community);
  208. /** snmp community command structure */
  209. struct cmds snmp_community_privilege_cmds[] = {
  210. { "", MATCH_STR, 0, 0x1, dosnmp_community_acl,NULL,NULL, 0, 0, /*v0.0.6 max 0->1*/
  211. "WORD    --  Std IP accesslist allowing access with this community string", 
  212. "WORD    --  使用该团体允许访问的标准 IP 访问列表", 
  213. NULLCHAR,NULLCHAR},
  214. { "ro", MATCH_AMB, 0, 0x2, dosnmp_community_ro,NULL,NULL, 0, 0, 
  215. "ro      --  Read-only access with this community string", 
  216. "ro      --  使用该团体可访问只读 MIB", 
  217. NULLCHAR,NULLCHAR},
  218. { "rw", MATCH_AMB, 0, 0x2, dosnmp_community_rw,NULL,NULL, 0, 0, 
  219. "rw      --  Read-write access with this community string", 
  220. "rw      --  使用该团体可访问读写 MIB", 
  221. NULLCHAR,NULLCHAR},
  222. { "view", MATCH_AMB, 0, 0x8, dosnmp_community_view,NULL,NULL, 0, 0, 
  223. "view    --  Restrict this community to a named MIB view", 
  224. "view    --  限定该团体可访问的 MIB 视图", 
  225. "WORD    --  MIB view to which this community has access",
  226. "WORD    --  MIB 视图",},
  227. { (char *)-1, MATCH_END, cmdPref(PF_CMDNO, 0, 0), 0x10, NULL, 
  228. NULL,NULL,0, cmdArgc(0,0,0), 
  229. "<cr>",
  230. "结束",
  231. NULLCHAR ,NULLCHAR},
  232. { NULLCHAR }
  233. };
  234. /* function: snmp community */
  235. static int dosnmp_community(argc,argv,u)
  236. int argc;
  237. char *argv[];
  238. struct user *u;
  239. {
  240. int i, rc;
  241. SNMP_COMMUNITY community;
  242. char *name;
  243. if(IsNoPref(u) && argc<2){
  244. vacm_DestroyCommunityAll();
  245. return 0;
  246. }
  247. u->struct_p[COMMUNITY]=(unsigned long )&community;
  248. switch(getstrrc(&name,  argc--, argv++, 0, SNMP_MAX_COMMUNITY_LEN, u)){
  249. case ARG_NOERR: 
  250.     break;
  251.     case ARG_QUEST:
  252.     case ARG_QUERY:
  253.         eng_chi(u,  "  WORD    --  SNMP community string",
  254.                         "  WORD    --  SNMP 团体名字符串");
  255.         return 1;
  256.     case ARG_PARAM:
  257.     case ARG_QPART:
  258. case ARG_GENER:
  259.     default:
  260.      return -1;
  261. }
  262. if (resolve_commmunity(name,&i)<0)
  263. {
  264. vty_output("SNMP(@err):exceed the max num of community list(%d)n",SNMP_MAX_COMMUNITY_NUM);
  265. return 0;
  266. }else{
  267. u->struct_p[COMMUNITY_INDEX] = i;
  268. }
  269. memset(&community,0,sizeof(SNMP_COMMUNITY));
  270. strncpy(community.name,name,SNMP_MAX_COMMUNITY_LEN-1);
  271. if(argc==1){
  272. if(IsNoPref(u)){/*no snmp community argv[0]*/
  273. if (vacm_FindSecEntryByCommName (name) != NULL)
  274. {
  275. vacm_DestroyCommunity (name);
  276. }
  277. else
  278. {
  279. vty_output("Cann't find community %sn",name);
  280. return -1;
  281. }
  282. }else{
  283. CreateSnmpComm (&community); /*Modified by sxf oct.30.2k*/
  284. /*ASSIGN(snmp_para.community[i],community);*/
  285. }
  286. return 0;
  287. }
  288. u->cmd_mskbits =0x1f;
  289. if ((rc = subcmd(snmp_community_privilege_cmds,&u->cmd_mskbits, argc, argv, u))==0){
  290. CreateSnmpComm (&community); 
  291. return 0;
  292. }
  293. else
  294.     return rc;
  295. }
  296. void display_a_community(struct vacm_securityEntry *community)
  297. {
  298. if(community->community[0]){
  299. vty_printf("snmp-server community %s ",community->community);
  300. if (community->viewname[0]){
  301. vty_printf("view %s ",community->viewname);
  302. }
  303. vty_printf("%s ",(community->privilege==READONLY)?"RO":"RW");/*0.0.8*/
  304. if(community->access_list[0]){
  305. vty_printf("%s",community->access_list);
  306. }
  307. vty_printf("n");
  308. }
  309. }
  310. static int display_snmp_community(void)
  311. {
  312. if (vacm_walkThrSecEntry (display_a_community))
  313. {
  314. return FALSE;
  315. }
  316. else
  317. {
  318. return TRUE;
  319. }
  320. }
  321. void init_community(void)
  322. {
  323. int i;
  324. for(i=0;i<SNMP_MAX_COMMUNITY_NUM;i++){
  325. init_a_community(&snmp_para.community[i]);
  326. }/*for*/
  327. return;
  328. }
  329. static void init_a_community(SNMP_COMMUNITY *community)
  330. {
  331. memset(community,0,sizeof(SNMP_COMMUNITY));
  332. return;
  333. }
  334. /***/
  335. static int resolve_commmunity(char* name,int *index)
  336. {
  337. int i;
  338. for(i=0;i<SNMP_MAX_COMMUNITY_NUM;i++){
  339. if(!strcmp(snmp_para.community[i].name,name)) {
  340. *index=i;
  341. return 1;
  342. }
  343. }
  344. if(i>=SNMP_MAX_COMMUNITY_NUM){
  345. for(i=0;i<SNMP_MAX_COMMUNITY_NUM;i++)
  346. if(snmp_para.community[i].name[0]==0){
  347. *index=i;
  348. return 0;
  349. }
  350. }
  351. *index=-1;
  352. return -1;
  353. }
  354. static int dosnmp_community_ro(int argc,char *argv[],struct user *u)
  355. {
  356. SNMP_COMMUNITY *community =(SNMP_COMMUNITY *)u->struct_p[COMMUNITY];
  357. community->privilege = READONLY;
  358. if (argc>1){
  359. return subcmd(snmp_community_privilege_cmds,&u->cmd_mskbits, argc, argv, u);
  360. }
  361. return 0;
  362. }
  363. static int dosnmp_community_rw(int argc,char *argv[],struct user *u)
  364. {
  365. SNMP_COMMUNITY *community =(SNMP_COMMUNITY *)u->struct_p[COMMUNITY];
  366. community->privilege = READWRITE;
  367. if (argc>1){
  368. return subcmd(snmp_community_privilege_cmds,&u->cmd_mskbits, argc, argv, u);
  369. }
  370. return 0;
  371. }
  372. static int dosnmp_community_acl(int argc,char *argv[],struct user *u)
  373. {
  374. SNMP_COMMUNITY *community =(SNMP_COMMUNITY *)u->struct_p[COMMUNITY];
  375. char *acl;
  376.     /*由于命令行参数已经被用于匹配命令字,这里需要回退*/
  377.     argc++,argv--;
  378. switch(getstrrc(&acl,  argc--, argv++, 0, NAME_MAXLEN, u)){
  379. case ARG_NOERR: 
  380.     break;
  381.     case ARG_QUEST:
  382.     case ARG_QUERY:
  383.         vty_output("WORDn");
  384.         eng_chi(u, "  WORD  -- Std IP accesslist allowing access with this community string",
  385.                    "  WORD  -- 使用该团体允许访问的标准 IP 访问列表");
  386.         return 1;
  387.     case ARG_PARAM:
  388.     case ARG_QPART:
  389. case ARG_GENER:
  390.     default:
  391.      return -1;
  392. }
  393. strncpy(community->access_list,acl,NAME_MAXLEN-1);
  394. community->access_list[NAME_MAXLEN-1] = '';
  395. if (argc>1){
  396. return subcmd(snmp_community_privilege_cmds,&u->cmd_mskbits, argc, argv, u);
  397. }
  398. return 0;
  399. }
  400. static int dosnmp_community_view(int argc,char *argv[],struct user *u)
  401. {
  402. SNMP_COMMUNITY *community =(SNMP_COMMUNITY *)u->struct_p[COMMUNITY];
  403.     char *p;
  404. if (argc==1){
  405. if(IsChinese(u)){
  406. vty_output("命令不完整n");
  407. }else{
  408. vty_output("Incomplete commandn");
  409. }
  410. return -1;
  411. }
  412. switch(getstrrc(&p,  argc, argv, 0, SNMP_MAX_VIEW_LEN, u)){
  413. case ARG_NOERR: 
  414.          strncpy(community->viewname,p,MAX_NAME_LEN-1);
  415.     break;
  416.     case ARG_QUERY:
  417.     case ARG_QUEST:
  418.         vty_output("WORDn");
  419.         return 1;
  420.     case ARG_PARAM:
  421.     case ARG_QPART:
  422. case ARG_GENER:
  423.     default:
  424.      return -1;
  425. }
  426. --argc;
  427. ++argv;
  428. #if 0 /*  2000.06.19   */
  429. strncpy(community->viewname,argv[1],MAX_NAME_LEN-1);
  430. u->cmd_mskbits = 0x17;/*for <1-99 and <cr>>*/
  431. --argc;
  432. ++argv;
  433. #endif /* #if 0 */
  434. if (argc>1){
  435. return subcmd(snmp_community_privilege_cmds,&u->cmd_mskbits, argc, argv, u);
  436. }
  437. return 0;
  438. }
  439. #if 0
  440. struct cmds snmp_contact_cmds[] = {
  441. { "LINE", MATCH_STR, 0, 0, dosnmp_contact_name, NULL,NULL,0, cmdArgc(0,0,0), 
  442. "LINE       --  identification of the contact person for this managed node",
  443. "LINE       --  该管理节点的联系人标识符",
  444. NULLCHAR ,NULLCHAR},
  445. {NULLCHAR}
  446. };
  447. #endif
  448. /**
  449. **snmp command
  450. **snmp contact ***
  451. **/
  452. static int dosnmp_contact(argc,argv,u)
  453. int argc;
  454. char *argv[];
  455. struct user *u;
  456. {
  457.     char *p;
  458. if(argc==1){
  459. if(IsNoPref(u)){/*no snmp host argv[0]*/
  460. memset(snmp_para.syscontact,0,SNMP_MAX_SYSCON_LEN);
  461. }else{
  462. display_snmp_contact();
  463. }
  464. return 0;
  465. }
  466. switch(getstrrc(&p,  argc, argv, 0, SNMP_MAX_SYSCON_LEN, u)){
  467. case ARG_NOERR: 
  468.          strncpy(snmp_para.syscontact,argv[1],SNMP_MAX_SYSCON_LEN-1);
  469.     break;
  470.     case ARG_QUERY:
  471.     case ARG_QUEST:
  472.         eng_chi(u, "  WORDttt--  contact informationn",
  473.                    "  WORDttt--  联系信息n");
  474.             return 1;
  475.     case ARG_PARAM:
  476.     case ARG_QPART:
  477. case ARG_GENER:
  478.     default:
  479.      return -1;
  480. }
  481.     return 0;
  482. }
  483. #if 0
  484. static int dosnmp_contact_name(int argc,char *argv[],struct user *u)
  485. {
  486. memset(snmp_para.syscontact,0,SNMP_MAX_SYSCON_LEN);
  487. strncpy(snmp_para.syscontact,argv[0],SNMP_MAX_SYSCON_LEN-1);
  488. return 0;
  489. }
  490. #endif
  491. void display_snmp_contact(void)
  492. {
  493. if(snmp_para.syscontact[0]){
  494. vty_output("snmp contact %sn",
  495. snmp_para.syscontact);
  496. }else{
  497. vty_output("Nonen");
  498. }
  499. }
  500. /*snmp command
  501. *snmp host ***
  502. */
  503. static int  display_snmp_host(void);
  504. static void display_a_host(int itemp);
  505. static int dosnmp_host_delete(SNMP_TRAPSINK *snmphost);
  506. static int dosnmp_host_add(int argc,char *argv[],struct user *u);
  507. static int dosnmp_host_community(int argc,char *argv[],struct user *u);
  508. static int resolve_trapsink(SNMP_TRAPSINK *snmphost, int *index);
  509. static void dosnmp_host_addhost(SNMP_TRAPSINK *snmphost);
  510. static int dosnmp_host_community_snmp(int argc,char *argv[],struct user *u);
  511. static int dosnmp_host_community_auth(int argc,char *argv[],struct user *u);
  512. static int dosnmp_host_community_config(int argc,char *argv[],struct user *u);
  513. static int dosnmp_host_inform(int argc,char *argv[],struct user *u);
  514. static int dosnmp_host_trap(int argc,char *argv[],struct user *u);
  515. static int dosnmp_host_version(int argc,char *argv[],struct user *u);
  516. /* by yangyuhua 2006-4-7 */
  517. static int dosnmp_host_vrf(int argc,char *argv[],struct user *u);
  518. static int dosnmp_host_version_choice(int argc,char *argv[],struct user *u);
  519. static int dosnmp_host_version3_authpara(int argc,char *argv[],struct user *u);
  520. static int do_show_snmp_user(int argc,char *argv[],struct user *u);
  521. static int do_show_snmp_group(int argc,char *argv[],struct user *u);
  522. static int do_show_snmp_engineID(int argc,char *argv[],struct user *u);
  523. struct cmds snmp_host_cmds[] = {
  524. { (char *)-1, MATCH_STR,  cmdPref(PF_CMDNO, 0, 0), 0, 
  525. dosnmp_host_add, NULL,NULL,cmdArgc(0,2,2), 0, 
  526. "Hostname or A.B.C.D  --  IP address of SNMP TRAP host",
  527. "Hostname or A.B.C.D  --  接收SNMP TRAP主机的 IP 地址",
  528. NULLCHAR ,NULLCHAR},
  529. /*
  530. { (char *)-1, MATCH_END, 0, 0x10, NULL, NULL,NULL,0, 0, 
  531. "<cr>                 --  Display Current host configure",
  532. "结束                 --  显示当前 host 配置",
  533. NULLCHAR ,NULLCHAR},
  534. { (char *)-1, MATCH_END,  0, 0x20, NULL,NULL,NULL,0, 0, 
  535. "<cr>",
  536. "结束",
  537. NULLCHAR ,NULLCHAR},
  538. */
  539. {NULLCHAR}
  540. };
  541. struct cmds snmp_host_hostname_cmds[] = {
  542. { "WORD", MATCH_STR, cmdPref(PF_CMDNO, 0, 0), 0x1, dosnmp_host_community, NULL,NULL,0, 0, 
  543. #ifdef INCLUDE_SNMPV3
  544. "WORD    --  SNMPv1/v2c community string or SNMPv3 user name",
  545. "WORD    --  SNMPv1/v2c 团体字符串或SNMPv3用户名",
  546. #else
  547. "WORD    --  SNMP community string",
  548. "WORD    --  SNMP 团体字符串",
  549. #endif
  550. NULLCHAR ,NULLCHAR},
  551. { "informs", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0x2, dosnmp_host_inform, NULL,NULL,0, 0, 
  552. "informs           --  Send Inform messages to this host",
  553. "informs           --  向该主机发送inform",
  554. NULLCHAR ,NULLCHAR},
  555. { "traps", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0x2, dosnmp_host_trap, NULL,NULL,0, 0, 
  556. "traps             --  Send Trap messages to this host",
  557. "traps             --  向该主机发送trap",
  558. NULLCHAR ,NULLCHAR},
  559. { "version", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0x4, dosnmp_host_version, NULL,NULL,0, 0, 
  560. "version           --  SNMP version to use for notification messages",
  561. "version           --  向主机发送通知类报文的版本号",
  562. NULLCHAR ,NULLCHAR},
  563. /* by yangyuhua 2006-4-7 */
  564. { "vrf", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0x8, dosnmp_host_vrf, NULL,NULL,0, 0, 
  565. "vrf     --  Bind vrf name ",
  566. "vrf     --  绑定vrf ",
  567. NULLCHAR ,NULLCHAR},
  568. {NULLCHAR}
  569. };
  570. #define SNMP_HOST_V1 0x01
  571. #define SNMP_HOST_V2c 0x02
  572. #define SNMP_HOST_V3 0x04
  573. struct cmds snmp_host_hostname_version_cmds[] = {
  574. { "v1", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMP_HOST_V1, dosnmp_host_version_choice, NULL,NULL,0, 0, 
  575. "v1                --  Use SNMPv1",
  576. "v1                --  使用版本1",
  577. NULLCHAR ,NULLCHAR},
  578. { "v2c", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMP_HOST_V2c, dosnmp_host_version_choice, NULL,NULL,0, 0, 
  579. "v2c               --  Use SNMPv2c",
  580. "v2c               --  使用版本2c",
  581. NULLCHAR ,NULLCHAR},
  582. #ifdef INCLUDE_SNMPV3
  583. { "v3", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMP_HOST_V3, dosnmp_host_version_choice, NULL,NULL,0, 0, 
  584. "v3                --  Use SNMPv3",
  585. "v3                --  使用版本3",
  586. NULLCHAR ,NULLCHAR},
  587. #endif
  588. {NULLCHAR}
  589. };
  590. #ifdef INCLUDE_SNMPV3
  591. #define SNMPV3_HOST_V3_AUTH 0x01
  592. #define SNMPV3_HOST_V3_NOAUTH 0x02
  593. struct cmds snmp_host_hostname_version3_auth_cmds[] = {
  594. { "auth", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_HOST_V3_AUTH, dosnmp_host_version3_authpara, NULL,NULL,0, 0, 
  595. "auth              --  Use the SNMPv3 authNoPriv Security Level",
  596. "auth              --  使用版本3认证不加密安全级别",
  597. NULLCHAR ,NULLCHAR},
  598. { "noauth", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_HOST_V3_NOAUTH, dosnmp_host_version3_authpara, NULL,NULL,0, 0, 
  599. "noauth            --  Use the SNMPv3 noAuthNoPriv Security Level",
  600. "noauth            --  使用版本3不认证不加密安全级别",
  601. NULLCHAR ,NULLCHAR},
  602. {NULLCHAR}
  603. };
  604. #endif
  605. struct cmds snmp_host_community_cmds[] = {
  606. { "authentication", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0x1, dosnmp_host_community_auth,NULL,NULL,0, cmdArgc(0,0,0), 
  607. "authentication    --  Allow authentication failure traps",
  608. "authentication    --  允许发送认证失败traps",
  609. NULLCHAR ,NULLCHAR},
  610. { "configure", MATCH_AMB, 0, 0x2, dosnmp_host_community_config, NULL,NULL,0, 0, 
  611. "configure         --  Allow SNMP-configure traps",
  612. "configure         --  允许发送 SNMP 配置 traps",
  613. NULLCHAR ,NULLCHAR},
  614. { "snmp", MATCH_AMB, 0, 0x4, dosnmp_host_community_snmp, NULL,NULL,0, 0, 
  615. "snmp              --  Allow SNMP-type traps",
  616. "snmp              --  允许发送 SNMP traps",
  617. NULLCHAR ,NULLCHAR},
  618. { (char *)-1, MATCH_END, cmdPref(PF_CMDNO, 0, 0), 0x20, NULL,
  619. NULL,NULL,0, 0, 
  620. /* "<cr>              --  Allow all traps",
  621. "结束              --  允许发送所有traps", *//* v0.0.3*/
  622. "<cr>",
  623. "结束",
  624. NULLCHAR ,NULLCHAR},
  625. {NULLCHAR}
  626. };
  627. static int dosnmp_host(argc,argv,u)
  628. int argc;
  629. char *argv[];
  630. struct user *u;
  631. {
  632. return subcmd(snmp_host_cmds,&u->cmd_mskbits, argc, argv, u);
  633. }
  634. /*** sun define 2000.03.12 ***/
  635. static int dosnmp_host_add(int argc,char *argv[],struct user *u)
  636. {
  637. SNMP_TRAPSINK snmphost;
  638. int res;
  639. memset(&snmphost,0,sizeof(SNMP_TRAPSINK));
  640. snmphost.pdutype = SNMP_MSG_TRAP;
  641. snmphost.trapflags = 0xFFFF;
  642. u->struct_p[SNMP_HOST] = (unsigned long)&snmphost;
  643. strncpy (snmphost.hostname, *(argv), SNMP_MAX_HOSTNAME_LEN-1);
  644. u->cmd_mskbits = 0x1F;
  645. #ifdef SWITCH
  646. res = 0;
  647. #else
  648. res=ip_vrf_enable_status();
  649. #endif
  650.        if(!res){/*support vrf*/
  651.     u->cmd_mskbits &= ~0x8;
  652.         }
  653. return subcmd(snmp_host_hostname_cmds,&u->cmd_mskbits, argc, argv, u);
  654. }
  655. static int display_snmp_host(void)
  656. {
  657. int i;
  658. int    emptyconfiguration = TRUE;
  659. for(i=0;i<SNMP_MAX_TRAPSINK;i++){
  660. if(snmp_para.trapsink[i].ipaddr!=0)
  661. break;
  662. }/*for*/
  663. if (i>=SNMP_MAX_TRAPSINK){
  664. #if 0 /*  2000.04.03   */
  665. vty_printf("Nonen");
  666. #endif /* #if 0 */
  667. return emptyconfiguration;
  668. }else{
  669. for(i=0;i<SNMP_MAX_TRAPSINK;i++){
  670. display_a_host(i);
  671. }/*for*/
  672. emptyconfiguration = FALSE;
  673. }
  674. return emptyconfiguration;
  675. }
  676. static void display_a_host(int itemp)
  677. {
  678. SNMP_TRAPSINK * trapsink;
  679. if ((itemp >= 0 ) && (itemp < SNMP_MAX_TRAPSINK))
  680. trapsink = (SNMP_TRAPSINK * )(&(snmp_para.trapsink[itemp]));
  681. else return;
  682. if(trapsink->ipaddr){
  683. vty_printf("snmp-server host %s ",snmp_ntoa(trapsink->ipaddr));
  684. /*by yangyuhua 2006-4-7*/
  685. if(trapsink->vrfname[0])
  686. vty_printf("vrf %s ",trapsink->vrfname);
  687. if (trapsink->pdutype == SNMP_MSG_INFORM)
  688.     vty_printf("informs ");
  689.     switch (trapsink->version) {
  690.     case SNMP_VERSION_2c:
  691.         vty_printf("version v2c ");
  692.         break;
  693.     case SNMP_VERSION_3:
  694.         vty_printf("version v3 ");
  695.         if (trapsink->authtype == SNMP_SEC_LEVEL_NOAUTH)
  696.             vty_printf("noauth ");
  697.             else
  698.                 vty_printf("auth ");
  699.         break;
  700.     }
  701. if(trapsink->community[0])
  702. vty_printf("%s ",trapsink->community);
  703. if(trapsink->trapflags){
  704. if(trapsink->trapflags!=0xffff)
  705. {
  706. if(trapsink->trapflags&SNMP_AUTH_TRAP)
  707. vty_printf("authentication ");
  708. if(trapsink->trapflags&SNMP_CONFIG_TRAP)
  709. vty_printf("configure ");
  710. if(trapsink->trapflags&SNMP_SNMPTYPE_TRAP)
  711. vty_printf("snmp");
  712. }
  713. }
  714. vty_printf("n");
  715. }
  716. }
  717. static int dosnmp_host_delete(SNMP_TRAPSINK *snmphost)
  718. {
  719. int i,ret;
  720. if(snmphost->ipaddr==0){
  721. vty_output("Invalid IP address or unknow hostnamen");
  722. /*** 2000.03.15  ***
  723. vty_output("SNMP:非法IP地址或者未配置的主机名 %sn",argv[1]);
  724. ******/
  725. return 0;
  726. }
  727. ret = resolve_trapsink(snmphost, &i);
  728. if(ret==1){
  729. memset(&snmp_para.trapsink[i],0,sizeof(SNMP_TRAPSINK));
  730. }else{
  731. vty_output("Cannot find host %sn",snmp_ntoa(snmphost->ipaddr));
  732. }
  733. return 0;
  734. }
  735. static int dosnmp_host_community(int argc,char *argv[],struct user *u)
  736. {
  737. SNMP_TRAPSINK *snmphost=(SNMP_TRAPSINK *)u->struct_p[SNMP_HOST];
  738. struct hostent *hp;
  739. int rc;
  740.     strncpy(snmphost->community,argv[0],SNMP_MAX_COMMUNITY_LEN-1);
  741.     if(IsNoPref(u)){/*no snmp host <hostnameipaddree>*/
  742. u->cmd_mskbits = 0x2F;
  743. rc = cmdend(--argc, ++argv, u);
  744. if (rc)
  745.     return rc;
  746. if ((snmphost->ipaddr = inet_addr (snmphost->hostname)) 
  747. == INADDR_NONE) {
  748. vty_output ("Translating "%s"... n", snmphost->hostname); 
  749. hp = gethostbyname(snmphost->hostname);
  750. if (hp == NULL)
  751. {
  752. vty_output (" Unknown hostname "%s"n", snmphost->hostname);
  753. return -1;
  754. }
  755. else
  756. {
  757. vty_output ("Successn");
  758. memcpy(&(snmphost->ipaddr), hp->h_addr, 4);
  759. }
  760. }
  761. dosnmp_host_delete(snmphost);
  762. return 0;
  763. }
  764. else
  765. {
  766. if(argc<2){
  767. /* strncpy(snmphost->community,argv[0],SNMP_MAX_COMMUNITY_LEN-1);*//*v0.0.3*/
  768. snmphost->trapflags = 0xffff;/*all*/
  769. dosnmp_host_addhost(snmphost);
  770. return 0;
  771. }
  772. u->cmd_mskbits = 0xFF;
  773. snmphost->trapflags = 0;/*For Bug  SWBUG00006106*/
  774.     if ((rc = subcmd(snmp_host_community_cmds,&u->cmd_mskbits, argc, argv, u))==0){
  775.   dosnmp_host_addhost(snmphost);
  776.             return 0;
  777.     }
  778.     else
  779.         return rc;
  780.  }
  781.  return 0;
  782. }
  783. static int dosnmp_host_inform(int argc,char *argv[],struct user *u)
  784. {
  785.     SNMP_TRAPSINK *snmphost=(SNMP_TRAPSINK *)u->struct_p[SNMP_HOST];
  786.     snmphost->pdutype = SNMP_MSG_INFORM;
  787. /*yangyhuhua(a) 2006-4-14*/
  788.     snmphost->version = SNMP_VERSION_2c;
  789.     u->cmd_mskbits &= ~0x02;
  790.     return subcmd(snmp_host_hostname_cmds, &u->cmd_mskbits, argc, argv, u);
  791. }
  792. static int dosnmp_host_trap(int argc,char *argv[],struct user *u)
  793. {
  794.     SNMP_TRAPSINK *snmphost=(SNMP_TRAPSINK *)u->struct_p[SNMP_HOST];
  795.     snmphost->pdutype = SNMP_MSG_TRAP;
  796.     u->cmd_mskbits &= ~0x02;
  797.     return subcmd(snmp_host_hostname_cmds, &u->cmd_mskbits, argc, argv, u);
  798. }
  799. static int dosnmp_host_version(int argc,char *argv[],struct user *u)
  800. {
  801. SNMP_TRAPSINK *snmphost=(SNMP_TRAPSINK *)u->struct_p[SNMP_HOST];
  802. u->cmd_mskbits = -1;
  803. /*yangyuhua(a) 2006-4-14*/
  804.     if ((snmphost->version > SNMP_VERSION_1) && (snmphost->version <= SNMP_VERSION_3))
  805. u->cmd_mskbits &= ~(SNMP_HOST_V1);
  806.     return subcmd(snmp_host_hostname_version_cmds, &u->cmd_mskbits, argc, argv, u);
  807. }
  808. static int dosnmp_host_version_choice(int argc,char *argv[],struct user *u)
  809. {
  810.     SNMP_TRAPSINK *snmphost=(SNMP_TRAPSINK *)u->struct_p[SNMP_HOST];
  811. /*yangyuhua(m) 2006-4-14*/
  812.     if (snmphost->pdutype == SNMP_MSG_INFORM)
  813.      {
  814.     if ((u->cmd_mskbits & SNMP_HOST_V2c) == 0) {
  815.         snmphost->version = SNMP_VERSION_2c;
  816.     } else if ((u->cmd_mskbits & SNMP_HOST_V3) == 0) {
  817.         snmphost->version = SNMP_VERSION_3;
  818.     } else
  819.         assert(0);
  820.      } else {
  821.     if ((u->cmd_mskbits & SNMP_HOST_V1) == 0) {
  822.         snmphost->version = SNMP_VERSION_1;
  823.     } else   if ((u->cmd_mskbits & SNMP_HOST_V2c) == 0) {
  824.         snmphost->version = SNMP_VERSION_2c;
  825.     } else if ((u->cmd_mskbits & SNMP_HOST_V3) == 0) {
  826.         snmphost->version = SNMP_VERSION_3;
  827.     } else
  828.         assert(0);
  829.      }
  830.     if (snmphost->version != SNMP_VERSION_1 && snmphost->pdutype == SNMP_MSG_TRAP)
  831.         snmphost->pdutype = SNMP_MSG_TRAP2;
  832. #ifdef INCLUDE_SNMPV3
  833.     if (snmphost->version == SNMP_VERSION_3) {
  834.         u->cmd_mskbits = -1;
  835.         return subcmd(snmp_host_hostname_version3_auth_cmds, &u->cmd_mskbits, argc, argv, u);
  836.     }
  837.     else
  838. #endif
  839.     {
  840.         u->cmd_mskbits = 1;
  841.         return subcmd(snmp_host_hostname_cmds, &u->cmd_mskbits, argc, argv, u);
  842.     }
  843. }
  844. #ifdef INCLUDE_SNMPV3
  845. static int dosnmp_host_version3_authpara(int argc,char *argv[],struct user *u)
  846. {
  847.     SNMP_TRAPSINK *snmphost=(SNMP_TRAPSINK *)u->struct_p[SNMP_HOST];
  848.     if ((u->cmd_mskbits & SNMPV3_HOST_V3_AUTH) == 0) {
  849.         snmphost->authtype = SNMP_SEC_LEVEL_AUTHNOPRIV;
  850.     } else if ((u->cmd_mskbits & SNMPV3_HOST_V3_NOAUTH) == 0) {
  851.         snmphost->authtype = SNMP_SEC_LEVEL_NOAUTH;
  852.     }
  853.     u->cmd_mskbits = 1;
  854.     return subcmd(snmp_host_hostname_cmds, &u->cmd_mskbits, argc, argv, u);
  855. }
  856. #endif
  857. /* by yangyuhua 2006-4-7 */
  858. static int  dosnmp_host_vrf(int argc, char *argv[], struct user *u)
  859. {
  860.    SNMP_TRAPSINK *snmphost=(SNMP_TRAPSINK *)u->struct_p[SNMP_HOST];
  861.    char *p;
  862.    uint32 rc;
  863.   
  864. if(argc ==1){
  865. cmderror(ERR_INCOM, argv[0], u);
  866. return -1;
  867. }
  868. else {
  869. switch(getstrrc(&p,  argc, argv, 0, SNMP_VRF_NAME_LEN, u)){
  870. case ARG_NOERR: 
  871.     /*snmphost->vrfid= get_vrf_id_byname(p);*/
  872. strcpy(snmphost->vrfname,p);
  873.     break;
  874.     case ARG_QUERY:
  875.     case ARG_QUEST:
  876.        eng_chi(u, "  WORD    --  VPN Routing/Forwarding instance name(up to 16 chars)", "  WORD      -- VRF名字(  最多16个字符)");
  877.         return 1;
  878.     case ARG_PARAM:
  879.     case ARG_QPART:
  880. case ARG_GENER:
  881.     default:
  882.      return -1;
  883. }
  884. }
  885. if (argc==2) return 0;
  886. else {
  887. u->cmd_mskbits &= ~0x08;
  888. return subcmd(snmp_host_hostname_cmds,&u->cmd_mskbits, argc-1, argv+1, u);
  889. }
  890. }
  891. static void dosnmp_host_addhost(SNMP_TRAPSINK *snmphost)
  892. {
  893. int ret,i;
  894. struct hostent *hp;
  895. if ((snmphost->ipaddr = inet_addr (snmphost->hostname)) 
  896. == INADDR_NONE) {
  897. vty_output ("Translating "%s"... n", snmphost->hostname); 
  898. hp = gethostbyname(snmphost->hostname);
  899. if (hp == NULL)
  900. {
  901. vty_output ("Unknown hostname "%s"n", snmphost->hostname);
  902. return;
  903. }
  904. else
  905. {
  906. vty_output ("Successn");
  907. memcpy(&(snmphost->ipaddr), hp->h_addr, 4);
  908. }
  909. }
  910. ret=resolve_trapsink(snmphost, &i);
  911. if (ret<0){
  912. vty_output("SNMP:Too many trap hosts. The maximum number is(%d)n",SNMP_MAX_TRAPSINK);
  913. return;
  914. }else{
  915.     switch (snmphost->version) {
  916.     case SNMP_VERSION_1:
  917.      if(createV1TrapSession((char*)snmp_ntoa(snmphost->ipaddr),(char*)snmphost->community,
  918.      snmphost->trapflags, snmphost->vrfname)>0){
  919.          ASSIGN(snmp_para.trapsink[i],*snmphost);
  920.      }else{
  921.      vty_output("SNMP:system too busy,can not create trap sessionn");
  922.      }
  923.      break;
  924. case SNMP_VERSION_2c:
  925.      if(createV2TrapSession(snmp_ntoa(snmphost->ipaddr),snmphost->community,
  926.      snmphost->trapflags, snmphost->pdutype, snmphost->vrfname)>0){
  927.          ASSIGN(snmp_para.trapsink[i],*snmphost);
  928.      }else{
  929.      vty_output("SNMP:system too busy,can not create trap sessionn");
  930.      }
  931.      break;
  932. #ifdef  INCLUDE_SNMPV3
  933. case SNMP_VERSION_3:
  934.         ret = createV3TrapSession(snmp_ntoa(snmphost->ipaddr), snmphost->community,
  935.                  snmphost->authtype, snmphost->pdutype, snmphost->trapflags,snmphost->vrfname);
  936.         if (ret>0) {
  937.             ASSIGN(snmp_para.trapsink[i],*snmphost);
  938.             } else if (ret == 0) {
  939.      vty_output("SNMP:system too busy,can not create trap sessionn");
  940.             }
  941.             break;
  942. #endif /*INCLUDE_SNMPV3*/
  943.         default:
  944.             break;
  945.     }
  946. }
  947. return ;
  948. }
  949. static int resolve_trapsink(SNMP_TRAPSINK *snmphost, int *index)
  950. {
  951. int i;
  952. int return_val;
  953. for(i=0;i<SNMP_MAX_TRAPSINK;i++){
  954. if(snmphost->ipaddr==snmp_para.trapsink[i].ipaddr
  955.          && strcmp (snmphost->community, snmp_para.trapsink[i].community)==0
  956.          && snmp_para.trapsink[i].pdutype == snmphost->pdutype
  957.          && strcmp (snmp_para.trapsink[i].vrfname, snmphost->vrfname)==0){
  958. return_val = deleteTrapSession(snmp_ntoa(snmphost->ipaddr), snmphost->community, snmphost->version, snmphost->pdutype, snmphost->vrfname);
  959. snmp_para.trapsink[i].community[0]=0;
  960. /*** 2000.03.12  ***
  961. hprintf(mngr_id,"SNMP:配置已修改n");
  962. ******/
  963. *index = i;
  964. return return_val;
  965. }
  966. }
  967. if(i>=SNMP_MAX_TRAPSINK){
  968. for(i=0;i<SNMP_MAX_TRAPSINK;i++){
  969. if(snmp_para.trapsink[i].community[0]==0){
  970. *index = i;
  971.      return_val = deleteTrapSession(snmp_ntoa(snmphost->ipaddr), snmphost->community, snmphost->version, snmphost->pdutype,snmphost->vrfname);
  972. return return_val;
  973. }
  974. }
  975. }
  976. *index =-1;
  977. return -1;
  978. }
  979. static int dosnmp_host_community_auth(int argc,char *argv[],struct user *u)
  980. {
  981. SNMP_TRAPSINK *snmphost=(SNMP_TRAPSINK *)u->struct_p[SNMP_HOST];
  982. snmphost->trapflags |=SNMP_AUTH_TRAP;
  983. if(argc>1){
  984. return subcmd(snmp_host_community_cmds,&u->cmd_mskbits, argc, argv, u);
  985. }
  986. return 0;
  987. }
  988. static int dosnmp_host_community_config(int argc,char *argv[],struct user *u)
  989. {
  990. SNMP_TRAPSINK *snmphost=(SNMP_TRAPSINK *)u->struct_p[SNMP_HOST];
  991. snmphost->trapflags |=SNMP_CONFIG_TRAP;
  992. if(argc>1){
  993. return subcmd(snmp_host_community_cmds,&u->cmd_mskbits, argc, argv, u);
  994. }
  995. return 0;
  996. }
  997. static int dosnmp_host_community_snmp(int argc,char *argv[],struct user *u)
  998. {
  999. SNMP_TRAPSINK *snmphost=(SNMP_TRAPSINK *)u->struct_p[SNMP_HOST];
  1000. snmphost->trapflags |=SNMP_SNMPTYPE_TRAP;
  1001. if(argc>1){
  1002. return subcmd(snmp_host_community_cmds,&u->cmd_mskbits, argc, argv, u);
  1003. }
  1004. return 0;
  1005. }
  1006. /*snmp command*/
  1007. struct cmds snmp_location_cmds[] = {
  1008. { "LINE", MATCH_STR, 0, 0, dosnmp_location_name, NULL,NULL,0, 0, 
  1009. "LINE       --  The physical location of this node",
  1010. "LINE       --  该节点的实际位置",
  1011. NULLCHAR ,NULLCHAR},
  1012. {NULLCHAR}
  1013. };
  1014. /* snmp location ***
  1015. */
  1016. static int dosnmp_location(argc,argv,u)
  1017. int argc;
  1018. char *argv[];
  1019. struct user *u;
  1020. {
  1021. if(argc==1){
  1022. if(IsNoPref(u)){/*no snmp host argv[0]*/
  1023. memset(snmp_para.syslocation,0,SNMP_MAX_SYSLOC_LEN);
  1024. }else{
  1025. display_snmp_location();
  1026. }
  1027. return 0;
  1028. }else{
  1029.      return subcmd(snmp_location_cmds,NULL, argc, argv, u);
  1030. }
  1031. }
  1032. static int dosnmp_location_name(argc,argv,u)
  1033. int argc;
  1034. char *argv[];
  1035. struct user *u;
  1036. {
  1037. memset(snmp_para.syslocation,0,SNMP_MAX_SYSCON_LEN);
  1038.     strncpy(snmp_para.syslocation,argv[0],SNMP_MAX_SYSCON_LEN-1);
  1039. return 0;
  1040. }
  1041. void display_snmp_location(void)
  1042. {
  1043. if(snmp_para.syslocation[0]){
  1044. vty_output("snmp location %sn",snmp_para.syslocation);
  1045. }else{
  1046. vty_output("Nonen");
  1047. }
  1048. }
  1049. static int dosnmp_packetsize(argc,argv,u)
  1050. int argc;
  1051. char *argv[];
  1052. struct user *u;
  1053. {
  1054. int packetsize;
  1055.     long    rc;/*** sun define 2000.07.28 ***/
  1056. if(argc==1){
  1057. if(IsNoPref(u)){/*no snmp host argv[0]*/
  1058. snmp_para.packetsize = SNMP_DEFAULT_PACKETSIZE;
  1059. }else{
  1060. vty_output("snmp packetsize %dn",
  1061. snmp_para.packetsize);
  1062. }
  1063. return 0;
  1064. }else{
  1065.  switch(getintrc(&packetsize, argc,argv,SNMP_MIN_PACKETSIZE,SNMP_MAX_PACKETSIZE,u)){
  1066.          case ARG_NOERR:
  1067.     break;
  1068. case ARG_QUEST :
  1069.          cmderror(ERR_NEXTP, NULL, u);
  1070.     default:
  1071.          return 1;
  1072. }/*switch*/
  1073.      if ((rc = cmdend(argc-2, argv+2, u)))/*** sun define 2000.07.28 ***/
  1074.      return rc;
  1075. snmp_para.packetsize = (unsigned short)packetsize;
  1076. }
  1077. return 0;
  1078. }
  1079. static int dosnmp_queuelen(argc,argv,u)
  1080. int argc;
  1081. char *argv[];
  1082. struct user *u;
  1083. {
  1084. int queuelen;
  1085.     long    rc;/*** sun define 2000.07.28 v0.0.6 ***/
  1086. if(argc==1){
  1087. if(IsNoPref(u)){/*no snmp host argv[0]*/
  1088. snmp_para.queuelen = SNMP_DEFAULT_TRAP_QUEUELEN;
  1089. set_trapsinks(SET_SNMP_TRAP_QUEUELEN,SNMP_DEFAULT_TRAP_QUEUELEN);
  1090. }else{
  1091. vty_output("snmp queue-length %dn",
  1092. snmp_para.queuelen);
  1093. }
  1094. return 0;
  1095. }else{
  1096.  switch(getintrc(&queuelen, argc,argv,1,SNMP_MAX_TRAP_QUEUELEN,u)){
  1097.          case ARG_NOERR:
  1098.     break;
  1099. case ARG_QUEST :
  1100.          cmderror(ERR_NEXTP, NULL, u);
  1101.     default:
  1102.          return 1;
  1103. }/*switch*/
  1104.      if ((rc = cmdend(argc-2, argv+2, u)))/*** sun define 2000.07.28 ***/
  1105.      return rc;
  1106. snmp_para.queuelen = (unsigned short)queuelen;
  1107. set_trapsinks(SET_SNMP_TRAP_QUEUELEN,queuelen);
  1108. }
  1109. return 0;
  1110. }
  1111. static int dosnmp_trap_source(argc,argv,u)
  1112. int argc;
  1113. char *argv[];
  1114. struct user *u;
  1115. {
  1116. DEVICE_ETERNAL_ID eternalID;
  1117. DEVICE_ID diID;
  1118. int offset;
  1119. UINT32 ifmask;
  1120. long  rc; /*** sun define 2000.07.28 v0.0.6 ***/
  1121. /* 0 表示不需要创建,~0L表示所有端口类型 */
  1122. #ifdef SWITCH
  1123.     ifmask = INTERFACE_TYPE_MASK_ROUTING;
  1124. #else
  1125.     ifmask = (UINT32)~0L;
  1126. #endif
  1127. if (ARG_NOERR != getinterface(&eternalID, &offset, 0, 
  1128. ifmask, argc, argv, u))
  1129. return -1;
  1130. /* 修正argc和argv的值,1表示子命令 */
  1131. argc -= 1+offset;
  1132. argv += 1+offset;
  1133. /* 将eternalID转换为diID */
  1134. if (INTERFACE_GLOBAL_SUCCESS != interface_omnivorous_callback_makemomentary(&diID, eternalID))
  1135. return -1;
  1136. /* vty_output("diID=%dn",diID); */
  1137. #if 0 /*  2000.03.21   */
  1138. if(IsNoPref(u)){/*no snmp host argv[0]*/
  1139. snmp_para.trapsource = 0;
  1140. set_trapsinks(SET_SNMP_TRAP_SOURCE,0);
  1141. }else{
  1142. snmp_para.trapsource = diID;
  1143. set_trapsinks(SET_SNMP_TRAP_SOURCE,diID);
  1144. }
  1145. #else
  1146.    if ((rc = cmdend(argc, argv, u)))/*** sun define 2000.07.28 ***/
  1147.      return rc;
  1148. if(IsNoPref(u)){/*no snmp host argv[0]*/
  1149. snmp_para.trapsource = DEVICE_INVALID_ETERNAL_ID;
  1150. set_trapsinks(SET_SNMP_TRAP_SOURCE,0);
  1151. }else{
  1152. snmp_para.trapsource = eternalID;
  1153. set_trapsinks(SET_SNMP_TRAP_SOURCE,eternalID);
  1154. }
  1155. #endif /* #if 0 */
  1156. return 0;
  1157. }
  1158. static int dosnmp_trap_timeout(argc,argv,u)
  1159. int argc;
  1160. char *argv[];
  1161. struct user *u;
  1162. {
  1163. int timeout;
  1164.     long rc;/*** sun define 2000.07.28 v0.0.6 ***/
  1165. if(argc==1){
  1166. if(IsNoPref(u)){/*no snmp host argv[0]*/
  1167. snmp_para.timeout = SNMP_DEFAULT_TRAP_TIMEOUT;
  1168. set_trapsinks(SET_SNMP_TRAP_TIMEOUT,SNMP_DEFAULT_TRAP_TIMEOUT*1000000L);/** in set_traplinks() in us unit */
  1169. }else{
  1170. vty_output("snmp trap-timeout %dn",
  1171. snmp_para.timeout);
  1172. }
  1173. return 0;
  1174. }else{
  1175.  switch(getintrc(&timeout, argc,argv,1,SNMP_MAX_TRAP_TIMEOUT,u)){
  1176.          case ARG_NOERR:
  1177.     break;
  1178. case ARG_QUEST :
  1179.          cmderror(ERR_NEXTP, NULL, u);
  1180.     default:
  1181.          return 1;
  1182. }/*switch*/
  1183.      if ((rc = cmdend(argc-2, argv+2, u)))/*** sun define 2000.07.27 v0.0.6***/
  1184.      return rc;
  1185. snmp_para.timeout = (unsigned short)timeout;
  1186. set_trapsinks(SET_SNMP_TRAP_TIMEOUT,timeout*1000000L);/** in set_traplinks() in us unit */
  1187. }
  1188. return 0;
  1189. }
  1190. /*snmp command
  1191. * snmp view ***
  1192. */
  1193. static int dosnmp_view_name(int argc,char *argv[],struct user *u);
  1194. /*static int dosnmp_view_name_sun(int argc,char *argv[],struct user *u);*/
  1195. static void dosnmp_view_delete(char *viewName);
  1196. static int dosnmp_view_type(int argc,char *argv[],struct user *u);
  1197. static int display_snmp_view(void);
  1198. struct cmds snmp_view_cmds[] = {
  1199. { "WORD", MATCH_STR,  cmdPref(PF_CMDNO, 0, 0), 0x1, 
  1200. dosnmp_view_name, NULL,NULL,cmdArgc(2,0,0), cmdArgc(0,0,0), 
  1201. "WORD          --  Name of the view",
  1202. "WORD          --  视图名",
  1203. NULLCHAR,NULLCHAR},
  1204. { (char *)-1, MATCH_END,  0, 0x20, NULL,NULL,NULL,0, 0, 
  1205. "<cr>",
  1206. "结束",
  1207. NULLCHAR ,NULLCHAR},
  1208. {NULLCHAR}
  1209. };
  1210. #if 0
  1211. struct cmds snmp_view_name_cmds[] = {
  1212. { (char *)-1, MATCH_STR,  cmdPref(PF_CMDNO, 0, 0), 0, 
  1213. dosnmp_view_name_sun, NULL,NULL,2, 2, 
  1214. "WORD          --  MIB view family name",
  1215. "WORD          --  MIB 族名字",
  1216. NULLCHAR,NULLCHAR},
  1217. {NULLCHAR}
  1218. };
  1219. #endif
  1220. struct cmds snmp_view_sides_cmds[] = {
  1221. { "excluded", MATCH_AMB,  cmdPref(PF_CMDNO, 0, 0), 0, 
  1222. dosnmp_view_type, NULL,NULL,0, 1, 
  1223. "excluded      --  MIB family is excluded from the view",
  1224. "excluded      --  拒绝该 MIB 族",
  1225. NULLCHAR ,NULLCHAR},
  1226. { "included", MATCH_AMB,  cmdPref(PF_CMDNO, 0, 0), 0, 
  1227. dosnmp_view_type, NULL,NULL,0, 1, 
  1228. "included      --  MIB family is included in the view",
  1229. "included      --  包括该 MIB 族",
  1230. NULLCHAR ,NULLCHAR},
  1231. {NULLCHAR}
  1232. };
  1233. /*** sun define 2000.03.16 ***/
  1234. static int dosnmp_view(int argc,char *argv[],struct user *u)
  1235. {
  1236. if(IsNoPref(u)){/*no snmp host argv[0]*/
  1237. u->cmd_mskbits = 0x2F;
  1238. }else{
  1239. u->cmd_mskbits = 0x1F;
  1240. }
  1241. return subcmd(snmp_view_cmds,&u->cmd_mskbits, argc, argv, u);
  1242. }
  1243. void display_a_view (struct vacm_viewEntry *vp)
  1244. {
  1245. char buf[512];
  1246. if (vp->viewStorageType == SNMP_STORAGE_PERMANENT && vp->viewStatus == SNMP_ROW_ACTIVE)
  1247. {
  1248. if (vp->subtreeName[0] == '')
  1249. {
  1250. sprint_objid(buf,vp->viewSubtree,vp->viewSubtreeLen);
  1251. vty_printf("snmp-server view %s %s %sn",
  1252. vp->viewName+1,translate_objid(buf),
  1253. vp->viewType==VIEW_INCLUDED?"included":"excluded");
  1254. }
  1255. else
  1256. {
  1257. vty_printf("snmp-server view %s %s %sn",
  1258. vp->viewName+1,vp->subtreeName,
  1259. vp->viewType==VIEW_INCLUDED?"included":"excluded");
  1260. }
  1261. }
  1262. }
  1263. static int display_snmp_view(void)
  1264. {
  1265. if (vacm_walkThrViewEntry (display_a_view))
  1266. {
  1267. return FALSE;
  1268. }
  1269. else
  1270. {
  1271. return TRUE;
  1272. }
  1273. }
  1274. static int dosnmp_view_name(int argc,char *argv[],struct user *u)
  1275. {
  1276. SNMP_VIEW view;
  1277. char *name;
  1278. /*** 2000.03.18 test dump_objid ***
  1279. char buf[128];
  1280. ******/
  1281. memset(&view,0,sizeof(SNMP_VIEW));
  1282. u->struct_p[VIEW] = (unsigned long)&view;
  1283. strncpy(view.viewName,argv[0],63);
  1284. view.viewSubtreeLen = 32;/*** sun define 2000.03.17 ***/
  1285. if(IsNoPref(u)){/*no snmp host <hostnameipaddree>*/
  1286. u->cmd_mskbits = 0x2F;
  1287. if(argc<2){
  1288. dosnmp_view_delete(view.viewName);
  1289. return 0;
  1290. }
  1291. }else{
  1292. u->cmd_mskbits = 0x1F;
  1293. }
  1294. switch (getstrrc(&name, argc, argv, 0, NAME_MAXLEN, u)) {
  1295. case ARG_NOERR :
  1296. break;
  1297. case ARG_GENER :
  1298. return -1;
  1299. case ARG_PARAM :
  1300. eng_chi(u, "Incomplete command", "命令不完整");
  1301. return -1;
  1302. case ARG_QUERY :
  1303. eng_chi(u, "  WORD          --  MIB view family name",
  1304. "  WORD          --  MIB 族名字");
  1305. return 1;
  1306. case ARG_QUEST :
  1307. eng_chi(u, "WORD", "WORD");
  1308. return 1;
  1309. default :
  1310. return -1;
  1311. }
  1312. /*** 2000.03.17  ***
  1313. strncpy(viewname,argv[1],MAX_NAME_LEN-1);
  1314. ******/
  1315. if (!ReadObjidFromSubtree (name, view.viewSubtree, &view.viewSubtreeLen))
  1316. {
  1317. if (!read_objid(name,view.viewSubtree, (size_t *)(&view.viewSubtreeLen))){
  1318. vty_output("Illegal subtree oid: %sn",name);
  1319. return -1;
  1320. }
  1321. view.subtreeName[0] = '';
  1322. }
  1323. else
  1324. {
  1325. strcpy (view.subtreeName, name);
  1326. }
  1327. return subcmd(snmp_view_sides_cmds,&u->cmd_mskbits, --argc, ++argv, u);
  1328. }
  1329. #if 0
  1330. static int dosnmp_view_name_sun(int argc,char *argv[],struct user *u)
  1331. {
  1332. SNMP_VIEW *view =(SNMP_VIEW *)u->struct_p[VIEW];
  1333. if (!ReadObjidFromSubtree (argv[0], view->viewSubtree, &view->viewSubtreeLen))
  1334. {
  1335. if (!read_objid(argv[0],view->viewSubtree, (size_t *)(&view->viewSubtreeLen))){
  1336. vty_output("Illegal subtree oid: %sn",argv[0]);
  1337. return -1;
  1338. }
  1339. view->subtreeName[0] = '';
  1340. }
  1341. else
  1342. {
  1343. strcpy (view->subtreeName, argv[0]);
  1344. }
  1345. return subcmd(snmp_view_sides_cmds,&u->cmd_mskbits, argc, argv, u);
  1346. }
  1347. #endif
  1348. static void dosnmp_view_delete(char *viewName)
  1349. {
  1350. int      IsDelete=0;
  1351. struct vacm_viewEntry *vp;
  1352. while (1)
  1353. {
  1354. vp = vacm_findViewEntryByName (viewName);
  1355. if (vp != NULL)
  1356. {
  1357. vacm_destroyViewEntry (vp->viewName+1, vp->viewSubtree, vp->viewSubtreeLen);
  1358. IsDelete = 1;
  1359. }
  1360. else
  1361. {
  1362. break;
  1363. }
  1364. }
  1365. if (!IsDelete)
  1366.   vty_output("Cannot find view %sn",viewName);
  1367. }
  1368. static int dosnmp_view_type(int argc,char *argv[],struct user *u)
  1369. {
  1370. SNMP_VIEW *view =(SNMP_VIEW *)u->struct_p[VIEW];
  1371. struct vacm_viewEntry *vp;
  1372. u_char viewMask[sizeof (vp->viewMask)];
  1373. int i;
  1374. switch((char)*argv[0]){
  1375. case 'i':
  1376. case 'I':
  1377. view->viewType=VIEW_INCLUDED;
  1378. break;
  1379. case 'E':
  1380. case 'e':
  1381. view->viewType=VIEW_EXCLUDED;
  1382. break;
  1383. }
  1384. vp = vacm_getViewEntry (view->viewName, view->viewSubtree, view->viewSubtreeLen);
  1385. if (vp == NULL || vp->viewSubtreeLen != view->viewSubtreeLen)
  1386. {
  1387.      if(IsNoPref(u)){
  1388.          vty_output("%%Error: Can't find snmp viewn");
  1389.          return -1;
  1390.      }
  1391. if ((vp = vacm_createViewEntry(view->viewName, view->viewSubtree, view->viewSubtreeLen)) == NULL)
  1392. {
  1393. eng_chi(u, "failed to create view entry, may be view name to long","创建view entry失败,或许是view的名字太长");
  1394. return -1;
  1395. }
  1396. strcpy (vp->subtreeName, view->subtreeName);
  1397. }
  1398. else
  1399. {
  1400.      if(IsNoPref(u)){
  1401.          if (vp->viewType != view->viewType) {
  1402.              vty_output("%%Error: View type errorn");
  1403.              return -1;
  1404.          }
  1405.          vacm_destroyViewEntry(vp->viewName+1, vp->viewSubtree, vp->viewSubtreeLen);
  1406.          return 0;
  1407.      }
  1408. strcpy (vp->subtreeName, view->subtreeName);
  1409. }
  1410. for (i = 0; i < sizeof(viewMask); i++)
  1411. {
  1412.     viewMask[i] = 0xff;
  1413.     }
  1414. memcpy(vp->viewMask, viewMask, sizeof(viewMask));
  1415.     vp->viewType = view->viewType;
  1416.     vp->viewStorageType = SNMP_STORAGE_PERMANENT;
  1417.     vp->viewStatus = SNMP_ROW_ACTIVE;
  1418. return 0;
  1419. }
  1420. extern ULONG snmp_source_ip;
  1421. extern int change_session_sourceaddr(uint32 source_ip_addr);
  1422. int dosnmp_srcipaddr(int argc, char *argv[], struct user *u)
  1423. {
  1424. ULONG ipaddr;
  1425.        long rc;
  1426. int i;
  1427.   if(IsNoPref(u))
  1428. {
  1429. if (cmdend (argc - 1, argv + 1, u))
  1430. return -1;
  1431. else {
  1432.  ipaddr = INADDR_ANY;
  1433.  goto do_it;
  1434. }
  1435. }
  1436.   
  1437. if(argc ==1){
  1438. cmderror(ERR_INCOM, argv[0], u);
  1439. return -1;
  1440. }
  1441. else{
  1442. i = getaddress(&ipaddr, argc, argv, u);
  1443. switch(i){
  1444. case ARG_QUEST:
  1445. case ARG_QUERY:
  1446. eng_chi(u, "A.B.C.D              -- Source IP Address", "A.B.C.D              -- Source IP Address");
  1447. return 1;
  1448. case ARG_GENER:
  1449. case ARG_PARAM:
  1450. return i;
  1451. }
  1452. }
  1453. if ((rc = cmdend(argc-2, argv+2, u)))
  1454. return rc;
  1455. do_it:
  1456. if  (snmp_source_ip !=ipaddr)
  1457. {
  1458. if (ipaddr!=INADDR_ANY) 
  1459. DEVICE_ID ifid;
  1460. ifid= if_withaddr(ipaddr);
  1461. if  (ifid ==0) {
  1462.   vty_output("%s is not local ip addressn",snmp_ntoa(ipaddr));
  1463. return -1;
  1464.  }
  1465. }
  1466. snmp_source_ip= ipaddr;
  1467. change_session_sourceaddr(snmp_source_ip);
  1468. }
  1469. return 0;
  1470. }
  1471. static int dosnmp_trace_error(int argc,char *argv[],struct user *u);/*** sun define 2000.07.11 ***/
  1472. static int dosnmp_trace_event(int argc,char *argv[],struct user *u);
  1473. static int dosnmp_trace_packet(int argc,char *argv[],struct user *u);
  1474. extern int verbose;
  1475. extern int snmp_dump_packet;
  1476. void display_snmp_trap(void);
  1477. struct cmds debug_snmp_cmds[] = {
  1478. { "snmp", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, dosnmp_trace, NULL, NULL, cmdArgc(0,1,0), cmdArgc(0,1,0), 
  1479. "snmp       -- debug SNMP information", 
  1480. "snmp       -- 跟踪 SNMP 信息", 
  1481. NULLCHAR, NULLCHAR  },
  1482. { NULLCHAR }
  1483. };
  1484. struct cmds snmp_trace_cmds[] = {
  1485. { "error", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0x01, 
  1486. dosnmp_trace_error,NULL,NULL, 0, 0, 
  1487. "error            --  SNMP error information", 
  1488. "error            --  SNMP 错误信息", 
  1489.   NULLCHAR,NULLCHAR},
  1490. { "event", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0x02,
  1491. dosnmp_trace_event,NULL,NULL, 0, 0, 
  1492. "event            --  SNMP event", 
  1493. "event            --  SNMP 事件", 
  1494.   NULLCHAR,NULLCHAR},
  1495. { "packet", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0x04,
  1496. dosnmp_trace_packet,NULL,NULL,  0, 0,
  1497. "packet           --  SNMP packet",
  1498. "packet           --  SNMP 报文", 
  1499.   NULLCHAR,NULLCHAR},
  1500. { (char *)-1, MATCH_END,  0, 0x10, 
  1501. NULL,NULL,NULL,0, 0, 
  1502. "<cr>",
  1503. "<cr>",
  1504. NULLCHAR ,NULLCHAR},
  1505. {NULLCHAR}
  1506. };
  1507. extern void snmp_set_dump_verbose (int );
  1508. extern int output_error;
  1509. void snmp_no_debug (void )
  1510. {
  1511. SNMPtrace = 0;
  1512. verbose = 0;
  1513. snmp_dump_packet = 0;
  1514. }
  1515. void snmp_show_debug (uint32 debug_flag)
  1516. {
  1517. if  (SNMPtrace!=0){
  1518. vty_output ("SNMP:n");
  1519. if (SNMPtrace & SNMP_DEBUG_ERROR)
  1520. vty_output("  SNMP error debugging is onn");
  1521. if (SNMPtrace & SNMP_DEBUG_EVENT)
  1522. vty_output("  SNMP event debugging is onn");
  1523. if (SNMPtrace & SNMP_DEBUG_PACKETS)
  1524. vty_output("  SNMP packet debugging is onn");
  1525. }
  1526. }
  1527. static int dosnmp_trace(int argc,char *argv[],struct user *u)
  1528. {
  1529. if (argc<2)
  1530. {
  1531. if(IsNoPref(u)){/*no snmp host argv[0]*/
  1532. SNMPtrace = 0;
  1533.      verbose = 0;
  1534. snmp_dump_packet = 0;
  1535. set_trace_flag(MODULE_TYPE_SNMP,0xffffffff,snmp_show_debug,snmp_no_debug, 0);    
  1536. }else{
  1537. /*display_snmp_trap();*/
  1538. /*yangyuhua(m) 2006-4-24*/
  1539. u->struct_p[3] |=(SNMP_DEBUG_ERROR | (SNMP_DEBUG_EVENT|SNMP_DEBUG_VERBOSE) | SNMP_DEBUG_PACKETS);
  1540. SNMPtrace = (unsigned short)(u->struct_p[2]|u->struct_p[3]);
  1541. snmp_set_dump_verbose (SNMPtrace & SNMP_DEBUG_VERBOSE);
  1542.      verbose = SNMPtrace & SNMP_DEBUG_VERBOSE;
  1543. snmp_set_dump_packet(SNMPtrace & SNMP_DEBUG_PACKETS);
  1544. set_trace_flag(MODULE_TYPE_SNMP,SNMPtrace,snmp_show_debug, snmp_no_debug,1);    
  1545. output_error = SNMPtrace & SNMP_DEBUG_ERROR;
  1546. }
  1547. return 0;
  1548. }
  1549. u->cmd_mskbits = 0x1F;
  1550. u->struct_p[2] = SNMPtrace;/*reserve origin */
  1551. u->struct_p[3] = 0;      /*command modify*/
  1552.     if (subcmd(snmp_trace_cmds, &u->cmd_mskbits, argc, argv, u)==0){
  1553.      SNMPtrace = (unsigned short)(u->struct_p[2]|u->struct_p[3]);
  1554. snmp_set_dump_verbose (SNMPtrace & SNMP_DEBUG_VERBOSE);
  1555.      verbose = SNMPtrace & SNMP_DEBUG_VERBOSE;
  1556. snmp_set_dump_packet(SNMPtrace & SNMP_DEBUG_PACKETS);
  1557. set_trace_flag(MODULE_TYPE_SNMP,SNMPtrace,snmp_show_debug, snmp_no_debug,1);    
  1558. output_error = SNMPtrace & SNMP_DEBUG_ERROR;
  1559.     }
  1560.       return 0;
  1561. }
  1562. void display_snmp_trap(void)
  1563. {
  1564. if  (SNMPtrace!=0){
  1565. vty_output("snmp-server trace");
  1566. if (SNMPtrace & SNMP_DEBUG_ERROR)
  1567. vty_output(" error");/*v0.0.3*/
  1568. if (SNMPtrace & SNMP_DEBUG_EVENT)
  1569. vty_output(" event");/*v0.0.3*/
  1570. if (SNMPtrace & SNMP_DEBUG_PACKETS)
  1571. vty_output(" packet");
  1572. vty_output("n");
  1573. }else{
  1574. vty_output("Nonen");
  1575. }
  1576. }
  1577. static int dosnmp_trace_error(int argc,char *argv[],struct user *u)
  1578. {
  1579.   u->struct_p[3] |= SNMP_DEBUG_ERROR;
  1580.  
  1581.     if (argc>1){
  1582.      return subcmd(snmp_trace_cmds, &u->cmd_mskbits, argc, argv, u);
  1583.     }
  1584.     return 0;
  1585. }
  1586. static int dosnmp_trace_event(int argc,char *argv[],struct user *u)
  1587. {
  1588.   u->struct_p[3] |= (SNMP_DEBUG_EVENT|SNMP_DEBUG_VERBOSE);
  1589.  
  1590.     if (argc>1){
  1591.      return subcmd(snmp_trace_cmds, &u->cmd_mskbits, argc, argv, u);
  1592.     }
  1593.     return 0;
  1594. }
  1595. static int dosnmp_trace_packet(int argc,char *argv[],struct user *u)
  1596. {
  1597.   u->struct_p[3] |= SNMP_DEBUG_PACKETS;
  1598.  
  1599.     if (argc>1){
  1600.      return subcmd(snmp_trace_cmds, &u->cmd_mskbits, argc, argv, u);
  1601.     }
  1602.     return 0;
  1603. }
  1604. BOOL do_showrunning_snmpv3_remote_engineID();
  1605. long snmp_showrunning(DEVICE_ID diID)
  1606. {
  1607. char    *pstrName=NULLCHAR;
  1608. int    emptyconfiguration = TRUE;
  1609. #ifdef INCLUDE_SNMPV3
  1610.     emptyconfiguration = 
  1611.         do_showrunning_snmpv3_remote_engineID()&&emptyconfiguration;
  1612.     emptyconfiguration = display_snmp_group()&&emptyconfiguration;
  1613.     emptyconfiguration = display_snmp_user()&&emptyconfiguration;
  1614. #endif
  1615.     emptyconfiguration = display_snmp_community()&&emptyconfiguration;
  1616. if(snmp_para.syscontact[0]){
  1617. vty_printf("snmp-server contact ");
  1618. if(isquotation(snmp_para.syscontact))
  1619.     vty_printf(""");
  1620. vty_printf("%s",snmp_para.syscontact);
  1621. if(isquotation(snmp_para.syscontact))
  1622.     vty_printf(""");
  1623.     vty_printf("n");
  1624. emptyconfiguration = FALSE;
  1625. }
  1626. emptyconfiguration = display_snmp_host()&&emptyconfiguration;
  1627. if(snmp_para.syslocation[0]){
  1628. vty_printf("snmp-server location ");
  1629. if(isquotation(snmp_para.syslocation))
  1630.     vty_printf(""");
  1631. vty_printf("%s",snmp_para.syslocation);
  1632. if(isquotation(snmp_para.syslocation))
  1633.     vty_printf(""");
  1634.     vty_printf("n");
  1635. emptyconfiguration = FALSE;
  1636.     }
  1637. if(snmp_para.packetsize!=SNMP_DEFAULT_PACKETSIZE){
  1638. vty_printf("snmp-server packetsize %dn",snmp_para.packetsize);
  1639. emptyconfiguration = FALSE;
  1640. }
  1641. if(snmp_para.queuelen!=SNMP_DEFAULT_TRAP_QUEUELEN){
  1642. vty_printf("snmp-server queue-length %dn",snmp_para.queuelen);
  1643. emptyconfiguration = FALSE;
  1644. }
  1645. if(snmp_para.trapsource!=DEVICE_INVALID_ETERNAL_ID){
  1646. interface_omnivorous_callback_newgetname(snmp_para.trapsource, &pstrName);
  1647. vty_printf("snmp-server trap-source %sn",pstrName);
  1648. emptyconfiguration = FALSE;
  1649. if(pstrName)
  1650.      sys_mem_free(pstrName);
  1651. }
  1652. if(snmp_para.timeout!=SNMP_DEFAULT_TRAP_TIMEOUT){
  1653. vty_printf("snmp-server trap-timeout %dn",snmp_para.timeout);
  1654. emptyconfiguration = FALSE;
  1655. }
  1656. if(snmp_source_ip!=0){
  1657. vty_printf("snmp-server source-addr %sn",snmp_ntoa(snmp_source_ip));
  1658. emptyconfiguration = FALSE;
  1659. }
  1660. emptyconfiguration = display_snmp_view()&&emptyconfiguration;
  1661.     if(emptyconfiguration)
  1662.         return INTERFACE_DEVICE_ERROR_EMPTYCONFIGURATION;
  1663.     else
  1664.      return INTERFACE_GLOBAL_SUCCESS;
  1665. }
  1666. /*SunXi added for BCMP*/
  1667. #ifdef INCLUDE_BCMP
  1668. static char *_snmp_bcmp_cfg_buffer;
  1669. static int  _snmp_bcmp_cfg_pos, _snmp_bcmp_cfg_max;
  1670. static int32 snmp_bcmp_vty_rio_fun(char* buffer,int len)
  1671. {
  1672.     if (_snmp_bcmp_cfg_max <= _snmp_bcmp_cfg_pos + len)
  1673.     {
  1674.         _snmp_bcmp_cfg_buffer[_snmp_bcmp_cfg_pos] = 0;
  1675.         _snmp_bcmp_cfg_pos = _snmp_bcmp_cfg_max ;
  1676.         return 0;
  1677.     }
  1678.     memcpy(&_snmp_bcmp_cfg_buffer[_snmp_bcmp_cfg_pos], buffer, len);
  1679.     _snmp_bcmp_cfg_pos += len;
  1680.     _snmp_bcmp_cfg_buffer[_snmp_bcmp_cfg_pos] = 0;
  1681.     return len;
  1682. }
  1683. int snmp_bcmp_config(char *buffer, size_t size)
  1684. {
  1685.     union vty_output_attribute param, old;
  1686.     _snmp_bcmp_cfg_pos = 0;
  1687.     _snmp_bcmp_cfg_max = size;
  1688.     _snmp_bcmp_cfg_buffer = buffer;
  1689.     _snmp_bcmp_cfg_buffer[0] = 0;
  1690.     param.rio.rflag = RIO_CUSTOM;
  1691.     param.rio.u.function =snmp_bcmp_vty_rio_fun;
  1692.     /*save old redirection*/
  1693.     vty_output_ctrl(VTY_OUTPUT_GET_REDIRECT, &old);
  1694.     vty_output_ctrl(VTY_OUTPUT_SET_REDIRECT, &param);
  1695.     /*get config*/
  1696.     display_snmp_community();
  1697.     display_snmp_view();
  1698.     /*restore old redirection*/
  1699.     vty_output_ctrl(VTY_OUTPUT_SET_REDIRECT, &old);
  1700.     return strlen(_snmp_bcmp_cfg_buffer);
  1701. }
  1702. #endif
  1703. int do_show_snmp(int argc, char *argv[], struct user *u);
  1704. int do_show_snmp_host(int argc, char *argv[], struct user *u);
  1705. int do_show_snmp_view(int argc, char *argv[], struct user *u);
  1706. extern void show_snmp(void);
  1707. extern void show_snmp_host(void);
  1708. struct cmds snmp_show_cmds[] = {
  1709. { "snmp", MATCH_AMB, 0, 0, do_show_snmp, NULL, NULL, 0, 0, 
  1710. "snmp          - SNMP statistics", 
  1711. "snmp          - SNMP 统计信息", 
  1712. NULLCHAR, NULLCHAR 
  1713. },
  1714. { NULLCHAR }
  1715. };
  1716. struct cmds snmp_show_host_cmds[] = {
  1717. #ifdef INCLUDE_SNMPV3
  1718. { "engineID", MATCH_AMB, 0, 0, do_show_snmp_engineID, NULL, NULL, 0, 1,
  1719. "engineID      - show SNMP engine information", 
  1720. "engineID      - SNMP 引擎信息",
  1721. NULLCHAR, NULLCHAR
  1722. },
  1723. { "group", MATCH_AMB, 0, 0, do_show_snmp_group, NULL, NULL, 0, 1,
  1724. "group         - show SNMP group information", 
  1725. "group         - SNMP 组信息",
  1726. NULLCHAR, NULLCHAR
  1727. },
  1728. #endif
  1729. { "host", MATCH_AMB, 0, 0, do_show_snmp_host, NULL, NULL, 0, 1,
  1730. "host          - show SNMP trap hosts", 
  1731. "host          - SNMP 陷阱主机信息",
  1732. NULLCHAR, NULLCHAR
  1733. },
  1734. { "view", MATCH_AMB, 0, 0, do_show_snmp_view, NULL, NULL, 0, 1,
  1735. "view          - show SNMP views", 
  1736. "view          - SNMP 视图信息",
  1737. NULLCHAR, NULLCHAR
  1738. },
  1739. #ifdef INCLUDE_SNMPV3
  1740. { "user", MATCH_AMB, 0, 0, do_show_snmp_user, NULL, NULL, 0, 1,
  1741. "user          - show SNMP group information", 
  1742. "user          - SNMP 组信息",
  1743. NULLCHAR, NULLCHAR
  1744. },
  1745. #endif
  1746. { (char *)-1, MATCH_END,  0, 0, 
  1747. NULL,NULL,NULL,0, 0, 
  1748. "<cr>",
  1749. "结束",
  1750. NULLCHAR ,NULLCHAR},
  1751. {NULLCHAR}
  1752. };
  1753. int do_show_snmp(int argc, char *argv[], struct user *u)
  1754. {
  1755. if (argc <= 1)
  1756. {
  1757. show_snmp();
  1758. }
  1759. else
  1760. {
  1761.       return subcmd(snmp_show_host_cmds, &u->cmd_mskbits, argc, argv, u);
  1762. }
  1763. return 0;
  1764. }
  1765. int do_show_snmp_host(int argc, char *argv[], struct user *u)
  1766. {
  1767. show_snmp_host();
  1768. return 0;
  1769. }
  1770. void display_view (struct vacm_viewEntry *vp)
  1771. {
  1772. char buf[512], buf1[128], buf2[16];
  1773. int len;
  1774. if (vp->viewMaskLen == 0)
  1775. strcpy (buf1, "-");
  1776. else
  1777. {
  1778. sprintf (buf1, "%X", vp->viewMask[0]);
  1779. for (len = 1; len < vp->viewMaskLen; len ++)
  1780. {
  1781. sprintf (buf2, ":%X", vp->viewMask[len]);
  1782. }
  1783. }
  1784. sprint_objid(buf,vp->viewSubtree,vp->viewSubtreeLen);
  1785. vty_printf("%s %s %s %s %s %sn",
  1786. vp->viewName+1,translate_objid(buf), buf1,
  1787. vp->viewType==VIEW_INCLUDED?"included":"excluded",snmp_storage_trans[vp->viewStorageType],
  1788. snmp_status_trans[vp->viewStatus]);
  1789. }
  1790. int do_show_snmp_view(int argc, char *argv[], struct user *u)
  1791. {
  1792. if (vacm_walkThrViewEntry (display_view))
  1793. {
  1794. vty_printf_end(1);
  1795. }
  1796. else
  1797. {
  1798. vty_printf ("Nonen");
  1799. vty_printf_end(1);
  1800. }
  1801. return 0;
  1802. }
  1803. /*copied and modified from vacm_parse_access, file snmplibvacm.c
  1804.   Sunxi, Feb 23, 2004, for SNMPv3*/
  1805. void vacm_parse_access_bdcom(const char *name, int model, int level, 
  1806.                     const char *readview, const char *writeview, const char *notifyview,
  1807.                     const char *ipacl)
  1808. {
  1809.     struct vacm_accessEntry *ap;
  1810.     if (model != SNMP_SEC_MODEL_ANY &&
  1811.         model != SNMP_SEC_MODEL_SNMPv1 &&
  1812.         model != SNMP_SEC_MODEL_SNMPv2c &&
  1813.         model != SNMP_SEC_MODEL_USM) {
  1814.      vty_output("%%Error: bad security model (any, v1, v2c, usm)n");
  1815.      return;
  1816.     }
  1817.     if (level != SNMP_SEC_LEVEL_NOAUTH &&
  1818.         level != SNMP_SEC_LEVEL_AUTHNOPRIV &&
  1819.         level != SNMP_SEC_LEVEL_AUTHPRIV) {
  1820.      vty_output("%%Error: bad security level (noauthnopriv, authnopriv, authpriv)n");
  1821.      return;
  1822.     }
  1823.     if (readview != NULL && strlen(readview)+1 > sizeof(ap->readView)) {
  1824.      vty_output("%%Error: readView too longn");
  1825.         return;
  1826.     }
  1827.     if (writeview != NULL && strlen(writeview)+1 > sizeof(ap->writeView)) {
  1828.      vty_output("%%Error: writeView too longn");
  1829.         return;
  1830.     }
  1831.     if (notifyview != NULL && strlen(notifyview)+1 > sizeof(ap->notifyView)) {
  1832.      vty_output("%%Error: notifyView too longn");
  1833.         return;
  1834.     }
  1835.     if (ipacl != NULL && strlen(ipacl)+1 > sizeof(ap->access_list)) {
  1836.      vty_output("%%Error: ip access list too longn");
  1837.         return;
  1838.     }
  1839.     ap = vacm_getAccessEntry(name, "", model, SNMP_SEC_LEVEL_AUTHPRIV);
  1840.     if (ap == NULL) {
  1841.         ap = vacm_createAccessEntry (name, "", model, level);
  1842.         if (!ap) {
  1843.      vty_output("%%Error: failed to create access entryn");
  1844.      return;
  1845.         }
  1846.     } else {
  1847.         ap->readView[0] = 0;
  1848.         ap->writeView[0] = 0;
  1849.         ap->notifyView[0] = 0;
  1850.         ap->access_list[0] = 0;
  1851.         ap->securityLevel = level;
  1852.         ap->securityModel = model;
  1853.     }
  1854.     strcpy(ap->readView, readview);
  1855.     if (writeview != NULL)
  1856.         strcpy(ap->writeView, writeview);
  1857.     if (notifyview != NULL)
  1858.         strcpy(ap->notifyView, notifyview);
  1859.     if (ipacl != NULL)
  1860.         strcpy(ap->access_list, ipacl);
  1861.     ap->contextMatch = CONTEXT_MATCH_EXACT;
  1862.     ap->storageType = SNMP_STORAGE_NONVOLATILE;
  1863.     ap->status = SNMP_ROW_ACTIVE;
  1864.     free (ap->reserved);
  1865.     ap->reserved = NULL;
  1866. }
  1867. /*copied and modified from vacm_parse_group, file snmplibvacm.c
  1868.   Sunxi, Feb 23, 2004, for SNMPv3*/
  1869. void vacm_parse_group_bdcom(const char *group, const char *security, int model)
  1870. {
  1871.     struct vacm_groupEntry *gp;
  1872.     if (group == NULL || *group == 0) {
  1873. vty_output("%%Error: missing GROUP parametern");
  1874. return;
  1875.     }
  1876.     if (security == NULL || *security == 0) {
  1877. vty_output("%%Error: missing SECURITY parametern");
  1878. return;
  1879.     }
  1880.     if (model != SNMP_SEC_MODEL_SNMPv1 &&
  1881.         model != SNMP_SEC_MODEL_SNMPv2c &&
  1882.         model != SNMP_SEC_MODEL_USM) {
  1883. vty_output("%%Error: bad security model, should be: v1, v2c or usmn");
  1884. return;
  1885.     }
  1886.     if (strlen(security)+1 > sizeof(gp->groupName)) {
  1887.      vty_output("%%Error: security name too longn");
  1888. return;
  1889.     }
  1890.     /*destroy the old one*/
  1891.     gp = vacm_getGroupEntry(model, security);
  1892.     if (gp == NULL) {
  1893.         gp = vacm_createGroupEntry(model, security);
  1894.         if (!gp) {
  1895.      vty_output("%%Error: failed to create group entryn");
  1896.      return;
  1897.         }
  1898.     }
  1899.     strcpy (gp->groupName, group);
  1900.     gp->storageType = SNMP_STORAGE_PERMANENT;
  1901.     gp->status = SNMP_ROW_ACTIVE;
  1902.     free (gp->reserved);
  1903.     gp->reserved = NULL;
  1904. }
  1905. /*copied and modified from usm_parse_config_usmUser, file snmplibsnmpusm.c
  1906.   Sunxi, Feb 24, 2004, for SNMPv3*/
  1907. struct usmUser *
  1908. usm_parse_config_user_bdcom(const char * name, 
  1909.         oid * authProtocol, size_t authProtocolLen, 
  1910.         oid * privProtocol, size_t privProtocolLen,
  1911.         char *password,
  1912.         char *snmpEngineID, size_t snmpEngineIDLen)
  1913. {
  1914.   struct usmUser *user;
  1915.   int ret;
  1916.   u_char   userKey[SNMP_MAXBUF_SMALL];
  1917.   size_t   userKeyLen = SNMP_MAXBUF_SMALL;
  1918.   user = usm_create_initial_user(name, authProtocol, authProtocolLen, privProtocol, privProtocolLen);
  1919.   if (user == NULL)
  1920.     return NULL;
  1921.   if (snmpEngineID != NULL) {
  1922.       if (user->engineIDLen < snmpEngineIDLen) {
  1923.         free(user->engineID);
  1924.         user->engineID = malloc(user->engineIDLen);
  1925.       } else {
  1926.         memset(user->engineID, 0, user->engineIDLen);
  1927.       }
  1928.       memcpy(user->engineID, snmpEngineID, snmpEngineIDLen);
  1929.       user->engineIDLen = snmpEngineIDLen;
  1930.   }
  1931.   SNMP_FREE(user->cloneFrom);
  1932.   user->cloneFrom = NULL;
  1933.   user->cloneFromLen = 0;
  1934.   if (password != NULL && strlen(password) != 0) {
  1935.       ret = generate_Ku(user->authProtocol, user->authProtocolLen,
  1936.          (u_char *)password, strlen(password),
  1937.          userKey, &userKeyLen );
  1938.       if (ret != SNMPERR_SUCCESS) {
  1939.         vty_output("%%Error: Generating auth key from pass phrase.n");
  1940.         usm_free_user(user);
  1941.         return NULL;
  1942.       }
  1943.       user->authKeyLen =
  1944.         sc_get_properlength(user->authProtocol, user->authProtocolLen);
  1945.       user->authKey = (u_char *) malloc(user->authKeyLen);
  1946.       ret = generate_kul(user->authProtocol, user->authProtocolLen,
  1947.           user->engineID, user->engineIDLen,
  1948.           userKey, userKeyLen,
  1949.           user->authKey, &user->authKeyLen );
  1950.       if (ret != SNMPERR_SUCCESS) {
  1951.         vty_output("%%Error: Generating auth key from pass phrase.n");
  1952.         usm_free_user(user);
  1953.         return NULL;
  1954.       }
  1955.       user->privKey = (u_char *) malloc(user->authKeyLen);
  1956.       user->privKeyLen = user->authKeyLen;
  1957.       memcpy(user->privKey, user->authKey, user->privKeyLen);
  1958.   }
  1959.   user->userPublicString = NULL;
  1960.   user->userStorageType = ST_NONVOLATILE;
  1961.   user->password_plaintext = strdup(password);
  1962.   return user;
  1963. }
  1964. /*create ucd_snmpv3 access control structs with community name
  1965. copied by sxf from ucd_snmpv3 function vacm_parse_simple(vacm_vars.c)*/
  1966. static void CreateSnmpComm (SNMP_COMMUNITY *snmp_para_comm)
  1967. {
  1968. char *theoid = ".1.3.6.1";
  1969. char *authType = "noauth";
  1970. char *addressname = "default";
  1971. char rw[SNMP_MAX_COMMUNITY_LEN+16];
  1972. char line[3*SNMP_MAX_COMMUNITY_LEN];
  1973. struct vacm_securityEntry *vp;
  1974. /*if the entry exists, delete it and then insert a new entry*/
  1975. vacm_DestroyCommunity (snmp_para_comm->name);
  1976. strcpy (rw, "none");
  1977. if (snmp_para_comm->privilege == READWRITE)
  1978. {
  1979. if ((snmp_para_comm->viewname)[0] == '')
  1980. {
  1981. sprintf (rw, "__vn%s", snmp_para_comm->name);
  1982. }
  1983. else
  1984. {
  1985. strcpy (rw, snmp_para_comm->viewname);
  1986. }
  1987. }
  1988. /*add security virtual name*/
  1989.     sprintf(line,"__sn%s %s %s", snmp_para_comm->name, addressname, snmp_para_comm->name);
  1990.     vacm_parse_security("com2sec",line);
  1991.  
  1992. /*add virtual group name*/
  1993. sprintf(line,"__gn%s v1 __sn%s", snmp_para_comm->name, snmp_para_comm->name);
  1994.     vacm_parse_group("group",line);
  1995.     sprintf(line,"__gn%s v2c __sn%s", snmp_para_comm->name, snmp_para_comm->name);
  1996.     vacm_parse_group("group",line);
  1997. /*add virtual view if viewname is NULL*/
  1998. if ((snmp_para_comm->viewname)[0] == '')
  1999. {
  2000. sprintf(line,"__vn%s included %s", snmp_para_comm->name, theoid);
  2001. vacm_parse_view("view",line);
  2002. /*create virtual access*/
  2003. sprintf(line, "__gn%s  "" any %s exact __vn%s %s %s", snmp_para_comm->name,
  2004.           authType, snmp_para_comm->name, rw, rw);
  2005. vacm_parse_access("access",line);
  2006. }
  2007. else
  2008. {
  2009. /*create virtual access*/
  2010. sprintf(line, "__gn%s  "" any %s exact %s %s %s", snmp_para_comm->name,
  2011.           authType, snmp_para_comm->viewname, rw, rw);
  2012. vacm_parse_access("access",line);
  2013. }
  2014. if ((vp = vacm_FindSecEntryByCommName (snmp_para_comm->name)) != NULL)
  2015. {
  2016. strcpy (vp->access_list, snmp_para_comm->access_list);
  2017. strcpy (vp->viewname, snmp_para_comm->viewname);
  2018. vp->privilege = snmp_para_comm->privilege;
  2019. }
  2020. }
  2021. #ifdef INCLUDE_SNMPV3
  2022. /*
  2023.  *  snmpv3 group commands
  2024.  *  u->struct_p[0]: SNMP Security Modely, ie., SNMP version
  2025.  *  u->struct_p[1]: for version 3: authPriv or authNoPriv or NoAuthNoPriv;
  2026.  *                  for other version, not use
  2027.  *  u->struct_p[2]: access list
  2028.  *  u->struct_p[3]: notify view
  2029.  *  u->struct_p[4]: read view
  2030.  *  u->struct_p[5]: write view
  2031.  *  
  2032.  */
  2033. #define SNMPV3_GROUP_VER_INDEX 0
  2034. #define SNMPV3_GROUP_AP_INDEX 1
  2035. #define SNMPV3_GROUP_ACL_INDEX 2
  2036. #define SNMPV3_GROUP_NOTIFY_INDEX 3
  2037. #define SNMPV3_GROUP_READ_INDEX 4
  2038. #define SNMPV3_GROUP_WRITE_INDEX 5
  2039. #define SNMPV3_GROUP_VIEW_NOTIFY    0x01
  2040. #define SNMPV3_GROUP_VIEW_READ      0x02
  2041. #define SNMPV3_GROUP_VIEW_WRITE     0x04
  2042. #define SNMPV3_GROUP_ACL            0x08
  2043. static int dosnmp_group_acl(int argc,char *argv[],struct user *u);
  2044. static int dosnmp_group_view(int argc,char *argv[],struct user *u);
  2045. static struct cmds snmp_group_view_access_cmds[] = {
  2046. { "access", MATCH_AMB, cmdPref(0, 0, 0), SNMPV3_GROUP_ACL,
  2047. dosnmp_group_acl,NULL,NULL, 0, 0, 
  2048. "access           --  specify an access-list associated with this group",
  2049. "access           --  为该组指定访问控制列表", 
  2050.   NULLCHAR,NULLCHAR
  2051. },
  2052. { "notify", MATCH_AMB, cmdPref(0, 0, 0), SNMPV3_GROUP_VIEW_NOTIFY,
  2053. dosnmp_group_view,NULL,NULL, 0, 0, 
  2054. "notify           --  specify a notify view for the group", 
  2055. "notify           --  为该组指定通知视图", 
  2056.   NULLCHAR,NULLCHAR
  2057. },
  2058. { "read", MATCH_AMB, cmdPref(0, 0, 0), SNMPV3_GROUP_VIEW_READ,
  2059. dosnmp_group_view,NULL,NULL, 0, 0, 
  2060. "read             --  specify a read view for the group", 
  2061. "read             --  为该组指定读操作视图", 
  2062.   NULLCHAR,NULLCHAR
  2063. },
  2064. { "write", MATCH_AMB, cmdPref(0, 0, 0), SNMPV3_GROUP_VIEW_WRITE,
  2065. dosnmp_group_view,NULL,NULL, 0, 0, 
  2066. "write            --  specify a write view for the group",
  2067. "write            --  为该组指定写操作视图",
  2068.   NULLCHAR,NULLCHAR
  2069. },
  2070. { DUMMYSTR, MATCH_END, cmdPref(0, 0, 0), 0,
  2071. NULL,NULL,NULL, 0, 0, 
  2072. "<cr>",
  2073. "<cr>",
  2074.   NULLCHAR,NULLCHAR
  2075. },
  2076. { NULLCHAR }
  2077. };
  2078. static int dosnmp_group_acl(int argc,char *argv[],struct user *u)
  2079. {
  2080.     char *name;
  2081. switch(getstrrc(&name,  argc--, argv++, 0, SNMP_MAX_COMMUNITY_LEN, u)){
  2082. case ARG_NOERR:
  2083.     break;
  2084.     case ARG_QUEST:
  2085.     case ARG_QUERY:
  2086.         eng_chi(u,  "  WORD    --  Name of access list",
  2087.                         "  WORD    --  访问列表的名字");
  2088.         return 1;
  2089.      case ARG_PARAM :
  2090.      cmderror(ERR_NEXTP, NULL, u);
  2091.      return -1;
  2092.     case ARG_QPART:
  2093. case ARG_GENER:
  2094.     default:
  2095.      return -1;
  2096. }
  2097. u->struct_p[SNMPV3_GROUP_ACL_INDEX] = (int)name;
  2098.     if (argc > 1)
  2099.     return subcmd(snmp_group_view_access_cmds, &u->cmd_mskbits, argc, argv, u);
  2100.     else
  2101.         return 0;
  2102. }
  2103. static int dosnmp_group_view(int argc,char *argv[],struct user *u)
  2104. {
  2105.     char *name;
  2106.     int index;
  2107.     switch ((char)*argv[0])
  2108.     {
  2109.     case 'n':case 'N':
  2110.         index = SNMPV3_GROUP_NOTIFY_INDEX;
  2111.         break;
  2112.     case 'r':case 'R':
  2113.         index = SNMPV3_GROUP_READ_INDEX;
  2114.         break;
  2115.     case 'w':case 'W':
  2116.         index = SNMPV3_GROUP_WRITE_INDEX;
  2117.         break;
  2118.     default:
  2119.         assert(0);
  2120.     }
  2121. switch(getstrrc(&name,  argc--, argv++, 0, SNMP_MAX_COMMUNITY_LEN, u)){
  2122. case ARG_NOERR:
  2123.     break;
  2124.     case ARG_QUEST:
  2125.     case ARG_QUERY:
  2126.         eng_chi(u,  "  WORD    --  Name of view",
  2127.                         "  WORD    --  视图的名字");
  2128.         return 1;
  2129.      case ARG_PARAM :
  2130.      cmderror(ERR_NEXTP, NULL, u);
  2131.      return -1;
  2132.     case ARG_QPART:
  2133. case ARG_GENER:
  2134.     default:
  2135.      return -1;
  2136. }
  2137.     u->struct_p[index] = (unsigned long)name;
  2138.     if (argc > 1)
  2139.     return subcmd(snmp_group_view_access_cmds, &u->cmd_mskbits, argc, argv, u);
  2140.     else
  2141.         return 0;
  2142. }
  2143. #define SNMPV3_GROUP_AUTHNOPRIV     0x01
  2144. #define SNMPV3_GROUP_NOAUTHNOPRIV   0x02
  2145. #define SNMPV3_GROUP_AUTHPRIV       0x04
  2146. static int dosnmp_group_authpriv_para(int argc,char *argv[],struct user *u)
  2147. {
  2148.     if ((u->cmd_mskbits & SNMPV3_GROUP_AUTHNOPRIV) == 0)
  2149.     {
  2150.         u->struct_p[SNMPV3_GROUP_AP_INDEX] = SNMP_SEC_LEVEL_AUTHNOPRIV;
  2151.     }
  2152.     else if ((u->cmd_mskbits & SNMPV3_GROUP_NOAUTHNOPRIV) == 0)
  2153.     {
  2154.         u->struct_p[SNMPV3_GROUP_AP_INDEX] = SNMP_SEC_LEVEL_NOAUTH;
  2155.     }
  2156.     else if ((u->cmd_mskbits & SNMPV3_GROUP_AUTHPRIV) == 0)
  2157.     {
  2158.         u->struct_p[SNMPV3_GROUP_AP_INDEX] = SNMP_SEC_LEVEL_AUTHPRIV;
  2159.     }
  2160.     if (IsNoPref(u)) {
  2161.         int rc;
  2162.         if ((rc = cmdend(--argc, ++argv, u)))
  2163.             return rc;
  2164.         return 0;
  2165.     }
  2166.     u->cmd_mskbits = -1;
  2167.     if (argc > 1)
  2168.     return subcmd(snmp_group_view_access_cmds, &u->cmd_mskbits, argc, argv, u);
  2169.     else
  2170.         return 0;
  2171. }
  2172. static struct cmds snmp_group_authpriv_cmds[] = {
  2173. { "auth", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_GROUP_AUTHNOPRIV,
  2174. dosnmp_group_authpriv_para,NULL,NULL, 0, 0, 
  2175. "auth             --  Specifies authentication of a packet without encrypting it",
  2176. "auth             --  该组需要认证但不加密",
  2177.   NULLCHAR,NULLCHAR
  2178. },
  2179. { "noauth", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_GROUP_NOAUTHNOPRIV, 
  2180. dosnmp_group_authpriv_para,NULL,NULL, 0, 0, 
  2181. "noauth           --  Specifies no authentication of a packet",
  2182. "noauth           --  该组既不需要认证也不需要加密",
  2183.   NULLCHAR,NULLCHAR
  2184. },
  2185. { "priv", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_GROUP_AUTHPRIV, 
  2186. dosnmp_group_authpriv_para,NULL,NULL, 0, 0, 
  2187. "priv             --  Specifies authentication of a packet with encryption",
  2188. "priv             --  该组需要认证和加密",
  2189.   NULLCHAR,NULLCHAR
  2190. },
  2191. { NULLCHAR }
  2192. };
  2193. #define SNMPV3_GROUP_SECURITY_V1    0x01
  2194. #define SNMPV3_GROUP_SECURITY_V2c   0x02
  2195. #define SNMPV3_GROUP_SECURITY_V3    0x04
  2196. static int dosnmp_group_security(int argc,char *argv[],struct user *u)
  2197. {
  2198.     if ((u->cmd_mskbits & SNMPV3_GROUP_SECURITY_V1) == 0)
  2199.     {
  2200.         u->struct_p[SNMPV3_GROUP_VER_INDEX] = SNMP_SEC_MODEL_SNMPv1;
  2201.     }
  2202.     else if ((u->cmd_mskbits & SNMPV3_GROUP_SECURITY_V2c) == 0)
  2203.     {
  2204.         u->struct_p[SNMPV3_GROUP_VER_INDEX] = SNMP_SEC_MODEL_SNMPv2c;
  2205.     }
  2206.     else if ((u->cmd_mskbits & SNMPV3_GROUP_SECURITY_V3) == 0)
  2207.     {
  2208.         u->struct_p[SNMPV3_GROUP_VER_INDEX] = SNMP_SEC_MODEL_USM;
  2209.     }
  2210.     u->cmd_mskbits = -1;
  2211.     if (u->struct_p[SNMPV3_GROUP_VER_INDEX] == SNMP_SEC_MODEL_USM)
  2212.     {
  2213.      return subcmd(snmp_group_authpriv_cmds, &u->cmd_mskbits, argc, argv, u);
  2214.     }
  2215.     else
  2216.     {
  2217.      return subcmd(snmp_group_view_access_cmds, &u->cmd_mskbits, argc, argv, u);
  2218.     }
  2219. }
  2220. static struct cmds snmp_group_cmds[] = {
  2221. { "v1", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_GROUP_SECURITY_V1,
  2222. dosnmp_group_security,NULL,NULL, 0, 0, 
  2223. "v1               --  group using the v1 security model", 
  2224. "v1               --  该组使用SNMPv1安全模型", 
  2225.   NULLCHAR,NULLCHAR
  2226. },
  2227. { "v2c", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_GROUP_SECURITY_V2c, 
  2228. dosnmp_group_security,NULL,NULL, 0, 0, 
  2229. "v2c              --  group using the v2c security model", 
  2230. "v2c              --  该组使用SNMPv2c安全模型", 
  2231.   NULLCHAR,NULLCHAR
  2232. },
  2233. { "v3", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_GROUP_SECURITY_V3, 
  2234. dosnmp_group_security,NULL,NULL, 0, 0, 
  2235. "v3               --  group using the User Security Model (SNMPv3)", 
  2236. "v3               --  该组使用基于用户的安全模型", 
  2237.   NULLCHAR,NULLCHAR
  2238. },
  2239. { NULLCHAR }
  2240. };
  2241. static int dosnmp_group(int argc,char *argv[],struct user *u)
  2242. {
  2243.     char *name;
  2244.     int rc;
  2245. switch(getstrrc(&name,  argc--, argv++, 0, SNMP_MAX_COMMUNITY_LEN, u)){
  2246. case ARG_NOERR:
  2247.     break;
  2248.     case ARG_QUEST:
  2249.     case ARG_QUERY:
  2250.         eng_chi(u,  "  WORD    --  Name of the group",
  2251.                         "  WORD    --  组的名字");
  2252.         return 1;
  2253.      case ARG_PARAM :
  2254.      cmderror(ERR_NEXTP, NULL, u);
  2255.      return -1;
  2256.     case ARG_QPART:
  2257. case ARG_GENER:
  2258.     default:
  2259.      return -1;
  2260. }
  2261. memset((void *)u->struct_p, 0, sizeof(u->struct_p));
  2262.     u->cmd_mskbits = -1;
  2263. rc = subcmd(snmp_group_cmds, &u->cmd_mskbits, argc, argv, u);
  2264. if (rc != 0)
  2265.     return rc;
  2266.     if (IsNoPref(u)) {
  2267.         vacm_destroyAccessEntry(name, "", 
  2268.             u->struct_p[SNMPV3_GROUP_VER_INDEX], u->struct_p[SNMPV3_GROUP_AP_INDEX]);
  2269.         return 0;
  2270.     }
  2271. if (u->struct_p[SNMPV3_GROUP_READ_INDEX] == NULL)
  2272.     u->struct_p[SNMPV3_GROUP_READ_INDEX] = (int)SNMPV3_DEFAULT_VIEW;
  2273. vacm_parse_access_bdcom(name, u->struct_p[SNMPV3_GROUP_VER_INDEX], u->struct_p[SNMPV3_GROUP_AP_INDEX],
  2274.     (const char *)u->struct_p[SNMPV3_GROUP_READ_INDEX], (const char *)u->struct_p[SNMPV3_GROUP_WRITE_INDEX], (const char *)u->struct_p[SNMPV3_GROUP_NOTIFY_INDEX],
  2275.     (const char *)u->struct_p[SNMPV3_GROUP_ACL_INDEX]);
  2276. return 0;
  2277. }
  2278. /*show running group*/
  2279. static void display_a_group(struct vacm_accessEntry *group)
  2280. {
  2281.     vty_printf("snmp-server group %s ", &group->groupName[1]);
  2282.     switch(group->securityModel) {
  2283.     case SNMP_SEC_MODEL_SNMPv1:
  2284.         vty_printf("v1 ");
  2285.         break;
  2286.     case SNMP_SEC_MODEL_SNMPv2c:
  2287.         vty_printf("v2c ");
  2288.         break;
  2289.     case SNMP_SEC_MODEL_USM:
  2290.         vty_printf("v3 ");
  2291.         switch(group->securityLevel) {
  2292.         case SNMP_SEC_LEVEL_NOAUTH:
  2293.             vty_printf("noauth ");
  2294.             break;
  2295.         case SNMP_SEC_LEVEL_AUTHNOPRIV:
  2296.             vty_printf("auth ");
  2297.             break;
  2298.         case SNMP_SEC_LEVEL_AUTHPRIV:
  2299.             vty_printf("priv ");
  2300.             break;
  2301.         }
  2302.         break;
  2303.     }
  2304.     if (strcasecmp(group->readView, SNMPV3_DEFAULT_VIEW) != 0)
  2305.         vty_printf("read %s ", group->readView);
  2306.     if (group->writeView[0] != 0)
  2307.         vty_printf("write %s ", group->writeView);
  2308.     if (group->notifyView[0] != 0)
  2309.         vty_printf("notify %s ", group->notifyView);
  2310.     if (group->access_list[0] != 0)
  2311.         vty_printf("access %s", group->access_list);
  2312.     vty_printf("n");
  2313. }
  2314. static int display_snmp_group()
  2315. {
  2316.     return vacm_walkThrAccessEntry(display_a_group);
  2317. }
  2318. /*show commands*/
  2319. static void show_a_group(struct vacm_accessEntry *group)
  2320. {
  2321.     vty_printf("groupname: %sn", group->groupName);
  2322.     vty_printf("security model: ");
  2323.     switch(group->securityModel) {
  2324.     case SNMP_SEC_MODEL_SNMPv1:
  2325.         vty_printf("v1 ");
  2326.         break;
  2327.     case SNMP_SEC_MODEL_SNMPv2c:
  2328.         vty_printf("v2c ");
  2329.         break;
  2330.     case SNMP_SEC_MODEL_USM:
  2331.         vty_printf("v3 ");
  2332.         switch(group->securityLevel) {
  2333.         case SNMP_SEC_LEVEL_NOAUTH:
  2334.             vty_printf("noauth ");
  2335.             break;
  2336.         case SNMP_SEC_LEVEL_AUTHNOPRIV:
  2337.             vty_printf("auth ");
  2338.             break;
  2339.         case SNMP_SEC_LEVEL_AUTHPRIV:
  2340.             vty_printf("priv ");
  2341.             break;
  2342.         }
  2343.         break;
  2344.     }
  2345.     vty_printf("n");
  2346.     vty_printf("read: %s n", (strcasecmp(group->readView, SNMPV3_DEFAULT_VIEW) != 0) ?
  2347.         group->readView : "default");
  2348.     vty_printf("write: %s n", (strlen(group->writeView) != 0) ?
  2349.         group->writeView : "<no writeview specified>");
  2350.     vty_printf("notify: %s n", (strlen(group->notifyView) != 0) ?
  2351.         group->notifyView : "<no notifyview specified>");
  2352.     if (strlen(group->access_list) != 0)
  2353.         vty_printf("access list: %sn", group->access_list);
  2354.     vty_printf("n");
  2355. }
  2356. static int do_show_snmp_group(int argc,char *argv[],struct user *u)
  2357. {
  2358.     int rc;
  2359.     if ((rc = cmdend(--argc, ++argv, u)))
  2360.         return rc;
  2361.     vacm_walkThrAccessEntry(show_a_group);
  2362.     vty_printf_end(1);
  2363.     return 0;
  2364. }
  2365. /*
  2366.  *  snmpv3 user commands
  2367.  *  u->struct_p[0]: SNMP Security Modely, ie., SNMP version
  2368.  *  u->struct_p[1]: for version 3: authPriv or authNoPriv or NoAuthNoPriv;
  2369.  *                  for other version, not use
  2370.  *  u->struct_p[2]: remote flag
  2371.  *  u->struct_p[3]: remote host
  2372.  *  u->struct_p[4]: remote port
  2373.  *  u->struct_p[5]: auth digest method, md5 or sha
  2374.  *  u->struct_p[6]: auth password
  2375.  *  u->struct_p[7]: access list
  2376.  *  
  2377.  */
  2378. #define SNMPV3_USER_VER_INDEX 0
  2379. #define SNMPV3_USER_AP_INDEX 1
  2380. #define SNMPV3_USER_REMOTE_INDEX 2
  2381. #define SNMPV3_USER_REMOTE_HOST_INDEX 3
  2382. #define SNMPV3_USER_REMOTE_PORT_INDEX 4
  2383. #define SNMPV3_USER_AUTHMETHOD_INDEX 5
  2384. #define SNMPV3_USER_AUTHPSWD_INDEX 6
  2385. #define SNMPV3_USER_ACL_INDEX 7
  2386. static int dosnmp_user_authpriv_para(int argc,char *argv[],struct user *u);
  2387. #define SNMPV3_USER_AUTH        0x01
  2388. #define SNMPV3_USER_AUTH_MD5    0x02
  2389. #define SNMPV3_USER_AUTH_SHA    0x04
  2390. #define SNMPV3_USER_ENCRY       0x08
  2391. #define SNMPV3_USER_ACL         0x10
  2392. #define SNMPV3_USER_CR          0x80000000
  2393. #define SNMPV3_USER_SECURITY_V1    0x01
  2394. #define SNMPV3_USER_SECURITY_V2c   0x02
  2395. #define SNMPV3_USER_SECURITY_V3    0x04
  2396. #define SNMPV3_USER_REMOTE          0x08
  2397. #define SNMPV3_USER_REMOTE_PORT     0x10
  2398. static int dosnmp_user_auth(int argc, char *argv[],struct user *u);
  2399. static int dosnmp_user_encry(int argc, char *argv[],struct user *u);
  2400. static int dosnmp_user_acl(int argc,char *argv[],struct user *u)
  2401. {
  2402.     char *acl;
  2403.     int rc;
  2404. switch(getstrrc(&acl,  argc--, argv++, 0, SNMP_MAX_COMMUNITY_LEN, u)){
  2405. case ARG_NOERR:
  2406.     break;
  2407.     case ARG_QUEST:
  2408.     case ARG_QUERY:
  2409.         eng_chi(u,  "  WORD    --  IP accesslist allowing access with this username",
  2410.                         "  WORD    --  该用户使用的IP访问列表");
  2411.         return 1;
  2412.      case ARG_PARAM :
  2413.      cmderror(ERR_NEXTP, NULL, u);
  2414.      return -1;
  2415.     case ARG_QPART:
  2416. case ARG_GENER:
  2417.     default:
  2418.      return -1;
  2419. }
  2420. if ((rc = cmdend(--argc, ++argv, u)))
  2421.     return rc;
  2422.     u->struct_p[SNMPV3_USER_ACL_INDEX] = (unsigned long)acl;
  2423. return 0;
  2424. }
  2425. static struct cmds snmp_user_authprivacl_cmds[] = {
  2426. { "auth", MATCH_AMB, cmdPref(0, 0, 0), SNMPV3_USER_AUTH,
  2427. dosnmp_user_auth,NULL,NULL, 0, 0, 
  2428. "auth             --  Specifies authentication parameters for the user",
  2429. "auth             --  设定用户的认证参数",
  2430.   NULLCHAR,NULLCHAR
  2431. },
  2432. { "md5", MATCH_AMB, cmdPref(0, 0, 0), SNMPV3_USER_AUTH_MD5, 
  2433. dosnmp_user_authpriv_para,NULL,NULL, 0, 0, 
  2434. "md5              --  Use HMAC MD5 algorithm for authentication",
  2435. "md5              --  使用MD5算法",
  2436.   NULLCHAR,NULLCHAR
  2437. },
  2438. { "sha", MATCH_AMB, cmdPref(0, 0, 0), SNMPV3_USER_AUTH_SHA,
  2439. dosnmp_user_authpriv_para,NULL,NULL, 0, 0, 
  2440. "sha              --  Use HMAC SHA algorithm for authentication",
  2441. "sha              --  使用SHA算法",
  2442.   NULLCHAR,NULLCHAR
  2443. },
  2444. { "encrypted", MATCH_AMB, cmdPref(0, 0, 0), SNMPV3_USER_ENCRY, 
  2445. dosnmp_user_encry,NULL,NULL, 0, 0, 
  2446. "encrypted        --  specifying passwords as MD5 or SHA digests",
  2447. "encrypted        --  用户的密码",
  2448.   NULLCHAR,NULLCHAR
  2449. },
  2450. { "access", MATCH_AMB, cmdPref(0, 0, 0), SNMPV3_USER_ACL, 
  2451. dosnmp_user_acl,NULL,NULL, 0, 0, 
  2452. "access           --  specify an access-list associated with this user",
  2453. "access           --  指定该用户的访问控制列表",
  2454.   NULLCHAR,NULLCHAR
  2455. },
  2456. { DUMMYSTR, MATCH_END, cmdPref(PF_CMDNO, 0, 0), SNMPV3_USER_CR,
  2457. NULL,NULL,NULL, 0, 0, 
  2458. "<cr>",
  2459. "<cr>",
  2460.   NULLCHAR,NULLCHAR
  2461. },
  2462. { NULLCHAR }
  2463. };
  2464. static int dosnmp_user_auth(int argc, char *argv[],struct user *u)
  2465. {
  2466.     u->struct_p[SNMPV3_USER_AP_INDEX] |= SNMPV3_USER_AUTH;
  2467.     u->cmd_mskbits = SNMPV3_USER_AUTH_MD5|SNMPV3_USER_AUTH_SHA;
  2468.     return subcmd(snmp_user_authprivacl_cmds, &u->cmd_mskbits, argc, argv, u);
  2469. }
  2470. static int dosnmp_user_encry(int argc, char *argv[],struct user *u)
  2471. {
  2472.     u->struct_p[SNMPV3_USER_AP_INDEX] = SNMPV3_USER_ENCRY;
  2473.     /*encrypted命令后只能是auth命令*/
  2474.     u->cmd_mskbits = SNMPV3_USER_AUTH;
  2475.     return subcmd(snmp_user_authprivacl_cmds, &u->cmd_mskbits, argc, argv, u);
  2476. }
  2477. static int dosnmp_user_authpriv_para(int argc, char *argv[],struct user *u)
  2478. {
  2479.     char *password;
  2480.     if ((u->cmd_mskbits & SNMPV3_USER_AUTH_MD5) == 0)
  2481.         u->struct_p[SNMPV3_USER_AUTHMETHOD_INDEX] = SNMPV3_USER_AUTH_MD5;
  2482.     else
  2483.         u->struct_p[SNMPV3_USER_AUTHMETHOD_INDEX] = SNMPV3_USER_AUTH_SHA;
  2484. switch(getstrrc(&password,  argc--, argv++, 0, SNMP_MAX_COMMUNITY_LEN, u)){
  2485. case ARG_NOERR:
  2486.     break;
  2487.     case ARG_QUEST:
  2488.     case ARG_QUERY:
  2489.         eng_chi(u,  "  WORD    --  authentication pasword for user",
  2490.                         "  WORD    --  用户的密码");
  2491.         return 1;
  2492.      case ARG_PARAM :
  2493.      cmderror(ERR_NEXTP, NULL, u);
  2494.      return -1;
  2495.     case ARG_QPART:
  2496. case ARG_GENER:
  2497.     default:
  2498.      return -1;
  2499. }
  2500. u->struct_p[SNMPV3_USER_AUTHPSWD_INDEX] = (unsigned long)password;
  2501.     if (argc > 1) {
  2502.         u->cmd_mskbits = SNMPV3_USER_ACL|SNMPV3_USER_CR;
  2503.         return subcmd(snmp_user_authprivacl_cmds, &u->cmd_mskbits, argc, argv, u);
  2504.     } else
  2505.         return 0;
  2506. }
  2507. static int dosnmp_user_security(int argc,char *argv[],struct user *u)
  2508. {
  2509.     if ((u->cmd_mskbits & SNMPV3_USER_SECURITY_V1) == 0)
  2510.     {
  2511.         u->struct_p[SNMPV3_USER_VER_INDEX] = SNMP_SEC_MODEL_SNMPv1;
  2512.     }
  2513.     else if ((u->cmd_mskbits & SNMPV3_USER_SECURITY_V2c) == 0)
  2514.     {
  2515.         u->struct_p[SNMPV3_USER_VER_INDEX] = SNMP_SEC_MODEL_SNMPv2c;
  2516.     }
  2517.     else if ((u->cmd_mskbits & SNMPV3_USER_SECURITY_V3) == 0)
  2518.     {
  2519.         u->struct_p[SNMPV3_USER_VER_INDEX] = SNMP_SEC_MODEL_USM;
  2520.     }
  2521.     if (u->struct_p[SNMPV3_USER_VER_INDEX] == SNMP_SEC_MODEL_USM)
  2522.     {
  2523.         u->cmd_mskbits = SNMPV3_USER_ENCRY|SNMPV3_USER_AUTH|SNMPV3_USER_ACL;
  2524.     }
  2525.     else
  2526.     {
  2527.         u->cmd_mskbits = SNMPV3_USER_ACL;
  2528.     }
  2529.     u->cmd_mskbits |= SNMPV3_USER_CR;
  2530.     if (argc > 1)
  2531.         return subcmd(snmp_user_authprivacl_cmds, &u->cmd_mskbits, argc, argv, u);
  2532.     else return 0;
  2533. }
  2534. static int dosnmp_user_remote_host(int argc,char *argv[],struct user *u);
  2535. static int dosnmp_user_remote_port(int argc,char *argv[],struct user *u);
  2536. static struct cmds snmp_user_version_remote_cmds[] = {
  2537. { "v1", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_USER_SECURITY_V1,
  2538. dosnmp_user_security,NULL,NULL, 0, 0, 
  2539. "v1               --  user using the v1 security model",
  2540. "v1               --  该用户使用SNMPv1安全模型", 
  2541.   NULLCHAR,NULLCHAR
  2542. },
  2543. { "v2c", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_USER_SECURITY_V2c, 
  2544. dosnmp_user_security,NULL,NULL, 0, 0, 
  2545. "v2c              --  user using the v2c security model",
  2546. "v2c              --  该用户使用SNMPv2c安全模型", 
  2547.   NULLCHAR,NULLCHAR
  2548. },
  2549. { "v3", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_USER_SECURITY_V3, 
  2550. dosnmp_user_security,NULL,NULL, 0, 0, 
  2551. "v3               --  user using the v3 security model",
  2552. "v3               --  该用户使用基于用户的安全模型", 
  2553.   NULLCHAR,NULLCHAR
  2554. },
  2555. { "remote", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_USER_REMOTE, 
  2556. dosnmp_user_remote_host,NULL,NULL, 0, 0, 
  2557. "remote           --  Specify a remote SNMP entity to which the user belongs",
  2558. "remote           --  指定该用户所属的远端SNMP实体",
  2559.   NULLCHAR,NULLCHAR
  2560. },
  2561. { "udp-port", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_USER_REMOTE_PORT,
  2562. dosnmp_user_remote_port,NULL,NULL, 0, 0, 
  2563. "udp-port         --  The remote SNMP entity's UDP port number",
  2564. "udp-port         --  远端SNMP实体的UDP端口号",
  2565.   NULLCHAR,NULLCHAR
  2566. },
  2567. { NULLCHAR }
  2568. };
  2569. static int dosnmp_user_remote_host(int argc,char *argv[],struct user *u)
  2570. {
  2571.     uint32 remoteaddr;
  2572. switch(getaddress((unsigned long *)&remoteaddr,  argc--, argv++, u)){
  2573. case ARG_NOERR:
  2574.     break;
  2575.     case ARG_QUEST:
  2576.     case ARG_QUERY:
  2577.         eng_chi(u,  "  A.B.C.D --  IP address of remote SNMP entity",
  2578.                         "  A.B.C.D --  远端SNMP实体的IP地址");
  2579.         return 1;
  2580.      case ARG_PARAM :
  2581.      cmderror(ERR_NEXTP, NULL, u);
  2582.      return -1;
  2583.     case ARG_QPART:
  2584. case ARG_GENER:
  2585.     default:
  2586.      return -1;
  2587. }
  2588. u->struct_p[SNMPV3_USER_REMOTE_HOST_INDEX] = remoteaddr;
  2589. u->cmd_mskbits |= SNMPV3_USER_REMOTE_PORT;
  2590. return subcmd(snmp_user_version_remote_cmds, &u->cmd_mskbits, argc, argv, u);
  2591. }
  2592. static int dosnmp_user_remote_port(int argc,char *argv[],struct user *u)
  2593. {
  2594.     uint32 remoteport;
  2595. switch(getuintrc((unsigned long *)&remoteport,  argc--, argv++, 0, 65535, u)){
  2596. case ARG_NOERR:
  2597.     break;
  2598.     case ARG_QUEST:
  2599.     case ARG_QUERY:
  2600.         eng_chi(u,  "  <0-65535> --  The remote SNMP entity's UDP port number",
  2601.                         "  <0-65535> --  远端SNMP实体的端口号");
  2602.         return 1;
  2603.      case ARG_PARAM :
  2604.      cmderror(ERR_NEXTP, NULL, u);
  2605.      return -1;
  2606.     case ARG_QPART:
  2607. case ARG_GENER:
  2608.     default:
  2609.      return -1;
  2610. }
  2611. u->struct_p[SNMPV3_USER_REMOTE_PORT_INDEX] = remoteport;
  2612. u->cmd_mskbits = ~(SNMPV3_USER_REMOTE_PORT|SNMPV3_USER_REMOTE);
  2613. return subcmd(snmp_user_version_remote_cmds, &u->cmd_mskbits, argc, argv, u);
  2614. }
  2615. static int dosnmp_user(int argc,char *argv[],struct user *u)
  2616. {
  2617.     char *username, *group;
  2618.     oid *privproto = usmNoPrivProtocol, *authproto = usmNoAuthProtocol;
  2619.     size_t privprotoLen = sizeof(usmNoPrivProtocol)/sizeof(oid),
  2620.            authprotoLen = sizeof(usmNoAuthProtocol)/sizeof(oid);
  2621.     char snmpEngineId[SNMP_MAX_ENG_SIZE], *pEid = NULL;
  2622.     size_t snmpEngineIdLen;
  2623.     int rc;
  2624.     struct usmUser *user;
  2625. switch(getstrrc(&username,  argc--, argv++, 0, SNMP_MAX_COMMUNITY_LEN, u)){
  2626. case ARG_NOERR:
  2627.     break;
  2628.     case ARG_QUEST:
  2629.     case ARG_QUERY:
  2630.         eng_chi(u,  "  WORD    --  The name of the user on the host that connects to the agent",
  2631.                         "  WORD    --  用户的名字");
  2632.         return 1;
  2633.      case ARG_PARAM :
  2634.      cmderror(ERR_NEXTP, NULL, u);
  2635.      return -1;
  2636.     case ARG_QPART:
  2637. case ARG_GENER:
  2638.     default:
  2639.      return -1;
  2640. }
  2641. switch(getstrrc(&group,  argc--, argv++, 0, SNMP_MAX_COMMUNITY_LEN, u)){
  2642. case ARG_NOERR:
  2643.     break;
  2644.     case ARG_QUEST:
  2645.     case ARG_QUERY:
  2646.         eng_chi(u,  "  WORD    --  Group to which the user belongs",
  2647.                         "  WORD    --  用户的所属的组");
  2648.         return 1;
  2649.      case ARG_PARAM :
  2650.      cmderror(ERR_NEXTP, NULL, u);
  2651.      return -1;
  2652.     case ARG_QPART:
  2653. case ARG_GENER:
  2654.     default:
  2655.      return -1;
  2656. }
  2657. memset((void *)u->struct_p, 0, sizeof(u->struct_p));
  2658.     u->cmd_mskbits = ~SNMPV3_USER_REMOTE_PORT;
  2659. rc = subcmd(snmp_user_version_remote_cmds, &u->cmd_mskbits, argc, argv, u);
  2660. if (rc != 0)
  2661.     return rc;
  2662. if (u->struct_p[SNMPV3_USER_AP_INDEX] & SNMPV3_USER_ENCRY)
  2663. {
  2664.     privproto = usmDESPrivProtocol;
  2665.     privprotoLen = sizeof(usmDESPrivProtocol)/sizeof(oid);
  2666. }
  2667.     if (u->struct_p[SNMPV3_USER_AP_INDEX] & SNMPV3_USER_AUTH)
  2668.     {
  2669.         if (u->struct_p[SNMPV3_USER_AUTHMETHOD_INDEX] == SNMPV3_USER_AUTH_MD5)
  2670.         {
  2671.             authproto = usmHMACMD5AuthProtocol;
  2672.             authprotoLen = sizeof(usmHMACMD5AuthProtocol)/sizeof(oid);
  2673.         }
  2674.         else
  2675.         {
  2676.             authproto = usmHMACSHA1AuthProtocol;
  2677.             authprotoLen = sizeof(usmHMACSHA1AuthProtocol)/sizeof(oid);
  2678.         }
  2679.     }
  2680.     if (u->struct_p[SNMPV3_USER_ACL_INDEX] != 0) {
  2681.         if (strlen((char*)(u->struct_p[SNMPV3_USER_ACL_INDEX])) > sizeof(user->access_list)) {
  2682.             vty_output("%%Error: Access list too long.n");
  2683.             return 0;
  2684.         }
  2685.     }
  2686.     /*check if any duplicate snmp users ? */
  2687.     memset((void *)snmpEngineId, 0, sizeof(snmpEngineId));
  2688. if (u->struct_p[SNMPV3_USER_REMOTE_HOST_INDEX] != 0) {
  2689.     if (u->struct_p[SNMPV3_USER_REMOTE_PORT_INDEX] == 0)
  2690.         u->struct_p[SNMPV3_USER_REMOTE_PORT_INDEX] = SNMP_TRAP_PORT;
  2691.         pEid = snmpv3_get_remote_engineID(snmp_ntoa(u->struct_p[SNMPV3_USER_REMOTE_HOST_INDEX]),
  2692.                     u->struct_p[SNMPV3_USER_REMOTE_PORT_INDEX]);
  2693.         if (pEid == NULL && !IsNoPref(u)) {
  2694.             vty_output("%%Error: No snmpEngineID configured for remote snmp host %s port %d.n",
  2695.                         snmp_ntoa(u->struct_p[SNMPV3_USER_REMOTE_HOST_INDEX]), u->struct_p[SNMPV3_USER_REMOTE_PORT_INDEX]);
  2696.             return 0;
  2697.         }
  2698.         user = usm_get_user(pEid, SNMP_MAX_ENG_SIZE, username);
  2699.         if (user != NULL) {
  2700.             usm_remove_user(user);
  2701.             usm_free_user(user);
  2702.             snmpv3_dec_remote_engineID_reference(snmp_ntoa(u->struct_p[SNMPV3_USER_REMOTE_HOST_INDEX]),
  2703.                 u->struct_p[SNMPV3_USER_REMOTE_PORT_INDEX]);
  2704.         }
  2705.         snmpEngineIdLen = SNMP_MAX_ENG_SIZE;
  2706. } else {
  2707.         snmpEngineIdLen = snmpv3_get_engineID(snmpEngineId, sizeof(snmpEngineId));
  2708.         user = usm_get_user(snmpEngineId, snmpEngineIdLen, username);
  2709.         if (user != NULL) {
  2710.             usm_remove_user(user);
  2711.             usm_free_user(user);
  2712.         }
  2713. }
  2714. if (IsNoPref(u)) {
  2715.     vacm_destroyGroupEntry(u->struct_p[SNMPV3_USER_VER_INDEX], username);
  2716.     return 0;
  2717. }
  2718.     user = usm_parse_config_user_bdcom(username,
  2719.                 authproto, authprotoLen, privproto, privprotoLen, 
  2720.                (char *)( u->struct_p[SNMPV3_USER_AUTHPSWD_INDEX]),
  2721.                 pEid, snmpEngineIdLen);
  2722.     if (user == NULL)
  2723.         return 0;
  2724.     if (u->struct_p[SNMPV3_USER_REMOTE_HOST_INDEX] != 0) 
  2725.         snmpv3_inc_remote_engineID_reference(snmp_ntoa(u->struct_p[SNMPV3_USER_REMOTE_HOST_INDEX]),
  2726.             u->struct_p[SNMPV3_USER_REMOTE_PORT_INDEX]);
  2727.     usm_add_user(user);
  2728.     vacm_parse_group_bdcom(group, username, u->struct_p[SNMPV3_USER_VER_INDEX]);
  2729.     if (u->struct_p[SNMPV3_USER_ACL_INDEX] != 0) {
  2730.         strncpy(user->access_list, (char*)(u->struct_p[SNMPV3_USER_ACL_INDEX]),
  2731.             strlen((char *)(u->struct_p[SNMPV3_USER_ACL_INDEX])));
  2732.     } else
  2733.         user->access_list[0] = 0;
  2734.     return 0;
  2735. }
  2736. extern void snmpv3_get_remote_host_info_by_engineID(u_char *snmpEngineID, u_char **addr, u_short *port);
  2737. /*show running commands*/
  2738. static void display_a_user(struct usmUser *user)
  2739. {
  2740.     struct vacm_groupEntry *group;
  2741.     char *version_info, *auth_info = NULL, *encrypt_info = "", *remote_addr, l_snmpEngineID[SNMP_MAX_ENG_SIZE];
  2742.     u_short remote_port;
  2743.     size_t l_snmpeidLen;
  2744.     if (user->userStatus != RS_ACTIVE || user->userStorageType != ST_NONVOLATILE)
  2745.         return;
  2746.     vty_printf("snmp-server user %s ", user->name);
  2747.     if ((group = vacm_getGroupEntry(SNMP_SEC_MODEL_SNMPv1, user->secName)) != NULL) {
  2748.         version_info = "v1";
  2749.     } else if ((group = vacm_getGroupEntry(SNMP_SEC_MODEL_SNMPv2c, user->secName)) != NULL) {
  2750.         version_info = "v2c";
  2751.     } else if ((group = vacm_getGroupEntry(SNMP_SEC_MODEL_USM, user->secName)) != NULL) {
  2752.         version_info = "v3";
  2753.         if (snmp_oid_compare(user->privProtocol, user->privProtocolLen, 
  2754.                 usmDESPrivProtocol, sizeof(usmDESPrivProtocol)/sizeof(usmDESPrivProtocol[0])) == 0) {
  2755.             encrypt_info = "encrypted ";
  2756.         }
  2757.         if (snmp_oid_compare(user->authProtocol, user->authProtocolLen, 
  2758.                 usmHMACMD5AuthProtocol, sizeof(usmHMACMD5AuthProtocol)/sizeof(usmHMACMD5AuthProtocol[0])) == 0) {
  2759.             auth_info = "auth md5";
  2760.         } else if (snmp_oid_compare(user->authProtocol, user->authProtocolLen, 
  2761.                 usmHMACSHA1AuthProtocol, sizeof(usmHMACSHA1AuthProtocol)/sizeof(usmHMACSHA1AuthProtocol[0])) == 0) {
  2762.             auth_info = "auth sha";
  2763.         }
  2764.     }
  2765.     memset(l_snmpEngineID, 0, sizeof(l_snmpEngineID));
  2766.     /*l_snmpeidLen = snmpv3_get_engineID(&l_snmpEngineID, sizeof(l_snmpEngineID));*/
  2767.     l_snmpeidLen = snmpv3_get_engineID(l_snmpEngineID, sizeof(l_snmpEngineID));/*by yangyuhua 2005-12-6*/
  2768.     if (l_snmpeidLen == user->engineIDLen 
  2769.         && memcmp(l_snmpEngineID, user->engineID, l_snmpeidLen) == 0) {
  2770.         /*local user*/
  2771.         vty_printf("%s %s ", group->groupName, version_info);
  2772.     } else {
  2773.         snmpv3_get_remote_host_info_by_engineID(user->engineID, (u_char **)&remote_addr, &remote_port);
  2774.         if (remote_addr == NULL) {
  2775.             vty_printf("%s %s ", group->groupName, version_info);
  2776.         } else {
  2777.             vty_printf("%s remote %s ", group->groupName, remote_addr);
  2778.             if (remote_port != SNMP_TRAP_PORT)
  2779.                 vty_printf("udp-port %d ", remote_port);
  2780.             vty_printf("%s ", version_info);
  2781.         }
  2782.     }
  2783.     vty_printf("%s", encrypt_info);
  2784.     if (auth_info != NULL)
  2785.         vty_printf("%s %s", auth_info, user->password_plaintext);
  2786.     if (user->access_list[0] != 0)
  2787.         vty_printf("access %s", user->access_list);
  2788.     vty_printf("n");
  2789. }
  2790. static BOOL display_snmp_user()
  2791. {
  2792.     return usm_walkThrUserEntry(display_a_user);
  2793. }
  2794. /*show commands*/
  2795. static void show_a_user(struct usmUser *user)
  2796. {
  2797.     struct vacm_groupEntry *group;
  2798.     char engineID[SNMP_MAX_ENG_SIZE * 2 + 1];
  2799.     memset((void *)engineID, 0, sizeof(engineID));
  2800.     snmpv3_engineID2str(user->engineID, user->engineIDLen, engineID);
  2801.     vty_printf("User name: %sn", user->name);
  2802.     vty_printf("Engine ID: %sn", engineID);
  2803.     vty_printf("storage-type: ");
  2804.     switch (user->userStorageType) {
  2805.     case ST_OTHER:
  2806.         vty_printf("othern");
  2807.         break;
  2808.     case ST_VOLATILE:
  2809.         vty_printf("volatilen");
  2810.         break;
  2811.     case ST_NONVOLATILE:
  2812.         vty_printf("nonvolatilen");
  2813.         break;
  2814.     case ST_PERMANENT:
  2815.         vty_printf("permanentn");
  2816.         break;
  2817.     case ST_READONLY:
  2818.         vty_printf("readonlyn");
  2819.         break;
  2820.     default:
  2821.         vty_printf("unknownn");
  2822.     }
  2823.     vty_printf("Rowstatus: ");
  2824.     switch (user->userStatus) {
  2825.     case RS_ACTIVE:
  2826.         vty_printf("activen");
  2827.         break;
  2828.     case RS_NOTINSERVICE:
  2829.         vty_printf("notInServicen");
  2830.         break;
  2831.     case RS_NOTREADY:
  2832.         vty_printf("notReadyn");
  2833.         break;
  2834.     case RS_CREATEANDGO:
  2835.         vty_printf("createAndGon");
  2836.         break;
  2837.     case RS_CREATEANDWAIT:
  2838.         vty_printf("createAndWaitn");
  2839.         break;
  2840.     case RS_DESTROY:
  2841.         vty_printf("destroyn");
  2842.         break;
  2843.     default:
  2844.         vty_printf("unknownn");
  2845.     }
  2846.     vty_printf("Authentication Protocol: ");
  2847.     if (snmp_oid_compare(user->authProtocol, user->authProtocolLen, 
  2848.             usmHMACMD5AuthProtocol, sizeof(usmHMACMD5AuthProtocol)/sizeof(usmHMACMD5AuthProtocol[0])) == 0) {
  2849.         vty_printf("MD5 n");
  2850.     } else if (snmp_oid_compare(user->authProtocol, user->authProtocolLen, 
  2851.             usmHMACSHA1AuthProtocol, sizeof(usmHMACSHA1AuthProtocol)/sizeof(usmHMACSHA1AuthProtocol[0])) == 0) {
  2852.         vty_printf("SHA n");
  2853.     } else vty_printf("none n");
  2854.     vty_printf("Group-name: ");
  2855.     if ((group = vacm_getGroupEntry(SNMP_SEC_MODEL_SNMPv1, user->secName)) != NULL) {
  2856.         vty_printf("%st", group->groupName);
  2857.     } else if ((group = vacm_getGroupEntry(SNMP_SEC_MODEL_SNMPv2c, user->secName)) != NULL) {
  2858.         vty_printf("%st", group->groupName);
  2859.     } else if ((group = vacm_getGroupEntry(SNMP_SEC_MODEL_USM, user->secName)) != NULL) {
  2860.         vty_printf("%st", group->groupName);
  2861.     }
  2862.     if (user->access_list[0] != 0)
  2863.         vty_printf("access list: %s", user->access_list);
  2864.     vty_printf("nn");
  2865. }
  2866. static int do_show_snmp_user(int argc,char *argv[],struct user *u)
  2867. {
  2868.     int rc;
  2869.     if ((rc = cmdend(--argc, ++argv, u))){
  2870.         return rc;
  2871.     }
  2872.     usm_walkThrUserEntry(show_a_user);
  2873.     vty_printf_end(1);
  2874.     return 0;
  2875. }
  2876. /*
  2877.  * 下面两个全局变量用于传递参数.由于在调用其间保证不进行任务切换,因此不会导致同步错误
  2878.  */
  2879. static char *_oldEngineID, *_newEngineID;
  2880. static size_t _oldEidLen, _newEidLen;
  2881. static void refresh_a_snmp_user_engineID(struct usmUser *user)
  2882. {
  2883.     if (user->engineIDLen == _oldEidLen 
  2884.         && memcmp(user->engineID, _oldEngineID, _oldEidLen) == 0) {
  2885.         /*matched*/
  2886.         user->engineID = realloc(user->engineID, _newEidLen);
  2887.         memcpy(user->engineID, _newEngineID, _newEidLen);
  2888.         user->engineIDLen = _newEidLen;
  2889.     }
  2890. }
  2891. void refresh_snmp_user_engineID(char *oldID, size_t oldIDLen, char *newID, size_t newIDLen)
  2892. {
  2893.     _oldEngineID = oldID;
  2894.     _newEngineID = newID;
  2895.     _oldEidLen = oldIDLen;
  2896.     _newEidLen = newIDLen;
  2897.     usm_walkThrUserEntry(refresh_a_snmp_user_engineID);
  2898.     return;
  2899. }
  2900. /*
  2901.  *  snmpv3 engineid commands
  2902.  *  u->struct_p[0]: remote address
  2903.  *  u->struct_p[1]: remote port
  2904.  *  
  2905.  */
  2906. #define SNMPV3_ENGINEID_REMOTE_HOST_INDEX 0
  2907. #define SNMPV3_ENGINEID_REMOTE_PORT_INDEX 1
  2908. static int dosnmp_engineID_local(int argc,char *argv[],struct user *u);
  2909. static int dosnmp_engineID_remote(int argc,char *argv[],struct user *u);
  2910. static int dosnmp_engineID_string(int argc,char *argv[],struct user *u);
  2911. static int dosnmp_engineID_remote_udpport(int argc,char *argv[],struct user *u);
  2912. static struct cmds snmp_engineid_cmds[] = {
  2913. { "local", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0,
  2914. dosnmp_engineID_local,NULL,NULL, 0, 0, 
  2915. "local            --  engineID of the local agent",
  2916. "local            --  配置本地代理者的SNMP引擎ID", 
  2917.   NULLCHAR,NULLCHAR
  2918. },
  2919. { "remote", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), 0, 
  2920. dosnmp_engineID_remote,NULL,NULL, 0, 0, 
  2921. "remote           --  engineID of the remote agent",
  2922. "remote           --  配置远端代理者的SNMP引擎ID", 
  2923.   NULLCHAR,NULLCHAR
  2924. },
  2925. { NULLCHAR }
  2926. };
  2927. #define SNMPV3_ENGINEID_REMOTE_PORT     0x01
  2928. #define SNMPV3_ENGINEID_ENGINEID        0x02
  2929. static struct cmds snmp_engineid_string_cmds[] = {
  2930. { "WORD", MATCH_STR, cmdPref(PF_CMDNO, 0, 0), SNMPV3_ENGINEID_ENGINEID,
  2931. dosnmp_engineID_string,NULL,NULL, 0, 0, 
  2932. "WORD             --  engine ID octet string",
  2933. "WORD             --  SNMP引擎ID", 
  2934.   NULLCHAR,NULLCHAR
  2935. },
  2936. { "udp-port", MATCH_AMB, cmdPref(PF_CMDNO, 0, 0), SNMPV3_ENGINEID_REMOTE_PORT, 
  2937. dosnmp_engineID_remote_udpport,NULL,NULL, 0, 0, 
  2938. "udp-port         --  The remote notification host's UDP port number",
  2939. "udp-port         --  远端接收通知主机的UDP端口号", 
  2940.   NULLCHAR,NULLCHAR
  2941. },
  2942. { NULLCHAR }
  2943. };
  2944. static int dosnmp_engineID(int argc,char *argv[],struct user *u)
  2945. {
  2946.     memset((void *)u->struct_p, 0, sizeof(u->struct_p));
  2947.     return subcmd(snmp_engineid_cmds, &u->cmd_mskbits, argc, argv, u);
  2948. }
  2949. static int dosnmp_engineID_local(int argc,char *argv[],struct user *u)
  2950. {
  2951.     u->cmd_mskbits = SNMPV3_ENGINEID_ENGINEID;
  2952.     return subcmd(snmp_engineid_string_cmds, &u->cmd_mskbits, argc, argv, u);
  2953. }
  2954. static int dosnmp_engineID_remote(int argc,char *argv[],struct user *u)
  2955. {
  2956.     uint32 remoteaddr;
  2957. switch(getaddress((unsigned long *)&remoteaddr,  argc--, argv++, u)){
  2958. case ARG_NOERR:
  2959.     break;
  2960.     case ARG_QUEST:
  2961.     case ARG_QUERY:
  2962.         eng_chi(u,  "  A.B.C.D --  IP address of remote SNMP notification host",
  2963.                         "  A.B.C.D --  远端接收通知主机的IP地址");
  2964.         return 1;
  2965.      case ARG_PARAM :
  2966.      cmderror(ERR_NEXTP, NULL, u);
  2967.      return -1;
  2968.     case ARG_QPART:
  2969. case ARG_GENER:
  2970.     default:
  2971.      return -1;
  2972. }
  2973. u->struct_p[SNMPV3_ENGINEID_REMOTE_HOST_INDEX] = remoteaddr;
  2974. u->cmd_mskbits = SNMPV3_ENGINEID_ENGINEID|SNMPV3_ENGINEID_REMOTE_PORT;
  2975. return subcmd(snmp_engineid_string_cmds, &u->cmd_mskbits, argc, argv, u);
  2976. }
  2977. static int dosnmp_engineID_string(int argc,char *argv[],struct user *u)
  2978. {
  2979.     char *engineID_str, engineID[SNMP_MAX_ENG_SIZE], *peid = engineID, ipaddr[16];
  2980.     int rc;
  2981.     argc++;
  2982.     argv--;
  2983. switch(getstrrc(&engineID_str,  argc--, argv++, 0, SNMP_MAX_COMMUNITY_LEN, u)){
  2984. case ARG_NOERR:
  2985.     break;
  2986.     case ARG_QUEST:
  2987.     case ARG_QUERY:
  2988.         eng_chi(u,  "  WORD    --  engine ID octet string",
  2989.                         "  WORD    --  SNMP引擎ID");
  2990.         return 1;
  2991.      case ARG_PARAM :
  2992.      assert(0);
  2993.      return -1;
  2994.     case ARG_QPART:
  2995. case ARG_GENER:
  2996.     default:
  2997.      return -1;
  2998. }
  2999. rc = cmdend(--argc, ++argv, u);
  3000. if (rc)
  3001.     return rc;
  3002. /*convert engineID*/
  3003. memset((void *)engineID, 0, sizeof(engineID));
  3004. while (*engineID_str != 0) {
  3005.     int curbyte = 0, i;
  3006.     for(i=0;i<2;i++) {
  3007.          curbyte = curbyte << 4;
  3008.          if (isdigit(*engineID_str)) {
  3009.              curbyte += (int)((*engineID_str) - '0');
  3010.          } else if (*engineID_str >= 'a' && *engineID_str <= 'f') {
  3011.              curbyte += (int)((*engineID_str) - 'a' + 10);
  3012.          } else if (*engineID_str >= 'A' && *engineID_str <= 'F') {
  3013.              curbyte += (int)((*engineID_str) - 'A' + 10);
  3014.          } else {
  3015.              vty_output("%%Error: Invalid SNMP engine IDn");
  3016.              return -1;
  3017.          }
  3018.          engineID_str++;
  3019.     }
  3020.     *peid++ = curbyte;
  3021. }
  3022. if (u->struct_p[SNMPV3_ENGINEID_REMOTE_HOST_INDEX] != 0) {
  3023.     /*set remote engineID*/
  3024.     int ipaddr_n = ntohl(u->struct_p[SNMPV3_ENGINEID_REMOTE_HOST_INDEX]);
  3025.     ip2str((char*)&ipaddr_n, ipaddr);
  3026.     if (u->struct_p[SNMPV3_ENGINEID_REMOTE_PORT_INDEX] == 0)
  3027.         u->struct_p[SNMPV3_ENGINEID_REMOTE_PORT_INDEX] = SNMP_TRAP_PORT;
  3028.         if (IsNoPref(u))
  3029.          snmpv3_delete_remote_engineID(ipaddr,
  3030.              u->struct_p[SNMPV3_ENGINEID_REMOTE_PORT_INDEX]);
  3031.         else
  3032.          snmpv3_add_remote_engineID(ipaddr,
  3033.              u->struct_p[SNMPV3_ENGINEID_REMOTE_PORT_INDEX],
  3034.              engineID, SNMP_MAX_ENG_SIZE);
  3035. } else {
  3036.     /*set local engineID*/
  3037. }
  3038. return 0;
  3039. }
  3040. static int dosnmp_engineID_remote_udpport(int argc,char *argv[],struct user *u)
  3041. {
  3042.     uint32 remoteport;
  3043. switch(getuintrc((unsigned long *)&remoteport,  argc--, argv++, 0, 65535, u)){
  3044. case ARG_NOERR:
  3045.     break;
  3046.     case ARG_QUEST:
  3047.     case ARG_QUERY:
  3048.         eng_chi(u,  "  <0-65535> --  The remote notification host's UDP port number",
  3049.                         "  <0-65535> --  远端接收通知报文主机的端口号");
  3050.         return 1;
  3051.      case ARG_PARAM :
  3052.      cmderror(ERR_NEXTP, NULL, u);
  3053.      return -1;
  3054.     case ARG_QPART:
  3055. case ARG_GENER:
  3056.     default:
  3057.      return -1;
  3058. }
  3059. u->struct_p[SNMPV3_ENGINEID_REMOTE_PORT_INDEX] = remoteport;
  3060. return subcmd(snmp_engineid_string_cmds, &u->cmd_mskbits, argc, argv, u);
  3061. }
  3062. /*show commands*/
  3063. static int do_show_snmp_engineID(int argc,char *argv[],struct user *u)
  3064. {
  3065.     int rc;
  3066.     if ((rc = cmdend(--argc, ++argv, u)))
  3067.         return rc;
  3068.     do_show_snmpv3_remote_engineID();
  3069.     vty_printf_end(1);
  3070.     return 0;
  3071. }
  3072. #endif