68
68
gen_server:start({local, ?SERVER}, ?MODULE, {Options, self()}, []).
71
gen_server:call(?SERVER, stop, infinity).
74
gen_server:call(?SERVER,discovery,infinity).
77
?SERVER ! {get, Oids}, ok.
79
79
%% VarsAndValues is: {PlainOid, o|s|i, Value} (unknown mibs) | {Oid, Value}
80
80
s(VarsAndValues) ->
81
?SERVER ! {set, VarsAndValues}, ok.
81
cast({set, VarsAndValues}).
83
83
gn(Oids) when is_list(Oids) ->
84
?SERVER ! {get_next, Oids}, ok;
84
cast({get_next, Oids});
85
85
gn(N) when is_integer(N) ->
86
?SERVER ! {iter_get_next, N}, ok.
86
cast({iter_get_next, N}).
88
?SERVER ! iter_get_next, ok.
91
?SERVER ! resend_pdu, ok.
93
93
gb(NonRepeaters, MaxRepetitions, Oids) ->
94
?SERVER ! {bulk, {NonRepeaters, MaxRepetitions, Oids}}, ok.
94
cast({bulk, {NonRepeaters, MaxRepetitions, Oids}}).
97
?SERVER ! {response, RespPdu}.
97
cast({response, RespPdu}).
99
99
send_bytes(Bytes) ->
100
?SERVER ! {send_bytes, Bytes}, ok.
100
cast({send_bytes, Bytes}).
102
102
purify_oid(Oid) ->
103
gen_server:call(?SERVER, {purify_oid, Oid}, 5000).
103
call({purify_oid, Oid}, 5000).
105
105
oid_to_name(Oid) ->
106
gen_server:call(?SERVER, {oid_to_name, Oid}, 5000).
106
call({oid_to_name, Oid}, 5000).
108
108
name_to_oid(Name) ->
109
gen_server:call(?SERVER, {name_to_oid, Name}, 5000).
109
call({name_to_oid, Name}, 5000).
112
112
%%----------------------------------------------------------------------
340
340
mk_seclevel(authPriv) -> 3.
343
handle_info({get, Oids}, State) ->
344
d("handle_info -> get request for ~p",[Oids]),
345
{noreply, execute_request(get, Oids, State)};
347
handle_info({set, VariablesAndValues}, State) ->
348
d("handle_info -> set request for ~p",[VariablesAndValues]),
349
{noreply, execute_request(set, VariablesAndValues, State)};
351
handle_info({bulk, Args}, State) ->
352
d("handle_info -> bulk request for ~p",[Args]),
353
{noreply, execute_request(bulk, Args, State)};
355
handle_info({response, RespPdu}, State) ->
356
d("handle_info -> response request with ~p",[RespPdu]),
357
?PACK_SERV:send_pdu(RespPdu, State#state.packet_server),
360
handle_info({snmp_msg, Msg, Ip, Udp}, State) ->
361
io:format("* Got PDU: ~s", [?PACK_SERV:format_hdr(Msg)]),
362
PDU = ?PACK_SERV:get_pdu(Msg),
363
echo_pdu(PDU, State#state.mini_mib),
366
%% Generate a response...
367
RespPDU = PDU#pdu{type = 'get-response',
368
error_status = noError,
370
RespMsg = ?PACK_SERV:set_pdu(Msg, RespPDU),
371
?PACK_SERV:send_msg(RespMsg, State#state.packet_server, Ip, Udp);
375
{noreply, State#state{last_received_pdu = PDU}};
377
handle_info({get_next, Oids}, State) ->
378
d("handle_info -> get-next request for ~p",[Oids]),
379
{noreply, execute_request(get_next, Oids, State)};
381
handle_info(resend_pdu, State) ->
382
PDU = State#state.last_sent_pdu,
383
d("handle_info -> resend_pdu request when last sent pdu: ~n\t~p",[PDU]),
384
send_pdu(PDU#pdu{request_id = make_request_id()},
385
State#state.mini_mib,
386
State#state.packet_server),
389
handle_info(iter_get_next, State)
390
when is_record(State#state.last_received_pdu, pdu) ->
391
d("handle_info -> iter_get_next request",[]),
392
PrevPDU = State#state.last_received_pdu,
393
Oids = [get_oid_from_varbind(Vb) || Vb <- PrevPDU#pdu.varbinds],
394
{noreply, execute_request(get_next, Oids, State)};
396
handle_info(iter_get_next, State) ->
397
?PACK_SERV:error("[Iterated get-next] No Response PDU to "
398
"start iterating from.", []),
401
handle_info({iter_get_next, N}, State) ->
402
d("handle_info -> iter_get_next(~p) request",[N]),
404
record(State#state.last_received_pdu, pdu) ->
405
PDU = get_next_iter_impl(N, State#state.last_received_pdu,
406
State#state.mini_mib,
407
State#state.packet_server),
408
{noreply, State#state{last_received_pdu = PDU}};
410
?PACK_SERV:error("[Iterated get-next] No Response PDU to "
411
"start iterating from.", []),
415
handle_info({send_bytes, Bytes}, State) ->
416
d("handle_info -> send-bytes request for ~p bytes",
418
?PACK_SERV:send_bytes(Bytes, State#state.packet_server),
422
343
handle_call({purify_oid, Oid}, _From, #state{mini_mib = MiniMib} = State) ->
423
344
d("handle_call -> purify_oid for ~p",[Oid]),
424
345
Reply = (catch purify_oid(Oid, MiniMib)),
460
381
{Reply, NewState} = execute_discovery(State),
461
382
{reply, Reply, NewState}.
385
handle_cast({get, Oids}, State) ->
386
d("handle_cast -> get request for ~p", [Oids]),
387
{noreply, execute_request(get, Oids, State)};
389
handle_cast({set, VariablesAndValues}, State) ->
390
d("handle_cast -> set request for ~p", [VariablesAndValues]),
391
{noreply, execute_request(set, VariablesAndValues, State)};
393
handle_cast({get_next, Oids}, State) ->
394
d("handle_cast -> get-next request for ~p", [Oids]),
395
{noreply, execute_request(get_next, Oids, State)};
397
handle_cast(iter_get_next, State)
398
when is_record(State#state.last_received_pdu, pdu) ->
399
d("handle_cast -> iter_get_next request", []),
400
PrevPDU = State#state.last_received_pdu,
401
Oids = [get_oid_from_varbind(Vb) || Vb <- PrevPDU#pdu.varbinds],
402
{noreply, execute_request(get_next, Oids, State)};
404
handle_cast(iter_get_next, State) ->
405
?PACK_SERV:error("[Iterated get-next] No Response PDU to "
406
"start iterating from.", []),
409
handle_cast({iter_get_next, N}, State) ->
410
d("handle_cast -> iter_get_next(~p) request",[N]),
412
is_record(State#state.last_received_pdu, pdu) ->
413
PDU = get_next_iter_impl(N, State#state.last_received_pdu,
414
State#state.mini_mib,
415
State#state.packet_server),
416
{noreply, State#state{last_received_pdu = PDU}};
418
?PACK_SERV:error("[Iterated get-next] No Response PDU to "
419
"start iterating from.", []),
423
handle_cast(resend_pdu, #state{last_sent_pdu = PDU} = State) ->
424
d("handle_cast -> resend_pdu request when"
425
"~n PDU = ~p", [PDU]),
426
send_pdu(PDU#pdu{request_id = make_request_id()},
427
State#state.mini_mib,
428
State#state.packet_server),
431
handle_cast({bulk, Args}, State) ->
432
d("handle_bulk -> bulk request for ~p", [Args]),
433
{noreply, execute_request(bulk, Args, State)};
435
handle_cast({response, RespPdu}, State) ->
436
d("handle_cast -> response request with ~p", [RespPdu]),
437
?PACK_SERV:send_pdu(RespPdu, State#state.packet_server),
440
handle_cast({send_bytes, Bytes}, State) ->
441
d("handle_cast -> send-bytes request for ~p bytes", [sizeOf(Bytes)]),
442
?PACK_SERV:send_bytes(Bytes, State#state.packet_server),
463
445
handle_cast(Msg, State) ->
464
d("handle_cast -> unknown message: ~n\t~p",[Msg]),
446
d("handle_cast -> unknown message: "
451
handle_info({snmp_msg, Msg, Ip, Udp}, State) ->
452
io:format("* Got PDU: ~s", [?PACK_SERV:format_hdr(Msg)]),
453
PDU = ?PACK_SERV:get_pdu(Msg),
454
echo_pdu(PDU, State#state.mini_mib),
457
%% Generate a response...
458
RespPDU = PDU#pdu{type = 'get-response',
459
error_status = noError,
461
RespMsg = ?PACK_SERV:set_pdu(Msg, RespPDU),
462
?PACK_SERV:send_msg(RespMsg, State#state.packet_server, Ip, Udp);
466
{noreply, State#state{last_received_pdu = PDU}};
468
handle_info(Info, State) ->
469
d("handle_info -> unknown info: "
467
474
terminate(Reason, State) ->
468
475
d("terminate -> with Reason: ~n\t~p",[Reason]),