diff options
Diffstat (limited to 'lib/snmp/test/snmp_log_test.erl')
-rw-r--r-- | lib/snmp/test/snmp_log_test.erl | 941 |
1 files changed, 941 insertions, 0 deletions
diff --git a/lib/snmp/test/snmp_log_test.erl b/lib/snmp/test/snmp_log_test.erl new file mode 100644 index 0000000000..b4694fd9ab --- /dev/null +++ b/lib/snmp/test/snmp_log_test.erl @@ -0,0 +1,941 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. 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 +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%---------------------------------------------------------------------- +%% Purpose: +%% +%% Test: ts:run(snmp, snmp_log_test, [batch]). +%% Test: ts:run(snmp, snmp_log_test, log_to_txt2, [batch]). +%% +%%---------------------------------------------------------------------- +-module(snmp_log_test). + +%%---------------------------------------------------------------------- +%% Include files +%%---------------------------------------------------------------------- +-include("test_server.hrl"). +-include("snmp_test_lib.hrl"). +-define(SNMP_USE_V3, true). +-include_lib("snmp/include/snmp_types.hrl"). +-include_lib("kernel/include/file.hrl"). + + +%%---------------------------------------------------------------------- +%% External exports +%%---------------------------------------------------------------------- +-export([ + init_per_testcase/2, fin_per_testcase/2, + + all/1, + open_and_close/1, + open_write_and_close/1, + log_to_io1/1, + log_to_io2/1, + log_to_txt1/1, + log_to_txt2/1 + ]). + +%%---------------------------------------------------------------------- +%% Internal exports +%%---------------------------------------------------------------------- +-export([ + log_writer_main/5, + log_reader_main/1 + ]). + +%%---------------------------------------------------------------------- +%% Macros +%%---------------------------------------------------------------------- + +%%---------------------------------------------------------------------- +%% Records +%%---------------------------------------------------------------------- + +%%====================================================================== +%% External functions +%%====================================================================== + +init_per_testcase(Case, Config) when is_list(Config) -> + Dir = ?config(priv_dir, Config), + LogTestDir = join(Dir, ?MODULE), + CaseDir = join(LogTestDir, Case), + case file:make_dir(LogTestDir) of + ok -> + ok; + {error, eexist} -> + ok; + Error -> + ?FAIL({failed_creating_subsuite_top_dir, Error}) + end, + ?line ok = file:make_dir(CaseDir), + Dog = ?WD_START(?MINS(5)), + [{log_dir, CaseDir}, {watchdog, Dog}|Config]. + +fin_per_testcase(_Case, Config) when is_list(Config) -> + %% Leave the dirs created above (enable debugging of the test case(s)) + Dog = ?config(watchdog, Config), + ?WD_STOP(Dog), + lists:keydelete(watchdog, 1, Config). + + +%%====================================================================== +%% Test case definitions +%%====================================================================== +%% ?SKIP(not_yet_implemented). +all(suite) -> + [ + open_and_close, + open_write_and_close, + log_to_io1, + log_to_io2, + log_to_txt1, + log_to_txt2 + ]. + + +%%====================================================================== +%% Test functions +%%====================================================================== + +open_and_close(suite) -> []; +open_and_close(Config) when is_list(Config) -> + p(open_and_close), + put(sname,open_and_close), + put(verbosity,trace), + Dir = ?config(log_dir, Config), + Name = "snmp_test", + File = join(Dir, "snmp_test.log"), + Size = {1024, 10}, + Repair = true, + ?line {ok, Log} = snmp_log:create(Name, File, Size, Repair), + ?line ok = snmp_log:sync(Log), + ?line {ok, Info} = snmp_log:info(Log), + display_info(Info), + ?line ok = snmp_log:close(Log). + + +%%====================================================================== + +open_write_and_close(suite) -> []; +open_write_and_close(Config) when is_list(Config) -> + p(open_write_and_close), + put(sname,open_write_and_close), + put(verbosity,trace), + ?DBG("open_write_and_close -> start", []), + Dir = ?config(log_dir, Config), + Name = "snmp_test", + File = join(Dir, "snmp_test.log"), + Size = {1024, 10}, + Repair = true, + ?DBG("open_write_and_close -> create log", []), + ?line {ok, Log} = snmp_log:create(Name, File, Size, Repair), + + Vsn = 'version-2', + Community = "all-rights", + + ?DBG("open_write_and_close -> create messages to log", []), + %% A request + ?line Req = get_next_request(Vsn, Community, [1,1], 1, 235779012), + + %% A reply + ?line Rep = get_response(Vsn, Community, + [1,3,6,1,2,1,1,1,0], 'OCTET STRING', + "Erlang SNMP agent", 1, 235779012), + + %% Create a list of messages to log: + Msgs = lists:flatten(lists:duplicate(1002,[Req,Rep])), + + %% And now log them: + ?DBG("open_write_and_close -> log ~p messages, ~p bytes", + [length(Msgs), size(list_to_binary(Msgs))]), + Addr = ?LOCALHOST(), + Port = 162, + Logger = fun(Packet) -> + ?line ok = snmp_log:log(Log, Packet, Addr, Port) + end, + lists:foreach(Logger, Msgs), + check_notify(), + + ?DBG("open_write_and_close -> display info", []), + ?line {ok, Info} = snmp_log:info(Log), + display_info(Info), + + ?DBG("open_write_and_close -> close log", []), + ?line ok = snmp_log:close(Log), + + ?DBG("open_write_and_close -> done", []), + ok. + + + +%%====================================================================== + +log_to_io1(suite) -> []; +log_to_io1(doc) -> "Log to io from the same process that opened " + "and wrote the log"; +log_to_io1(Config) when is_list(Config) -> + p(log_to_io1), + put(sname,l2i1), + put(verbosity,trace), + ?DBG("log_to_io1 -> start", []), + Dir = ?config(log_dir, Config), + Name = "snmp_test_l2i1", + File = join(Dir, "snmp_test_l2i1.log"), + Size = {1024, 10}, + Repair = true, + ?DBG("log_to_io1 -> create log", []), + ?line {ok, Log} = snmp_log:create(Name, File, Size, Repair), + + ?DBG("log_to_io1 -> create messages to log", []), + Msgs = messages(), + + ?DBG("log_to_io1 -> create logger funs", []), + Addr = ?LOCALHOST(), + Port = 162, + Logger = fun(Packet) -> + ?line ok = snmp_log:log(Log, Packet, Addr, Port) + end, + BatchLogger = fun(Time) -> + lists:foreach(Logger, Msgs), + ?SLEEP(Time), + ok + end, + To = lists:duplicate(100, 100), + + ?DBG("log_to_io1 -> log the messages", []), + lists:foreach(BatchLogger, To), + + ?DBG("log_to_io1 -> display info", []), + ?line {ok, Info} = snmp_log:info(Log), + display_info(Info), + + ?DBG("log_to_io1 -> do the convert to io (stdout)", []), + ? line ok = snmp_log:log_to_io(Log, File, Dir, []), + + ?DBG("log_to_io1 -> close log", []), + ?line ok = snmp_log:close(Log), + + ?DBG("log_to_io1 -> done", []), + ok. + + +%%====================================================================== +%% Starta en logger-process som med ett visst intervall loggar +%% meddelanden. Starta en reader-process som vid ett viss tillf�lle +%% l�ser fr�n loggen. + +log_to_io2(suite) -> []; +log_to_io2(doc) -> "Log to io from a different process than which " + "opened and wrote the log"; +log_to_io2(Config) when is_list(Config) -> + process_flag(trap_exit, true), + p(log_to_io2), + put(sname, l2i2), + put(verbosity,trace), + ?DBG("log_to_io2 -> start", []), + Dir = ?config(log_dir, Config), + Name = "snmp_test_l2i2", + File = join(Dir, "snmp_test_l2i2.log"), + Size = {1024, 10}, + Repair = true, + + ?DBG("log_to_io2 -> create log writer process", []), + ?line {ok, Log, Logger} = log_writer_start(Name, File, Size, Repair), + + ?DBG("log_to_io2 -> create log reader process", []), + ?line {ok, Reader} = log_reader_start(), + + ?DBG("log_to_io2 -> wait some time", []), + ?SLEEP(5000), + + ?DBG("log_to_io2 -> display log info", []), + ?line log_writer_info(Logger), + + ?DBG("log_to_io2 -> instruct the log writer to sleep some", []), + ?line ok = log_writer_sleep(Logger, 5000), + + ?DBG("log_to_io2 -> instruct the log reader to log to io", []), + Res = + log_reader_log_to(Reader, + fun() -> + I = disk_log:info(Log), + R = snmp_log:log_to_io(Log, File, Dir, []), + {R, I} + end), + + case Res of + {ok, Info} -> + ?DBG("log_to_io2 -> ~n Info: ~p", [Info]), + ok; + {Error, Info} -> + ?DBG("log_to_io2 -> log to io failed: " + "~n Error: ~p" + "~n Info: ~p", [Error, Info]), + ?line ?FAIL({log_lo_io_failed, Error, Info}) + end, + + ?DBG("log_to_io2 -> instruct the log writer to stop", []), + ?line log_writer_stop(Logger), + + ?DBG("log_to_io2 -> instruct the log reader to stop", []), + ?line log_reader_stop(Reader), + + ?DBG("log_to_io2 -> done", []), + ok. + + +%%====================================================================== + +log_to_txt1(suite) -> []; +log_to_txt1(Config) when is_list(Config) -> + p(log_to_txt1), + put(sname,l2t1), + put(verbosity,trace), + ?DBG("log_to_txt1 -> start", []), + Dir = ?config(log_dir, Config), + Name = "snmp_test_l2t1", + File = join(Dir, "snmp_test_l2t1.log"), + Size = {10240, 10}, + Repair = true, + ?DBG("log_to_txt1 -> create log", []), + ?line {ok, Log} = snmp_log:create(Name, File, Size, Repair), + + ?DBG("log_to_txt1 -> create messages to log", []), + Msgs = messages(), + + ?DBG("log_to_txt1 -> create logger funs", []), + Addr = ?LOCALHOST(), + Port = 162, + Logger = fun(Packet) -> + ?line ok = snmp_log:log(Log, Packet, Addr, Port) + end, + BatchLogger = fun(Time) -> + lists:foreach(Logger, Msgs), + ?SLEEP(Time), + ok + end, + To = lists:duplicate(20, 5000), + + ?DBG("log_to_txt1 -> log the messages", []), + Start = calendar:local_time(), + lists:foreach(BatchLogger, To), + Stop = calendar:local_time(), + + ?DBG("log_to_txt1 -> display info", []), + ?line {ok, Info} = snmp_log:info(Log), + display_info(Info), + + Out1 = join(Dir, "snmp_text-1.txt"), + ?DBG("log_to_txt1 -> do the convert to a text file when" + "~n Out1: ~p", [Out1]), + ?line ok = snmp:log_to_txt(Dir, [], Out1, Log, File), + + ?line {ok, #file_info{size = Size1}} = file:read_file_info(Out1), + ?DBG("log_to_txt1 -> text file size: ~p", [Size1]), + validate_size(Size1), + + Out2 = join(Dir, "snmp_text-2.txt"), + ?DBG("log_to_txt1 -> do the convert to a text file when" + "~n Start: ~p" + "~n Stop: ~p" + "~n Out2: ~p", [Start, Stop, Out2]), + ?line ok = snmp:log_to_txt(Dir, [], Out2, Log, File, Start, Stop), + + ?line {ok, #file_info{size = Size2}} = file:read_file_info(Out2), + ?DBG("log_to_txt1 -> text file size: ~p", [Size2]), + validate_size(Size2, {le, Size1}), + + %% Calculate new start / stop times... + GStart = calendar:datetime_to_gregorian_seconds(Start), + ?DBG("log_to_txt1 -> GStart: ~p", [GStart]), + GStop = calendar:datetime_to_gregorian_seconds(Stop), + ?DBG("log_to_txt1 -> GStop: ~p", [GStop]), + Diff4 = (GStop - GStart) div 4, + ?DBG("log_to_txt1 -> Diff4: ~p", [Diff4]), + GStart2 = GStart + Diff4, + GStop2 = GStop - Diff4, + if + GStop2 > GStart2 -> + ok; + true -> + ?FAIL({date_calc_failure, GStart2, GStop2}) + end, + + Start2 = calendar:gregorian_seconds_to_datetime(GStart2), + Stop2 = calendar:gregorian_seconds_to_datetime(GStop2), + + Out3 = join(Dir, "snmp_text-3.txt"), + ?DBG("log_to_txt1 -> do the convert to a text file when" + "~n Start2: ~p" + "~n Stop2: ~p" + "~n Out3: ~p", [Start2, Stop2, Out3]), + ?line ok = snmp:log_to_txt(Dir, [], Out3, Log, File, Start2, Stop2), + + ?line {ok, #file_info{size = Size3}} = file:read_file_info(Out3), + ?DBG("log_to_txt1 -> text file size: ~p", [Size3]), + validate_size(Size3, {l, Size1}), + + ?DBG("log_to_txt1 -> close log", []), + ?line ok = snmp_log:close(Log), + + ?DBG("log_to_txt1 -> done", []), + ok. + + +%%====================================================================== +%% Starta en logger-process som med ett visst intervall loggar +%% meddelanden. Starta en reader-process som vid ett viss tillf�lle +%% l�ser fr�n loggen. +%% +%% Test: ts:run(snmp, snmp_log_test, log_to_txt2, [batch]). + +log_to_txt2(suite) -> []; +log_to_txt2(doc) -> "Log to txt file from a different process than which " + "opened and wrote the log"; +log_to_txt2(Config) when is_list(Config) -> + process_flag(trap_exit, true), + p(log_to_txt2), + put(sname,l2t2), + put(verbosity,trace), + ?DBG("log_to_txt2 -> start", []), + Dir = ?config(log_dir, Config), + Name = "snmp_test_l2t2", + LogFile = join(Dir, "snmp_test_l2t2.log"), + TxtFile = join(Dir, "snmp_test_l2t2.txt"), + Meg = 1024*1024, + Size = {10*Meg, 10}, + Repair = true, + + StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/", + Mibs = [join(StdMibDir, "SNMPv2-MIB")], + + ?DBG("log_to_txt2 -> create log writer process", []), + ?line {ok, Log, Logger} = log_writer_start(Name, LogFile, Size, Repair), + + ?DBG("log_to_txt2 -> create log reader process", []), + ?line {ok, Reader} = log_reader_start(), + + ?DBG("log_to_txt2 -> wait some time", []), + ?SLEEP(5000), + + ?DBG("log_to_txt2 -> display log info", []), + ?line log_writer_info(Logger), + + ?DBG("log_to_txt2 -> instruct the log writer to sleep some", []), + ?line ok = log_writer_sleep(Logger, 5000), + + ?DBG("log_to_txt2 -> instruct the log reader to log to txt", []), + Res = + log_reader_log_to(Reader, + fun() -> + I = disk_log:info(Log), + T1 = t(), + R = snmp_log:log_to_txt(Log, LogFile, Dir, + Mibs, TxtFile), + T2 = t(), + io:format(user, + "Time converting file: ~w ms~n", + [T2 - T1]), + {R, I} + end), + + case Res of + {ok, Info} -> + ?DBG("log_to_txt2 -> ~n Info: ~p", [Info]), + ?line {ok, #file_info{size = FileSize}} = + file:read_file_info(TxtFile), + ?DBG("log_to_txt2 -> text file size: ~p", [FileSize]), + validate_size(FileSize); + {Error, Info} -> + ?DBG("log_to_txt2 -> log to txt failed: " + "~n Error: ~p" + "~n Info: ~p", [Error, Info]), + ?line ?FAIL({log_lo_txt_failed, Error, Info}) + end, + + ?DBG("log_to_txt2 -> instruct the log writer to stop", []), + ?line log_writer_stop(Logger), + + ?DBG("log_to_txt2 -> instruct the log reader to stop", []), + ?line log_reader_stop(Reader), + + ?DBG("log_to_txt2 -> done", []), + ok. + + +validate_size(0) -> + ?FAIL(invalid_size); +validate_size(_) -> + ok. + +validate_size(0, _) -> + ?FAIL(invalid_size); +validate_size(A, {le, B}) when A =< B -> + ok; +validate_size(A, {l, B}) when A < B -> + ok; +validate_size(A, B) -> + ?FAIL({invalid_size, A, B}). + + +%%====================================================================== +%% Internal functions +%%====================================================================== + +log_writer_start(Name, File, Size, Repair) -> + Pid = spawn_link(?MODULE, log_writer_main, + [Name, File, Size, Repair, self()]), + receive + {log, Log, Pid} -> + {ok, Log, Pid}; + {'EXIT', Pid, Reason} -> + {error, Reason} + after 60000 -> + Msg = receive Any -> Any after 0 -> nothing end, + Info = (catch process_info(Pid)), + exit({failed_starting_writer, timeout, Msg, Info}) + end. + +log_writer_stop(Pid) -> + Pid ! {stop, self()}, + T1 = t(), + receive + {'EXIT', Pid, normal} -> + T2 = t(), + ?DBG("it took ~w ms to stop the writer", [T2 - T1]), + ok + after 60000 -> + Msg = receive Any -> Any after 0 -> nothing end, + Info = (catch process_info(Pid)), + exit({failed_stopping_writer, timeout, Msg, Info}) + end. + +log_writer_info(Pid) -> + Pid ! {info, self()}. + +log_writer_sleep(Pid, Time) -> + Pid ! {sleep, Time, self()}, + T1 = t(), + receive + {sleeping, Pid} -> + T2 = t(), + ?DBG("it took ~w ms to put the writer to sleep", [T2 - T1]), + ok; + {'EXIT', Pid, Reason} -> + {error, Reason} + after 60000 -> + Msg = receive Any -> Any after 0 -> nothing end, + Info = (catch process_info(Pid)), + exit({failed_put_writer_to_sleep, timeout, Msg, Info}) + end. + +log_writer_main(Name, File, Size, Repair, P) -> + process_flag(trap_exit, true), + %% put(sname,log_writer), + %% put(verbosity,trace), + {ok, Log} = snmp_log:create(Name, File, Size, Repair), + P ! {log, Log, self()}, + Msgs = lists:flatten(lists:duplicate(10, messages())), + Addr = ?LOCALHOST(), + Port = 162, + Logger = fun(Packet) -> + ?line ok = snmp_log:log(Log, Packet, Addr, Port) + end, + BatchLogger = fun(Time) -> + lists:foreach(Logger, Msgs), + ?SLEEP(Time), + ok + end, + log_writer(Log, BatchLogger, P). + +log_writer(Log, Fun, P) -> + lp("entry"), + receive + {stop, P} -> + lp("received stop request"), + ok = snmp_log:close(Log), + exit(normal); + {info, P} -> + lp("received info request"), + {ok, Info} = snmp_log:info(Log), + display_info(Info), + log_writer(Log, Fun, P); + {sleep, Time, P} -> + lp("received sleep (~w) request", [Time]), + P ! {sleeping, self()}, + ?SLEEP(Time), + lp("done sleeping"), + log_writer(Log, Fun, P); + ELSE -> + io:format("ERROR:logger - received unknown message: " + "~n ~p~n", [ELSE]), + log_writer(Log, Fun, P) + after 1000 -> + lp("log some messages"), + To = lists:duplicate(100, 100), + lists:foreach(Fun, To), + log_writer(Log, Fun, P) + end. + +lp(F) -> + lp(F, []). + +lp(F, A) -> + io:format(user,"writer [~w] " ++ F ++ "~n", [self()|A]). + +%% -- + +log_reader_start() -> + Pid = spawn_link(?MODULE, log_reader_main, [self()]), + T1 = t(), + receive + {started, Pid} -> + T2 = t(), + ?DBG("it took ~w ms to start the reader", [T2 - T1]), + {ok, Pid}; + {'EXIT', Pid, Reason} -> + {error, Reason} + after 1000 -> + error + end. + +log_reader_stop(Pid) -> + Pid ! {stop, self()}, + T1 = t(), + receive + {'EXIT', Pid, normal} -> + T2 = t(), + ?DBG("it took ~w ms to put the reader to eleep", [T2 - T1]), + ok + after 1000 -> + Msg = receive Any -> Any after 0 -> nothing end, + exit({failed_stopping_reader, timeout, Msg}) + end. + +log_reader_log_to(Pid, LogToFun) when is_function(LogToFun) -> + Pid ! {log_to, LogToFun, self()}, + receive + {log_to_reply, Res, Pid} -> + Res + end. + +log_reader_main(P) -> + put(sname,log_reader), + put(verbosity,trace), + P ! {started, self()}, + log_reader(P). + +log_reader(P) -> + rp("entry"), + receive + {stop, P} -> + rp("received stop request"), + exit(normal); + {log_to, F, P} -> + rp("received log_to request"), + Res = F(), + rp("done with log_to - sending reply"), + P ! {log_to_reply, Res, self()}, + log_reader(P); + ELSE -> + io:format("ERROR:reader - received unknown message: " + "~n ~p~n", [ELSE]), + log_reader(P) + end. + +rp(F) -> + rp(F, []). + +rp(F, A) -> + io:format(user, "reader [~w] " ++ F ++ "~n", [self()|A]). + + +%%====================================================================== + +check_notify() -> + receive + {disk_log, Node, LogName, Info} -> + io:format("disk_log notify: " + "~n Node: ~p" + "~n LogName: ~s" + "~n Info: ~p" + "~n", [Node, LogName, Info]), + check_notify() + after 1000 -> + done + end. + + +messages() -> + [get_next_request('version-1', "all-rights", + [1,13], 1, 1101), + get_response('version-1', "all-rights", + [1,3,6,1,2,1,1,1,0], + 'OCTET STRING', "Erlang SNMP agent", + 1, 1101), + get_request('version-1', "all-rights", + [1,3,6,1,2,1,1,1,0], 1, 1102), + get_response('version-1', "all-rights", + [1,3,6,1,2,1,1,1,0], + 'OCTET STRING', "Erlang SNMP agent", + 1, 1102), + set_request('version-1', "all-rights", + [1,3,6,1,2,1,1,6,0], + 'OCTET STRING', "new_value", + 1, 1003), + get_response('version-1', "all-rights", + [1,3,6,1,2,1,1,6,0], + 'OCTET STRING', "new_value", + 1, 1103), + get_bulk_request("all-rights", 1104), + bulk_get_response('version-1', "all-rights", + [48,29,6,8,43,6,1,2,1,1,1,0,4,17,69,114,108,97, + 110,103,32,83,78,77,80,32,97,103,101,110,116, + 48,7,6,3,43,7,1,130,0], 1104), + inform_request("all-rights", 1105), + get_response('version-1', "all-rights", + [{[1,3,6,1,2,1,1,3,0], + 'TimeTicks', + 4046, + 1}, + {[1,3,6,1,6,3,1,1,4,1,0], + 'OBJECT IDENTIFIER', + [1,3,6,1,2,1,1,0,1],2}], + 1105), + snmpv2_trap("all-rights", 1106), + trap("all-rights")]. + + +get_request(Vsn, Community, Oid, OrgIdx, ReqId) -> + Varbind = #varbind{oid = Oid, + variabletype = 'NULL', + value = 'NULL', + org_index = OrgIdx}, + Pdu = #pdu{type = 'get-response', + request_id = ReqId, + error_status = noError, + error_index = 0, + varbinds = [Varbind]}, + enc_message(Vsn, Community, Pdu). + +get_next_request(Vsn, Community, Oid, OrgIdx, ReqId) -> + Varbind = #varbind{oid = Oid, + variabletype = 'NULL', + value = 'NULL', + org_index = OrgIdx}, + Pdu = #pdu{type = 'get-next-request', + request_id = ReqId, + error_status = noError, + error_index = 0, + varbinds = [Varbind]}, + enc_message(Vsn, Community, Pdu). + +bulk_get_response(Vsn, Community, Bulk, ReqId) -> + Pdu = #pdu{type = 'get-response', + request_id = ReqId, + error_status = noError, + error_index = 0, + varbinds = Bulk}, + enc_message(Vsn, Community, Pdu). + +get_response(Vsn, Community, VarbindData, ReqId) -> + Varbinds = varbinds(VarbindData, []), + Pdu = #pdu{type = 'get-response', + request_id = ReqId, + error_status = noError, + error_index = 0, + varbinds = Varbinds}, + enc_message(Vsn, Community, Pdu). + +get_response(Vsn, Community, Oid, Type, Value, OrgIdx, ReqId) -> + Varbind = #varbind{oid = Oid, + variabletype = Type, + value = Value, + org_index = OrgIdx}, + Pdu = #pdu{type = 'get-response', + request_id = ReqId, + error_status = noError, + error_index = 0, + varbinds = [Varbind]}, + enc_message(Vsn, Community, Pdu). + +set_request(Vsn, Community, Oid, Type, Value, OrgIdx, ReqId) -> + Varbind = #varbind{oid = Oid, + variabletype = Type, + value = Value, + org_index = OrgIdx}, + Pdu = #pdu{type = 'set-request', + request_id = ReqId, + error_status = noError, + error_index = 0, + varbinds = [Varbind]}, + enc_message(Vsn, Community, Pdu). + + +get_bulk_request(Community, ReqId) -> + Varbinds = [#varbind{oid = [1,3,6,1,2,1,1,1], + variabletype = 'NULL', + value = 'NULL', + org_index = 1}, + #varbind{oid = [1,3,7,1], + variabletype = 'NULL', + value = 'NULL', + org_index = 2}], + Pdu = #pdu{type = 'get-bulk-request', + request_id = ReqId, + error_status = 1, + error_index = 1, + varbinds = Varbinds}, + enc_message('version-2', Community, Pdu). + +inform_request(Community, ReqId) -> + Varbinds = [#varbind{oid = [1,3,6,1,2,1,1,3,0], + variabletype = 'TimeTicks', + value = 4046, + org_index = 1}, + #varbind{oid = [1,3,6,1,6,3,1,1,4,1,0], + variabletype = 'OBJECT IDENTIFIER', + value = [1,3,6,1,2,1,1,0,1], + org_index = 2}], + Pdu = #pdu{type = 'inform-request', + request_id = ReqId, + error_status = noError, + error_index = 0, + varbinds = Varbinds}, + enc_message('version-2', Community, Pdu). + +snmpv2_trap(Community, ReqId) -> + Varbinds = [#varbind{oid = [1,3,6,1,2,1,1,3,0], + variabletype = 'TimeTicks', + value = 3945, + org_index = 1}, + #varbind{oid = [1,3,6,1,6,3,1,1,4,1,0], + variabletype = 'OBJECT IDENTIFIER', + value = [1,3,6,1,2,1,11,1], + org_index = 2}], + Pdu = #pdu{type = 'snmpv2-trap', + request_id = ReqId, + error_status = noError, + error_index = 0, + varbinds = Varbinds}, + enc_message('version-2', Community, Pdu). + +% report() -> +% Varbind = #varbind{oid = ?snmpUnknownPDUHandlers, +% variabletype = 'Counter32', +% value = 111}, +% Pdu = #pdu{type = report, +% request_id = 991199, +% error_status = noError, +% error_index = 0, +% varbinds = [Varbind]}, +% enc_message('version-3', Community, Pdu). + +trap(Community) -> + Enterp = [1,3,6,1,2,1,1], + Oid = [1,3,6,1,2,1,1,4,0], + Type = 'OCTET STRING', + Value = "{mbj,eklas}@erlang.ericsson.se", + SysUpTime = 4379, + Spec = 1, + Generic = 6, + AgentIp = [127,0,0,1], + trap(Community, Enterp, Oid, Type, Value, SysUpTime, + Spec, Generic, AgentIp, 1). + +%% V1 trap +trap(Community, Enterp, Oid, Type, Value, SysUpTime, + Spec, Generic, AgentIp, OrgIdx) -> + Varbind = #varbind{oid = Oid, + variabletype = Type, + value = Value, + org_index = OrgIdx}, + Trap = #trappdu{enterprise = Enterp, + agent_addr = AgentIp, + generic_trap = Generic, + specific_trap = Spec, + time_stamp = SysUpTime, + varbinds = [Varbind]}, + enc_message('version-1', Community, Trap). + +varbinds([], Varbinds) -> + lists:reverse(Varbinds); +varbinds([{Oid, Type, Value, Idx}|T], Acc) -> + Varbind = #varbind{oid = Oid, + variabletype = Type, + value = Value, + org_index = Idx}, + varbinds(T, [Varbind|Acc]). + +% enc_message('version-3' = Vsn, Community, Pdu) -> +% ScopedPDU = #scopedPdu{contextEngineID = ContextEngineID, +% contextName = ContextName, +% data = Pdu}, +% NUsmSecParams = +% UsmSecParams#usmSecurityParameters{msgAuthenticationParameters = +% AuthParams}, +% SecBytes = snmp_pdus:enc_usm_security_parameters(NUsmSecParams), +% V3Hdr = #v3_hdr{msgID = MsgID, +% msgMaxSize = AgentMS, +% msgFlags = snmp_misc:mk_msg_flags(Type, SecLevel), +% msgSecurityParameters = SecBytes +% msgSecurityModel = MsgSecurityModel}, +% Msg = #message{version = Vsn, vsn_hdr = V3Hdr, +% data = ScopedPDUBytes}, +% snmp_pdus:enc_message_only(Message2); + +enc_message(Vsn, Community, Pdu) -> + PduBytes = snmp_pdus:enc_pdu(Pdu), + Msg = #message{version = Vsn, + vsn_hdr = Community, + data = PduBytes}, + list_to_binary(snmp_pdus:enc_message_only(Msg)). + +display_info(Info) -> + {SinceOpened, SinceLastInfo} = get_info(no_overflows, Info, {-1,-1}), + CurrentFile = get_info(current_file, Info, -1), + NoItems = get_info(no_current_items, Info, -1), + NoBytes = get_info(no_current_bytes, Info, -1), + io:format(user, "Disk log info: " + "~n Number of filled since opened: ~p" + "~n Number of filled since last info: ~p" + "~n Current file: ~p" + "~n Number of items in file: ~p" + "~n Number of bytes in file: ~p" + "~n", + [SinceOpened, SinceLastInfo, CurrentFile, NoItems, NoBytes]). + +get_info(Key, Info, Def) -> + case lists:keysearch(Key, 1, Info) of + {value, {Key, Val}} -> + Val; + false -> + Def + end. + +join(D, F) -> + filename:join(D, F). + +p(Case) -> + io:format(user, "test case: ~w~n", [Case]). + +%% Time in milli sec +t() -> + {A,B,C} = erlang:now(), + A*1000000000+B*1000+(C div 1000). |