diff options
-rw-r--r-- | lib/snmp/src/agent/snmp_view_based_acm_mib.erl | 29 | ||||
-rw-r--r-- | lib/snmp/src/agent/snmpa_agent.erl | 4 | ||||
-rw-r--r-- | lib/snmp/src/agent/snmpa_vacm.erl | 80 |
3 files changed, 41 insertions, 72 deletions
diff --git a/lib/snmp/src/agent/snmp_view_based_acm_mib.erl b/lib/snmp/src/agent/snmp_view_based_acm_mib.erl index 37f6dd3f26..2cee91b081 100644 --- a/lib/snmp/src/agent/snmp_view_based_acm_mib.erl +++ b/lib/snmp/src/agent/snmp_view_based_acm_mib.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1999-2011. All Rights Reserved. +%% Copyright Ericsson AB 1999-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -203,18 +203,16 @@ init_sec2group_table([Row | T]) -> init_sec2group_table(T); init_sec2group_table([]) -> true. -init_access_table([{GN, Prefix, Model, Level, Row} | T]) -> -%% ?vtrace("init access table: " -%% "~n GN: ~p" -%% "~n Prefix: ~p" -%% "~n Model: ~p" -%% "~n Level: ~p" -%% "~n Row: ~p",[GN, Prefix, Model, Level, Row]), - Key = [length(GN) | GN] ++ [length(Prefix) | Prefix] ++ [Model, Level], - snmpa_vacm:insert([{Key, Row}], false), - init_access_table(T); -init_access_table([]) -> - snmpa_vacm:dump_table(). +make_access_key(GN, Prefix, Model, Level) -> + [length(GN) | GN] ++ [length(Prefix) | Prefix] ++ [Model, Level]. + +make_access_entry({GN, Prefix, Model, Level, Row}) -> + Key = make_access_key(GN, Prefix, Model, Level), + {Key, Row}. + +init_access_table(TableData) -> + TableData2 = [make_access_entry(E) || E <- TableData], + snmpa_vacm:insert(TableData2, true). init_view_table([Row | T]) -> %% ?vtrace("init view table: " @@ -276,10 +274,7 @@ add_access(GroupName, Prefix, SecModel, SecLevel, Match, RV, WV, NV) -> Match, RV, WV, NV}, case (catch check_vacm(Access)) of {ok, {vacmAccess, {GN, Pref, SM, SL, Row}}} -> - Key1 = [length(GN) | GN], - Key2 = [length(Pref) | Pref], - Key3 = [SM, SL], - Key = Key1 ++ Key2 ++ Key3, + Key = make_access_key(GN, Pref, SM, SL), snmpa_vacm:insert([{Key, Row}], false), snmpa_agent:invalidate_ca_cache(), {ok, Key}; diff --git a/lib/snmp/src/agent/snmpa_agent.erl b/lib/snmp/src/agent/snmpa_agent.erl index b78f520c50..5db3eab012 100644 --- a/lib/snmp/src/agent/snmpa_agent.erl +++ b/lib/snmp/src/agent/snmpa_agent.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1996-2011. All Rights Reserved. +%% Copyright Ericsson AB 1996-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -4081,7 +4081,7 @@ handle_serializer_down(Mon, Tag) -> %% ------------------------------------------------------------------------ -agent_info(#state{worker = W, set_worker = SW}) -> +agent_info(#state{worker = W, set_worker = SW}) -> case (catch get_agent_info(W, SW)) of Info when is_list(Info) -> Info; diff --git a/lib/snmp/src/agent/snmpa_vacm.erl b/lib/snmp/src/agent/snmpa_vacm.erl index efe6378105..2cbc11d280 100644 --- a/lib/snmp/src/agent/snmpa_vacm.erl +++ b/lib/snmp/src/agent/snmpa_vacm.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 1999-2010. All Rights Reserved. +%% Copyright Ericsson AB 1999-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -267,71 +267,45 @@ dump_table(_) -> ok. -%% We should really make an effort to serialize the dumping -%% to ensure that several processes that dump at-the-same-time -%% do not trash each others dumps. -%% <SUGGESTION> -%% Send the request to the master agent, which, if there is no -%% dumper already running, spawns a (temporary) dumper process. -%% If there is already a running dumper process, instead increment -%% the dump_request counter. -%% When the dumper process exits, the master agent checks the -%% the dump_request counter, and if that is greater than zero, -%% create another dumper process and resets the counter. -%% In this way the dumping is serialized, but the master-agent -%% process is not burdend by the dumping. -%% </SUGGESTION> dump_table() -> - %% The dumper fun is executed in a specially started process, - %% that does that one thing and then exits. - %% Also, to prevent the system to run "wild" (keep calling - %% dump function before they are done), the agents serialize - %% function return when that dump is done! - Dumper = - fun() -> - [{_, FName}] = ets:lookup(snmp_agent_table, snmpa_vacm_file), - %% TmpName = FName ++ ".tmp", - TmpName = unique_name(FName), - case ets:tab2file(snmpa_vacm, TmpName) of - ok -> - case file:rename(TmpName, FName) of - ok -> - ok; - Else -> % What is this? Undocumented return code... - user_err("Warning: could not move VACM db ~p" - " (~p)", [FName, Else]) - end; - {error, Reason} -> - user_err("Warning: could not save vacm db ~p (~p)", - [FName, Reason]) - end - end, - snmpa_agent:serialize(snmpa_vacm_dump_request, Dumper). - + [{_, FName}] = ets:lookup(snmp_agent_table, snmpa_vacm_file), + TmpName = unique_table_name(FName), + case ets:tab2file(snmpa_vacm, TmpName) of + ok -> + case file:rename(TmpName, FName) of + ok -> + ok; + Else -> % What is this? Undocumented return code... + user_err("Warning: could not move VACM db ~p" + " (~p)", [FName, Else]) + end; + {error, Reason} -> + user_err("Warning: could not save vacm db ~p (~p)", + [FName, Reason]) + end. %% This little thing is an attempt to create a "unique" filename %% in order to minimize the risk of two processes at the same %% time dumping the table. -%% The serialization handled by the agent does this much better, -%% but this also gives us a "timestamp" which could be usefull for -%% debugging reasons. -unique_name(Pre) -> - unique_name(Pre, os:timestamp()). - -unique_name(Pre, {_A, _B, C} = Timestamp) -> - {Date, Time} = calendar:now_to_datetime(Timestamp), +unique_table_name(Pre) -> + %% We want something that is guaranteed to be unique, + %% therefor we use erlang:now() instead of os:timestamp() + unique_table_name(Pre, erlang:now()). + +unique_table_name(Pre, {_A, _B, C} = Now) -> + {Date, Time} = calendar:now_to_datetime(Now), {YYYY, MM, DD} = Date, {Hour, Min, Sec} = Time, FormatDate = io_lib:format("~.4w~.2.0w~.2.0w_~.2.0w~.2.0w~.2.0w_~w", [YYYY, MM, DD, Hour, Min, Sec, round(C/1000)]), - unique_name2(Pre, FormatDate). + unique_table_name2(Pre, FormatDate). -unique_name2(Pre, FormatedDate) -> - PidPart = unique_pid(), +unique_table_name2(Pre, FormatedDate) -> + PidPart = unique_table_name_pid(), lists:flatten(io_lib:format("~s.~s~s.tmp", [Pre, PidPart, FormatedDate])). -unique_pid() -> +unique_table_name_pid() -> case string:tokens(pid_to_list(self()), [$<,$.,$>]) of [A, B, C] -> A ++ B ++ C ++ "."; |