|
|
|
/*
|
|
|
|
KSysGuard, the KDE System Guard
|
|
|
|
|
|
|
|
Copyright (c) 1999 - 2001 Chris Schlaeger <cs@kde.org>
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of version 2 of the GNU General Public
|
|
|
|
License as published by the Free Software Foundation.
|
|
|
|
|
|
|
|
This program 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 General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include <kpassdlg.h>
|
|
|
|
#include <kprocess.h>
|
|
|
|
|
|
|
|
#include "SensorClient.h"
|
|
|
|
#include "SensorManager.h"
|
|
|
|
|
|
|
|
#include "SensorShellAgent.h"
|
|
|
|
|
|
|
|
using namespace KSGRD;
|
|
|
|
|
|
|
|
SensorShellAgent::SensorShellAgent( SensorManager *sm )
|
|
|
|
: SensorAgent( sm ), mDaemon( 0 )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
SensorShellAgent::~SensorShellAgent()
|
|
|
|
{
|
|
|
|
if ( mDaemon ) {
|
|
|
|
mDaemon->writeStdin( "quit\n", strlen( "quit\n" ) );
|
|
|
|
delete mDaemon;
|
|
|
|
mDaemon = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SensorShellAgent::start( const TQString &host, const TQString &shell,
|
|
|
|
const TQString &command, int )
|
|
|
|
{
|
|
|
|
mRetryCount = 3;
|
|
|
|
mDaemon = new TDEProcess;
|
|
|
|
mDaemon->setUseShell(true);
|
|
|
|
setHostName( host );
|
|
|
|
mShell = shell;
|
|
|
|
mCommand = command;
|
|
|
|
|
|
|
|
connect( mDaemon, TQ_SIGNAL( processExited( TDEProcess* ) ),
|
|
|
|
TQ_SLOT( daemonExited( TDEProcess* ) ) );
|
|
|
|
connect( mDaemon, TQ_SIGNAL( receivedStdout( TDEProcess*, char*, int ) ),
|
|
|
|
TQ_SLOT( msgRcvd( TDEProcess*, char*, int ) ) );
|
|
|
|
connect( mDaemon, TQ_SIGNAL( receivedStderr( TDEProcess*, char*, int ) ),
|
|
|
|
TQ_SLOT( errMsgRcvd( TDEProcess*, char*, int ) ) );
|
|
|
|
connect( mDaemon, TQ_SIGNAL( wroteStdin( TDEProcess* ) ),
|
|
|
|
TQ_SLOT( msgSent( TDEProcess* ) ) );
|
|
|
|
|
|
|
|
TQString cmd;
|
|
|
|
if ( !command.isEmpty() )
|
|
|
|
cmd = command;
|
|
|
|
else
|
|
|
|
cmd = mShell + " " + hostName() + " ksysguardd";
|
|
|
|
*mDaemon << cmd;
|
|
|
|
|
|
|
|
if ( !mDaemon->start( TDEProcess::NotifyOnExit, TDEProcess::All ) ) {
|
|
|
|
sensorManager()->hostLost( this );
|
|
|
|
kdDebug (1215) << "Command '" << cmd << "' failed" << endl;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SensorShellAgent::hostInfo( TQString &shell, TQString &command,
|
|
|
|
int &port) const
|
|
|
|
{
|
|
|
|
shell = mShell;
|
|
|
|
command = mCommand;
|
|
|
|
port = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SensorShellAgent::msgSent( TDEProcess* )
|
|
|
|
{
|
|
|
|
setTransmitting( false );
|
|
|
|
|
|
|
|
// Try to send next request if available.
|
|
|
|
executeCommand();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SensorShellAgent::msgRcvd( TDEProcess*, char *buffer, int buflen )
|
|
|
|
{
|
|
|
|
if ( !buffer || buflen == 0 )
|
|
|
|
return;
|
|
|
|
mRetryCount = 3; //we recieved an answer, so reset our retry count back to 3
|
|
|
|
TQString aux = TQString::fromLocal8Bit( buffer, buflen );
|
|
|
|
|
|
|
|
processAnswer( aux );
|
|
|
|
}
|
|
|
|
|
|
|
|
void SensorShellAgent::errMsgRcvd( TDEProcess*, char *buffer, int buflen )
|
|
|
|
{
|
|
|
|
if ( !buffer || buflen == 0 )
|
|
|
|
return;
|
|
|
|
|
|
|
|
TQString buf = TQString::fromLocal8Bit( buffer, buflen );
|
|
|
|
|
|
|
|
kdDebug(1215) << "SensorShellAgent: Warning, received text over stderr!"
|
|
|
|
<< endl << buf << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SensorShellAgent::daemonExited( TDEProcess *process )
|
|
|
|
{
|
|
|
|
kdDebug() << "daemonExited" << endl;
|
|
|
|
if ( mRetryCount-- <= 0 || !mDaemon->start( TDEProcess::NotifyOnExit, TDEProcess::All ) ) {
|
|
|
|
kdDebug() << "daemon could not be restart" << endl;
|
|
|
|
setDaemonOnLine( false );
|
|
|
|
sensorManager()->hostLost( this );
|
|
|
|
sensorManager()->requestDisengage( this );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SensorShellAgent::writeMsg( const char *msg, int len )
|
|
|
|
{
|
|
|
|
return mDaemon->writeStdin( msg, len );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SensorShellAgent::txReady()
|
|
|
|
{
|
|
|
|
return !transmitting();
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "SensorShellAgent.moc"
|