/*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ /* Author: Christian Hubinger , (C) 2001-2008 */ #include "kmftarget.h" // TQt includes #include // KDE includes #include #include #include #include #include #include #include // Project Inclueds #include "ipaddress.h" #include "kmferror.h" #include "kmfnetzone.h" #include "kmfnetwork.h" #include "kmftargetconfig.h" #include "kmfconfig.h" #include "kmfdoc.h" #include "kmfiptdoc.h" #include "kmfgenericdoc.h" #include "kmfrulesetdoc.h" #include "kmfinstallerinterface.h" #include "kmfcompilerinterface.h" #include "kmfpluginfactory.h" #include "kprocesswrapper.h" #include "xmlnames.h" namespace KMF { KMFTarget::KMFTarget( NetfilterObject *parent, const char* name, const TQString&, KMFNetwork* net ) : NetfilterObject( parent, name ) { kdDebug() << "KMFTarget::KMFTarget( NetfilterObject *parent, const TQString& name )" << endl; m_network = net; m_address = new IPAddress( 0,0,0,0 ); m_ssh_port = 22; m_zone = 0; m_config = new KMFTargetConfig( this, name ); m_doc = 0; m_readOnly = false; } KMFTarget::~KMFTarget() { kdDebug() << "KMFTarget::~KMFTarget()" << endl; delete m_address; if ( m_doc ) { m_doc->deleteLater(); } } void KMFTarget::ensureDoc() { if ( m_doc == 0 ) { if ( KMFConfig::useGenericInterface() ) { kdDebug() << "Creating new KMFGenericDoc( this, KMFGenericDoc, this )" << endl; m_doc = new KMFGenericDoc( this, "KMFGenericDoc", this ); } else { kdDebug() << "Creating new KMFIPTDoc( this, KMFIPTDoc, this )" << endl; m_doc = new KMFIPTDoc( this, "KMFIPTDoc", this ); } } } void KMFTarget::clear() { if( m_doc ) { m_doc->clear(); } } KMFDoc* KMFTarget::doc() { ensureDoc(); return m_doc; } KMFNetwork* KMFTarget::network() { kdDebug() << "KMFTarget::network()" << endl; return m_network; } TQString KMFTarget::toString() { TQString ret = TQString( "Host: " + address()->toString() + " name: " + NetfilterObject::name() + " GUIName: " + guiName() ); return ret; } bool KMFTarget::isLocalhost() { return NetfilterObject::name() == Constants::Localhost_Name; } bool KMFTarget::isLocalExecuteTarget() { return ( NetfilterObject::name() == Constants::Localhost_Name && ! KMFConfig::useSSHForLocalhost() ); } TQString KMFTarget::toFriendlyString() { TQString ret = TQString( guiName() + " [" + address()->toString() +"]" ); return ret; } KMFTargetConfig *KMFTarget::config() { return m_config; } KMFInstallerInterface* KMFTarget::installer() { return KMFPluginFactory::KMFInstaller( this ); } KMFCompilerInterface* KMFTarget::compiler() { return KMFPluginFactory::KMFCompiler( this ); } KMFRulesetDoc* KMFTarget::rulesetDoc() { // return dynamic_cast( this ); ensureDoc(); return dynamic_cast( m_doc ); } int KMFTarget::type() { // kdDebug() << "KMFTarget::type()" << endl; return NetfilterObject::KMFTARGET; } void KMFTarget::setSSHPort( int port ) { m_ssh_port = port; } void KMFTarget::setReadOnly( bool onOff ) { m_readOnly = onOff; } void KMFTarget::setGuiName( const TQString& name){ if ( !name.isNull() && !name.isEmpty() && m_guiName != name ) { m_guiName = name; changed(); } } void KMFTarget::setAddress( const TQString& addr ) { m_address->setAddress( addr ); changed(); } void KMFTarget::setParentZone( KMFNetZone* zone ){ m_zone = zone; changed(); } bool KMFTarget::isCurrentTarget() { kdDebug() << "KMFTarget::isCurrentTarget()" << endl; if ( ! zone() ) { kdDebug() << "zone() == 0" << endl; return false; } if ( ! zone()->network() ) { kdDebug() << "zone()->network() == 0" << endl; return false; } return ( zone()->network()->currentTarget()->uuid() == this->uuid() ); } const TQString& KMFTarget::name() { // kdDebug() << "TQString& KMFTarget::name()" << endl; if ( ! zone() || readOnly() ) { return NetfilterObject::name(); } int index = 0; bool found = false; KMFNetZone *z = zone(); TQPtrListIterator it( z->hosts() ); while ( it.current() && ! found ) { if ( it.current() == this ) { found = true; } index++; ++it; } const TQString& s = zone()->name() + "_target_"+ TQString::number( index ); return *( new TQString(s) ); } const TQString& KMFTarget::getFishUrl() { TQString addr = isLocalhost() ? "localhost" : m_address->toString(); return *( new TQString("fish://root@" + addr + ":" + TQString::number( m_ssh_port ) ) ); } KMFError* KMFTarget::tryAutoConfiguration() { kdDebug() << "KMFError* KMFTarget::tryAutoConfiguration()" << endl; KMFError* err = new KMFError(); if ( isLocalExecuteTarget() ) { TDEProcessWrapper::instance()->slotStartLocalJob( "autoconf", "uname", false, true ); } else { TDEProcessWrapper::instance()->slotStartRemoteJob( "autoconf", "uname", rulesetDoc()->target() ); } if ( TDEProcessWrapper::instance()->exitStatus() != 0 ) { kdDebug() << "ERROR:" << TDEProcessWrapper::instance()->stdErr() << endl; err->setErrType( KMFError::NORMAL ); err->setErrMsg( TDEProcessWrapper::instance()->stdErr() ); return err; } TQString retValUname = TDEProcessWrapper::instance()->stdCombined(); kdDebug() << "Found OS: " << retValUname << endl; config()->setOS( retValUname.lower().remove( "\n" ).remove( " " ) ); TQString path = "kmyfirewall/scripts/installer/"; path.append( config()->oS().lower() ); path.append( "/autoconfighelper.sh" ); kdDebug() << "Search Path: " << path << endl; TQString localFile = TDEGlobal::dirs() ->findResource( "data", path ); if ( ! TDEIO::NetAccess::exists( localFile, false, TDEApplication::kApplication()->mainWidget() ) ) { kdDebug() << "No autoconfigure script found for os: " << config()->oS() << endl; emit sigTargetChanged( this ); err->setErrType( KMFError::NORMAL ); err->setErrMsg( i18n("No autoconfigure script found for os: %1").arg( config()->oS() ) ); return err; } if ( isLocalExecuteTarget() ) { TDEProcessWrapper::instance()->slotStartLocalJob( "autoconf", localFile, false, true ); } else { TDEProcessWrapper::instance()->slotStartRemoteJob( "autoconf", localFile, rulesetDoc()->target() ); } if ( TDEProcessWrapper::instance()->exitStatus() != 0 ) { kdDebug() << "ERROR:" << TDEProcessWrapper::instance()->stdErr() << endl; err->setErrType( KMFError::NORMAL ); err->setErrMsg( TDEProcessWrapper::instance()->stdErr() ); return err; } TQString retVal = TDEProcessWrapper::instance()->stdCombined(); kdDebug() << "AutoConf XML: \n"<< retVal << endl; TQDomDocument doc; doc.setContent( retVal ); TQStringList errors; config()->setDistribution( "" ); config()->setIPTPath( "" ); config()->setInitPath( "" ); config()->setInterfaces( "" ); config()->setModprobePath( "" ); config()->setRcDefaultPath( "" ); config()->loadXML( doc, errors ); emit sigTargetChanged( this ); err->setErrType( KMFError::OK ); err->setErrMsg( "" ); return err; } // void KMFTarget::slotProcessFinished( const TQString& jobName, int status, bool exitedNormal, const TQString& stdOut, const TQString& stdErr, const TQString& completeOut ) { // kdDebug() << "KMFTarget::slotProcessFinished( const TQString& jobName, int status, bool exitedNormal, const TQString& stdOut, const TQString& stdErr, const TQString& completeOut )" << endl; // // disconnect( // TDEProcessWrapper::instance(), // TQ_SIGNAL( sigProcessFinished( // const TQString&, // int, // bool, // const TQString&, // const TQString& , // const TQString& ) ), // this, // TQ_SLOT( slotProcessFinished( // const TQString&, // int, // bool, // const TQString&, // const TQString&, // const TQString& ) ) ); // // // const TQString& ret = completeOut; // kdDebug() << "Got Output: " << ret << endl; // // TQDomDocument doc; // doc.setContent( ret ); // TQStringList errors; // // config()->setDistribution( "" ); // config()->setIPTPath( "" ); // config()->setInitPath( "" ); // config()->setInterfaces( "" ); // config()->setModprobePath( "" ); // config()->setRcDefaultPath( "" ); // // config()->loadXML( doc, errors ); // // emit sigTargetChanged( this ); // } const TQDomDocument& KMFTarget::getDOMTree() { // kdDebug() << "const TQDomDocument& KMFTarget::getDOMTree() " << endl; TQDomDocument doc; TQDomElement root = doc.createElement( XML::Target_Element ); NetfilterObject::saveUuid( root ); root.setAttribute( XML::Name_Attribute, name() ); root.setAttribute( XML::GUIName_Attribute, m_guiName ); root.setAttribute( XML::Description_Attribute, description() ); root.setAttribute( XML::Address_Attribute, m_address->toString() ); root.setAttribute( XML::SSHPort_Attribute, sshPort() ); root.setAttribute( XML::ReadOnly_Attribute, readOnly() ? XML::BoolOn_Value : XML::BoolOff_Value ); root.appendChild( config()->getDOMTree( ) ); // TQDomElement root = getDOM(); ensureDoc(); root.appendChild( m_doc->getDOMTree().documentElement() ); doc.appendChild( root ); return *( new TQDomDocument( doc ) ); } void KMFTarget::loadXML( const TQDomDocument& doc, TQStringList& errors ) { kdDebug() << "void KMFTarget::loadXML( const TQDomDocument& )" << endl; TQDomElement root = doc.documentElement(); loadXML( root, errors ); } void KMFTarget::loadXML( TQDomNode root, TQStringList& errors ) { kdDebug() << "void KMFTarget::loadXML( const TQDomDocument& )" << endl; NetfilterObject::loadUuid ( root, errors ); TQString name = ""; TQString guiName = ""; TQString desc = ""; TQString address = ""; TQString readonly = ""; TQString sshPort = ""; name = root.toElement().attribute( XML::Name_Attribute ); setDescription( root.toElement().attribute( XML::Description_Attribute ) ); setGuiName( root.toElement().attribute( XML::GUIName_Attribute ) ); setAddress( root.toElement().attribute( XML::Address_Attribute ) ); if ( root.toElement().hasAttribute( XML::SSHPort_Attribute ) ) { setSSHPort( root.toElement().attribute( XML::SSHPort_Attribute ).toUInt() ); } if ( root.toElement().attribute( XML::ReadOnly_Attribute ) == XML::BoolOn_Value ) { setReadOnly( true ); } else { setReadOnly( false ); } TQDomNode curr = root.firstChild(); while ( !curr.isNull() ) { if ( curr.isElement() && ( curr.nodeName() == XML::TargetConfig_Element ) ) { kdDebug() << "void KMFTarget::loadXML( ) - parse targetconfig " << endl; config()->loadXML( curr, errors ); } if ( curr.isElement() && ( ( curr.nodeName() == XML::GenericDoc_DocumentElement ) || ( curr.nodeName() == XML::IPTDoc_DocumentElement ) ) ) { kdDebug() << "void KMFTarget::loadXML( ) - parse ruleset: " << curr.nodeName() << endl; ensureDoc(); m_doc->loadXML( curr, errors ); } curr = curr.nextSibling(); } kdDebug() << "void KMFTarget::loadXML( ) - My Config: " << toString() << endl; changed(); } }