X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fapcups.c;h=cd64426afa01e42125f3b210b7e39dc40f991c12;hb=4c3b690f915df7b56170cee189096949adedefe5;hp=a2eacb8b7223200873b06c30becd37dda0497395;hpb=65b790885ecc7f2663f758b8a67b855a05a91c23;p=collectd.git diff --git a/src/apcups.c b/src/apcups.c index a2eacb8b..cd64426a 100644 --- a/src/apcups.c +++ b/src/apcups.c @@ -74,21 +74,21 @@ static char *bvolt_ds_def[] = }; static int bvolt_ds_num = 1; -static char *load_file_template = "apcups/charge_percent.rrd"; +static char *load_file_template = "apcups/load_percent.rrd"; static char *load_ds_def[] = { "DS:percent:GAUGE:"COLLECTD_HEARTBEAT":0:110", }; static int load_ds_num = 1; -static char *charge_file_template = "apcups/charge.rrd"; +static char *charge_file_template = "apcups/charge_percent.rrd"; static char *charge_ds_def[] = { - "DS:charge:GAUGE:"COLLECTD_HEARTBEAT":0:U", + "DS:percent:GAUGE:"COLLECTD_HEARTBEAT":0:110", }; static int charge_ds_num = 1; -static char *time_file_template = "apcups/time.rrd"; +static char *time_file_template = "apcups/timeleft.rrd"; static char *time_ds_def[] = { "DS:timeleft:GAUGE:"COLLECTD_HEARTBEAT":0:100", @@ -99,7 +99,7 @@ static char *temp_file_template = "apcups/temperature.rrd"; static char *temp_ds_def[] = { /* -273.15 is absolute zero */ - "DS:temperature:GAUGE:"COLLECTD_HEARTBEAT":-274:U", + "DS:value:GAUGE:"COLLECTD_HEARTBEAT":-274:U", }; static int temp_ds_num = 1; @@ -134,94 +134,23 @@ struct apc_detail_s #define BIG_BUF 4096 -/* - * Read nbytes from the network. - * It is possible that the total bytes require in several - * read requests - */ -static int read_nbytes (int *fd, char *ptr, int nbytes) -{ - int nleft; - int nread; - - nleft = nbytes; - nread = -1; - - assert (*fd >= 0); - - while ((nleft > 0) && (nread != 0)) - { - nread = read (*fd, ptr, nleft); - - if (nread == -1 && (errno == EINTR || errno == EAGAIN)) - continue; - - if (nread == -1) - { - *fd = -1; - syslog (LOG_ERR, "apcups plugin: write failed: %s", strerror (errno)); - return (-1); - } - - nleft -= nread; - ptr += nread; - } - - return (nbytes - nleft); -} - -/* - * Write nbytes to the network. - * It may require several writes. - */ -static int write_nbytes (int *fd, void *buf, int buflen) -{ - int nleft; - int nwritten; - char *ptr; - - assert (buflen > 0); - assert (*fd >= 0); - - ptr = (char *) buf; - - nleft = buflen; - while (nleft > 0) - { - nwritten = write (*fd, ptr, nleft); - - if ((nwritten == -1) && ((errno == EAGAIN) || (errno == EINTR))) - continue; - - if (nwritten == -1) - { - syslog (LOG_ERR, "Writing to socket failed: %s", strerror (errno)); - *fd = -1; - return (-1); - } - - nleft -= nwritten; - ptr += nwritten; - } - - /* If we get here, (nleft <= 0) is true */ - return (buflen); -} - +#if APCMAIN /* Close the network connection */ static void net_close (int *fd) { - short pktsiz = 0; + uint16_t packet_size = 0; assert (*fd >= 0); + DBG ("Gracefully shutting down socket %i.", *fd); + /* send EOF sentinel */ - write_nbytes (fd, &pktsiz, sizeof (short)); + swrite (*fd, (void *) &packet_size, sizeof (packet_size)); close (*fd); *fd = -1; } - +#endif /* APCMAIN */ /* * Open a TCP connection to the UPS network server @@ -279,9 +208,12 @@ static int net_open (char *host, char *service, int port) if (status != 0) /* `connect(2)' failed */ { DBG ("connect failed: %s", strerror (errno)); + close (sd); return (-1); } + DBG ("Done opening a socket %i", sd); + return (sd); } /* int net_open (char *host, char *service, int port) */ @@ -296,35 +228,34 @@ static int net_open (char *host, char *service, int port) */ static int net_recv (int *sockfd, char *buf, int buflen) { - int nbytes; - short pktsiz; + uint16_t packet_size; /* get data size -- in short */ - if ((nbytes = read_nbytes (sockfd, (char *) &pktsiz, sizeof (short))) <= 0) + if (sread (*sockfd, (void *) &packet_size, sizeof (packet_size)) != 0) + { + *sockfd = -1; return (-1); + } - if (nbytes != sizeof (short)) - return (-2); - - pktsiz = ntohs (pktsiz); - if (pktsiz > buflen) + packet_size = ntohs (packet_size); + if (packet_size > buflen) { DBG ("record length too large"); return (-2); } - if (pktsiz == 0) + if (packet_size == 0) return (0); /* now read the actual data */ - if ((nbytes = read_nbytes (sockfd, buf, pktsiz)) <= 0) - return (-2); - - if (nbytes != pktsiz) - return (-2); + if (sread (*sockfd, (void *) buf, packet_size) != 0) + { + *sockfd = -1; + return (-1); + } - return (nbytes); -} /* static int net_recv (int sockfd, char *buf, int buflen) */ + return ((int) packet_size); +} /* static int net_recv (int *sockfd, char *buf, int buflen) */ /* * Send a message over the network. The send consists of @@ -335,22 +266,26 @@ static int net_recv (int *sockfd, char *buf, int buflen) */ static int net_send (int *sockfd, char *buff, int len) { - int rc; - short packet_size; + uint16_t packet_size; assert (len > 0); + assert (*sockfd >= 0); /* send short containing size of data packet */ - packet_size = htons ((short) len); + packet_size = htons ((uint16_t) len); - rc = write_nbytes (sockfd, &packet_size, sizeof (packet_size)); - if (rc != sizeof (packet_size)) + if (swrite (*sockfd, (void *) &packet_size, sizeof (packet_size)) != 0) + { + *sockfd = -1; return (-1); + } /* send data packet */ - rc = write_nbytes (sockfd, buff, len); - if (rc != len) - return (-1); + if (swrite (*sockfd, (void *) buff, len) != 0) + { + *sockfd = -1; + return (-2); + } return (0); } @@ -366,7 +301,7 @@ static int apc_query_server (char *host, int port, double value; static int sockfd = -1; - static unsigned int complain = 0; + static complain_t compl; #if APCMAIN # define PRINT_VALUE(name, val) printf(" Found property: name = %s; value = %f;\n", name, val) @@ -378,19 +313,14 @@ static int apc_query_server (char *host, int port, { if ((sockfd = net_open (host, NULL, port)) < 0) { - /* Complain once every six hours. */ - int complain_step = 21600 / atoi (COLLECTD_STEP); - - if ((complain % complain_step) == 0) - syslog (LOG_ERR, "apcups plugin: Connecting to the apcupsd failed."); - complain++; - + plugin_complain (LOG_ERR, &compl, "apcups plugin: " + "Connecting to the apcupsd failed."); return (-1); } - else if (complain > 1) + else { - syslog (LOG_NOTICE, "apcups plugin: Connection re-established to the apcupsd."); - complain = 0; + plugin_relief (LOG_NOTICE, &compl, "apcups plugin: " + "Connection re-established to the apcupsd."); } } @@ -408,13 +338,14 @@ static int apc_query_server (char *host, int port, printf ("net_recv = `%s';\n", recvline); #endif /* if APCMAIN */ - tokptr = strtok (recvline, ":"); + tokptr = strtok (recvline, " :\t"); while (tokptr != NULL) { key = tokptr; - if ((tokptr = strtok (NULL, " \t")) == NULL) + if ((tokptr = strtok (NULL, " :\t")) == NULL) continue; value = atof (tokptr); + PRINT_VALUE (key, value); if (strcmp ("LINEV", key) == 0) @@ -442,10 +373,14 @@ static int apc_query_server (char *host, int port, { syslog (LOG_WARNING, "apcups plugin: Error reading from socket"); return (-1); - } else { + } +#if APCMAIN + else + { /* close the opened socket */ - net_close(&sockfd); + net_close (&sockfd); } +#endif /* APCMAIN */ return (0); } @@ -563,6 +498,7 @@ static void apc_submit_generic (char *type, char *inst, if ((status < 1) || (status >= 512)) return; + DBG ("plugin_submit (%s, %s, %s);", type, inst, buf); plugin_submit (type, inst, buf); } @@ -602,7 +538,14 @@ static void apcups_read (void) * zeros. We want rrd files to have NAN. */ if (status != 0) + { + DBG ("apc_query_server (%s, %i) = %i", + global_host == NULL + ? APCUPS_DEFAULT_HOST + : global_host, + global_port, status); return; + } apc_submit (&apcups_detail); } /* apcups_read */