From 68a5bc7ef8b2212fe5cbc1aa4f4125549632a057 Mon Sep 17 00:00:00 2001 From: Vadim Kurland Date: Thu, 3 Mar 2011 14:05:28 -0800 Subject: [PATCH] see #2163 pages that set up snmp crawler and crawler background process with progress log now work. Using QThread to run background process. --- src/libgui/QThreadLogger.cpp | 80 ++++++++ src/libgui/QThreadLogger.h | 53 ++++++ src/libgui/libgui.pro | 10 +- .../ND_DiscoveryParametersPage.cpp | 40 ++++ .../ND_DiscoveryParametersPage.h | 1 + .../ND_ProgressPage.cpp | 178 +++++++++++++++++- .../ND_ProgressPage.h | 15 +- .../ND_SNMPParametersPage.cpp | 38 ++++ .../ND_SNMPParametersPage.h | 1 + .../ND_SetupPage.cpp | 27 +++ .../snmpNetworkDiscoveryWizard/ND_SetupPage.h | 1 + .../SNMPCrawlerThread.cpp | 91 +++++++++ .../SNMPCrawlerThread.h | 57 ++++++ .../nd_discoveryparameterspage_q.ui | 8 +- .../nd_progresspage_q.ui | 59 ++++-- .../nd_snmpparameterspage_q.ui | 99 +--------- 16 files changed, 635 insertions(+), 123 deletions(-) create mode 100644 src/libgui/QThreadLogger.cpp create mode 100644 src/libgui/QThreadLogger.h create mode 100644 src/libgui/snmpNetworkDiscoveryWizard/SNMPCrawlerThread.cpp create mode 100644 src/libgui/snmpNetworkDiscoveryWizard/SNMPCrawlerThread.h diff --git a/src/libgui/QThreadLogger.cpp b/src/libgui/QThreadLogger.cpp new file mode 100644 index 000000000..0f8cbea07 --- /dev/null +++ b/src/libgui/QThreadLogger.cpp @@ -0,0 +1,80 @@ +/* + + Firewall Builder + + Copyright (C) 2011 NetCitadel, LLC + + Author: Vadim Kurland vadim@fwbuilder.org + + This program is free software which we release under the GNU General Public + License. You may redistribute and/or modify this program under the terms + of that 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. + + To get a copy of the GNU General Public License, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +#include "QThreadLogger.h" + +#include + +#include +#include + +using namespace std; +using namespace libfwbuilder; + + +QThreadLogger::QThreadLogger() : Logger() {} + +Logger& QThreadLogger::operator<< (char c) +{ + emit lineReady(QString(c)); + return *this; +} + +Logger& QThreadLogger::operator<< (char *str) +{ + emit lineReady(QString(str)); + return *this; +} + +Logger& QThreadLogger::operator<< (const char *str) +{ + emit lineReady(QString(str)); + return *this; +} + +Logger& QThreadLogger::operator<< (const std::string &str) +{ + emit lineReady(QString(str.c_str())); + return *this; +} + +Logger& QThreadLogger::operator<< (int i ) +{ + QString s; s.setNum(i); + emit lineReady(s); + return *this; +} + +Logger& QThreadLogger::operator<< (long l ) +{ + QString s; s.setNum(l); + emit lineReady(s); + return *this; +} + +Logger& QThreadLogger::operator<< (std::ostringstream &sstr) +{ + emit lineReady(QString(sstr.str().c_str())); + return *this; +} + diff --git a/src/libgui/QThreadLogger.h b/src/libgui/QThreadLogger.h new file mode 100644 index 000000000..9f8fe7208 --- /dev/null +++ b/src/libgui/QThreadLogger.h @@ -0,0 +1,53 @@ +/* + + Firewall Builder + + Copyright (C) 2011 NetCitadel, LLC + + Author: Vadim Kurland vadim@fwbuilder.org + + This program is free software which we release under the GNU General Public + License. You may redistribute and/or modify this program under the terms + of that 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. + + To get a copy of the GNU General Public License, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +#ifndef _QTHREAD_LOGGER_H_ +#define _QTHREAD_LOGGER_H_ + +#include "fwbuilder/Logger.h" + +#include + + +class QThreadLogger : public QObject, public libfwbuilder::Logger +{ + Q_OBJECT; + +public: + + QThreadLogger(); + + virtual Logger& operator<< (char c) ; + virtual Logger& operator<< (char *str) ; + virtual Logger& operator<< (const char *str) ; + virtual Logger& operator<< (const std::string &str) ; + virtual Logger& operator<< (int i ) ; + virtual Logger& operator<< (long l ) ; + virtual Logger& operator<< (std::ostringstream &sstr); + +signals: + void lineReady(const QString &txt); +}; + + +#endif diff --git a/src/libgui/libgui.pro b/src/libgui/libgui.pro index 6bbdaa32a..1292a5ecc 100644 --- a/src/libgui/libgui.pro +++ b/src/libgui/libgui.pro @@ -196,6 +196,7 @@ HEADERS += ../../config.h \ networkZoneManager.h \ \ ObjectDescriptor.h \ + QThreadLogger.h \ \ importAddressListWizard/ChooseObjectsPage.h \ importAddressListWizard/CreateObjectsPage.h \ @@ -213,8 +214,8 @@ HEADERS += ../../config.h \ snmpNetworkDiscoveryWizard/ND_SelectLibraryPage.h \ snmpNetworkDiscoveryWizard/ND_SetupPage.h \ snmpNetworkDiscoveryWizard/ND_SNMPParametersPage.h \ - snmpNetworkDiscoveryWizard/SNMPNetworkDiscoveryWizard.h - + snmpNetworkDiscoveryWizard/SNMPNetworkDiscoveryWizard.h \ + snmpNetworkDiscoveryWizard/SNMPCrawlerThread.h SOURCES += ProjectPanel.cpp \ @@ -406,6 +407,7 @@ SOURCES += ProjectPanel.cpp \ networkZoneManager.cpp \ \ ObjectDescriptor.cpp \ + QThreadLogger.cpp \ \ importAddressListWizard/ChooseObjectsPage.cpp \ importAddressListWizard/CreateObjectsPage.cpp \ @@ -423,7 +425,9 @@ SOURCES += ProjectPanel.cpp \ snmpNetworkDiscoveryWizard/ND_SelectLibraryPage.cpp \ snmpNetworkDiscoveryWizard/ND_SetupPage.cpp \ snmpNetworkDiscoveryWizard/ND_SNMPParametersPage.cpp \ - snmpNetworkDiscoveryWizard/SNMPNetworkDiscoveryWizard.cpp + snmpNetworkDiscoveryWizard/SNMPNetworkDiscoveryWizard.cpp \ + snmpNetworkDiscoveryWizard/SNMPCrawlerThread.cpp + FORMS = FWBMainWindow_q.ui \ compileroutputpanel_q.ui \ diff --git a/src/libgui/snmpNetworkDiscoveryWizard/ND_DiscoveryParametersPage.cpp b/src/libgui/snmpNetworkDiscoveryWizard/ND_DiscoveryParametersPage.cpp index 327030cd9..a99cae8b6 100644 --- a/src/libgui/snmpNetworkDiscoveryWizard/ND_DiscoveryParametersPage.cpp +++ b/src/libgui/snmpNetworkDiscoveryWizard/ND_DiscoveryParametersPage.cpp @@ -24,6 +24,7 @@ #include "global.h" #include "utils.h" #include "FWWindow.h" +#include "FWBSettings.h" #include "ND_DiscoveryParametersPage.h" @@ -34,11 +35,31 @@ using namespace std; //using namespace libfwbuilder; +#define DISCOVERY_DRUID_PREFIX "DiscoveryDruid/" +#define DISCOVERY_DRUID_SNMPRECURSIVE "SNMPRecursive" +#define DISCOVERY_DRUID_SNMPFOLLOWP2P "SNMPFollowP2P" +#define DISCOVERY_DRUID_SNMPINCLUDEUNNUMBERED "SnmpIncludeUnnumbered" +#define DISCOVERY_DRUID_SNMPDODNS "SNMPDoDNS" + ND_DiscoveryParametersPage::ND_DiscoveryParametersPage(QWidget *parent) : QWizardPage(parent) { m_dialog = new Ui::ND_DiscoveryParametersPage_q; m_dialog->setupUi(this); + m_dialog->snmpRecursive->setChecked(st->getBool( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPRECURSIVE)); + m_dialog->snmpFollowP2P->setChecked(st->getBool( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPFOLLOWP2P)); + m_dialog->snmpIncludeUnnumbered->setChecked(st->getBool( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPINCLUDEUNNUMBERED)); + m_dialog->snmpDoDNS->setChecked(st->getBool( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPDODNS)); + + registerField("snmpRecursive", m_dialog->snmpRecursive); + registerField("snmpFollowP2P", m_dialog->snmpFollowP2P); + registerField("snmpIncludeUnnumbered", m_dialog->snmpIncludeUnnumbered); + registerField("snmpDoDNS", m_dialog->snmpDoDNS); + } void ND_DiscoveryParametersPage::initializePage() @@ -47,3 +68,22 @@ void ND_DiscoveryParametersPage::initializePage() qDebug() << "ND_DiscoveryParametersPage::initializePage()"; } + +bool ND_DiscoveryParametersPage::validatePage() +{ + st->setBool( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPRECURSIVE, + m_dialog->snmpRecursive->isChecked()); + st->setBool( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPFOLLOWP2P, + m_dialog->snmpFollowP2P->isChecked()); + st->setBool( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPINCLUDEUNNUMBERED, + m_dialog->snmpIncludeUnnumbered->isChecked()); + st->setBool( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPDODNS, + m_dialog->snmpDoDNS->isChecked()); + + return true; +} + diff --git a/src/libgui/snmpNetworkDiscoveryWizard/ND_DiscoveryParametersPage.h b/src/libgui/snmpNetworkDiscoveryWizard/ND_DiscoveryParametersPage.h index 633403914..b90a28d5e 100644 --- a/src/libgui/snmpNetworkDiscoveryWizard/ND_DiscoveryParametersPage.h +++ b/src/libgui/snmpNetworkDiscoveryWizard/ND_DiscoveryParametersPage.h @@ -38,6 +38,7 @@ public: virtual ~ND_DiscoveryParametersPage() {} virtual void initializePage(); + virtual bool validatePage(); public slots: diff --git a/src/libgui/snmpNetworkDiscoveryWizard/ND_ProgressPage.cpp b/src/libgui/snmpNetworkDiscoveryWizard/ND_ProgressPage.cpp index 9b7e06afb..e914bf35c 100644 --- a/src/libgui/snmpNetworkDiscoveryWizard/ND_ProgressPage.cpp +++ b/src/libgui/snmpNetworkDiscoveryWizard/ND_ProgressPage.cpp @@ -24,14 +24,23 @@ #include "global.h" #include "utils.h" #include "FWWindow.h" +#include "utils.h" +#include "FWBSettings.h" #include "ND_ProgressPage.h" +#include "SNMPCrawlerThread.h" +#include "fwbuilder/snmp.h" + +#include +#include +#include +#include #include using namespace std; -//using namespace libfwbuilder; +using namespace libfwbuilder; ND_ProgressPage::ND_ProgressPage(QWidget *parent) : QWizardPage(parent) @@ -39,11 +48,174 @@ ND_ProgressPage::ND_ProgressPage(QWidget *parent) : QWizardPage(parent) m_dialog = new Ui::ND_ProgressPage_q; m_dialog->setupUi(this); + crawler = NULL; + + QTextCursor cursor(m_dialog->discoveryLog->textCursor()); + normal_format = cursor.charFormat(); + + error_format = normal_format; + error_format.setForeground(QBrush(Qt::red)); + error_format.setAnchorHref("http://somewhere.com"); + error_format.setAnchor(true); + // weight must be between 0 and 99. Qt 4.4.1 does not seem to mind if + // it is >99 (just caps it) but older versions assert + error_format.setProperty(QTextFormat::FontWeight, 99); + + warning_format = normal_format; + warning_format.setForeground(QBrush(Qt::blue)); + warning_format.setProperty(QTextFormat::FontWeight, 99); + warning_format.setAnchor(true); + warning_format.setAnchorHref("http://somewhere.com"); +} + +ND_ProgressPage::~ND_ProgressPage() +{ + if (crawler) + { + stop(); + crawler->wait(); + delete crawler; + } } void ND_ProgressPage::initializePage() { - if (fwbdebug) - qDebug() << "ND_ProgressPage::initializePage()"; + if (fwbdebug) qDebug() << "ND_ProgressPage::initializePage()"; + +#ifdef HAVE_LIBSNMP + QString seedHostName = field("seedHostName").toString(); + QString snmpInclAddr = field("snmpInAddr").toString(); + QString snmpInclMask = field("snmpInMask").toString(); + + bool snmpRecursive = field("snmpRecursive").toBool(); + bool snmpFollowP2P = field("snmpFollowP2P").toBool(); +// bool snmpIncludeUnnumbered = field("snmpIncludeUnnumbered").toBool(); + + QString snmpCommunity = field("snmpCommunity").toString(); + int snmpRetries = field("snmpRetries").toInt(); + int snmpTimeoutSec = field("snmpTimeout").toInt(); + + QString seedHostAddress = getAddrByName(seedHostName, AF_INET); + InetAddr seedHostInetAddr = InetAddr( seedHostAddress.toLatin1().constData() ); + + vector include_networks; + + bool limit_scan = false; + if ( ! snmpInclAddr.isEmpty() && ! snmpInclMask.isEmpty()) + { + try + { + InetAddrMask in( + InetAddr(snmpInclAddr.toStdString()), + InetAddr(snmpInclMask.toStdString()) + ); + include_networks.push_back(in); + limit_scan = true; + } + catch (const FWException &ex) + { + //TODO: do something usefull + } + } + + if (crawler != NULL) delete crawler; + + crawler = new SNMPCrawlerThread(this, + seedHostName, + snmpCommunity, + snmpRecursive, + snmpFollowP2P, + snmpRetries, + snmpTimeoutSec, + &include_networks); + crawler->start(); + +#endif } + +void ND_ProgressPage::cleanupPage() +{ + stop(); +} + +void ND_ProgressPage::stop() +{ + crawler->stop(); +} + + +void ND_ProgressPage::logLine(const QString &buf) +{ + if (buf.isEmpty()) return; + + foreach(QString line, buf.trimmed().split("\n")) + { + QTextCharFormat format = normal_format; + + if (line.contains("Parser error")) + format = error_format; + + if (line.contains("Parser warning")) + format = warning_format; + + if (line.contains("SNMP error, status 2 Timeout")) + format = warning_format; + + QString txt = line; + while (!txt.isEmpty() && (txt.endsWith("\n") || txt.endsWith("\r"))) + txt.chop(1); + + if (format == error_format || format == warning_format) + format.setAnchorHref(txt); + + QTextCursor cursor = m_dialog->discoveryLog->textCursor(); + cursor.insertBlock(); + cursor.insertText(txt, format); + } + + m_dialog->discoveryLog->ensureCursorVisible(); + +} + +void ND_ProgressPage::saveLog() +{ + QString dir; + dir = st->getWDir(); + if (dir.isEmpty()) dir = st->getOpenFileDir(); + if (dir.isEmpty()) dir = "~"; + + QString s = QFileDialog::getSaveFileName( + this, + "Choose a file", + dir, + "Text file (*.txt)"); + + if (!s.isEmpty()) + { + if (s.endsWith(".txt")) + { + s += ".txt"; + } + QFile f(s); + if (f.open(QIODevice::WriteOnly)) + { + if (fwbdebug) + { + qDebug("Saving crawler log to file: %d chars", + m_dialog->discoveryLog->toPlainText().length()); + qDebug("--------------------------------"); + } + QTextStream strm(&f); + QString txt = m_dialog->discoveryLog->toPlainText(); + strm << txt << endl; + if (fwbdebug) + { + qDebug("%s",txt.toAscii().constData()); + qDebug("--------------------------------"); + } + f.close(); + } + } +} + diff --git a/src/libgui/snmpNetworkDiscoveryWizard/ND_ProgressPage.h b/src/libgui/snmpNetworkDiscoveryWizard/ND_ProgressPage.h index 4beac26f1..233328e5d 100644 --- a/src/libgui/snmpNetworkDiscoveryWizard/ND_ProgressPage.h +++ b/src/libgui/snmpNetworkDiscoveryWizard/ND_ProgressPage.h @@ -26,21 +26,32 @@ #include "ui_nd_progresspage_q.h" +#include + +class SNMPCrawlerThread; + class ND_ProgressPage : public QWizardPage { Q_OBJECT; Ui::ND_ProgressPage_q *m_dialog; + QTextCharFormat normal_format; + QTextCharFormat error_format; + QTextCharFormat warning_format; + SNMPCrawlerThread *crawler; public: ND_ProgressPage(QWidget *parent); - virtual ~ND_ProgressPage() {} + virtual ~ND_ProgressPage(); virtual void initializePage(); + virtual void cleanupPage(); public slots: - + void stop(); + void saveLog(); + void logLine(const QString &line); }; diff --git a/src/libgui/snmpNetworkDiscoveryWizard/ND_SNMPParametersPage.cpp b/src/libgui/snmpNetworkDiscoveryWizard/ND_SNMPParametersPage.cpp index 236a2328b..f4eb413b3 100644 --- a/src/libgui/snmpNetworkDiscoveryWizard/ND_SNMPParametersPage.cpp +++ b/src/libgui/snmpNetworkDiscoveryWizard/ND_SNMPParametersPage.cpp @@ -24,6 +24,7 @@ #include "global.h" #include "utils.h" #include "FWWindow.h" +#include "FWBSettings.h" #include "ND_SNMPParametersPage.h" @@ -34,11 +35,32 @@ using namespace std; //using namespace libfwbuilder; +#define DISCOVERY_DRUID_PREFIX "DiscoveryDruid/" +#define DISCOVERY_DRUID_SNMPCOMMUNITY "SNMPCommunity" +#define DISCOVERY_DRUID_SNMPRETRIES "SNMPRetries" +#define DISCOVERY_DRUID_SNMPTIMEOUT "SNMPTimeout" + + ND_SNMPParametersPage::ND_SNMPParametersPage(QWidget *parent) : QWizardPage(parent) { m_dialog = new Ui::ND_SNMPParametersPage_q; m_dialog->setupUi(this); + QString s = st->getStr( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPCOMMUNITY); + m_dialog->snmpCommunity->setText((s.isEmpty())?"public":s); + + int i = st->getInt( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPRETRIES); + m_dialog->snmpRetries->setValue((i)?i:1); + + i = st->getInt( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPTIMEOUT); + m_dialog->snmpTimeout->setValue((i)?i:2); + + registerField("snmpCommunity", m_dialog->snmpCommunity); + registerField("snmpRetries", m_dialog->snmpRetries); + registerField("snmpTimeout", m_dialog->snmpTimeout); } void ND_SNMPParametersPage::initializePage() @@ -46,3 +68,19 @@ void ND_SNMPParametersPage::initializePage() if (fwbdebug) qDebug() << "ND_SNMPParametersPage::initializePage()"; } + +bool ND_SNMPParametersPage::validatePage() +{ + st->setStr( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPCOMMUNITY, + m_dialog->snmpCommunity->text()); + st->setInt( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPRETRIES, + m_dialog->snmpRetries->value()); + st->setInt( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPTIMEOUT, + m_dialog->snmpTimeout->value()); + + return true; +} + diff --git a/src/libgui/snmpNetworkDiscoveryWizard/ND_SNMPParametersPage.h b/src/libgui/snmpNetworkDiscoveryWizard/ND_SNMPParametersPage.h index 715cf88b5..c71a97f27 100644 --- a/src/libgui/snmpNetworkDiscoveryWizard/ND_SNMPParametersPage.h +++ b/src/libgui/snmpNetworkDiscoveryWizard/ND_SNMPParametersPage.h @@ -38,6 +38,7 @@ public: virtual ~ND_SNMPParametersPage() {} virtual void initializePage(); + virtual bool validatePage(); public slots: diff --git a/src/libgui/snmpNetworkDiscoveryWizard/ND_SetupPage.cpp b/src/libgui/snmpNetworkDiscoveryWizard/ND_SetupPage.cpp index 405a8d7fe..db95c3b65 100644 --- a/src/libgui/snmpNetworkDiscoveryWizard/ND_SetupPage.cpp +++ b/src/libgui/snmpNetworkDiscoveryWizard/ND_SetupPage.cpp @@ -24,6 +24,7 @@ #include "global.h" #include "utils.h" #include "FWWindow.h" +#include "FWBSettings.h" #include "ND_SetupPage.h" @@ -36,6 +37,10 @@ using namespace std; using namespace libfwbuilder; +#define DISCOVERY_DRUID_PREFIX "DiscoveryDruid/" +#define DISCOVERY_DRUID_SEEDHOST "SeedHost" +#define DISCOVERY_DRUID_SNMPINADDR "SNMPInAddr" +#define DISCOVERY_DRUID_SNMPINMASK "SNMPInMask" ND_SetupPage::ND_SetupPage(QWidget *parent) : QWizardPage(parent) { @@ -49,6 +54,13 @@ ND_SetupPage::ND_SetupPage(QWidget *parent) : QWizardPage(parent) seedHostOK = false; limitScanConfigurationOK = true; + m_dialog->seedHostName->setText(st->getStr( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SEEDHOST)); + m_dialog->snmpInAddr->setText(st->getStr( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPINADDR)); + m_dialog->snmpInMask->setText(st->getStr( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPINMASK)); + registerField("seedHostName*", m_dialog->seedHostName); registerField("snmpInAddr", m_dialog->snmpInAddr); registerField("snmpInMask", m_dialog->snmpInMask); @@ -62,6 +74,21 @@ void ND_SetupPage::initializePage() qDebug() << "ND_SetupPage::initializePage()"; } +bool ND_SetupPage::validatePage() +{ + st->setStr( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SEEDHOST, + m_dialog->seedHostName->text()); + st->setStr( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPINADDR, + m_dialog->snmpInAddr->text()); + st->setStr( + QString(DISCOVERY_DRUID_PREFIX) + DISCOVERY_DRUID_SNMPINMASK, + m_dialog->snmpInMask->text()); + + return true; +} + bool ND_SetupPage::isComplete() const { return seedHostOK && limitScanConfigurationOK; diff --git a/src/libgui/snmpNetworkDiscoveryWizard/ND_SetupPage.h b/src/libgui/snmpNetworkDiscoveryWizard/ND_SetupPage.h index c898246c7..3b50249cf 100644 --- a/src/libgui/snmpNetworkDiscoveryWizard/ND_SetupPage.h +++ b/src/libgui/snmpNetworkDiscoveryWizard/ND_SetupPage.h @@ -52,6 +52,7 @@ public: virtual ~ND_SetupPage(); virtual void initializePage(); + virtual bool validatePage(); virtual bool isComplete() const; public slots: diff --git a/src/libgui/snmpNetworkDiscoveryWizard/SNMPCrawlerThread.cpp b/src/libgui/snmpNetworkDiscoveryWizard/SNMPCrawlerThread.cpp new file mode 100644 index 000000000..cfad313d7 --- /dev/null +++ b/src/libgui/snmpNetworkDiscoveryWizard/SNMPCrawlerThread.cpp @@ -0,0 +1,91 @@ +/* + + Firewall Builder + + Copyright (C) 2011 NetCitadel, LLC + + Author: Vadim Kurland vadim@fwbuilder.org + + This program is free software which we release under the GNU General Public + License. You may redistribute and/or modify this program under the terms + of that 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. + + To get a copy of the GNU General Public License, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +#include "SNMPCrawlerThread.h" + +#include "utils.h" +#include "QThreadLogger.h" + +#include +#include + + +using namespace std; +using namespace libfwbuilder; + + +SNMPCrawlerThread::SNMPCrawlerThread(QWidget *ui, + const QString &seedHostName, + const QString &community, + bool recursive, + bool followP2P, + int snmpRetries, + int snmpTimeout, + const std::vector *include_net) +{ + this->ui = ui; + + stop_flag = new SyncFlag(); + + QString seedHostAddress = getAddrByName(seedHostName, AF_INET); + InetAddr seedHostInetAddr = InetAddr( seedHostAddress.toLatin1().constData()); + + q = new SNMPCrawler(); + q->init(seedHostInetAddr, + community.toLatin1().constData(), + recursive, + false, + followP2P, + 0, + snmpRetries, + 1000000L * snmpTimeout, + 0, + 0, + (include_net->size() > 0) ? include_net : NULL); + +} + +SNMPCrawlerThread::~SNMPCrawlerThread() +{ + delete q; + delete stop_flag; +} + +void SNMPCrawlerThread::run() +{ + QThreadLogger *logger = new QThreadLogger(); + connect(logger, SIGNAL(lineReady(QString)), + this->ui, SLOT(logLine(QString)), + Qt::QueuedConnection); + q->run_impl(logger, stop_flag); + + *logger << string("\n"); + *logger << string("Network crawler stopped"); +} + +void SNMPCrawlerThread::stop() +{ + stop_flag->set(true); +} + + diff --git a/src/libgui/snmpNetworkDiscoveryWizard/SNMPCrawlerThread.h b/src/libgui/snmpNetworkDiscoveryWizard/SNMPCrawlerThread.h new file mode 100644 index 000000000..f30548192 --- /dev/null +++ b/src/libgui/snmpNetworkDiscoveryWizard/SNMPCrawlerThread.h @@ -0,0 +1,57 @@ +/* + + Firewall Builder + + Copyright (C) 2011 NetCitadel, LLC + + Author: Vadim Kurland vadim@fwbuilder.org + + This program is free software which we release under the GNU General Public + License. You may redistribute and/or modify this program under the terms + of that 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. + + To get a copy of the GNU General Public License, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +#ifndef _SNMPCRAWLERTHREAD_H_ +#define _SNMPCRAWLERTHREAD_H_ + +#include "fwbuilder/snmp.h" +#include "fwbuilder/InetAddrMask.h" +#include "fwbuilder/ThreadTools.h" + +#include +#include + + +class SNMPCrawlerThread : public QThread +{ + libfwbuilder::SNMPCrawler *q; + libfwbuilder::SyncFlag *stop_flag; + + QWidget *ui; + +public: + SNMPCrawlerThread(QWidget *ui, + const QString &seedHost, + const QString &community, + bool recursive, + bool followP2P, + int snmpRetries, + int snmpTimeout, + const std::vector *include); + virtual ~SNMPCrawlerThread(); + void run(); + void stop(); +}; + + +#endif diff --git a/src/libgui/snmpNetworkDiscoveryWizard/nd_discoveryparameterspage_q.ui b/src/libgui/snmpNetworkDiscoveryWizard/nd_discoveryparameterspage_q.ui index 5bd8c0fd4..117786929 100644 --- a/src/libgui/snmpNetworkDiscoveryWizard/nd_discoveryparameterspage_q.ui +++ b/src/libgui/snmpNetworkDiscoveryWizard/nd_discoveryparameterspage_q.ui @@ -28,7 +28,7 @@ - + Run network scan recursively @@ -61,7 +61,7 @@ - + Follow point-to-point links @@ -94,7 +94,7 @@ - + Include interfaces with no ip addresses @@ -127,7 +127,7 @@ - + Run reverse name lookup DNS queries to determine host names diff --git a/src/libgui/snmpNetworkDiscoveryWizard/nd_progresspage_q.ui b/src/libgui/snmpNetworkDiscoveryWizard/nd_progresspage_q.ui index afb7c67e8..d3c562019 100644 --- a/src/libgui/snmpNetworkDiscoveryWizard/nd_progresspage_q.ui +++ b/src/libgui/snmpNetworkDiscoveryWizard/nd_progresspage_q.ui @@ -24,7 +24,7 @@ 0 - + 16 @@ -48,32 +48,22 @@ - - - 6 - + - - - Qt::Horizontal - - - - Stop - + Save scan log to file - + Qt::Horizontal @@ -102,7 +92,7 @@ 0 - + true @@ -114,5 +104,42 @@ - + + + discoveryStopButton + clicked() + ND_ProgressPage_q + stop() + + + 57 + 73 + + + 304 + 268 + + + + + logSaveButton + clicked() + ND_ProgressPage_q + saveLog() + + + 170 + 73 + + + 304 + 268 + + + + + + stop() + saveLog() + diff --git a/src/libgui/snmpNetworkDiscoveryWizard/nd_snmpparameterspage_q.ui b/src/libgui/snmpNetworkDiscoveryWizard/nd_snmpparameterspage_q.ui index e4faf34c0..69fdab451 100644 --- a/src/libgui/snmpNetworkDiscoveryWizard/nd_snmpparameterspage_q.ui +++ b/src/libgui/snmpNetworkDiscoveryWizard/nd_snmpparameterspage_q.ui @@ -67,7 +67,7 @@ - + 1 @@ -77,7 +77,7 @@ - + 1 @@ -87,7 +87,7 @@ - + public @@ -145,97 +145,6 @@ - - - DNS parameters: - - - - 6 - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 300 - 20 - - - - - - - - number of retries: - - - false - - - - - - - timeout (sec) : - - - false - - - - - - - Number of threads: - - - false - - - - - - - 1 - - - 1 - - - - - - - 1 - - - 10000 - - - 2 - - - - - - - 1 - - - 5 - - - - - - - @@ -245,7 +154,7 @@ - + Qt::Vertical