Commit 7472a026 authored by Adam Wujek's avatar Adam Wujek 💬

userspace/snmpd: add new wrsDiskTable

New table with information about mounted partitions

Add new wrsDiskTable with objects:
--wrsDiskMountPath
--wrsDiskSize
--wrsDiskUsed
--wrsDiskFree
--wrsDiskUseRate
--wrsDiskFilesystem

Additionally:
-- update of MIB
-- update Makefile
-- update init.c
Signed-off-by: Adam Wujek's avatarAdam Wujek <adam.wujek@cern.ch>
parent 39541f9d
......@@ -40,6 +40,7 @@ SOURCES = \
wrsTemperatureGroup.c \
wrsMemoryGroup.c \
wrsCpuLoadGroup.c \
wrsDiskTable.c \
wrsStartCntGroup.c \
wrsSpllVersionGroup.c \
wrsSpllStatusGroup.c \
......
......@@ -786,6 +786,91 @@ wrsCPULoadAvg15min OBJECT-TYPE
"Load average over 15min multiplied by 100"
::= { wrsCpuLoadGroup 3 }
-- wrsDiskTable (.7.1.6)
wrsDiskTable OBJECT-TYPE
SYNTAX SEQUENCE OF WrsDiskEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Information for each mounted partition"
::= { wrsOperationStatus 6 }
wrsDiskEntry OBJECT-TYPE
SYNTAX WrsDiskEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"An entry containing partitions' details"
INDEX { wrsDiskIndex }
::= { wrsDiskTable 1 }
WrsDiskEntry ::=
SEQUENCE {
wrsDiskIndex Unsigned32,
wrsDiskMountPath DisplayString,
wrsDiskSize Integer32,
wrsDiskUsed Integer32,
wrsDiskFree Integer32,
wrsDiskUseRate Integer32,
wrsDiskFilesystem DisplayString
}
wrsDiskIndex OBJECT-TYPE
SYNTAX Unsigned32
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Index for wrsDiskTable"
::= { wrsDiskEntry 1 }
wrsDiskMountPath OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..32))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Mount patch of reported partition"
::= { wrsDiskEntry 2 }
wrsDiskSize OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Partition size"
::= { wrsDiskEntry 3 }
wrsDiskUsed OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Used space on partition"
::= { wrsDiskEntry 4 }
wrsDiskFree OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Free space on partition"
::= { wrsDiskEntry 5 }
wrsDiskUseRate OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Percentage of used space on partition"
::= { wrsDiskEntry 6 }
wrsDiskFilesystem OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..64))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Filesystem reported by df command"
::= { wrsDiskEntry 7 }
-- wrsStartCntGroup (.7.2)
wrsStartCntGroup OBJECT IDENTIFIER ::= { wrsExpertStatus 2 }
......
......@@ -19,6 +19,7 @@
#include "wrsTemperatureGroup.h"
#include "wrsMemoryGroup.h"
#include "wrsCpuLoadGroup.h"
#include "wrsDiskTable.h"
#include "wrsStartCntGroup.h"
#include "wrsSpllVersionGroup.h"
#include "wrsSpllStatusGroup.h"
......@@ -50,6 +51,7 @@ void init_wrsSnmp(void)
init_wrsTemperatureGroup();
init_wrsMemoryGroup();
init_wrsCpuLoadGroup();
init_wrsDiskTable();
init_wrsStartCntGroup();
init_wrsSpllVersionGroup();
init_wrsSpllStatusGroup();
......
#include "wrsSnmp.h"
#include "snmp_shmem.h"
#include "wrsDiskTable.h"
#define DISKUSAGE_COMMAND "/bin/df -P"
struct wrsDiskTable_s wrsDiskTable_array[WRS_MAX_N_DISKS];
static struct pickinfo wrsDiskTable_pickinfo[] = {
/* Warning: strings are a special case for snmp format */
FIELD(wrsDiskTable_s, ASN_UNSIGNED, wrsDiskIndex), /* not reported */
FIELD(wrsDiskTable_s, ASN_OCTET_STR, wrsDiskMountPath),
FIELD(wrsDiskTable_s, ASN_INTEGER, wrsDiskSize),
FIELD(wrsDiskTable_s, ASN_INTEGER, wrsDiskUsed),
FIELD(wrsDiskTable_s, ASN_INTEGER, wrsDiskFree),
FIELD(wrsDiskTable_s, ASN_INTEGER, wrsDiskUseRate),
FIELD(wrsDiskTable_s, ASN_OCTET_STR, wrsDiskFilesystem),
};
static int32_t int_saturate(int64_t value)
{
if (value >= INT32_MAX)
return INT32_MAX;
else if (value <= INT32_MIN)
return INT32_MIN;
return value;
}
time_t wrsDiskTable_data_fill(unsigned int *ret_n_rows)
{
static time_t time_update;
time_t time_cur;
FILE *f;
char filesystem[64];
uint64_t disk_size;
uint64_t disk_used;
uint64_t disk_available;
char mount_path[32];
char s[80];
static int n_rows;
/* number of rows depends on numbef or mounted disks */
if (ret_n_rows)
*ret_n_rows = n_rows;
time_cur = time(NULL);
if (time_update
&& time_cur - time_update < WRSDISKTABLE_CACHE_TIMEOUT) {
/* cache not updated, return last update time */
return time_update;
}
time_update = time_cur;
memset(&wrsDiskTable_array, 0, sizeof(wrsDiskTable_array));
f = popen(DISKUSAGE_COMMAND, "r");
if (!f) {
snmp_log(LOG_ERR, "SNMP: wrsDiskTable filed to execute "
DISKUSAGE_COMMAND"\n");
return time_cur;
}
/* skip first line with columns' descriptions */
fgets(s, sizeof(s), f);
n_rows = 0;
while (fgets(s, sizeof(s), f)) {
if (n_rows > WRS_MAX_N_DISKS) {
n_rows = WRS_MAX_N_DISKS;
break;
}
if (5 != sscanf(s, "%s %llu %llu %llu %*s %s %*[^\n]",
filesystem, &disk_size, &disk_used,
&disk_available, mount_path))
continue; /* error while reading df's output */
strncpy(wrsDiskTable_array[n_rows].wrsDiskFilesystem,
filesystem, 64);
wrsDiskTable_array[n_rows].wrsDiskSize =
int_saturate(disk_size);
wrsDiskTable_array[n_rows].wrsDiskUsed =
int_saturate(disk_used);
wrsDiskTable_array[n_rows].wrsDiskFree =
int_saturate(disk_available);
wrsDiskTable_array[n_rows].wrsDiskUseRate =
(wrsDiskTable_array[n_rows].wrsDiskUsed * 100)
/wrsDiskTable_array[n_rows].wrsDiskSize;
strncpy(wrsDiskTable_array[n_rows].wrsDiskMountPath,
mount_path, 32);
n_rows++;
}
pclose(f);
if (ret_n_rows)
*ret_n_rows = n_rows;
/* there was an update, return current time */
return time_update;
}
#define TT_OID WRSDISKTABLE_OID
#define TT_PICKINFO wrsDiskTable_pickinfo
#define TT_DATA_FILL_FUNC wrsDiskTable_data_fill
#define TT_DATA_ARRAY wrsDiskTable_array
#define TT_GROUP_NAME "wrsDiskTable"
#define TT_INIT_FUNC init_wrsDiskTable
#define TT_CACHE_TIMEOUT WRSDISKTABLE_CACHE_TIMEOUT
#include "wrsTableTemplate.h"
#ifndef WRS_DISK_TABLE_H
#define WRS_DISK_TABLE_H
#define WRSDISKTABLE_CACHE_TIMEOUT 5
#define WRSDISKTABLE_OID WRS_OID, 7, 1, 6
#define WRS_MAX_N_DISKS 10
struct wrsDiskTable_s {
uint32_t wrsDiskIndex; /* not reported, index fields has to be marked
* as not-accessible in MIB */
char wrsDiskMountPath[32];
uint32_t wrsDiskSize;
uint32_t wrsDiskUsed;
uint32_t wrsDiskFree;
uint32_t wrsDiskUseRate;
char wrsDiskFilesystem[64];
};
extern struct wrsDiskTable_s wrsDiskTable_array[WRS_MAX_N_DISKS];
time_t wrsDiskTable_data_fill(unsigned int *rows);
void init_wrsDiskTable(void);
#endif /* WRS_DISK_TABLE_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment