36
36
which_notification_filter/1,
40
40
is_originating_discovery_enabled/0,
41
41
is_terminating_discovery_enabled/0,
42
terminating_discovery_stage2/0
42
terminating_discovery_stage2/0,
43
terminating_trigger_username/0
44
45
-export([verbosity/2, dump_mibs/1, dump_mibs/2]).
45
46
-export([validate_err/3, make_value_a_correct_value/3,
46
47
do_get/3, do_get/4,
47
48
get/2, get/3, get_next/2, get_next/3]).
48
49
-export([mib_of/1, mib_of/2, me_of/1, me_of/2,
49
invalidate_mibs_cache/1]).
50
invalidate_mibs_cache/1,
51
enable_mibs_cache/1, disable_mibs_cache/1,
52
gc_mibs_cache/1, gc_mibs_cache/2, gc_mibs_cache/3,
53
enable_mibs_cache_autogc/1, disable_mibs_cache_autogc/1,
54
update_mibs_cache_age/2,
55
update_mibs_cache_gclimit/2]).
50
56
-export([get_agent_mib_storage/0, db/1,
52
58
-export([get_log_type/1, set_log_type/2]).
92
100
-record(notification_filter, {id, mod, data}).
94
{from, rec, sender, target, sec_level, ctx, ivbs, stage, handler}).
102
{from, rec, sender, target, engine_id,
103
sec_level, ctx, ivbs, stage, handler, extra}).
97
106
%%-----------------------------------------------------------------
211
222
me_of(Agent, Oid) when is_list(Oid) ->
212
223
call(Agent, {me_of, Oid}).
214
226
invalidate_mibs_cache(Agent) ->
215
call(Agent, invalidate_mibs_cache).
227
call(Agent, {mibs_cache_request, invalidate_cache}).
230
gc_mibs_cache(Agent) ->
231
call(Agent, {mibs_cache_request, gc_cache}).
233
gc_mibs_cache(Agent, Age) ->
234
call(Agent, {mibs_cache_request, {gc_cache, Age}}).
236
gc_mibs_cache(Agent, Age, GcLimit) ->
237
call(Agent, {mibs_cache_request, {gc_cache, Age, GcLimit}}).
240
enable_mibs_cache(Agent) ->
241
call(Agent, {mibs_cache_request, enable_cache}).
243
disable_mibs_cache(Agent) ->
244
call(Agent, {mibs_cache_request, disable_cache}).
247
enable_mibs_cache_autogc(Agent) ->
248
call(Agent, {mibs_cache_request, enable_autogc}).
250
disable_mibs_cache_autogc(Agent) ->
251
call(Agent, {mibs_cache_request, disable_autogc}).
254
update_mibs_cache_gclimit(Agent, GcLimit) ->
255
call(Agent, {mibs_cache_request, {update_gclimit, GcLimit}}).
258
update_mibs_cache_age(Agent, Age) ->
259
call(Agent, {mibs_cache_request, {update_age, Age}}).
220
262
init([Prio, Parent, Ref, Options]) ->
478
520
%% -- Discovery functions --
523
case ets:lookup(snmp_agent_table, discovery) of
526
[{discovery, DiscoOptions}] ->
530
originating_disco_opts() ->
531
DiscoOpts = disco_opts(),
532
case lists:keysearch(originating, 1, DiscoOpts) of
533
{value, {originating, OrigDisco}} ->
480
539
is_originating_discovery_enabled() ->
481
case ets:lookup(snmp_agent_table, discovery) of
484
[{discovery, DiscoOptions}] ->
485
case lists:keysearch(originating, 1, DiscoOptions) of
486
{value, {originating, OrigDisco}} ->
487
case lists:keysearch(enable, 1, OrigDisco) of
488
{value, {enable, false}} ->
540
OrigDisco = originating_disco_opts(),
541
case lists:keysearch(enable, 1, OrigDisco) of
542
{value, {enable, false}} ->
548
terminating_disco_opts() ->
549
DiscoOpts = disco_opts(),
550
case lists:keysearch(terminating, 1, DiscoOpts) of
551
{value, {terminating, TermDisco}} ->
498
557
is_terminating_discovery_enabled() ->
500
case ets:lookup(snmp_agent_table, discovery) of
503
[{discovery, DiscoOptions}] ->
504
case lists:keysearch(terminating, 1, DiscoOptions) of
505
{value, {terminating, TermDisco}} ->
506
case lists:keysearch(enable, 1, TermDisco) of
507
{value, {enable, false}} ->
558
TermDisco = terminating_disco_opts(),
559
case lists:keysearch(enable, 1, TermDisco) of
560
{value, {enable, false}} ->
517
566
terminating_discovery_stage2() ->
519
case ets:lookup(snmp_agent_table, discovery) of
522
[{discovery, DiscoOptions}] ->
523
case lists:keysearch(terminating, 1, DiscoOptions) of
524
{value, {terminating, TermDisco}} ->
525
case lists:keysearch(stage2, 1, TermDisco) of
526
{value, {stage2, Stage2}} when ((Stage2 =:= discovery) orelse (Stage2 =:= plain)) ->
568
TermDisco = terminating_disco_opts(),
569
case lists:keysearch(stage2, 1, TermDisco) of
570
{value, {stage2, Stage2}} when ((Stage2 =:= discovery) orelse (Stage2 =:= plain)) ->
576
terminating_trigger_username() ->
577
Default = ?DISCO_TERMINATING_TRIGGER_USERNAME,
578
TermDisco = terminating_disco_opts(),
579
case lists:keysearch(trigger_username, 1, TermDisco) of
580
{value, {trigger_username, Trigger}} when is_list(Trigger) ->
537
587
discovery(TargetName, Notification, ContextName, Varbinds,
588
DiscoHandler, ExtraInfo) ->
539
589
case is_originating_discovery_enabled() of
541
591
Agent = snmp_master_agent,
544
TargetName, Notification, ContextName, Varbinds, DiscoHandler});
594
TargetName, Notification, ContextName, Varbinds,
595
DiscoHandler, ExtraInfo});
546
597
{error, not_enabled}
804
861
"~n Notification: ~p"
805
862
"~n ContextName: ~p"
807
"~n DiscoHandler: ~p",
808
[TargetName, Notification, ContextName, Vbs, DiscoHandler]),
864
"~n DiscoHandler: ~p"
866
[TargetName, Notification, ContextName, Vbs,
867
DiscoHandler, ExtraInfo]),
809
868
case handle_discovery(S, From, TargetName,
810
Notification, ContextName, Vbs, DiscoHandler) of
869
Notification, ContextName, Vbs, DiscoHandler,
812
872
?vtrace("[handle_call] first stage of discovery process initiated",
945
1005
?vlog("whereis mib ~p", [Mib]),
946
1006
{reply, snmpa_mib:whereis_mib(get(mibserver), Mib), S};
948
handle_call(invalidate_mibs_cache, _From, S) ->
949
?vlog("invalidate_mibs_cache", []),
950
snmpa_mib:invalidate_cache(get(mibserver)),
1008
handle_call({mibs_cache_request, MibsCacheReq}, From, S) ->
1009
?vlog("mibs_cache_request: ~p", [MibsCacheReq]),
1010
{MibsCacheWorker, Ref} =
1011
handle_mibs_cache_request(get(mibserver), MibsCacheReq),
1012
NewS = S#state{mibs_cache_request = {MibsCacheWorker, Ref, From}},
953
1015
handle_call(info, _From, S) ->
954
1016
?vlog("info", []),
1184
handle_mibs_cache_request(MibServer, Req) ->
1185
{MibsCacheWorker, MibsCacheRef} =
1191
snmpa_mib:invalidate_cache(MibServer);
1193
snmpa_mib:gc_cache(MibServer);
1195
snmpa_mib:gc_cache(MibServer, Age);
1196
{gc_cache, Age, GcLimit} ->
1197
snmpa_mib:gc_cache(MibServer, Age, GcLimit);
1199
snmpa_mib:enable_cache(MibServer);
1201
snmpa_mib:disable_cache(MibServer);
1203
snmpa_mib:enable_cache_autogc(MibServer);
1205
snmpa_mib:disable_cache_autogc(MibServer);
1206
{update_gclimit, GcLimit} ->
1207
snmpa_mib:update_cache_gclimit(MibServer,
1209
{update_age, Age} ->
1210
snmpa_mib:update_cache_age(MibServer, Age);
1212
{error, {unknown_mibs_cache_request, Req}}
1214
exit({mibs_cache_reply, Reply})
1216
{MibsCacheWorker, MibsCacheRef}.
1122
1219
%%-----------------------------------------------------------------
1123
1220
%% Code replacement
1743
1840
"~n Record: ~p"
1744
1841
"~n InitVars: ~p", [Record, InitVars]),
1745
1842
send_discovery(S, From, TargetName,
1746
Record, ContextName, InitVars, DiscoHandler);
1843
Record, ContextName, InitVars,
1844
DiscoHandler, ExtraInfo);
1748
1846
{error, failed_constructing_notification}
1750
1848
handle_discovery(_S, _From,
1751
1849
_TargetName, _Notification, _ContextName, _Varbinds,
1850
_DiscoHandler, _ExtraInfo) ->
1753
1851
{error, only_master_discovery}.
1755
1853
%% We ignore if the master agent is multi-threaded or not.
1757
1855
send_discovery(S, From,
1758
TargetName, Record, ContextName, InitVars, DiscoHandler) ->
1856
TargetName, Record, ContextName, InitVars,
1857
DiscoHandler, ExtraInfo) ->
1759
1858
case snmpa_trap:send_discovery(TargetName, Record, ContextName,
1760
1859
InitVars, get(net_if)) of
1761
1860
{ok, Sender, SecLevel} ->
1798
1899
case snmp_target_mib:set_target_engine_id(TargetName, ManagerEngineId) of
1799
1900
true when Disco#disco.sec_level =:= ?'SnmpSecurityLevel_noAuthNoPriv' ->
1800
1901
%% Ok, we are done
1801
From = Disco#disco.from,
1902
From = Disco#disco.from,
1802
1903
Handler = Disco#disco.handler,
1803
Reply = handle_discovery_stage1_finish(Handler,
1804
TargetName, ManagerEngineId),
1905
case handle_discovery_stage1_finish(Handler,
1910
{ok, ManagerEngineId};
1805
1914
gen_server:reply(From, Reply),
1806
1915
S#state{disco = undefined};
1808
1917
true when Disco#disco.sec_level =/= ?'SnmpSecurityLevel_noAuthNoPriv' ->
1809
1918
%% Ok, time for stage 2
1810
%% Send the same inform again, this time we have the proper EngineId
1919
%% Send the same inform again,
1920
%% this time we have the proper EngineId
1812
From = Disco#disco.from,
1922
From = Disco#disco.from,
1813
1923
Handler = Disco#disco.handler,
1815
1925
case handle_discovery_stage1_finish(Handler,
1816
TargetName, ManagerEngineId) of
1929
{ok, NewExtraInfo} ->
1818
1930
?vdebug("handle_discovery_response(1) -> "
1819
1931
"we are done with stage 1 - "
1820
1932
"continue with stage 2", []),
1821
#disco{target = TargetName,
1824
ivbs = InitVars} = Disco,
1825
case snmpa_trap:send_discovery(TargetName, Record, ContextName,
1933
#disco{rec = Record,
1935
ivbs = InitVars} = Disco,
1936
case snmpa_trap:send_discovery(TargetName, Record,
1826
1938
InitVars, get(net_if)) of
1827
1939
{ok, Sender, _SecLevel} ->
1828
1940
?vdebug("handle_discovery_response(1) -> "
1829
1941
"stage 2 trap sent", []),
1830
Disco2 = Disco#disco{sender = Sender,
1832
{ok, S#state{disco = Disco2}};
1942
Disco2 = Disco#disco{sender = Sender,
1943
engine_id = ManagerEngineId,
1945
extra = NewExtraInfo},
1946
S#state{disco = Disco2};
1834
1948
?vlog("handle_discovery_response(1) -> "
1835
1949
"failed sending stage 2 trap: "
1836
1950
"~n ~p", [Error]),
1951
error_msg("failed sending second "
1952
"discovery message: "
1954
Reply = {error, {second_send_failed, Error}},
1955
gen_server:reply(From, Reply),
1956
S#state{disco = undefined}
1839
1958
{error, Reason} = Error ->
1840
1959
?vlog("handle_discovery_response(1) -> "
1870
1991
warning_msg("Received unexpected discovery response: ~p", [Crap]),
1874
handle_discovery_stage1_finish(Handler, TargetName, ManagerEngineID) ->
1875
case (catch Handler:stage1_finish(TargetName, ManagerEngineID)) of
1994
handle_discovery_stage1_finish(Handler, TargetName, ManagerEngineID,
1996
case (catch Handler:stage1_finish(TargetName, ManagerEngineID,
1877
1999
?vtrace("handle_discovery_stage1_finish -> "
1878
"we are done - [ignore] inform the user", []),
1879
{ok, ManagerEngineID};
2000
"we are done - [ignore] inform the user", []),
1880
2003
{ok, UsmEntry} when is_tuple(UsmEntry) ->
1881
2004
?vtrace("handle_discovery_stage1_finish -> "
1882
"received usm entry - attempt to add entry", []),
1883
case snmp_user_based_sm_mib:add_user(UsmEntry) of
1887
?vlog("handle_discovery_stage1_finish -> "
1888
"failed adding usm entry: "
1890
{error, {failed_adding_entry, Reason, ManagerEngineID}}
2005
"received usm entry - attempt to add it", []),
2006
case add_usm_users([UsmEntry]) of
2013
{ok, UsmEntry, NewExtraInfo} when is_tuple(UsmEntry) ->
2014
?vtrace("handle_discovery_stage1_finish -> "
2015
"received usm entry - attempt to add it", []),
2016
case add_usm_users([UsmEntry]) of
2023
{ok, UsmEntries} when is_list(UsmEntries) ->
2024
?vtrace("handle_discovery_stage1_finish -> "
2025
"received usm entries - attempt to add them", []),
2026
case add_usm_users(UsmEntries) of
2033
{ok, UsmEntries, NewExtraInfo} when is_list(UsmEntries) ->
2034
?vtrace("handle_discovery_stage1_finish -> "
2035
"received usm entries - attempt to add them", []),
2036
case add_usm_users(UsmEntries) of
1892
2043
{'EXIT', Reason} ->
1893
2044
?vlog("handle_discovery_stage1_finish -> stage 1 function exited: "
1894
2045
"~n ~p", [Reason]),
1895
2046
{error, {finish_exit, Reason, ManagerEngineID}};
1896
2048
{error, Reason} ->
1897
2049
?vlog("handle_discovery_stage1_finish -> stage 1 function error: "
1898
2050
"~n ~p", [Reason]),
1899
2051
{error, {finish_error, Reason, ManagerEngineID}};
1901
2054
?vlog("handle_discovery_stage1_finish -> stage 1 function unknown: "
1902
2055
"~n ~p", [Unknown]),
1903
2056
{error, {finish_failed, Unknown, ManagerEngineID}}
2059
add_usm_users([]) ->
2061
add_usm_users([UsmEntry|UsmEntries]) when is_tuple(UsmEntry) ->
2062
?vtrace("add_usm_users -> attempt to add entry (~w)",
2063
[element(1, UsmEntry)]),
2064
case snmp_user_based_sm_mib:add_user(UsmEntry) of
2066
add_usm_users(UsmEntries);
2068
?vlog("add_usm_users -> failed adding usm entry: "
2070
{error, {failed_adding_entry, Reason, UsmEntry}}
1907
2074
handle_me_of(MibServer, Oid) ->
1908
2075
case snmpa_mib:lookup(MibServer, Oid) of