KNemo – network interfaces monitor for systray
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

344 lines
14 KiB

/* This file is part of KNemo
Copyright (C) 2004, 2006 Percy Leonhardt <percy@eris23.de>
KNemo is free software; you can redistribute it and/or modify
it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
KNemo 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 Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include <tqtimer.h>
#include <tqstrlist.h>
#include <kdebug.h>
#include <kglobal.h>
#include <klocale.h>
#include <kconfig.h>
#include <kprocess.h>
#include <kinstance.h>
#include <kmessagebox.h>
#include <kstandarddirs.h>
#include "knemodaemon.h"
#include "interface.h"
#include "backendbase.h"
#include "daemonregistry.h"
TQString KNemoDaemon::sSelectedInterface = TQString();
extern "C" {
KDE_EXPORT KDEDModule *create_knemod(const TQCString &name) {
return new KNemoDaemon(name);
}
}
KNemoDaemon::KNemoDaemon( const TQCString& name )
: KDEDModule( name ),
mColorVLines( 0x04FB1D ),
mColorHLines( 0x04FB1D ),
mColorIncoming( 0x1889FF ),
mColorOutgoing( 0xFF7F08 ),
mColorBackground( 0x313031 ),
mInstance( new TDEInstance( "knemo" ) ),
mNotifyInstance( new KNotifyClient::Instance( mInstance ) )
{
TDEGlobal::locale()->insertCatalogue( "knemod" );
readConfig();
// select the backend from the config file
TDEConfig* config = new TDEConfig( "knemorc", true );
config->setGroup( "General" );
mBackendName = config->readEntry( "Backend", "Nettools" );
delete config;
bool foundBackend = false;
int i;
for ( i = 0; DaemonRegistry[i].name != TQString(); i++ )
{
if ( DaemonRegistry[i].name == mBackendName )
{
foundBackend = true;
break;
}
}
if ( !foundBackend )
{
i = 0; // use the first backend (Nettools)
}
mBackend = ( *DaemonRegistry[i].function )( mInterfaceDict );
mInterfaceDict.setAutoDelete( true );
mPollTimer = new TQTimer();
connect( mPollTimer, TQT_SIGNAL( timeout() ), this, TQT_SLOT( updateInterfaces() ) );
mPollTimer->start( mGeneralData.pollInterval * 1000 );
}
KNemoDaemon::~KNemoDaemon()
{
mPollTimer->stop();
delete mPollTimer;
delete mBackend;
delete mNotifyInstance;
delete mInstance;
TQDictIterator<Interface> it( mInterfaceDict );
for ( ; it.current(); )
{
mInterfaceDict.remove( it.currentKey() );
// 'remove' already advanced the iterator to the next item
}
}
void KNemoDaemon::readConfig()
{
TDEConfig* config = new TDEConfig( "knemorc", true );
config->setGroup( "General" );
mGeneralData.pollInterval = config->readNumEntry( "PollInterval", 1 );
mGeneralData.saveInterval = config->readNumEntry( "SaveInterval", 60 );
mGeneralData.statisticsDir = config->readEntry( "StatisticsDir", TDEGlobal::dirs()->saveLocation( "data", "knemo/" ) );
mGeneralData.toolTipContent = config->readNumEntry( "ToolTipContent", 2 );
TQStrList list;
int numEntries = config->readListEntry( "Interfaces", list );
if ( numEntries == 0 )
return;
char* interface;
for ( interface = list.first(); interface; interface = list.next() )
{
Interface* iface = new Interface( interface, mGeneralData, mPlotterSettings );
TQString group( "Interface_" );
group += interface;
if ( config->hasGroup( group ) )
{
config->setGroup( group );
InterfaceSettings& settings = iface->getSettings();
settings.alias = config->readEntry( "Alias" );
settings.iconSet = config->readNumEntry( "IconSet", 0 );
settings.customCommands = config->readBoolEntry( "CustomCommands" );
settings.hideWhenNotAvailable = config->readBoolEntry( "HideWhenNotAvailable" );
settings.hideWhenNotExisting = config->readBoolEntry( "HideWhenNotExisting" );
settings.activateStatistics = config->readBoolEntry( "ActivateStatistics" );
settings.trafficThreshold = config->readNumEntry( "TrafficThreshold", 0 );
if ( settings.customCommands )
{
int numCommands = config->readNumEntry( "NumCommands" );
for ( int i = 0; i < numCommands; i++ )
{
TQString entry;
InterfaceCommand cmd;
entry = TQString( "RunAsRoot%1" ).arg( i + 1 );
cmd.runAsRoot = config->readBoolEntry( entry );
entry = TQString( "Command%1" ).arg( i + 1 );
cmd.command = config->readEntry( entry );
entry = TQString( "MenuText%1" ).arg( i + 1 );
cmd.menuText = config->readEntry( entry );
settings.commands.append( cmd );
}
}
iface->configChanged(); // important to activate the statistics
}
mInterfaceDict.insert( interface, iface );
}
// load the settings for the plotter
config->setGroup( "PlotterSettings" );
mPlotterSettings.pixel = config->readNumEntry( "Pixel", 1 );
mPlotterSettings.count = config->readNumEntry( "Count", 5 );
mPlotterSettings.distance = config->readNumEntry( "Distance", 30 );
mPlotterSettings.fontSize = config->readNumEntry( "FontSize", 8 );
mPlotterSettings.minimumValue = config->readNumEntry( "MinimumValue", 0 );
mPlotterSettings.maximumValue = config->readNumEntry( "MaximumValue", 1 );
mPlotterSettings.labels = config->readBoolEntry( "Labels", true );
mPlotterSettings.topBar = config->readBoolEntry( "TopBar", false );
mPlotterSettings.showIncoming = config->readBoolEntry( "ShowIncoming", true );
mPlotterSettings.showOutgoing = config->readBoolEntry( "ShowOutgoing", true );
mPlotterSettings.verticalLines = config->readBoolEntry( "VerticalLines", true );
mPlotterSettings.horizontalLines = config->readBoolEntry( "HorizontalLines", true );
mPlotterSettings.automaticDetection = config->readBoolEntry( "AutomaticDetection", true );
mPlotterSettings.verticalLinesScroll = config->readBoolEntry( "VerticalLinesScroll", true );
mPlotterSettings.colorVLines = config->readColorEntry( "ColorVLines", &mColorVLines );
mPlotterSettings.colorHLines = config->readColorEntry( "ColorHLines", &mColorHLines );
mPlotterSettings.colorIncoming = config->readColorEntry( "ColorIncoming", &mColorIncoming );
mPlotterSettings.colorOutgoing = config->readColorEntry( "ColorOutgoing", &mColorOutgoing );
mPlotterSettings.colorBackground = config->readColorEntry( "ColorBackground", &mColorBackground );
delete config;
}
void KNemoDaemon::reparseConfiguration()
{
// Read the settings from the config file.
TQDict<InterfaceSettings> settingsDict;
TDEConfig* config = new TDEConfig( "knemorc", false );
config->setGroup( "General" );
mGeneralData.pollInterval = config->readNumEntry( "PollInterval", 1 );
mGeneralData.saveInterval = config->readNumEntry( "SaveInterval", 60 );
mGeneralData.statisticsDir = config->readEntry( "StatisticsDir", TDEGlobal::dirs()->saveLocation( "data", "knemo/" ) );
mGeneralData.toolTipContent = config->readNumEntry( "ToolTipContent", 2 );
// restart the timer with the new interval
mPollTimer->changeInterval( mGeneralData.pollInterval * 1000 );
// select the backend from the config file
TQString backend = config->readEntry( "Backend", "Nettools" );
if ( mBackendName != backend )
{
bool foundBackend = false;
mBackendName = backend;
int i;
for ( i = 0; DaemonRegistry[i].name != TQString(); i++ )
{
if ( DaemonRegistry[i].name == backend )
{
foundBackend = true;
break;
}
}
if ( foundBackend )
{
delete mBackend;
mBackend = ( *DaemonRegistry[i].function )( mInterfaceDict );
}
}
TQStrList list;
int numEntries = config->readListEntry( "Interfaces", list );
if ( numEntries == 0 )
return;
char* interface;
for ( interface = list.first(); interface; interface = list.next() )
{
TQString group( "Interface_" );
group += interface;
InterfaceSettings* settings = new InterfaceSettings();
if ( config->hasGroup( group ) )
{
config->setGroup( group );
settings->alias = config->readEntry( "Alias" );
settings->iconSet = config->readNumEntry( "IconSet", 0 );
settings->customCommands = config->readBoolEntry( "CustomCommands" );
settings->hideWhenNotAvailable = config->readBoolEntry( "HideWhenNotAvailable" );
settings->hideWhenNotExisting = config->readBoolEntry( "HideWhenNotExisting" );
settings->activateStatistics = config->readBoolEntry( "ActivateStatistics" );
settings->trafficThreshold = config->readNumEntry( "TrafficThreshold", 0 );
if ( settings->customCommands )
{
int numCommands = config->readNumEntry( "NumCommands" );
for ( int i = 0; i < numCommands; i++ )
{
TQString entry;
InterfaceCommand cmd;
entry = TQString( "RunAsRoot%1" ).arg( i + 1 );
cmd.runAsRoot = config->readBoolEntry( entry );
entry = TQString( "Command%1" ).arg( i + 1 );
cmd.command = config->readEntry( entry );
entry = TQString( "MenuText%1" ).arg( i + 1 );
cmd.menuText = config->readEntry( entry );
settings->commands.append( cmd );
}
}
}
settingsDict.insert( interface, settings );
}
// load the settings for the plotter
config->setGroup( "PlotterSettings" );
mPlotterSettings.pixel = config->readNumEntry( "Pixel", 1 );
mPlotterSettings.count = config->readNumEntry( "Count", 5 );
mPlotterSettings.distance = config->readNumEntry( "Distance", 30 );
mPlotterSettings.fontSize = config->readNumEntry( "FontSize", 8 );
mPlotterSettings.minimumValue = config->readNumEntry( "MinimumValue", 0 );
mPlotterSettings.maximumValue = config->readNumEntry( "MaximumValue", 1 );
mPlotterSettings.labels = config->readBoolEntry( "Labels", true );
mPlotterSettings.topBar = config->readBoolEntry( "TopBar", false );
mPlotterSettings.showIncoming = config->readBoolEntry( "ShowIncoming", true );
mPlotterSettings.showOutgoing = config->readBoolEntry( "ShowOutgoing", true );
mPlotterSettings.verticalLines = config->readBoolEntry( "VerticalLines", true );
mPlotterSettings.horizontalLines = config->readBoolEntry( "HorizontalLines", true );
mPlotterSettings.automaticDetection = config->readBoolEntry( "AutomaticDetection", true );
mPlotterSettings.verticalLinesScroll = config->readBoolEntry( "VerticalLinesScroll", true );
mPlotterSettings.colorVLines = config->readColorEntry( "ColorVLines", &mColorVLines );
mPlotterSettings.colorHLines = config->readColorEntry( "ColorHLines", &mColorHLines );
mPlotterSettings.colorIncoming = config->readColorEntry( "ColorIncoming", &mColorIncoming );
mPlotterSettings.colorOutgoing = config->readColorEntry( "ColorOutgoing", &mColorOutgoing );
mPlotterSettings.colorBackground = config->readColorEntry( "ColorBackground", &mColorBackground );
// Remove all interfaces that the user deleted from
// the internal list.
TQDictIterator<Interface> it( mInterfaceDict );
for ( ; it.current(); )
{
if ( settingsDict.find( it.currentKey() ) == 0 )
{
config->deleteGroup( "Interface_" + it.currentKey() );
mInterfaceDict.remove( it.currentKey() );
// 'remove' already advanced the iterator to the next item
}
else
++it;
}
config->sync();
delete config;
// Update all other interfaces and add new ones.
TQDictIterator<InterfaceSettings> setIt( settingsDict );
for ( ; setIt.current(); ++setIt )
{
Interface* iface;
if ( mInterfaceDict.find( setIt.currentKey() ) == 0 )
{
iface = new Interface( setIt.currentKey(), mGeneralData, mPlotterSettings );
mInterfaceDict.insert( setIt.currentKey(), iface );
}
else
iface = mInterfaceDict[setIt.currentKey()];
InterfaceSettings& settings = iface->getSettings();
settings.alias = setIt.current()->alias;
settings.iconSet = setIt.current()->iconSet;
settings.customCommands = setIt.current()->customCommands;
settings.hideWhenNotAvailable = setIt.current()->hideWhenNotAvailable;
settings.hideWhenNotExisting = setIt.current()->hideWhenNotExisting;
settings.activateStatistics = setIt.current()->activateStatistics;
settings.trafficThreshold = setIt.current()->trafficThreshold;
settings.commands = setIt.current()->commands;
iface->configChanged();
}
}
TQString KNemoDaemon::getSelectedInterface()
{
// Reset the variable to avoid preselecting an interface when
// the user opens the control center module from the control
// center afterwards.
TQString tmp = sSelectedInterface;
sSelectedInterface = TQString();
return tmp;
}
void KNemoDaemon::updateInterfaces()
{
mBackend->update();
}
#include "knemodaemon.moc"