see #2163 passing data from the progress page to pages where user chooses networks and objects

This commit is contained in:
Vadim Kurland
2011-03-03 19:43:23 -08:00
parent 4b88c05cd6
commit c21214c6a2
6 changed files with 178 additions and 8 deletions
@@ -26,12 +26,13 @@
#include "FWWindow.h"
#include "ND_ChooseNetworksPage.h"
#include "ND_ProgressPage.h"
#include <QtDebug>
using namespace std;
//using namespace libfwbuilder;
using namespace libfwbuilder;
ND_ChooseNetworksPage::ND_ChooseNetworksPage(QWidget *parent) : QWizardPage(parent)
@@ -48,6 +49,16 @@ void ND_ChooseNetworksPage::initializePage()
if (fwbdebug)
qDebug() << "ND_ChooseNetworksPage::initializePage()";
ND_ProgressPage *progress_page = NULL;
foreach(int page_id, wizard()->pageIds())
{
progress_page = dynamic_cast<ND_ProgressPage*>(wizard()->page(page_id));
if (progress_page != NULL) break;
}
assert(progress_page != NULL);
m_dialog->objectSelector->init(progress_page->getNetworks());
/*
list<ObjectDescriptor> objects;
@@ -26,12 +26,15 @@
#include "FWWindow.h"
#include "ND_ChooseObjectsPage.h"
#include "ND_ProgressPage.h"
#include <QtDebug>
#include <map>
using namespace std;
//using namespace libfwbuilder;
using namespace libfwbuilder;
ND_ChooseObjectsPage::ND_ChooseObjectsPage(QWidget *parent) : QWizardPage(parent)
@@ -48,6 +51,16 @@ void ND_ChooseObjectsPage::initializePage()
if (fwbdebug)
qDebug() << "ND_ChooseObjectsPage::initializePage()";
ND_ProgressPage *progress_page = NULL;
foreach(int page_id, wizard()->pageIds())
{
progress_page = dynamic_cast<ND_ProgressPage*>(wizard()->page(page_id));
if (progress_page != NULL) break;
}
assert(progress_page != NULL);
m_dialog->objectSelector->init(progress_page->getObjects());
/*
list<ObjectDescriptor> objects;
@@ -31,6 +31,10 @@
#include "SNMPCrawlerThread.h"
#include "fwbuilder/snmp.h"
#include "fwbuilder/NetworkIPv6.h"
#include "fwbuilder/Network.h"
#include "fwbuilder/IPv4.h"
#include "fwbuilder/IPv6.h"
#include <QFileDialog>
#include <QFile>
@@ -42,7 +46,7 @@
using namespace std;
using namespace libfwbuilder;
bool fwbdebug_nd = fwbdebug;
bool fwbdebug_nd = true;
ND_ProgressPage::ND_ProgressPage(QWidget *parent) : QWizardPage(parent)
@@ -75,6 +79,7 @@ ND_ProgressPage::~ND_ProgressPage()
if (fwbdebug_nd) qDebug() << "ND_ProgressPage::~ND_ProgressPage()";
disconnect(this, SLOT(logLine(QString)));
disconnect(this, SLOT(crawlerFinished()));
if (crawler != NULL && crawler->isRunning())
{
@@ -90,10 +95,21 @@ ND_ProgressPage::~ND_ProgressPage()
}
}
void ND_ProgressPage::crawlerDestroyed(QObject *obj)
bool ND_ProgressPage::validatePage()
{
if (fwbdebug_nd)
qDebug() << "ND_ProgressPage::crawlerDestroyed() obj=" << obj;
qDebug() << "ND_ProgressPage::validatePage()"
<< "crawler=" << crawler
<< "isRunning=" << ((crawler) ? crawler->isRunning() : 0)
<< "objects.size()=" << objects.size();
if (crawler != NULL && crawler->isRunning()) return false;
return (objects.size() > 0);
}
void ND_ProgressPage::crawlerDestroyed(QObject *obj)
{
if (fwbdebug_nd) qDebug() << "ND_ProgressPage::crawlerDestroyed() obj=" << obj;
if (obj == crawler) crawler = NULL;
}
@@ -147,6 +163,11 @@ void ND_ProgressPage::initializePage()
delete crawler;
}
objects.clear();
networks.clear();
emit completeChanged();
// note that crawler deletes itself using call to deleteLater() after
// underlying SNMPCrawler finishes its work.
crawler = new SNMPCrawlerThread(this,
@@ -157,8 +178,12 @@ void ND_ProgressPage::initializePage()
snmpRetries,
snmpTimeoutSec,
&include_networks);
connect(crawler, SIGNAL(destroyed(QObject*)),
this, SLOT(crawlerDestroyed(QObject*)));
connect(crawler, SIGNAL(finished()),
this, SLOT(crawlerFinished()));
crawler->start();
#endif
@@ -169,6 +194,7 @@ void ND_ProgressPage::cleanupPage()
{
if (fwbdebug_nd) qDebug() << "ND_ProgressPage::cleanupPage()";
disconnect(this, SLOT(logLine(QString)));
disconnect(this, SLOT(crawlerFinished()));
if (crawler != NULL && crawler->isRunning()) crawler->stop();
}
@@ -181,6 +207,96 @@ void ND_ProgressPage::stop()
}
}
/*
* SNMPCrawlerThread emits signal finished() that should be connected
* to this slot. We collect all the data here.
*/
void ND_ProgressPage::crawlerFinished()
{
if (fwbdebug_nd) qDebug() << "ND_ProgressPage::crawlerFinished()";
logLine("\n");
logLine(tr("Network crawler stopped"));
bool snmpDoDNS = field("snmpDoDNS").toBool();
if (crawler==NULL) return;
set<InetAddrMask*>::iterator m;
set<InetAddrMask*> discovered_networks = crawler->getNetworks();
map<InetAddr, CrawlerFind> discovered_addresses = crawler->getAllIPs();
logLine(tr("Discovered %1 networks").arg(discovered_networks.size()));
for (m=discovered_networks.begin(); m!=discovered_networks.end(); ++m)
{
ObjectDescriptor od;
InetAddrMask *net = *m;
logLine(QString("network %1").arg(net->toString().c_str()));
// if address in *m is ipv6, recreate it as Inet6AddrMask and
// use type NetworkIPv6
if (net->getAddressPtr()->isV6())
{
Inet6AddrMask in6am(*(net->getAddressPtr()),
*(net->getNetmaskPtr()));
od.sysname = in6am.toString(); // different from ipv6
od.type = NetworkIPv6::TYPENAME;
} else
{
od.sysname = net->toString();
od.type = Network::TYPENAME;
}
od.addr = *(net->getAddressPtr());
od.netmask = *(net->getNetmaskPtr());
od.isSelected = false;
networks.push_back(od);
}
logLine(tr("Discovered %1 addresses").arg(discovered_addresses.size()));
int cntr = 0;
map<InetAddr, CrawlerFind>::iterator j;
for(j = discovered_addresses.begin(); j!=discovered_addresses.end(); ++j,++cntr)
{
ObjectDescriptor od( (*j).second );
od.addr = (*j).first;
od.type = (od.interfaces.size()>1) ? (Host::TYPENAME) : (IPv4::TYPENAME);
od.isSelected = false;
if (od.sysname.empty())
{
od.sysname = string("h-") + od.addr.toString();
if (snmpDoDNS)
{
QString hostName = getNameByAddr( od.addr.toString().c_str() );
if (!hostName.isEmpty())
od.sysname = hostName.toUtf8().constData();
}
logLine(
QString(od.addr.toString().c_str()) + " : " + od.sysname.c_str());
}
if (snmpDoDNS && od.dns_info.aliases.size() > 0)
{
set<string>::iterator si;
for(si=od.dns_info.aliases.begin(); si!=od.dns_info.aliases.end(); ++si)
{
od.sysname = (*si);
objects.push_back(od);;
}
} else
objects.push_back(od);
}
emit completeChanged();
}
void ND_ProgressPage::logLine(const QString &buf)
{
@@ -25,12 +25,15 @@
#define __ND_PROGRESSPAGE_H_
#include "ui_nd_progresspage_q.h"
#include "ObjectDescriptor.h"
#include <QTextCharFormat>
class SNMPCrawlerThread;
typedef std::list<ObjectDescriptor> ObjectDescriptorMap;
class ND_ProgressPage : public QWizardPage
{
Q_OBJECT;
@@ -40,6 +43,8 @@ class ND_ProgressPage : public QWizardPage
QTextCharFormat error_format;
QTextCharFormat warning_format;
SNMPCrawlerThread *crawler;
ObjectDescriptorMap networks;
ObjectDescriptorMap objects;
public:
ND_ProgressPage(QWidget *parent);
@@ -47,12 +52,17 @@ public:
virtual void initializePage();
virtual void cleanupPage();
virtual bool validatePage();
ObjectDescriptorMap getNetworks() { return networks; }
ObjectDescriptorMap getObjects() { return objects; }
public slots:
void stop();
void saveLog();
void logLine(const QString &line);
void crawlerDestroyed(QObject*);
void crawlerFinished();
};
@@ -81,9 +81,8 @@ void SNMPCrawlerThread::run()
Qt::QueuedConnection);
q->run_impl(logger, stop_flag);
*logger << string("\n");
*logger << string("Network crawler stopped");
emit finished();
deleteLater(); // mark this object for destruction on the next run of event loop
}
@@ -92,3 +91,13 @@ void SNMPCrawlerThread::stop()
stop_flag->set(true);
}
map<InetAddr, CrawlerFind> SNMPCrawlerThread::getAllIPs()
{
return q->getAllIPs();
}
set<InetAddrMask*> SNMPCrawlerThread::getNetworks()
{
return q->getNetworks();
}
@@ -31,9 +31,14 @@
#include <QWidget>
#include <QThread>
#include <map>
#include <set>
class SNMPCrawlerThread : public QThread
{
Q_OBJECT;
libfwbuilder::SNMPCrawler *q;
libfwbuilder::SyncFlag *stop_flag;
@@ -52,6 +57,12 @@ public:
void run();
void stop();
std::map<libfwbuilder::InetAddr, libfwbuilder::CrawlerFind> getAllIPs();
std::set<libfwbuilder::InetAddrMask*> getNetworks();
signals:
void finished();
};