static void do_range(const char *varname) { int ret; unsigned int numq, numa; char **answer; const char *query[4], *val; int ival, min, max; /* get current value */ val = get_data("VAR", varname); if (!val) { fatalx(EXIT_FAILURE, "do_range: can't get current value of %s", varname); } ival = atoi(val); query[0] = "RANGE"; query[1] = upsname; query[2] = varname; numq = 3; ret = upscli_list_start(ups, numq, query); if (ret < 0) { fatalx(EXIT_FAILURE, "Error: %s", upscli_strerror(ups)); } ret = upscli_list_next(ups, numq, query, &numa, &answer); printf("Type: RANGE\n"); while (ret == 1) { /* RANGE <upsname> <varname> <min> <max> */ if (numa < 5) { fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least 4)", numa); } min = atoi(answer[3]); max = atoi(answer[4]); printf("Option: \"%i-%i\"", min, max); if ((ival >= min) && (ival <= max)) { printf(" SELECTED"); } printf("\n"); ret = upscli_list_next(ups, numq, query, &numa, &answer); } }
static void do_enum(const char *varname) { int ret; unsigned int numq, numa; char **answer, buf[SMALLBUF]; const char *query[4], *val; /* get current value */ val = get_data("VAR", varname); if (!val) { fatalx(EXIT_FAILURE, "do_enum: can't get current value of %s", varname); } snprintf(buf, sizeof(buf), "%s", val); query[0] = "ENUM"; query[1] = upsname; query[2] = varname; numq = 3; ret = upscli_list_start(ups, numq, query); if (ret < 0) { fatalx(EXIT_FAILURE, "Error: %s", upscli_strerror(ups)); } ret = upscli_list_next(ups, numq, query, &numa, &answer); printf("Type: ENUM\n"); while (ret == 1) { /* ENUM <upsname> <varname> <value> */ if (numa < 4) { fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least 4)", numa); } printf("Option: \"%s\"", answer[3]); if (!strcmp(answer[3], buf)) { printf(" SELECTED"); } printf("\n"); ret = upscli_list_next(ups, numq, query, &numa, &answer); } }
std::map<wxString,wxString> Device::getVars() { std::map<wxString,wxString> ret; const char* query[] = {"VAR", NULL}; query[1] = (const char*)id.mb_str(wxConvISO8859_1); char** answer; unsigned int nbanswer; int res = upscli_list_start(upsconn, 2, query); if(res==-1) return ret; while(upscli_list_next(upsconn, 2, query, &nbanswer, &answer)==1) { if(nbanswer>=3) ret[wxString(answer[1], wxConvISO8859_1)] = wxString(answer[2], wxConvISO8859_1); } return ret; }
std::list<Device> Device::getUps(UPSCONN_t* upsconn) { std::list<Device> ret; if(!upsconn) return ret; const char* query[] = {"UPS"}; char** answer; unsigned int nbanswer; int res = upscli_list_start(upsconn, 1, query); if(res==-1) { printf("*** %d : %s\n", upscli_upserror(upsconn), upscli_strerror(upsconn)); return ret; } while(upscli_list_next(upsconn, 1, query, &nbanswer, &answer)>0) { if(nbanswer>=2) ret.push_back(Device(wxString(answer[1], wxConvISO8859_1), upsconn)); } return ret; }
static int upsclient_update_vars(void) { int ret; unsigned int numq, numa; const char *query[4]; char **answer; query[0] = "VAR"; query[1] = client_upsname; numq = 2; ret = upscli_list_start(ups, numq, query); if (ret < 0) { upsdebugx(1, "Error: %s (%i)", upscli_strerror(ups), upscli_upserror(ups)); return ret; } while (upscli_list_next(ups, numq, query, &numa, &answer) == 1) { /* VAR <upsname> <varname> <val> */ if (numa < 4) { upsdebugx(1, "Error: insufficient data (got %d args, need at least 4)", numa); } upsdebugx(5, "Received: %s %s %s %s", answer[0], answer[1], answer[2], answer[3]); /* do not override the driver collection */ if (strncmp(answer[2], "driver.", 7)) setvar(answer[2], answer[3]); } return 1; }
static int nut_read_one (nut_ups_t *ups) { const char *query[3] = {"VAR", ups->upsname, NULL}; unsigned int query_num = 2; char **answer; unsigned int answer_num; int status; /* (Re-)Connect if we have no connection */ if (ups->conn == NULL) { ups->conn = (collectd_upsconn_t *) malloc (sizeof (collectd_upsconn_t)); if (ups->conn == NULL) { ERROR ("nut plugin: malloc failed."); return (-1); } status = upscli_connect (ups->conn, ups->hostname, ups->port, UPSCLI_CONN_TRYSSL); if (status != 0) { ERROR ("nut plugin: nut_read_one: upscli_connect (%s, %i) failed: %s", ups->hostname, ups->port, upscli_strerror (ups->conn)); sfree (ups->conn); return (-1); } INFO ("nut plugin: Connection to (%s, %i) established.", ups->hostname, ups->port); } /* if (ups->conn == NULL) */ /* nut plugin: nut_read_one: upscli_list_start (adpos) failed: Protocol * error */ status = upscli_list_start (ups->conn, query_num, query); if (status != 0) { ERROR ("nut plugin: nut_read_one: upscli_list_start (%s) failed: %s", ups->upsname, upscli_strerror (ups->conn)); upscli_disconnect (ups->conn); sfree (ups->conn); return (-1); } while ((status = upscli_list_next (ups->conn, query_num, query, &answer_num, &answer)) == 1) { char *key; double value; if (answer_num < 4) continue; key = answer[2]; value = atof (answer[3]); if (strncmp ("ambient.", key, 8) == 0) { if (strcmp ("ambient.humidity", key) == 0) nut_submit (ups, "humidity", "ambient", value); else if (strcmp ("ambient.temperature", key) == 0) nut_submit (ups, "temperature", "ambient", value); } else if (strncmp ("battery.", key, 8) == 0) { if (strcmp ("battery.charge", key) == 0) nut_submit (ups, "percent", "charge", value); else if (strcmp ("battery.current", key) == 0) nut_submit (ups, "current", "battery", value); else if (strcmp ("battery.runtime", key) == 0) nut_submit (ups, "timeleft", "battery", value); else if (strcmp ("battery.temperature", key) == 0) nut_submit (ups, "temperature", "battery", value); else if (strcmp ("battery.voltage", key) == 0) nut_submit (ups, "voltage", "battery", value); } else if (strncmp ("input.", key, 6) == 0) { if (strcmp ("input.frequency", key) == 0) nut_submit (ups, "frequency", "input", value); else if (strcmp ("input.voltage", key) == 0) nut_submit (ups, "voltage", "input", value); } else if (strncmp ("output.", key, 7) == 0) { if (strcmp ("output.current", key) == 0) nut_submit (ups, "current", "output", value); else if (strcmp ("output.frequency", key) == 0) nut_submit (ups, "frequency", "output", value); else if (strcmp ("output.voltage", key) == 0) nut_submit (ups, "voltage", "output", value); } else if (strncmp ("ups.", key, 4) == 0) { if (strcmp ("ups.load", key) == 0) nut_submit (ups, "percent", "load", value); else if (strcmp ("ups.power", key) == 0) nut_submit (ups, "power", "ups", value); else if (strcmp ("ups.temperature", key) == 0) nut_submit (ups, "temperature", "ups", value); } } /* while (upscli_list_next) */ return (0); } /* int nut_read_one */
static void print_rwlist(void) { int ret; unsigned int numq, numa; const char *query[2]; char **answer; struct list_t *lhead, *llast, *ltmp, *lnext; /* the upsname is now required */ if (!upsname) { fatalx(EXIT_FAILURE, "Error: a UPS name must be specified (upsname[@hostname[:port]])"); } llast = lhead = NULL; query[0] = "RW"; query[1] = upsname; numq = 2; ret = upscli_list_start(ups, numq, query); if (ret < 0) { /* old upsd --> fall back on old LISTRW technique */ if (upscli_upserror(ups) == UPSCLI_ERR_UNKCOMMAND) { fatalx(EXIT_FAILURE, "Error: upsd is too old to support this query"); } fatalx(EXIT_FAILURE, "Error: %s", upscli_strerror(ups)); } ret = upscli_list_next(ups, numq, query, &numa, &answer); while (ret == 1) { /* RW <upsname> <varname> <value> */ if (numa < 4) { fatalx(EXIT_FAILURE, "Error: insufficient data (got %d args, need at least 4)", numa); } /* sock this entry away for later */ ltmp = xmalloc(sizeof(struct list_t)); ltmp->name = xstrdup(answer[2]); ltmp->next = NULL; if (llast) { llast->next = ltmp; } else { lhead = ltmp; } llast = ltmp; ret = upscli_list_next(ups, numq, query, &numa, &answer); } /* use the list to get descriptions and types */ ltmp = lhead; while (ltmp) { lnext = ltmp->next; print_rw(ltmp->name); free(ltmp->name); free(ltmp); ltmp = lnext; } }