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.
kvpnc/src/toolinfo.cpp

643 lines
20 KiB

/***************************************************************************
* Copyright (C) 2004 by Christoph Thielecke *
* crissi99@gmx.de *
* *
* 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. *
* *
* 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., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "toolinfo.h"
#include <tqfile.h>
#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <tdelocale.h>
#include <kstandarddirs.h>
#include <tdemessagebox.h>
#include <tqtimer.h>
#include <tqstringlist.h>
#include <tqfileinfo.h>
ToolInfo::ToolInfo( const TQString &Name)
{
this->Name = Name;
this->programsInPath = programsInPath;
this->found = false;
TryPath_first="";
/*
if (!PathToExec.isEmpty())
SearchPathList.append(PathToExec);*/
// if (config->KvpncDebugLevel > 2)
// std::cout << "Checking for: " << Name.ascii() << std::endl;
Version=i18n("No info");
env = new TQStringList();
*env << "LC_ALL=C" << "LANG=C" << "PATH=/bin:/usr/bin:/usr/sbin:/sbin";
collectRunning=false;
collectOpenvpnCapabilitiesRunning=false;
collectToolInfo();
}
bool ToolInfo::collectToolInfo()
{
if(programsInPath)
{
addSearchPath("/usr/local/sbin");
addSearchPath("/usr/sbin");
addSearchPath("/sbin");
addSearchPath("/usr/local/bin");
addSearchPath("/usr/bin");
addSearchPath("/bin");
addSearchPath(TQString (TQString(getenv("HOME"))+"/bin"));
}
bool success = false;
found = false;
if ( TryPath_first.isEmpty() )
TryPath_first=Name;
TQStringList::Iterator it;
if (TQFile (TryPath_first).exists() && TQFileInfo(TryPath_first).isFile() )
{
// if (GlobalConfig->KvpncDebugLevel > 2)
// std::cout << Name.ascii() << "found at: " << TryPath_first.ascii() << ", was first try" << std::endl;
found = true;
PathToExec=TryPath_first;
}
else
{
// if (GlobalConfig->KvpncDebugLevel > 2)
// {
// std::cout << TQString(i18n("Trying first %1 at %2 has been failed, trying other paths").arg(Name).arg(TryPath_first)).ascii() << std::endl;
// std::cout << "searchpath list: " << SearchPathList.join(" ").ascii() << std::endl;
// }
// std::cout << "searchpath list: " << SearchPathList.join(" ").ascii() << std::endl;
for (TQStringList::Iterator it = SearchPathList.begin();it != SearchPathList.end();it++)
{
TQString TryPath=TQString(*it)+"/"+Name;
// if (GlobalConfig->KvpncDebugLevel > 2)
// std::cout << TQString (i18n("Trying %1 at: %2").arg(Name).arg(TryPath)).ascii() << std::endl;
if (!TryPath.isEmpty() && TQFile (TryPath).exists() && TQFileInfo(TryPath).isFile() )
{
// if (GlobalConfig->KvpncDebugLevel > 2)
// std::cout << TQString(i18n("%1 found at: %2").arg(Name).arg(TryPath)).ascii() << std::endl;
found=true;
PathToExec=TryPath;
break;
}
}
}
if ( found)
{
CollectToolInfoProcess = new TQProcess(this);
CollectToolInfoProcess->clearArguments();
connect( CollectToolInfoProcess, TQT_SIGNAL( readyReadStdout() ), this, TQT_SLOT( readStdOutCollectToolInfo() ) );
connect( CollectToolInfoProcess, TQT_SIGNAL( readyReadStderr() ), this, TQT_SLOT( readStdErrCollectToolInfo() ) );
//connect( CollectToolInfoProcess, TQT_SIGNAL( processExited () ), this, TQT_SLOT(processFinished() ) );
bool run=true;
//FIXME how it could be better?
CollectToolInfoProcess->addArgument(PathToExec);
if (Name == "vpnc")
CollectToolInfoProcess->addArgument("--version");
else if (Name == "vpnclient") { }
else if (Name == "ipsec")
CollectToolInfoProcess->addArgument("--version");
else if (Name == "racoon" )
{
// we need to do some stupid hack...
// /usr/sbin/racoon -> /usr/sbin/setkey
CollectToolInfoProcess->clearArguments();
CollectToolInfoProcess->addArgument(TQString(PathToExec.left(PathToExec.length()-6)+"setkey"));
CollectToolInfoProcess->addArgument("-V");
}
else if (Name == "setkey")
CollectToolInfoProcess->addArgument("-V");
else if (Name == "openvpn")
CollectToolInfoProcess->addArgument("--version");
else if (Name == "openssl")
CollectToolInfoProcess->addArgument("version");
else if (Name == "pppd")
CollectToolInfoProcess->addArgument("--version");
else if (Name == "iptables")
CollectToolInfoProcess->addArgument("-V");
else if (Name == "kill")
{
// run=false;
// success=true;
CollectToolInfoProcess->addArgument("-V");
}
else if (Name == "killall")
CollectToolInfoProcess->addArgument("-V");
else if (Name == "ping")
CollectToolInfoProcess->addArgument("-V");
else if (Name == "ip")
CollectToolInfoProcess->addArgument("-V");
else if (Name == "ifconfig")
CollectToolInfoProcess->addArgument("-V");
else if (Name == "route")
CollectToolInfoProcess->addArgument("-V");
else if (Name == "pptp")
;
else if (Name == "l2tpd")
CollectToolInfoProcess->addArgument("-D");
else if (Name == "xl2tpd")
CollectToolInfoProcess->addArgument("-v");
else if (Name == "openl2tpd")
{
CollectToolInfoProcess->addArgument("-c");
CollectToolInfoProcess->addArgument("-");
CollectToolInfoProcess->addArgument("-f");
}
else if (Name =="pkcs11-tool")
CollectToolInfoProcess->addArgument("-I");
else if (Name =="vtund")
CollectToolInfoProcess->addArgument("-h");
else if (Name == "cisco_cert_mgr");
else if (Name =="tail")
CollectToolInfoProcess->addArgument("--version");
else if (Name =="ssh")
CollectToolInfoProcess->addArgument("-V");
else if (Name =="ksshaskpass")
CollectToolInfoProcess->addArgument("--version");
// else if (Name =="gnome-ssh-askpass")
// CollectToolInfoProcess->addArgument("--version");
else if (Name =="netstat")
CollectToolInfoProcess->addArgument("--version");
else
{
// if (GlobalConfig->KvpncDebugLevel > 2)
// std::cout << "Invalid tool (" << Name.ascii() <<")!" << std::endl;
run=false;
success=false;
}
collectRunning=false;
if (run )
{
if ( !PathToExec.isEmpty() && !CollectToolInfoProcess->start(env) )
{
std::cerr << (i18n("Unable to start collectToolInfo process (%1)!").arg(Name)).ascii() << std::endl;
//delete CollectToolInfoProcess;
collectRunning=false;
success=false;
}
else
{
collectRunning=true;
while(CollectToolInfoProcess->isRunning() && collectRunning)
{
if (Name == "l2tpd" || Name == "pkcs11-tool" || Name == "cisco_cert_mgr" || Name == "vpnclient")
{
usleep(500);
CollectToolInfoProcess->kill();
}
}
//KMessageBox::information(0,TQString("Name: "+Name+", Path: "+PathToExec+", Version: "+Version),"aaa");
// disconnect( CollectToolInfoProcess, TQT_SIGNAL( readyReadStdout() ), this, TQT_SLOT( readStdOutCollectToolInfo() ) );
// disconnect( CollectToolInfoProcess, TQT_SIGNAL( readyReadStderr() ), this, TQT_SLOT( readStdErrCollectToolInfo() ) );
// delete CollectToolInfoProcess;
success=true;
}
}
disconnect( CollectToolInfoProcess, TQT_SIGNAL( readyReadStdout() ), this, TQT_SLOT( readStdOutCollectToolInfo() ) );
disconnect( CollectToolInfoProcess, TQT_SIGNAL( readyReadStderr() ), this, TQT_SLOT( readStdErrCollectToolInfo() ) );
delete CollectToolInfoProcess;
CollectToolInfoProcess=0L;
//std::cout << "Name: " << Name << ", Path: " << PathToExec << ", Version: " << Version << std::endl;
if (Name=="openvpn")
getOpenvpnCapabilities();
}
else
{
// if (GlobalConfig->KvpncDebugLevel > 2)
// std::cout << TQString(i18n("%1 not found.").arg(Name)).ascii() << std::endl;
}
return success;
}
void ToolInfo::getOpenvpnCapabilities()
{
if (Name=="openvpn" && !PathToExec.isEmpty())
{
CollectOpenvpnCapabilitiesProcess = new TQProcess(this);
CollectOpenvpnCapabilitiesProcess->clearArguments();
connect( CollectOpenvpnCapabilitiesProcess, TQT_SIGNAL( readyReadStdout() ), this, TQT_SLOT( readStdOutCollectOpenvpnCapabilies() ) );
connect( CollectOpenvpnCapabilitiesProcess, TQT_SIGNAL( readyReadStderr() ), this, TQT_SLOT( readStdErrCollectOpenvpnCapabilies() ) );
connect( CollectOpenvpnCapabilitiesProcess, TQT_SIGNAL( processExited () ), this, TQT_SLOT(processFinished() ) );
//FIXME how it could be better?
CollectOpenvpnCapabilitiesProcess->addArgument(PathToExec);
if (Name == "vpnc")
CollectOpenvpnCapabilitiesProcess->addArgument("--help");
collectOpenvpnCapabilitiesRunning=false;
if ( !PathToExec.isEmpty() && !CollectOpenvpnCapabilitiesProcess->start(env) )
{
std::cerr << i18n("Unable to start collectToolInfo process (%1)!").arg(Name).ascii() << std::endl;
//delete CollectToolInfoProcess;
collectOpenvpnCapabilitiesRunning=false;
}
else
{
collectOpenvpnCapabilitiesRunning=true;
while(CollectOpenvpnCapabilitiesProcess->isRunning() && collectOpenvpnCapabilitiesRunning)
{
// wait...
}
//KMessageBox::information(0,TQString("Name: "+Name+", Path: "+PathToExec+", Version: "+Version),"aaa");
// disconnect( CollectOpenvpnCapabilitiesProcess, TQT_SIGNAL( readyReadStdout() ), this, TQT_SLOT( readStdOutCollectOpenvpnCapabilies() ) );
// disconnect( CollectOpenvpnCapabilitiesProcess, TQT_SIGNAL( readyReadStderr() ), this, TQT_SLOT( readStdErrCollectOpenvpnCapabilies() ) );
// delete CollectOpenvpnCapabilitiesProcess;
}
disconnect( CollectOpenvpnCapabilitiesProcess, TQT_SIGNAL( readyReadStdout() ), this, TQT_SLOT( readStdOutCollectOpenvpnCapabilies() ) );
disconnect( CollectOpenvpnCapabilitiesProcess, TQT_SIGNAL( readyReadStderr() ), this, TQT_SLOT( readStdErrCollectOpenvpnCapabilies() ) );
//std::cout << "Name: " << Name << ", Path: " << PathToExec << ", Version: " << Version << std::endl;
}
}
void ToolInfo::addSearchPath(const TQString& path )
{
// std::cout << "Path added: " << path << std::endl;
if (!path.isEmpty())
SearchPathList.insert(SearchPathList.end(), TQString(path));
else
return;
}
void ToolInfo::removeSearchPath(const TQString& path )
{
// std::cout << "Path removed: " << path << std::endl;
if (!path.isEmpty())
SearchPathList.remove(TQString(path));
else
return;
}
/* == slots == */
/**
*
*/
void ToolInfo::readStdOutCollectToolInfo ()
{
while (CollectToolInfoProcess->canReadLineStdout())
{
TQString msg = TQString( CollectToolInfoProcess->readLineStdout() );
// TQString msg = TQString( CollectToolInfoProcess->readStdout() );
// std::cout << "Checking for: " << Name.ascii() << std::endl;
// std::cout << "stdout collectToolInfo: " << msg.ascii() <<std::endl;
//FIXME how it could be better?
if (Name == "vpnc")
{
if ( msg.find( "version", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo: " << msg.ascii() << std::endl;
// std::cout << "stdout collectToolInfo: 2,2 " << msg.simplifyWhiteSpace().section(' ',2,2).ascii() << std::endl;
Version = msg.simplifyWhiteSpace().section(' ',2,2);
}
if ( msg.find( "Built without openssl (certificate) support.", 0, FALSE ) > -1 )
{
// Capabilities+=i18n("no openssl support")+";";
}
else if ( msg.find( "Built with openssl (certificate) support.", 0, FALSE ) > -1 )
{
Capabilities=i18n("openssl (certificate) support")+";";
}
}
else if (Name == "vpnclient" || Name =="cisco_cert_mgr")
{
if ( msg.find( "Cisco Systems VPN Client", 0, FALSE ) > -1 )
Version = msg.section(' ',5,6); // "Cisco Systems VPN Client Version 4.8.00 (0490)"
}
else if (Name == "ipsec")
{
if ( msg.find( "wan", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo: " << msg << std::endl;
// if ( msg.find( "openswan", 0, FALSE ) > -1 )
// Version = msg.section(' ',2,2);
// else
Version = msg.section(' ',1,2); // "Openswan Ux.x.x/kx.x.x"
if (msg.section(' ',1,2).contains('/'))
Version = msg.section(' ',1,2).section('/',0,0); // "Openswan Ux.x.x"
else
Version = msg.section(' ',1,2);
}
}
else if (Name == "racoon" || Name == "racoonctl")
{
// we need to do some stupid hack...
// /usr/sbin/racoon -> /usr/sbin/setkey
CollectToolInfoProcess->addArgument(TQString(PathToExec.left(PathToExec.length()-6)+"setkey"));
if ( msg.find( "ipsec-tools", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',3,3);
}
}
else if (Name == "setkey")
{
if ( msg.find( "ipsec-tools", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',3,3);
}
}
else if (Name == "openvpn")
{
if ( msg.find( "built", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',1,1);
}
}
else if (Name == "openssl")
{
if ( msg.find( "OpenSSL", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',1,1);
}
}
else if (Name == "pppd")
{
if ( msg.find( "version", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',2,2);
}
}
else if (Name == "iptables")
{
if ( msg.find( "iptables", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',1,1);
}
}
else if (Name == "ping")
{
if ( msg.find( "ping", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',2,2);
}
}
else if (Name == "ip")
{
if ( msg.find( "ip", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',2,2);
}
}
else if (Name == "kill")
{
if ( msg.find( "kill", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',3,3).section(')',0,0);
}
}
else if (Name == "pkcs11-tool")
{
if ( msg.find( "version", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',2,2);
}
else if ( msg.find( "Error: can't open /var/run/openct/status", 0, FALSE ) > -1 )
{
std::cerr << "stdout collectToolInfo (pkcs11): " << msg.ascii() << std::endl;
CollectToolInfoProcess->kill();
}
}
else if (Name == "xl2tpd")
{
if ( msg.find( "version:", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',3,3).stripWhiteSpace();
}
}
else if (Name == "openl2tpd")
{
if ( msg.find( "OpenL2TP V", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',1,1).remove(',').remove('V');
std::cerr << "stdout collectToolInfo (openl2tpd): " << msg.ascii() << std::endl;
CollectToolInfoProcess->kill();
}
}
else if (Name == "vtund")
{
if ( msg.find( "VTun ver", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',2,3).stripWhiteSpace();
}
}
else if (Name == "tail")
{
if ( msg.find( "tail ", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',3,3).stripWhiteSpace();
}
}
else if (Name == "ksshaskpass")
{
if ( msg.find( "Ksshaskpass:", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',1,1).stripWhiteSpace();
}
}
else if (Name == "gnome-ssh-askpass")
{
// if ( msg.find( "askpass", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo: " << msg << std::endl;
// Version = msg.section(' ',3,3).stripWhiteSpace();
Version=i18n("unknown");
}
}
else if (Name == "netstat")
{
if ( msg.find( "netstat ", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',1,1).stripWhiteSpace();
}
}
else
{
// KMessageBox::information(0,TQString("Name: "+Name+", Path: "+PathToExec+", Version: "+Version+", err: "+msg),"aaa");
}
}
collectRunning=false;
}
void ToolInfo::readStdErrCollectToolInfo()
{
while (CollectToolInfoProcess->canReadLineStderr())
{
TQString msg = TQString( CollectToolInfoProcess->readLineStderr() );
// if (GlobalConfig->KvpncDebugLevel > 2)
// {
// std::cout << "Checking for: " << Name.ascii() << std::endl;
// std::cout << "stderr collectToolInfo: " << msg.ascii() <<std::endl;
// }
if (Name == "pppd")
{
if ( msg.find( "version", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',2,2);
}
}
else if (Name == "killall")
{
if ( msg.find( "killall", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',2,2);
}
}
else if (Name == "ifconfig")
{
//KMessageBox::information(0,TQString("Name: "+Name+", Path: "+PathToExec+", Version: "+Version),"aaa");
if ( msg.find( "ifconfig", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',1,1);
}
}
else if (Name == "route")
{
if ( msg.find( "route", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',1,1);
}
}
else if (Name == "pptp")
{
if ( msg.find( "pptp version", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo: " << msg.ascii() << std::endl;
Version = msg.section(' ',2,2).section(')',0,0);
}
}
else if (Name == "l2tpd")
{
if ( msg.find( "l2tpd", 0, FALSE ) > -1 )
{
//std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',2,2).section(')',0,0);
}
}
else if (Name == "pkcs11-tool")
{
if ( msg.find( "version", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo (pkcs11): " << msg.ascii() << std::endl;
Version = msg.section(' ',2,2);
}
else if ( msg.find( "Error: can't open /var/run/openct/status", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo (pkcs11): " << msg.ascii() << std::endl;
CollectToolInfoProcess->kill();
}
}
else if (Name == "ssh")
{
if ( msg.find( "OpenSSH", 0, FALSE ) > -1 )
{
// std::cout << "stdout collectToolInfo: " << msg << std::endl;
Version = msg.section(' ',0,0).section('_',1,1).stripWhiteSpace();
}
}
else
{
// KMessageBox::information(0,TQString("Name: "+Name+", Path: "+PathToExec+", Version: "+Version+", err: "+msg),"aaa");
}
}
}
void ToolInfo::readStdOutCollectOpenvpnCapabilies()
{
while (CollectOpenvpnCapabilitiesProcess->canReadLineStdout())
{
TQString msg = TQString( CollectOpenvpnCapabilitiesProcess->readLineStdout() );
// TQString msg = TQString( CollectOpenvpnCapabilitiesProcess->readStdout() );
// std::cout << "stdout collectOpenvpnCapabilities: " << msg.ascii() <<std::endl;
if ( msg.find( "PKCS#11 Options:", 0, FALSE ) > -1 )
Capabilities+=i18n("pkcs11 support")+";";
}
collectOpenvpnCapabilitiesRunning=false;
}
void ToolInfo::readStdErrCollectOpenvpnCapabilies()
{
while (CollectOpenvpnCapabilitiesProcess->canReadLineStderr())
{
TQString msg = TQString( CollectOpenvpnCapabilitiesProcess->readLineStderr() );
// std::cout << "stderr collectOpenvpnCapabilities: " << msg.ascii() <<std::endl;
}
}
void ToolInfo::processFinished()
{
collectRunning=false;
collectOpenvpnCapabilitiesRunning=false;
}
#include "toolinfo.moc"