~ubuntu-branches/ubuntu/saucy/nut/saucy

« back to all changes in this revision

Viewing changes to drivers/powernet.h

  • Committer: Bazaar Package Importer
  • Author(s): Arnaud Quette
  • Date: 2004-05-28 13:10:01 UTC
  • mto: (16.1.1 squeeze)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20040528131001-yj2m9qcez4ya2w14
Tags: upstream-1.4.2
ImportĀ upstreamĀ versionĀ 1.4.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * vim: ts=4 sw=4
 
3
 */
 
4
 
 
5
/*
 
6
 * powernet.h -- part of SNMP interface driver for APC SNMP devices.
 
7
 * Dmitry Frolov <frolov@riss-telecom.ru>
 
8
 */
 
9
 
 
10
#include <unistd.h>
 
11
#include <ucd-snmp/ucd-snmp-includes.h>
 
12
#include <shared-tables.h> 
 
13
 
 
14
#define PN_UPSDRV_VERSION       "1.0"
 
15
 
 
16
/* SNMP OIDs set */
 
17
#define OID_POWERNET_MIB        ".1.3.6.1.4.1.318"
 
18
/* info elements */
 
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.???"*/
 
54
/* commands */
 
55
#define OID_OFF                         ".1.3.6.1.4.1.318.1.1.1.6.2.1.0"
 
56
#define OFF_DO                          2
 
57
#define OFF_GRACEFUL            3
 
58
#define OID_REBOOT                      ".1.3.6.1.4.1.318.1.1.1.6.2.2.0"
 
59
#define REBOOT_DO                       2
 
60
#define REBOOT_GRACEFUL         3
 
61
#if 0   /* not used. */
 
62
#define OID_SLEEP                       ".1.3.6.1.4.1.318.1.1.1.6.2.3.0"
 
63
#define SLEEP_ON                        "2"
 
64
#define SLEEP_GRACEFUL          "3"
 
65
#endif
 
66
#define OID_SIMPWF                      ".1.3.6.1.4.1.318.1.1.1.6.2.4.0"
 
67
#define SIMPWF_DO                       2
 
68
#define OID_FPTEST                      ".1.3.6.1.4.1.318.1.1.1.6.2.5.0"
 
69
#define FPTEST_DO                       2
 
70
#define OID_ON                          ".1.3.6.1.4.1.318.1.1.1.6.2.6.0"
 
71
#define ON_DO                           2
 
72
#define OID_BYPASS                      ".1.3.6.1.4.1.318.1.1.1.6.2.7.0"
 
73
#define BYPASS_ON                       2
 
74
#define BYPASS_OFF                      3
 
75
#define OID_SELFTEST            ".1.3.6.1.4.1.318.1.1.1.7.2.2.0"
 
76
#define SELFTEST_DO                     2
 
77
#define OID_CAL                         ".1.3.6.1.4.1.318.1.1.1.7.2.5.0"
 
78
#define CAL_DO                          2
 
79
#define CAL_CANCEL                      3
 
80
#define OID_CAL_RESULTS         ".1.3.6.1.4.1.318.1.1.1.7.2.6.0"
 
81
#define CAL_OK                          1
 
82
#define CAL_INVALID                     2
 
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"
 
89
#define CONSERVE_DO                     2
 
90
#define OID_NEEDREPLBATT        ".1.3.6.1.4.1.318.1.1.1.2.2.4.0"
 
91
#define RB_NONEED                       1
 
92
#define RB_NEED                         2
 
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"
 
97
 
 
98
#define PN_VAR_COMMUNITY        "community"
 
99
#define PN_VAR_SDTYPE           "sdtype"
 
100
 
 
101
#define PN_INFOSIZE             128
 
102
#define PN_BUFSIZE              32
 
103
#define PN_LARGEBUF             256
 
104
 
 
105
#define PN_STALE_RETRY  10              /* retry to retrieve stale element */
 
106
                                                                /* after this number of iterations. */
 
107
 
 
108
/* modes to pn_ups_walk. */
 
109
#define PN_WALKMODE_INIT        0
 
110
#define PN_WALKMODE_UPDATE      1
 
111
 
 
112
/* use explicit booleans */
 
113
#ifndef FALSE
 
114
typedef enum ebool { FALSE, TRUE } bool;
 
115
#else
 
116
typedef int bool;
 
117
#endif
 
118
 
 
119
typedef struct {
 
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 */
 
127
} pn_info_t;
 
128
 
 
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. */
 
134
 
 
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)
 
142
 
 
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)
 
148
 
 
149
#define PN_CMD_MASK                     0x2000
 
150
 
 
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);
 
178
 
 
179
pn_info_t pn_info[] = {
 
180
 
 
181
        /* info elements. */
 
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, "",
 
214
                PN_FLAG_OK },
 
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 },
 
232
 
 
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 },
 
245
 
 
246
        /* end of structure. */
 
247
        { 0, 0, 0, NULL, NULL, 0 }
 
248
};
 
249
 
 
250
#define NUM_INFO_ITEMS  (sizeof(pn_info)/sizeof(pn_info[0]))