/* * This file is part of Cockpit. * * Copyright (C) 2013 Red Hat, Inc. * * Cockpit is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * Cockpit 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Cockpit; If not, see . */ #include "config.h" #include "cockpitnetworksamples.h" #include #include #include /* TODO: this should be optimized so we don't allocate network and call open()/close() all the time */ void cockpit_network_samples (CockpitSamples *samples) { gchar *contents = NULL; GError *error = NULL; gchar **lines = NULL; gsize len; guint n; guint64 total_rx = 0; guint64 total_tx = 0; if (!g_file_get_contents ("/proc/net/dev", &contents, &len, &error)) { g_warning ("error loading contents /proc/net/dev: %s", error->message); g_error_free (error); goto out; } lines = g_strsplit (contents, "\n", -1); for (n = 0; lines != NULL && lines[n] != NULL; n++) { const gchar *line = lines[n]; gchar iface_name[64]; /* guaranteed to be max 16 chars */ guint64 bytes_rx, packets_rx, errors_rx, dropped_rx, fifo_rx, frame_rx, compressed_rx, multicast_rx; guint64 bytes_tx, packets_tx, errors_tx, dropped_tx, fifo_tx, frame_tx, compressed_tx, multicast_tx; gint num_parsed; gchar *ptr; /* Format is * * Inter-| Receive | Transmit * face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed * lo: 2776770 11307 0 0 0 0 0 0 2776770 11307 0 0 0 0 0 0 * eth0: 1215645 2751 0 0 0 0 0 0 1782404 4324 0 0 0 427 0 0 * ppp0: 1622270 5552 1 0 0 0 0 0 354130 5669 0 0 0 0 0 0 * tap0: 7714 81 0 0 0 0 0 0 7714 81 0 0 0 0 0 0 */ if (n < 2 || strlen (line) == 0) continue; num_parsed = sscanf (line, "%s %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT, iface_name, &bytes_rx, &packets_rx, &errors_rx, &dropped_rx, &fifo_rx, &frame_rx, &compressed_rx, &multicast_rx, &bytes_tx, &packets_tx, &errors_tx, &dropped_tx, &fifo_tx, &frame_tx, &compressed_tx, &multicast_tx); if (num_parsed != 17) { g_warning ("Error parsing line %d of file /proc/net/dev (num_parsed=%d): `%s'", n, num_parsed, line); continue; } /* remove trailing ':' from interface name */ ptr = strrchr (iface_name, ':'); if (ptr) *ptr = '\0'; cockpit_samples_sample (samples, "network.interface.rx", iface_name, bytes_rx); cockpit_samples_sample (samples, "network.interface.tx", iface_name, bytes_tx); total_rx += bytes_rx; total_tx += bytes_tx; } cockpit_samples_sample (samples, "network.all.rx", NULL, total_rx); cockpit_samples_sample (samples, "network.all.tx", NULL, total_tx); out: g_strfreev (lines); g_free (contents); }