[Nut-upsdev] [PATCH 08/36] try to fix this a bit, but ultimately deprecate it entirely

Greg A. Woods woods at planix.com
Thu Mar 8 23:21:19 UTC 2012


From: "Greg A. Woods" <woods at planix.com>

This script is an abomination, and should not be necessary.  I have
temporarily re-implemented it in C as an option to the snmp-ups driver
itself.  Eventually nut-scanner should link directly with the *-mib.c
modules instead.
---
 tools/nut-snmpinfo.py |   70 +++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 59 insertions(+), 11 deletions(-)

diff --git a/tools/nut-snmpinfo.py b/tools/nut-snmpinfo.py
index 89cc359..8b26ed1 100755
--- a/tools/nut-snmpinfo.py
+++ b/tools/nut-snmpinfo.py
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+#
 #   Copyright (C) 2011 - Frederic Bohe <fredericbohe at eaton.com>
 #
 #   This program is free software; you can redistribute it and/or modify
@@ -15,24 +16,58 @@
 #   along with this program; if not, write to the Free Software
 #   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
-# This program extracts all SNMP information related to NUT snmp-ups
-# drivers.
+# NOTICE!!!
+#
+# This script has been deprecated.  It remains here only in hopes of
+# helping anyone trying to set up cross-compilation.  It is not
+# regularly tested, and it may not work!  See the comments about how
+# it could be improved.
+
+# This massive mess of trouble attempts to extract some SNMP
+# information from the MIB-defining source code modules of the NUT
+# snmp-ups driver so that it can be encoded into the nut-scanner
+# program.
 
+import sys
+import getpass
+import time
 import glob
 import re
 
 output_file_name="./nut-scanner/nutscan-snmp.h"
 output_file = open(output_file_name,'w')
 
-#expand #define constant
+# expand a #define constant, recursively
+#
+# XXX this is really gross and ugly, and should be done by cpp
+# instead!!!
+#
+# some Makefile should list each file documenting a MIB and a rule
+# should be defined therein to create a *.i file from each of those
+# files using $(CPP), like this:
+#
+#	.c.i:
+#		$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) -o $@ $<
+#
+# Then this script would merely look for the definition of the varible
+# with the type "mib2nut_info_t" in the resulting *.i files and decode
+# that as necessary
+#
+# Even better than trying to parse C struct initializers would be a
+# wee C program, or perhaps a hidden option to snmp-ups itself, that
+# would do this direct from the data defined in these mib2nut_info_t
+# variables.
+#
 def expand_define(filename,constant):
 	ret_line = ""
 	f = open(filename, 'r')
 	for line in f:
-		if constant in line and "#define" in line:
-			line_without_carriage_return  = re.sub("[\n\r]", "", line)
+		nocomment = re.sub("[ 	]*/\*.*\*/[ 	]*", "", line)
+		if constant in nocomment and "#define" in nocomment:
+			line_without_carriage_return  = re.sub("[\n\r]", "", nocomment)
 			line_with_single_blank = re.sub("[ \t]+", " ", line_without_carriage_return)
-			define_line = line_with_single_blank.split(" ");
+			define_line = line_with_single_blank.split(" ")
+			#print define_line
 			#define_line[0] = "#define"
 			#define_line[1] = const name
 			#define_line[2...] = const value (may be other const name)
@@ -44,11 +79,15 @@ def expand_define(filename,constant):
 						clean_elem = re.sub("\"", "", elem)
 						ret_line = ret_line + clean_elem
 					else:
-						ret_line = ret_line + expand_define(filename,elem);
+						#print "recursing into " + filename + " for " + elem
+						ret_line = ret_line + expand_define(filename, elem)
+	f.close()
+
 	return ret_line
 
 
 output_file.write( "/* nutscan-snmp\n" )
+output_file.write( " *\n" )
 output_file.write( " *  Copyright (C) 2011 - Frederic Bohe <fredericbohe at eaton.com>\n" )
 output_file.write( " *\n" )
 output_file.write( " *  This program is free software; you can redistribute it and/or modify\n" )
@@ -65,6 +104,10 @@ output_file.write( " *  You should have received a copy of the GNU General Publi
 output_file.write( " *  along with this program; if not, write to the Free Software\n" )
 output_file.write( " *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" )
 output_file.write( " */\n" )
+output_file.write( "/*\n" )
+output_file.write( " * WARNING!!!  This file was generated by: " + sys.argv[0] + "\n" )
+output_file.write( " * (run by: " + getpass.getuser() + " on: " + time.ctime() + ")\n" )
+output_file.write( " */\n" )
 output_file.write( "\n" )
 output_file.write( "#ifndef DEVSCAN_SNMP_H\n" )
 output_file.write( "#define DEVSCAN_SNMP_H\n" )
@@ -78,6 +121,9 @@ output_file.write( "\n" )
 output_file.write( "/* SNMP IDs device table */\n" )
 output_file.write( "static snmp_device_id_t snmp_device_table[] = {\n" )
 
+
+# Holy ugly parsing Batman!
+#
 for filename in glob.glob('../drivers/*-mib.c'):
 	list_of_line = open(filename,'r').read().split(';')
 	for line in list_of_line:
@@ -99,7 +145,9 @@ for filename in glob.glob('../drivers/*-mib.c'):
 			else:
 				source_sysoid = "NULL"
 
-			#decode source_oid
+			#print "found OID '" + source_oid + "', and sysOID '" + source_sysoid + "' in " + filename
+
+			# decode source_oid
 			line = source_oid.lstrip(" ")
 			line2 = line.split(" ")
 
@@ -109,9 +157,9 @@ for filename in glob.glob('../drivers/*-mib.c'):
 					clean_elem = re.sub("\"", "", elem)
 					oid = oid+clean_elem
 				else:
-					oid = oid + expand_define(filename,elem);
+					oid = oid + expand_define(filename, elem);
 
-			#decode source_sysoid
+			# decode source_sysoid
 			line = source_sysoid.lstrip(" ")
 			line = line.rstrip(" ")
 			line2 = line.split(" ")
@@ -122,7 +170,7 @@ for filename in glob.glob('../drivers/*-mib.c'):
 					clean_elem = re.sub("\"", "", elem)
 					sysoid = sysoid+clean_elem
 				else:
-					sysoid = sysoid + expand_define(filename,elem);
+					sysoid = sysoid + expand_define(filename, elem);
 
 			if sysoid == "":
 				sysoid = "NULL"
-- 
1.7.9.2




More information about the Nut-upsdev mailing list