Imported Upstream version 2.6.3
This commit is contained in:
		
							parent
							
								
									45043b58d0
								
							
						
					
					
						commit
						fad6ced6f6
					
				
					 255 changed files with 11081 additions and 4629 deletions
				
			
		|  | @ -1,3 +1,4 @@ | |||
| # TODO: remove redundancies! | ||||
| 
 | ||||
| # Force build in ./ before nut-scanner, to have nutscan-{usb,snmp}.h | ||||
| # built before going into the nut-scanner sub-directory | ||||
|  | @ -29,12 +30,13 @@ nut-scanner-deps: | |||
| 	fi | ||||
| 
 | ||||
| website: | ||||
| 	@if python -c pass; then \ | ||||
| 	@if python -c "import json,simplejson,lxml"; then \ | ||||
| 		echo "Regenerating the HTML and JSON formated HCL tables."; \ | ||||
| 		$(top_srcdir)/tools/nut-hclinfo.py; \ | ||||
| 	else \ | ||||
| 		echo "----------------------------------------------------------------------"; \ | ||||
| 		echo "Warning: Python is not available."; \ | ||||
| 		echo "Warning: either Python, or a required module (json, simplejson, lxml) "; \ | ||||
| 		echo "is not available."; \ | ||||
| 		echo "Skipping the HTML and JSON formated HCL tables regeneration."; \ | ||||
| 		echo "----------------------------------------------------------------------"; \ | ||||
| 	fi | ||||
|  | @ -42,6 +44,7 @@ website: | |||
| # call the USB info script upon "make dist", and if Perl is present | ||||
| # call the SNMP info script upon "make dist", and if Python is present | ||||
| # and call both for building nut-scanner | ||||
| # also generate HCL data files | ||||
| dist-hook: | ||||
| 	@if python -c 1; then \ | ||||
| 		echo "Regenerating the SNMP helper files."; \ | ||||
|  | @ -63,4 +66,15 @@ dist-hook: | |||
| 		echo "----------------------------------------------------------------------"; \ | ||||
| 	fi | ||||
| 
 | ||||
| 	@if python -c "import json,simplejson,lxml"; then \ | ||||
| 		echo "Regenerating the HTML and JSON formated HCL tables."; \ | ||||
| 		$(distdir)/nut-hclinfo.py; \ | ||||
| 	else \ | ||||
| 		echo "----------------------------------------------------------------------"; \ | ||||
| 		echo "Warning: either Python, or a required module (json, simplejson, lxml) "; \ | ||||
| 		echo "is not available."; \ | ||||
| 		echo "Skipping the HTML and JSON formated HCL tables regeneration."; \ | ||||
| 		echo "----------------------------------------------------------------------"; \ | ||||
| 	fi | ||||
| 
 | ||||
| .PHONY: nut-scanner-deps nut-scanner-snmp-deps nut-scanner-usb-deps | ||||
|  |  | |||
|  | @ -14,6 +14,8 @@ | |||
| # PARTICULAR PURPOSE.
 | ||||
| 
 | ||||
| @SET_MAKE@ | ||||
| 
 | ||||
| # TODO: remove redundancies!
 | ||||
| VPATH = @srcdir@ | ||||
| pkgdatadir = $(datadir)/@PACKAGE@ | ||||
| pkgincludedir = $(includedir)/@PACKAGE@ | ||||
|  | @ -47,6 +49,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ | |||
| 	$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libgd.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libhal.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libltdl.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libneon.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libpowerman.m4 \
 | ||||
|  | @ -127,6 +130,7 @@ CYGPATH_W = @CYGPATH_W@ | |||
| DBLATEX = @DBLATEX@ | ||||
| DEFS = @DEFS@ | ||||
| DEPDIR = @DEPDIR@ | ||||
| DLLTOOL = @DLLTOOL@ | ||||
| DOC_BUILD_LIST = @DOC_BUILD_LIST@ | ||||
| DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@ | ||||
| DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@ | ||||
|  | @ -159,6 +163,8 @@ LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ | |||
| LIBHAL_LIBS = @LIBHAL_LIBS@ | ||||
| LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ | ||||
| LIBIPMI_LIBS = @LIBIPMI_LIBS@ | ||||
| LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ | ||||
| LIBLTDL_LIBS = @LIBLTDL_LIBS@ | ||||
| LIBNEON_CFLAGS = @LIBNEON_CFLAGS@ | ||||
| LIBNEON_LIBS = @LIBNEON_LIBS@ | ||||
| LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@ | ||||
|  | @ -179,6 +185,7 @@ LN_S = @LN_S@ | |||
| LTLIBOBJS = @LTLIBOBJS@ | ||||
| MAINT = @MAINT@ | ||||
| MAKEINFO = @MAKEINFO@ | ||||
| MANIFEST_TOOL = @MANIFEST_TOOL@ | ||||
| MKDIR_P = @MKDIR_P@ | ||||
| NETLIBS = @NETLIBS@ | ||||
| NM = @NM@ | ||||
|  | @ -210,12 +217,14 @@ SHELL = @SHELL@ | |||
| STATEPATH = @STATEPATH@ | ||||
| STRIP = @STRIP@ | ||||
| SUN_LIBUSB = @SUN_LIBUSB@ | ||||
| TREE_VERSION = @TREE_VERSION@ | ||||
| VERSION = @VERSION@ | ||||
| WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ | ||||
| abs_builddir = @abs_builddir@ | ||||
| abs_srcdir = @abs_srcdir@ | ||||
| abs_top_builddir = @abs_top_builddir@ | ||||
| abs_top_srcdir = @abs_top_srcdir@ | ||||
| ac_ct_AR = @ac_ct_AR@ | ||||
| ac_ct_CC = @ac_ct_CC@ | ||||
| ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ | ||||
| am__include = @am__include@ | ||||
|  | @ -251,7 +260,6 @@ libdir = @libdir@ | |||
| libexecdir = @libexecdir@ | ||||
| localedir = @localedir@ | ||||
| localstatedir = @localstatedir@ | ||||
| lt_ECHO = @lt_ECHO@ | ||||
| mandir = @mandir@ | ||||
| mkdir_p = @mkdir_p@ | ||||
| oldincludedir = @oldincludedir@ | ||||
|  | @ -654,12 +662,13 @@ nut-scanner-deps: | |||
| 	fi | ||||
| 
 | ||||
| website: | ||||
| 	@if python -c pass; then \
 | ||||
| 	@if python -c "import json,simplejson,lxml"; then \
 | ||||
| 		echo "Regenerating the HTML and JSON formated HCL tables."; \
 | ||||
| 		$(top_srcdir)/tools/nut-hclinfo.py; \
 | ||||
| 	else \
 | ||||
| 		echo "----------------------------------------------------------------------"; \
 | ||||
| 		echo "Warning: Python is not available."; \
 | ||||
| 		echo "Warning: either Python, or a required module (json, simplejson, lxml) "; \
 | ||||
| 		echo "is not available."; \
 | ||||
| 		echo "Skipping the HTML and JSON formated HCL tables regeneration."; \
 | ||||
| 		echo "----------------------------------------------------------------------"; \
 | ||||
| 	fi | ||||
|  | @ -667,6 +676,7 @@ website: | |||
| # call the USB info script upon "make dist", and if Perl is present
 | ||||
| # call the SNMP info script upon "make dist", and if Python is present
 | ||||
| # and call both for building nut-scanner
 | ||||
| # also generate HCL data files
 | ||||
| dist-hook: | ||||
| 	@if python -c 1; then \
 | ||||
| 		echo "Regenerating the SNMP helper files."; \
 | ||||
|  | @ -688,6 +698,17 @@ dist-hook: | |||
| 		echo "----------------------------------------------------------------------"; \
 | ||||
| 	fi | ||||
| 
 | ||||
| 	@if python -c "import json,simplejson,lxml"; then \
 | ||||
| 		echo "Regenerating the HTML and JSON formated HCL tables."; \
 | ||||
| 		$(distdir)/nut-hclinfo.py; \
 | ||||
| 	else \
 | ||||
| 		echo "----------------------------------------------------------------------"; \
 | ||||
| 		echo "Warning: either Python, or a required module (json, simplejson, lxml) "; \
 | ||||
| 		echo "is not available."; \
 | ||||
| 		echo "Skipping the HTML and JSON formated HCL tables regeneration."; \
 | ||||
| 		echo "----------------------------------------------------------------------"; \
 | ||||
| 	fi | ||||
| 
 | ||||
| .PHONY: nut-scanner-deps nut-scanner-snmp-deps nut-scanner-usb-deps | ||||
| 
 | ||||
| # Tell versions [3.59,3.63) of GNU make to not export all variables.
 | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ except ImportError: | |||
|    | ||||
| import re | ||||
| import sys | ||||
| import os, errno | ||||
| 
 | ||||
| # HCL file location and name | ||||
| rawHCL="../data/driver.list"; | ||||
|  | @ -238,13 +239,21 @@ def buildHTMLTable(deviceData): | |||
|              | ||||
|     table.append(tbody) | ||||
|      | ||||
|      | ||||
|     return etree.tostring(table, pretty_print=True) | ||||
|      | ||||
| 
 | ||||
| # main program | ||||
| deviceData = buildData(rawHCL) | ||||
| 
 | ||||
| # Dump device data as JSON | ||||
| jsonData = "var UPSData = %s" % json.dumps(deviceData, encoding="utf-8") | ||||
| 
 | ||||
| # First, check if target directory exists (which is not the case for 'dist') | ||||
| dir = os.path.dirname(webJsonHCL) | ||||
| try: | ||||
|     os.makedirs(dir) | ||||
| except OSError: | ||||
|     pass | ||||
| 
 | ||||
| try: | ||||
|     file = open(webJsonHCL, "w") | ||||
|     file.write(jsonData) | ||||
|  |  | |||
|  | @ -3,14 +3,18 @@ BUILT_SOURCES = nutscan-usb.h nutscan-snmp.h | |||
| nutscan-usb.h nutscan-snmp.h: | ||||
| 	cd ..; $(MAKE) $(AM_MAKEFLAGS) nut-scanner-deps | ||||
| 
 | ||||
| lib_LTLIBRARIES = libnutscan.la | ||||
| # Only build nut-scanner, and its library, if libltdl was found (required!) | ||||
| if WITH_LIBLTDL | ||||
|  bin_PROGRAMS = nut-scanner | ||||
|  lib_LTLIBRARIES = libnutscan.la | ||||
| endif | ||||
| libnutscan_la_SOURCES = scan_nut.c scan_ipmi.c \ | ||||
| 	nutscan-device.c nutscan-ip.c nutscan-display.c | ||||
| libnutscan_la_LIBADD = ../../clients/libupsclient.la $(NETLIBS) | ||||
| 	nutscan-device.c nutscan-ip.c nutscan-display.c nutscan-init.c \ | ||||
| 	scan_usb.c scan_snmp.c scan_xml_http.c scan_avahi.c | ||||
| libnutscan_la_LIBADD = ../../clients/libupsclient.la $(NETLIBS) $(LIBLTDL_LIBS) | ||||
| libnutscan_la_LDFLAGS = -version-info 1:0:0 | ||||
| libnutscan_la_CFLAGS = -I$(top_srcdir)/clients -I$(top_srcdir)/include | ||||
| libnutscan_la_CFLAGS = -I$(top_srcdir)/clients -I$(top_srcdir)/include $(LIBLTDL_CFLAGS) | ||||
| 
 | ||||
| bin_PROGRAMS = nut-scanner | ||||
| nut_scanner_SOURCES = nut-scanner.c | ||||
| nut_scanner_CFLAGS = -I$(top_srcdir)/clients -I$(top_srcdir)/include | ||||
| nut_scanner_LDADD = libnutscan.la | ||||
|  | @ -20,27 +24,28 @@ if WITH_SSL | |||
|   libnutscan_la_LIBADD += $(LIBSSL_LIBS) | ||||
| endif | ||||
| if WITH_USB | ||||
|   libnutscan_la_SOURCES += scan_usb.c | ||||
|   libnutscan_la_CFLAGS += $(LIBUSB_CFLAGS) | ||||
|   libnutscan_la_LIBADD += $(LIBUSB_LIBS) | ||||
| endif | ||||
| if WITH_SNMP | ||||
|   libnutscan_la_SOURCES += scan_snmp.c | ||||
|   libnutscan_la_CFLAGS += $(LIBNETSNMP_CFLAGS) | ||||
|   libnutscan_la_LIBADD += $(LIBNETSNMP_LIBS) | ||||
| endif | ||||
| if WITH_NEONXML | ||||
|   libnutscan_la_SOURCES += scan_xml_http.c | ||||
| if WITH_NEON | ||||
|   libnutscan_la_CFLAGS += $(LIBNEON_CFLAGS) | ||||
|   libnutscan_la_LIBADD += $(LIBNEON_LIBS) | ||||
| endif | ||||
| if WITH_AVAHI | ||||
|   libnutscan_la_SOURCES += scan_avahi.c | ||||
|   libnutscan_la_CFLAGS += $(LIBAVAHI_CFLAGS) | ||||
|   libnutscan_la_LIBADD += $(LIBAVAHI_LIBS) | ||||
| endif | ||||
| if WITH_IPMI | ||||
|   libnutscan_la_CFLAGS += $(LIBIPMI_CFLAGS) | ||||
| endif | ||||
| 
 | ||||
| dist_noinst_HEADERS = nut-scan.h nutscan-usb.h nutscan-snmp.h nutscan-device.h nutscan-ip.h  | ||||
| dist_noinst_HEADERS = nutscan-usb.h nutscan-snmp.h | ||||
| 
 | ||||
| if WITH_DEV | ||||
|  include_HEADERS = nut-scan.h nutscan-device.h nutscan-ip.h nutscan-init.h | ||||
| else | ||||
|  dist_noinst_HEADERS += nut-scan.h nutscan-device.h nutscan-ip.h nutscan-init.h | ||||
| endif | ||||
| 
 | ||||
| CLEANFILES = nutscan-usb.h nutscan-snmp.h | ||||
| 
 | ||||
|  |  | |||
|  | @ -37,23 +37,18 @@ POST_UNINSTALL = : | |||
| build_triplet = @build@ | ||||
| host_triplet = @host@ | ||||
| target_triplet = @target@ | ||||
| bin_PROGRAMS = nut-scanner$(EXEEXT) | ||||
| @WITH_LIBLTDL_TRUE@bin_PROGRAMS = nut-scanner$(EXEEXT) | ||||
| @WITH_SSL_TRUE@am__append_1 = $(LIBSSL_CFLAGS) | ||||
| @WITH_SSL_TRUE@am__append_2 = $(LIBSSL_LIBS) | ||||
| @WITH_USB_TRUE@am__append_3 = scan_usb.c | ||||
| @WITH_USB_TRUE@am__append_4 = $(LIBUSB_CFLAGS) | ||||
| @WITH_USB_TRUE@am__append_5 = $(LIBUSB_LIBS) | ||||
| @WITH_SNMP_TRUE@am__append_6 = scan_snmp.c | ||||
| @WITH_SNMP_TRUE@am__append_7 = $(LIBNETSNMP_CFLAGS) | ||||
| @WITH_SNMP_TRUE@am__append_8 = $(LIBNETSNMP_LIBS) | ||||
| @WITH_NEONXML_TRUE@am__append_9 = scan_xml_http.c | ||||
| @WITH_NEONXML_TRUE@am__append_10 = $(LIBNEON_CFLAGS) | ||||
| @WITH_NEONXML_TRUE@am__append_11 = $(LIBNEON_LIBS) | ||||
| @WITH_AVAHI_TRUE@am__append_12 = scan_avahi.c | ||||
| @WITH_AVAHI_TRUE@am__append_13 = $(LIBAVAHI_CFLAGS) | ||||
| @WITH_AVAHI_TRUE@am__append_14 = $(LIBAVAHI_LIBS) | ||||
| @WITH_USB_TRUE@am__append_3 = $(LIBUSB_CFLAGS) | ||||
| @WITH_SNMP_TRUE@am__append_4 = $(LIBNETSNMP_CFLAGS) | ||||
| @WITH_NEON_TRUE@am__append_5 = $(LIBNEON_CFLAGS) | ||||
| @WITH_AVAHI_TRUE@am__append_6 = $(LIBAVAHI_CFLAGS) | ||||
| @WITH_IPMI_TRUE@am__append_7 = $(LIBIPMI_CFLAGS) | ||||
| @WITH_DEV_FALSE@am__append_8 = nut-scan.h nutscan-device.h nutscan-ip.h nutscan-init.h | ||||
| subdir = tools/nut-scanner | ||||
| DIST_COMMON = $(dist_noinst_HEADERS) $(srcdir)/Makefile.am \
 | ||||
| DIST_COMMON = README $(am__dist_noinst_HEADERS_DIST) \
 | ||||
| 	$(am__include_HEADERS_DIST) $(srcdir)/Makefile.am \
 | ||||
| 	$(srcdir)/Makefile.in | ||||
| ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 | ||||
| am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \
 | ||||
|  | @ -66,6 +61,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ | |||
| 	$(top_srcdir)/m4/nut_check_libfreeipmi.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libgd.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libhal.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libltdl.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libneon.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libnetsnmp.m4 \
 | ||||
| 	$(top_srcdir)/m4/nut_check_libpowerman.m4 \
 | ||||
|  | @ -104,34 +100,25 @@ am__nobase_list = $(am__nobase_strip_setup); \ | |||
| am__base_list = \
 | ||||
|   sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
 | ||||
|   sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | ||||
| am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" | ||||
| am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
 | ||||
| 	"$(DESTDIR)$(includedir)" | ||||
| LTLIBRARIES = $(lib_LTLIBRARIES) | ||||
| am__DEPENDENCIES_1 = | ||||
| @WITH_SSL_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) | ||||
| @WITH_USB_TRUE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) | ||||
| @WITH_SNMP_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1) | ||||
| @WITH_NEONXML_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) | ||||
| @WITH_AVAHI_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_1) | ||||
| libnutscan_la_DEPENDENCIES = ../../clients/libupsclient.la \
 | ||||
| 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \
 | ||||
| 	$(am__DEPENDENCIES_3) $(am__DEPENDENCIES_4) \
 | ||||
| 	$(am__DEPENDENCIES_5) $(am__DEPENDENCIES_6) | ||||
| am__libnutscan_la_SOURCES_DIST = scan_nut.c scan_ipmi.c \
 | ||||
| 	nutscan-device.c nutscan-ip.c nutscan-display.c scan_usb.c \
 | ||||
| 	scan_snmp.c scan_xml_http.c scan_avahi.c | ||||
| @WITH_USB_TRUE@am__objects_1 = libnutscan_la-scan_usb.lo | ||||
| @WITH_SNMP_TRUE@am__objects_2 = libnutscan_la-scan_snmp.lo | ||||
| @WITH_NEONXML_TRUE@am__objects_3 = libnutscan_la-scan_xml_http.lo | ||||
| @WITH_AVAHI_TRUE@am__objects_4 = libnutscan_la-scan_avahi.lo | ||||
| 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 | ||||
| 	$(am__DEPENDENCIES_2) | ||||
| am_libnutscan_la_OBJECTS = libnutscan_la-scan_nut.lo \
 | ||||
