You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1932 lines
70 KiB
1932 lines
70 KiB
12 years ago
|
From 6df63fe455745d8d74010d9ad4f85a30f40b5c08 Mon Sep 17 00:00:00 2001
|
||
|
From: Frederic Bohe <fbohe-guest@alioth.debian.org>
|
||
|
Date: Mon, 10 Sep 2012 13:28:35 +0000
|
||
|
Subject: [PATCH] [nut-scanner] Fix a crash when no start IP is provided.
|
||
|
|
||
|
Fossil-ID: SVN r3722
|
||
|
---
|
||
|
tools/nut-scanner/nut-scanner.c | 2 ++
|
||
|
1 file changed, 2 insertions(+)
|
||
|
|
||
|
diff --git a/tools/nut-scanner/nut-scanner.c b/tools/nut-scanner/nut-scanner.c
|
||
|
index db582be..52e0da7 100644
|
||
|
--- a/tools/nut-scanner/nut-scanner.c
|
||
|
+++ b/tools/nut-scanner/nut-scanner.c
|
||
|
@@ -371,6 +371,7 @@ display_help:
|
||
|
if( allow_snmp && nutscan_avail_snmp ) {
|
||
|
if( start_ip == NULL ) {
|
||
|
printq(quiet,"No start IP, skipping SNMP\n");
|
||
|
+ nutscan_avail_snmp = 0;
|
||
|
}
|
||
|
else {
|
||
|
printq(quiet,"Scanning SNMP bus.\n");
|
||
|
@@ -398,6 +399,7 @@ display_help:
|
||
|
if( allow_oldnut && nutscan_avail_nut) {
|
||
|
if( start_ip == NULL ) {
|
||
|
printq(quiet,"No start IP, skipping NUT bus (old connect method)\n");
|
||
|
+ nutscan_avail_nut = 0;
|
||
|
}
|
||
|
else {
|
||
|
printq(quiet,"Scanning NUT bus (old connect method).\n");
|
||
|
--
|
||
|
1.7.10.2
|
||
|
|
||
|
|
||
|
From dc729c5c3da7efb4632f7d9f7a031108540282d9 Mon Sep 17 00:00:00 2001
|
||
|
From: Arnaud Quette <arnaud.quette@free.fr>
|
||
|
Date: Wed, 19 Sep 2012 19:35:45 +0000
|
||
|
Subject: [PATCH] Support for FreeIPMI 1.1.x and 1.2.x (#2)
|
||
|
|
||
|
Prepare for supporting API changes in FreeIPMI 1.1.x and 1.2.x. This 2nd
|
||
|
patch, which completes [[SVN:3675]], addresses FRU API changes, and removes
|
||
|
code redundancy. This code has been tested with FreeIPMI 0.8.12 and
|
||
|
the latest [[FreeIPMI SVN]] trunk r9505 (reported as 1.2.0.beta2 by pkgconfig)
|
||
|
|
||
|
[[SVN:3675]] = 2012-07-16T13:18:18Z!arnaud.quette@free.fr
|
||
|
|
||
|
Fossil-ID: SVN r3733
|
||
|
---
|
||
|
drivers/nut-libfreeipmi.c | 375 ++++++++++++++---------------------------
|
||
|
m4/nut_check_libfreeipmi.m4 | 1 -
|
||
|
tools/nut-scanner/scan_ipmi.c | 103 +++++++----
|
||
|
3 files changed, 192 insertions(+), 287 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/nut-libfreeipmi.c b/drivers/nut-libfreeipmi.c
|
||
|
index 1539e75..dd06369 100644
|
||
|
--- a/drivers/nut-libfreeipmi.c
|
||
|
+++ b/drivers/nut-libfreeipmi.c
|
||
|
@@ -42,10 +42,12 @@
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include "timehead.h"
|
||
|
+#include "common.h"
|
||
|
#include <freeipmi/freeipmi.h>
|
||
|
#include <ipmi_monitoring.h>
|
||
|
+#if HAVE_FREEIPMI_MONITORING
|
||
|
#include <ipmi_monitoring_bitmasks.h>
|
||
|
-#include "common.h"
|
||
|
+#endif
|
||
|
#include "nut-ipmi.h"
|
||
|
#include "dstate.h"
|
||
|
|
||
|
@@ -57,18 +59,46 @@
|
||
|
|
||
|
/* FreeIPMI contexts and configuration*/
|
||
|
ipmi_ctx_t ipmi_ctx = NULL;
|
||
|
-ipmi_fru_parse_ctx_t fru_parse_ctx = NULL;
|
||
|
ipmi_monitoring_ctx_t mon_ctx = NULL;
|
||
|
struct ipmi_monitoring_ipmi_config ipmi_config;
|
||
|
+
|
||
|
/* SDR management API has changed with 1.1.X and later */
|
||
|
#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
ipmi_sdr_ctx_t sdr_ctx = NULL;
|
||
|
+ ipmi_fru_ctx_t fru_ctx = NULL;
|
||
|
+ #define SDR_PARSE_CTX sdr_ctx
|
||
|
#else
|
||
|
- ipmi_sdr_cache_ctx_t sdr_cache_ctx = NULL;
|
||
|
+ ipmi_sdr_cache_ctx_t sdr_ctx = NULL;
|
||
|
ipmi_sdr_parse_ctx_t sdr_parse_ctx = NULL;
|
||
|
-#ifndef IPMI_SDR_MAX_RECORD_LENGTH
|
||
|
- #define IPMI_SDR_MAX_RECORD_LENGTH IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH
|
||
|
-#endif
|
||
|
+ #define SDR_PARSE_CTX sdr_parse_ctx
|
||
|
+ ipmi_fru_parse_ctx_t fru_ctx = NULL;
|
||
|
+ /* Functions remapping */
|
||
|
+ #define ipmi_sdr_ctx_create ipmi_sdr_cache_ctx_create
|
||
|
+ #define ipmi_sdr_ctx_destroy ipmi_sdr_cache_ctx_destroy
|
||
|
+ #define ipmi_sdr_ctx_errnum ipmi_sdr_cache_ctx_errnum
|
||
|
+ #define ipmi_sdr_ctx_errormsg ipmi_sdr_cache_ctx_errormsg
|
||
|
+ #define ipmi_fru_ctx_create ipmi_fru_parse_ctx_create
|
||
|
+ #define ipmi_fru_ctx_destroy ipmi_fru_parse_ctx_destroy
|
||
|
+ #define ipmi_fru_ctx_set_flags ipmi_fru_parse_ctx_set_flags
|
||
|
+ #define ipmi_fru_ctx_strerror ipmi_fru_parse_ctx_strerror
|
||
|
+ #define ipmi_fru_ctx_errnum ipmi_fru_parse_ctx_errnum
|
||
|
+ #define ipmi_fru_open_device_id ipmi_fru_parse_open_device_id
|
||
|
+ #define ipmi_fru_close_device_id ipmi_fru_parse_close_device_id
|
||
|
+ #define ipmi_fru_ctx_errormsg ipmi_fru_parse_ctx_errormsg
|
||
|
+ #define ipmi_fru_read_data_area ipmi_fru_parse_read_data_area
|
||
|
+ #define ipmi_fru_next ipmi_fru_parse_next
|
||
|
+ #define ipmi_fru_type_length_field_to_string ipmi_fru_parse_type_length_field_to_string
|
||
|
+ #define ipmi_fru_multirecord_power_supply_information ipmi_fru_parse_multirecord_power_supply_information
|
||
|
+ #define ipmi_fru_board_info_area ipmi_fru_parse_board_info_area
|
||
|
+ #define ipmi_fru_field_t ipmi_fru_parse_field_t
|
||
|
+ /* Constants */
|
||
|
+ #define IPMI_SDR_MAX_RECORD_LENGTH IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH
|
||
|
+ #define IPMI_SDR_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST IPMI_SDR_CACHE_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST
|
||
|
+ #define IPMI_FRU_AREA_SIZE_MAX IPMI_FRU_PARSE_AREA_SIZE_MAX
|
||
|
+ #define IPMI_FRU_FLAGS_SKIP_CHECKSUM_CHECKS IPMI_FRU_PARSE_FLAGS_SKIP_CHECKSUM_CHECKS
|
||
|
+ #define IPMI_FRU_AREA_TYPE_BOARD_INFO_AREA IPMI_FRU_PARSE_AREA_TYPE_BOARD_INFO_AREA
|
||
|
+ #define IPMI_FRU_AREA_TYPE_MULTIRECORD_POWER_SUPPLY_INFORMATION IPMI_FRU_PARSE_AREA_TYPE_MULTIRECORD_POWER_SUPPLY_INFORMATION
|
||
|
+ #define IPMI_FRU_AREA_STRING_MAX IPMI_FRU_PARSE_AREA_STRING_MAX
|
||
|
#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
|
||
|
/* FIXME: freeipmi auto selects a cache based on the hostname you are
|
||
|
@@ -78,7 +108,7 @@ struct ipmi_monitoring_ipmi_config ipmi_config;
|
||
|
|
||
|
/* Support functions */
|
||
|
static const char* libfreeipmi_getfield (uint8_t language_code,
|
||
|
- ipmi_fru_parse_field_t *field);
|
||
|
+ ipmi_fru_field_t *field);
|
||
|
|
||
|
static void libfreeipmi_cleanup();
|
||
|
|
||
|
@@ -97,7 +127,7 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev);
|
||
|
int nut_ipmi_open(int ipmi_id, IPMIDevice_t *ipmi_dev)
|
||
|
{
|
||
|
int ret = -1;
|
||
|
- uint8_t areabuf[IPMI_FRU_PARSE_AREA_SIZE_MAX+1];
|
||
|
+ uint8_t areabuf[IPMI_FRU_AREA_SIZE_MAX+1];
|
||
|
unsigned int area_type = 0;
|
||
|
unsigned int area_length = 0;
|
||
|
|
||
|
@@ -134,26 +164,26 @@ int nut_ipmi_open(int ipmi_id, IPMIDevice_t *ipmi_dev)
|
||
|
upsdebugx(1, "FreeIPMI initialized...");
|
||
|
|
||
|
/* Parse FRU information */
|
||
|
- if (!(fru_parse_ctx = ipmi_fru_parse_ctx_create (ipmi_ctx)))
|
||
|
+ if (!(fru_ctx = ipmi_fru_ctx_create (ipmi_ctx)))
|
||
|
{
|
||
|
libfreeipmi_cleanup();
|
||
|
- fatal_with_errno(EXIT_FAILURE, "ipmi_fru_parse_ctx_create()");
|
||
|
+ fatal_with_errno(EXIT_FAILURE, "ipmi_fru_ctx_create()");
|
||
|
}
|
||
|
|
||
|
/* lots of motherboards calculate checksums incorrectly */
|
||
|
- if (ipmi_fru_parse_ctx_set_flags (fru_parse_ctx, IPMI_FRU_PARSE_FLAGS_SKIP_CHECKSUM_CHECKS) < 0)
|
||
|
+ if (ipmi_fru_ctx_set_flags (fru_ctx, IPMI_FRU_FLAGS_SKIP_CHECKSUM_CHECKS) < 0)
|
||
|
{
|
||
|
libfreeipmi_cleanup();
|
||
|
- fatalx(EXIT_FAILURE, "ipmi_fru_parse_ctx_set_flags: %s\n",
|
||
|
- ipmi_fru_parse_ctx_strerror (ipmi_fru_parse_ctx_errnum (fru_parse_ctx)));
|
||
|
+ fatalx(EXIT_FAILURE, "ipmi_fru_ctx_set_flags: %s\n",
|
||
|
+ ipmi_fru_ctx_strerror (ipmi_fru_ctx_errnum (fru_ctx)));
|
||
|
}
|
||
|
|
||
|
/* Now open the requested (local) PSU */
|
||
|
- if (ipmi_fru_parse_open_device_id (fru_parse_ctx, ipmi_id) < 0)
|
||
|
+ if (ipmi_fru_open_device_id (fru_ctx, ipmi_id) < 0)
|
||
|
{
|
||
|
libfreeipmi_cleanup();
|
||
|
- fatalx(EXIT_FAILURE, "ipmi_fru_parse_open_device_id: %s\n",
|
||
|
- ipmi_fru_parse_ctx_errormsg (fru_parse_ctx));
|
||
|
+ fatalx(EXIT_FAILURE, "ipmi_fru_open_device_id: %s\n",
|
||
|
+ ipmi_fru_ctx_errormsg (fru_ctx));
|
||
|
}
|
||
|
|
||
|
/* Set IPMI identifier */
|
||
|
@@ -164,19 +194,19 @@ int nut_ipmi_open(int ipmi_id, IPMIDevice_t *ipmi_dev)
|
||
|
/* clear fields */
|
||
|
area_type = 0;
|
||
|
area_length = 0;
|
||
|
- memset (areabuf, '\0', IPMI_FRU_PARSE_AREA_SIZE_MAX + 1);
|
||
|
+ memset (areabuf, '\0', IPMI_FRU_AREA_SIZE_MAX + 1);
|
||
|
|
||
|
/* parse FRU buffer */
|
||
|
- if (ipmi_fru_parse_read_data_area (fru_parse_ctx,
|
||
|
+ if (ipmi_fru_read_data_area (fru_ctx,
|
||
|
&area_type,
|
||
|
&area_length,
|
||
|
areabuf,
|
||
|
- IPMI_FRU_PARSE_AREA_SIZE_MAX) < 0)
|
||
|
+ IPMI_FRU_AREA_SIZE_MAX) < 0)
|
||
|
{
|
||
|
libfreeipmi_cleanup();
|
||
|
fatal_with_errno(EXIT_FAILURE,
|
||
|
- "ipmi_fru_parse_open_device_id: %s\n",
|
||
|
- ipmi_fru_parse_ctx_errormsg (fru_parse_ctx));
|
||
|
+ "ipmi_fru_read_data_area: %s\n",
|
||
|
+ ipmi_fru_ctx_errormsg (fru_ctx));
|
||
|
}
|
||
|
|
||
|
if (area_length)
|
||
|
@@ -184,7 +214,7 @@ int nut_ipmi_open(int ipmi_id, IPMIDevice_t *ipmi_dev)
|
||
|
switch (area_type)
|
||
|
{
|
||
|
/* get generic board information */
|
||
|
- case IPMI_FRU_PARSE_AREA_TYPE_BOARD_INFO_AREA:
|
||
|
+ case IPMI_FRU_AREA_TYPE_BOARD_INFO_AREA:
|
||
|
|
||
|
if(libfreeipmi_get_board_info (areabuf, area_length,
|
||
|
ipmi_dev) < 0)
|
||
|
@@ -193,7 +223,7 @@ int nut_ipmi_open(int ipmi_id, IPMIDevice_t *ipmi_dev)
|
||
|
}
|
||
|
break;
|
||
|
/* get specific PSU information */
|
||
|
- case IPMI_FRU_PARSE_AREA_TYPE_MULTIRECORD_POWER_SUPPLY_INFORMATION:
|
||
|
+ case IPMI_FRU_AREA_TYPE_MULTIRECORD_POWER_SUPPLY_INFORMATION:
|
||
|
|
||
|
if(libfreeipmi_get_psu_info (areabuf, area_length, ipmi_dev) < 0)
|
||
|
{
|
||
|
@@ -205,13 +235,13 @@ int nut_ipmi_open(int ipmi_id, IPMIDevice_t *ipmi_dev)
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
- } while ((ret = ipmi_fru_parse_next (fru_parse_ctx)) == 1);
|
||
|
+ } while ((ret = ipmi_fru_next (fru_ctx)) == 1);
|
||
|
|
||
|
/* check for errors */
|
||
|
if (ret < 0) {
|
||
|
libfreeipmi_cleanup();
|
||
|
- fatal_with_errno(EXIT_FAILURE, "ipmi_fru_parse_next: %s",
|
||
|
- ipmi_fru_parse_ctx_errormsg (fru_parse_ctx));
|
||
|
+ fatal_with_errno(EXIT_FAILURE, "ipmi_fru_next: %s",
|
||
|
+ ipmi_fru_ctx_errormsg (fru_ctx));
|
||
|
}
|
||
|
else {
|
||
|
/* Get all related sensors information */
|
||
|
@@ -232,25 +262,25 @@ void nut_ipmi_close(void)
|
||
|
}
|
||
|
|
||
|
static const char* libfreeipmi_getfield (uint8_t language_code,
|
||
|
- ipmi_fru_parse_field_t *field)
|
||
|
+ ipmi_fru_field_t *field)
|
||
|
{
|
||
|
- static char strbuf[IPMI_FRU_PARSE_AREA_STRING_MAX + 1];
|
||
|
- unsigned int strbuflen = IPMI_FRU_PARSE_AREA_STRING_MAX;
|
||
|
+ static char strbuf[IPMI_FRU_AREA_STRING_MAX + 1];
|
||
|
+ unsigned int strbuflen = IPMI_FRU_AREA_STRING_MAX;
|
||
|
|
||
|
if (!field->type_length_field_length)
|
||
|
return NULL;
|
||
|
|
||
|
- memset (strbuf, '\0', IPMI_FRU_PARSE_AREA_STRING_MAX + 1);
|
||
|
+ memset (strbuf, '\0', IPMI_FRU_AREA_STRING_MAX + 1);
|
||
|
|
||
|
- if (ipmi_fru_parse_type_length_field_to_string (fru_parse_ctx,
|
||
|
+ if (ipmi_fru_type_length_field_to_string (fru_ctx,
|
||
|
field->type_length_field,
|
||
|
field->type_length_field_length,
|
||
|
language_code,
|
||
|
strbuf,
|
||
|
&strbuflen) < 0)
|
||
|
{
|
||
|
- upsdebugx (2, "ipmi_fru_parse_type_length_field_to_string: %s",
|
||
|
- ipmi_fru_parse_ctx_errormsg (fru_parse_ctx));
|
||
|
+ upsdebugx (2, "ipmi_fru_type_length_field_to_string: %s",
|
||
|
+ ipmi_fru_ctx_errormsg (fru_ctx));
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
@@ -279,24 +309,20 @@ static float libfreeipmi_get_voltage (uint8_t voltage_code)
|
||
|
static void libfreeipmi_cleanup()
|
||
|
{
|
||
|
/* cleanup */
|
||
|
- if (fru_parse_ctx) {
|
||
|
- ipmi_fru_parse_close_device_id (fru_parse_ctx);
|
||
|
- ipmi_fru_parse_ctx_destroy (fru_parse_ctx);
|
||
|
+ if (fru_ctx) {
|
||
|
+ ipmi_fru_close_device_id (fru_ctx);
|
||
|
+ ipmi_fru_ctx_destroy (fru_ctx);
|
||
|
}
|
||
|
|
||
|
-#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
if (sdr_ctx) {
|
||
|
ipmi_sdr_ctx_destroy (sdr_ctx);
|
||
|
}
|
||
|
-#else /* HAVE_FREEIPMI_11X_12X */
|
||
|
- if (sdr_cache_ctx) {
|
||
|
- ipmi_sdr_cache_ctx_destroy (sdr_cache_ctx);
|
||
|
- }
|
||
|
|
||
|
+#ifndef HAVE_FREEIPMI_11X_12X
|
||
|
if (sdr_parse_ctx) {
|
||
|
ipmi_sdr_parse_ctx_destroy (sdr_parse_ctx);
|
||
|
}
|
||
|
-#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
+#endif
|
||
|
|
||
|
if (ipmi_ctx) {
|
||
|
ipmi_ctx_close (ipmi_ctx);
|
||
|
@@ -342,7 +368,7 @@ static int libfreeipmi_get_psu_info (const void *areabuf,
|
||
|
|
||
|
upsdebugx(1, "entering libfreeipmi_get_psu_info()");
|
||
|
|
||
|
- if (ipmi_fru_parse_multirecord_power_supply_information (fru_parse_ctx,
|
||
|
+ if (ipmi_fru_multirecord_power_supply_information (fru_ctx,
|
||
|
areabuf,
|
||
|
area_length,
|
||
|
&overall_capacity,
|
||
|
@@ -368,8 +394,8 @@ static int libfreeipmi_get_psu_info (const void *areabuf,
|
||
|
&total_combined_wattage,
|
||
|
&predictive_fail_tachometer_lower_threshold) < 0)
|
||
|
{
|
||
|
- fatalx(EXIT_FAILURE, "ipmi_fru_parse_multirecord_power_supply_information: %s",
|
||
|
- ipmi_fru_parse_ctx_errormsg (fru_parse_ctx));
|
||
|
+ fatalx(EXIT_FAILURE, "ipmi_fru_multirecord_power_supply_information: %s",
|
||
|
+ ipmi_fru_ctx_errormsg (fru_ctx));
|
||
|
}
|
||
|
|
||
|
ipmi_dev->overall_capacity = overall_capacity;
|
||
|
@@ -383,6 +409,8 @@ static int libfreeipmi_get_psu_info (const void *areabuf,
|
||
|
|
||
|
ipmi_dev->voltage = libfreeipmi_get_voltage(voltage_1);
|
||
|
|
||
|
+ upsdebugx(1, "libfreeipmi_get_psu_info() retrieved successfully");
|
||
|
+
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
@@ -392,12 +420,12 @@ static int libfreeipmi_get_board_info (const void *areabuf,
|
||
|
{
|
||
|
uint8_t language_code;
|
||
|
uint32_t mfg_date_time;
|
||
|
- ipmi_fru_parse_field_t board_manufacturer;
|
||
|
- ipmi_fru_parse_field_t board_product_name;
|
||
|
- ipmi_fru_parse_field_t board_serial_number;
|
||
|
- ipmi_fru_parse_field_t board_part_number;
|
||
|
- ipmi_fru_parse_field_t board_fru_file_id;
|
||
|
- ipmi_fru_parse_field_t board_custom_fields[IPMI_FRU_CUSTOM_FIELDS];
|
||
|
+ ipmi_fru_field_t board_manufacturer;
|
||
|
+ ipmi_fru_field_t board_product_name;
|
||
|
+ ipmi_fru_field_t board_serial_number;
|
||
|
+ ipmi_fru_field_t board_part_number;
|
||
|
+ ipmi_fru_field_t board_fru_file_id;
|
||
|
+ ipmi_fru_field_t board_custom_fields[IPMI_FRU_CUSTOM_FIELDS];
|
||
|
const char *string = NULL;
|
||
|
time_t timetmp;
|
||
|
struct tm mfg_date_time_tm;
|
||
|
@@ -406,15 +434,15 @@ static int libfreeipmi_get_board_info (const void *areabuf,
|
||
|
upsdebugx(1, "entering libfreeipmi_get_board_info()");
|
||
|
|
||
|
/* clear fields */
|
||
|
- memset (&board_manufacturer, '\0', sizeof (ipmi_fru_parse_field_t));
|
||
|
- memset (&board_product_name, '\0', sizeof (ipmi_fru_parse_field_t));
|
||
|
- memset (&board_serial_number, '\0', sizeof (ipmi_fru_parse_field_t));
|
||
|
- memset (&board_fru_file_id, '\0', sizeof (ipmi_fru_parse_field_t));
|
||
|
+ memset (&board_manufacturer, '\0', sizeof (ipmi_fru_field_t));
|
||
|
+ memset (&board_product_name, '\0', sizeof (ipmi_fru_field_t));
|
||
|
+ memset (&board_serial_number, '\0', sizeof (ipmi_fru_field_t));
|
||
|
+ memset (&board_fru_file_id, '\0', sizeof (ipmi_fru_field_t));
|
||
|
memset (&board_custom_fields[0], '\0',
|
||
|
- sizeof (ipmi_fru_parse_field_t) * IPMI_FRU_CUSTOM_FIELDS);
|
||
|
+ sizeof (ipmi_fru_field_t) * IPMI_FRU_CUSTOM_FIELDS);
|
||
|
|
||
|
/* parse FRU buffer */
|
||
|
- if (ipmi_fru_parse_board_info_area (fru_parse_ctx,
|
||
|
+ if (ipmi_fru_board_info_area (fru_ctx,
|
||
|
areabuf,
|
||
|
area_length,
|
||
|
&language_code,
|
||
|
@@ -428,8 +456,8 @@ static int libfreeipmi_get_board_info (const void *areabuf,
|
||
|
IPMI_FRU_CUSTOM_FIELDS) < 0)
|
||
|
{
|
||
|
libfreeipmi_cleanup();
|
||
|
- fatalx(EXIT_FAILURE, "ipmi_fru_parse_board_info_area: %s",
|
||
|
- ipmi_fru_parse_ctx_errormsg (fru_parse_ctx));
|
||
|
+ fatalx(EXIT_FAILURE, "ipmi_fru_board_info_area: %s",
|
||
|
+ ipmi_fru_ctx_errormsg (fru_ctx));
|
||
|
}
|
||
|
|
||
|
|
||
|
@@ -498,113 +526,64 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev)
|
||
|
ipmi_dev->sensors_count = 0;
|
||
|
memset(ipmi_dev->sensors_id_list, 0, sizeof(ipmi_dev->sensors_id_list));
|
||
|
|
||
|
-#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
if (!(sdr_ctx = ipmi_sdr_ctx_create ()))
|
||
|
{
|
||
|
libfreeipmi_cleanup();
|
||
|
fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_ctx_create()");
|
||
|
}
|
||
|
|
||
|
- if (ipmi_sdr_cache_open (sdr_ctx, ipmi_ctx, CACHE_LOCATION) < 0)
|
||
|
- {
|
||
|
- if (ipmi_sdr_ctx_errnum (sdr_ctx) != IPMI_SDR_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST)
|
||
|
- {
|
||
|
- libfreeipmi_cleanup();
|
||
|
- fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_open: %s",
|
||
|
- ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
- }
|
||
|
- }
|
||
|
-#else /* HAVE_FREEIPMI_11X_12X */
|
||
|
- if (!(sdr_cache_ctx = ipmi_sdr_cache_ctx_create ()))
|
||
|
- {
|
||
|
- libfreeipmi_cleanup();
|
||
|
- fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_ctx_create()");
|
||
|
- }
|
||
|
-
|
||
|
+#ifndef HAVE_FREEIPMI_11X_12X
|
||
|
if (!(sdr_parse_ctx = ipmi_sdr_parse_ctx_create ()))
|
||
|
{
|
||
|
libfreeipmi_cleanup();
|
||
|
fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_parse_ctx_create()");
|
||
|
}
|
||
|
+#endif
|
||
|
|
||
|
- if (ipmi_sdr_cache_open (sdr_cache_ctx, ipmi_ctx, CACHE_LOCATION) < 0)
|
||
|
+ if (ipmi_sdr_cache_open (sdr_ctx, ipmi_ctx, CACHE_LOCATION) < 0)
|
||
|
{
|
||
|
- if (ipmi_sdr_cache_ctx_errnum (sdr_cache_ctx) != IPMI_SDR_CACHE_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST)
|
||
|
+ if (ipmi_sdr_ctx_errnum (sdr_ctx) != IPMI_SDR_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST)
|
||
|
{
|
||
|
libfreeipmi_cleanup();
|
||
|
fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_open: %s",
|
||
|
- ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx));
|
||
|
+ ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
}
|
||
|
}
|
||
|
-#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
|
||
|
-#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
if (ipmi_sdr_ctx_errnum (sdr_ctx) == IPMI_SDR_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST)
|
||
|
{
|
||
|
if (ipmi_sdr_cache_create (sdr_ctx,
|
||
|
ipmi_ctx, CACHE_LOCATION,
|
||
|
IPMI_SDR_CACHE_CREATE_FLAGS_DEFAULT,
|
||
|
+#ifndef HAVE_FREEIPMI_11X_12X
|
||
|
+ IPMI_SDR_CACHE_VALIDATION_FLAGS_DEFAULT,
|
||
|
+#endif
|
||
|
NULL, NULL) < 0)
|
||
|
{
|
||
|
libfreeipmi_cleanup();
|
||
|
fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_create: %s",
|
||
|
ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
}
|
||
|
- if (ipmi_sdr_cache_open (sdr_ctx,
|
||
|
- ipmi_ctx, CACHE_LOCATION) < 0)
|
||
|
+ if (ipmi_sdr_cache_open (sdr_ctx, ipmi_ctx, CACHE_LOCATION) < 0)
|
||
|
{
|
||
|
if (ipmi_sdr_ctx_errnum (sdr_ctx) != IPMI_SDR_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST)
|
||
|
{
|
||
|
- libfreeipmi_cleanup();
|
||
|
- fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_open: %s",
|
||
|
- ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
- }
|
||
|
- }
|
||
|
- }
|
||
|
-#else /* HAVE_FREEIPMI_11X_12X */
|
||
|
- if (ipmi_sdr_cache_ctx_errnum (sdr_cache_ctx) == IPMI_SDR_CACHE_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST)
|
||
|
- {
|
||
|
- if (ipmi_sdr_cache_create (sdr_cache_ctx,
|
||
|
- ipmi_ctx, CACHE_LOCATION,
|
||
|
- IPMI_SDR_CACHE_CREATE_FLAGS_DEFAULT,
|
||
|
- IPMI_SDR_CACHE_VALIDATION_FLAGS_DEFAULT,
|
||
|
- NULL, NULL) < 0)
|
||
|
- {
|
||
|
- libfreeipmi_cleanup();
|
||
|
- fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_create: %s",
|
||
|
- ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx));
|
||
|
- }
|
||
|
- if (ipmi_sdr_cache_open (sdr_cache_ctx,
|
||
|
- ipmi_ctx, CACHE_LOCATION) < 0)
|
||
|
- {
|
||
|
- if (ipmi_sdr_cache_ctx_errnum (sdr_cache_ctx) != IPMI_SDR_CACHE_ERR_CACHE_READ_CACHE_DOES_NOT_EXIST)
|
||
|
- {
|
||
|
- libfreeipmi_cleanup();
|
||
|
- fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_open: %s",
|
||
|
- ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx));
|
||
|
+ libfreeipmi_cleanup();
|
||
|
+ fatal_with_errno(EXIT_FAILURE, "ipmi_sdr_cache_open: %s",
|
||
|
+ ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
-#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
|
||
|
-#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
- if (ipmi_sdr_cache_record_count (sdr_ctx, &record_count) < 0) {
|
||
|
+ if (ipmi_sdr_cache_record_count (sdr_ctx, &record_count) < 0) {
|
||
|
fprintf (stderr,
|
||
|
- "ipmi_sdr_cache_record_count: %s",
|
||
|
+ "ipmi_sdr_cache_record_count: %s\n",
|
||
|
ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
goto cleanup;
|
||
|
}
|
||
|
-#else
|
||
|
- if (ipmi_sdr_cache_record_count (sdr_cache_ctx, &record_count) < 0)
|
||
|
- {
|
||
|
- fprintf (stderr,
|
||
|
- "ipmi_sdr_cache_record_count: %s",
|
||
|
- ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx));
|
||
|
- goto cleanup;
|
||
|
- }
|
||
|
-#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
|
||
|
-#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
+ upsdebugx(3, "Found %i records in SDR cache", record_count);
|
||
|
+
|
||
|
for (i = 0; i < record_count; i++, ipmi_sdr_cache_next (sdr_ctx))
|
||
|
{
|
||
|
memset (sdr_record, '\0', IPMI_SDR_MAX_RECORD_LENGTH);
|
||
|
@@ -613,50 +592,29 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev)
|
||
|
sdr_record,
|
||
|
IPMI_SDR_MAX_RECORD_LENGTH)) < 0)
|
||
|
{
|
||
|
- fprintf (stderr, "ipmi_sdr_cache_record_read: %s",
|
||
|
+ fprintf (stderr, "ipmi_sdr_cache_record_read: %s\n",
|
||
|
ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
goto cleanup;
|
||
|
}
|
||
|
- if (ipmi_sdr_parse_record_id_and_type (sdr_ctx,
|
||
|
+ if (ipmi_sdr_parse_record_id_and_type (SDR_PARSE_CTX,
|
||
|
sdr_record,
|
||
|
sdr_record_len,
|
||
|
NULL,
|
||
|
&record_type) < 0)
|
||
|
{
|
||
|
- fprintf (stderr, "ipmi_sdr_parse_record_id_and_type: %s",
|
||
|
+ fprintf (stderr, "ipmi_sdr_parse_record_id_and_type: %s\n",
|
||
|
ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
goto cleanup;
|
||
|
}
|
||
|
-#else
|
||
|
- for (i = 0; i < record_count; i++, ipmi_sdr_cache_next (sdr_cache_ctx))
|
||
|
- {
|
||
|
- memset (sdr_record, '\0', IPMI_SDR_MAX_RECORD_LENGTH);
|
||
|
|
||
|
- if ((sdr_record_len = ipmi_sdr_cache_record_read (sdr_cache_ctx,
|
||
|
- sdr_record,
|
||
|
- IPMI_SDR_MAX_RECORD_LENGTH)) < 0)
|
||
|
- {
|
||
|
- fprintf (stderr, "ipmi_sdr_cache_record_read: %s",
|
||
|
- ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx));
|
||
|
- goto cleanup;
|
||
|
- }
|
||
|
- if (ipmi_sdr_parse_record_id_and_type (sdr_parse_ctx,
|
||
|
- sdr_record,
|
||
|
- sdr_record_len,
|
||
|
- NULL,
|
||
|
- &record_type) < 0)
|
||
|
- {
|
||
|
- fprintf (stderr, "ipmi_sdr_parse_record_id_and_type: %s",
|
||
|
- ipmi_sdr_parse_ctx_errormsg (sdr_parse_ctx));
|
||
|
- goto cleanup;
|
||
|
- }
|
||
|
-#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
+ upsdebugx (5, "Checking record %i (/%i)", i, record_count);
|
||
|
|
||
|
- if (record_type != IPMI_SDR_FORMAT_FRU_DEVICE_LOCATOR_RECORD)
|
||
|
+ if (record_type != IPMI_SDR_FORMAT_FRU_DEVICE_LOCATOR_RECORD) {
|
||
|
+ upsdebugx(1, "=======> not device locator (%i)!!", record_type);
|
||
|
continue;
|
||
|
+ }
|
||
|
|
||
|
-#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
- if (ipmi_sdr_parse_fru_device_locator_parameters (sdr_ctx,
|
||
|
+ if (ipmi_sdr_parse_fru_device_locator_parameters (SDR_PARSE_CTX,
|
||
|
sdr_record,
|
||
|
sdr_record_len,
|
||
|
NULL,
|
||
|
@@ -666,86 +624,49 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev)
|
||
|
&logical_physical_fru_device,
|
||
|
NULL) < 0)
|
||
|
{
|
||
|
- fprintf (stderr, "ipmi_sdr_parse_fru_device_locator_parameters: %s",
|
||
|
+ fprintf (stderr, "ipmi_sdr_parse_fru_device_locator_parameters: %s\n",
|
||
|
ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
goto cleanup;
|
||
|
}
|
||
|
-#else /* HAVE_FREEIPMI_11X_12X */
|
||
|
- if (ipmi_sdr_parse_fru_device_locator_parameters (sdr_parse_ctx,
|
||
|
- sdr_record,
|
||
|
- sdr_record_len,
|
||
|
- NULL,
|
||
|
- &logical_fru_device_device_slave_address,
|
||
|
- NULL,
|
||
|
- NULL,
|
||
|
- &logical_physical_fru_device,
|
||
|
- NULL) < 0)
|
||
|
- {
|
||
|
- fprintf (stderr, "ipmi_sdr_parse_fru_device_locator_parameters: %s",
|
||
|
- ipmi_sdr_parse_ctx_errormsg (sdr_parse_ctx));
|
||
|
- goto cleanup;
|
||
|
- }
|
||
|
-#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
+
|
||
|
+ upsdebugx(2, "Checking device %i/%i", logical_physical_fru_device,
|
||
|
+ logical_fru_device_device_slave_address);
|
||
|
|
||
|
if (logical_physical_fru_device
|
||
|
&& logical_fru_device_device_slave_address == ipmi_dev->ipmi_id)
|
||
|
{
|
||
|
found_device_id++;
|
||
|
|
||
|
-#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
- if (ipmi_sdr_parse_fru_entity_id_and_instance (sdr_ctx,
|
||
|
+ if (ipmi_sdr_parse_fru_entity_id_and_instance (SDR_PARSE_CTX,
|
||
|
sdr_record,
|
||
|
sdr_record_len,
|
||
|
&entity_id,
|
||
|
&entity_instance) < 0)
|
||
|
{
|
||
|
fprintf (stderr,
|
||
|
- "ipmi_sdr_parse_fru_entity_id_and_instance: %s",
|
||
|
+ "ipmi_sdr_parse_fru_entity_id_and_instance: %s\n",
|
||
|
ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
goto cleanup;
|
||
|
}
|
||
|
-#else /* HAVE_FREEIPMI_11X_12X */
|
||
|
- if (ipmi_sdr_parse_fru_entity_id_and_instance (sdr_parse_ctx,
|
||
|
- sdr_record,
|
||
|
- sdr_record_len,
|
||
|
- &entity_id,
|
||
|
- &entity_instance) < 0)
|
||
|
- {
|
||
|
- fprintf (stderr,
|
||
|
- "ipmi_sdr_parse_fru_entity_id_and_instance: %s",
|
||
|
- ipmi_sdr_parse_ctx_errormsg (sdr_parse_ctx));
|
||
|
- goto cleanup;
|
||
|
- }
|
||
|
-#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!found_device_id)
|
||
|
{
|
||
|
- fprintf (stderr, "Couldn't find device id %d", ipmi_dev->ipmi_id);
|
||
|
+ fprintf (stderr, "Couldn't find device id %d\n", ipmi_dev->ipmi_id);
|
||
|
goto cleanup;
|
||
|
}
|
||
|
else
|
||
|
upsdebugx(1, "Found device id %d", ipmi_dev->ipmi_id);
|
||
|
|
||
|
-#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
if (ipmi_sdr_cache_first (sdr_ctx) < 0)
|
||
|
{
|
||
|
- fprintf (stderr, "ipmi_sdr_cache_first: %s",
|
||
|
+ fprintf (stderr, "ipmi_sdr_cache_first: %s\n",
|
||
|
ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
goto cleanup;
|
||
|
}
|
||
|
-#else /* HAVE_FREEIPMI_11X_12X */
|
||
|
- if (ipmi_sdr_cache_first (sdr_cache_ctx) < 0)
|
||
|
- {
|
||
|
- fprintf (stderr, "ipmi_sdr_cache_first: %s",
|
||
|
- ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx));
|
||
|
- goto cleanup;
|
||
|
- }
|
||
|
-#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
|
||
|
-#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
for (i = 0; i < record_count; i++, ipmi_sdr_cache_next (sdr_ctx))
|
||
|
{
|
||
|
/* uint8_t sdr_record[IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH];
|
||
|
@@ -757,49 +678,21 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev)
|
||
|
sdr_record,
|
||
|
IPMI_SDR_MAX_RECORD_LENGTH)) < 0)
|
||
|
{
|
||
|
- fprintf (stderr, "ipmi_sdr_cache_record_read: %s",
|
||
|
+ fprintf (stderr, "ipmi_sdr_cache_record_read: %s\n",
|
||
|
ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
goto cleanup;
|
||
|
}
|
||
|
|
||
|
- if (ipmi_sdr_parse_record_id_and_type (sdr_ctx,
|
||
|
+ if (ipmi_sdr_parse_record_id_and_type (SDR_PARSE_CTX,
|
||
|
sdr_record,
|
||
|
sdr_record_len,
|
||
|
&record_id,
|
||
|
&record_type) < 0)
|
||
|
{
|
||
|
- fprintf (stderr, "ipmi_sdr_parse_record_id_and_type: %s",
|
||
|
+ fprintf (stderr, "ipmi_sdr_parse_record_id_and_type: %s\n",
|
||
|
ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
goto cleanup;
|
||
|
}
|
||
|
-#else /* HAVE_FREEIPMI_11X_12X */
|
||
|
- for (i = 0; i < record_count; i++, ipmi_sdr_cache_next (sdr_cache_ctx))
|
||
|
- {
|
||
|
- /* uint8_t sdr_record[IPMI_SDR_CACHE_MAX_SDR_RECORD_LENGTH];
|
||
|
- uint8_t record_type, tmp_entity_id, tmp_entity_instance;
|
||
|
- int sdr_record_len; */
|
||
|
-
|
||
|
- memset (sdr_record, '\0', IPMI_SDR_MAX_RECORD_LENGTH);
|
||
|
- if ((sdr_record_len = ipmi_sdr_cache_record_read (sdr_cache_ctx,
|
||
|
- sdr_record,
|
||
|
- IPMI_SDR_MAX_RECORD_LENGTH)) < 0)
|
||
|
- {
|
||
|
- fprintf (stderr, "ipmi_sdr_cache_record_read: %s",
|
||
|
- ipmi_sdr_cache_ctx_errormsg (sdr_cache_ctx));
|
||
|
- goto cleanup;
|
||
|
- }
|
||
|
-
|
||
|
- if (ipmi_sdr_parse_record_id_and_type (sdr_parse_ctx,
|
||
|
- sdr_record,
|
||
|
- sdr_record_len,
|
||
|
- &record_id,
|
||
|
- &record_type) < 0)
|
||
|
- {
|
||
|
- fprintf (stderr, "ipmi_sdr_parse_record_id_and_type: %s",
|
||
|
- ipmi_sdr_parse_ctx_errormsg (sdr_parse_ctx));
|
||
|
- goto cleanup;
|
||
|
- }
|
||
|
-#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
|
||
|
upsdebugx (5, "Checking record %i (/%i)", record_id, record_count);
|
||
|
|
||
|
@@ -809,31 +702,17 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev)
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
-#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
- if (ipmi_sdr_parse_entity_id_instance_type (sdr_ctx,
|
||
|
+ if (ipmi_sdr_parse_entity_id_instance_type (SDR_PARSE_CTX,
|
||
|
sdr_record,
|
||
|
sdr_record_len,
|
||
|
&tmp_entity_id,
|
||
|
&tmp_entity_instance,
|
||
|
NULL) < 0)
|
||
|
{
|
||
|
- fprintf (stderr, "ipmi_sdr_parse_entity_instance_type: %s",
|
||
|
+ fprintf (stderr, "ipmi_sdr_parse_entity_instance_type: %s\n",
|
||
|
ipmi_sdr_ctx_errormsg (sdr_ctx));
|
||
|
goto cleanup;
|
||
|
}
|
||
|
-#else /* HAVE_FREEIPMI_11X_12X */
|
||
|
- if (ipmi_sdr_parse_entity_id_instance_type (sdr_parse_ctx,
|
||
|
- sdr_record,
|
||
|
- sdr_record_len,
|
||
|
- &tmp_entity_id,
|
||
|
- &tmp_entity_instance,
|
||
|
- NULL) < 0)
|
||
|
- {
|
||
|
- fprintf (stderr, "ipmi_sdr_parse_entity_instance_type: %s",
|
||
|
- ipmi_sdr_parse_ctx_errormsg (sdr_parse_ctx));
|
||
|
- goto cleanup;
|
||
|
- }
|
||
|
-#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
|
||
|
if (tmp_entity_id == entity_id
|
||
|
&& tmp_entity_instance == entity_instance)
|
||
|
@@ -850,15 +729,11 @@ static int libfreeipmi_get_sensors_info (IPMIDevice_t *ipmi_dev)
|
||
|
|
||
|
cleanup:
|
||
|
/* Cleanup */
|
||
|
-#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
if (sdr_ctx) {
|
||
|
ipmi_sdr_ctx_destroy (sdr_ctx);
|
||
|
}
|
||
|
-#else /* HAVE_FREEIPMI_11X_12X */
|
||
|
- if (sdr_cache_ctx) {
|
||
|
- ipmi_sdr_cache_ctx_destroy (sdr_cache_ctx);
|
||
|
- }
|
||
|
|
||
|
+#ifndef HAVE_FREEIPMI_11X_12X
|
||
|
if (sdr_parse_ctx) {
|
||
|
ipmi_sdr_parse_ctx_destroy (sdr_parse_ctx);
|
||
|
}
|
||
|
diff --git a/m4/nut_check_libfreeipmi.m4 b/m4/nut_check_libfreeipmi.m4
|
||
|
index 72e7819..5b2eae9 100644
|
||
|
--- a/m4/nut_check_libfreeipmi.m4
|
||
|
+++ b/m4/nut_check_libfreeipmi.m4
|
||
|
@@ -66,7 +66,6 @@ if test -z "${nut_have_libfreeipmi_seen}"; then
|
||
|
dnl when version cannot be tested (prior to 1.0.5, with no pkg-config)
|
||
|
dnl we have to check for some specific functions
|
||
|
AC_SEARCH_LIBS([ipmi_ctx_find_inband], [freeipmi], [], [nut_have_freeipmi=no])
|
||
|
- AC_SEARCH_LIBS([ipmi_fru_parse_ctx_create], [freeipmi], [], [nut_have_freeipmi=no])
|
||
|
|
||
|
AC_SEARCH_LIBS([ipmi_monitoring_init], [ipmimonitoring], [nut_have_freeipmi_monitoring=yes], [nut_have_freeipmi_monitoring=no])
|
||
|
AC_SEARCH_LIBS([ipmi_monitoring_sensor_read_record_id], [ipmimonitoring], [], [nut_have_freeipmi_monitoring=no])
|
||
|
diff --git a/tools/nut-scanner/scan_ipmi.c b/tools/nut-scanner/scan_ipmi.c
|
||
|
index d650efa..c1ec78a 100644
|
||
|
--- a/tools/nut-scanner/scan_ipmi.c
|
||
|
+++ b/tools/nut-scanner/scan_ipmi.c
|
||
|
@@ -34,24 +34,51 @@ static char * libname = "libfreeipmi";
|
||
|
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);
|
||
|
#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
-static void (*nut_ipmi_sdr_ctx_destroy) (ipmi_sdr_ctx_t ctx);
|
||
|
+ /* Functions symbols remapping */
|
||
|
+ #define IPMI_FRU_CLOSE_DEVICE_ID "ipmi_fru_close_device_id"
|
||
|
+ #define IPMI_FRU_CTX_DESTROY "ipmi_fru_ctx_destroy"
|
||
|
+ #define IPMI_FRU_CTX_CREATE "ipmi_fru_ctx_create"
|
||
|
+ #define IPMI_FRU_CTX_SET_FLAGS "ipmi_fru_ctx_set_flags"
|
||
|
+ #define IPMI_FRU_OPEN_DEVICE_ID "ipmi_fru_open_device_id"
|
||
|
+ #define IPMI_FRU_CTX_ERRORMSG "ipmi_fru_ctx_errormsg"
|
||
|
+ #define IPMI_FRU_READ_DATA_AREA "ipmi_fru_read_data_area"
|
||
|
+ #define IPMI_FRU_PARSE_NEXT "ipmi_fru_next"
|
||
|
+ typedef ipmi_fru_ctx_t ipmi_fru_parse_ctx_t;
|
||
|
+ typedef ipmi_sdr_ctx_t ipmi_sdr_cache_ctx_t;
|
||
|
+ /* Functions remapping */
|
||
|
+ static void (*nut_ipmi_sdr_ctx_destroy) (ipmi_sdr_ctx_t ctx);
|
||
|
#else /* HAVE_FREEIPMI_11X_12X */
|
||
|
-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);
|
||
|
+ #define IPMI_FRU_AREA_SIZE_MAX IPMI_FRU_PARSE_AREA_SIZE_MAX
|
||
|
+ #define IPMI_FRU_FLAGS_SKIP_CHECKSUM_CHECKS IPMI_FRU_PARSE_FLAGS_SKIP_CHECKSUM_CHECKS
|
||
|
+ #define IPMI_FRU_AREA_TYPE_MULTIRECORD_POWER_SUPPLY_INFORMATION IPMI_FRU_PARSE_AREA_TYPE_MULTIRECORD_POWER_SUPPLY_INFORMATION
|
||
|
+ /* Functions symbols remapping */
|
||
|
+ #define IPMI_FRU_CLOSE_DEVICE_ID "ipmi_fru_parse_close_device_id"
|
||
|
+ #define IPMI_FRU_CTX_DESTROY "ipmi_fru_parse_ctx_destroy"
|
||
|
+ #define IPMI_FRU_CTX_CREATE "ipmi_fru_parse_ctx_create"
|
||
|
+ #define IPMI_FRU_CTX_SET_FLAGS "ipmi_fru_parse_ctx_set_flags"
|
||
|
+ #define IPMI_FRU_OPEN_DEVICE_ID "ipmi_fru_parse_open_device_id"
|
||
|
+ #define IPMI_FRU_CTX_ERRORMSG "ipmi_fru_parse_ctx_errormsg"
|
||
|
+ #define IPMI_FRU_READ_DATA_AREA "ipmi_fru_parse_read_data_area"
|
||
|
+ #define IPMI_FRU_PARSE_NEXT "ipmi_fru_parse_next"
|
||
|
+ /* Functions remapping */
|
||
|
+ 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);
|
||
|
#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
-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,
|
||
|
+
|
||
|
+
|
||
|
+static int (*nut_ipmi_fru_close_device_id) (ipmi_fru_parse_ctx_t ctx);
|
||
|
+static void (*nut_ipmi_fru_ctx_destroy) (ipmi_fru_parse_ctx_t ctx);
|
||
|
+static ipmi_fru_parse_ctx_t (*nut_ipmi_fru_ctx_create) (ipmi_ctx_t ipmi_ctx);
|
||
|
+static int (*nut_ipmi_fru_ctx_set_flags) (ipmi_fru_parse_ctx_t ctx, unsigned int flags);
|
||
|
+static int (*nut_ipmi_fru_open_device_id) (ipmi_fru_parse_ctx_t ctx, uint8_t fru_device_id);
|
||
|
+static char * (*nut_ipmi_fru_ctx_errormsg) (ipmi_fru_parse_ctx_t ctx);
|
||
|
+static int (*nut_ipmi_fru_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 int (*nut_ipmi_fru_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,
|
||
|
@@ -92,12 +119,12 @@ int nutscan_load_ipmi_library()
|
||
|
/* Clear any existing error */
|
||
|
lt_dlerror();
|
||
|
|
||
|
- *(void **) (&nut_ipmi_fru_parse_close_device_id) = lt_dlsym(dl_handle, "ipmi_fru_parse_close_device_id");
|
||
|
+ *(void **) (&nut_ipmi_fru_close_device_id) = lt_dlsym(dl_handle, IPMI_FRU_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");
|
||
|
+ *(void **) (&nut_ipmi_fru_ctx_destroy) = lt_dlsym(dl_handle, IPMI_FRU_CTX_DESTROY);
|
||
|
if ((dl_error = lt_dlerror()) != NULL) {
|
||
|
goto err;
|
||
|
}
|
||
|
@@ -122,32 +149,32 @@ int nutscan_load_ipmi_library()
|
||
|
}
|
||
|
#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
|
||
|
- *(void **) (&nut_ipmi_fru_parse_ctx_create) = lt_dlsym(dl_handle, "ipmi_fru_parse_ctx_create");
|
||
|
+ *(void **) (&nut_ipmi_fru_ctx_create) = lt_dlsym(dl_handle, IPMI_FRU_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");
|
||
|
+ *(void **) (&nut_ipmi_fru_ctx_set_flags) = lt_dlsym(dl_handle, IPMI_FRU_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");
|
||
|
+ *(void **) (&nut_ipmi_fru_open_device_id) = lt_dlsym(dl_handle, IPMI_FRU_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");
|
||
|
+ *(void **) (&nut_ipmi_fru_ctx_errormsg) = lt_dlsym(dl_handle, IPMI_FRU_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");
|
||
|
+ *(void **) (&nut_ipmi_fru_read_data_area) = lt_dlsym(dl_handle, IPMI_FRU_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");
|
||
|
+ *(void **) (&nut_ipmi_fru_next) = lt_dlsym(dl_handle, IPMI_FRU_PARSE_NEXT);
|
||
|
if ((dl_error = lt_dlerror()) != NULL) {
|
||
|
goto err;
|
||
|
}
|
||
|
@@ -179,7 +206,7 @@ int nutscan_load_ipmi_library()
|
||
|
|
||
|
return 1;
|
||
|
err:
|
||
|
- fprintf(stderr, "Cannot load IPMI library (%s) : %s. IPMI search disabled.\n", libname, dl_error);
|
||
|
+ fprintf(stderr, "Cannot load IPMI library (%s) : %s. IPMI search disabled.\n", libname, dl_error);
|
||
|
dl_handle = (void *)1;
|
||
|
lt_dlexit();
|
||
|
return 0;
|
||
|
@@ -197,8 +224,8 @@ static void nut_freeipmi_cleanup(ipmi_fru_parse_ctx_t fru_parse_ctx,
|
||
|
#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
{
|
||
|
if (fru_parse_ctx) {
|
||
|
- (*nut_ipmi_fru_parse_close_device_id) (fru_parse_ctx);
|
||
|
- (*nut_ipmi_fru_parse_ctx_destroy) (fru_parse_ctx);
|
||
|
+ (*nut_ipmi_fru_close_device_id) (fru_parse_ctx);
|
||
|
+ (*nut_ipmi_fru_ctx_destroy) (fru_parse_ctx);
|
||
|
}
|
||
|
|
||
|
#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
@@ -226,7 +253,7 @@ 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];
|
||
|
+ uint8_t areabuf[IPMI_FRU_AREA_SIZE_MAX+1];
|
||
|
ipmi_fru_parse_ctx_t fru_parse_ctx = NULL;
|
||
|
#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
ipmi_sdr_ctx_t sdr_ctx = NULL;
|
||
|
@@ -236,14 +263,14 @@ int is_ipmi_device_supported(ipmi_ctx_t ipmi_ctx, int ipmi_id)
|
||
|
#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
|
||
|
/* Parse FRU information */
|
||
|
- if (!(fru_parse_ctx = (*nut_ipmi_fru_parse_ctx_create) (ipmi_ctx)))
|
||
|
+ if (!(fru_parse_ctx = (*nut_ipmi_fru_ctx_create) (ipmi_ctx)))
|
||
|
{
|
||
|
fprintf(stderr, "ipmi_fru_parse_ctx_create()\n");
|
||
|
return 0;
|
||
|
}
|
||
|
-
|
||
|
+fprintf(stdout, "There.1\n");
|
||
|
/* 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)
|
||
|
+ if ((*nut_ipmi_fru_ctx_set_flags) (fru_parse_ctx, IPMI_FRU_FLAGS_SKIP_CHECKSUM_CHECKS) < 0)
|
||
|
{
|
||
|
#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
nut_freeipmi_cleanup(fru_parse_ctx, sdr_ctx);
|
||
|
@@ -252,8 +279,8 @@ int is_ipmi_device_supported(ipmi_ctx_t ipmi_ctx, int ipmi_id)
|
||
|
#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
return 0;
|
||
|
}
|
||
|
-
|
||
|
- if ((*nut_ipmi_fru_parse_open_device_id) (fru_parse_ctx, ipmi_id) < 0)
|
||
|
+fprintf(stdout, "There.2\n");
|
||
|
+ if ((*nut_ipmi_fru_open_device_id) (fru_parse_ctx, ipmi_id) < 0)
|
||
|
{
|
||
|
#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
nut_freeipmi_cleanup(fru_parse_ctx, sdr_ctx);
|
||
|
@@ -265,17 +292,18 @@ int is_ipmi_device_supported(ipmi_ctx_t ipmi_ctx, int ipmi_id)
|
||
|
|
||
|
do
|
||
|
{
|
||
|
+fprintf(stdout, "There.3\n");
|
||
|
/* clear fields */
|
||
|
area_type = 0;
|
||
|
area_length = 0;
|
||
|
- memset (areabuf, '\0', IPMI_FRU_PARSE_AREA_SIZE_MAX + 1);
|
||
|
+ memset (areabuf, '\0', IPMI_FRU_AREA_SIZE_MAX + 1);
|
||
|
|
||
|
/* parse FRU buffer */
|
||
|
- if ((*nut_ipmi_fru_parse_read_data_area) (fru_parse_ctx,
|
||
|
+ if ((*nut_ipmi_fru_read_data_area) (fru_parse_ctx,
|
||
|
&area_type,
|
||
|
&area_length,
|
||
|
areabuf,
|
||
|
- IPMI_FRU_PARSE_AREA_SIZE_MAX) < 0)
|
||
|
+ IPMI_FRU_AREA_SIZE_MAX) < 0)
|
||
|
{
|
||
|
#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
nut_freeipmi_cleanup(fru_parse_ctx, sdr_ctx);
|
||
|
@@ -287,7 +315,7 @@ int is_ipmi_device_supported(ipmi_ctx_t ipmi_ctx, int ipmi_id)
|
||
|
|
||
|
if (area_length)
|
||
|
{
|
||
|
- if (area_type == IPMI_FRU_PARSE_AREA_TYPE_MULTIRECORD_POWER_SUPPLY_INFORMATION)
|
||
|
+ if (area_type == IPMI_FRU_AREA_TYPE_MULTIRECORD_POWER_SUPPLY_INFORMATION)
|
||
|
{
|
||
|
/* Found a POWER_SUPPLY record */
|
||
|
#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
@@ -298,7 +326,7 @@ int is_ipmi_device_supported(ipmi_ctx_t ipmi_ctx, int ipmi_id)
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
- } while ((ret = (*nut_ipmi_fru_parse_next) (fru_parse_ctx)) == 1);
|
||
|
+ } while ((ret = (*nut_ipmi_fru_next) (fru_parse_ctx)) == 1);
|
||
|
|
||
|
/* No need for further errors checking */
|
||
|
#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
@@ -322,7 +350,7 @@ nutscan_device_t * nutscan_scan_ipmi()
|
||
|
if( !nutscan_avail_ipmi ) {
|
||
|
return NULL;
|
||
|
}
|
||
|
-
|
||
|
+fprintf(stdout, "There1\n");
|
||
|
/* Initialize the FreeIPMI library. */
|
||
|
if (!(ipmi_ctx = (*nut_ipmi_ctx_create) ()))
|
||
|
{
|
||
|
@@ -331,6 +359,7 @@ nutscan_device_t * nutscan_scan_ipmi()
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
+fprintf(stdout, "There2\n");
|
||
|
if ((ret = (*nut_ipmi_ctx_find_inband) (ipmi_ctx,
|
||
|
NULL,
|
||
|
0, /* don't disable auto-probe */
|
||
|
@@ -338,7 +367,7 @@ nutscan_device_t * nutscan_scan_ipmi()
|
||
|
0,
|
||
|
NULL,
|
||
|
0, /* workaround flags, none by default */
|
||
|
- 0 /* flags */
|
||
|
+ IPMI_FLAGS_NONBLOCKING /* flags */
|
||
|
)) < 0)
|
||
|
{
|
||
|
fprintf(stderr, "ipmi_ctx_find_inband: %s\n",
|
||
|
@@ -350,12 +379,14 @@ nutscan_device_t * nutscan_scan_ipmi()
|
||
|
/* No local IPMI device detected */
|
||
|
return NULL;
|
||
|
}
|
||
|
+fprintf(stdout, "There3 (ret = %i)\n", ret);
|
||
|
|
||
|
/* Loop through all possible components */
|
||
|
for (ipmi_id = 0 ; ipmi_id <= IPMI_FRU_DEVICE_ID_MAX ; ipmi_id++) {
|
||
|
-
|
||
|
+fprintf(stdout, "There4\n");
|
||
|
if (is_ipmi_device_supported(ipmi_ctx, ipmi_id)) {
|
||
|
|
||
|
+fprintf(stdout, "There4.%i\n", ipmi_id);
|
||
|
if ( (nut_dev = nutscan_new_device()) == NULL ) {
|
||
|
fprintf(stderr,"Memory allocation error\n");
|
||
|
nutscan_free_device(current_nut_dev);
|
||
|
--
|
||
|
1.7.10.2
|
||
|
|
||
|
|
||
|
From 64add831fe9cd779f125f52782c4c58cbd62d64b Mon Sep 17 00:00:00 2001
|
||
|
From: Arnaud Quette <arnaud.quette@free.fr>
|
||
|
Date: Thu, 4 Oct 2012 22:50:52 +0000
|
||
|
Subject: [PATCH] Support power supplies scan over the network
|
||
|
|
||
|
nut-scanner can now scan for power supplies with IPMI over LAN. This is
|
||
|
currently limited to IPMI 1.5 only
|
||
|
|
||
|
Fossil-ID: SVN r3739
|
||
|
---
|
||
|
docs/man/nut-scanner.txt | 108 +++++++++--------
|
||
|
drivers/nut-ipmipsu.c | 15 ++-
|
||
|
tools/nut-scanner/nut-scan.h | 39 ++++++-
|
||
|
tools/nut-scanner/nut-scanner.c | 74 +++++++++++-
|
||
|
tools/nut-scanner/scan_ipmi.c | 243 ++++++++++++++++++++++++++++++++++-----
|
||
|
5 files changed, 388 insertions(+), 91 deletions(-)
|
||
|
|
||
|
diff --git a/docs/man/nut-scanner.txt b/docs/man/nut-scanner.txt
|
||
|
index 6948449..efe0e58 100644
|
||
|
--- a/docs/man/nut-scanner.txt
|
||
|
+++ b/docs/man/nut-scanner.txt
|
||
|
@@ -36,118 +36,128 @@ DISPLAY OPTIONS
|
||
|
---------------
|
||
|
|
||
|
*-N* | *--disp_nut_conf*::
|
||
|
-
|
||
|
- Display result in the 'ups.conf' format.
|
||
|
+Display result in the 'ups.conf' format.
|
||
|
|
||
|
*-P* | *--disp_parsable*::
|
||
|
-
|
||
|
- Display result in a parsable format.
|
||
|
+Display result in a parsable format.
|
||
|
|
||
|
BUS OPTIONS
|
||
|
-----------
|
||
|
|
||
|
*-C* | *--complete_scan*::
|
||
|
-
|
||
|
- Scan all available communication buses (default behavior)
|
||
|
+Scan all available communication buses (default behavior)
|
||
|
|
||
|
*-U* | *--usb_scan*::
|
||
|
-
|
||
|
- List all NUT-compatible USB devices currently plugged in.
|
||
|
+List all NUT-compatible USB devices currently plugged in.
|
||
|
|
||
|
*-S* | *--snmp_scan*::
|
||
|
-
|
||
|
- Scan SNMP devices. Requires at least a 'start IP', and optionally, an 'end IP'. See specific SNMP OPTIONS for community and security settings.
|
||
|
+Scan SNMP devices. Requires at least a 'start IP', and optionally, an 'end IP'. See specific SNMP OPTIONS for community and security settings.
|
||
|
|
||
|
*-M* | *--xml_scan*::
|
||
|
-
|
||
|
- Scan XML/HTTP devices. Broadcast a network message on the current network interfaces to retrieve XML/HTTP capable devices. No IP required.
|
||
|
+Scan XML/HTTP devices. Broadcast a network message on the current network interfaces to retrieve XML/HTTP capable devices. No IP required.
|
||
|
|
||
|
*-O* | *--oldnut_scan*::
|
||
|
-
|
||
|
- Scan NUT devices (i.e. upsd daemon) on IP ranging from 'start IP' to 'end IP'.
|
||
|
+Scan NUT devices (i.e. upsd daemon) on IP ranging from 'start IP' to 'end IP'.
|
||
|
|
||
|
*-A* | *--avahi_scan*::
|
||
|
-
|
||
|
- Scan NUT servers using Avahi request on the current network interfaces. No IP required.
|
||
|
+Scan NUT servers using Avahi request on the current network interfaces. No IP required.
|
||
|
|
||
|
*-I* | *--ipmi_scan*::
|
||
|
-
|
||
|
- Scan NUT compatible devices available via IPMI on the current host.
|
||
|
+Scan NUT compatible power supplies available via IPMI on the current host, or over the network.
|
||
|
|
||
|
NETWORK OPTIONS
|
||
|
---------------
|
||
|
|
||
|
*-t* | *--timeout* 'timeout'::
|
||
|
-
|
||
|
- Set the network timeout in seconds. Default timeout is 5 seconds.
|
||
|
+Set the network timeout in seconds. Default timeout is 5 seconds.
|
||
|
|
||
|
*-s* | *--start_ip* 'start IP'::
|
||
|
-
|
||
|
- Set the first IP (IPv4 or IPv6) when a range of IP is required (SNMP, old_nut).
|
||
|
+Set the first IP (IPv4 or IPv6) when a range of IP is required (SNMP, old_nut).
|
||
|
|
||
|
*-e* | *--end_ip* 'end IP'::
|
||
|
-
|
||
|
- Set the last IP (IPv4 or IPv6) when a range of IP is required (SNMP, old_nut). If this parameter is omitted, only the 'start IP' is scanned. If 'end IP' is less than 'start IP', both parameters are internally permuted.
|
||
|
+Set the last IP (IPv4 or IPv6) when a range of IP is required (SNMP, old_nut). If this parameter is omitted, only the 'start IP' is scanned. If 'end IP' is less than 'start IP', both parameters are internally permuted.
|
||
|
|
||
|
*-m* | *--mask_cidr* 'IP address/mask'::
|
||
|
-
|
||
|
- Set a range of IP using CIDR notation.
|
||
|
+Set a range of IP using CIDR notation.
|
||
|
|
||
|
NUT DEVICE OPTION
|
||
|
-----------------
|
||
|
|
||
|
*-p* | *--port* 'port number'::
|
||
|
-
|
||
|
- Set the port number of scanned NUT devices (default 3493).
|
||
|
+Set the port number of scanned NUT devices (default 3493).
|
||
|
|
||
|
SNMP V1 OPTION
|
||
|
--------------
|
||
|
|
||
|
*-c* | *--community* 'community'::
|
||
|
-
|
||
|
- Set SNMP v1 community name (default = public).
|
||
|
+Set SNMP v1 community name (default = public).
|
||
|
|
||
|
SNMP V3 OPTIONS
|
||
|
---------------
|
||
|
|
||
|
*-l* | *--secLevel* 'security level'::
|
||
|
-
|
||
|
- Set the 'security level' used for SNMPv3 messages. Allowed values are: noAuthNoPriv, authNoPriv and authPriv.
|
||
|
+Set the 'security level' used for SNMPv3 messages. Allowed values are: noAuthNoPriv, authNoPriv and authPriv.
|
||
|
|
||
|
*-u* | *--secName* 'security name'::
|
||
|
-
|
||
|
- Set the 'security name' used for authenticated SNMPv3 messages. This parameter is mandatory if you set 'security level'.
|
||
|
+Set the 'security name' used for authenticated SNMPv3 messages. This parameter is mandatory if you set 'security level'.
|
||
|
|
||
|
*-w* | *--authProtocol* 'authentication protocol'::
|
||
|
-
|
||
|
- Set the 'authentication protocol' used for authenticated SNMPv3 messages. Allowed values are MD5 or SHA. Default value is MD5.
|
||
|
+Set the 'authentication protocol' used for authenticated SNMPv3 messages. Allowed values are MD5 or SHA. Default value is MD5.
|
||
|
|
||
|
*-W* | *--authPassword* 'authentication pass phrase'::
|
||
|
-
|
||
|
- Set the 'authentication pass phrase' used for authenticated SNMPv3 messages. This parameter is mandatory if you set 'security level' to authNoPriv or authPriv.
|
||
|
+Set the 'authentication pass phrase' used for authenticated SNMPv3 messages. This parameter is mandatory if you set 'security level' to authNoPriv or authPriv.
|
||
|
|
||
|
*-x* | *--privProtocol* 'privacy protocol'::
|
||
|
-
|
||
|
- Set the 'privacy protocol' used for encrypted SNMPv3 messages. Allowed values are DES or AES. Default value is DES.
|
||
|
+Set the 'privacy protocol' used for encrypted SNMPv3 messages. Allowed values are DES or AES. Default value is DES.
|
||
|
|
||
|
*-X* | *--privPassword* 'privacy pass phrase'::
|
||
|
+Set the 'privacy pass phrase' used for encrypted SNMPv3 messages. This parameter is mandatory if you set 'security level' to authPriv.
|
||
|
|
||
|
- Set the 'privacy pass phrase' used for encrypted SNMPv3 messages. This parameter is mandatory if you set 'security level' to authPriv.
|
||
|
+IPMI OPTIONS
|
||
|
+------------
|
||
|
+
|
||
|
+*-b* | *--username* 'username'::
|
||
|
+Set the username used for authenticating IPMI over LAN connections (mandatory for IPMI over LAN. No default).
|
||
|
+
|
||
|
+*-B* | *--password* 'password'::
|
||
|
+Specify the password to use when authenticationg with the remote host (mandatory for IPMI over LAN. No default).
|
||
|
+
|
||
|
+*-d* | *--authType* 'authentication type'::
|
||
|
+Specify the IPMI 1.5 authentication type to use (NONE, STRAIGHT_PASSWORD_KEY, MD2, and MD5) with the remote host (default=MD5).
|
||
|
+This forces connection through the 'lan' IPMI interface , thus in IPMI 1.5 mode.
|
||
|
+
|
||
|
+*-D* | *--cipher_suite_id* 'cipher suite identifier'::
|
||
|
+Specify the IPMI 2.0 cipher suite ID to use. The Cipher Suite ID identifies a set of authentication, integrity, and
|
||
|
+confidentiality algorithms to use for IPMI 2.0 communication. The authentication algorithm identifies the algorithm
|
||
|
+to use for session setup, the integrity algorithm identifies the algorithm to use for session packet signatures, and the
|
||
|
+confidentiality algorithm identifies the algorithm to use for payload encryption (default=3).
|
||
|
++
|
||
|
+The following cipher suite ids are currently supported (Authentication; Integrity; Confidentiality):
|
||
|
+
|
||
|
+- *0*: None; None; None
|
||
|
+- *1*: HMAC-SHA1; None; None
|
||
|
+- *2*: HMAC-SHA1; HMAC-SHA1-96; None
|
||
|
+- *3*: HMAC-SHA1; HMAC-SHA1-96; AES-CBC-128
|
||
|
+- *6*: HMAC-MD5; None; None
|
||
|
+- *7*: HMAC-MD5; HMAC-MD5-128; None
|
||
|
+- *8*: HMAC-MD5; HMAC-MD5-128; AES-CBC-128
|
||
|
+- *11*: HMAC-MD5; MD5-128; None
|
||
|
+- *12*: HMAC-MD5; MD5-128; AES-CBC-128
|
||
|
+- *15*: HMAC-SHA256; None; None
|
||
|
+- *16*: HMAC-SHA256; HMAC_SHA256_128; None
|
||
|
+- *17*: HMAC-SHA256; HMAC_SHA256_128; AES-CBC-128
|
||
|
|
||
|
MISCELLANEOUS OPTIONS
|
||
|
---------------------
|
||
|
|
||
|
*-V* | *--version*::
|
||
|
-
|
||
|
- Display NUT version.
|
||
|
+Display NUT version.
|
||
|
|
||
|
*-a* | *--available*::
|
||
|
-
|
||
|
- Display available bus that can be scanned , depending on how the binary has been compiled. (OLDNUT, USB, SNMP, XML, AVAHI, IPMI).
|
||
|
+Display available bus that can be scanned , depending on how the binary has been compiled. (OLDNUT, USB, SNMP, XML, AVAHI, IPMI).
|
||
|
|
||
|
*-q* | *--quiet*::
|
||
|
-
|
||
|
- Display only scan result. No information on currently scanned bus is displayed.
|
||
|
+Display only scan result. No information on currently scanned bus is displayed.
|
||
|
|
||
|
EXAMPLES
|
||
|
--------
|
||
|
@@ -168,6 +178,10 @@ To scan NUT servers with a timeout of 10 seconds on IP range 192.168.0.0 to 192.
|
||
|
|
||
|
*nut-scanner -O -t 10 -m 192.168.0.0/25*
|
||
|
|
||
|
+To scan for power supplies, through IPMI (1.5 mode) over the network, on address range 192.168.0.0 to 192.168.0.255:
|
||
|
+
|
||
|
+*nut-scanner -I -m 192.168.0.0/24 -b username -B password*
|
||
|
+
|
||
|
SEE ALSO
|
||
|
--------
|
||
|
|
||
|
diff --git a/drivers/nut-ipmipsu.c b/drivers/nut-ipmipsu.c
|
||
|
index b7382a8..2991cfc 100644
|
||
|
--- a/drivers/nut-ipmipsu.c
|
||
|
+++ b/drivers/nut-ipmipsu.c
|
||
|
@@ -27,7 +27,7 @@
|
||
|
#include "nut-ipmi.h"
|
||
|
|
||
|
#define DRIVER_NAME "IPMI PSU driver"
|
||
|
-#define DRIVER_VERSION "0.07"
|
||
|
+#define DRIVER_VERSION "0.30"
|
||
|
|
||
|
/* driver description structure */
|
||
|
upsdrv_info_t upsdrv_info = {
|
||
|
@@ -183,17 +183,20 @@ void upsdrv_makevartable(void)
|
||
|
"Type of the device to match ('psu' for \"Power Supply\")");
|
||
|
|
||
|
addvar(VAR_VALUE, "serial", "Serial number to match a specific device");
|
||
|
- addvar(VAR_VALUE, "fruid", "FRU identifier to match a specific device");
|
||
|
- addvar(VAR_VALUE, "sensorid", "Sensor identifier to match a specific device"); */
|
||
|
+ addvar(VAR_VALUE, "fruid", "FRU identifier to match a specific device"); */
|
||
|
}
|
||
|
|
||
|
void upsdrv_initups(void)
|
||
|
{
|
||
|
upsdebugx(1, "upsdrv_initups...");
|
||
|
|
||
|
- /* port can be expressed using:
|
||
|
- * "id?" for device (FRU) ID 0x?
|
||
|
- * "psu?" for PSU number ?
|
||
|
+ /* port can be expressed in various forms:
|
||
|
+ * - inband:
|
||
|
+ * "id?" for device (FRU) ID 0x?
|
||
|
+ * "psu?" for PSU number ?
|
||
|
+ * - out of band
|
||
|
+ * "id?@host"
|
||
|
+ * "host" => requires serial or ...
|
||
|
*/
|
||
|
if (!strncmp( device_path, "id", 2))
|
||
|
{
|
||
|
diff --git a/tools/nut-scanner/nut-scan.h b/tools/nut-scanner/nut-scan.h
|
||
|
index affcc77..8b9f1ab 100644
|
||
|
--- a/tools/nut-scanner/nut-scan.h
|
||
|
+++ b/tools/nut-scanner/nut-scan.h
|
||
|
@@ -1,6 +1,8 @@
|
||
|
/* nut-scan.h: detect NUT services
|
||
|
*
|
||
|
- * Copyright (C) 2011 - Frederic Bohe <fredericbohe@eaton.com>
|
||
|
+ * Copyright (C)
|
||
|
+ * 2011 - Frederic Bohe <fredericbohe@eaton.com>
|
||
|
+ * 2012 - 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
|
||
|
@@ -16,6 +18,7 @@
|
||
|
* along with this program; if not, write to the Free Software
|
||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
*/
|
||
|
+
|
||
|
#ifndef NUT_SCAN_H
|
||
|
#define NUT_SCAN_H
|
||
|
|
||
|
@@ -23,6 +26,10 @@
|
||
|
#include <nutscan-device.h>
|
||
|
#include <nutscan-ip.h>
|
||
|
|
||
|
+#ifdef WITH_IPMI
|
||
|
+#include <freeipmi/freeipmi.h>
|
||
|
+#endif
|
||
|
+
|
||
|
/* SNMP structure */
|
||
|
typedef struct nutscan_snmp {
|
||
|
char * community;
|
||
|
@@ -36,8 +43,34 @@ typedef struct nutscan_snmp {
|
||
|
void * handle;
|
||
|
} nutscan_snmp_t;
|
||
|
|
||
|
+/* IPMI structure */
|
||
|
+/* Settings for OutofBand (remote) connection */
|
||
|
+typedef struct nutscan_ipmi {
|
||
|
+ char* username; /* IPMI 1.5 and 2.0 */
|
||
|
+ char* password; /* IPMI 1.5 and 2.0 */
|
||
|
+ int authentication_type; /* IPMI 1.5 */
|
||
|
+ int cipher_suite_id; /* IPMI 2.0 */
|
||
|
+ char* K_g_BMC_key; /* IPMI 2.0, optional key for 2 key auth. */
|
||
|
+ int privilege_level; /* for both */
|
||
|
+ unsigned int workaround_flags; /* for both */
|
||
|
+ int ipmi_version; /* IPMI 1.5 or 2.0? */
|
||
|
+} nutscan_ipmi_t;
|
||
|
+
|
||
|
+/* IPMI auth defines, simply using FreeIPMI defines */
|
||
|
+#ifndef IPMI_AUTHENTICATION_TYPE_NONE
|
||
|
+ #define IPMI_AUTHENTICATION_TYPE_NONE 0x00
|
||
|
+ #define IPMI_AUTHENTICATION_TYPE_MD2 0x01
|
||
|
+ #define IPMI_AUTHENTICATION_TYPE_MD5 0x02
|
||
|
+ #define IPMI_AUTHENTICATION_TYPE_STRAIGHT_PASSWORD_KEY 0x04
|
||
|
+ #define IPMI_AUTHENTICATION_TYPE_OEM_PROP 0x05
|
||
|
+ #define IPMI_AUTHENTICATION_TYPE_RMCPPLUS 0x06
|
||
|
+#endif /* IPMI_AUTHENTICATION_TYPE_NONE */
|
||
|
+
|
||
|
+#define IPMI_1_5 1
|
||
|
+#define IPMI_2_0 0
|
||
|
+
|
||
|
/* Scanning */
|
||
|
-nutscan_device_t * nutscan_scan_snmp(const char * start_ip,const char * stop_ip,long usec_timeout, nutscan_snmp_t * sec);
|
||
|
+nutscan_device_t * nutscan_scan_snmp(const char * start_ip, const char * stop_ip, long usec_timeout, nutscan_snmp_t * sec);
|
||
|
|
||
|
nutscan_device_t * nutscan_scan_usb();
|
||
|
|
||
|
@@ -47,7 +80,7 @@ nutscan_device_t * nutscan_scan_nut(const char * startIP, const char * stopIP, c
|
||
|
|
||
|
nutscan_device_t * nutscan_scan_avahi(long usec_timeout);
|
||
|
|
||
|
-nutscan_device_t * nutscan_scan_ipmi(void);
|
||
|
+nutscan_device_t * nutscan_scan_ipmi(const char * startIP, const char * stopIP, nutscan_ipmi_t * sec);
|
||
|
|
||
|
/* Display functions */
|
||
|
void nutscan_display_ups_conf(nutscan_device_t * device);
|
||
|
diff --git a/tools/nut-scanner/nut-scanner.c b/tools/nut-scanner/nut-scanner.c
|
||
|
index 52e0da7..7ca1554 100644
|
||
|
--- a/tools/nut-scanner/nut-scanner.c
|
||
|
+++ b/tools/nut-scanner/nut-scanner.c
|
||
|
@@ -35,7 +35,7 @@
|
||
|
|
||
|
#define ERR_BAD_OPTION (-1)
|
||
|
|
||
|
-const char optstring[] = "?ht:s:e:c:l:u:W:X:w:x:p:CUSMOAm:NPqIVa";
|
||
|
+const char optstring[] = "?ht:s:e:c:l:u:W:X:w:x:p:b:B:d:D:CUSMOAm:NPqIVa";
|
||
|
|
||
|
#ifdef HAVE_GETOPT_LONG
|
||
|
const struct option longopts[] =
|
||
|
@@ -50,6 +50,10 @@ const struct option longopts[] =
|
||
|
{ "privPassword",required_argument,NULL,'X' },
|
||
|
{ "authProtocol",required_argument,NULL,'w' },
|
||
|
{ "privProtocol",required_argument,NULL,'x' },
|
||
|
+ { "username",required_argument,NULL,'b' },
|
||
|
+ { "password",required_argument,NULL,'B' },
|
||
|
+ { "authType",required_argument,NULL,'d' },
|
||
|
+ { "cipher_suite_id",required_argument,NULL,'D' },
|
||
|
{ "port",required_argument,NULL,'p' },
|
||
|
{ "complete_scan",no_argument,NULL,'C' },
|
||
|
{ "usb_scan",no_argument,NULL,'U' },
|
||
|
@@ -110,7 +114,9 @@ static void * run_avahi(void * arg)
|
||
|
}
|
||
|
static void * run_ipmi(void * arg)
|
||
|
{
|
||
|
- dev[TYPE_IPMI] = nutscan_scan_ipmi();
|
||
|
+ nutscan_ipmi_t * sec = (nutscan_ipmi_t *)arg;
|
||
|
+
|
||
|
+ dev[TYPE_IPMI] = nutscan_scan_ipmi(start_ip,end_ip,sec);
|
||
|
return NULL;
|
||
|
}
|
||
|
#endif /* HAVE_PTHREAD */
|
||
|
@@ -133,6 +139,7 @@ static int printq(int quiet,const char *fmt, ...)
|
||
|
int main(int argc, char *argv[])
|
||
|
{
|
||
|
nutscan_snmp_t snmp_sec;
|
||
|
+ nutscan_ipmi_t ipmi_sec;
|
||
|
int opt_ret;
|
||
|
char * cidr = NULL;
|
||
|
int allow_all = 0;
|
||
|
@@ -147,6 +154,12 @@ int main(int argc, char *argv[])
|
||
|
int ret_code = EXIT_SUCCESS;
|
||
|
|
||
|
memset(&snmp_sec, 0, sizeof(snmp_sec));
|
||
|
+ memset(&ipmi_sec, 0, sizeof(ipmi_sec));
|
||
|
+ /* Set the default values for IPMI */
|
||
|
+ ipmi_sec.authentication_type = IPMI_AUTHENTICATION_TYPE_MD5;
|
||
|
+ ipmi_sec.ipmi_version = IPMI_1_5; /* default to IPMI 1.5, if not otherwise specified */
|
||
|
+ ipmi_sec.cipher_suite_id = 3; /* default to HMAC-SHA1; HMAC-SHA1-96; AES-CBC-128 */
|
||
|
+ ipmi_sec.privilege_level = IPMI_PRIVILEGE_LEVEL_ADMIN; /* should be sufficient */
|
||
|
|
||
|
nutscan_init();
|
||
|
|
||
|
@@ -220,6 +233,45 @@ int main(int argc, char *argv[])
|
||
|
}
|
||
|
allow_snmp = 1;
|
||
|
break;
|
||
|
+ case 'b':
|
||
|
+ if(!nutscan_avail_ipmi) {
|
||
|
+ goto display_help;
|
||
|
+ }
|
||
|
+ ipmi_sec.username = strdup(optarg);
|
||
|
+ break;
|
||
|
+ case 'B':
|
||
|
+ if(!nutscan_avail_ipmi) {
|
||
|
+ goto display_help;
|
||
|
+ }
|
||
|
+ ipmi_sec.password = strdup(optarg);
|
||
|
+ break;
|
||
|
+ case 'd':
|
||
|
+ if(!nutscan_avail_ipmi) {
|
||
|
+ goto display_help;
|
||
|
+ }
|
||
|
+ if (!strcmp(optarg, "NONE")) {
|
||
|
+ ipmi_sec.authentication_type = IPMI_AUTHENTICATION_TYPE_NONE;
|
||
|
+ }
|
||
|
+ else if (!strcmp(optarg, "STRAIGHT_PASSWORD_KEY")) {
|
||
|
+ ipmi_sec.authentication_type = IPMI_AUTHENTICATION_TYPE_STRAIGHT_PASSWORD_KEY;
|
||
|
+ }
|
||
|
+ else if (!strcmp(optarg, "MD2")) {
|
||
|
+ ipmi_sec.authentication_type = IPMI_AUTHENTICATION_TYPE_MD2;
|
||
|
+ }
|
||
|
+ else if (!strcmp(optarg, "MD5")) {
|
||
|
+ ipmi_sec.authentication_type = IPMI_AUTHENTICATION_TYPE_MD5;
|
||
|
+ }
|
||
|
+ else {
|
||
|
+ fprintf(stderr,"Unknown authentication type (%s). Defaulting to MD5\n", optarg);
|
||
|
+ }
|
||
|
+ break;
|
||
|
+ case 'D':
|
||
|
+ if(!nutscan_avail_ipmi) {
|
||
|
+ goto display_help;
|
||
|
+ }
|
||
|
+ ipmi_sec.cipher_suite_id = atoi(optarg);
|
||
|
+ /* Force IPMI 2.0! */
|
||
|
+ ipmi_sec.ipmi_version = IPMI_2_0;
|
||
|
case 'p':
|
||
|
port = strdup(optarg);
|
||
|
break;
|
||
|
@@ -307,6 +359,8 @@ display_help:
|
||
|
if( nutscan_avail_ipmi ) {
|
||
|
printf(" -I, --ipmi_scan: Scan IPMI devices.\n");
|
||
|
}
|
||
|
+
|
||
|
+ printf("\nNetwork specific options:\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");
|
||
|
@@ -325,6 +379,18 @@ display_help:
|
||
|
printf(" -X, --privPassword <privacy pass phrase>: Set the privacy pass phrase used for encrypted SNMPv3 messages (mandatory if you set secLevel to authPriv)\n");
|
||
|
}
|
||
|
|
||
|
+ if( nutscan_avail_ipmi ) {
|
||
|
+ printf("\nIPMI over LAN specific options:\n");
|
||
|
+ printf(" -b, --username <username>: Set the username used for authenticating IPMI over LAN connections (mandatory for IPMI over LAN. No default)\n");
|
||
|
+ /* Specify the username to use when authenticating with the remote host. If not specified, a null (i.e. anonymous) username is assumed. The user must have
|
||
|
+ * at least ADMIN privileges in order for this tool to operate fully. */
|
||
|
+ printf(" -B, --password <password>: Specify the password to use when authenticationg with the remote host (mandatory for IPMI over LAN. No default)\n");
|
||
|
+ /* Specify the password to use when authenticationg with the remote host. If not specified, a null password is assumed. Maximum password length is 16 for IPMI
|
||
|
+ * 1.5 and 20 for IPMI 2.0. */
|
||
|
+ printf(" -d, --authType <authentication type>: Specify the IPMI 1.5 authentication type to use (NONE, STRAIGHT_PASSWORD_KEY, MD2, and MD5) with the remote host (default=MD5)\n");
|
||
|
+ printf(" -D, --cipher_suite_id <cipher suite id>: Specify the IPMI 2.0 cipher suite ID to use, for authentication, integrity, and confidentiality (default=3)\n");
|
||
|
+ }
|
||
|
+
|
||
|
printf("\nNUT specific options:\n");
|
||
|
printf(" -p, --port <port number>: Port number of remote NUT upsd\n");
|
||
|
printf("\ndisplay specific options:\n");
|
||
|
@@ -427,11 +493,11 @@ display_help:
|
||
|
if( allow_ipmi && nutscan_avail_ipmi) {
|
||
|
printq(quiet,"Scanning IPMI bus.\n");
|
||
|
#ifdef HAVE_PTHREAD
|
||
|
- if(pthread_create(&thread[TYPE_IPMI],NULL,run_ipmi,NULL)) {
|
||
|
+ if(pthread_create(&thread[TYPE_IPMI],NULL,run_ipmi,&ipmi_sec)) {
|
||
|
nutscan_avail_ipmi = 0;
|
||
|
}
|
||
|
#else
|
||
|
- dev[TYPE_IPMI] = nutscan_scan_ipmi();
|
||
|
+ dev[TYPE_IPMI] = nutscan_scan_ipmi(start_ip,end_ip,timeout,&ipmi_sec);
|
||
|
#endif /* HAVE_PTHREAD */
|
||
|
}
|
||
|
|
||
|
diff --git a/tools/nut-scanner/scan_ipmi.c b/tools/nut-scanner/scan_ipmi.c
|
||
|
index c1ec78a..0288ad4 100644
|
||
|
--- a/tools/nut-scanner/scan_ipmi.c
|
||
|
+++ b/tools/nut-scanner/scan_ipmi.c
|
||
|
@@ -29,6 +29,11 @@
|
||
|
|
||
|
#define NUT_IPMI_DRV_NAME "nut-ipmipsu"
|
||
|
|
||
|
+/* IPMI defines */
|
||
|
+/* 5 seconds for establishing an IPMI connection */
|
||
|
+#define IPMI_SESSION_TIMEOUT_LENGTH_DEFAULT 5000
|
||
|
+#define IPMI_RETRANSMISSION_TIMEOUT_LENGTH_DEFAULT 250
|
||
|
+
|
||
|
/* dynamic link library stuff */
|
||
|
static char * libname = "libfreeipmi";
|
||
|
static lt_dlhandle dl_handle = NULL;
|
||
|
@@ -88,10 +93,23 @@ static int (*nut_ipmi_ctx_find_inband) (ipmi_ctx_t ctx,
|
||
|
const char *driver_device,
|
||
|
unsigned int workaround_flags,
|
||
|
unsigned int flags);
|
||
|
+static int (*nut_ipmi_ctx_open_outofband) (ipmi_ctx_t ctx,
|
||
|
+ const char *hostname,
|
||
|
+ const char *username,
|
||
|
+ const char *password,
|
||
|
+ uint8_t authentication_type,
|
||
|
+ uint8_t privilege_level,
|
||
|
+ unsigned int session_timeout,
|
||
|
+ unsigned int retransmission_timeout,
|
||
|
+ unsigned int workaround_flags,
|
||
|
+ unsigned int flags);
|
||
|
+static int (*nut_ipmi_ctx_errnum) (ipmi_ctx_t ctx);
|
||
|
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);
|
||
|
|
||
|
+/* Internal functions */
|
||
|
+static nutscan_device_t * nutscan_scan_ipmi_device(const char * IPaddr, nutscan_ipmi_t * sec);
|
||
|
|
||
|
/* Return 0 on error */
|
||
|
int nutscan_load_ipmi_library()
|
||
|
@@ -189,6 +207,16 @@ int nutscan_load_ipmi_library()
|
||
|
goto err;
|
||
|
}
|
||
|
|
||
|
+ *(void **) (&nut_ipmi_ctx_open_outofband) = lt_dlsym(dl_handle, "ipmi_ctx_open_outofband");
|
||
|
+ if ((dl_error = lt_dlerror()) != NULL) {
|
||
|
+ goto err;
|
||
|
+ }
|
||
|
+
|
||
|
+ *(void **) (&nut_ipmi_ctx_errnum) = lt_dlsym(dl_handle, "ipmi_ctx_errnum");
|
||
|
+ 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;
|
||
|
@@ -265,10 +293,10 @@ int is_ipmi_device_supported(ipmi_ctx_t ipmi_ctx, int ipmi_id)
|
||
|
/* Parse FRU information */
|
||
|
if (!(fru_parse_ctx = (*nut_ipmi_fru_ctx_create) (ipmi_ctx)))
|
||
|
{
|
||
|
- fprintf(stderr, "ipmi_fru_parse_ctx_create()\n");
|
||
|
+ fprintf(stderr, "Error with %s(): %s\n", IPMI_FRU_CTX_CREATE, (*nut_ipmi_ctx_errormsg)(ipmi_ctx));
|
||
|
return 0;
|
||
|
}
|
||
|
-fprintf(stdout, "There.1\n");
|
||
|
+
|
||
|
/* lots of motherboards calculate checksums incorrectly */
|
||
|
if ((*nut_ipmi_fru_ctx_set_flags) (fru_parse_ctx, IPMI_FRU_FLAGS_SKIP_CHECKSUM_CHECKS) < 0)
|
||
|
{
|
||
|
@@ -279,7 +307,7 @@ fprintf(stdout, "There.1\n");
|
||
|
#endif /* HAVE_FREEIPMI_11X_12X */
|
||
|
return 0;
|
||
|
}
|
||
|
-fprintf(stdout, "There.2\n");
|
||
|
+
|
||
|
if ((*nut_ipmi_fru_open_device_id) (fru_parse_ctx, ipmi_id) < 0)
|
||
|
{
|
||
|
#ifdef HAVE_FREEIPMI_11X_12X
|
||
|
@@ -292,7 +320,6 @@ fprintf(stdout, "There.2\n");
|
||
|
|
||
|
do
|
||
|
{
|
||
|
-fprintf(stdout, "There.3\n");
|
||
|
/* clear fields */
|
||
|
area_type = 0;
|
||
|
area_length = 0;
|
||
|
@@ -337,20 +364,21 @@ fprintf(stdout, "There.3\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
-/* return NULL on error */
|
||
|
-nutscan_device_t * nutscan_scan_ipmi()
|
||
|
+/* Check for IPMI support on a specific (local or remote) system
|
||
|
+ * Return NULL on error, or a valid nutscan_device_t otherwise */
|
||
|
+nutscan_device_t * nutscan_scan_ipmi_device(const char * IPaddr, nutscan_ipmi_t * ipmi_sec)
|
||
|
{
|
||
|
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];
|
||
|
+ char port_id[64];
|
||
|
|
||
|
if( !nutscan_avail_ipmi ) {
|
||
|
return NULL;
|
||
|
}
|
||
|
-fprintf(stdout, "There1\n");
|
||
|
+
|
||
|
/* Initialize the FreeIPMI library. */
|
||
|
if (!(ipmi_ctx = (*nut_ipmi_ctx_create) ()))
|
||
|
{
|
||
|
@@ -359,34 +387,138 @@ fprintf(stdout, "There1\n");
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
-fprintf(stdout, "There2\n");
|
||
|
- 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 */
|
||
|
- IPMI_FLAGS_NONBLOCKING /* flags */
|
||
|
- )) < 0)
|
||
|
+ /* Are we scanning locally, or over the network? */
|
||
|
+ if (IPaddr == NULL)
|
||
|
{
|
||
|
- fprintf(stderr, "ipmi_ctx_find_inband: %s\n",
|
||
|
- (*nut_ipmi_ctx_errormsg) (ipmi_ctx));
|
||
|
- return NULL;
|
||
|
+ /* FIXME: we need root right to access local IPMI!
|
||
|
+ if (!ipmi_is_root ()) {
|
||
|
+ fprintf(stderr, "IPMI scan: %s\n", ipmi_ctx_strerror (IPMI_ERR_PERMISSION));
|
||
|
+ } */
|
||
|
+
|
||
|
+ 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;
|
||
|
+ }
|
||
|
}
|
||
|
- if (!ret)
|
||
|
- {
|
||
|
- /* No local IPMI device detected */
|
||
|
- return NULL;
|
||
|
+ else {
|
||
|
+
|
||
|
+#if 0
|
||
|
+ if (ipmi_sec->ipmi_version == IPMI_2_0) {
|
||
|
+
|
||
|
+ /* FIXME: need processing?!
|
||
|
+ * int parse_kg (void *out, unsigned int outlen, const char *in)
|
||
|
+ * if ((rv = parse_kg (common_cmd_args_config->k_g, IPMI_MAX_K_G_LENGTH + 1, data->string)) < 0)
|
||
|
+ * {
|
||
|
+ * fprintf (stderr, "Config File Error: k_g input formatted incorrectly\n");
|
||
|
+ * exit (EXIT_FAILURE);
|
||
|
+ * }*/
|
||
|
+ if ((ret = (*nut_ipmi_ctx_open_outofband_2_0) (ipmi_ctx,
|
||
|
+ IPaddr,
|
||
|
+ ipmi_sec->username,
|
||
|
+ ipmi_sec->password,
|
||
|
+ ipmi_sec->K_g_BMC_key,
|
||
|
+??? (ipmi_sec->K_g_BMC_key) ? config->k_g_len : 0,
|
||
|
+ ipmi_sec->privilege_level,
|
||
|
+ ipmi_sec->cipher_suite_id,
|
||
|
+ IPMI_SESSION_TIMEOUT_LENGTH_DEFAULT,
|
||
|
+ IPMI_RETRANSMISSION_TIMEOUT_LENGTH_DEFAULT,
|
||
|
+ ipmi_dev->workaround_flags,
|
||
|
+ flags) < 0)
|
||
|
+ {
|
||
|
+ IPMI_MONITORING_DEBUG (("ipmi_ctx_open_outofband_2_0: %s", ipmi_ctx_errormsg (c->ipmi_ctx)));
|
||
|
+ if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_USERNAME_INVALID)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_USERNAME_INVALID;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_PASSWORD_INVALID)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_PASSWORD_INVALID;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_PRIVILEGE_LEVEL_INSUFFICIENT)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_PRIVILEGE_LEVEL_INSUFFICIENT;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_PRIVILEGE_LEVEL_CANNOT_BE_OBTAINED)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_PRIVILEGEL_LEVEL_CANNOT_BE_OBTAINED;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_K_G_INVALID)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_K_G_INVALID;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_CIPHER_SUITE_ID_UNAVAILABLE)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_CIPHER_SUITE_ID_UNAVAILABLE;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_PASSWORD_VERIFICATION_TIMEOUT)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_PASSWORD_VERIFICATION_TIMEOUT;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_IPMI_2_0_UNAVAILABLE)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_IPMI_2_0_UNAVAILABLE;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_CONNECTION_TIMEOUT)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_CONNECTION_TIMEOUT;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_SESSION_TIMEOUT)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_SESSION_TIMEOUT;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_BAD_COMPLETION_CODE
|
||
|
+ || ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_IPMI_ERROR)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_IPMI_ERROR;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_BMC_BUSY)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_BMC_BUSY;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_OUT_OF_MEMORY)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_OUT_OF_MEMORY;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_HOSTNAME_INVALID)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_HOSTNAME_INVALID;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_PARAMETERS)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_PARAMETERS;
|
||
|
+ else if (ipmi_ctx_errnum (c->ipmi_ctx) == IPMI_ERR_SYSTEM_ERROR)
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_SYSTEM_ERROR;
|
||
|
+ else
|
||
|
+ c->errnum = IPMI_MONITORING_ERR_INTERNAL_ERROR;
|
||
|
+ return (-1);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ else { /* Not IPMI 2.0 */
|
||
|
+
|
||
|
+#endif /* 0 */
|
||
|
+
|
||
|
+ /* Fall back to IPMI 1.5 */
|
||
|
+ if ((ret = (*nut_ipmi_ctx_open_outofband) (ipmi_ctx,
|
||
|
+ IPaddr,
|
||
|
+ ipmi_sec->username,
|
||
|
+ ipmi_sec->password,
|
||
|
+ ipmi_sec->authentication_type,
|
||
|
+ ipmi_sec->privilege_level,
|
||
|
+ IPMI_SESSION_TIMEOUT_LENGTH_DEFAULT,
|
||
|
+ IPMI_RETRANSMISSION_TIMEOUT_LENGTH_DEFAULT,
|
||
|
+ ipmi_sec->workaround_flags,
|
||
|
+ IPMI_FLAGS_DEFAULT
|
||
|
+ )) < 0)
|
||
|
+ {
|
||
|
+ /* No IPMI device detected on this host!
|
||
|
+ if ((*nut_ipmi_ctx_errnum) (ipmi_ctx) == IPMI_ERR_USERNAME_INVALID
|
||
|
+ || (*nut_ipmi_ctx_errnum) (ipmi_ctx) == IPMI_ERR_PASSWORD_INVALID
|
||
|
+ || (*nut_ipmi_ctx_errnum) (ipmi_ctx) == IPMI_ERR_PRIVILEGE_LEVEL_INSUFFICIENT
|
||
|
+ || (*nut_ipmi_ctx_errnum) (ipmi_ctx) == IPMI_ERR_PRIVILEGE_LEVEL_CANNOT_BE_OBTAINED
|
||
|
+ || (*nut_ipmi_ctx_errnum) (ipmi_ctx) == IPMI_ERR_AUTHENTICATION_TYPE_UNAVAILABLE
|
||
|
+ || (*nut_ipmi_ctx_errnum) (ipmi_ctx) == IPMI_ERR_PASSWORD_VERIFICATION_TIMEOUT
|
||
|
+ || (*nut_ipmi_ctx_errnum) (ipmi_ctx) == IPMI_ERR_HOSTNAME_INVALID
|
||
|
+ || (*nut_ipmi_ctx_errnum) (ipmi_ctx) == IPMI_ERR_CONNECTION_TIMEOUT) { */
|
||
|
+
|
||
|
+ /* FIXME: don't log timeout errors */
|
||
|
+ fprintf(stderr, "nut_ipmi_ctx_open_outofband: %s\n",
|
||
|
+ (*nut_ipmi_ctx_errormsg) (ipmi_ctx));
|
||
|
+ return NULL;
|
||
|
+ /*}*/
|
||
|
+ }
|
||
|
}
|
||
|
-fprintf(stdout, "There3 (ret = %i)\n", ret);
|
||
|
|
||
|
/* Loop through all possible components */
|
||
|
for (ipmi_id = 0 ; ipmi_id <= IPMI_FRU_DEVICE_ID_MAX ; ipmi_id++) {
|
||
|
-fprintf(stdout, "There4\n");
|
||
|
+
|
||
|
if (is_ipmi_device_supported(ipmi_ctx, ipmi_id)) {
|
||
|
|
||
|
-fprintf(stdout, "There4.%i\n", ipmi_id);
|
||
|
if ( (nut_dev = nutscan_new_device()) == NULL ) {
|
||
|
fprintf(stderr,"Memory allocation error\n");
|
||
|
nutscan_free_device(current_nut_dev);
|
||
|
@@ -396,9 +528,17 @@ fprintf(stdout, "There4.%i\n", ipmi_id);
|
||
|
/* 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);
|
||
|
+ if (IPaddr == NULL) {
|
||
|
+ sprintf(port_id, "id%x", ipmi_id);
|
||
|
+ }
|
||
|
+ else {
|
||
|
+ /* FIXME: also check against "localhost" and its IPv{4,6} */
|
||
|
+ sprintf(port_id, "id%x@%s", ipmi_id, IPaddr);
|
||
|
+ }
|
||
|
nut_dev->port = strdup(port_id);
|
||
|
-
|
||
|
+ /* FIXME: also dump device.serial?
|
||
|
+ * using drivers/libfreeipmi_get_board_info() */
|
||
|
+
|
||
|
current_nut_dev = nutscan_add_device_to_device(
|
||
|
current_nut_dev,
|
||
|
nut_dev);
|
||
|
@@ -415,9 +555,50 @@ fprintf(stdout, "There4.%i\n", ipmi_id);
|
||
|
|
||
|
return current_nut_dev;
|
||
|
}
|
||
|
+
|
||
|
+/* General IPMI scan entry point: scan 1 to n devices, local or remote,
|
||
|
+ * for IPMI support
|
||
|
+ * Return NULL on error, or a valid nutscan_device_t otherwise */
|
||
|
+nutscan_device_t * nutscan_scan_ipmi(const char * start_ip, const char * stop_ip, nutscan_ipmi_t * sec)
|
||
|
+{
|
||
|
+ nutscan_ip_iter_t ip;
|
||
|
+ char * ip_str = NULL;
|
||
|
+ nutscan_ipmi_t * tmp_sec;
|
||
|
+ nutscan_device_t * nut_dev = NULL;
|
||
|
+ nutscan_device_t * current_nut_dev = NULL;
|
||
|
+
|
||
|
+ if( !nutscan_avail_ipmi ) {
|
||
|
+ return NULL;
|
||
|
+ }
|
||
|
+
|
||
|
+
|
||
|
+ /* Are we scanning locally, or through the network? */
|
||
|
+ if (start_ip == NULL)
|
||
|
+ {
|
||
|
+ /* Local PSU scan */
|
||
|
+ current_nut_dev = nutscan_scan_ipmi_device(NULL, NULL);
|
||
|
+ }
|
||
|
+ else {
|
||
|
+ ip_str = nutscan_ip_iter_init(&ip, start_ip, stop_ip);
|
||
|
+
|
||
|
+ while(ip_str != NULL) {
|
||
|
+ tmp_sec = malloc(sizeof(nutscan_ipmi_t));
|
||
|
+ memcpy(tmp_sec, sec, sizeof(nutscan_ipmi_t));
|
||
|
+
|
||
|
+ if ((current_nut_dev = nutscan_scan_ipmi_device(ip_str, tmp_sec)) != NULL) {
|
||
|
+ /* Store the positive result */
|
||
|
+ current_nut_dev = nutscan_add_device_to_device(current_nut_dev, nut_dev);
|
||
|
+ }
|
||
|
+ /* Prepare the next iteration */
|
||
|
+ ip_str = nutscan_ip_iter_inc(&ip);
|
||
|
+ };
|
||
|
+ }
|
||
|
+
|
||
|
+ return current_nut_dev;
|
||
|
+}
|
||
|
#else /* WITH_IPMI */
|
||
|
/* stub function */
|
||
|
-nutscan_device_t * nutscan_scan_ipmi()
|
||
|
+nutscan_device_t * nutscan_scan_ipmi(const char * startIP, const char * stopIP, nutscan_ipmi_t * sec)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
--
|
||
|
1.7.10.2
|
||
|
|
||
|
|
||
|
From 3d0002653a506f2acb24be2201724e7b785de784 Mon Sep 17 00:00:00 2001
|
||
|
From: Arnaud Quette <arnaud.quette@free.fr>
|
||
|
Date: Fri, 5 Oct 2012 10:27:55 +0000
|
||
|
Subject: [PATCH] Fix compilation error
|
||
|
|
||
|
Define IPMI_PRIVILEGE_LEVEL_ADMIN value, in case FreeIPMI is not
|
||
|
available
|
||
|
|
||
|
Fossil-ID: SVN r3741
|
||
|
---
|
||
|
tools/nut-scanner/nut-scan.h | 5 ++++-
|
||
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/tools/nut-scanner/nut-scan.h b/tools/nut-scanner/nut-scan.h
|
||
|
index 8b9f1ab..b853d96 100644
|
||
|
--- a/tools/nut-scanner/nut-scan.h
|
||
|
+++ b/tools/nut-scanner/nut-scan.h
|
||
|
@@ -64,7 +64,10 @@ typedef struct nutscan_ipmi {
|
||
|
#define IPMI_AUTHENTICATION_TYPE_STRAIGHT_PASSWORD_KEY 0x04
|
||
|
#define IPMI_AUTHENTICATION_TYPE_OEM_PROP 0x05
|
||
|
#define IPMI_AUTHENTICATION_TYPE_RMCPPLUS 0x06
|
||
|
-#endif /* IPMI_AUTHENTICATION_TYPE_NONE */
|
||
|
+#endif
|
||
|
+#ifndef IPMI_PRIVILEGE_LEVEL_ADMIN
|
||
|
+ #define IPMI_PRIVILEGE_LEVEL_ADMIN 0x04
|
||
|
+#endif
|
||
|
|
||
|
#define IPMI_1_5 1
|
||
|
#define IPMI_2_0 0
|
||
|
--
|
||
|
1.7.10.2
|
||
|
|
||
|
|
||
|
From 605ef0a46fbb8519b849683028f7e6cf35eb2fdd Mon Sep 17 00:00:00 2001
|
||
|
From: Arnaud Quette <arnaud.quette@free.fr>
|
||
|
Date: Thu, 11 Apr 2013 23:15:51 +0200
|
||
|
Subject: [PATCH] Set USB timeout to 5 seconds
|
||
|
|
||
|
Set the low level USB timeout back to the standard
|
||
|
5 seconds. This was set to 4 seconds, for performance
|
||
|
reasons, but is now causing issues with some devices
|
||
|
(reported by Stefan "stevenbg", GitHub issue #23)
|
||
|
---
|
||
|
drivers/libusb.c | 7 +++----
|
||
|
1 file changed, 3 insertions(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/libusb.c b/drivers/libusb.c
|
||
|
index 50bfc7f..234b9f1 100644
|
||
|
--- a/drivers/libusb.c
|
||
|
+++ b/drivers/libusb.c
|
||
|
@@ -33,12 +33,11 @@
|
||
|
#include "usb-common.h"
|
||
|
#include "libusb.h"
|
||
|
|
||
|
-/* USB standard state 5000, but we've decreased it to
|
||
|
- * improve reactivity */
|
||
|
-#define USB_TIMEOUT 4000
|
||
|
+/* USB standard timeout */
|
||
|
+#define USB_TIMEOUT 5000
|
||
|
|
||
|
#define USB_DRIVER_NAME "USB communication driver"
|
||
|
-#define USB_DRIVER_VERSION "0.31"
|
||
|
+#define USB_DRIVER_VERSION "0.32"
|
||
|
|
||
|
/* driver description structure */
|
||
|
upsdrv_info_t comm_upsdrv_info = {
|
||
|
--
|
||
|
1.7.10.2
|
||
|
|