• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • superkaramba
 

superkaramba

  • superkaramba
  • src
networksensor.cpp
1/***************************************************************************
2 * Copyright (C) 2003 by Hans Karlsson *
3 * karlsson.h@home.se *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 ***************************************************************************/
10#ifdef __FreeBSD__
11#include <sys/param.h>
12#include <sys/sysctl.h>
13#include <sys/socket.h>
14#include <net/route.h>
15#endif
16
17#include "networksensor.h"
18
19NetworkSensor::NetworkSensor( TQString dev, int interval ):Sensor( interval )
20{
21 device = dev.lower();
22
23#ifdef __FreeBSD__
24 /* Determine number of interfaces */
25 u_int n = 0;
26 size_t nlen = 0;
27 nlen = sizeof(n);
28 sysctlbyname("net.link.generic.system.ifcount", &n, &nlen, NULL, 0);
29
30 size_t if_miblen = 0;
31 if_miblen = sizeof(if_mib);
32 static int name[] = { CTL_NET,
33 PF_LINK,
34 NETLINK_GENERIC,
35 IFMIB_IFDATA,
36 0,
37 IFDATA_GENERAL };
38
39 /*
40 If the device was defined by the theme, find the right devicenumber.
41 If not, use the device that holds the default route.
42 */
43
44 if_number = -1;
45 int if_gw = -1;
46
47 for (int i = 1; i <= n; ++i) {
48 name[4] = i;
49 /* Get data for iface-number i */
50 sysctl(name, 6, (void*)&if_mib, (size_t*)&if_miblen, (void*)NULL, (size_t)0);
51
52 /* We found the right interface? */
53 if (TQString(if_mib.ifmd_name) == device) {
54 if_number = i;
55 break;
56 }
57
58 /* Does the interface hold the default route? */
59 if ( if_mib.ifmd_flags & RTF_GATEWAY )
60 if_gw = i;
61 }
62
63 if ((if_number == -1) && (if_gw != -1))
64 if_number = if_gw;
65#else
66 if( device.isEmpty() )
67 device = "eth0";
68#endif
69 getInOutBytes(receivedBytes,transmittedBytes);
70 netTimer.start();
71
72}
73NetworkSensor::~NetworkSensor()
74{
75}
76void NetworkSensor::getInOutBytes ( unsigned long &in,unsigned long &out) const
77{
78#ifdef __FreeBSD__
79 if (if_number != -1) {
80 size_t if_miblen = 0;
81 if_miblen = sizeof(if_mib);
82 int name[] = { CTL_NET,
83 PF_LINK,
84 NETLINK_GENERIC,
85 IFMIB_IFDATA,
86 if_number,
87 IFDATA_GENERAL };
88
89 sysctl(name, 6, (void*)&if_mib, (size_t*)&if_miblen, (void*)NULL, (size_t)0);
90
91 in = if_mib.ifmd_data.ifi_ibytes;
92 out = if_mib.ifmd_data.ifi_obytes;
93 }
94 else {
95 in = 0;
96 out = 0;
97 }
98#else
99 TQFile file("/proc/net/dev");
100 TQString line;
101 if ( file.open(IO_ReadOnly | IO_Translate) )
102 {
103 TQTextStream t( &file ); // use a text stream
104 line = t.readLine();
105 while(line !=0 && !line.contains(device))
106 {
107 line = t.readLine();
108 }
109 if ( line.contains( device ) )
110 {
111 TQRegExp rx( "^\\W*"+device+":\\D*(\\d+)(?:\\D+\\d+){7}\\D+(\\d+)", false);
112 rx.search(line);
113 in = rx.cap(1).toULong();
114 out = rx.cap(2).toULong();
115 }
116 else
117 {
118 tqDebug("Network sensor: can not find %s", device.ascii());
119 in = 0;
120 out = 0;
121 }
122 file.close();
123 }
124#endif
125}
126
127void NetworkSensor::update()
128{
129 SensorParams *sp;
130 Meter *meter;
131 TQObjectListIt it( *objList );
132 TQString format;
133 int decimals;
134
135 unsigned long inB, outB;
136 const double delay = (double) netTimer.elapsed(); // msec elapsed since last update
137 getInOutBytes( inB, outB );
138 netTimer.restart();
139
140 while( it != 0 )
141 {
142 sp = (SensorParams*)(*it);
143 meter = sp->getMeter();
144 format = sp->getParam( "FORMAT" );
145 decimals = ( sp->getParam( "DECIMALS" ) ).toInt();
146 if (format.length() == 0 )
147 {
148 format = "%in";
149 }
150
151 format.replace( TQRegExp("%inkb", false), TQString::number( ((inB - receivedBytes)*8)/delay, 'f', decimals ) );
152 format.replace( TQRegExp("%in", false), TQString::number( (inB - receivedBytes)/delay, 'f', decimals ) );
153
154 format.replace( TQRegExp("%outkb", false), TQString::number( ((outB - transmittedBytes)*8)/delay, 'f', decimals ) );
155 format.replace( TQRegExp("%out", false), TQString::number( (outB - transmittedBytes)/delay, 'f', decimals ) );
156
157 meter->setValue( format );
158 ++it;
159 }
160 receivedBytes = inB;
161 transmittedBytes = outB;
162}
163
164#include "networksensor.moc"
SensorParams
Hans Karlsson.
Definition: sensorparams.h:32

superkaramba

Skip menu "superkaramba"
  • Main Page
  • Alphabetical List
  • Class List
  • File List
  • Class Members

superkaramba

Skip menu "superkaramba"
  • kcalc
  •   knumber
  • superkaramba
Generated for superkaramba by doxygen 1.9.4
This website is maintained by Timothy Pearson.