From 08037975e70531e0ae7b81928407ecd03cafcacd Mon Sep 17 00:00:00 2001 From: octo Date: Wed, 1 Feb 2006 15:32:13 +0000 Subject: [PATCH] Added `wireless' plugin --- configure.in | 2 + src/Makefile.am | 10 +++ src/wireless.c | 186 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 198 insertions(+) create mode 100644 src/wireless.c diff --git a/configure.in b/configure.in index 4e9c1563..d9ac9177 100644 --- a/configure.in +++ b/configure.in @@ -494,6 +494,7 @@ AC_COLLECTD([swap], [disable], [module], [swap statistics]) AC_COLLECTD([tape], [disable], [module], [tape statistics]) AC_COLLECTD([traffic], [disable], [module], [system traffic statistics]) AC_COLLECTD([users], [disable], [module], [user count statistics]) +AC_COLLECTD([wireless], [disable], [module], [wireless link statistics]) #m4_divert_once([HELP_ENABLE], [ #collectd modules:]) @@ -746,5 +747,6 @@ Configuration: tape . . . . . . . $enable_tape traffic . . . . . . $enable_traffic users . . . . . . . $enable_users + wireless . . . . . $enable_wireless EOF diff --git a/src/Makefile.am b/src/Makefile.am index 73d29b05..f6cca37b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -207,6 +207,16 @@ collectd_LDADD += "-dlopen" users.la collectd_DEPENDENCIES += users.la endif +if BUILD_MODULE_WIRELESS +pkglib_LTLIBRARIES += wireless.la +wireless_la_SOURCES = wireless.c +wireless_la_LDFLAGS = -module -avoid-version +# FIXME Make `-lm' conditional +wireless_la_LDFLAGS += -lm +collectd_LDADD += "-dlopen" wireless.la +collectd_DEPENDENCIES += wireless.la +endif + man_MANS = collectd.1 collectd.conf.5 #collectd_1_SOURCES = collectd.pod diff --git a/src/wireless.c b/src/wireless.c new file mode 100644 index 00000000..be366c48 --- /dev/null +++ b/src/wireless.c @@ -0,0 +1,186 @@ +/** + * collectd - src/wireless.c + * Copyright (C) 2006 Florian octo Forster + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Florian octo Forster + **/ + +#include "collectd.h" +#include "common.h" +#include "plugin.h" + +#include + +#define MODULE_NAME "wireless" +#define BUFSIZE 1024 + +#if defined(KERNEL_LINUX) +# define WIRELESS_HAVE_READ 1 +#else +# define WIRELESS_HAVE_READ 0 +#endif + +#define WIRELESS_PROC_FILE "/proc/net/wireless" + +static char *filename_template = "wireless-%s.rrd"; + +static char *ds_def[] = +{ + "DS:quality:GAUGE:25:0:U", + "DS:power:GAUGE:25:0:U", + "DS:noise:GAUGE:25:0:U", + NULL +}; +static int ds_num = 3; + +#if WIRELESS_HAVE_READ +static int proc_file_found = 0; +#endif + +static void wireless_init (void) +{ +#if WIRELESS_HAVE_READ + if (access (WIRELESS_PROC_FILE, R_OK) == 0) + proc_file_found = 1; + else + proc_file_found = 0; +#endif + + return; +} + +static void wireless_write (char *host, char *inst, char *val) +{ + char file[BUFSIZE]; + int status; + + status = snprintf (file, BUFSIZE, filename_template, inst); + if (status < 1) + return; + else if (status >= BUFSIZE) + return; + + rrd_update_file (host, file, val, ds_def, ds_num); +} + +#if WIRELESS_HAVE_READ +static double wireless_dbm_to_watt (double dbm) +{ + double watt; + + /* + * dbm = 10 * log_{10} (1000 * power / W) + * power = 10^(dbm/10) * W/1000 + */ + + watt = pow (10.0, (dbm / 10.0)) / 1000.0; + + return (watt); +} + +static void wireless_submit (char *device, + double quality, double power, double noise) +{ + char buf[BUFSIZE]; + int status; + + status = snprintf (buf, BUFSIZE, "%u:%f:%f:%f", + (unsigned int) curtime, + quality, power, noise); + if ((status < 1) || (status >= BUFSIZE)) + return; + + plugin_submit (MODULE_NAME, device, buf); +} + +static void wireless_read (void) +{ +#ifdef KERNEL_LINUX + + FILE *fh; + char buffer[BUFSIZE]; + + char *device; + double quality; + double power; + double noise; + + char *fields[8]; + int numfields; + + int len; + + if (!proc_file_found) + return; + + /* there are a variety of names for the wireless device */ + if ((fh = fopen (WIRELESS_PROC_FILE, "r")) == NULL) + { + syslog (LOG_WARNING, "wireless: fopen: %s", strerror (errno)); + return; + } + + while (fgets (buffer, BUFSIZE, fh) != NULL) + { + numfields = strsplit (buffer, fields, 8); + + if (numfields < 5) + continue; + + len = strlen (fields[0]) - 1; + if (len < 1) + continue; + if (fields[0][len] != ':') + continue; + fields[0][len] = '\0'; + + device = fields[0]; + quality = atof (fields[2]); + power = atof (fields[3]); + noise = atof (fields[4]); + + if (quality == 0.0) + quality = -1.0; + + if (power >= 0.0) + power = -1.0; + else + power = wireless_dbm_to_watt (power); + + if (noise >= 0.0) + noise = -1.0; + else + noise = wireless_dbm_to_watt (noise); + + wireless_submit (device, quality, power, noise); + } + + fclose (fh); +#endif /* KERNEL_LINUX */ +} +#else +# define wireless_read NULL +#endif /* WIRELESS_HAVE_READ */ + +void module_register (void) +{ + plugin_register (MODULE_NAME, wireless_init, wireless_read, wireless_write); +} + +#undef BUFSIZE +#undef MODULE_NAME -- 2.30.2