aboutsummaryrefslogtreecommitdiffstats
path: root/lib/snmp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/snmp')
-rw-r--r--lib/snmp/src/compile/snmpc.src230
1 files changed, 203 insertions, 27 deletions
diff --git a/lib/snmp/src/compile/snmpc.src b/lib/snmp/src/compile/snmpc.src
index 5ad88eacc8..61d7a0b04f 100644
--- a/lib/snmp/src/compile/snmpc.src
+++ b/lib/snmp/src/compile/snmpc.src
@@ -2,47 +2,57 @@
%% -*- erlang -*-
%%
+-include_lib("kernel/include/file.hrl").
+
-record(state,
{
- version = %VSN%,
+ version = "%VSN%",
mib_file,
outdir = "./",
db = volatile,
include_dirs = ["./"],
include_lib_dirs = [],
- deprecated = true,
- group_check = true,
- description = false,
- reference = false,
- imports = false,
- module_identity = false,
+ deprecated = false,
+ group_check = true,
+ description = false,
+ reference = false,
+ imports = false,
+ module_identity = false,
+ module_compliance = false,
+ agent_capabilities = false,
module,
- no_defs = false,
- relaxed_row_name_assigne_check,
- verbosity
+ no_defaults = false,
+ relaxed_row_name_assigne_check = false,
+ %% The default verbosity (silence) will be filled in
+ %% during argument processing.
+ verbosity,
+ warnings = false
}).
%% --o Dir [defaults to "./"]
%% --i Dir [defaults to "./"]
%% --il Dir
-%% --gc
+%% --sgc
%% --db DB [defaults to volatile]
%% --dep
%% --desc
%% --ref
%% --imp
%% --mi
+%% --mc
+%% --ac
%% --mod Mod
%% --nd
%% --rrnac
%% --version
%% --verbosity V
+%% --warnings
main(Args) when is_list(Args) ->
case (catch process_args(Args)) of
ok ->
usage();
{ok, State} when is_record(State, state) ->
- io:format("snmpc: ~p~n", [State]);
+ compile(State);
{ok, Str} when is_list(Str) ->
io:format("~s~n~n", [Str]),
halt(1);
@@ -52,14 +62,101 @@ main(Args) when is_list(Args) ->
main(_) ->
usage().
+compile(State) ->
+ io:format("snmpc: ~p~n", [State]),
+ File = mk_file(State),
+ Options = mk_options(State),
+ case snmpc:compile(File, Options) of
+ {ok, BinFileName} ->
+ io:format("BinFileName: ~p~n", [BinFileName]),
+ ok;
+ {error, Reason} ->
+ io:format("Reason: ~p~n", [Reason]),
+ ok
+ end.
+
+mk_file(#state{mib_file = MIB}) ->
+ MIB -- ".mib".
+
+mk_options(#state{outdir = OutDir,
+ db = DB,
+ include_dirs = IDs,
+ include_lib_dirs = ILDs,
+ deprecated = Dep,
+ group_check = GC,
+ description = Desc,
+ reference = Ref,
+ imports = Imp,
+ module_identity = MI,
+ module_compliance = MC,
+ agent_capabilities = AC,
+ module = Mod,
+ no_defaults = ND,
+ relaxed_row_name_assigne_check = RRNAC,
+ %% The default verbosity (silence) will be filled in
+ %% during argument processing.
+ verbosity = V,
+ warnings = W}) ->
+ [{outdir, OutDir},
+ {db, DB},
+ {i, IDs},
+ {il, ILDs},
+ {group_check, GC},
+ {verbosity, V},
+ {warnings, W},
+ {deprecated, Dep}] ++
+ if
+ (Mod =/= undefined) ->
+ [{module, Mod}];
+ true ->
+ []
+ end ++
+ maybe_option(ND, no_defs) ++
+ maybe_option(RRNAC, relaxed_row_name_assign_check) ++
+ maybe_option(Desc, description) ++
+ maybe_option(Ref, reference) ++
+ maybe_option(Imp, imports) ++
+ maybe_option(MI, module_identity) ++
+ maybe_option(MC, module_compliance) ++
+ maybe_option(AC, agent_capabilities).
+
+maybe_option(true, Opt) -> [Opt];
+maybe_option(_, _) -> [].
+
process_args([]) ->
- {error, lists:flatten(io_lib:format("No MIB-file", []))};
+ e("No input file");
process_args(Args) ->
- %% CWD = "./",
process_args(Args, #state{}).
-process_args([], State) ->
- {ok, State};
+process_args([], #state{verbosity = Verbosity0, mib_file = MIB} = State) ->
+ if
+ (MIB =:= undefined) ->
+ e("No input file");
+ true ->
+ Verbosity =
+ case Verbosity0 of
+ undefined ->
+ silence;
+ _ ->
+ Verbosity0
+ end,
+ IPath = lists:reverse(State#state.include_dirs),
+ IlPath = lists:reverse(State#state.include_lib_dirs),
+ {ok, State#state{verbosity = Verbosity,
+ include_dirs = IPath,
+ include_lib_dirs = IlPath}}
+ end;
+process_args([MIB], State) ->
+ case (catch file:read_file_info(MIB)) of
+ {ok, #file_info{type = regular}} ->
+ {ok, State#state{mib_file = MIB}};
+ {ok, #file_info{type = BadType}} ->
+ e(lists:flatten(io_lib:format("~s not a file: ~w", [MIB, BadType])));
+ {error, enoent} ->
+ e(lists:flatten(io_lib:format("No such file: ~s", [MIB])));
+ _ ->
+ e(lists:flatten(io_lib:format("Bad file: ~s", [MIB])))
+ end;
process_args(["--help"|_Args], _State) ->
ok;
process_args(["--version"|_Args], State) ->
@@ -76,9 +173,70 @@ process_args(["--verbosity", Verbosity0|Args], #state{verbosity = V} = State)
process_args(["--verbosity"|_Args], #state{verbosity = V})
when (V =/= undefined) ->
e(lists:flatten(io_lib:format("Verbosity already set to ~w", [V])));
-process_args([Arg|Args], State) ->
- io:format("Arg: ~p~n", [Arg]),
- process_args(Args, State).
+process_args(["--warnings"|Args], State) ->
+ process_args(Args, State#state{warnings = true});
+process_args(["--o", Dir|Args], State) ->
+ case (catch file:read_file_info(Dir)) of
+ {ok, #file_info{type = directory}} ->
+ process_args(Args, State#state{outdir = Dir});
+ {ok, #file_info{type = BadType}} ->
+ e(lists:flatten(io_lib:format("Not a directory: ~p (~w)", [Dir, BadType])));
+ _ ->
+ e(lists:flatten(io_lib:format("Bad directory: ~p", [Dir])))
+ end;
+process_args(["--i", Dir|Args], State) ->
+ case (catch file:read_file_info(Dir)) of
+ {ok, #file_info{type = directory}} ->
+ IPath = [Dir | State#state.include_dirs],
+ process_args(Args, State#state{include_dirs = IPath});
+ {ok, #file_info{type = BadType}} ->
+ e(lists:flatten(io_lib:format("Not a directory: ~p (~w)", [Dir, BadType])));
+ _ ->
+ e(lists:flatten(io_lib:format("Bad directory: ~p", [Dir])))
+ end;
+process_args(["--il", Dir|Args], State) ->
+ case (catch file:read_file_info(Dir)) of
+ {ok, #file_info{type = directory}} ->
+ IlPath = [Dir | State#state.include_lib_dirs],
+ process_args(Args, State#state{include_lib_dirs = IlPath});
+ {ok, #file_info{type = BadType}} ->
+ e(lists:flatten(io_lib:format("Not a directory: ~p (~w)", [Dir, BadType])));
+ _ ->
+ e(lists:flatten(io_lib:format("Bad directory: ~p", [Dir])))
+ end;
+process_args(["--db", DB0|Args], State) ->
+ DB = list_to_atom(DB0),
+ case lists:member(DB, [volatile,persistent,mnesia]) of
+ true ->
+ process_args(Args, State#state{db = DB});
+ false ->
+ e(lists:flatten(io_lib:format("Invalid db: ~s", [DB0])))
+ end;
+process_args(["--dep"|Args], State) ->
+ process_args(Args, State#state{deprecated = true});
+process_args(["--sgc"|Args], State) ->
+ process_args(Args, State#state{group_check = false});
+process_args(["--desc"|Args], State) ->
+ process_args(Args, State#state{description = true});
+process_args(["--ref"|Args], State) ->
+ process_args(Args, State#state{reference = true});
+process_args(["--imp"|Args], State) ->
+ process_args(Args, State#state{imports = true});
+process_args(["--mi"|Args], State) ->
+ process_args(Args, State#state{module_identity = true});
+process_args(["--mod", Module0|Args], #state{module = M} = State)
+ when (M =:= undefined) ->
+ Module = list_to_atom(Module0),
+ process_args(Args, State#state{module = Module});
+process_args(["--mod"|_Args], #state{module = M})
+ when (M =/= undefined) ->
+ e(lists:flatten(io_lib:format("Module already set to ~w", [M])));
+process_args(["--nd"|Args], State) ->
+ process_args(Args, State#state{no_defaults = true});
+process_args(["--rrnac"|Args], State) ->
+ process_args(Args, State#state{relaxed_row_name_assigne_check = true});
+process_args([Arg|Args], _State) when Args =/= [] ->
+ e(lists:flatten(io_lib:format("Unknown option: ~s", [Arg]))).
usage(ReasonStr) ->
io:format("ERROR: ~s~n", [ReasonStr]),
@@ -93,10 +251,12 @@ usage() ->
"~n verbosity = trace | debug | log | info | silence"
"~n Defaults to silence."
"~n --warnings - Print warning messages."
+ "~n --o <output dir> - The output dir."
+ "~n Defaults to current working dir."
"~n --i <include dir> - Add this dir to the list of dirs that will be"
"~n searched for imported (compiled) MIB files."
"~n The current workin dir will always be included. "
- "~n --il <include_dir dir> - Add this dir to the list of dirs that will be"
+ "~n --il <include_lib dir> - Add this dir to the list of dirs that will be"
"~n searched for imported (compiled) MIB files."
"~n It assumes that the first element in the dir name"
"~n correspond to an OTP application. For example snmp/mibs/"
@@ -104,22 +264,37 @@ usage() ->
"~n are always listed last the includ path. "
"~n --db <DB> - Database to used for the default instrumentation."
"~n Defaults to volatile."
- "~n --deprecated - Keep deprecated definition(s)."
+ "~n --sgc - This option (skip group check), if present, disables "
+ "~n the \"group check\" of the mib compiler. "
+ "~n That is, should the OBJECT-GROUP and the NOTIFICATION-GROUP "
+ "~n macro(s) be checked for correctness or not. "
+ "~n By default the check is done. "
+ "~n --dep - Keep deprecated definition(s)."
"~n If not specified the compiler will ignore"
"~n deprecated definitions."
- "~n --description - The DESCRIPTION field will be included."
- "~n --reference - The REFERENCE field will be included."
- "~n --imports - The IMPORTS field will be included."
- "~n --module_id - The MODULE-IDENTITY field will be included."
- "~n --module <module> - The module which implements all the instrumentation"
+ "~n --desc - The DESCRIPTION field will be included."
+ "~n --ref - The REFERENCE field will be included."
+ "~n --imp - The IMPORTS field will be included."
+ "~n --mi - The MODULE-IDENTITY field will be included."
+ "~n --mc - The MODULE-COMPLIANCE field will be included."
+ "~n --ac - The AGENT-CAPABILITIES field will be included."
+ "~n --mod <module> - The module which implements all the instrumentation"
"~n functions. "
"~n The name of the of all instrumentation functions"
"~n must be the same as the corresponding managed object"
"~n it implements."
- "~n --no_defs - The default instrumentation functions will *not* be used"
+ "~n --nd - The default instrumentation functions will *not* be used"
"~n if a managed object have no instrumentation function. "
"~n Instead this will be reported as an error, and the "
"~n compilation aborts. "
+ "~n --rrnac - This option, if present, specifies that the row name "
+ "~n assign check shall not be done strictly according to"
+ "~n the SMI (which allows only the value 1). "
+ "~n With this option, all values gŕeater than zero is allowed"
+ "~n (>= 1). This means that the error will be converted to "
+ "~n a warning. "
+ "~n By default it is not included, but if this option is "
+ "~n is present it will be. "
"~n "
"~n", []),
halt(1).
@@ -127,3 +302,4 @@ usage() ->
e(Reason) ->
throw({error, Reason}).
+