Making a Mnesia Table SNMP Accessible

xiaoxiao2024-04-18  25

原文地址: [url]http://www.drxyzzy.org/mnesia-snmp/index.html[/url] [color=red]手册写的巨明白[/color] Contents Introduction Define a Mnesia Table Create the MIB File Create the .funcs File Compile the MIB for OTP Create sys.config and .conf Files Create MIB Header for Mnesia Create Data Directory for Mnesia Create Erlang Program Start OTP with Mnesia and SNMP agent Access the Table from net-snmp References Introduction We occasionally make mnesia data readable via SNMP. Here's a cookbook summary of the process. Certainly the Ericsson guide listed in the references should be consulted - this page merely gives extensive detail for a sample case. Complete directions are given for creating a sample table, configuring the MIB, relating the two, and accessing the table from a net-snmp client. Limitations of this tutorial. SNMP versions 1&2, but not 3, are used. SMIv1 is used to write the MIB. The SNMP agent listens on non-privileged port 9161, instead of 161. Code was compiled and executed using FreeBSD-5.0, OTP-R9B1, and Net-SNMP-5.0.8_1. Define a Mnesia Table For this example, use a table for several servers which handle telephone calls. Each row contains the server name, plus two counters - the number of inbound calls and the number of outbound calls. Here's an .hrl file defining the record type: serverTable.hrl. Create the MIB File This example places the monitored data in the SNMP OID tree under iso.org.dod.internet.private.enterprises. Filename must end with ".mib". We use a fictional enterprise name of "bazmatic" with enterprise number 99999. See references below if you need an official enterprise number. Server names will be read-only from SNMP. Call counters will be writable from SNMP. SAMPLE-MIB.mib. Create the .funcs File Since default mnesia functions are used, this step could probably be omitted if RowStatus were used. SAMPLE-MIB.funcs. Compile the MIB for OTP Shell command for compiling the MIB. /usr/home/xxx/otp-snmp>erl Erlang (BEAM) emulator version 5.2.3.3 [source] [hipe] [threads:0] Eshell V5.2.3.3 (abort with ^G) 1> snmp:c("SAMPLE-MIB", [{db, mnesia}]). {ok,"./SAMPLE-MIB.bin"} Result is binary file SAMPLE-MIB.bin. Create sys.config and .conf Files Continuing the previous erl session: 2> snmp:config(). Simple SNMP configuration tool (v3.0) ---------------------------------------------- Note: Non-trivial configurations still has to be done manually. IP addresses may be entered as dront.ericsson.se (UNIX only) or 123.12.13.23 1. System name (sysName standard variable) [xxx's agent]sample agent 2. Engine ID (snmpEngineID standard variable)[xxx's engine]sample engine 3. The UDP port the agent listens to. (standard 161) [4000]9161 4. IP address for the agent (only used as id when sending traps) []127.0.0.1 5. IP address for the manager (only this manager will have access to the agent, traps are sent to this one) []127.0.0.1 6. To what UDP port at the manager should traps be sent (standard 162)? [5000]9162 7. What SNMP version should be used (1,2,3,1&2,1&2&3,2&3)? [3]1&2 8. Do you want a none- minimum- or semi-secure configuration? Note that if you chose v1 or v2, you won't get any security for these requests (none, minimum, semi) [minimum] 9. Where is the configuration directory (absolute)? [/usr/home/xxx/otp-snmp] 10. Current configuration files will now be overwritten. Ok [y]/n?y ------------------------ Info: 1. SecurityName "initial" has noAuthNoPriv read access and authenticated write access to the "restricted" subtree. 2. SecurityName "all-rights" has noAuthNoPriv read/write access to the "internet" subtree. 3. Standard traps are sent to the manager. 4. Community "public" is mapped to security name "initial". 5. Community "all-rights" is mapped to security name "all-rights". The following files were written: agent.conf, community.conf, standard.conf, target_addr.conf, target_params.conf, notify.conf vacm.conf, sys.config ------------------------ ok Result is the following files: agent.conf, community.conf, context.conf, notify.conf, standard.conf, sys.config, target_addr.conf, target_params.conf, vacm.conf. Create MIB Header for Mnesia 3> snmp:mib_to_hrl("SAMPLE-MIB"). "SAMPLE-MIB.hrl" written. ok Result is file SAMPLE-MIB.hrl. Create Data Directory for Mnesia Will use non-volatile storage (disc_copies) for convenience. Designate a directory on disk where the table will be stored. mkdir /tmp/db Create Erlang Program Here is a tiny Erlang module with functions to create the table in Mnesia, get and set values in the table, and start the snmp agent. snmp_sample.erl. Start OTP with Mnesia and SNMP agent Here is the transcript of an Erlang shell session starting things up: erl -mnesia dir '"/tmp/db"' -config ./sys -name sample (sample@xyz.com)1> c(snmp_sample). {ok,snmp_sample} (sample@xyz.com)2> mnesia:create_schema([node()]). ok (sample@xyz.com)3> mnesia:start(). ok (sample@xyz.com)4> snmp_sample:create_table(). {atomic,ok} (sample@xyz.com)5> snmp_sample:set_counts("srv01",3,44). ok (sample@xyz.com)6> snmp_sample:get_counts(). [[{serverTable,"srv01",3,44}]] (sample@xyz.com)7> snmp_sample:init_snmp(). <0.140.0> (sample@xyz.com)8> snmp_mgr:g([[1,3,6,1,2,1,1,1,0]]). ok * Got PDU: v1, CommunityName = "public" Response, Request Id:112362370 (sample@xyz.com)9> snmp_mgr:gn([[1,3,6,1,4,1,99999,1]]). ok * Got PDU: v1, CommunityName = "public" Response, Request Id:38817076 [name,5,115,114,118,48,49] = "srv01" (sample@xyz.com)10> Access the Table from net-snmp Here is an example of a Bourne shell script reading and setting counter values. First, the script: # snmpops.sh # Point MIBDIRS at directory containing the MIB for this example. MIBDIRS=+/home/xxx/otp-snmp MIBS=+SAMPLE-MIB export MIBDIRS MIBS snmpwalk -Ob -Cc -v 1 -c public localhost:9161 \ .iso.org.dod.internet.private.enterprises.bazmatic snmpget -Os -v 1 -c public localhost:9161 \ .iso.org.dod.internet.private.enterprises.bazmatic.serverTable.serverEntry.callsIn.5.115.114.118.48.49 snmpset -Os -v 1 -c all-rights localhost:9161 \ .iso.org.dod.internet.private.enterprises.bazmatic.serverTable.serverEntry.callsIn.5.115.114.118.48.49 = 22 snmpget -Os -v 1 -c public localhost:9161 \ .iso.org.dod.internet.private.enterprises.bazmatic.serverTable.serverEntry.callsIn.5.115.114.118.48.49 Then, the results: SAMPLE-MIB::name.5.115.114.118.48.49 = STRING: "srv01" SAMPLE-MIB::callsIn.5.115.114.118.48.49 = INTEGER: 3 SAMPLE-MIB::callsOut.5.115.114.118.48.49 = INTEGER: 44 callsIn."srv01" = INTEGER: 3 callsIn."srv01" = INTEGER: 22 callsIn."srv01" = INTEGER: 22 References Application for Private Enterprise Number Erlang/OTP SNMP User's Guide See Chapter 6 - Implementation Example Standard Names for Versions of the SNMP Protocol revised Jul 22, 2003 - Hal Snyder & Josh Snyder
转载请注明原文地址: https://www.6miu.com/read-5015058.html

最新回复(0)