2
KSysGuard, the KDE System Guard
4
Copyright (c) 1999 - 2001 Chris Schlaeger <cs@kde.org>
6
This program is free software; you can redistribute it and/or
7
modify it under the terms of version 2 of the GNU General Public
8
License as published by the Free Software Foundation.
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
15
You should have received a copy of the GNU General Public License
16
along with this program; if not, write to the Free Software
17
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21
#include <QApplication>
27
#include "SensorShellAgent.h"
28
#include "SensorSocketAgent.h"
30
#include "SensorManager.h"
32
using namespace KSGRD;
34
class AgentEvent : public QEvent
37
AgentEvent( const SensorAgent *agent )
38
: QEvent( QEvent::User ), mAgent( agent )
42
const SensorAgent *agent() const
48
const SensorAgent *mAgent;
51
SensorManager::MessageEvent::MessageEvent( const QString &message )
52
: QEvent( QEvent::User ), mMessage( message )
56
QString SensorManager::MessageEvent::message() const
61
SensorManager* KSGRD::SensorMgr;
63
SensorManager::SensorManager()
65
// Fill the sensor description dictionary.
67
mDict.insert( QLatin1String( "Delta" ), i18n( "Change" ) );
68
mDict.insert( QLatin1String( "Rate" ), i18n( "Rate" ) );
70
mDict.insert( QLatin1String( "cpu" ), i18n( "CPU Load" ) );
71
mDict.insert( QLatin1String( "idle" ), i18n( "Idling" ) );
72
mDict.insert( QLatin1String( "nice" ), i18n( "Nice Load" ) );
73
mDict.insert( QLatin1String( "user" ), i18n( "User Load" ) );
74
mDict.insert( QLatin1String( "sys" ), i18n( "System Load" ) );
75
mDict.insert( QLatin1String( "wait" ), i18n( "Waiting" ) );
76
mDict.insert( QLatin1String( "TotalLoad" ), i18n( "Total Load" ) );
77
mDict.insert( QLatin1String( "mem" ), i18n( "Memory" ) );
78
mDict.insert( QLatin1String( "physical" ), i18n( "Physical Memory" ) );
79
mDict.insert( QLatin1String( "swap" ), i18n( "Swap Memory" ) );
80
mDict.insert( QLatin1String( "cached" ), i18n( "Cached Memory" ) );
81
mDict.insert( QLatin1String( "buf" ), i18n( "Buffered Memory" ) );
82
mDict.insert( QLatin1String( "used" ), i18n( "Used Memory" ) );
83
mDict.insert( QLatin1String( "application" ), i18n( "Application Memory" ) );
84
mDict.insert( QLatin1String( "free" ), i18n( "Free Memory" ) );
85
mDict.insert( QLatin1String( "pscount" ), i18n( "Process Count" ) );
86
mDict.insert( QLatin1String( "ps" ), i18n( "Process Controller" ) );
87
mDict.insert( QLatin1String( "disk" ), i18n( "Disk Throughput" ) );
88
mDict.insert( QLatin1String( "load" ), i18nc( "CPU Load", "Load" ) );
89
mDict.insert( QLatin1String( "totalio" ), i18n( "Total Accesses" ) );
90
mDict.insert( QLatin1String( "rio" ), i18n( "Read Accesses" ) );
91
mDict.insert( QLatin1String( "wio" ), i18n( "Write Accesses" ) );
92
mDict.insert( QLatin1String( "rblk" ), i18n( "Read Data" ) );
93
mDict.insert( QLatin1String( "wblk" ), i18n( "Written Data" ) );
94
mDict.insert( QLatin1String( "rtim" ), i18n( "Milliseconds spent reading" ) );
95
mDict.insert( QLatin1String( "wtim" ), i18n( "Milliseconds spent writing" ) );
96
mDict.insert( QLatin1String( "ioqueue" ), i18n( "I/Os currently in progress" ) );
97
mDict.insert( QLatin1String( "pageIn" ), i18n( "Pages In" ) );
98
mDict.insert( QLatin1String( "pageOut" ), i18n( "Pages Out" ) );
99
mDict.insert( QLatin1String( "context" ), i18n( "Context Switches" ) );
100
mDict.insert( QLatin1String( "network" ), i18n( "Network" ) );
101
mDict.insert( QLatin1String( "interfaces" ), i18n( "Interfaces" ) );
102
mDict.insert( QLatin1String( "receiver" ), i18n( "Receiver" ) );
103
mDict.insert( QLatin1String( "transmitter" ), i18n( "Transmitter" ) );
104
mDict.insert( QLatin1String( "data" ), i18n( "Data" ) );
105
mDict.insert( QLatin1String( "compressed" ), i18n( "Compressed Packets" ) );
106
mDict.insert( QLatin1String( "drops" ), i18n( "Dropped Packets" ) );
107
mDict.insert( QLatin1String( "errors" ), i18n( "Errors" ) );
108
mDict.insert( QLatin1String( "fifo" ), i18n( "FIFO Overruns" ) );
109
mDict.insert( QLatin1String( "frame" ), i18n( "Frame Errors" ) );
110
mDict.insert( QLatin1String( "multicast" ), i18n( "Multicast" ) );
111
mDict.insert( QLatin1String( "packets" ), i18n( "Packets" ) );
112
mDict.insert( QLatin1String( "carrier" ), i18n( "Carrier" ) );
113
mDict.insert( QLatin1String( "collisions" ), i18n( "Collisions" ) );
114
mDict.insert( QLatin1String( "sockets" ), i18n( "Sockets" ) );
115
mDict.insert( QLatin1String( "count" ), i18n( "Total Number" ) );
116
mDict.insert( QLatin1String( "list" ), i18n( "Table" ) );
117
mDict.insert( QLatin1String( "apm" ), i18n( "Advanced Power Management" ) );
118
mDict.insert( QLatin1String( "acpi" ), i18n( "ACPI" ) );
119
mDict.insert( QLatin1String( "thermal_zone" ), i18n( "Thermal Zone" ) );
120
mDict.insert( QLatin1String( "temperature" ), i18n( "Temperature" ) );
121
mDict.insert( QLatin1String( "fan" ), i18n( "Fan" ) );
122
mDict.insert( QLatin1String( "state" ), i18n( "State" ) );
123
mDict.insert( QLatin1String( "battery" ), i18n( "Battery" ) );
124
mDict.insert( QLatin1String( "batterycharge" ), i18n( "Battery Charge" ) );
125
mDict.insert( QLatin1String( "batteryusage" ), i18n( "Battery Usage" ) );
126
mDict.insert( QLatin1String( "remainingtime" ), i18n( "Remaining Time" ) );
127
mDict.insert( QLatin1String( "interrupts" ), i18n( "Interrupts" ) );
128
mDict.insert( QLatin1String( "loadavg1" ), i18n( "Load Average (1 min)" ) );
129
mDict.insert( QLatin1String( "loadavg5" ), i18n( "Load Average (5 min)" ) );
130
mDict.insert( QLatin1String( "loadavg15" ), i18n( "Load Average (15 min)" ) );
131
mDict.insert( QLatin1String( "clock" ), i18n( "Clock Frequency" ) );
132
mDict.insert( QLatin1String( "lmsensors" ), i18n( "Hardware Sensors" ) );
133
mDict.insert( QLatin1String( "partitions" ), i18n( "Partition Usage" ) );
134
mDict.insert( QLatin1String( "usedspace" ), i18n( "Used Space" ) );
135
mDict.insert( QLatin1String( "freespace" ), i18n( "Free Space" ) );
136
mDict.insert( QLatin1String( "filllevel" ), i18n( "Fill Level" ) );
137
mDict.insert( QLatin1String( "system" ), i18n( "System" ) );
138
mDict.insert( QLatin1String( "uptime" ), i18n( "Uptime" ) );
139
mDict.insert( QLatin1String( "SoftRaid" ), i18n( "Linux Soft Raid (md)" ) );
141
for ( int i = 0; i < 32; i++ ) {
142
mDict.insert( QLatin1String( "cpu" ) + QString::number( i ), i18n( "CPU %1", i+1 ) );
143
mDict.insert( QLatin1String( "disk" ) + QString::number( i ), i18n( "Disk %1", i+1 ) );
146
for ( int i = 1; i < 6; i++) {
147
mDict.insert( QLatin1String( "fan" ) + QString::number( i ), i18n( "Fan %1", i ) );
148
mDict.insert( QLatin1String( "temp" ) + QString::number( i ), i18n( "Temperature %1", i ) );
151
mDict.insert( QLatin1String( "int00" ), i18n( "Total" ) );
154
for ( int i = 1; i < 25; i++ ) {
155
num.sprintf( "%.2d", i );
156
mDict.insert( QLatin1String( "int" ) + num, ki18n( "Int %1" ).subs( i - 1, 3 ).toString() );
159
// TODO: translated descriptions not yet implemented.
161
mUnits.insert( QLatin1String( "1/s" ), i18nc( "the unit 1 per second", "1/s" ) );
162
mUnits.insert( QLatin1String( "kBytes" ), i18n( "kBytes" ) );
163
mUnits.insert( QLatin1String( "min" ), i18nc( "the unit minutes", "min" ) );
164
mUnits.insert( QLatin1String( "MHz" ), i18nc( "the frequency unit", "MHz" ) );
165
mUnits.insert( QLatin1String( "%" ), i18nc( "a percentage", "%" ) );
167
mTypes.insert( QLatin1String( "integer" ), i18n( "Integer Value" ) );
168
mTypes.insert( QLatin1String( "float" ), i18n( "Floating Point Value" ) );
169
mTypes.insert( QLatin1String( "table" ), i18n( "Process Controller" ) );
170
mTypes.insert( QLatin1String( "listview" ), i18n( "Table" ) );
176
SensorManager::~SensorManager()
180
bool SensorManager::engage( const QString &hostName, const QString &shell,
181
const QString &command, int port )
183
if ( !mAgents.contains( hostName ) ) {
184
SensorAgent *agent = 0;
187
agent = new SensorShellAgent( this );
189
agent = new SensorSocketAgent( this );
191
if ( !agent->start( hostName.toAscii(), shell, command, port ) ) {
196
mAgents.insert( hostName, agent );
197
connect( agent, SIGNAL( reconfigure( const SensorAgent* ) ),
198
SLOT( reconfigure( const SensorAgent* ) ) );
207
void SensorManager::requestDisengage( const SensorAgent *agent )
209
/* When a sensor agent becomes disfunctional it calls this function
210
* to request that it is being removed from the SensorManager. It must
211
* not call disengage() directly since it would trigger ~SensorAgent()
212
* while we are still in a SensorAgent member function.
213
* So we have to post an event which is later caught by
214
* SensorManger::customEvent(). */
215
AgentEvent* event = new AgentEvent( agent );
216
qApp->postEvent( this, event );
219
bool SensorManager::disengage( const SensorAgent *agent )
221
const QString key = mAgents.key( const_cast<SensorAgent*>( agent ) );
222
if ( !key.isEmpty() ) {
223
mAgents.remove( key );
232
bool SensorManager::isConnected( const QString &hostName )
234
return mAgents.contains( hostName );
236
bool SensorManager::disengage( const QString &hostName )
238
if ( mAgents.contains( hostName ) ) {
239
mAgents.remove( hostName );
248
bool SensorManager::resynchronize( const QString &hostName )
250
const SensorAgent *agent = mAgents.value( hostName );
255
QString shell, command;
257
hostInfo( hostName, shell, command, port );
259
disengage( hostName );
261
kDebug (1215) << "Re-synchronizing connection to " << hostName;
263
return engage( hostName, shell, command );
266
void SensorManager::hostLost( const SensorAgent *agent )
268
emit hostConnectionLost( agent->hostName() );
270
notify( i18n( "Connection to %1 has been lost.", agent->hostName() ) );
273
void SensorManager::notify( const QString &msg ) const
275
/* This function relays text messages to the toplevel widget that
276
* displays the message in a pop-up box. It must be used for objects
277
* that might have been deleted before the pop-up box is closed. */
278
if ( mBroadcaster ) {
279
MessageEvent *event = new MessageEvent( msg );
280
qApp->postEvent( mBroadcaster, event );
284
void SensorManager::setBroadcaster( QWidget *wdg )
289
void SensorManager::reconfigure( const SensorAgent* )
294
bool SensorManager::event( QEvent *event )
296
if ( event->type() == QEvent::User ) {
297
disengage( static_cast<AgentEvent*>( event )->agent() );
304
bool SensorManager::sendRequest( const QString &hostName, const QString &req,
305
SensorClient *client, int id )
307
SensorAgent *agent = mAgents.value( hostName );
308
if ( !agent && hostName == "localhost") {
309
//we should always be able to reconnect to localhost
310
engage("localhost", "", "ksysguardd", -1);
311
agent = mAgents.value( hostName );
314
agent->sendRequest( req, client, id );
321
const QString SensorManager::hostName( const SensorAgent *agent ) const
323
return mAgents.key( const_cast<SensorAgent*>( agent ) );
326
bool SensorManager::hostInfo( const QString &hostName, QString &shell,
327
QString &command, int &port )
329
const SensorAgent *agent = mAgents.value( hostName );
331
agent->hostInfo( shell, command, port );
338
QString SensorManager::translateUnit( const QString &unit ) const
340
if ( !unit.isEmpty() && mUnits.contains( unit ) )
341
return mUnits[ unit ];
346
QString SensorManager::translateSensorPath( const QString &path ) const
348
if ( !path.isEmpty() && mDict.contains( path ) )
349
return mDict[ path ];
354
QString SensorManager::translateSensorType( const QString &type ) const
356
if ( !type.isEmpty() && mTypes.contains( type ) )
357
return mTypes[ type ];
362
QString SensorManager::translateSensor( const QString &sensor ) const
365
int start = 0, end = 0;
367
end = sensor.indexOf( '/', start );
369
out += translateSensorPath( sensor.mid( start, end - start ) ) + '/';
371
out += translateSensorPath( sensor.right( sensor.length() - start ) );
380
void SensorManager::readProperties( const KConfigGroup& cfg )
382
mHostList = cfg.readEntry( "HostList" ,QStringList());
383
mCommandList = cfg.readEntry( "CommandList",QStringList() );
387
SensorManager::saveProperties( KConfigGroup &cfg )
389
cfg.writeEntry( "HostList", mHostList );
390
cfg.writeEntry( "CommandList", mCommandList );
393
void SensorManager::disconnectClient( SensorClient *client )
395
QHashIterator<QString, SensorAgent*> it( mAgents );
397
while ( it.hasNext() )
398
it.next().value()->disconnectClient( client );
401
#include "SensorManager.moc"