• 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 
19 NetworkSensor::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 }
73 NetworkSensor::~NetworkSensor()
74 {
75 }
76 void 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 
127 void 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:31

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.8.13
This website is maintained by Timothy Pearson.