comparison usr/src/cmd/agents/snmp/agent/reg_subtree.c @ 0:c9caec207d52 b86

Initial porting based on b86
author Koji Uno <koji.uno@sun.com>
date Tue, 02 Jun 2009 18:56:50 +0900
parents
children 1a15d5aaf794
comparison
equal deleted inserted replaced
-1:000000000000 0:c9caec207d52
1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #pragma ident "@(#)reg_subtree.c 1.33 05/06/12 SMI"
28
29 #include <unistd.h>
30 #include <sys/types.h>
31 #include <sys/times.h>
32 #include <netinet/in.h>
33 #include <stdio.h>
34 #include <sys/socket.h>
35 #include <errno.h>
36 #include <syslog.h>
37 #include <string.h>
38 #include <arpa/inet.h>
39 #include <netdb.h>
40 #include <nlist.h>
41 #include <limits.h>
42 #include <stdlib.h>
43
44 #include "asn1.h"
45 #include "snmp_msg.h"
46 #include "impl.h"
47 #include "error.h"
48 #include "trace.h"
49 #include "snmp.h"
50 #include "pdu.h"
51 #include "request.h"
52 #include "pagent.h"
53 #include "subtree.h"
54 #include "table.h"
55 #include "trap.h"
56 #include "node.h"
57
58 #define READ_COMM "public"
59 #define WRITE_COMM "private"
60
61 #define REG_AGENT_ID 1
62 #define REG_AGENT_STATUS 2
63 #define REG_AGENT_TIME_OUT 3
64 #define REG_AGENT_PORT_NUMBER 4
65 #define REG_AGENT_PERSONAL_FILE 5
66 #define REG_AGENT_CONFIG_FILE 6
67 #define REG_AGENT_EXECUTABLE 7
68 #define REG_AGENT_VERSION_NUM 8
69 #define REG_AGENT_PROCESS_ID 9
70 #define REG_AGENT_NAME 10
71 #define REG_AGENT_SYSTEM_UP_TIME 11
72
73 #define REG_TREE_INDEX 1
74 #define REG_TREE_AGENT_ID 2
75 #define REG_TREE_OID 3
76 #define REG_TREE_STATUS 4
77
78 #define REG_TBL_INDEX 1
79 #define REG_TBL_AGENT_ID 2
80 #define REG_TBL_OID 3
81 #define REG_TBL_SCOL 4
82 #define REG_TBL_ECOL 5
83 #define REG_TBL_SROW 6
84 #define REG_TBL_EROW 7
85 #define REG_TBL_STATUS 8
86 #define FAIL 0
87 #define SUCCESS 1
88
89 #define SNMP_COMM_MAX 32
90 #define AGENT_CONFIG_FILE "/etc/snmp/conf/snmpd.conf"
91 #define MAX_CONFIG_FILE 128
92 char snmp_fullmib_read_community[SNMP_COMM_MAX] = {NULL};
93 char agent_config_file[MAX_CONFIG_FILE] = AGENT_CONFIG_FILE;
94
95 int set_conf_word();
96 int agent_read_config();
97
98 struct cmd {
99 char *name;
100 int (*rtn)();
101 char *arg1;
102 int arg2;
103 } cmds[] = {
104 { "read-community", set_conf_word,
105 snmp_fullmib_read_community, SNMP_COMM_MAX },
106 { 0, 0, 0, 0}
107 };
108
109 /* global variable */
110 struct CallbackItem *callItem = NULL;
111 int numCallItem=0;
112 int *trapTableMap=NULL;
113 struct TrapHndlCxt *trapBucket=NULL;
114 struct TrapEnterpriseInfo *trapEnterpriseInfo=NULL;
115 /* For arbitrary length enterprise OID in traps - bug 4133978 */
116 struct TrapAnyEnterpriseInfo *trapAnyEnterpriseInfo=NULL;
117 int numTrapElem=0;
118 extern int dont_read_config_file;
119
120 static Subid reg_subagent_subids[] = { 1,3,6,1,4,1,42,2,15,8,1,0,0 };
121 static Oid reg_subagent_oid = {reg_subagent_subids, 13 };
122
123 static Subid agent_tbl_index_subids[] = { 1,3,6,1,4,1,42,2,15,9,0 };
124 static Oid agent_tbl_index_oid = { agent_tbl_index_subids, 11 };
125 static Subid reg_tree_ra_subids[] = { 1,3,6,1,4,1,42,2,15,12,1,3,0,0};
126 static Oid reg_tree_ra_oid = { reg_tree_ra_subids, 14};
127
128 static Subid ra_trap_port_subids[] = { 1,3,6,1,4,1,42,2,15,4,0};
129 static Oid ra_trap_port_oid = { ra_trap_port_subids, 11};
130
131 static Subid ra_check_point_subids[] = { 1,3,6,1,4,1,42,2,15,5,0};
132 static Oid ra_check_point_oid = { ra_check_point_subids, 11};
133
134 /* last three numbers are columar obj, agentid, table_id */
135 static Subid reg_shared_table_subids[] = { 1,3,6,1,4,1,42,2,15,10,1,0,0,0};
136 static Oid reg_shared_table_oid = { reg_shared_table_subids, 14};
137
138 static int _SSASendTrap_generic(char *, int);
139 static int _SSASendTrap_generic2(char *, int, IndexType *);
140
141 /*
142 * agent table id can be: from command line, global var. sap_agent_tbl_id,
143 * or from getpid(). The agent_id can be less than one.
144 */
145 int
146 sap_glb_agent_table_id()
147 {
148 return((int)getpid());
149 }
150
151 SNMP_variable *
152 sap_append_integer_variable(SNMP_variable *list, Oid *oid, int num)
153 {
154 SNMP_value value;
155
156 value.v_integer = num;
157 list = snmp_typed_variable_append(list,oid,INTEGER,&value,error_label);
158 if(list == NULL){
159 error("sap_append_integer_variable failed: oid: %s, value: %d\n",
160 SSAOidString(oid),num);
161 }
162 return(list);
163 }
164
165 SNMP_variable *
166 sap_append_variable(SNMP_variable *list, Oid *oid, int num, int type)
167 {
168 SNMP_value value;
169
170 value.v_integer = num;
171 list = snmp_typed_variable_append(list,oid,type,&value,error_label);
172 if(list == NULL){
173 error("sap_append_variable failed: oid: %s, value: %d, type: %d\n",
174 SSAOidString(oid),num,type);
175 }
176 return(list);
177 }
178
179 SNMP_variable *sap_append_string_variable(SNMP_variable *list, Oid *oid, char* str)
180 {
181 SNMP_value value;
182
183 if(str == NULL) return NULL;
184 value.v_string.chars = (u_char *)str;
185 /* LINTED */
186 value.v_string.len = (int)strlen(str);
187 list = snmp_typed_variable_append(list,oid,STRING,&value,error_label);
188 if(list == NULL){
189 error("sap_append_string_variable failed: oid: %s, value: %s\n"
190 , SSAOidString(oid),str);
191 }
192 return(list);
193 }
194
195 SNMP_variable *sap_append_oid_variable(SNMP_variable *list, Oid *oid, Oid* name)
196 {
197 SNMP_value value;
198
199 if(oid == NULL || name == NULL) return NULL;
200 value.v_oid.subids = name->subids;
201 value.v_oid.len = name->len;
202 list = snmp_typed_variable_append(list,oid,OBJID,&value,error_label);
203 if(list == NULL){
204 error("sap_append_oid_varaible(%s,%s) failed\n",
205 SSAOidString(oid),SSAOidString(name));
206 }
207 return(list);
208 }
209
210
211 SNMP_variable *reg_subagent_form_variables(Agent *agent,SNMP_variable *list)
212 {
213 struct tms buffer;
214 clock_t system_up_time;
215
216 if(agent == NULL){ return NULL; }
217
218 /* set up the index */
219 reg_subagent_oid.subids[reg_subagent_oid.len-1] = agent->agent_id;
220
221 reg_subagent_oid.subids[reg_subagent_oid.len-2] = REG_AGENT_PROCESS_ID;
222 list = sap_append_integer_variable(list,&reg_subagent_oid,agent->process_id);
223 if(list == NULL) return list;
224
225 if(agent->agent_status!=0){
226 reg_subagent_oid.subids[reg_subagent_oid.len-2] = REG_AGENT_STATUS;
227 list = sap_append_integer_variable(list,&reg_subagent_oid,agent->agent_status);
228 if(list == NULL) return list;
229 reg_subagent_oid.subids[reg_subagent_oid.len-2] =
230 REG_AGENT_SYSTEM_UP_TIME;
231 system_up_time = times(&buffer);
232 list = sap_append_variable(list, &reg_subagent_oid,
233 /* LINTED */
234 (uint32_t)system_up_time,
235 TIMETICKS);
236 if(list == NULL) return list;
237 }
238
239 reg_subagent_oid.subids[reg_subagent_oid.len-2] = REG_AGENT_TIME_OUT;
240 list = sap_append_integer_variable(list,&reg_subagent_oid,agent->timeout);
241 if(list == NULL) return list;
242
243 reg_subagent_oid.subids[reg_subagent_oid.len-2] = REG_AGENT_PORT_NUMBER;
244 list = sap_append_integer_variable(list,&reg_subagent_oid,agent->address.sin_port);
245 if(list == NULL) return list;
246
247 if(agent->personal_file != NULL){
248 reg_subagent_oid.subids[reg_subagent_oid.len-2] =
249 REG_AGENT_PERSONAL_FILE;
250 list = sap_append_string_variable(list,&reg_subagent_oid,agent->personal_file);
251 if(list == NULL) return list;
252 }
253
254 if(agent->config_file != NULL) {
255 reg_subagent_oid.subids[reg_subagent_oid.len-2] =
256 REG_AGENT_CONFIG_FILE;
257 list = sap_append_string_variable(list,&reg_subagent_oid,agent->config_file);
258 if(list == NULL) return list;
259 }
260
261 if(agent->executable != NULL) {
262 reg_subagent_oid.subids[reg_subagent_oid.len-2] =
263 REG_AGENT_EXECUTABLE;
264 list = sap_append_string_variable(list,&reg_subagent_oid,agent->executable);
265 if(list == NULL) return list;
266 }
267
268 if(agent->version_string != NULL) {
269 reg_subagent_oid.subids[reg_subagent_oid.len-2] =
270 REG_AGENT_VERSION_NUM;
271 list = sap_append_string_variable(list,&reg_subagent_oid,agent->version_string);
272 if(list == NULL) return list;
273 }
274
275 if(agent->name != NULL) {
276 reg_subagent_oid.subids[reg_subagent_oid.len-2] =
277 REG_AGENT_NAME;
278 list = sap_append_string_variable(list,&reg_subagent_oid,agent->name);
279 if(list == NULL) return list;
280 }
281
282
283 return(list);
284
285 }
286
287 /*
288 * temporary using the process id as the agent id
289 * set the following variables,
290 * xtimeout
291 * xportnumber
292 * xpersonal file
293 * xconfig file
294 * executable
295 * version number
296 * protocol
297 * xprocess id
298 * xagentname
299 */
300 static SNMP_pdu *send_request_to_agent(SNMP_variable *list, int type,
301 char* community, int port, struct timeval *timeout,
302 IPAddress *agent_addr)
303 {
304 SNMP_pdu *request, *response=NULL;
305
306 error_label[0] = '\0';
307
308 request = request_create( (community==NULL?"public":community), type, error_label);
309 if(request == NULL)
310 {
311 return NULL;
312 }
313
314 if(list == NULL){
315 snmp_pdu_free(request);
316 error("SSARegSubagent failed\n");
317 return NULL;
318 }
319
320 request->first_variable = list;
321
322 /* later change the timeout to user-provided number */
323 response =
324 request_send_to_port_time_out_blocking(agent_addr, port,timeout, request, error_label);
325 snmp_pdu_free(request);
326 return response;
327 }
328
329 SNMP_pdu *
330 send_request_to_relay_agent(SNMP_variable *list, int type)
331 {
332 char *community = READ_COMM;
333 struct timeval timeout;
334 static int my_ip_address_initialized = False;
335 static IPAddress my_ip_address;
336
337 if (my_ip_address_initialized == False) {
338 if (get_my_ip_address(&my_ip_address, error_label))
339 return (NULL);
340 my_ip_address_initialized = True;
341 }
342 timeout.tv_sec = 100;
343 timeout.tv_usec = 0;
344
345 if (type == SET_REQ_MSG)
346 community = WRITE_COMM;
347
348 return (send_request_to_agent(list, type, community, SNMP_PORT,
349 &timeout, &my_ip_address));
350 }
351
352
353 static SNMP_variable *create_variable(Oid *name)
354 {
355 SNMP_variable *new;
356 if((new = snmp_variable_new(error_label)) == NULL)
357 return NULL;
358 if(SSAOidCpy(&(new->name),name,error_label))
359 {
360 snmp_variable_free(new);
361 return NULL;
362 }
363 new->type = NULLOBJ;
364 return new;
365 }
366
367 int
368 sap_avail_index(Oid *name, int type)
369 {
370 SNMP_pdu *response;
371 SNMP_variable *new, *variable;
372 int idx = 0;
373
374 if ((new = create_variable(name)) == NULL)
375 return (idx);
376
377 response = send_request_to_relay_agent(new,type);
378
379 if (response == NULL)
380 return (idx);
381
382 if (response->error_status) {
383 (void)sprintf(error_label, "%s",
384 error_status_string(response->error_status));
385 snmp_pdu_free(response);
386 return (idx);
387 }
388
389 /* need checking the response */
390 variable = response->first_variable;
391 if (SSAOidCmp(&(variable->name), name)
392 || (variable->type != INTEGER)
393 || (variable->val.integer == NULL)
394 || (variable->val_len != sizeof (int)) ) {
395 (void)sprintf(error_label, ERR_MSG_BAD_RESPONSE);
396 snmp_pdu_free(response);
397 return (idx);
398 }
399
400 idx = *(variable->val.integer);
401 snmp_pdu_free(response);
402 return (idx);
403 }
404
405 /*
406 * send a request to an agent, return TRUE, if agent response
407 * otherwise, FALSE
408 */
409 static int probe_agent(Oid *name, int type, char *community, int port,
410 struct timeval *timeout,IPAddress *agent_addr)
411 {
412 SNMP_pdu *response;
413 SNMP_variable *new, *variable;
414 static int my_ip_address_initialized = False;
415 static IPAddress my_ip_address;
416
417 if(my_ip_address_initialized == False)
418 {
419 if(get_my_ip_address(&my_ip_address, error_label))
420 {
421 return NULL;
422 }
423 my_ip_address_initialized = True;
424 }
425
426 if( (new = create_variable(name)) == NULL )
427 return -1;
428 response = send_request_to_agent(new,type,community,port,timeout,
429 agent_addr!=NULL?agent_addr:&my_ip_address);
430 if(response == NULL)
431 {
432 return FALSE;
433 }
434
435
436 /* need checking the response */
437 variable = response->first_variable;
438 if(SSAOidCmp(&(variable->name), name) )
439 {
440 snmp_pdu_free(response);
441 return FALSE;
442 }
443 snmp_pdu_free(response);
444 return(TRUE);
445 }
446
447 /*
448 * agent_addr == NULL => use the local host address
449 * community == NULL => public
450 */
451 int
452 SSAAgentIsAlive(IPAddress *agent_addr, int port, char *community,
453 struct timeval *timeout)
454 {
455 static Subid system_service_subids[] = {1, 3, 6, 1, 2, 1, 1, 7, 0};
456 static Oid system_service_oid = { system_service_subids, 9};
457 if (agent_read_config() == -1) {
458 perror("Can not read configuration file ");
459 return (-1);
460 }
461 community = snmp_fullmib_read_community;
462
463 return (probe_agent(&system_service_oid, GET_REQ_MSG,
464 community != NULL ? community: "public",
465 port, timeout, agent_addr));
466 }
467
468 int
469 get_available_index_from_relay_agent()
470 {
471 return(sap_avail_index(&agent_tbl_index_oid,GET_REQ_MSG));
472 }
473
474 int
475 bump_index_of_relay_agent(int num)
476 {
477 SNMP_variable *variable=NULL;
478 SNMP_pdu *response;
479 int idx = 0;
480
481 variable = sap_append_integer_variable(variable,&agent_tbl_index_oid,num++);
482
483 if(variable == NULL)
484 return idx;
485
486 response = send_request_to_relay_agent(variable,SET_REQ_MSG);
487
488 if(response == NULL)
489 return idx;
490
491 if(response->error_status) {
492 (void)sprintf(error_label, "%s",
493 error_status_string(response->error_status));
494 snmp_pdu_free(response);
495 return idx;
496 }
497
498 /* need checking the response */
499 variable = response->first_variable;
500 if(SSAOidCmp(&(variable->name), &agent_tbl_index_oid)
501 || (variable->type != INTEGER)
502 || (variable->val.integer == NULL)
503 || (variable->val_len != sizeof(int)) )
504 {
505 (void)sprintf(error_label, ERR_MSG_BAD_RESPONSE);
506 snmp_pdu_free(response);
507 return idx;
508 }
509 idx = *(variable->val.integer);
510 snmp_pdu_free(response);
511 return(idx);
512 }
513
514 int check_dup_agent_name(char *agent_name)
515 {
516 SNMP_variable *variable=NULL;
517 SNMP_pdu *response;
518 int res=TRUE;
519
520 variable = sap_append_string_variable(variable,&ra_check_point_oid,agent_name);
521 if(variable == NULL) return res;
522 response = send_request_to_relay_agent(variable,SET_REQ_MSG);
523 if(response == NULL)
524 {
525 return res;
526 }
527
528 if(response->error_status)
529 {
530 (void)sprintf(error_label, "%s",
531 error_status_string(response->error_status));
532 snmp_pdu_free(response);
533 return res;
534 }
535
536 /* need checking the response */
537 variable = response->first_variable;
538 if(SSAOidCmp(&(variable->name), &ra_check_point_oid)
539 || (variable->type != STRING)
540 || (variable->val.string == NULL)
541 || (variable->val_len == 0) )
542 {
543 (void)sprintf(error_label, ERR_MSG_BAD_RESPONSE);
544 snmp_pdu_free(response);
545 return res;
546 }
547 res = FALSE;
548 snmp_pdu_free(response);
549 /*snmp_variable_free(variable);this mem. is freed above*/
550 return(res);
551 }
552
553
554 /*
555 * mechanism for getting agent id
556 * first, set relayCheckPoint to agent name
557 * second, if first successful(no agent name dup.), get the available id
558 */
559 int
560 SSASubagentOpen(int num_of_retry, char* agent_name)
561 {
562 int i, index;
563
564 if (trace_level > 0)
565 trace("SSASubagent called with %s\n", agent_name);
566
567 if (check_dup_agent_name(agent_name) == TRUE)
568 return INVALID_HANDLER;
569
570 for (i = 0; i < num_of_retry; i++) {
571 if ((index = get_available_index_from_relay_agent()) == 0)
572 return INVALID_HANDLER;
573 index++;
574 if ((bump_index_of_relay_agent(index)) == index )
575 return index - 1;
576 else
577 if (i > num_of_retry)
578 return INVALID_HANDLER;
579 }
580 return INVALID_HANDLER;
581 }
582
583 int
584 SSARegSubagent(Agent* agent)
585 {
586 SNMP_variable *list=NULL;
587 SNMP_pdu *response;
588
589 /* form variable list */
590 list = reg_subagent_form_variables(agent,list);
591
592 if(list == NULL){
593 error("SSARegSubagent failed\n");
594 return 0;
595 }
596
597 response = send_request_to_relay_agent(list,SET_REQ_MSG);
598 if(response == NULL)
599 return 0;
600
601 if(response->error_status)
602 {
603 (void)sprintf(error_label, "%s",
604 error_status_string(response->error_status));
605 snmp_pdu_free(response);
606 return 0;
607 }
608
609 snmp_pdu_free(response);
610
611 return 1;
612 }
613
614
615 /*
616 * register the subtree, index is AgentID.RegTreeIndex
617 * if the registration is not accepted by the relay agent,
618 * the error_status is non-zero
619 */
620 int SSARegSubtree(SSA_Subtree *subtree)
621 {
622 Oid *tree_oid = &(subtree->name);
623 int agent_id = subtree->regTreeAgentID;
624 SNMP_variable *list=NULL;
625 SNMP_pdu *response;
626 int idx = subtree->regTreeIndex;
627
628 /* form variable list */
629 reg_tree_ra_oid.subids[reg_tree_ra_oid.len-1] = idx;
630 reg_tree_ra_oid.subids[reg_tree_ra_oid.len-2] = agent_id;
631
632 if (subtree->regTreeStatus != SSA_OPER_STATUS_NOT_IN_SERVICE) {
633 reg_tree_ra_oid.subids[reg_tree_ra_oid.len-3] = REG_TREE_OID;
634 list = sap_append_oid_variable(list,&reg_tree_ra_oid,tree_oid);
635 if(list == NULL) return 0;
636 }
637
638 reg_tree_ra_oid.subids[reg_tree_ra_oid.len-3] = REG_TREE_STATUS;
639 list = sap_append_integer_variable(list,&reg_tree_ra_oid,subtree->regTreeStatus);
640 if(list == NULL) return 0;
641
642 response = send_request_to_relay_agent(list,SET_REQ_MSG);
643 if(response == NULL)
644 {
645 return 0;
646 }
647
648 if(response->error_status)
649 {
650 (void)sprintf(error_label, "%s",
651 error_status_string(response->error_status));
652 snmp_pdu_free(response);
653 return 0;
654 }
655
656 /* needs checking
657 variable = response->first_variable;
658 if(variable->next_variable
659 || SSAOidCmp(&(variable->name), &reg_tree_ra_oid)
660 || (variable->type != OBJID)
661 || (variable->val_len/sizeof(Subid) != tree_oid->len) )
662 {
663 (void)sprintf(error_label, ERR_MSG_BAD_RESPONSE);
664 snmp_pdu_free(response);
665 return 0;
666 }
667 */
668 snmp_pdu_free(response);
669
670 return idx;
671
672 }
673
674 int SSARegSubtable(SSA_Table *table)
675 {
676 Oid *table_oid = &(table->regTblOID);
677 int agent_id = table->regTblAgentID;
678 SNMP_variable *list=NULL;
679 SNMP_pdu *response;
680 int idx = table->regTblIndex;
681
682 /* form variable list */
683 reg_shared_table_oid.subids[reg_shared_table_oid.len-1] = idx;
684 reg_shared_table_oid.subids[reg_shared_table_oid.len-2] = agent_id;
685
686 reg_shared_table_oid.subids[reg_shared_table_oid.len-3] = REG_TBL_OID;
687 list = sap_append_oid_variable(list,&reg_shared_table_oid,table_oid);
688 if(list == NULL) return 0;
689
690 reg_shared_table_oid.subids[reg_shared_table_oid.len-3] = REG_TBL_SCOL;
691 list = sap_append_integer_variable(list,&reg_shared_table_oid,table->regTblStartColumn);
692 if(list == NULL) return 0;
693
694 reg_shared_table_oid.subids[reg_shared_table_oid.len-3] = REG_TBL_ECOL;
695 list = sap_append_integer_variable(list,&reg_shared_table_oid,table->regTblEndColumn);
696 if(list == NULL) return 0;
697
698 reg_shared_table_oid.subids[reg_shared_table_oid.len-3] = REG_TBL_SROW;
699 list = sap_append_integer_variable(list,&reg_shared_table_oid,table->regTblStartRow);
700 if(list == NULL) return 0;
701
702 reg_shared_table_oid.subids[reg_shared_table_oid.len-3] = REG_TBL_EROW;
703 list = sap_append_integer_variable(list,&reg_shared_table_oid,table->regTblEndRow);
704 if(list == NULL) return 0;
705
706
707 reg_shared_table_oid.subids[reg_shared_table_oid.len-3] = REG_TBL_STATUS;
708 list = sap_append_integer_variable(list,&reg_shared_table_oid,table->regTblStatus);
709 if(list == NULL) return 0;
710
711 response = send_request_to_relay_agent(list,SET_REQ_MSG);
712 if(response == NULL)
713 {
714 return 0;
715 }
716
717 if(response->error_status)
718 {
719 (void)sprintf(error_label, "%s",
720 error_status_string(response->error_status));
721 snmp_pdu_free(response);
722 return 0;
723 }
724
725 /* needs checking
726 variable = response->first_variable;
727 if(variable->next_variable
728 || SSAOidCmp(&(variable->name), &reg_shared_table_oid)
729 || (variable->type != OBJID)
730 || (variable->val_len/sizeof(Subid) != table_oid->len) )
731 {
732 (void)sprintf(error_label, ERR_MSG_BAD_RESPONSE);
733 snmp_pdu_free(response);
734 return 0;
735 }
736 */
737 snmp_pdu_free(response);
738
739 return idx;
740
741 }
742
743
744 int SSAGetTrapPort() {
745
746 if (dont_read_config_file == TRUE)
747 return (SNMP_TRAP_PORT);
748
749 /* not agent_tbl_index_oid, but trap_port_number */
750 return (sap_avail_index(&ra_trap_port_oid, GET_REQ_MSG));
751 }
752
753 static int search_trap_num(char* name)
754 {
755 int idx;
756 if(!name) return -1;
757 for(idx=0;idx<numTrapElem;idx++)
758 if(!strcmp(name,trapBucket[idx].name)) return idx;
759 return -1;
760 }
761
762 int _SSASendTrap(char *name)
763 {
764 int mode=1;
765 return _SSASendTrap_generic(name, mode);
766 }
767
768 int _SSASendTrap2(char *name)
769 {
770 int mode=2;
771 return _SSASendTrap_generic(name, mode);
772 }
773
774 /* For arbitrary length enterprise OID in traps - bug 4133978 */
775 int _SSASendTrap3(char *name)
776 {
777 int mode=3;
778 return _SSASendTrap_generic(name, mode);
779 }
780
781 /* Specific index of trap var bindings */
782 int _SSASendTrap4(char *name, IndexType *pindex_obj)
783 {
784 int mode=3; /* shouldn't change */
785 return _SSASendTrap_generic2(name, mode, pindex_obj);
786 }
787
788 static int _SSASendTrap_generic(char *name, int mode)
789 {
790 IPAddress dest_ip_address, my_ip_address;
791 int generic;
792 int specific;
793 uint32_t time_stamp;
794 int trap_port = SSAGetTrapPort();
795 SNMP_variable *variables=NULL;
796 Integer val_integer;
797 String val_str;
798
799 Oid val_oid, ent_oid;
800 Subid ent_subids[MAX_OID_LEN];
801 int num;
802 Object *ptr;
803 int trapNum;
804 int i;
805 Subid tempArray[MAX_OID_LEN],*oldArray;
806 int oidLen, j;
807
808 if(!trapBucket) return -1;
809
810 if((trapNum=search_trap_num(name))==-1) return -1;
811
812 if(get_my_ip_address(&dest_ip_address,error_label)== -1) return -1;
813 if(get_my_ip_address(&my_ip_address,error_label)== -1) return -1;
814
815 generic = trapBucket[trapNum].generic;
816 specific = trapBucket[trapNum].specific;
817
818 num = trapTableMap[trapNum];
819 ptr=callItem[num].ptr;
820
821
822 if ( mode == 2 ) { /*_SSASendTrap2*/
823 ent_oid.subids = ent_subids;
824 ent_oid.len = sun_oid.len;
825 for (i=0;i<7;i++)
826 ent_subids[i]=trapEnterpriseInfo[trapNum].subids[i];
827 }
828
829 /* Handling arbitrary length OIDs. Retaining _SSASendTrap2 to maintain
830 backward compatibility with subagents created using old mibcodegen
831 Bug 4133978 */
832 if ( mode == 3 ) { /*_SSASendTrap3*/
833 Subid k;
834 ent_oid.subids = ent_subids;
835 for (i=0;(k=trapAnyEnterpriseInfo[trapNum].subids[i]) !=-1;i++)
836 ent_subids[i]=k;
837 ent_oid.len = i;
838 }
839
840 while(num != -1 && ptr){
841
842 /* Appending a zero at the end: Bug ID 4103570*/
843 oldArray=ptr->name.subids;
844 oidLen = ptr->name.len;
845 for(j=0;j<oidLen;j++)
846 tempArray[j]=ptr->name.subids[j];
847 tempArray[oidLen]=0;
848 ptr->name.len=oidLen+1;
849 ptr->name.subids=&(tempArray[0]);
850
851 if((ptr->asn1_type == INTEGER) | (ptr->asn1_type == GAUGE) | (ptr->asn1_type == COUNTER) | (ptr->asn1_type == TIMETICKS)){
852 ptr->get(&val_integer);
853 variables = ssa_append_integer_variable(variables,&(ptr->name),val_integer,error_label, ptr->asn1_type);
854 }else if(ptr->asn1_type == STRING){
855 ptr->get(&val_str);
856 variables = ssa_append_string_variable(variables,&(ptr->name),val_str,error_label);
857 /* Memory leak fix */
858 free((void *)(val_str.chars));
859
860 }else if(ptr->asn1_type == OBJID){
861 ptr->get(&val_oid);
862 variables = ssa_append_oid_variable(variables,&(ptr->name),val_oid,error_label);
863 /* Memory leak fix */
864 free((void *)(val_oid.subids));
865 }
866 ptr->name.len=oidLen;
867 ptr->name.subids=oldArray;
868
869 num = callItem[num].next;
870 if(num <0 ) ptr=NULL;
871 else ptr = callItem[num].ptr;
872 }
873
874 time_stamp = -1U;
875
876 if (trap_send_with_more_para(&dest_ip_address,
877 my_ip_address, NULL, 1, &ent_oid,
878 generic, specific, trap_port,
879 time_stamp, variables, error_label))
880 (void)printf("trap_send fails!\n");
881
882 /* Memory leak fix */
883 snmp_variable_list_free(variables);
884 return 0;
885 }
886
887 static int _SSASendTrap_generic2(char *name, int mode, IndexType *pindex_obj)
888 {
889 IPAddress dest_ip_address, my_ip_address;
890 int generic;
891 int specific;
892 uint32_t time_stamp;
893 int trap_port = SSAGetTrapPort();
894 SNMP_variable *variables=NULL;
895 Integer val_integer;
896 String val_str={NULL,0};
897
898 Oid val_oid, ent_oid;
899 Subid ent_subids[MAX_OID_LEN];
900 int num;
901 Object *ptr;
902 int trapNum;
903 int i;
904 int n;
905 Subid tempArray[MAX_OID_LEN],*oldArray;
906 int oidLen, j;
907 int length;
908
909 if(!trapBucket) return -1;
910
911 if((trapNum=search_trap_num(name))==-1) return -1;
912
913 if(get_my_ip_address(&dest_ip_address,error_label)== -1) return -1;
914 if(get_my_ip_address(&my_ip_address,error_label)== -1) return -1;
915
916 generic = trapBucket[trapNum].generic;
917 specific = trapBucket[trapNum].specific;
918
919 num = trapTableMap[trapNum];
920 ptr=callItem[num].ptr;
921
922
923 if ( mode == 2 ) { /*_SSASendTrap2*/
924 ent_oid.subids = ent_subids;
925 ent_oid.len = sun_oid.len;
926 for (i=0;i<7;i++)
927 ent_subids[i]=trapEnterpriseInfo[trapNum].subids[i];
928 }
929
930 /* Handling arbitrary length OIDs. Retaining _SSASendTrap2 to maintain
931 backward compatibility with subagents created using old mibcodegen
932 Bug 4133978 */
933 if ( mode == 3 ) { /*_SSASendTrap3*/
934 Subid k;
935 ent_oid.subids = ent_subids;
936 for (i=0;(k=trapAnyEnterpriseInfo[trapNum].subids[i]) !=-1;i++)
937 ent_subids[i]=k;
938 ent_oid.len = i;
939 }
940
941 n=0; /* index to an array of an indices. Point to the first index */
942 while(num != -1 && ptr){
943
944 /* Appending a zero at the end: Bug ID 4103570*/
945 oldArray=ptr->name.subids;
946 oidLen = ptr->name.len;
947 for(j=0;j<oidLen;j++)
948 tempArray[j]=ptr->name.subids[j];
949 tempArray[oidLen]=0;
950 ptr->name.len=oidLen+1;
951 length = (ptr->name.len -1); /* for non-scalars don't add trailing yet */
952 ptr->name.subids=&(tempArray[0]);
953 if (ptr->type == 1) { /* scalar value */
954 if((ptr->asn1_type == INTEGER) | (ptr->asn1_type == GAUGE) | (ptr->asn1_type == COUNTER) | (ptr->asn1_type == TIMETICKS)){
955 ptr->get(&val_integer);
956 variables = ssa_append_integer_variable(variables,&(ptr->name),val_integer,error_label,ptr->asn1_type);
957 n++; /* Yes, even scalars need a dummy index */
958 }else if(ptr->asn1_type == STRING){
959 ptr->get(&val_str);
960 variables = ssa_append_string_variable(variables,&(ptr->name),val_str,error_label);
961 /* Memory leak fix */
962 free((void *)(val_str.chars));
963 n++;
964 }else if(ptr->asn1_type == OBJID){
965 ptr->get(&val_oid);
966 variables = ssa_append_oid_variable(variables,&(ptr->name),val_oid,error_label);
967 /* Memory leak fix */
968 free((void *)(val_oid.subids));
969 n++;
970 }
971 } else /* tabular value = 2 */
972 { if ((ptr->asn1_type == INTEGER) | (ptr->asn1_type == GAUGE) | (ptr->asn1_type == COUNTER) | (ptr->asn1_type == TIMETICKS)){
973 ptr->get(EXACT_ENTRY,&val_integer,&pindex_obj[n]);
974 for (i=0; i<= pindex_obj[n].len; i++)
975 ptr->name.subids[length+i] = pindex_obj[n].value[i];
976 length = length + pindex_obj[n].len;
977 ptr->name.len = length;
978 ptr->name.subids[length] = 0; /* append the trailing Zero */
979 variables = ssa_append_integer_variable(variables,&(ptr->name),val_integer,error_label,ptr->asn1_type);
980 n++; /* done with this index, increment to index for next trap variable */
981 }else if(ptr->asn1_type == STRING){
982 ptr->get(EXACT_ENTRY,&val_str,&pindex_obj[n]);
983 for (i=0; i<= pindex_obj[n].len; i++)
984 ptr->name.subids[length+i] = pindex_obj[n].value[i];
985 length = length + pindex_obj[n].len;
986 ptr->name.len = length;
987 ptr->name.subids[length] = 0; /* append the trailing Zero */
988 variables = ssa_append_string_variable(variables,&(ptr->name),val_str,error_label);
989 /* Memory leak fix */
990 free((void *)(val_str.chars));
991 n++; /* index for next trap variable */
992 }else if(ptr->asn1_type == OBJID){
993 ptr->get(EXACT_ENTRY,&val_oid,&pindex_obj[n]);
994 for (i=0; i<= pindex_obj[n].len; i++)
995 ptr->name.subids[length+i] = pindex_obj[n].value[i];
996 length = length + pindex_obj[n].len;
997 ptr->name.len = length;
998 ptr->name.subids[length] = 0; /* append the trailing Zero */
999 variables = ssa_append_oid_variable(variables,&(ptr->name),val_oid,error_label);
1000 /* Memory leak fix */
1001 free((void *)(val_oid.subids));
1002 n++; /* index for next trap variable */
1003 }
1004
1005 } /* else */
1006
1007
1008 ptr->name.len=oidLen;
1009 ptr->name.subids=oldArray;
1010
1011 num = callItem[num].next;
1012 if(num <0 ) ptr=NULL;
1013 else ptr = callItem[num].ptr;
1014 }
1015
1016 time_stamp = -1U;
1017
1018 if (trap_send_with_more_para(&dest_ip_address,
1019 my_ip_address, NULL, 1, &ent_oid,
1020 generic, specific, trap_port,
1021 time_stamp, variables, error_label))
1022 (void)printf("trap_send fails!\n");
1023
1024 /* Memory leak fix */
1025 snmp_variable_list_free(variables);
1026 return 0;
1027 }
1028 /*
1029 * This function is similar to one used in mibiisa
1030 * Here, we check the community strings from the snmpd.conf configuration file.
1031 */
1032 int
1033 agent_read_config()
1034 {
1035 FILE *hostf;
1036 char linebuff[256];
1037 struct cmd *cmd;
1038
1039 if ((hostf = fopen(agent_config_file, "r")) == (FILE *)NULL) {
1040 perror("Can not open agent configuration file");
1041 return (-1);
1042 }
1043
1044 for (;;) {
1045 char *ccp;
1046 int cmd_len;
1047
1048 (void) fgets(linebuff, sizeof (linebuff), hostf);
1049 if (feof(hostf) || ferror(hostf))
1050 break;
1051
1052 /* Weed out any comment text */
1053 if ((ccp = strchr(linebuff, '#')) != (char *)NULL)
1054 *ccp = '\0';
1055
1056 /* Zap the newline, if any */
1057 if ((ccp = strchr(linebuff, '\n')) != (char *)NULL)
1058 *ccp = '\0';
1059 if ((linebuff[0] == '\0') || (linebuff[0] == '\n')) continue;
1060
1061 /* Parse off the command name */
1062 cmd_len = strcspn(linebuff, " \t");
1063 ccp = linebuff + cmd_len + strspn(linebuff + cmd_len, " \t");
1064
1065 /* Look up the command */
1066 for (cmd = cmds; cmd->name; cmd++) {
1067 if ((strlen(cmd->name) == cmd_len) &&
1068 (strncmp(linebuff, cmd->name, cmd_len) == 0)) {
1069 (*cmd->rtn)(ccp, cmd);
1070 goto next;
1071 }
1072 }
1073
1074 next:
1075 ;
1076 }
1077
1078 fclose(hostf);
1079 return (0);
1080 }
1081
1082 int
1083 set_conf_word(string, cmd)
1084 char *string;
1085 struct cmd *cmd;
1086 {
1087 char *ccp;
1088 /* Take only the first word */
1089 if ((ccp = strchr(string, ' ')) != (char *)NULL)
1090 *ccp = '\0';
1091 if ((ccp = strchr(string, '\t')) != (char *)NULL)
1092 *ccp = '\0';
1093 strncpy(cmd->arg1, string, cmd->arg2);
1094 return (1);
1095 }