6
* powernet.h -- part of SNMP interface driver for APC SNMP devices.
7
* Dmitry Frolov <frolov@riss-telecom.ru>
11
#include <ucd-snmp/ucd-snmp-includes.h>
12
#include <shared-tables.h>
14
#define PN_UPSDRV_VERSION "1.0"
17
#define OID_POWERNET_MIB ".1.3.6.1.4.1.318"
19
#define OID_MODEL_NAME ".1.3.6.1.4.1.318.1.1.1.1.1.1.0"
20
#define OID_UPSIDEN ".1.3.6.1.4.1.318.1.1.1.1.1.2.0"
21
#define OID_FIRMREV ".1.3.6.1.4.1.318.1.1.1.1.2.1.0"
22
#define OID_MFRDATE ".1.3.6.1.4.1.318.1.1.1.1.2.2.0"
23
#define OID_SERIAL ".1.3.6.1.4.1.318.1.1.1.1.2.3.0"
24
#define OID_BATT_STATUS ".1.3.6.1.4.1.318.1.1.1.2.1.1.0"
25
#define BATT_UNKNOWN 1 /* unknown -> INFO_STATUS/? */
26
#define BATT_NORMAL 2 /* batteryNormal -> INFO_STATUS/? */
27
#define BATT_LOW 3 /* batteryLow -> INFO_STATUS/LB */
28
#define OID_BATTDATE ".1.3.6.1.4.1.318.1.1.1.2.1.3.0"
29
#define OID_BATT_CHARGE ".1.3.6.1.4.1.318.1.1.1.2.2.1.0"
30
#define OID_UPSTEMP ".1.3.6.1.4.1.318.1.1.1.2.2.2.0"
31
#define OID_BATT_RUNTIME ".1.3.6.1.4.1.318.1.1.1.2.2.3.0"
32
#define OID_INVOLT ".1.3.6.1.4.1.318.1.1.1.3.2.1.0"
33
#define OID_INFREQ ".1.3.6.1.4.1.318.1.1.1.3.2.4.0"
34
#define OID_POWER_STATUS ".1.3.6.1.4.1.318.1.1.1.4.1.1.0"
35
#define PWR_OTHER 1 /* other -> INFO_STATUS/? */
36
#define PWR_NORMAL 2 /* normal -> INFO_STATUS/OL */
37
#define PWR_BATTERY 3 /* battery -> INFO_STATUS/OB */
38
#define PWR_BOOSTER 4 /* booster -> INFO_STATUS/BOOST */
39
#define PWR_SLEEPING 5 /* timedSleeping -> INFO_STATUS/OFF */
40
#define PWR_SOFT_BYPASS 6 /* bypass -> INFO_STATUS/? */
41
#define PWR_NONE 7 /* none -> INFO_STATUS/OFF */
42
#define PWR_REBOOTING 8 /* rebooting -> INFO_STATUS/? */
43
#define PWR_HARD_BYPASS 9 /* bypass -> INFO_STATUS/? */
44
#define PWR_FAIL_BYPASS 10 /* bypass -> INFO_STATUS/? */
45
#define PWR_SLEEPING2 11 /* sleepingUntilPowerReturn -> INFO_STATUS/OFF */
46
#define PWR_REDUCER 12 /* reducer -> INFO_STATUS/TRIM */
47
#define OID_OUTVOLT ".1.3.6.1.4.1.318.1.1.1.4.2.1.0"
48
#define OID_LOADPCT ".1.3.6.1.4.1.318.1.1.1.4.2.3.0"
49
#define OID_HIGHXFER ".1.3.6.1.4.1.318.1.1.1.5.2.2.0"
50
#define OID_LOWXFER ".1.3.6.1.4.1.318.1.1.1.5.2.3.0"
51
#define OID_SLFTSTRES ".1.3.6.1.4.1.318.1.1.1.7.2.3.0"
52
/* XXX can't find appropriate OID for INFO_BATTVOLT. */
53
/*#define OID_BATT_VOLTAGE ".1.3.6.1.4.1.318.???"*/
55
#define OID_OFF ".1.3.6.1.4.1.318.1.1.1.6.2.1.0"
57
#define OFF_GRACEFUL 3
58
#define OID_REBOOT ".1.3.6.1.4.1.318.1.1.1.6.2.2.0"
60
#define REBOOT_GRACEFUL 3
62
#define OID_SLEEP ".1.3.6.1.4.1.318.1.1.1.6.2.3.0"
64
#define SLEEP_GRACEFUL "3"
66
#define OID_SIMPWF ".1.3.6.1.4.1.318.1.1.1.6.2.4.0"
68
#define OID_FPTEST ".1.3.6.1.4.1.318.1.1.1.6.2.5.0"
70
#define OID_ON ".1.3.6.1.4.1.318.1.1.1.6.2.6.0"
72
#define OID_BYPASS ".1.3.6.1.4.1.318.1.1.1.6.2.7.0"
75
#define OID_SELFTEST ".1.3.6.1.4.1.318.1.1.1.7.2.2.0"
77
#define OID_CAL ".1.3.6.1.4.1.318.1.1.1.7.2.5.0"
80
#define OID_CAL_RESULTS ".1.3.6.1.4.1.318.1.1.1.7.2.6.0"
83
#define CAL_INPROGRESS 3
84
/*#define OID_OUTPUT_TAB "XXX"*/
85
#define OID_OUTCURRENT ".1.3.6.1.4.1.318.1.1.1.4.2.4.0"
86
#define OID_REQOUTVOLT ".1.3.6.1.4.1.318.1.1.1.5.2.1.0"
87
#define OID_RETCAPACITY ".1.3.6.1.4.1.318.1.1.1.5.2.6.0"
88
#define OID_CONSERVE ".1.3.6.1.4.1.318.1.1.1.6.1.1.0"
90
#define OID_NEEDREPLBATT ".1.3.6.1.4.1.318.1.1.1.2.2.4.0"
93
#define OID_SENS ".1.3.6.1.4.1.318.1.1.1.5.2.7.0"
94
#define OID_GRACEDELAY ".1.3.6.1.4.1.318.1.1.1.5.2.10.0"
95
#define OID_RETDELAY ".1.3.6.1.4.1.318.1.1.1.5.2.9.0"
96
#define OID_LOBATTIME ".1.3.6.1.4.1.318.1.1.1.5.2.8.0"
98
#define PN_VAR_COMMUNITY "community"
99
#define PN_VAR_SDTYPE "sdtype"
101
#define PN_INFOSIZE 128
102
#define PN_BUFSIZE 32
103
#define PN_LARGEBUF 256
105
#define PN_STALE_RETRY 10 /* retry to retrieve stale element */
106
/* after this number of iterations. */
108
/* modes to pn_ups_walk. */
109
#define PN_WALKMODE_INIT 0
110
#define PN_WALKMODE_UPDATE 1
112
/* use explicit booleans */
114
typedef enum ebool { FALSE, TRUE } bool;
120
int info_type; /* INFO_ or CMD_ element */
121
int info_flags; /* flags to set in addinfo */
122
int info_len; /* length of strings if STR, */
123
/* cmd value if CMD. */
124
char *OID; /* SNMP OID or NULL */
125
char *dfl; /* default value */
126
unsigned long flags; /* my flags */
129
#define PN_FLAG_OK (1 << 0) /* show element to upsd. */
130
#define PN_FLAG_STATIC (1 << 1) /* retrieve info only once. */
131
#define PN_FLAG_ABSENT (1 << 2) /* data is absent in the device, */
132
/* use default value. */
133
#define PN_FLAG_STALE (1 << 3) /* data stale, don't try too often. */
135
/* status string components */
136
#define PN_STATUS_PWR (0 << 8) /* indicates power status element */
137
#define PN_STATUS_BATT (1 << 8) /* indicates battery status element */
138
#define PN_STATUS_CAL (2 << 8) /* indicates calibration status element */
139
#define PN_STATUS_RB (3 << 8) /* indicates replace battery status element */
140
#define PN_STATUS_NUM_ELEM 4
141
#define PN_STATUS_INDEX(t) (((t) >> 8) & 7)
143
/* hints for pn_ups_set, applicable only to rw vars */
144
#define PN_TYPE_INT (0 << 16) /* cast to int when setting value */
145
#define PN_TYPE_STRING (1 << 16) /* cast to string */
146
#define PN_TYPE_TIME (2 << 16) /* cast to int */
147
#define PN_TYPE(t) ((t)->flags & 7 << 16)
149
#define PN_CMD_MASK 0x2000
151
void pn_snmp_init(const char *type, const char *host, const char *community);
152
void pn_snmp_cleanup(void);
153
struct snmp_pdu *pn_snmp_get(const char *OID);
154
bool pn_snmp_get_str(const char *OID, char *buf, size_t buf_len);
155
bool pn_snmp_get_int(const char *OID, long *pval);
156
bool pn_snmp_set(const char *OID, char type, const char *value);
157
bool pn_snmp_set_str(const char *OID, const char *value);
158
bool pn_snmp_set_int(const char *OID, long value);
159
bool pn_snmp_set_time(const char *OID, long value);
160
void pn_snmp_perror(struct snmp_session *, int, struct snmp_pdu *,
161
const char *fmt, ...);
162
void pn_startup(void);
163
void pn_cleanup(void);
164
void pn_init_instcmds(void);
165
void pn_setuphandlers(void);
166
void pn_setinfo(int type, const char *value, int flags, int auxdata);
167
void pn_status_init(void);
168
void pn_status_set(pn_info_t *, long value);
169
void pn_status_commit(void);
170
pn_info_t *pn_find_info(int type);
171
struct netvars_t *pn_find_netvar(int type);
172
struct instcmds_t *pn_find_instcmd(int cmd);
173
void pn_ups_walk(int mode);
174
bool pn_ups_get(pn_info_t *pn_info_p);
175
void pn_ups_set(int type, int data_len, char *data);
176
void pn_ups_instcmd(int auxcmd, int data_len, char *data);
177
void pn_shutdown_ups(void);
179
pn_info_t pn_info[] = {
182
{ INFO_MFR, FLAG_STRING, PN_INFOSIZE, NULL, "APC",
183
PN_FLAG_STATIC | PN_FLAG_ABSENT | PN_FLAG_OK },
184
{ INFO_MODEL, FLAG_STRING, PN_INFOSIZE, OID_MODEL_NAME,
185
"Generic Powernet SNMP device", PN_FLAG_STATIC | PN_FLAG_OK },
186
{ INFO_SERIAL, FLAG_STRING, PN_INFOSIZE, OID_SERIAL, "",
187
PN_FLAG_STATIC | PN_FLAG_OK },
188
{ INFO_MFRDATE, FLAG_STRING, PN_INFOSIZE, OID_BATTDATE, "",
189
PN_FLAG_OK | PN_FLAG_STATIC },
190
{ INFO_UTILITY, 0, 0, OID_INVOLT, "", PN_FLAG_OK },
191
{ INFO_BATTPCT, 0, 0, OID_BATT_CHARGE, "", PN_FLAG_OK },
192
{ INFO_STATUS, FLAG_STRING, PN_INFOSIZE, OID_POWER_STATUS, "OFF",
193
PN_FLAG_OK | PN_STATUS_PWR },
194
{ INFO_STATUS, FLAG_STRING, PN_INFOSIZE, OID_BATT_STATUS, "",
195
PN_FLAG_OK | PN_STATUS_BATT },
196
{ INFO_STATUS, FLAG_STRING, PN_INFOSIZE, OID_CAL_RESULTS, "",
197
PN_FLAG_OK | PN_STATUS_CAL },
198
{ INFO_STATUS, FLAG_STRING, PN_INFOSIZE, OID_NEEDREPLBATT, "",
199
PN_FLAG_OK | PN_STATUS_RB },
200
{ INFO_UPSTEMP, 0, 0, OID_UPSTEMP, "", PN_FLAG_OK },
201
{ INFO_ACFREQ, 0, 0, OID_INFREQ, "", PN_FLAG_OK },
202
{ INFO_LOADPCT, 0, 0, OID_LOADPCT, "", PN_FLAG_OK },
203
{ INFO_FIRMREV, 0, 0, OID_FIRMREV, "",
204
PN_FLAG_STATIC | PN_FLAG_OK },
205
{ INFO_RUNTIME, 0, 0, OID_BATT_RUNTIME, "", PN_TYPE_TIME | PN_FLAG_OK },
206
/* can't find appropriate OID for INFO_BATTVOLT. */
207
/*{ INFO_BATTVOLT, 0, 1, OID_BATT_VOLTAGE, "", PN_FLAG_OK },*/
208
{ INFO_OUTVOLT, 0, 0, OID_OUTVOLT, "", PN_FLAG_OK },
209
{ INFO_UPSIDENT, FLAG_STRING | FLAG_RW, 8, OID_UPSIDEN, "",
210
PN_FLAG_OK | PN_FLAG_STATIC | PN_TYPE_STRING },
211
{ INFO_BATTDATE, FLAG_STRING | FLAG_RW, 8, OID_MFRDATE, "",
212
PN_FLAG_OK | PN_FLAG_STATIC | PN_TYPE_STRING },
213
{ INFO_SLFTSTRES, FLAG_STRING, PN_INFOSIZE, OID_SLFTSTRES, "",
215
{ INFO_LOWXFER, FLAG_STRING | FLAG_RW, 3, OID_LOWXFER, "",
216
PN_TYPE_INT | PN_FLAG_OK },
217
{ INFO_HIGHXFER, FLAG_STRING | FLAG_RW, 3, OID_HIGHXFER, "",
218
PN_TYPE_INT | PN_FLAG_OK },
219
{ INFO_CURRENT, 0, 0, OID_OUTCURRENT, "", PN_FLAG_OK },
220
{ INFO_REQVOLT, FLAG_STRING | FLAG_RW, 3, OID_REQOUTVOLT, "",
221
PN_TYPE_INT | PN_FLAG_OK },
222
{ INFO_WAKETHRSH, FLAG_STRING | FLAG_RW, 3, OID_RETCAPACITY, "",
223
PN_TYPE_INT | PN_FLAG_OK },
224
{ INFO_LINESENS, FLAG_STRING | FLAG_RW, 1, OID_SENS, "",
225
PN_TYPE_INT | PN_FLAG_OK },
226
{ INFO_GRACEDELAY, FLAG_STRING | FLAG_RW, 3, OID_GRACEDELAY, "",
227
PN_TYPE_TIME | PN_FLAG_OK },
228
{ INFO_WAKEDELAY, FLAG_STRING | FLAG_RW, 3, OID_RETDELAY, "",
229
PN_TYPE_TIME | PN_FLAG_OK },
230
{ INFO_LOBATTIME, FLAG_STRING | FLAG_RW, 3, OID_LOBATTIME, "",
231
PN_TYPE_TIME | PN_FLAG_OK },
233
/* instant commands. */
234
{ CMD_OFF, 0, OFF_DO, OID_OFF, "", PN_FLAG_OK },
235
{ CMD_ON, 0, ON_DO, OID_ON, "", PN_FLAG_OK },
236
{ CMD_SHUTDOWN, 0, OFF_GRACEFUL, OID_OFF, "", PN_FLAG_OK },
237
{ CMD_SDRET, 0, REBOOT_GRACEFUL, OID_REBOOT, "", PN_FLAG_OK },
238
{ CMD_SOFTDOWN, 0, CONSERVE_DO, OID_CONSERVE, "", PN_FLAG_OK },
239
{ CMD_SIMPWF, 0, SIMPWF_DO, OID_SIMPWF, "", PN_FLAG_OK },
240
{ CMD_FPTEST, 0, FPTEST_DO, OID_FPTEST, "", PN_FLAG_OK },
241
{ CMD_BYPASS, 0, BYPASS_ON, OID_BYPASS, "", PN_FLAG_OK },
242
{ CMD_BTEST1, 0, SELFTEST_DO, OID_SELFTEST, "", PN_FLAG_OK },
243
{ CMD_CAL0, 0, CAL_CANCEL, OID_CAL, "", PN_FLAG_OK },
244
{ CMD_CAL1, 0, CAL_DO, OID_CAL, "", PN_FLAG_OK },
246
/* end of structure. */
247
{ 0, 0, 0, NULL, NULL, 0 }
250
#define NUM_INFO_ITEMS (sizeof(pn_info)/sizeof(pn_info[0]))