| 	libnutscan_la-scan_ipmi.lo libnutscan_la-nutscan-device.lo \
 | ||||
| 	libnutscan_la-nutscan-ip.lo libnutscan_la-nutscan-display.lo \
 | ||||
| 	$(am__objects_1) $(am__objects_2) $(am__objects_3) \
 | ||||
| 	$(am__objects_4) | ||||
| 	libnutscan_la-nutscan-init.lo libnutscan_la-scan_usb.lo \
 | ||||
| 	libnutscan_la-scan_snmp.lo libnutscan_la-scan_xml_http.lo \
 | ||||
| 	libnutscan_la-scan_avahi.lo | ||||
| libnutscan_la_OBJECTS = $(am_libnutscan_la_OBJECTS) | ||||
| libnutscan_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 | ||||
| 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libnutscan_la_CFLAGS) \
 | ||||
| 	$(CFLAGS) $(libnutscan_la_LDFLAGS) $(LDFLAGS) -o $@ | ||||
| @WITH_LIBLTDL_TRUE@am_libnutscan_la_rpath = -rpath $(libdir) | ||||
| PROGRAMS = $(bin_PROGRAMS) | ||||
| am_nut_scanner_OBJECTS = nut_scanner-nut-scanner.$(OBJEXT) | ||||
| nut_scanner_OBJECTS = $(am_nut_scanner_OBJECTS) | ||||
|  | @ -153,9 +140,12 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ | |||
| 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 | ||||
| 	$(LDFLAGS) -o $@ | ||||
| SOURCES = $(libnutscan_la_SOURCES) $(nut_scanner_SOURCES) | ||||
| DIST_SOURCES = $(am__libnutscan_la_SOURCES_DIST) \
 | ||||
| 	$(nut_scanner_SOURCES) | ||||
| HEADERS = $(dist_noinst_HEADERS) | ||||
| DIST_SOURCES = $(libnutscan_la_SOURCES) $(nut_scanner_SOURCES) | ||||
| am__dist_noinst_HEADERS_DIST = nutscan-usb.h nutscan-snmp.h nut-scan.h \
 | ||||
| 	nutscan-device.h nutscan-ip.h nutscan-init.h | ||||
| am__include_HEADERS_DIST = nut-scan.h nutscan-device.h nutscan-ip.h \
 | ||||
| 	nutscan-init.h | ||||
| HEADERS = $(dist_noinst_HEADERS) $(include_HEADERS) | ||||
| ETAGS = etags | ||||
| CTAGS = ctags | ||||
| DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) | ||||
|  | @ -179,6 +169,7 @@ CYGPATH_W = @CYGPATH_W@ | |||
| DBLATEX = @DBLATEX@ | ||||
| DEFS = @DEFS@ | ||||
| DEPDIR = @DEPDIR@ | ||||
| DLLTOOL = @DLLTOOL@ | ||||
| DOC_BUILD_LIST = @DOC_BUILD_LIST@ | ||||
| DRIVER_BUILD_LIST = @DRIVER_BUILD_LIST@ | ||||
| DRIVER_INSTALL_TARGET = @DRIVER_INSTALL_TARGET@ | ||||
|  | @ -211,6 +202,8 @@ LIBHAL_CFLAGS = @LIBHAL_CFLAGS@ | |||
| LIBHAL_LIBS = @LIBHAL_LIBS@ | ||||
| LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ | ||||
| LIBIPMI_LIBS = @LIBIPMI_LIBS@ | ||||
| LIBLTDL_CFLAGS = @LIBLTDL_CFLAGS@ | ||||
| LIBLTDL_LIBS = @LIBLTDL_LIBS@ | ||||
| LIBNEON_CFLAGS = @LIBNEON_CFLAGS@ | ||||
| LIBNEON_LIBS = @LIBNEON_LIBS@ | ||||
| LIBNETSNMP_CFLAGS = @LIBNETSNMP_CFLAGS@ | ||||
|  | @ -231,6 +224,7 @@ LN_S = @LN_S@ | |||
| LTLIBOBJS = @LTLIBOBJS@ | ||||
| MAINT = @MAINT@ | ||||
| MAKEINFO = @MAKEINFO@ | ||||
| MANIFEST_TOOL = @MANIFEST_TOOL@ | ||||
| MKDIR_P = @MKDIR_P@ | ||||
| NETLIBS = @NETLIBS@ | ||||
| NM = @NM@ | ||||
|  | @ -262,12 +256,14 @@ SHELL = @SHELL@ | |||
| STATEPATH = @STATEPATH@ | ||||
| STRIP = @STRIP@ | ||||
| SUN_LIBUSB = @SUN_LIBUSB@ | ||||
| TREE_VERSION = @TREE_VERSION@ | ||||
| VERSION = @VERSION@ | ||||
| WORDS_BIGENDIAN = @WORDS_BIGENDIAN@ | ||||
| abs_builddir = @abs_builddir@ | ||||
| abs_srcdir = @abs_srcdir@ | ||||
| abs_top_builddir = @abs_top_builddir@ | ||||
| abs_top_srcdir = @abs_top_srcdir@ | ||||
| ac_ct_AR = @ac_ct_AR@ | ||||
| ac_ct_CC = @ac_ct_CC@ | ||||
| ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ | ||||
| am__include = @am__include@ | ||||
|  | @ -303,7 +299,6 @@ libdir = @libdir@ | |||
| libexecdir = @libexecdir@ | ||||
| localedir = @localedir@ | ||||
| localstatedir = @localstatedir@ | ||||
| lt_ECHO = @lt_ECHO@ | ||||
| mandir = @mandir@ | ||||
| mkdir_p = @mkdir_p@ | ||||
| oldincludedir = @oldincludedir@ | ||||
|  | @ -328,21 +323,23 @@ top_builddir = @top_builddir@ | |||
| top_srcdir = @top_srcdir@ | ||||
| udevdir = @udevdir@ | ||||
| BUILT_SOURCES = nutscan-usb.h nutscan-snmp.h | ||||
| lib_LTLIBRARIES = libnutscan.la | ||||
| libnutscan_la_SOURCES = scan_nut.c scan_ipmi.c nutscan-device.c \
 | ||||
| 	nutscan-ip.c nutscan-display.c $(am__append_3) $(am__append_6) \
 | ||||
| 	$(am__append_9) $(am__append_12) | ||||
| @WITH_LIBLTDL_TRUE@lib_LTLIBRARIES = libnutscan.la | ||||
| libnutscan_la_SOURCES = scan_nut.c scan_ipmi.c \
 | ||||
| 	nutscan-device.c nutscan-ip.c nutscan-display.c nutscan-init.c \
 | ||||
| 	scan_usb.c scan_snmp.c scan_xml_http.c scan_avahi.c | ||||
| 
 | ||||
| libnutscan_la_LIBADD = ../../clients/libupsclient.la $(NETLIBS) \
 | ||||
| 	$(am__append_2) $(am__append_5) $(am__append_8) \
 | ||||
| 	$(am__append_11) $(am__append_14) | ||||
| 	$(LIBLTDL_LIBS) $(am__append_2) | ||||
| libnutscan_la_LDFLAGS = -version-info 1:0:0 | ||||
| libnutscan_la_CFLAGS = -I$(top_srcdir)/clients -I$(top_srcdir)/include \
 | ||||
| 	$(am__append_1) $(am__append_4) $(am__append_7) \
 | ||||
| 	$(am__append_10) $(am__append_13) | ||||
| 	$(LIBLTDL_CFLAGS) $(am__append_1) $(am__append_3) \
 | ||||
| 	$(am__append_4) $(am__append_5) $(am__append_6) \
 | ||||
| 	$(am__append_7) | ||||
| nut_scanner_SOURCES = nut-scanner.c | ||||
| nut_scanner_CFLAGS = -I$(top_srcdir)/clients -I$(top_srcdir)/include | ||||
| nut_scanner_LDADD = libnutscan.la | ||||
| dist_noinst_HEADERS = nut-scan.h nutscan-usb.h nutscan-snmp.h nutscan-device.h nutscan-ip.h  | ||||
| dist_noinst_HEADERS = nutscan-usb.h nutscan-snmp.h $(am__append_8) | ||||
| @WITH_DEV_TRUE@include_HEADERS = nut-scan.h nutscan-device.h nutscan-ip.h nutscan-init.h | ||||
| CLEANFILES = nutscan-usb.h nutscan-snmp.h | ||||
| all: $(BUILT_SOURCES) | ||||
| 	$(MAKE) $(AM_MAKEFLAGS) all-am | ||||
|  | @ -411,7 +408,7 @@ clean-libLTLIBRARIES: | |||
| 	  rm -f "$${dir}/so_locations"; \
 | ||||
| 	done | ||||
| libnutscan.la: $(libnutscan_la_OBJECTS) $(libnutscan_la_DEPENDENCIES)  | ||||
| 	$(libnutscan_la_LINK) -rpath $(libdir) $(libnutscan_la_OBJECTS) $(libnutscan_la_LIBADD) $(LIBS) | ||||
| 	$(libnutscan_la_LINK) $(am_libnutscan_la_rpath) $(libnutscan_la_OBJECTS) $(libnutscan_la_LIBADD) $(LIBS) | ||||
| install-binPROGRAMS: $(bin_PROGRAMS) | ||||
| 	@$(NORMAL_INSTALL) | ||||
| 	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" | ||||
|  | @ -467,6 +464,7 @@ distclean-compile: | |||
| 
 | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-nutscan-device.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-nutscan-display.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-nutscan-init.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-nutscan-ip.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-scan_avahi.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libnutscan_la-scan_ipmi.Plo@am__quote@ | ||||
|  | @ -532,6 +530,13 @@ libnutscan_la-nutscan-display.lo: nutscan-display.c | |||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | ||||
| @am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-display.lo `test -f 'nutscan-display.c' || echo '$(srcdir)/'`nutscan-display.c | ||||
| 
 | ||||
| libnutscan_la-nutscan-init.lo: nutscan-init.c | ||||
| @am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-nutscan-init.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-nutscan-init.Tpo -c -o libnutscan_la-nutscan-init.lo `test -f 'nutscan-init.c' || echo '$(srcdir)/'`nutscan-init.c | ||||
| @am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libnutscan_la-nutscan-init.Tpo $(DEPDIR)/libnutscan_la-nutscan-init.Plo | ||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	source='nutscan-init.c' object='libnutscan_la-nutscan-init.lo' libtool=yes @AMDEPBACKSLASH@ | ||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | ||||
| @am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -c -o libnutscan_la-nutscan-init.lo `test -f 'nutscan-init.c' || echo '$(srcdir)/'`nutscan-init.c | ||||
| 
 | ||||
| libnutscan_la-scan_usb.lo: scan_usb.c | ||||
| @am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libnutscan_la_CFLAGS) $(CFLAGS) -MT libnutscan_la-scan_usb.lo -MD -MP -MF $(DEPDIR)/libnutscan_la-scan_usb.Tpo -c -o libnutscan_la-scan_usb.lo `test -f 'scan_usb.c' || echo '$(srcdir)/'`scan_usb.c | ||||
| @am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/libnutscan_la-scan_usb.Tpo $(DEPDIR)/libnutscan_la-scan_usb.Plo | ||||
|  | @ -579,6 +584,26 @@ mostlyclean-libtool: | |||
| 
 | ||||
| clean-libtool: | ||||
| 	-rm -rf .libs _libs | ||||
| install-includeHEADERS: $(include_HEADERS) | ||||
| 	@$(NORMAL_INSTALL) | ||||
| 	test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" | ||||
| 	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
 | ||||
| 	for p in $$list; do \
 | ||||
| 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
 | ||||
| 	  echo "$$d$$p"; \
 | ||||
| 	done | $(am__base_list) | \
 | ||||
| 	while read files; do \
 | ||||
| 	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
 | ||||
| 	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
 | ||||
| 	done | ||||
| 
 | ||||
| uninstall-includeHEADERS: | ||||
| 	@$(NORMAL_UNINSTALL) | ||||
| 	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
 | ||||
| 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 | ||||
| 	test -n "$$files" || exit 0; \
 | ||||
| 	echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
 | ||||
| 	cd "$(DESTDIR)$(includedir)" && rm -f $$files | ||||
| 
 | ||||
| ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) | ||||
| 	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
 | ||||
|  | @ -669,7 +694,7 @@ all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) | |||
| install-binPROGRAMS: install-libLTLIBRARIES | ||||
| 
 | ||||
| installdirs: | ||||
| 	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)"; do \
 | ||||
| 	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \
 | ||||
| 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 | ||||
| 	done | ||||
| install: $(BUILT_SOURCES) | ||||
|  | @ -723,7 +748,7 @@ info: info-am | |||
| 
 | ||||
| info-am: | ||||
| 
 | ||||
| install-data-am: | ||||
| install-data-am: install-includeHEADERS | ||||
| 
 | ||||
| install-dvi: install-dvi-am | ||||
| 
 | ||||
|  | @ -769,7 +794,8 @@ ps: ps-am | |||
| 
 | ||||
| ps-am: | ||||
| 
 | ||||
| uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES | ||||
| uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ | ||||
| 	uninstall-libLTLIBRARIES | ||||
| 
 | ||||
| .MAKE: all check install install-am install-strip | ||||
| 
 | ||||
|  | @ -780,13 +806,14 @@ uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES | |||
| 	html-am info info-am install install-am install-binPROGRAMS \
 | ||||
| 	install-data install-data-am install-dvi install-dvi-am \
 | ||||
| 	install-exec install-exec-am install-html install-html-am \
 | ||||
| 	install-info install-info-am install-libLTLIBRARIES \
 | ||||
| 	install-man install-pdf install-pdf-am install-ps \
 | ||||
| 	install-ps-am install-strip installcheck installcheck-am \
 | ||||
| 	installdirs maintainer-clean maintainer-clean-generic \
 | ||||
| 	mostlyclean mostlyclean-compile mostlyclean-generic \
 | ||||
| 	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
 | ||||
| 	uninstall-am uninstall-binPROGRAMS uninstall-libLTLIBRARIES | ||||
| 	install-includeHEADERS install-info install-info-am \
 | ||||
| 	install-libLTLIBRARIES install-man install-pdf install-pdf-am \
 | ||||
| 	install-ps install-ps-am install-strip installcheck \
 | ||||
| 	installcheck-am installdirs maintainer-clean \
 | ||||
| 	maintainer-clean-generic mostlyclean mostlyclean-compile \
 | ||||
| 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
 | ||||
| 	tags uninstall uninstall-am uninstall-binPROGRAMS \
 | ||||
| 	uninstall-includeHEADERS uninstall-libLTLIBRARIES | ||||
| 
 | ||||
| 
 | ||||
| nutscan-usb.h nutscan-snmp.h: | ||||
|  |  | |||
							
								
								
									
										114
									
								
								tools/nut-scanner/README
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								tools/nut-scanner/README
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,114 @@ | |||
| NUT device discovery | ||||
| ==================== | ||||
| 
 | ||||
| Introduction | ||||
| ------------ | ||||
| 
 | ||||
| linkman:nut-scanner[8] is available to discover supported NUT devices | ||||
| (USB, SNMP, Eaton XML/HTTP and IPMI) and NUT servers (using Avahi or the | ||||
| classic connection method). | ||||
| 
 | ||||
| This tool actually use a library, called *libnutscan*, to perform actual | ||||
| processing. | ||||
| 
 | ||||
| 
 | ||||
| Client access library | ||||
| ~~~~~~~~~~~~~~~~~~~~~ | ||||
| 
 | ||||
| The nutscan library can be linked into other programs to give access | ||||
| to NUT discovery. Both static and shared versions are provided. | ||||
| 
 | ||||
| linkman:nut-scanner[8] is provided as an example of how to use the nutscan | ||||
| functions. | ||||
| 
 | ||||
| Here is a simple example that scans for USB devices, and use its own | ||||
| iteration function to display results: | ||||
| 
 | ||||
| 	#include <stdlib.h> | ||||
| 	#include <unistd.h> | ||||
| 	#include <string.h> | ||||
| 
 | ||||
| 	/* Only enable USB scan */ | ||||
| 	#define HAVE_USB_H | ||||
| 
 | ||||
| 	#include "nut-scan.h" | ||||
| 
 | ||||
| 	int main() | ||||
| 	{ | ||||
| 		nutscan_options_t * opt; | ||||
| 		nutscan_device_t *device; | ||||
| 
 | ||||
| 		if ((device = nutscan_scan_usb()) == NULL) { | ||||
| 			printf("No device found\n"); | ||||
| 			exit(EXIT_FAILURE); | ||||
| 		} | ||||
| 
 | ||||
| 		/* Rewind the list */ | ||||
| 		while(device->prev != NULL) { | ||||
| 			device = device->prev; | ||||
| 		} | ||||
| 
 | ||||
| 		/* Print results */ | ||||
| 		do { | ||||
| 			printf("USB device found\n\tdriver: \"%s\"\n\tport: \"%s\"\n", | ||||
| 				device->driver, device->port); | ||||
| 
 | ||||
| 			/* process options (serial number, bus, ...) */ | ||||
| 			opt = &(device->opt); | ||||
| 			do { | ||||
| 				if( opt->option != NULL ) { | ||||
| 					printf("\t%s",opt->option); | ||||
| 					if( opt->value != NULL ) { | ||||
| 						printf(": \"%s\"", opt->value); | ||||
| 					} | ||||
| 					printf("\n"); | ||||
| 				} | ||||
| 				opt = opt->next; | ||||
| 			} while( opt != NULL ); | ||||
| 
 | ||||
| 			device = device->next; | ||||
| 		} | ||||
| 		while( device != NULL ); | ||||
| 
 | ||||
| 		exit(EXIT_SUCCESS); | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| This library file and the associated header files are not installed by | ||||
| default.  You must `./configure --with-lib` to enable building and | ||||
| installing these files. The libraries can then be built and installed | ||||
| with `make` and `make install` as usual. This must be done before | ||||
| building other (non-NUT) programs which depend on them. | ||||
| 
 | ||||
| For more information, refer to the linkman:nutscan[3], | ||||
| manual page and the various | ||||
| link:man/index.html#devscan[nutscan_*(3)] functions documentation | ||||
| referenced in the same file. | ||||
| 
 | ||||
| 
 | ||||
| Configuration helpers | ||||
| ~~~~~~~~~~~~~~~~~~~~~ | ||||
| 
 | ||||
| NUT provides helper scripts to ease the configuration step of your program, by | ||||
| detecting the right compilation and link flags. | ||||
| 
 | ||||
| For more information, refer to a | ||||
| <<lib-info,Appendix B: NUT libraries complementary information>>. | ||||
| 
 | ||||
| 
 | ||||
| Python | ||||
| ------ | ||||
| 
 | ||||
| Python support for NUT discovery features is not yet available. | ||||
| 
 | ||||
| 
 | ||||
| Perl | ||||
| ---- | ||||
| 
 | ||||
| Perl support for NUT discovery features is not yet available. | ||||
| 
 | ||||
| 
 | ||||
| Java | ||||
| ---- | ||||
| 
 | ||||
| Java support for NUT discovery features is not yet available. | ||||
|  | @ -19,6 +19,7 @@ | |||
| #ifndef NUT_SCAN_H | ||||
| #define NUT_SCAN_H | ||||
| 
 | ||||
| #include <nutscan-init.h> | ||||
| #include <nutscan-device.h> | ||||
| #include <nutscan-ip.h> | ||||
| 
 | ||||
|  | @ -36,29 +37,19 @@ typedef struct nutscan_snmp { | |||
| } nutscan_snmp_t; | ||||
| 
 | ||||
| /* Scanning */ | ||||
| #ifdef HAVE_NET_SNMP_NET_SNMP_CONFIG_H | ||||
| nutscan_device_t * nutscan_scan_snmp(const char * start_ip,const char * stop_ip,long usec_timeout, nutscan_snmp_t * sec); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef HAVE_USB_H | ||||
| nutscan_device_t * nutscan_scan_usb(); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef WITH_NEON | ||||
| nutscan_device_t * nutscan_scan_xml_http(long usec_timeout); | ||||
| #endif | ||||
| 
 | ||||
| nutscan_device_t * nutscan_scan_nut(const char * startIP, const char * stopIP, const char * port, long usec_timeout); | ||||
| 
 | ||||
| #ifdef HAVE_AVAHI_CLIENT_CLIENT_H | ||||
| nutscan_device_t * nutscan_scan_avahi(long usec_timeout); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef HAVE_FREEIPMI_FREEIPMI_H | ||||
| nutscan_device_t *  nutscan_scan_ipmi(void); | ||||
| #endif | ||||
| 
 | ||||
| /* Displaying */ | ||||
| /* Display functions */ | ||||
| void nutscan_display_ups_conf(nutscan_device_t * device); | ||||
| void nutscan_display_parsable(nutscan_device_t * device); | ||||
| 
 | ||||
|  |  | |||
|  | @ -21,6 +21,7 @@ | |||
| #include <stdlib.h> | ||||
| #include <stdarg.h> | ||||
| #include "common.h" | ||||
| #include "nut_version.h" | ||||
| #include <unistd.h> | ||||
| #include <string.h> | ||||
| #ifdef HAVE_PTHREAD | ||||
|  | @ -31,7 +32,9 @@ | |||
| 
 | ||||
| #define DEFAULT_TIMEOUT 5 | ||||
| 
 | ||||
| const char optstring[] = "?ht:s:e:c:l:u:W:X:w:x:p:CUSMOAm:NPqI"; | ||||
| #define ERR_BAD_OPTION	(-1) | ||||
| 
 | ||||
| const char optstring[] = "?ht:s:e:c:l:u:W:X:w:x:p:CUSMOAm:NPqIVa"; | ||||
| 
 | ||||
| #ifdef HAVE_GETOPT_LONG | ||||
| const struct option longopts[] = | ||||
|  | @ -58,13 +61,14 @@ const struct option longopts[] = | |||
| 	{ "disp_parsable",no_argument,NULL,'P' }, | ||||
| 	{ "quiet",no_argument,NULL,'q' }, | ||||
| 	{ "help",no_argument,NULL,'h' }, | ||||
| 	{ "version",no_argument,NULL,'V' }, | ||||
| 	{ "available",no_argument,NULL,'a' }, | ||||
| 	{NULL,0,NULL,0}}; | ||||
| #else | ||||
| #define getopt_long(a,b,c,d,e)	getopt(a,b,c)  | ||||
| #endif /* HAVE_GETOPT_LONG */ | ||||
| 
 | ||||
| static nutscan_device_t *dev[TYPE_END]; | ||||
| static pthread_t thread[TYPE_END]; | ||||
| 
 | ||||
| static long timeout = DEFAULT_TIMEOUT*1000*1000; /* in usec */ | ||||
| static char *	start_ip = NULL; | ||||
|  | @ -72,14 +76,13 @@ static char *	end_ip = NULL; | |||
| static char * port = NULL; | ||||
| 
 | ||||
| #ifdef HAVE_PTHREAD | ||||
| #ifdef HAVE_USB_H | ||||
| static pthread_t thread[TYPE_END]; | ||||
| 
 | ||||
