7
7
m_scanMode(NMap::ScanModePingScan)
9
m_process = new QProcess(this);
10
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
11
env.insert("NMAPDIR", "./share/nmap/");
12
m_process->setProcessEnvironment(env);
13
connect(m_process, SIGNAL(finished(int)), this, SLOT(scanFinished(int)));
11
void Host::setState(const QString &state)
13
if (m_state != state) {
19
void Host::setReason(const QString &reason)
21
if (m_reason != reason) {
27
void Host::setName(const QString &name)
16
35
NMap::ScanMode Host::scanMode() const
48
NMap::ScanOptions Host::scanOptions() const
53
void Host::setScanOptions(NMap::ScanOptions scanOptions)
55
if (m_scanOptions != scanOptions) {
56
m_scanOptions = scanOptions;
57
emit scanOptionsChanged();
29
61
void Host::addPort(Port *port)
63
port->setParent(this);
31
64
m_openPorts.append(port);
32
65
emit openPortCountChanged();
68
QList<Port *> Host::ports()
73
void Host::setPorts(const QList<Port *> ports)
75
qDebug() << "setting new ports. old:" << m_openPorts.count() << "new" << ports.count();
76
foreach (Port *port, ports) {
77
qDebug() << "have new port" << port;
78
Port* existingPort = findPort(port->number());
80
existingPort->setState(port->state());
81
existingPort->setReason(port->reason());
82
if (port->serviceDetectionDone()) {
83
existingPort->setFingerprint(port->fingerprint());
84
existingPort->setProduct(port->product());
85
existingPort->setVersion(port->version());
86
existingPort->setServiceDetectionDone(port->serviceDetectionDone());
90
port->setParent(this);
91
m_openPorts.append(port);
92
emit openPortCountChanged();
35
97
Port *Host::port(int index) const
37
99
return m_openPorts.at(index);
42
QHostInfo::lookupHost(m_address, this, SLOT(lookupDone(const QHostInfo &)));
45
bool Host::busy() const
47
return m_process->state() == QProcess::Running || m_process->state() == QProcess::Starting;
50
void Host::performFullScan()
53
args << "-R" << "-oX" << "-" << "-A" << "-p1-65535" << m_address;
55
m_process->start("nmap", args);
59
void Host::lookupDone(const QHostInfo &hostInfo)
61
qDebug() << "lookup done" << m_address << m_name << hostInfo.hostName();
64
void Host::scanFinished(int exitCode)
66
QByteArray data = m_process->readAllStandardOutput();
67
qDebug() << "have data" << data;
69
QXmlStreamReader reader(data);
72
while (!reader.atEnd() && !reader.hasError()) {
73
QXmlStreamReader::TokenType token = reader.readNext();
74
if (token == QXmlStreamReader::StartElement && reader.name() == "finished") {
75
// m_error = reader.attributes().value("errormsg").toString();
79
// emit errorChanged();
84
Port *currentPort = 0;
85
while (!reader.atEnd() && !reader.hasError()) {
86
QXmlStreamReader::TokenType token = reader.readNext();
87
if(token == QXmlStreamReader::StartDocument) {
90
if(token == QXmlStreamReader::StartElement) {
91
qDebug() << "opening tag:" << reader.name();
92
if (reader.name() == "hostname") {
93
setName(reader.attributes().value("name").toString());
96
if (reader.name() == "port") {
97
int number = reader.attributes().value("portid").toInt();
98
currentPort = findPort(number);
100
currentPort = new Port(this);
101
currentPort->setNumber(number);
104
if (reader.name() == "state" && currentPort) {
105
currentPort->setState(reader.attributes().value("state").toString());
106
currentPort->setReason(reader.attributes().value("reason").toString());
108
if (reader.name() == "service" && currentPort) {
109
currentPort->setService(reader.attributes().value("name").toString());
112
if (token == QXmlStreamReader::Characters) {
114
if (token == QXmlStreamReader::EndElement) {
115
if (reader.name() == "host") {
116
// m_hosts->insert(currentHost);
117
// currentHost->lookup();
120
if (reader.name() == "port") {
121
if (currentPort && !findPort(currentPort->number())) {
122
addPort(currentPort);
128
m_scanMode = NMap::ScanModeAll;
129
emit scanModeChanged();
133
102
Port *Host::findPort(int number) const
135
104
foreach (Port *port, m_openPorts) {