| static void * run_usb(void * arg) | ||||
| { | ||||
| 	dev[TYPE_USB] = nutscan_scan_usb(); | ||||
| 	return NULL; | ||||
| } | ||||
| #endif | ||||
| #ifdef HAVE_NET_SNMP_NET_SNMP_CONFIG_H | ||||
| static void * run_snmp(void * arg) | ||||
| { | ||||
| 	nutscan_snmp_t * sec = (nutscan_snmp_t *)arg; | ||||
|  | @ -87,14 +90,11 @@ static void * run_snmp(void * arg) | |||
| 	dev[TYPE_SNMP] = nutscan_scan_snmp(start_ip,end_ip,timeout,sec); | ||||
| 	return NULL; | ||||
| } | ||||
| #endif | ||||
| #ifdef WITH_NEON | ||||
| static void * run_xml(void * arg) | ||||
| { | ||||
| 	dev[TYPE_XML] = nutscan_scan_xml_http(timeout); | ||||
| 	return NULL; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static void * run_nut_old(void * arg) | ||||
| { | ||||
|  | @ -102,20 +102,16 @@ static void * run_nut_old(void * arg) | |||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| #ifdef HAVE_AVAHI_CLIENT_CLIENT_H | ||||
| static void * run_avahi(void * arg) | ||||
| { | ||||
| 	dev[TYPE_AVAHI] = nutscan_scan_avahi(timeout); | ||||
| 	return NULL; | ||||
| } | ||||
| #endif | ||||
| #ifdef HAVE_FREEIPMI_FREEIPMI_H | ||||
| static void * run_ipmi(void * arg) | ||||
| { | ||||
| 	dev[TYPE_IPMI] = nutscan_scan_ipmi(); | ||||
| 	return NULL; | ||||
| } | ||||
| #endif | ||||
| #endif /* HAVE_PTHREAD */ | ||||
| static int printq(int quiet,const char *fmt, ...) | ||||
| { | ||||
|  | @ -147,9 +143,12 @@ int main(int argc, char *argv[]) | |||
| 	int allow_ipmi = 0; | ||||
| 	int quiet = 0; | ||||
| 	void (*display_func)(nutscan_device_t * device); | ||||
| 	int ret_code = EXIT_SUCCESS; | ||||
| 
 | ||||
| 	memset(&sec,0,sizeof(sec)); | ||||
| 
 | ||||
| 	nutscan_init(); | ||||
| 
 | ||||
| 	display_func = nutscan_display_ups_conf; | ||||
| 
 | ||||
| 	while((opt_ret = getopt_long(argc, argv, optstring, longopts, NULL))!=-1) { | ||||
|  | @ -172,63 +171,87 @@ int main(int argc, char *argv[]) | |||
| 			case 'm': | ||||
| 				cidr = strdup(optarg); | ||||
| 				break; | ||||
| #ifdef HAVE_NET_SNMP_NET_SNMP_CONFIG_H | ||||
| 			case 'c': | ||||
| 				if(!nutscan_avail_snmp) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				sec.community = strdup(optarg); | ||||
| 				break; | ||||
| 			case 'l': | ||||
| 				if(!nutscan_avail_snmp) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				sec.secLevel = strdup(optarg); | ||||
| 				break; | ||||
| 			case 'u': | ||||
| 				if(!nutscan_avail_snmp) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				sec.secName = strdup(optarg); | ||||
| 				break; | ||||
| 			case 'W': | ||||
| 				if(!nutscan_avail_snmp) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				sec.authPassword = strdup(optarg); | ||||
| 				break; | ||||
| 			case 'X': | ||||
| 				if(!nutscan_avail_snmp) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				sec.privPassword = strdup(optarg); | ||||
| 				break; | ||||
| 			case 'w': | ||||
| 				if(!nutscan_avail_snmp) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				sec.authProtocol = strdup(optarg); | ||||
| 				break; | ||||
| 			case 'x': | ||||
| 				if(!nutscan_avail_snmp) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				sec.privProtocol = strdup(optarg); | ||||
| 				break; | ||||
| #endif | ||||
| 			case 'S': | ||||
| 				if(!nutscan_avail_snmp) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				allow_snmp = 1; | ||||
| 				break; | ||||
| 			case 'p': | ||||
| 				port = strdup(optarg); | ||||
| 				break; | ||||
| 			case 'C': | ||||
| 				allow_all = 1; | ||||
| 				break; | ||||
| #ifdef HAVE_USB_H | ||||
| 			case 'U': | ||||
| 				if(!nutscan_avail_usb) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				allow_usb = 1; | ||||
| 				break; | ||||
| #endif | ||||
| #ifdef HAVE_NET_SNMP_NET_SNMP_CONFIG_H | ||||
| 			case 'S': | ||||
| 				allow_snmp = 1; | ||||
| 				break; | ||||
| #endif | ||||
| #ifdef WITH_NEON | ||||
| 			case 'M': | ||||
| 				if(!nutscan_avail_xml_http) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				allow_xml = 1; | ||||
| 				break; | ||||
| #endif | ||||
| 			case 'O': | ||||
| 				allow_oldnut = 1; | ||||
| 				break; | ||||
| #ifdef WITH_AVAHI | ||||
| 			case 'A': | ||||
| 				if(!nutscan_avail_avahi) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				allow_avahi = 1; | ||||
| 				break; | ||||
| #endif | ||||
| #ifdef HAVE_FREEIPMI_FREEIPMI_H | ||||
| 			case 'I': | ||||
| 				if(!nutscan_avail_ipmi) { | ||||
| 					goto display_help; | ||||
| 				} | ||||
| 				allow_ipmi = 1; | ||||
| 				break; | ||||
| #endif | ||||
| 			case 'N': | ||||
| 				display_func = nutscan_display_ups_conf; | ||||
| 				break; | ||||
|  | @ -238,51 +261,79 @@ int main(int argc, char *argv[]) | |||
| 			case 'q': | ||||
| 				quiet = 1; | ||||
| 				break; | ||||
| 			case 'h': | ||||
| 			case 'V': | ||||
| 				printf("Network UPS Tools - %s\n", NUT_VERSION_MACRO); | ||||
| 				exit(EXIT_SUCCESS); | ||||
| 			case 'a': | ||||
| 				printf("OLDNUT\n"); | ||||
| 				if(nutscan_avail_usb) { | ||||
| 					printf("USB\n"); | ||||
| 				} | ||||
| 				if(nutscan_avail_snmp) { | ||||
| 					printf("SNMP\n"); | ||||
| 				} | ||||
| 				if(nutscan_avail_xml_http) { | ||||
| 					printf("XML\n"); | ||||
| 				} | ||||
| 				if(nutscan_avail_avahi) { | ||||
| 					printf("AVAHI\n"); | ||||
| 				} | ||||
| 				if(nutscan_avail_ipmi) { | ||||
| 					printf("IPMI\n");	 | ||||
| 				} | ||||
| 				exit(EXIT_SUCCESS); | ||||
| 			case '?': | ||||
| 				ret_code = ERR_BAD_OPTION; | ||||
| 			case 'h': | ||||
| 			default: | ||||
| 				puts("nut-scanner : detecting available UPS.\n"); | ||||
| display_help: | ||||
| 				puts("nut-scanner : detecting available power devices.\n"); | ||||
| 				puts("OPTIONS:"); | ||||
| 				printf("  -C, --complete_scan : Scan all available devices (default).\n"); | ||||
| #ifdef HAVE_USB_H | ||||
| 				printf("  -U, --usb_scan : Scan USB devices.\n"); | ||||
| #endif | ||||
| #ifdef HAVE_NET_SNMP_NET_SNMP_CONFIG_H | ||||
| 				printf("  -S, --snmp_scan : Scan SNMP devices.\n"); | ||||
| #endif | ||||
| #ifdef WITH_NEON | ||||
| 				printf("  -M, --xml_scan : Scan XML/HTTP devices.\n"); | ||||
| #endif | ||||
| 				printf("  -O, --oldnut_scan : Scan NUT devices (old method).\n"); | ||||
| #ifdef WITH_AVAHI | ||||
| 				printf("  -A, --avahi_scan : Scan NUT devices (avahi method).\n"); | ||||
| #endif | ||||
| #ifdef HAVE_FREEIPMI_FREEIPMI_H | ||||
| 				printf("  -I, --ipmi_scan : Scan IPMI devices.\n"); | ||||
| #endif | ||||
| 				printf("  -C, --complete_scan: Scan all available devices (default).\n"); | ||||
| 				if( nutscan_avail_usb ) { | ||||
| 					printf("  -U, --usb_scan: Scan USB devices.\n"); | ||||
| 				} | ||||
| 				if( nutscan_avail_snmp ) { | ||||
| 					printf("  -S, --snmp_scan: Scan SNMP devices.\n"); | ||||
| 				} | ||||
| 				if( nutscan_avail_xml_http ) { | ||||
| 					printf("  -M, --xml_scan: Scan XML/HTTP devices.\n"); | ||||
| 				} | ||||
| 				printf("  -O, --oldnut_scan: Scan NUT devices (old method).\n"); | ||||
| 				if( nutscan_avail_avahi ) { | ||||
| 					printf("  -A, --avahi_scan: Scan NUT devices (avahi method).\n"); | ||||
| 				} | ||||
| 				if( nutscan_avail_ipmi ) { | ||||
| 					printf("  -I, --ipmi_scan: Scan IPMI devices.\n"); | ||||
| 				} | ||||
| 				printf("  -t, --timeout <timeout in seconds>: network operation timeout (default %d).\n",DEFAULT_TIMEOUT); | ||||
| 				printf("  -s, --start_ip <IP address>: First IP address to scan.\n"); | ||||
| 				printf("  -e, --end_ip <IP address>: Last IP address to scan.\n"); | ||||
| 				printf("  -m, --mask_cidr <IP address/mask>: Give a range of IP using CIDR notation.\n"); | ||||
| 
 | ||||
| #ifdef HAVE_NET_SNMP_NET_SNMP_CONFIG_H | ||||
| 				printf("\nSNMP v1 specific options:\n"); | ||||
| 				printf("  -c, --community <community name>: Set SNMP v1 community name (default = public)\n"); | ||||
| 				if( nutscan_avail_snmp ) { | ||||
| 					printf("\nSNMP v1 specific options:\n"); | ||||
| 					printf("  -c, --community <community name>: Set SNMP v1 community name (default = public)\n"); | ||||
| 
 | ||||
| 				printf("\nSNMP v3 specific options:\n"); | ||||
| 				printf("  -l, --secLevel <security level>: Set the securityLevel used for SNMPv3 messages (allowed values: noAuthNoPriv,authNoPriv,authPriv)\n"); | ||||
| 				printf("  -u, --secName <security name>: Set the securityName used for authenticated SNMPv3 messages (mandatory if you set secLevel. No default)\n"); | ||||
| 				printf("  -a, --authProtocol <authentication protocol>: Set the authentication protocol (MD5 or SHA) used for authenticated SNMPv3 messages (default=MD5)\n"); | ||||
| 				printf("  -A, --authPassword <authentication pass phrase>: Set the authentication pass phrase used for authenticated SNMPv3 messages (mandatory if you set secLevel to authNoPriv or authPriv)\n"); | ||||
| 				printf("  -x, --privProtocol <privacy protocol>: Set the privacy protocol (DES or AES) used for encrypted SNMPv3 messages (default=DES)\n"); | ||||
| 				printf("  -X, --privPassword <privacy pass phrase>: Set the privacy pass phrase used for encrypted SNMPv3 messages (mandatory if you set secLevel to authPriv)\n"); | ||||
| #endif | ||||
| 					printf("\nSNMP v3 specific options:\n"); | ||||
| 					printf("  -l, --secLevel <security level>: Set the securityLevel used for SNMPv3 messages (allowed values: noAuthNoPriv,authNoPriv,authPriv)\n"); | ||||
| 					printf("  -u, --secName <security name>: Set the securityName used for authenticated SNMPv3 messages (mandatory if you set secLevel. No default)\n"); | ||||
| 					printf("  -w, --authProtocol <authentication protocol>: Set the authentication protocol (MD5 or SHA) used for authenticated SNMPv3 messages (default=MD5)\n"); | ||||
| 					printf("  -W, --authPassword <authentication pass phrase>: Set the authentication pass phrase used for authenticated SNMPv3 messages (mandatory if you set secLevel to authNoPriv or authPriv)\n"); | ||||
| 					printf("  -x, --privProtocol <privacy protocol>: Set the privacy protocol (DES or AES) used for encrypted SNMPv3 messages (default=DES)\n"); | ||||
| 					printf("  -X, --privPassword <privacy pass phrase>: Set the privacy pass phrase used for encrypted SNMPv3 messages (mandatory if you set secLevel to authPriv)\n"); | ||||
| 				} | ||||
| 
 | ||||
| 				printf("\nNUT device specific options:\n"); | ||||
| 				printf("  -p, --port <port number>: Port number of remote NUT devices\n"); | ||||
| 				printf("\nNUT specific options:\n"); | ||||
| 				printf("  -p, --port <port number>: Port number of remote NUT upsd\n"); | ||||
| 				printf("\ndisplay specific options:\n"); | ||||
| 				printf("  -N, --disp_nut_conf : Display result in the ups.conf format\n"); | ||||
| 				printf("  -P, --disp_parsable : Display result in a parsable format\n"); | ||||
| 				return 0; | ||||
| 				printf("  -N, --disp_nut_conf: Display result in the ups.conf format\n"); | ||||
| 				printf("  -P, --disp_parsable: Display result in a parsable format\n"); | ||||
| 				printf("\nMiscellaneous options:\n"); | ||||
| 				printf("  -V, --version: Display NUT version\n"); | ||||
| 				printf("  -a, --available: Display available bus that can be scanned\n"); | ||||
| 				printf("  -q, --quiet: Display only scan result. No information on currently scanned bus is displayed.\n"); | ||||
| 				return ret_code; | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
|  | @ -296,120 +347,128 @@ int main(int argc, char *argv[]) | |||
| 		allow_all = 1; | ||||
| 	} | ||||
| 
 | ||||
| #ifdef HAVE_USB_H | ||||
| 	if( allow_all || allow_usb) { | ||||
| 	if( allow_all ) { | ||||
| 		allow_usb = 1; | ||||
| 		allow_snmp = 1; | ||||
| 		allow_xml = 1; | ||||
| 		allow_oldnut = 1; | ||||
| 		allow_avahi = 1; | ||||
| 		allow_ipmi = 1; | ||||
| 	} | ||||
| 
 | ||||
| 	if( allow_usb && nutscan_avail_usb ) { | ||||
| 		printq(quiet,"Scanning USB bus.\n"); | ||||
| #ifdef HAVE_PTHREAD | ||||
| 		pthread_create(&thread[TYPE_USB],NULL,run_usb,NULL); | ||||
| 		if(pthread_create(&thread[TYPE_USB],NULL,run_usb,NULL)) { | ||||
| 			nutscan_avail_usb = 0; | ||||
| 		} | ||||
| #else | ||||
| 		dev[TYPE_USB] = nutscan_scan_usb(); | ||||
| #endif | ||||
| #endif /* HAVE_PTHREAD */ | ||||
| 	} | ||||
| #endif /* HAVE_USB_H */ | ||||
| 
 | ||||
| #ifdef HAVE_NET_SNMP_NET_SNMP_CONFIG_H | ||||
| 	if( allow_all || allow_snmp) { | ||||
| 	if( allow_snmp && nutscan_avail_snmp ) { | ||||
| 		if( start_ip == NULL ) { | ||||
| 			printq(quiet,"No start IP, skipping SNMP\n"); | ||||
| 		} | ||||
| 		else { | ||||
| 			printq(quiet,"Scanning SNMP bus.\n"); | ||||
| #ifdef HAVE_PTHREAD | ||||
| 			pthread_create(&thread[TYPE_SNMP],NULL,run_snmp,&sec); | ||||
| 			if( pthread_create(&thread[TYPE_SNMP],NULL,run_snmp,&sec)) { | ||||
| 				nutscan_avail_snmp = 0; | ||||
| 			} | ||||
| #else | ||||
| 			dev[TYPE_SNMP] = nutscan_scan_snmp(start_ip,end_ip,timeout,&sec); | ||||
| #endif | ||||
| #endif /* HAVE_PTHREAD */ | ||||
| 		} | ||||
| 	} | ||||
| #endif /* HAVE_NET_SNMP_NET_SNMP_CONFIG_H */ | ||||
| 
 | ||||
| #ifdef WITH_NEON | ||||
| 	if( allow_all || allow_xml) { | ||||
| 	if( allow_xml && nutscan_avail_xml_http) { | ||||
| 		printq(quiet,"Scanning XML/HTTP bus.\n"); | ||||
| #ifdef HAVE_PTHREAD | ||||
| 		pthread_create(&thread[TYPE_XML],NULL,run_xml,NULL); | ||||
| 		if(pthread_create(&thread[TYPE_XML],NULL,run_xml,NULL)) { | ||||
| 			nutscan_avail_xml_http = 0; | ||||
| 		} | ||||
| #else | ||||
| 		dev[TYPE_XML] = nutscan_scan_xml_http(timeout); | ||||
| #endif | ||||
| #endif /* HAVE_PTHREAD */ | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	if( allow_all || allow_oldnut) { | ||||
| 	if( allow_oldnut && nutscan_avail_nut) { | ||||
| 		if( start_ip == NULL ) { | ||||
| 			printq(quiet,"No start IP, skipping NUT bus (old connect method)\n"); | ||||
| 		} | ||||
| 		else { | ||||
| 			printq(quiet,"Scanning NUT bus (old connect method).\n"); | ||||
| #ifdef HAVE_PTHREAD | ||||
| 			pthread_create(&thread[TYPE_NUT],NULL,run_nut_old,NULL); | ||||
| 			if(pthread_create(&thread[TYPE_NUT],NULL,run_nut_old,NULL)) { | ||||
| 				nutscan_avail_nut = 0; | ||||
| 			} | ||||
| #else | ||||
| 			dev[TYPE_NUT] = nutscan_scan_nut(start_ip,end_ip,port,timeout); | ||||
| #endif | ||||
| #endif /* HAVE_PTHREAD */ | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| #ifdef HAVE_AVAHI_CLIENT_CLIENT_H | ||||
| 	if( allow_all || allow_avahi) { | ||||
| 	if( allow_avahi && nutscan_avail_avahi) { | ||||
| 		printq(quiet,"Scanning NUT bus (avahi method).\n"); | ||||
| #ifdef HAVE_PTHREAD | ||||
| 		pthread_create(&thread[TYPE_AVAHI],NULL,run_avahi,NULL); | ||||
| 		if(pthread_create(&thread[TYPE_AVAHI],NULL,run_avahi,NULL)) { | ||||
| 			nutscan_avail_avahi = 0; | ||||
| 		} | ||||
| #else | ||||
| 		dev[TYPE_AVAHI] = nutscan_scan_avahi(); | ||||
| #endif | ||||
| 		dev[TYPE_AVAHI] = nutscan_scan_avahi(timeout); | ||||
| #endif /* HAVE_PTHREAD */ | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| #ifdef HAVE_FREEIPMI_FREEIPMI_H | ||||
| 	if( allow_all || allow_ipmi) { | ||||
| 	if( allow_ipmi  && nutscan_avail_ipmi) { | ||||
| 		printq(quiet,"Scanning IPMI bus.\n"); | ||||
| #ifdef HAVE_PTHREAD | ||||
| 		pthread_create(&thread[TYPE_IPMI],NULL,run_ipmi,NULL); | ||||
| 		if(pthread_create(&thread[TYPE_IPMI],NULL,run_ipmi,NULL)) { | ||||
| 			nutscan_avail_ipmi = 0; | ||||
| 		} | ||||
| #else | ||||
| 		dev[TYPE_IPMI] = nutscan_scan_ipmi(); | ||||
| #endif | ||||
| #endif /* HAVE_PTHREAD */ | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| #ifdef HAVE_PTHREAD | ||||
| #ifdef HAVE_USB_H | ||||
| 	pthread_join(thread[TYPE_USB],NULL); | ||||
| #endif | ||||
| #ifdef HAVE_NET_SNMP_NET_SNMP_CONFIG_H | ||||
| 	pthread_join(thread[TYPE_SNMP],NULL); | ||||
| #endif | ||||
| #ifdef WITH_NEON | ||||
| 	pthread_join(thread[TYPE_XML],NULL); | ||||
| #endif | ||||
| 	pthread_join(thread[TYPE_NUT],NULL); | ||||
| #ifdef HAVE_AVAHI_CLIENT_CLIENT_H | ||||
| 	pthread_join(thread[TYPE_AVAHI],NULL); | ||||
| #endif | ||||
| #ifdef HAVE_FREEIPMI_FREEIPMI_H | ||||
| 	pthread_join(thread[TYPE_IPMI],NULL); | ||||
| #endif | ||||
| 	if( allow_usb && nutscan_avail_usb ) { | ||||
| 		pthread_join(thread[TYPE_USB],NULL); | ||||
| 	} | ||||
| 	if( allow_snmp && nutscan_avail_snmp ) { | ||||
| 		pthread_join(thread[TYPE_SNMP],NULL); | ||||
| 	} | ||||
| 	if( allow_xml && nutscan_avail_xml_http ) { | ||||
| 		pthread_join(thread[TYPE_XML],NULL); | ||||
| 	} | ||||
| 	if( allow_oldnut && nutscan_avail_nut ) { | ||||
| 		pthread_join(thread[TYPE_NUT],NULL); | ||||
| 	} | ||||
| 	if( allow_avahi && nutscan_avail_avahi ) { | ||||
| 		pthread_join(thread[TYPE_AVAHI],NULL); | ||||
| 	} | ||||
| 	if( allow_ipmi && nutscan_avail_ipmi ) { | ||||
| 		pthread_join(thread[TYPE_IPMI],NULL); | ||||
| 	} | ||||
| #endif /* HAVE_PTHREAD */ | ||||
| 
 | ||||
| #ifdef HAVE_USB_H | ||||
| 	display_func(dev[TYPE_USB]); | ||||
| 	nutscan_free_device(dev[TYPE_USB]); | ||||
| #endif | ||||
| #ifdef HAVE_NET_SNMP_NET_SNMP_CONFIG_H | ||||
| 
 | ||||
| 	display_func(dev[TYPE_SNMP]); | ||||
| 	nutscan_free_device(dev[TYPE_SNMP]); | ||||
| #endif | ||||
| #ifdef WITH_NEON | ||||
| 
 | ||||
| 	display_func(dev[TYPE_XML]); | ||||
| 	nutscan_free_device(dev[TYPE_XML]); | ||||
| #endif | ||||
| 
 | ||||
| 	display_func(dev[TYPE_NUT]); | ||||
| 	nutscan_free_device(dev[TYPE_NUT]); | ||||
| #ifdef HAVE_AVAHI_CLIENT_CLIENT_H | ||||
| 
 | ||||
| 	display_func(dev[TYPE_AVAHI]); | ||||
| 	nutscan_free_device(dev[TYPE_AVAHI]); | ||||
| #endif | ||||
| #ifdef HAVE_FREEIPMI_FREEIPMI_H | ||||
| 
 | ||||
| 	display_func(dev[TYPE_IPMI]); | ||||
| 	nutscan_free_device(dev[TYPE_IPMI]); | ||||
| #endif | ||||
| 	return EXIT_SUCCESS; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										52
									
								
								tools/nut-scanner/nutscan-init.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								tools/nut-scanner/nutscan-init.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,52 @@ | |||
| /* nutscan-init.c: init functions for nut scanner library
 | ||||
|  *  | ||||
|  *  Copyright (C) 2011 - Frederic Bohe <fredericbohe@eaton.com> | ||||
|  * | ||||
|  *  This program is free software; you can redistribute it and/or modify | ||||
|  *  it under the terms of the GNU General Public License as published by | ||||
|  *  the Free Software Foundation; either version 2 of the License, or | ||||
|  *  (at your option) any later version. | ||||
|  * | ||||
|  *  This program is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  *  GNU General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU General Public License | ||||
|  *  along with this program; if not, write to the Free Software | ||||
|  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
|  */ | ||||
| 
 | ||||
| #include "common.h" | ||||
| 
 | ||||
| int nutscan_avail_avahi = 0; | ||||
| int nutscan_avail_ipmi = 0; | ||||
| int nutscan_avail_nut = 1; | ||||
| int nutscan_avail_snmp = 0; | ||||
| int nutscan_avail_usb = 0; | ||||
| int nutscan_avail_xml_http = 0; | ||||
| 
 | ||||
| int nutscan_load_usb_library(void); | ||||
| int nutscan_load_snmp_library(void); | ||||
| int nutscan_load_neon_library(void); | ||||
| int nutscan_load_avahi_library(void); | ||||
| int nutscan_load_ipmi_library(void); | ||||
| 
 | ||||
| void nutscan_init(void) | ||||
| { | ||||
| #ifdef WITH_USB | ||||
| 	nutscan_avail_usb = nutscan_load_usb_library(); | ||||
| #endif | ||||
| #ifdef WITH_SNMP | ||||
| 	nutscan_avail_snmp = nutscan_load_snmp_library(); | ||||
| #endif | ||||
| #ifdef WITH_NEON | ||||
| 	nutscan_avail_xml_http = nutscan_load_neon_library(); | ||||
| #endif | ||||
| #ifdef WITH_AVAHI | ||||
| 	nutscan_avail_avahi = nutscan_load_avahi_library(); | ||||
| #endif | ||||
| #ifdef WITH_FREEIPMI | ||||
| 	nutscan_avail_ipmi = nutscan_load_ipmi_library(); | ||||
| #endif | ||||
| } | ||||
							
								
								
									
										30
									
								
								tools/nut-scanner/nutscan-init.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								tools/nut-scanner/nutscan-init.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | |||
| /* nutscan-init.h: initialisation data
 | ||||
|  *  | ||||
|  *  Copyright (C) 2011 - Frederic Bohe <fredericbohe@eaton.com> | ||||
|  * | ||||
|  *  This program is free software; you can redistribute it and/or modify | ||||
|  *  it under the terms of the GNU General Public License as published by | ||||
|  *  the Free Software Foundation; either version 2 of the License, or | ||||
|  *  (at your option) any later version. | ||||
|  * | ||||
|  *  This program is distributed in the hope that it will be useful, | ||||
|  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  *  GNU General Public License for more details. | ||||
|  * | ||||
|  *  You should have received a copy of the GNU General Public License | ||||
|  *  along with this program; if not, write to the Free Software | ||||
|  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
|  */ | ||||
| #ifndef SCAN_INIT | ||||
| #define SCAN_INIT | ||||
| 
 | ||||
| extern int nutscan_avail_avahi; | ||||
| extern int nutscan_avail_ipmi; | ||||
| extern int nutscan_avail_nut; | ||||
| extern int nutscan_avail_snmp; | ||||
| extern int nutscan_avail_usb; | ||||
| extern int nutscan_avail_xml_http; | ||||
| 
 | ||||
| void nutscan_init(void); | ||||
| #endif | ||||
|  | @ -20,6 +20,9 @@ | |||
| #include "nutscan-ip.h" | ||||
| #include <stdio.h> | ||||
| #include "common.h" | ||||
| #include <sys/types.h> | ||||
| #include <sys/socket.h> | ||||
| #include <netdb.h> | ||||
| 
 | ||||
| static void increment_IPv6(struct in6_addr * addr) | ||||
| { | ||||
|  | @ -42,12 +45,38 @@ static void invert_IPv6(struct in6_addr * addr1, struct in6_addr * addr2) | |||
| 	memcpy(addr2->s6_addr,addr.s6_addr,sizeof(addr.s6_addr)); | ||||
| } | ||||
| 
 | ||||
| static int ntop( struct in_addr * ip, char * host, size_t host_size) | ||||
| { | ||||
| 	struct sockaddr_in in; | ||||
| 	memset(&in,0,sizeof(struct sockaddr_in)); | ||||
| 	in.sin_addr = *ip; | ||||
| 	in.sin_family = AF_INET; | ||||
| 	return getnameinfo((struct sockaddr *)&in, | ||||
| 				sizeof(struct sockaddr_in), | ||||
| 				host,host_size,NULL,0,NI_NUMERICHOST); | ||||
| } | ||||
| 
 | ||||
| static int ntop6( struct in6_addr * ip, char * host, size_t host_size) | ||||
| { | ||||
| 	struct sockaddr_in6 in6; | ||||
| 	memset(&in6,0,sizeof(struct sockaddr_in6)); | ||||
| 	memcpy( &in6.sin6_addr, ip, sizeof(struct in6_addr) ); | ||||
| 	in6.sin6_family = AF_INET6; | ||||
| 	return getnameinfo((struct sockaddr *)&in6, | ||||
| 				sizeof(struct sockaddr_in6), | ||||
| 				host,host_size,NULL,0,NI_NUMERICHOST); | ||||
| } | ||||
| 
 | ||||
| /* Return the first ip or NULL if error */ | ||||
| char * nutscan_ip_iter_init(nutscan_ip_iter_t * ip, const char * startIP, const char * stopIP) | ||||
| { | ||||
| 	int addr; | ||||
| 	int i; | ||||
| 	char buf[SMALLBUF]; | ||||
| 	struct addrinfo hints; | ||||
| 	struct addrinfo *res; | ||||
| 	struct sockaddr_in * s_in; | ||||
| 	struct sockaddr_in6 * s_in6; | ||||
| 	char host[SMALLBUF]; | ||||
| 
 | ||||
| 	if( startIP == NULL ) { | ||||
| 		return NULL; | ||||
|  | @ -57,29 +86,51 @@ char * nutscan_ip_iter_init(nutscan_ip_iter_t * ip, const char * startIP, const | |||
| 		stopIP = startIP; | ||||
| 	} | ||||
| 
 | ||||
| 	memset(&hints,0,sizeof(struct addrinfo)); | ||||
| 	hints.ai_family = AF_INET; | ||||
| 
 | ||||
| 	ip->type = IPv4; | ||||
| 	/* Detecting IPv4 vs IPv6 */ | ||||
| 	if(!inet_aton(startIP, &ip->start)) { | ||||
| 	if(getaddrinfo(startIP,NULL,&hints,&res) != 0) { | ||||
| 		/*Try IPv6 detection */ | ||||
| 		ip->type = IPv6; | ||||
| 		if(!inet_pton(AF_INET6, startIP, &ip->start6)){ | ||||
| 		hints.ai_family = AF_INET6; | ||||
| 		if(getaddrinfo(startIP,NULL,&hints,&res) != 0) { | ||||
| 			fprintf(stderr,"Invalid address : %s\n",startIP); | ||||
| 			return NULL; | ||||
| 		} | ||||
| 		 | ||||
| 		s_in6 = (struct sockaddr_in6 *)res->ai_addr; | ||||
| 		memcpy(&ip->start6,&s_in6->sin6_addr,sizeof(struct in6_addr)); | ||||
| 		freeaddrinfo(res); | ||||
| 	} | ||||
| 	else { | ||||
| 		s_in = (struct sockaddr_in *)res->ai_addr; | ||||
| 		ip->start = s_in->sin_addr; | ||||
| 		freeaddrinfo(res); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Compute stop IP */ | ||||
|         if( ip->type == IPv4 ) { | ||||
|                 if(!inet_aton(stopIP, &ip->stop)) { | ||||
| 		hints.ai_family = AF_INET; | ||||
| 		if(getaddrinfo(stopIP,NULL,&hints,&res) != 0) { | ||||
|                         fprintf(stderr,"Invalid address : %s\n",stopIP); | ||||
|                         return NULL; | ||||
|                 } | ||||
| 
 | ||||
| 		s_in = (struct sockaddr_in *)res->ai_addr; | ||||
| 		ip->stop = s_in->sin_addr; | ||||
| 		freeaddrinfo(res); | ||||
|         } | ||||
|         else { | ||||
|                 if(!inet_pton(AF_INET6, stopIP, &ip->stop6)){ | ||||
| 		hints.ai_family = AF_INET6; | ||||
| 		if(getaddrinfo(stopIP,NULL,&hints,&res) != 0) { | ||||
|                         fprintf(stderr,"Invalid address : %s\n",stopIP); | ||||
|                         return NULL; | ||||
|                 } | ||||
| 		s_in6 = (struct sockaddr_in6 *)res->ai_addr; | ||||
| 		memcpy(&ip->stop6,&s_in6->sin6_addr,sizeof(struct in6_addr)); | ||||
| 		freeaddrinfo(res); | ||||
|         } | ||||
| 
 | ||||
|         /* Make sure start IP is lesser than stop IP */ | ||||
|  | @ -89,7 +140,12 @@ char * nutscan_ip_iter_init(nutscan_ip_iter_t * ip, const char * startIP, const | |||
|                         ip->start.s_addr = ip->stop.s_addr; | ||||
|                         ip->stop.s_addr = addr; | ||||
|                 } | ||||
| 		return strdup(inet_ntoa(ip->start)); | ||||
| 
 | ||||
| 		if( ntop(&ip->start, host, sizeof(host)) != 0 ) { | ||||
| 			return NULL; | ||||
| 		} | ||||
| 
 | ||||
| 		return strdup(host); | ||||
|         } | ||||
|         else { /* IPv6 */ | ||||
|                 for( i=0; i<16; i++ ) { | ||||
|  | @ -100,7 +156,12 @@ char * nutscan_ip_iter_init(nutscan_ip_iter_t * ip, const char * startIP, const | |||
|                                 break; | ||||
|                         } | ||||
|                 } | ||||
| 		return strdup(inet_ntop(AF_INET6,&ip->start6,buf,sizeof(buf))); | ||||
| 
 | ||||
| 		if( ntop6(&ip->start6, host, sizeof(host)) != 0 ) { | ||||
| 			return NULL; | ||||
| 		} | ||||
| 
 | ||||
| 		return strdup(host); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -111,7 +172,7 @@ return NULL if there is no more IP | |||
| */ | ||||
| char * nutscan_ip_iter_inc(nutscan_ip_iter_t * ip) | ||||
| { | ||||
| 	char buf[SMALLBUF]; | ||||
| 	char host[SMALLBUF]; | ||||
| 
 | ||||
| 	if( ip->type == IPv4 ) { | ||||
| 		/* Check if this is the last address to scan */ | ||||
|  | @ -122,7 +183,11 @@ char * nutscan_ip_iter_inc(nutscan_ip_iter_t * ip) | |||
| 		   byte order, then pass back in network byte order */ | ||||
| 		ip->start.s_addr = htonl((ntohl(ip->start.s_addr)+1)); | ||||
| 
 | ||||
| 		return strdup(inet_ntoa(ip->start)); | ||||
| 		if( ntop(&ip->start, host, sizeof(host)) != 0 ) { | ||||
| 			return NULL; | ||||
| 		} | ||||
| 	 | ||||
| 		return strdup(host); | ||||
| 	} | ||||
| 	else { | ||||
| 		/* Check if this is the last address to scan */ | ||||
|  | @ -132,8 +197,11 @@ char * nutscan_ip_iter_inc(nutscan_ip_iter_t * ip) | |||
| 		} | ||||
| 
 | ||||
| 		increment_IPv6(&ip->start6); | ||||
| 		if( ntop6(&ip->start6, host, sizeof(host)) != 0 ) { | ||||
| 			return NULL; | ||||
| 		} | ||||
| 
 | ||||
| 		return strdup(inet_ntop(AF_INET6,&ip->start6,buf,sizeof(buf))); | ||||
| 		return strdup(host); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -146,8 +214,12 @@ int nutscan_cidr_to_ip(const char * cidr, char ** start_ip, char ** stop_ip) | |||
| 	nutscan_ip_iter_t ip; | ||||
| 	int mask_val; | ||||
| 	int mask_byte; | ||||
| 	long mask_bit; | ||||
| 	char buf[SMALLBUF]; | ||||
| 	unsigned long mask_bit; | ||||
| 	char host[SMALLBUF]; | ||||
| 	struct addrinfo hints; | ||||
| 	struct addrinfo *res; | ||||
| 	struct sockaddr_in * s_in; | ||||
| 	struct sockaddr_in6 * s_in6; | ||||
| 
 | ||||
| 	*start_ip = NULL; | ||||
| 	*stop_ip = NULL; | ||||
|  | @ -166,15 +238,30 @@ int nutscan_cidr_to_ip(const char * cidr, char ** start_ip, char ** stop_ip) | |||
| 	mask_val = atoi(mask); | ||||
| 
 | ||||
|         /* Detecting IPv4 vs IPv6 */ | ||||
| 	memset(&hints,0,sizeof(struct addrinfo)); | ||||
| 	hints.ai_family = AF_INET; | ||||
| 
 | ||||
| 	ip.type = IPv4; | ||||
|         if(!inet_aton(first_ip, &ip.start)) { | ||||
|                 /*Try IPv6 detection */ | ||||
|                 ip.type = IPv6; | ||||
|                 if(!inet_pton(AF_INET6, first_ip, &ip.start6)){ | ||||
| 	/* Detecting IPv4 vs IPv6 */ | ||||
| 	if(getaddrinfo(first_ip,NULL,&hints,&res) != 0) { | ||||
| 		/*Try IPv6 detection */ | ||||
| 		ip.type = IPv6; | ||||
| 		hints.ai_family = AF_INET6; | ||||
| 		int ret; | ||||
| 		if((ret=getaddrinfo(first_ip,NULL,&hints,&res)) != 0) { | ||||
| 			free(first_ip); | ||||
|                         return 0; | ||||
|                 } | ||||
|         } | ||||
| 			return 0; | ||||
| 		} | ||||
| 		 | ||||
| 		s_in6 = (struct sockaddr_in6 *)res->ai_addr; | ||||
| 		memcpy(&ip.start6,&s_in6->sin6_addr,sizeof(struct in6_addr)); | ||||
| 		freeaddrinfo(res); | ||||
| 	} | ||||
| 	else { | ||||
| 		s_in = (struct sockaddr_in *)res->ai_addr; | ||||
| 		ip.start = s_in->sin_addr; | ||||
| 		freeaddrinfo(res); | ||||
| 	} | ||||
| 
 | ||||
| 	if( ip.type == IPv4 ) { | ||||
| 
 | ||||
|  | @ -190,13 +277,31 @@ int nutscan_cidr_to_ip(const char * cidr, char ** start_ip, char ** stop_ip) | |||
| 		ip.stop.s_addr = htonl(ntohl(ip.start.s_addr)|mask_bit); | ||||
| 		ip.start.s_addr = htonl(ntohl(ip.start.s_addr)&(~mask_bit)); | ||||
| 
 | ||||
| 		*start_ip = strdup(inet_ntoa(ip.start)); | ||||
| 		*stop_ip = strdup(inet_ntoa(ip.stop)); | ||||
| 		if( ntop(&ip.start, host, sizeof(host)) != 0 ) { | ||||
| 			*start_ip = NULL; | ||||
| 			*stop_ip = NULL; | ||||
| 			return 0; | ||||
| 		} | ||||
| 		*start_ip = strdup(host); | ||||
| 
 | ||||
| 		if( ntop(&ip.stop, host, sizeof(host)) != 0 ) { | ||||
| 			free(*start_ip); | ||||
| 			*start_ip = NULL; | ||||
| 			*stop_ip = NULL; | ||||
| 			return 0; | ||||
| 		} | ||||
| 		*stop_ip = strdup(host); | ||||
| 
 | ||||
| 		free(first_ip); | ||||
| 		return 1; | ||||
| 	} | ||||
| 	else { | ||||
|                 inet_pton(AF_INET6, first_ip, &ip.stop6); | ||||
| 		if(getaddrinfo(first_ip,NULL,&hints,&res) != 0) { | ||||
| 			return 0; | ||||
| 		} | ||||
| 		s_in6 = (struct sockaddr_in6 *)res->ai_addr; | ||||
| 		memcpy(&ip.stop6,&s_in6->sin6_addr,sizeof(struct in6_addr)); | ||||
| 		freeaddrinfo(res); | ||||
| 
 | ||||
| 		mask_byte = mask_val / 8; | ||||
| 		if( mask_byte < 16 ) { | ||||
|  | @ -208,10 +313,20 @@ int nutscan_cidr_to_ip(const char * cidr, char ** start_ip, char ** stop_ip) | |||
| 			ip.start6.s6_addr[mask_byte] &= (~mask_bit); | ||||
| 		} | ||||
| 
 | ||||
| 		inet_ntop(AF_INET6,&ip.start6,buf,sizeof(buf)); | ||||
| 		*start_ip = strdup(buf); | ||||
| 		inet_ntop(AF_INET6,&ip.stop6,buf,sizeof(buf)); | ||||
| 		*stop_ip = strdup(buf); | ||||
| 		if( ntop6(&ip.start6, host, sizeof(host)) != 0 ) { | ||||
| 			*start_ip = NULL; | ||||
| 			*stop_ip = NULL; | ||||
| 			return 0; | ||||
| 		} | ||||
| 		*start_ip = strdup(host); | ||||
| 
 | ||||
| 		if( ntop6(&ip.stop6, host, sizeof(host)) != 0 ) { | ||||
| 			free(*start_ip); | ||||
| 			*start_ip = NULL; | ||||
| 			*stop_ip = NULL; | ||||
| 			return 0; | ||||
| 		} | ||||
| 		*stop_ip = strdup(host); | ||||
| 	} | ||||
| 
 | ||||
| 	free(first_ip); | ||||
|  |  | |||
|  | @ -19,9 +19,8 @@ | |||
| #ifndef SCAN_IP | ||||
| #define SCAN_IP | ||||
| 
 | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netinet/in.h> | ||||
| 
 | ||||
| enum network_type { | ||||
|         IPv4, | ||||
|  |  | |||
|  | @ -37,6 +37,7 @@ static snmp_device_id_t snmp_device_table[] = { | |||
| 	{ ".1.3.6.1.4.1.705.1.1.1.0" ,  "mge", ".1.3.6.1.4.1.705.1"}, | ||||
| 	{ ".1.3.6.1.4.1.318.1.1.1.1.1.1.0" ,  "apcc", NULL}, | ||||
| 	{ ".1.3.6.1.4.1.4779.1.3.5.2.1.24.1" ,  "baytech", NULL}, | ||||
| 	{ ".1.3.6.1.4.1.3808.1.1.1.1.1.1.0" ,  "cyberpower", ".1.3.6.1.4.1.3808"}, | ||||
| 	{ "1.3.6.1.4.1.232.165.3.1.1.0" ,  "cpqpower", NULL}, | ||||
| 	{ ".1.3.6.1.4.1.4555.1.1.1.1.1.1.0" ,  "netvision", ".1.3.6.1.4.1.4555.1.1.1"}, | ||||
|         /* Terminating entry */ | ||||
|  |  | |||
|  | @ -31,6 +31,7 @@ typedef struct { | |||
| /* USB IDs device table */ | ||||
| static usb_device_id_t usb_device_table[] = { | ||||
| 
 | ||||
| 	{ 0x0001, 0x0000, "blazer_usb" }, | ||||
| 	{ 0x03f0, 0x1f01, "bcmxcp_usb" }, | ||||
| 	{ 0x03f0, 0x1f02, "bcmxcp_usb" }, | ||||
| 	{ 0x03f0, 0x1f06, "usbhid-ups" }, | ||||
|  | @ -96,6 +97,7 @@ static usb_device_id_t usb_device_table[] = { | |||
| 	{ 0x09ae, 0x4006, "usbhid-ups" }, | ||||
| 	{ 0x09ae, 0x4007, "usbhid-ups" }, | ||||
| 	{ 0x09ae, 0x4008, "usbhid-ups" }, | ||||
| 	{ 0x0d9f, 0x0004, "usbhid-ups" }, | ||||
| 	{ 0x0d9f, 0x00a2, "usbhid-ups" }, | ||||
| 	{ 0x0d9f, 0x00a3, "usbhid-ups" }, | ||||
| 	{ 0x0d9f, 0x00a4, "usbhid-ups" }, | ||||
|  | @ -104,6 +106,7 @@ static usb_device_id_t usb_device_table[] = { | |||
| 	{ 0x0f03, 0x0001, "blazer_usb" }, | ||||
| 	{ 0x10af, 0x0001, "usbhid-ups" }, | ||||
| 	{ 0x14f0, 0x00c9, "blazer_usb" }, | ||||
| 	{ 0xffff, 0x0000, "blazer_usb" }, | ||||
| 	/* Terminating entry */ | ||||
| 	{ -1, -1, NULL } | ||||
| }; | ||||
|  |  | |||
|  | @ -17,14 +17,14 @@ | |||
|  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
|  */ | ||||
| #include "common.h" | ||||
| 
 | ||||
| #ifdef HAVE_AVAHI_CLIENT_CLIENT_H | ||||
| #include "nut-scan.h" | ||||
| 
 | ||||
| #ifdef WITH_AVAHI | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <assert.h> | ||||
| #include <stdlib.h> | ||||
| #include <time.h> | ||||
| #include "timehead.h" | ||||
| 
 | ||||
| #include <avahi-client/client.h> | ||||
| #include <avahi-client/lookup.h> | ||||
|  | @ -33,6 +33,175 @@ | |||
| #include <avahi-common/malloc.h> | ||||
| #include <avahi-common/error.h> | ||||
| 
 | ||||
| #include <ltdl.h> | ||||
| 
 | ||||
| /* dynamic link library stuff */ | ||||
| static lt_dlhandle dl_handle = NULL; | ||||
| static const char *dl_error = NULL; | ||||
| 
 | ||||
| static AvahiClient* (*nut_avahi_service_browser_get_client)(AvahiServiceBrowser *); | ||||
| static int (*nut_avahi_simple_poll_loop)(AvahiSimplePoll *s); | ||||
| static void (*nut_avahi_client_free)(AvahiClient *client); | ||||
| static int (*nut_avahi_client_errno)(AvahiClient*); | ||||
| static void (*nut_avahi_free)(void *p); | ||||
| static void (*nut_avahi_simple_poll_quit)(AvahiSimplePoll *s); | ||||
| static AvahiClient* (*nut_avahi_client_new)( | ||||
| 		const AvahiPoll *poll_api, | ||||
| 		AvahiClientFlags flags, | ||||
| 		AvahiClientCallback callback, | ||||
| 		void *userdata, | ||||
| 		int *error); | ||||
| static void (*nut_avahi_simple_poll_free)(AvahiSimplePoll *s); | ||||
| static AvahiServiceResolver * (*nut_avahi_service_resolver_new)( | ||||
| 		AvahiClient *client, | ||||
| 		AvahiIfIndex interface, | ||||
| 		AvahiProtocol protocol, | ||||
| 		const char *name, | ||||
| 		const char *type, | ||||
| 		const char *domain, | ||||
| 		AvahiProtocol aprotocol, | ||||
| 		AvahiLookupFlags flags, | ||||
| 		AvahiServiceResolverCallback callback, | ||||
| 		void *userdata); | ||||
| static const char * (*nut_avahi_strerror)(int error); | ||||
| static AvahiClient* (*nut_avahi_service_resolver_get_client)(AvahiServiceResolver *); | ||||
| static AvahiServiceBrowser* (*nut_avahi_service_browser_new)( | ||||
| 		AvahiClient *client, | ||||
| 		AvahiIfIndex interface, | ||||
| 		AvahiProtocol protocol, | ||||
| 		const char *type, | ||||
| 		const char *domain, | ||||
| 		AvahiLookupFlags flags, | ||||
| 		AvahiServiceBrowserCallback callback, | ||||
| 		void *userdata); | ||||
| static int (*nut_avahi_service_resolver_free)(AvahiServiceResolver *r); | ||||
| static AvahiSimplePoll *(*nut_avahi_simple_poll_new)(void); | ||||
| static char* (*nut_avahi_string_list_to_string)(AvahiStringList *l); | ||||
| static int (*nut_avahi_service_browser_free)(AvahiServiceBrowser *); | ||||
| static char * (*nut_avahi_address_snprint)(char *ret_s, size_t length, const AvahiAddress *a); | ||||
| static const AvahiPoll* (*nut_avahi_simple_poll_get)(AvahiSimplePoll *s); | ||||
| 
 | ||||
| /* return 0 on error */ | ||||
| int nutscan_load_avahi_library() | ||||
| { | ||||
|         if( dl_handle != NULL ) { | ||||
|                 /* if previous init failed */ | ||||
|                 if( dl_handle == (void *)1 ) { | ||||
|                         return 0; | ||||
|                 } | ||||
|                 /* init has already been done */ | ||||
|                 return 1; | ||||
|         } | ||||
| 
 | ||||
|         if( lt_dlinit() != 0 ) { | ||||
|                 fprintf(stderr, "Error initializing lt_init\n"); | ||||
|                 return 0; | ||||
|         } | ||||
| 
 | ||||
|         dl_handle = lt_dlopenext("libavahi-client"); | ||||
|         if (!dl_handle) { | ||||
|                 dl_error = lt_dlerror(); | ||||
|                 goto err; | ||||
|         } | ||||
|         lt_dlerror();      /* Clear any existing error */ | ||||
|         *(void **) (&nut_avahi_service_browser_get_client) = lt_dlsym(dl_handle, "avahi_service_browser_get_client"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_simple_poll_loop) = lt_dlsym(dl_handle, "avahi_simple_poll_loop"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_client_free) = lt_dlsym(dl_handle, "avahi_client_free"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_client_errno) = lt_dlsym(dl_handle, "avahi_client_errno"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_free) = lt_dlsym(dl_handle, "avahi_free"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_simple_poll_quit) = lt_dlsym(dl_handle, "avahi_simple_poll_quit"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_client_new) = lt_dlsym(dl_handle, "avahi_client_new"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_simple_poll_free) = lt_dlsym(dl_handle, "avahi_simple_poll_free"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_service_resolver_new) = lt_dlsym(dl_handle, "avahi_service_resolver_new"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_strerror) = lt_dlsym(dl_handle, "avahi_strerror"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_service_resolver_get_client) = lt_dlsym(dl_handle, "avahi_service_resolver_get_client"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_service_browser_new) = lt_dlsym(dl_handle, "avahi_service_browser_new"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_service_resolver_free) = lt_dlsym(dl_handle, "avahi_service_resolver_free"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_simple_poll_new) = lt_dlsym(dl_handle, "avahi_simple_poll_new"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_string_list_to_string) = lt_dlsym(dl_handle, "avahi_string_list_to_string"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_service_browser_free) = lt_dlsym(dl_handle, "avahi_service_browser_free"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_address_snprint) = lt_dlsym(dl_handle, "avahi_address_snprint"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_avahi_simple_poll_get) = lt_dlsym(dl_handle, "avahi_simple_poll_get"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         return 1; | ||||
| err: | ||||
|         fprintf(stderr, "%s\n", dl_error); | ||||
|         dl_handle = (void *)1; | ||||
|         return 0; | ||||
| } | ||||
| /* end of dynamic link library stuff */ | ||||
| 
 | ||||
| static AvahiSimplePoll *simple_poll = NULL; | ||||
| static nutscan_device_t * dev_ret = NULL; | ||||
| static long avahi_usec_timeout = 0; | ||||
|  | @ -187,7 +356,7 @@ static void resolve_callback( | |||
| 
 | ||||
| 	switch (event) { | ||||
| 		case AVAHI_RESOLVER_FAILURE: | ||||
| 			fprintf(stderr, "(Resolver) Failed to resolve service '%s' of type '%s' in domain '%s': %s\n", name, type, domain, avahi_strerror(avahi_client_errno(avahi_service_resolver_get_client(r)))); | ||||
| 			fprintf(stderr, "(Resolver) Failed to resolve service '%s' of type '%s' in domain '%s': %s\n", name, type, domain, (*nut_avahi_strerror)((*nut_avahi_client_errno)((*nut_avahi_service_resolver_get_client)(r)))); | ||||
| 			break; | ||||
| 
 | ||||
| 		case AVAHI_RESOLVER_FOUND: { | ||||
|  | @ -195,8 +364,8 @@ static void resolve_callback( | |||
| 
 | ||||
| /*			fprintf(stderr, "Service '%s' of type '%s' in domain '%s':\n", name, type, domain); */ | ||||
| 
 | ||||
| 			avahi_address_snprint(a, sizeof(a), address); | ||||
| 			t = avahi_string_list_to_string(txt); | ||||
| 			(*nut_avahi_address_snprint)(a, sizeof(a), address); | ||||
| 			t = (*nut_avahi_string_list_to_string)(txt); | ||||
| /*
 | ||||
| 			fprintf(stderr, | ||||
| 				"\t%s:%u (%s)\n" | ||||
|  | @ -217,11 +386,11 @@ static void resolve_callback( | |||
| 				!!(flags & AVAHI_LOOKUP_RESULT_CACHED)); | ||||
| */ | ||||
| 			update_device(host_name,a,port,t,address->proto); | ||||
| 			avahi_free(t); | ||||
| 			(*nut_avahi_free)(t); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	avahi_service_resolver_free(r); | ||||
| 	(*nut_avahi_service_resolver_free)(r); | ||||
| } | ||||
| 
 | ||||
| static void browse_callback( | ||||
|  | @ -243,8 +412,8 @@ static void browse_callback( | |||
| 	switch (event) { | ||||
| 		case AVAHI_BROWSER_FAILURE: | ||||
| 
 | ||||
| 			fprintf(stderr, "(Browser) %s\n", avahi_strerror(avahi_client_errno(avahi_service_browser_get_client(b)))); | ||||
| 			avahi_simple_poll_quit(simple_poll); | ||||
| 			fprintf(stderr, "(Browser) %s\n", (*nut_avahi_strerror)((*nut_avahi_client_errno)((*nut_avahi_service_browser_get_client)(b)))); | ||||
| 			(*nut_avahi_simple_poll_quit)(simple_poll); | ||||
| 			return; | ||||
| 
 | ||||
| 		case AVAHI_BROWSER_NEW: | ||||
|  | @ -255,8 +424,8 @@ static void browse_callback( | |||
| 			   the callback function is called the server will free | ||||
| 			   the resolver for us. */ | ||||
| 
 | ||||
| 			if (!(avahi_service_resolver_new(c, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, resolve_callback, c))) | ||||
| 				fprintf(stderr, "Failed to resolve service '%s': %s\n", name, avahi_strerror(avahi_client_errno(c))); | ||||
| 			if (!((*nut_avahi_service_resolver_new)(c, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, resolve_callback, c))) | ||||
| 				fprintf(stderr, "Failed to resolve service '%s': %s\n", name, (*nut_avahi_strerror)((*nut_avahi_client_errno)(c))); | ||||
| 
 | ||||
| 			break; | ||||
| 
 | ||||
|  | @ -265,7 +434,7 @@ static void browse_callback( | |||
| 			break; | ||||
| 
 | ||||
| 		case AVAHI_BROWSER_ALL_FOR_NOW: | ||||
| 			avahi_simple_poll_quit(simple_poll); | ||||
| 			(*nut_avahi_simple_poll_quit)(simple_poll); | ||||
| 		case AVAHI_BROWSER_CACHE_EXHAUSTED: | ||||
| /*			fprintf(stderr, "(Browser) %s\n", event == AVAHI_BROWSER_CACHE_EXHAUSTED ? "CACHE_EXHAUSTED" : "ALL_FOR_NOW"); */ | ||||
| 			break; | ||||
|  | @ -278,8 +447,8 @@ static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UN | |||
| 	/* Called whenever the client or server state changes */ | ||||
| 
 | ||||
| 	if (state == AVAHI_CLIENT_FAILURE) { | ||||
| 		fprintf(stderr, "Server connection failure: %s\n", avahi_strerror(avahi_client_errno(c))); | ||||
| 		avahi_simple_poll_quit(simple_poll); | ||||
| 		fprintf(stderr, "Server connection failure: %s\n", (*nut_avahi_strerror)((*nut_avahi_client_errno)(c))); | ||||
| 		(*nut_avahi_simple_poll_quit)(simple_poll); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -291,48 +460,55 @@ nutscan_device_t * nutscan_scan_avahi(long usec_timeout) | |||
| 	AvahiClient *client = NULL; | ||||
| 	AvahiServiceBrowser *sb = NULL; | ||||
| 	int error; | ||||
| 	int ret = 1; | ||||
| 
 | ||||
| 	if( !nutscan_avail_avahi ) { | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	avahi_usec_timeout = usec_timeout; | ||||
| 
 | ||||
| 	/* Allocate main loop object */ | ||||
| 	if (!(simple_poll = avahi_simple_poll_new())) { | ||||
| 	if (!(simple_poll = (*nut_avahi_simple_poll_new)())) { | ||||
| 		fprintf(stderr, "Failed to create simple poll object.\n"); | ||||
| 		goto fail; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Allocate a new client */ | ||||
| 	client = avahi_client_new(avahi_simple_poll_get(simple_poll), 0, client_callback, NULL, &error); | ||||
| 	client = (*nut_avahi_client_new)((*nut_avahi_simple_poll_get)(simple_poll), 0, client_callback, NULL, &error); | ||||
| 
 | ||||
| 	/* Check wether creating the client object succeeded */ | ||||
| 	if (!client) { | ||||
| 		fprintf(stderr, "Failed to create client: %s\n", avahi_strerror(error)); | ||||
| 		fprintf(stderr, "Failed to create client: %s\n", (*nut_avahi_strerror)(error)); | ||||
| 		goto fail; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Create the service browser */ | ||||
| 	if (!(sb = avahi_service_browser_new(client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_upsd._tcp", NULL, 0, browse_callback, client))) { | ||||
| 		fprintf(stderr, "Failed to create service browser: %s\n", avahi_strerror(avahi_client_errno(client))); | ||||
| 	if (!(sb = (*nut_avahi_service_browser_new)(client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_upsd._tcp", NULL, 0, browse_callback, client))) { | ||||
| 		fprintf(stderr, "Failed to create service browser: %s\n", (*nut_avahi_strerror)((*nut_avahi_client_errno)(client))); | ||||
| 		goto fail; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Run the main loop */ | ||||
| 	avahi_simple_poll_loop(simple_poll); | ||||
| 
 | ||||
| 	ret = 0; | ||||
| 	(*nut_avahi_simple_poll_loop)(simple_poll); | ||||
| 
 | ||||
| fail: | ||||
| 
 | ||||
| 	/* Cleanup things */ | ||||
| 	if (sb) | ||||
| 		avahi_service_browser_free(sb); | ||||
| 		(*nut_avahi_service_browser_free)(sb); | ||||
| 
 | ||||
| 	if (client) | ||||
| 		avahi_client_free(client); | ||||
| 		(*nut_avahi_client_free)(client); | ||||
| 
 | ||||
| 	if (simple_poll) | ||||
| 		avahi_simple_poll_free(simple_poll); | ||||
| 		(*nut_avahi_simple_poll_free)(simple_poll); | ||||
| 
 | ||||
| 	return dev_ret; | ||||
| } | ||||
| #endif /* HAVE_AVAHI_CLIENT_CLIENT_H */ | ||||
| #else  /* WITH_AVAHI */ | ||||
| /* stub function */ | ||||
| nutscan_device_t * nutscan_scan_avahi(long usec_timeout) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| #endif /* WITH_AVAHI */ | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| /* scan_ipmi.c: detect NUT supported Power Supply Units
 | ||||
|  *  | ||||
|  *  Copyright (C) 2011 - Frederic Bohe <fredericbohe@eaton.com> | ||||
|  *  Copyright (C) 2011 - Arnaud Quette <arnaud.quette@free.fr> | ||||
|  * | ||||
|  *  This program is free software; you can redistribute it and/or modify | ||||
|  *  it under the terms of the GNU General Public License as published by | ||||
|  | @ -17,13 +17,321 @@ | |||
|  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
|  */ | ||||
| #include "common.h" | ||||
| 
 | ||||
| #ifdef HAVE_FREEIPMI_FREEIPMI_H | ||||
| #include "nut-scan.h" | ||||
| 
 | ||||
| /* TODO */ | ||||
| #ifdef WITH_IPMI | ||||
| #include "upsclient.h" | ||||
| #include <freeipmi/freeipmi.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <ltdl.h> | ||||
| 
 | ||||
| #define NUT_IPMI_DRV_NAME	"nut-ipmipsu" | ||||
| 
 | ||||
| /* dynamic link library stuff */ | ||||
| static lt_dlhandle dl_handle = NULL; | ||||
| static const char *dl_error = NULL; | ||||
| 
 | ||||
| static int (*nut_ipmi_fru_parse_close_device_id) (ipmi_fru_parse_ctx_t ctx); | ||||
| static void (*nut_ipmi_fru_parse_ctx_destroy) (ipmi_fru_parse_ctx_t ctx); | ||||
| static void (*nut_ipmi_sdr_cache_ctx_destroy) (ipmi_sdr_cache_ctx_t ctx); | ||||
| static void (*nut_ipmi_sdr_parse_ctx_destroy) (ipmi_sdr_parse_ctx_t ctx); | ||||
| static ipmi_fru_parse_ctx_t (*nut_ipmi_fru_parse_ctx_create) (ipmi_ctx_t ipmi_ctx); | ||||
| static int (*nut_ipmi_fru_parse_ctx_set_flags) (ipmi_fru_parse_ctx_t ctx, unsigned int flags); | ||||
| static int (*nut_ipmi_fru_parse_open_device_id) (ipmi_fru_parse_ctx_t ctx, uint8_t fru_device_id); | ||||
| static char * (*nut_ipmi_fru_parse_ctx_errormsg) (ipmi_fru_parse_ctx_t ctx); | ||||
| static int (*nut_ipmi_fru_parse_read_data_area) (ipmi_fru_parse_ctx_t ctx, | ||||
|                                    unsigned int *area_type, | ||||
|                                    unsigned int *area_length, | ||||
|                                    void *areabuf, | ||||
|                                    unsigned int areabuflen); | ||||
| static int (*nut_ipmi_fru_parse_next) (ipmi_fru_parse_ctx_t ctx); | ||||
| static ipmi_ctx_t (*nut_ipmi_ctx_create) (void); | ||||
| static int (*nut_ipmi_ctx_find_inband) (ipmi_ctx_t ctx, | ||||
|                           ipmi_driver_type_t *driver_type, | ||||
|                           int disable_auto_probe, | ||||
|                           uint16_t driver_address, | ||||
|                           uint8_t register_spacing, | ||||
|                           const char *driver_device, | ||||
|                           unsigned int workaround_flags, | ||||
|                           unsigned int flags); | ||||
| static char * (*nut_ipmi_ctx_errormsg) (ipmi_ctx_t ctx); | ||||
| static int (*nut_ipmi_ctx_close) (ipmi_ctx_t ctx); | ||||
| static void (*nut_ipmi_ctx_destroy) (ipmi_ctx_t ctx); | ||||
| 
 | ||||
| 
 | ||||
| /* Return 0 on error */ | ||||
| int nutscan_load_ipmi_library() | ||||
| { | ||||
| 	if( dl_handle != NULL ) { | ||||
| 		/* if previous init failed */ | ||||
| 		if( dl_handle == (void *)1 ) { | ||||
| 			return 0; | ||||
| 		} | ||||
| 		/* init has already been done */ | ||||
| 		return 1; | ||||
| 	} | ||||
| 
 | ||||
| 	if( lt_dlinit() != 0 ) { | ||||
| 		fprintf(stderr, "Error initializing lt_init\n"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	dl_handle = lt_dlopenext("libfreeipmi"); | ||||
| 	if (!dl_handle) { | ||||
| 		dl_error = lt_dlerror(); | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Clear any existing error */ | ||||
| 	lt_dlerror(); | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_fru_parse_close_device_id) = lt_dlsym(dl_handle, "ipmi_fru_parse_close_device_id"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_fru_parse_ctx_destroy) = lt_dlsym(dl_handle, "ipmi_fru_parse_ctx_destroy"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_sdr_cache_ctx_destroy) = lt_dlsym(dl_handle, "ipmi_sdr_cache_ctx_destroy"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_sdr_parse_ctx_destroy) = lt_dlsym(dl_handle, "ipmi_sdr_parse_ctx_destroy"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_fru_parse_ctx_create) = lt_dlsym(dl_handle, "ipmi_fru_parse_ctx_create"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_fru_parse_ctx_set_flags) = lt_dlsym(dl_handle, "ipmi_fru_parse_ctx_set_flags"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_fru_parse_open_device_id) = lt_dlsym(dl_handle, "ipmi_fru_parse_open_device_id"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_fru_parse_ctx_errormsg) = lt_dlsym(dl_handle, "ipmi_fru_parse_ctx_errormsg"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_fru_parse_read_data_area) = lt_dlsym(dl_handle, "ipmi_fru_parse_read_data_area"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_fru_parse_next) = lt_dlsym(dl_handle, "ipmi_fru_parse_next"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_ctx_create) = lt_dlsym(dl_handle, "ipmi_ctx_create"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_ctx_find_inband) = lt_dlsym(dl_handle, "ipmi_ctx_find_inband"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_ctx_errormsg) = lt_dlsym(dl_handle, "ipmi_ctx_errormsg"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_ctx_close) = lt_dlsym(dl_handle, "ipmi_ctx_close"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_ipmi_ctx_destroy) = lt_dlsym(dl_handle, "ipmi_ctx_destroy"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	return 1; | ||||
| err: | ||||
| 	fprintf(stderr, "%s\n", dl_error); | ||||
| 	dl_handle = (void *)1; | ||||
| 	return 0; | ||||
| } | ||||
| /* end of dynamic link library stuff */ | ||||
| 
 | ||||
| /* Cleanup IPMI contexts */ | ||||
| static void nut_freeipmi_cleanup(ipmi_fru_parse_ctx_t fru_parse_ctx, | ||||
| 								 ipmi_sdr_cache_ctx_t sdr_cache_ctx, | ||||
| 								 ipmi_sdr_parse_ctx_t sdr_parse_ctx) | ||||
| { | ||||
| 	if (fru_parse_ctx) { | ||||
| 		(*nut_ipmi_fru_parse_close_device_id) (fru_parse_ctx); | ||||
| 		(*nut_ipmi_fru_parse_ctx_destroy) (fru_parse_ctx); | ||||
| 	} | ||||
| 
 | ||||
| 	if (sdr_cache_ctx) { | ||||
| 		(*nut_ipmi_sdr_cache_ctx_destroy) (sdr_cache_ctx); | ||||
| 	} | ||||
| 
 | ||||
| 	if (sdr_parse_ctx) { | ||||
| 		(*nut_ipmi_sdr_parse_ctx_destroy) (sdr_parse_ctx); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /* Return 1 if supported, 0 otherwise */ | ||||
| int is_ipmi_device_supported(ipmi_ctx_t ipmi_ctx, int ipmi_id) | ||||
| { | ||||
| 	int ret = -1; | ||||
| 	unsigned int area_type = 0; | ||||
| 	unsigned int area_length = 0; | ||||
| 	uint8_t areabuf[IPMI_FRU_PARSE_AREA_SIZE_MAX+1]; | ||||
| 	ipmi_fru_parse_ctx_t fru_parse_ctx = NULL; | ||||
| 	ipmi_sdr_cache_ctx_t sdr_cache_ctx = NULL; | ||||
| 	ipmi_sdr_parse_ctx_t sdr_parse_ctx = NULL; | ||||
| 
 | ||||
| 	/* Parse FRU information */ | ||||
| 	if (!(fru_parse_ctx = (*nut_ipmi_fru_parse_ctx_create) (ipmi_ctx))) | ||||
| 	{ | ||||
| 		fprintf(stderr, "ipmi_fru_parse_ctx_create()\n"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 	   | ||||
| 	/* lots of motherboards calculate checksums incorrectly */ | ||||
| 	if ((*nut_ipmi_fru_parse_ctx_set_flags) (fru_parse_ctx, IPMI_FRU_PARSE_FLAGS_SKIP_CHECKSUM_CHECKS) < 0) | ||||
| 	{ | ||||
| 		nut_freeipmi_cleanup(fru_parse_ctx, sdr_cache_ctx, sdr_parse_ctx); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	if ((*nut_ipmi_fru_parse_open_device_id) (fru_parse_ctx, ipmi_id) < 0) | ||||
| 	{ | ||||
| 		nut_freeipmi_cleanup(fru_parse_ctx, sdr_cache_ctx, sdr_parse_ctx); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	do | ||||
| 	{ | ||||
| 		/* clear fields */ | ||||
| 		area_type = 0; | ||||
| 		area_length = 0; | ||||
| 		memset (areabuf, '\0', IPMI_FRU_PARSE_AREA_SIZE_MAX + 1); | ||||
| 
 | ||||
| 		/* parse FRU buffer */ | ||||
| 		if ((*nut_ipmi_fru_parse_read_data_area) (fru_parse_ctx, | ||||
| 											&area_type, | ||||
| 											&area_length, | ||||
| 											areabuf, | ||||
| 											IPMI_FRU_PARSE_AREA_SIZE_MAX) < 0) | ||||
| 		{ | ||||
| 			nut_freeipmi_cleanup(fru_parse_ctx, sdr_cache_ctx, sdr_parse_ctx); | ||||
| 			return 0; | ||||
| 		} | ||||
| 
 | ||||
| 		if (area_length) | ||||
| 		{ | ||||
| 			if (area_type == IPMI_FRU_PARSE_AREA_TYPE_MULTIRECORD_POWER_SUPPLY_INFORMATION) | ||||
| 			{ | ||||
| 				/* Found a POWER_SUPPLY record */ | ||||
| 				nut_freeipmi_cleanup(fru_parse_ctx, sdr_cache_ctx, sdr_parse_ctx); | ||||
| 				return 1; | ||||
| 			} | ||||
| 		} | ||||
| 	} while ((ret = (*nut_ipmi_fru_parse_next) (fru_parse_ctx)) == 1); | ||||
| 
 | ||||
| 	/* No need for further errors checking */ | ||||
| 	nut_freeipmi_cleanup(fru_parse_ctx, sdr_cache_ctx, sdr_parse_ctx); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /* return NULL on error */ | ||||
| nutscan_device_t *  nutscan_scan_ipmi() | ||||
| { | ||||
| 	ipmi_ctx_t ipmi_ctx = NULL; | ||||
| 	nutscan_device_t * nut_dev = NULL; | ||||
| 	nutscan_device_t * current_nut_dev = NULL; | ||||
| 	int ret = -1; | ||||
| 	int ipmi_id = 0; | ||||
| 	char port_id[10]; | ||||
| 
 | ||||
| 	if( !nutscan_avail_ipmi ) { | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Initialize the FreeIPMI library. */ | ||||
| 	if (!(ipmi_ctx = (*nut_ipmi_ctx_create) ())) | ||||
| 	{ | ||||
| 		/* we have to force cleanup, since exit handler is not yet installed */ | ||||
| 		fprintf(stderr, "ipmi_ctx_create\n"); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	if ((ret = (*nut_ipmi_ctx_find_inband) (ipmi_ctx, | ||||
| 				NULL, | ||||
| 				0, /* don't disable auto-probe */ | ||||
| 				0, | ||||
| 				0, | ||||
| 				NULL, | ||||
| 				0, /* workaround flags, none by default */ | ||||
| 				0  /* flags */ | ||||
| 				)) < 0) | ||||
| 	{ | ||||
| 		fprintf(stderr, "ipmi_ctx_find_inband: %s\n", | ||||
| 			(*nut_ipmi_ctx_errormsg) (ipmi_ctx)); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	if (!ret) | ||||
| 	{ | ||||
| 		/* No local IPMI device detected */ | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Loop through all possible devices */ | ||||
| 	for (ipmi_id = 0 ; ipmi_id <= IPMI_FRU_DEVICE_ID_MAX ; ipmi_id++) { | ||||
| 
 | ||||
| 		if (is_ipmi_device_supported(ipmi_ctx, ipmi_id)) { | ||||
| 
 | ||||
| 			if ( (nut_dev = nutscan_new_device()) == NULL ) { | ||||
| 				fprintf(stderr,"Memory allocation error\n"); | ||||
| 				nutscan_free_device(current_nut_dev); | ||||
| 				break; | ||||
| 			} | ||||
| 
 | ||||
| 			/* Fill the device structure (sufficient with driver and port) */ | ||||
| 			nut_dev->type = TYPE_IPMI; | ||||
| 			nut_dev->driver = strdup(NUT_IPMI_DRV_NAME); | ||||
| 			sprintf(port_id, "id%x", ipmi_id); | ||||
| 			nut_dev->port = strdup(port_id); | ||||
| 
 | ||||
| 			current_nut_dev = nutscan_add_device_to_device( | ||||
| 							current_nut_dev, | ||||
| 							nut_dev); | ||||
| 
 | ||||
| 			memset (port_id, 0, sizeof(port_id)); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Final cleanup */ | ||||
| 	if (ipmi_ctx) { | ||||
| 		(*nut_ipmi_ctx_close) (ipmi_ctx); | ||||
| 		(*nut_ipmi_ctx_destroy) (ipmi_ctx); | ||||
| 	} | ||||
| 
 | ||||
| 	return current_nut_dev; | ||||
| } | ||||
| #else /* WITH_IPMI */ | ||||
| /* stub function */ | ||||
| nutscan_device_t *  nutscan_scan_ipmi() | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| #endif /* HAVE_FREEIPMI_FREEIPMI_H */ | ||||
| #endif /* WITH_IPMI */ | ||||
|  |  | |||
|  | @ -122,7 +122,6 @@ nutscan_device_t * nutscan_scan_nut(const char* startIP, const char* stopIP, con | |||
| 	int change_action_handler = 0; | ||||
| 	int i; | ||||
| 	struct scan_nut_arg *nut_arg; | ||||
| 
 | ||||
| #ifdef HAVE_PTHREAD | ||||
| 	pthread_t thread; | ||||
| 	pthread_t * thread_array = NULL; | ||||
|  | @ -131,6 +130,10 @@ nutscan_device_t * nutscan_scan_nut(const char* startIP, const char* stopIP, con | |||
| 	pthread_mutex_init(&dev_mutex,NULL); | ||||
| #endif | ||||
| 
 | ||||
|         if( !nutscan_avail_nut ) { | ||||
|                 return NULL; | ||||
|         } | ||||
| 
 | ||||
| 	/* Ignore SIGPIPE if the caller hasn't set a handler for it yet */ | ||||
| 	if( sigaction(SIGPIPE, NULL, &oldact) == 0 ) { | ||||
| 		if( oldact.sa_handler == SIG_DFL ) { | ||||
|  |  | |||
|  | @ -18,15 +18,14 @@ | |||
|  */ | ||||
| 
 | ||||
| #include "common.h" | ||||
| 
 | ||||
| #ifdef HAVE_NET_SNMP_NET_SNMP_CONFIG_H | ||||
| 
 | ||||
| #include "nut-scan.h" | ||||
| 
 | ||||
| #ifdef WITH_SNMP | ||||
| 
 | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <ltdl.h> | ||||
| 
 | ||||
| /* workaround for buggy Net-SNMP config
 | ||||
|  * from drivers/snmp-ups.h */ | ||||
|  | @ -63,18 +62,196 @@ | |||
| static nutscan_device_t * dev_ret = NULL; | ||||
| #ifdef HAVE_PTHREAD | ||||
| static pthread_mutex_t dev_mutex; | ||||
| static pthread_mutex_t lib_mutex; | ||||
| static pthread_t * thread_array = NULL; | ||||
| static int thread_count = 0; | ||||
| #endif | ||||
| long g_usec_timeout ; | ||||
| 
 | ||||
| /* dynamic link library stuff */ | ||||
| static lt_dlhandle dl_handle = NULL; | ||||
| static const char *dl_error = NULL; | ||||
| 
 | ||||
| static void (*nut_init_snmp)(const char *type); | ||||
| static void (*nut_snmp_sess_init)(netsnmp_session * session); | ||||
| static void * (*nut_snmp_sess_open)(struct snmp_session *session); | ||||
| static int (*nut_snmp_sess_close)(void *handle); | ||||
| static struct snmp_session * (*nut_snmp_sess_session)(void *handle);  | ||||
| static void * (*nut_snmp_parse_oid)(const char *input, oid *objid, | ||||
| 		size_t *objidlen); | ||||
| static struct snmp_pdu * (*nut_snmp_pdu_create) (int command ); | ||||
| netsnmp_variable_list * (*nut_snmp_add_null_var)(netsnmp_pdu *pdu, | ||||
| 			const oid *objid, size_t objidlen); | ||||
| static int (*nut_snmp_sess_synch_response) (void *sessp, netsnmp_pdu *pdu, | ||||
| 			netsnmp_pdu **response); | ||||
| static int (*nut_snmp_oid_compare) (const oid *in_name1, size_t len1, | ||||
| 			const oid *in_name2, size_t len2); | ||||
| static void (*nut_snmp_free_pdu) (netsnmp_pdu *pdu); | ||||
| static int (*nut_generate_Ku)(const oid * hashtype, u_int hashtype_len, | ||||
| 			u_char * P, size_t pplen, u_char * Ku, size_t * kulen); | ||||
| static const char * (*nut_snmp_api_errstring) (int snmp_errnumber); | ||||
| static int (*nut_snmp_errno); | ||||
| static oid * (*nut_usmAESPrivProtocol); | ||||
| static oid * (*nut_usmHMACMD5AuthProtocol); | ||||
| static oid * (*nut_usmHMACSHA1AuthProtocol); | ||||
| static oid * (*nut_usmDESPrivProtocol); | ||||
| 
 | ||||
| /* return 0 on error */ | ||||
| int nutscan_load_snmp_library() | ||||
| { | ||||
| #ifdef HAVE_PTHREAD | ||||
| 	pthread_mutex_lock(&lib_mutex); | ||||
| #endif | ||||
| 
 | ||||
| 	if( dl_handle != NULL ) { | ||||
| 		/* if previous init failed */ | ||||
| 		if( dl_handle == (void *)1 ) { | ||||
| 			return 0; | ||||
| 		} | ||||
| 		/* init has already been done */ | ||||
| 		return 1; | ||||
| 	} | ||||
| 
 | ||||
|         if( lt_dlinit() != 0 ) { | ||||
|                 fprintf(stderr, "Error initializing lt_init\n"); | ||||
|                 return 0; | ||||
|         } | ||||
| 
 | ||||
| 	dl_handle = lt_dlopenext("libnetsnmp"); | ||||
| 	if (!dl_handle) { | ||||
| 		dl_error = lt_dlerror(); | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	lt_dlerror();	/* Clear any existing error */ | ||||
| 	*(void **) (&nut_init_snmp) = lt_dlsym(dl_handle, "init_snmp"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_sess_init) = lt_dlsym(dl_handle, | ||||
| 							"snmp_sess_init"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_sess_open) = lt_dlsym(dl_handle, | ||||
| 							"snmp_sess_open"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_sess_close) = lt_dlsym(dl_handle, | ||||
| 							"snmp_sess_close"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_sess_session) = lt_dlsym(dl_handle, | ||||
| 							"snmp_sess_session"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_parse_oid) = lt_dlsym(dl_handle, | ||||
| 							"snmp_parse_oid"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_pdu_create) = lt_dlsym(dl_handle, | ||||
| 							"snmp_pdu_create"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_add_null_var) = lt_dlsym(dl_handle, | ||||
| 							"snmp_add_null_var"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_sess_synch_response) = lt_dlsym(dl_handle, | ||||
| 						"snmp_sess_synch_response"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_oid_compare) = lt_dlsym(dl_handle, | ||||
| 							"snmp_oid_compare"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_free_pdu) = lt_dlsym(dl_handle,"snmp_free_pdu"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_generate_Ku) = lt_dlsym(dl_handle, "generate_Ku"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_api_errstring) = lt_dlsym(dl_handle, | ||||
| 							"snmp_api_errstring"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_snmp_errno) = lt_dlsym(dl_handle, "snmp_errno"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_usmAESPrivProtocol) = lt_dlsym(dl_handle, | ||||
| 							"usmAESPrivProtocol"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_usmHMACMD5AuthProtocol) = lt_dlsym(dl_handle, | ||||
| 						"usmHMACMD5AuthProtocol"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_usmHMACSHA1AuthProtocol) = lt_dlsym(dl_handle, | ||||
| 						"usmHMACSHA1AuthProtocol"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	*(void **) (&nut_usmDESPrivProtocol) = lt_dlsym(dl_handle, | ||||
| 						"usmDESPrivProtocol"); | ||||
| 	if ((dl_error = lt_dlerror()) != NULL)  { | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| #ifdef HAVE_PTHREAD | ||||
| 	pthread_mutex_unlock(&dev_mutex); | ||||
| #endif | ||||
| 	return 1; | ||||
| err: | ||||
| 	fprintf(stderr, "%s\n", dl_error); | ||||
| 	dl_handle = (void *)1; | ||||
| #ifdef HAVE_PTHREAD | ||||
| 	pthread_mutex_unlock(&dev_mutex); | ||||
| #endif | ||||
| 	return 0; | ||||
| } | ||||
| /* end of dynamic link library stuff */ | ||||
| 
 | ||||
| static void scan_snmp_add_device(nutscan_snmp_t * sec, struct snmp_pdu *response,char * mib) | ||||
| { | ||||
| 	nutscan_device_t * dev = NULL; | ||||
| 	struct snmp_session * session; | ||||
| 	char * buf; | ||||
| 
 | ||||
| 	session = snmp_sess_session(sec->handle); | ||||
| 	session = (*nut_snmp_sess_session)(sec->handle); | ||||
| 	if(session == NULL) { | ||||
| 		return; | ||||
| 	} | ||||
| 	/* SNMP device found */ | ||||
| 	dev = nutscan_new_device(); | ||||
| 	dev->type = TYPE_SNMP; | ||||
|  | @ -147,21 +324,21 @@ static struct snmp_pdu * scan_snmp_get_manufacturer(char* oid_str,void* handle) | |||
| 
 | ||||
| 	/* create and send request. */ | ||||
| 	name_len = MAX_OID_LEN; | ||||
| 	if (!snmp_parse_oid(oid_str, name, &name_len)) { | ||||
| 	if (!(*nut_snmp_parse_oid)(oid_str, name, &name_len)) { | ||||
| 		index++; | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	pdu = snmp_pdu_create(SNMP_MSG_GET); | ||||
| 	pdu = (*nut_snmp_pdu_create)(SNMP_MSG_GET); | ||||
| 
 | ||||
| 	if (pdu == NULL) { | ||||
| 		index++; | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	snmp_add_null_var(pdu, name, name_len); | ||||
| 	(*nut_snmp_add_null_var)(pdu, name, name_len); | ||||
| 
 | ||||
| 	status = snmp_sess_synch_response(handle,pdu, &response); | ||||
| 	status = (*nut_snmp_sess_synch_response)(handle,pdu, &response); | ||||
| 	if( response == NULL ) { | ||||
| 		index++; | ||||
| 		return NULL; | ||||
|  | @ -170,11 +347,11 @@ static struct snmp_pdu * scan_snmp_get_manufacturer(char* oid_str,void* handle) | |||
| 	if(status!=STAT_SUCCESS||response->errstat!=SNMP_ERR_NOERROR|| | ||||
| 			response->variables == NULL || | ||||
| 			response->variables->name == NULL || | ||||
| 			snmp_oid_compare(response->variables->name, | ||||
| 			(*nut_snmp_oid_compare)(response->variables->name, | ||||
| 				response->variables->name_length, | ||||
| 				name, name_len) != 0 ||  | ||||
| 			response->variables->val.string == NULL ) { | ||||
| 		snmp_free_pdu(response); | ||||
| 		(*nut_snmp_free_pdu)(response); | ||||
| 		index++; | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | @ -198,7 +375,7 @@ static void try_all_oid(void * arg) | |||
| 
 | ||||
| 		scan_snmp_add_device(sec,response,snmp_device_table[index].mib); | ||||
| 
 | ||||
| 		snmp_free_pdu(response); | ||||
| 		(*nut_snmp_free_pdu)(response); | ||||
| 		response = NULL; | ||||
| 
 | ||||
| 		index++; | ||||
|  | @ -207,7 +384,7 @@ static void try_all_oid(void * arg) | |||
| 
 | ||||
| static int init_session(struct snmp_session * snmp_sess, nutscan_snmp_t * sec) | ||||
| { | ||||
| 	snmp_sess_init(snmp_sess); | ||||
| 	(*nut_snmp_sess_init)(snmp_sess); | ||||
| 
 | ||||
| 	snmp_sess->peername = sec->peername; | ||||
| 
 | ||||
|  | @ -279,16 +456,17 @@ static int init_session(struct snmp_session * snmp_sess, nutscan_snmp_t * sec) | |||
|                	snmp_sess->securityAuthKeyLen = USM_AUTH_KU_LEN; | ||||
| 
 | ||||
| 		/* default to MD5 */ | ||||
| 		snmp_sess->securityAuthProto = usmHMACMD5AuthProtocol; | ||||
| 		snmp_sess->securityAuthProtoLen =sizeof(usmHMACMD5AuthProtocol)/ | ||||
| 							sizeof(oid); | ||||
| 		snmp_sess->securityAuthProto = (*nut_usmHMACMD5AuthProtocol); | ||||
| 		snmp_sess->securityAuthProtoLen = | ||||
| 				sizeof((*nut_usmHMACMD5AuthProtocol))/ | ||||
| 				sizeof(oid); | ||||
| 
 | ||||
| 		if( sec->authProtocol ) { | ||||
| 			if (strcmp(sec->authProtocol, "SHA") == 0) { | ||||
| 				snmp_sess->securityAuthProto = | ||||
| 							usmHMACSHA1AuthProtocol; | ||||
| 						(*nut_usmHMACSHA1AuthProtocol); | ||||
| 				snmp_sess->securityAuthProtoLen = | ||||
| 					sizeof(usmHMACSHA1AuthProtocol)/ | ||||
| 					sizeof((*nut_usmHMACSHA1AuthProtocol))/ | ||||
| 					sizeof(oid); | ||||
| 			} | ||||
| 			else { | ||||
|  | @ -303,7 +481,7 @@ static int init_session(struct snmp_session * snmp_sess, nutscan_snmp_t * sec) | |||
| 
 | ||||
| 		/* set the authentication key to a MD5/SHA1 hashed version of
 | ||||
| 		 * our passphrase (must be at least 8 characters long) */ | ||||
| 		if (generate_Ku(snmp_sess->securityAuthProto, | ||||
| 		if ((*nut_generate_Ku)(snmp_sess->securityAuthProto, | ||||
| 					snmp_sess->securityAuthProtoLen, | ||||
| 					(u_char *) sec->authPassword, | ||||
| 					strlen(sec->authPassword), | ||||
|  | @ -321,15 +499,17 @@ static int init_session(struct snmp_session * snmp_sess, nutscan_snmp_t * sec) | |||
| 		} | ||||
| 
 | ||||
| 		/* default to DES */ | ||||
| 		snmp_sess->securityPrivProto=usmDESPrivProtocol; | ||||
| 		snmp_sess->securityPrivProto=(*nut_usmDESPrivProtocol); | ||||
| 		snmp_sess->securityPrivProtoLen = | ||||
| 			sizeof(usmDESPrivProtocol)/sizeof(oid); | ||||
| 			sizeof((*nut_usmDESPrivProtocol))/sizeof(oid); | ||||
| 
 | ||||
| 		if( sec->privProtocol ) { | ||||
| 			if (strcmp(sec->privProtocol, "AES") == 0) { | ||||
| 				snmp_sess->securityPrivProto=usmAESPrivProtocol; | ||||
| 				snmp_sess->securityPrivProto= | ||||
| 						(*nut_usmAESPrivProtocol); | ||||
| 				snmp_sess->securityPrivProtoLen =  | ||||
| 					sizeof(usmAESPrivProtocol)/sizeof(oid); | ||||
| 					sizeof((*nut_usmAESPrivProtocol))/ | ||||
| 					sizeof(oid); | ||||
| 			} | ||||
| 			else { | ||||
| 				if (strcmp(sec->privProtocol, "DES") != 0) { | ||||
|  | @ -344,7 +524,7 @@ static int init_session(struct snmp_session * snmp_sess, nutscan_snmp_t * sec) | |||
| 		/* set the private key to a MD5/SHA hashed version of
 | ||||
| 		 * our passphrase (must be at least 8 characters long) */ | ||||
| 		snmp_sess->securityPrivKeyLen = USM_PRIV_KU_LEN; | ||||
| 		if (generate_Ku(snmp_sess->securityAuthProto, | ||||
| 		if ((*nut_generate_Ku)(snmp_sess->securityAuthProto, | ||||
| 					snmp_sess->securityAuthProtoLen, | ||||
| 					(u_char *) sec->privPassword, | ||||
| 					strlen(sec->privPassword), | ||||
|  | @ -365,7 +545,7 @@ static void * try_SysOID(void * arg) | |||
| { | ||||
| 	struct snmp_session snmp_sess; | ||||
| 	void * handle; | ||||
| 	struct snmp_pdu *pdu, *response = NULL; | ||||
| 	struct snmp_pdu *pdu, *response = NULL, *resp = NULL; | ||||
|         oid name[MAX_OID_LEN]; | ||||
|         size_t name_len = MAX_OID_LEN; | ||||
| 	nutscan_snmp_t * sec = (nutscan_snmp_t *)arg; | ||||
|  | @ -381,7 +561,7 @@ static void * try_SysOID(void * arg) | |||
| 	snmp_sess.timeout = g_usec_timeout; | ||||
| 
 | ||||
| 	/* Open the session */ | ||||
| 	handle = snmp_sess_open(&snmp_sess); /* establish the session */ | ||||
| 	handle = (*nut_snmp_sess_open)(&snmp_sess); /* establish the session */ | ||||
| 	if (handle == NULL) { | ||||
| 		fprintf(stderr,"Failed to open SNMP session for %s.\n", | ||||
| 			sec->peername); | ||||
|  | @ -389,24 +569,24 @@ static void * try_SysOID(void * arg) | |||
| 	} | ||||
| 
 | ||||
| 	/* create and send request. */ | ||||
| 	if (!snmp_parse_oid(SysOID, name, &name_len)) { | ||||
| 	if (!(*nut_snmp_parse_oid)(SysOID, name, &name_len)) { | ||||
| 		fprintf(stderr,"SNMP errors: %s\n", | ||||
| 				snmp_api_errstring(snmp_errno)); | ||||
| 		snmp_sess_close(handle); | ||||
| 				(*nut_snmp_api_errstring)((*nut_snmp_errno))); | ||||
| 		(*nut_snmp_sess_close)(handle); | ||||
| 		goto try_SysOID_free; | ||||
| 	} | ||||
| 
 | ||||
| 	pdu = snmp_pdu_create(SNMP_MSG_GET); | ||||
| 	pdu = (*nut_snmp_pdu_create)(SNMP_MSG_GET); | ||||
| 
 | ||||
| 	if (pdu == NULL) { | ||||
| 		fprintf(stderr,"Not enough memory\n"); | ||||
| 		snmp_sess_close(handle); | ||||
| 		(*nut_snmp_sess_close)(handle); | ||||
| 		goto try_SysOID_free; | ||||
| 	} | ||||
| 
 | ||||
| 	snmp_add_null_var(pdu, name, name_len); | ||||
| 	(*nut_snmp_add_null_var)(pdu, name, name_len); | ||||
| 
 | ||||
| 	snmp_sess_synch_response(handle, | ||||
| 	(*nut_snmp_sess_synch_response)(handle, | ||||
| 			pdu, &response); | ||||
| 
 | ||||
| 	if (response) { | ||||
|  | @ -424,25 +604,27 @@ static void * try_SysOID(void * arg) | |||
| 					continue; | ||||
| 				} | ||||
| 				name_len = MAX_OID_LEN; | ||||
| 				if (!snmp_parse_oid( | ||||
| 				if (!(*nut_snmp_parse_oid)( | ||||
| 					snmp_device_table[index].sysoid, | ||||
| 					name, &name_len)) { | ||||
| 					index++; | ||||
| 					continue; | ||||
| 				} | ||||
| 
 | ||||
| 				if ( snmp_oid_compare( | ||||
| 				if ( (*nut_snmp_oid_compare)( | ||||
| 					response->variables->val.objid, | ||||
| 					response->variables->val_len/sizeof(oid), | ||||
| 					name, name_len) == 0 ) { | ||||
| 					/* we have found a relevent sysoid */ | ||||
| 					snmp_free_pdu(response); | ||||
| 					response = scan_snmp_get_manufacturer( | ||||
| 					resp = scan_snmp_get_manufacturer( | ||||
| 						snmp_device_table[index].oid, | ||||
| 						handle); | ||||
| 					scan_snmp_add_device(sec,response, | ||||
| 						snmp_device_table[index].mib); | ||||
| 					sysoid_found = 1; | ||||
| 					if( resp != NULL ) { | ||||
| 						scan_snmp_add_device(sec,resp, | ||||
| 							snmp_device_table[index].mib); | ||||
| 						sysoid_found = 1; | ||||
| 						(*nut_snmp_free_pdu)(resp); | ||||
| 					} | ||||
| 				} | ||||
| 				index++; | ||||
| 			} | ||||
|  | @ -453,11 +635,11 @@ static void * try_SysOID(void * arg) | |||
| 			try_all_oid(sec); | ||||
| 		} | ||||
| 
 | ||||
| 		snmp_free_pdu(response); | ||||
| 		(*nut_snmp_free_pdu)(response); | ||||
| 		response = NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	snmp_sess_close(handle); | ||||
| 	(*nut_snmp_sess_close)(handle); | ||||
| 
 | ||||
| try_SysOID_free: | ||||
| 	if( sec->peername ) { | ||||
|  | @ -478,12 +660,18 @@ nutscan_device_t * nutscan_scan_snmp(const char * start_ip, const char * stop_ip | |||
| 	pthread_t thread; | ||||
| 
 | ||||
| 	pthread_mutex_init(&dev_mutex,NULL); | ||||
| 	pthread_mutex_init(&lib_mutex,NULL); | ||||
| #endif | ||||
| 
 | ||||
|         if( !nutscan_avail_snmp ) { | ||||
|                 return NULL; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| 	g_usec_timeout = usec_timeout; | ||||
| 
 | ||||
| 	/* Initialize the SNMP library */ | ||||
| 	init_snmp("nut-scanner"); | ||||
| 	(*nut_init_snmp)("nut-scanner"); | ||||
| 
 | ||||
| 	ip_str = nutscan_ip_iter_init(&ip, start_ip, stop_ip); | ||||
| 
 | ||||
|  | @ -515,6 +703,11 @@ nutscan_device_t * nutscan_scan_snmp(const char * start_ip, const char * stop_ip | |||
| 
 | ||||
| 	return dev_ret; | ||||
| } | ||||
| #endif /* HAVE_NET_SNMP_NET_SNMP_CONFIG_H */ | ||||
| #else /* WITH_SNMP */ | ||||
| nutscan_device_t * nutscan_scan_snmp(const char * start_ip, const char * stop_ip,long usec_timeout, nutscan_snmp_t * sec) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| #endif /* WITH_SNMP */ | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,12 +18,99 @@ | |||
|  */ | ||||
| 
 | ||||
| #include "common.h" | ||||
| #ifdef HAVE_USB_H | ||||
| #include "nut-scan.h" | ||||
| 
 | ||||
| #ifdef WITH_USB | ||||
| #include "upsclient.h" | ||||
| #include "nutscan-usb.h" | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include "nutscan-device.h" | ||||
| #include <ltdl.h> | ||||
| 
 | ||||
| /* dynamic link library stuff */ | ||||
| static lt_dlhandle dl_handle = NULL; | ||||
| static const char *dl_error = NULL; | ||||
| static int (*nut_usb_close)(usb_dev_handle *dev); | ||||
| static int (*nut_usb_find_busses)(void); | ||||
| static char * (*nut_usb_strerror)(void); | ||||
| static void (*nut_usb_init)(void); | ||||
| static int (*nut_usb_get_string_simple)(usb_dev_handle *dev, int index, | ||||
| 		char *buf, size_t buflen); | ||||
| static struct usb_bus * (*nut_usb_busses); | ||||
| static usb_dev_handle * (*nut_usb_open)(struct usb_device *dev); | ||||
| static int (*nut_usb_find_devices)(void); | ||||
| 
 | ||||
| /* return 0 on error */ | ||||
| int nutscan_load_usb_library() | ||||
| { | ||||
|         if( dl_handle != NULL ) { | ||||
|                 /* if previous init failed */ | ||||
|                 if( dl_handle == (void *)1 ) { | ||||
|                         return 0; | ||||
|                 } | ||||
|                 /* init has already been done */ | ||||
|                 return 1; | ||||
|         } | ||||
| 
 | ||||
| 	if( lt_dlinit() != 0 ) { | ||||
| 		fprintf(stderr, "Error initializing lt_init\n"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
|         dl_handle = lt_dlopenext("libusb"); | ||||
|         if (!dl_handle) { | ||||
|                 dl_error = lt_dlerror(); | ||||
|                 goto err; | ||||
|         } | ||||
|         lt_dlerror();      /* Clear any existing error */ | ||||
|         *(void **) (&nut_usb_close) = lt_dlsym(dl_handle, "usb_close"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_usb_find_busses) = lt_dlsym(dl_handle, "usb_find_busses"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_usb_strerror) = lt_dlsym(dl_handle, "usb_strerror"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_usb_init) = lt_dlsym(dl_handle, "usb_init"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_usb_get_string_simple) = lt_dlsym(dl_handle, | ||||
| 						"usb_get_string_simple"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_usb_busses) = lt_dlsym(dl_handle, "usb_busses"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_usb_open) = lt_dlsym(dl_handle, "usb_open"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **)(&nut_usb_find_devices) = lt_dlsym(dl_handle,"usb_find_devices"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         return 1; | ||||
| err: | ||||
|         fprintf(stderr, "%s\n", dl_error); | ||||
|         dl_handle = (void *)1; | ||||
|         return 0; | ||||
| } | ||||
| /* end of dynamic link library stuff */ | ||||
| 
 | ||||
| static char* is_usb_device_supported(usb_device_id_t *usb_device_id_list, | ||||
| 					int dev_VendorID, int dev_ProductID) | ||||
|  | @ -57,12 +144,16 @@ nutscan_device_t * nutscan_scan_usb() | |||
| 	nutscan_device_t * nut_dev = NULL; | ||||
| 	nutscan_device_t * current_nut_dev = NULL; | ||||
| 
 | ||||
| 	/* libusb base init */ | ||||
| 	usb_init(); | ||||
| 	usb_find_busses(); | ||||
| 	usb_find_devices(); | ||||
|         if( !nutscan_avail_usb ) { | ||||
|                 return NULL; | ||||
|         } | ||||
| 
 | ||||
| 	for (bus = usb_busses; bus; bus = bus->next) { | ||||
| 	/* libusb base init */ | ||||
| 	(*nut_usb_init)(); | ||||
| 	(*nut_usb_find_busses)(); | ||||
| 	(*nut_usb_find_devices)(); | ||||
| 
 | ||||
| 	for (bus = (*nut_usb_busses); bus; bus = bus->next) { | ||||
| 		for (dev = bus->devices; dev; dev = dev->next) { | ||||
| 			if ((driver_name = | ||||
| 				is_usb_device_supported(usb_device_table, | ||||
|  | @ -70,17 +161,17 @@ nutscan_device_t * nutscan_scan_usb() | |||
| 					dev->descriptor.idProduct)) != NULL) { | ||||
| 
 | ||||
| 				/* open the device */ | ||||
| 				udev = usb_open(dev); | ||||
| 				udev = (*nut_usb_open)(dev); | ||||
| 				if (!udev) { | ||||
| 					fprintf(stderr,"Failed to open device, \
 | ||||
| 						skipping. (%s)\n", | ||||
| 						usb_strerror()); | ||||
| 						(*nut_usb_strerror)()); | ||||
| 					continue; | ||||
| 				} | ||||
| 
 | ||||
| 				/* get serial number */ | ||||
| 				if (dev->descriptor.iSerialNumber) { | ||||
| 					ret = usb_get_string_simple(udev, | ||||
| 					ret = (*nut_usb_get_string_simple)(udev, | ||||
| 						dev->descriptor.iSerialNumber, | ||||
| 						string, sizeof(string)); | ||||
| 					if (ret > 0) { | ||||
|  | @ -89,7 +180,7 @@ nutscan_device_t * nutscan_scan_usb() | |||
| 				} | ||||
| 				/* get product name */ | ||||
| 				if (dev->descriptor.iProduct) { | ||||
| 					ret = usb_get_string_simple(udev, | ||||
| 					ret = (*nut_usb_get_string_simple)(udev, | ||||
| 						dev->descriptor.iProduct, | ||||
| 						string, sizeof(string)); | ||||
| 					if (ret > 0) { | ||||
|  | @ -99,7 +190,7 @@ nutscan_device_t * nutscan_scan_usb() | |||
| 
 | ||||
| 				/* get vendor name */ | ||||
| 				if (dev->descriptor.iManufacturer) { | ||||
| 					ret = usb_get_string_simple(udev, | ||||
| 					ret = (*nut_usb_get_string_simple)(udev, | ||||
| 						dev->descriptor.iManufacturer,  | ||||
| 						string, sizeof(string)); | ||||
| 					if (ret > 0) { | ||||
|  | @ -157,12 +248,17 @@ nutscan_device_t * nutscan_scan_usb() | |||
| 
 | ||||
| 				memset (string, 0, sizeof(string)); | ||||
| 
 | ||||
| 				usb_close(udev); | ||||
| 				(*nut_usb_close)(udev); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return current_nut_dev; | ||||
| } | ||||
| #endif /* HAVE_USB_H */ | ||||
| #else /* WITH_USB */ | ||||
| nutscan_device_t * nutscan_scan_usb() | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| #endif /* WITH_USB */ | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,16 +18,85 @@ | |||
|  */ | ||||
| 
 | ||||
| #include "common.h" | ||||
| #include "nut-scan.h" | ||||
| #ifdef WITH_NEON | ||||
| #include <netinet/in.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/socket.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netinet/in.h> | ||||
| #include <string.h> | ||||
| #include <stdio.h> | ||||
| #include <sys/select.h> | ||||
| #include <errno.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <ne_xml.h> | ||||
| #include "nutscan-device.h" | ||||
| #include <ltdl.h> | ||||
| 
 | ||||
| /* dynamic link library stuff */ | ||||
| static lt_dlhandle dl_handle = NULL; | ||||
| static const char *dl_error = NULL; | ||||
| 
 | ||||
| static void (*nut_ne_xml_push_handler)(ne_xml_parser *p, | ||||
|                          ne_xml_startelm_cb *startelm, | ||||
|                          ne_xml_cdata_cb *cdata, | ||||
|                          ne_xml_endelm_cb *endelm, | ||||
|                          void *userdata); | ||||
| static void (*nut_ne_xml_destroy)(ne_xml_parser *p); | ||||
| static ne_xml_parser * (*nut_ne_xml_create)(void); | ||||
| static int (*nut_ne_xml_parse)(ne_xml_parser *p, const char *block, size_t len); | ||||
| 
 | ||||
| /* return 0 on error */ | ||||
| int nutscan_load_neon_library() | ||||
| { | ||||
| 
 | ||||
|         if( dl_handle != NULL ) { | ||||
|                 /* if previous init failed */ | ||||
|                 if( dl_handle == (void *)1 ) { | ||||
|                         return 0; | ||||
|                 } | ||||
|                 /* init has already been done */ | ||||
|                 return 1; | ||||
|         } | ||||
| 
 | ||||
|         if( lt_dlinit() != 0 ) { | ||||
|                 fprintf(stderr, "Error initializing lt_init\n"); | ||||
|                 return 0; | ||||
|         } | ||||
| 
 | ||||
|         dl_handle = lt_dlopenext("libneon"); | ||||
|         if (!dl_handle) { | ||||
|                 dl_error = lt_dlerror(); | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         lt_dlerror();      /* Clear any existing error */ | ||||
|         *(void **) (&nut_ne_xml_push_handler) = lt_dlsym(dl_handle, | ||||
| 							"ne_xml_push_handler"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_ne_xml_destroy) = lt_dlsym(dl_handle,"ne_xml_destroy"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_ne_xml_create) = lt_dlsym(dl_handle,"ne_xml_create"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         *(void **) (&nut_ne_xml_parse) = lt_dlsym(dl_handle,"ne_xml_parse"); | ||||
|         if ((dl_error = lt_dlerror()) != NULL)  { | ||||
|                 goto err; | ||||
|         } | ||||
| 
 | ||||
|         return 1; | ||||
| err: | ||||
|         fprintf(stderr, "%s\n", dl_error); | ||||
|         dl_handle = (void *)1; | ||||
|         return 0; | ||||
| } | ||||
| 
 | ||||
| static int startelm_cb(void *userdata, int parent, const char *nspace, const char *name, const char **atts) { | ||||
| 	nutscan_device_t * dev = (nutscan_device_t *)userdata; | ||||
|  | @ -63,6 +132,9 @@ nutscan_device_t * nutscan_scan_xml_http(long usec_timeout) | |||
| 	nutscan_device_t * nut_dev = NULL; | ||||
| 	nutscan_device_t * current_nut_dev = NULL; | ||||
| 
 | ||||
|         if( !nutscan_avail_xml_http ) { | ||||
|                 return NULL; | ||||
|         } | ||||
| 
 | ||||
| 	if((peerSocket = socket(AF_INET, SOCK_DGRAM, 0)) != -1) | ||||
| 	{ | ||||
|  | @ -114,10 +186,12 @@ nutscan_device_t * nutscan_scan_xml_http(long usec_timeout) | |||
| 					continue; | ||||
| 				} | ||||
| 
 | ||||
| 			        if( getnameinfo( | ||||
| 					(struct sockaddr *)&sockAddress, | ||||
|                                		sizeof(struct sockaddr_in),string, | ||||
| 	                                sizeof(string),NULL,0, | ||||
| 					NI_NUMERICHOST) != 0) { | ||||
| 
 | ||||
| 				if( inet_ntop(AF_INET, | ||||
| 						&(sockAddress.sin_addr), | ||||
| 						string,sizeof(buf)) == NULL ) { | ||||
| 					fprintf(stderr, | ||||
| 						"Error converting IP address \
 | ||||
| 						: %d\n",errno); | ||||
|  | @ -133,11 +207,11 @@ nutscan_device_t * nutscan_scan_xml_http(long usec_timeout) | |||
| 
 | ||||
|                                 nut_dev->type = TYPE_XML; | ||||
| 				/* Try to read device type */ | ||||
| 				ne_xml_parser   *parser = ne_xml_create(); | ||||
| 				ne_xml_push_handler(parser, startelm_cb, NULL, | ||||
| 								NULL, nut_dev); | ||||
| 				ne_xml_parse(parser, buf, strlen(buf)); | ||||
| 				ne_xml_destroy(parser); | ||||
| 				ne_xml_parser *parser = (*nut_ne_xml_create)(); | ||||
| 				(*nut_ne_xml_push_handler)(parser, startelm_cb, | ||||
| 							NULL, NULL, nut_dev); | ||||
| 				(*nut_ne_xml_parse)(parser, buf, strlen(buf)); | ||||
| 				(*nut_ne_xml_destroy)(parser); | ||||
| 
 | ||||
| 				nut_dev->driver = strdup("netxml-ups"); | ||||
| 				sprintf(buf,"http://%s",string); | ||||
|  | @ -157,4 +231,9 @@ nutscan_device_t * nutscan_scan_xml_http(long usec_timeout) | |||
| 
 | ||||
| 	return current_nut_dev; | ||||
| } | ||||
| #else /* WITH_NEON */ | ||||
| nutscan_device_t * nutscan_scan_xml_http(long usec_timeout) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| #endif /* WITH_NEON */ | ||||
|  |  | |||
|  | @ -79,7 +79,7 @@ output_file.write( "/* SNMP IDs device table */\n" ) | |||
| output_file.write( "static snmp_device_id_t snmp_device_table[] = {\n" ) | ||||
| 
 | ||||
| for filename in glob.glob('../drivers/*-mib.c'): | ||||
| 	list_of_line = file(filename,'r').read().split(';') | ||||
| 	list_of_line = open(filename,'r').read().split(';') | ||||
| 	for line in list_of_line: | ||||
| 		if "mib2nut_info_t" in line: | ||||
| 			#clean up line | ||||
|  | @ -116,7 +116,7 @@ for filename in glob.glob('../drivers/*-mib.c'): | |||
| 			line = line.rstrip(" ") | ||||
| 			line2 = line.split(" ") | ||||
| 
 | ||||
|  			sysoid = "" | ||||
| 			sysoid = "" | ||||
| 			for elem in line2: | ||||
| 				if elem[0] == "\"": | ||||
| 					clean_elem = re.sub("\"", "", elem) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue