Lines 1-4
Link Here
|
1 |
#!/usr/bin/env python |
1 |
#!/usr/bin/env python3 |
2 |
|
2 |
|
3 |
# Ndiff |
3 |
# Ndiff |
4 |
# |
4 |
# |
Lines 26-36
xml.__path__ = [x for x in xml.__path__ if "_xmlplus" not in x]
Link Here
|
26 |
import xml.sax |
26 |
import xml.sax |
27 |
import xml.sax.saxutils |
27 |
import xml.sax.saxutils |
28 |
import xml.dom.minidom |
28 |
import xml.dom.minidom |
29 |
from StringIO import StringIO |
29 |
from io import StringIO |
30 |
|
30 |
|
31 |
verbose = False |
31 |
verbose = False |
32 |
|
32 |
|
33 |
NDIFF_XML_VERSION = u"1" |
33 |
NDIFF_XML_VERSION = "1" |
34 |
|
34 |
|
35 |
|
35 |
|
36 |
class OverrideEntityResolver(xml.sax.handler.EntityResolver): |
36 |
class OverrideEntityResolver(xml.sax.handler.EntityResolver): |
Lines 78-112
class Scan(object):
Link Here
|
78 |
def write_nmaprun_open(self, writer): |
78 |
def write_nmaprun_open(self, writer): |
79 |
attrs = {} |
79 |
attrs = {} |
80 |
if self.scanner is not None: |
80 |
if self.scanner is not None: |
81 |
attrs[u"scanner"] = self.scanner |
81 |
attrs["scanner"] = self.scanner |
82 |
if self.args is not None: |
82 |
if self.args is not None: |
83 |
attrs[u"args"] = self.args |
83 |
attrs["args"] = self.args |
84 |
if self.start_date is not None: |
84 |
if self.start_date is not None: |
85 |
attrs[u"start"] = "%d" % time.mktime(self.start_date.timetuple()) |
85 |
attrs["start"] = "%d" % time.mktime(self.start_date.timetuple()) |
86 |
attrs[u"startstr"] = self.start_date.strftime( |
86 |
attrs["startstr"] = self.start_date.strftime( |
87 |
"%a %b %d %H:%M:%S %Y") |
87 |
"%a %b %d %H:%M:%S %Y") |
88 |
if self.version is not None: |
88 |
if self.version is not None: |
89 |
attrs[u"version"] = self.version |
89 |
attrs["version"] = self.version |
90 |
writer.startElement(u"nmaprun", attrs) |
90 |
writer.startElement("nmaprun", attrs) |
91 |
|
91 |
|
92 |
def write_nmaprun_close(self, writer): |
92 |
def write_nmaprun_close(self, writer): |
93 |
writer.endElement(u"nmaprun") |
93 |
writer.endElement("nmaprun") |
94 |
|
94 |
|
95 |
def nmaprun_to_dom_fragment(self, document): |
95 |
def nmaprun_to_dom_fragment(self, document): |
96 |
frag = document.createDocumentFragment() |
96 |
frag = document.createDocumentFragment() |
97 |
elem = document.createElement(u"nmaprun") |
97 |
elem = document.createElement("nmaprun") |
98 |
if self.scanner is not None: |
98 |
if self.scanner is not None: |
99 |
elem.setAttribute(u"scanner", self.scanner) |
99 |
elem.setAttribute("scanner", self.scanner) |
100 |
if self.args is not None: |
100 |
if self.args is not None: |
101 |
elem.setAttribute(u"args", self.args) |
101 |
elem.setAttribute("args", self.args) |
102 |
if self.start_date is not None: |
102 |
if self.start_date is not None: |
103 |
elem.setAttribute( |
103 |
elem.setAttribute( |
104 |
u"start", "%d" % time.mktime(self.start_date.timetuple())) |
104 |
"start", "%d" % time.mktime(self.start_date.timetuple())) |
105 |
elem.setAttribute( |
105 |
elem.setAttribute( |
106 |
u"startstr", |
106 |
"startstr", |
107 |
self.start_date.strftime("%a %b %d %H:%M:%S %Y")) |
107 |
self.start_date.strftime("%a %b %d %H:%M:%S %Y")) |
108 |
if self.version is not None: |
108 |
if self.version is not None: |
109 |
elem.setAttribute(u"version", self.version) |
109 |
elem.setAttribute("version", self.version) |
110 |
frag.appendChild(elem) |
110 |
frag.appendChild(elem) |
111 |
return frag |
111 |
return frag |
112 |
|
112 |
|
Lines 136-152
class Host(object):
Link Here
|
136 |
|
136 |
|
137 |
def format_name(self): |
137 |
def format_name(self): |
138 |
"""Return a human-readable identifier for this host.""" |
138 |
"""Return a human-readable identifier for this host.""" |
139 |
address_s = u", ".join(a.s for a in sorted(self.addresses)) |
139 |
address_s = ", ".join(a.s for a in sorted(self.addresses)) |
140 |
hostname_s = u", ".join(sorted(self.hostnames)) |
140 |
hostname_s = ", ".join(sorted(self.hostnames)) |
141 |
if len(hostname_s) > 0: |
141 |
if len(hostname_s) > 0: |
142 |
if len(address_s) > 0: |
142 |
if len(address_s) > 0: |
143 |
return u"%s (%s)" % (hostname_s, address_s) |
143 |
return "%s (%s)" % (hostname_s, address_s) |
144 |
else: |
144 |
else: |
145 |
return hostname_s |
145 |
return hostname_s |
146 |
elif len(address_s) > 0: |
146 |
elif len(address_s) > 0: |
147 |
return address_s |
147 |
return address_s |
148 |
else: |
148 |
else: |
149 |
return u"<no name>" |
149 |
return "<no name>" |
150 |
|
150 |
|
151 |
def add_port(self, port): |
151 |
def add_port(self, port): |
152 |
self.ports[port.spec] = port |
152 |
self.ports[port.spec] = port |
Lines 163-208
class Host(object):
Link Here
|
163 |
return state is None or state in self.extraports |
163 |
return state is None or state in self.extraports |
164 |
|
164 |
|
165 |
def extraports_string(self): |
165 |
def extraports_string(self): |
166 |
list = [(count, state) for (state, count) in self.extraports.items()] |
166 |
locallist = [(count, state) for (state, count) in list(self.extraports.items())] |
167 |
# Reverse-sort by count. |
167 |
# Reverse-sort by count. |
168 |
list.sort(reverse=True) |
168 |
locallist.sort(reverse=True) |
169 |
return u", ".join( |
169 |
return ", ".join( |
170 |
[u"%d %s ports" % (count, state) for (count, state) in list]) |
170 |
["%d %s ports" % (count, state) for (count, state) in locallist]) |
171 |
|
171 |
|
172 |
def state_to_dom_fragment(self, document): |
172 |
def state_to_dom_fragment(self, document): |
173 |
frag = document.createDocumentFragment() |
173 |
frag = document.createDocumentFragment() |
174 |
if self.state is not None: |
174 |
if self.state is not None: |
175 |
elem = document.createElement(u"status") |
175 |
elem = document.createElement("status") |
176 |
elem.setAttribute(u"state", self.state) |
176 |
elem.setAttribute("state", self.state) |
177 |
frag.appendChild(elem) |
177 |
frag.appendChild(elem) |
178 |
return frag |
178 |
return frag |
179 |
|
179 |
|
180 |
def hostname_to_dom_fragment(self, document, hostname): |
180 |
def hostname_to_dom_fragment(self, document, hostname): |
181 |
frag = document.createDocumentFragment() |
181 |
frag = document.createDocumentFragment() |
182 |
elem = document.createElement(u"hostname") |
182 |
elem = document.createElement("hostname") |
183 |
elem.setAttribute(u"name", hostname) |
183 |
elem.setAttribute("name", hostname) |
184 |
frag.appendChild(elem) |
184 |
frag.appendChild(elem) |
185 |
return frag |
185 |
return frag |
186 |
|
186 |
|
187 |
def extraports_to_dom_fragment(self, document): |
187 |
def extraports_to_dom_fragment(self, document): |
188 |
frag = document.createDocumentFragment() |
188 |
frag = document.createDocumentFragment() |
189 |
for state, count in self.extraports.items(): |
189 |
for state, count in list(self.extraports.items()): |
190 |
elem = document.createElement(u"extraports") |
190 |
elem = document.createElement("extraports") |
191 |
elem.setAttribute(u"state", state) |
191 |
elem.setAttribute("state", state) |
192 |
elem.setAttribute(u"count", unicode(count)) |
192 |
elem.setAttribute("count", str(count)) |
193 |
frag.appendChild(elem) |
193 |
frag.appendChild(elem) |
194 |
return frag |
194 |
return frag |
195 |
|
195 |
|
196 |
def os_to_dom_fragment(self, document, os): |
196 |
def os_to_dom_fragment(self, document, os): |
197 |
frag = document.createDocumentFragment() |
197 |
frag = document.createDocumentFragment() |
198 |
elem = document.createElement(u"osmatch") |
198 |
elem = document.createElement("osmatch") |
199 |
elem.setAttribute(u"name", os) |
199 |
elem.setAttribute("name", os) |
200 |
frag.appendChild(elem) |
200 |
frag.appendChild(elem) |
201 |
return frag |
201 |
return frag |
202 |
|
202 |
|
203 |
def to_dom_fragment(self, document): |
203 |
def to_dom_fragment(self, document): |
204 |
frag = document.createDocumentFragment() |
204 |
frag = document.createDocumentFragment() |
205 |
elem = document.createElement(u"host") |
205 |
elem = document.createElement("host") |
206 |
|
206 |
|
207 |
if self.state is not None: |
207 |
if self.state is not None: |
208 |
elem.appendChild(self.state_to_dom_fragment(document)) |
208 |
elem.appendChild(self.state_to_dom_fragment(document)) |
Lines 211-223
class Host(object):
Link Here
|
211 |
elem.appendChild(addr.to_dom_fragment(document)) |
211 |
elem.appendChild(addr.to_dom_fragment(document)) |
212 |
|
212 |
|
213 |
if len(self.hostnames) > 0: |
213 |
if len(self.hostnames) > 0: |
214 |
hostnames_elem = document.createElement(u"hostnames") |
214 |
hostnames_elem = document.createElement("hostnames") |
215 |
for hostname in self.hostnames: |
215 |
for hostname in self.hostnames: |
216 |
hostnames_elem.appendChild( |
216 |
hostnames_elem.appendChild( |
217 |
self.hostname_to_dom_fragment(document, hostname)) |
217 |
self.hostname_to_dom_fragment(document, hostname)) |
218 |
elem.appendChild(hostnames_elem) |
218 |
elem.appendChild(hostnames_elem) |
219 |
|
219 |
|
220 |
ports_elem = document.createElement(u"ports") |
220 |
ports_elem = document.createElement("ports") |
221 |
ports_elem.appendChild(self.extraports_to_dom_fragment(document)) |
221 |
ports_elem.appendChild(self.extraports_to_dom_fragment(document)) |
222 |
for port in sorted(self.ports.values()): |
222 |
for port in sorted(self.ports.values()): |
223 |
if not self.is_extraports(port.state): |
223 |
if not self.is_extraports(port.state): |
Lines 226-238
class Host(object):
Link Here
|
226 |
elem.appendChild(ports_elem) |
226 |
elem.appendChild(ports_elem) |
227 |
|
227 |
|
228 |
if len(self.os) > 0: |
228 |
if len(self.os) > 0: |
229 |
os_elem = document.createElement(u"os") |
229 |
os_elem = document.createElement("os") |
230 |
for os in self.os: |
230 |
for os in self.os: |
231 |
os_elem.appendChild(self.os_to_dom_fragment(document, os)) |
231 |
os_elem.appendChild(self.os_to_dom_fragment(document, os)) |
232 |
elem.appendChild(os_elem) |
232 |
elem.appendChild(os_elem) |
233 |
|
233 |
|
234 |
if len(self.script_results) > 0: |
234 |
if len(self.script_results) > 0: |
235 |
hostscript_elem = document.createElement(u"hostscript") |
235 |
hostscript_elem = document.createElement("hostscript") |
236 |
for sr in self.script_results: |
236 |
for sr in self.script_results: |
237 |
hostscript_elem.appendChild(sr.to_dom_fragment(document)) |
237 |
hostscript_elem.appendChild(sr.to_dom_fragment(document)) |
238 |
elem.appendChild(hostscript_elem) |
238 |
elem.appendChild(hostscript_elem) |
Lines 246-252
class Address(object):
Link Here
|
246 |
self.s = s |
246 |
self.s = s |
247 |
|
247 |
|
248 |
def __eq__(self, other): |
248 |
def __eq__(self, other): |
249 |
return self.__cmp__(other) == 0 |
249 |
return self.sort_key() == other.sort_key() |
250 |
|
250 |
|
251 |
def __ne__(self, other): |
251 |
def __ne__(self, other): |
252 |
return not self.__eq__(other) |
252 |
return not self.__eq__(other) |
Lines 254-261
class Address(object):
Link Here
|
254 |
def __hash__(self): |
254 |
def __hash__(self): |
255 |
return hash(self.sort_key()) |
255 |
return hash(self.sort_key()) |
256 |
|
256 |
|
257 |
def __cmp__(self, other): |
257 |
def __lt__(self, other): |
258 |
return cmp(self.sort_key(), other.sort_key()) |
258 |
return self.sort_key() < other.sort_key() |
259 |
|
259 |
|
260 |
def __str__(self): |
260 |
def __str__(self): |
261 |
return str(self.s) |
261 |
return str(self.s) |
Lines 264-284
class Address(object):
Link Here
|
264 |
return self.s |
264 |
return self.s |
265 |
|
265 |
|
266 |
def new(type, s): |
266 |
def new(type, s): |
267 |
if type == u"ipv4": |
267 |
if type == "ipv4": |
268 |
return IPv4Address(s) |
268 |
return IPv4Address(s) |
269 |
elif type == u"ipv6": |
269 |
elif type == "ipv6": |
270 |
return IPv6Address(s) |
270 |
return IPv6Address(s) |
271 |
elif type == u"mac": |
271 |
elif type == "mac": |
272 |
return MACAddress(s) |
272 |
return MACAddress(s) |
273 |
else: |
273 |
else: |
274 |
raise ValueError(u"Unknown address type %s." % type) |
274 |
raise ValueError("Unknown address type %s." % type) |
275 |
new = staticmethod(new) |
275 |
new = staticmethod(new) |
276 |
|
276 |
|
277 |
def to_dom_fragment(self, document): |
277 |
def to_dom_fragment(self, document): |
278 |
frag = document.createDocumentFragment() |
278 |
frag = document.createDocumentFragment() |
279 |
elem = document.createElement(u"address") |
279 |
elem = document.createElement("address") |
280 |
elem.setAttribute(u"addr", self.s) |
280 |
elem.setAttribute("addr", self.s) |
281 |
elem.setAttribute(u"addrtype", self.type) |
281 |
elem.setAttribute("addrtype", self.type) |
282 |
frag.appendChild(elem) |
282 |
frag.appendChild(elem) |
283 |
return frag |
283 |
return frag |
284 |
|
284 |
|
Lines 287-307
class Address(object):
Link Here
|
287 |
|
287 |
|
288 |
|
288 |
|
289 |
class IPv4Address(Address): |
289 |
class IPv4Address(Address): |
290 |
type = property(lambda self: u"ipv4") |
290 |
type = property(lambda self: "ipv4") |
291 |
|
291 |
|
292 |
def sort_key(self): |
292 |
def sort_key(self): |
293 |
return (0, self.s) |
293 |
return (0, self.s) |
294 |
|
294 |
|
295 |
|
295 |
|
296 |
class IPv6Address(Address): |
296 |
class IPv6Address(Address): |
297 |
type = property(lambda self: u"ipv6") |
297 |
type = property(lambda self: "ipv6") |
298 |
|
298 |
|
299 |
def sort_key(self): |
299 |
def sort_key(self): |
300 |
return (1, self.s) |
300 |
return (1, self.s) |
301 |
|
301 |
|
302 |
|
302 |
|
303 |
class MACAddress(Address): |
303 |
class MACAddress(Address): |
304 |
type = property(lambda self: u"mac") |
304 |
type = property(lambda self: "mac") |
305 |
|
305 |
|
306 |
def sort_key(self): |
306 |
def sort_key(self): |
307 |
return (2, self.s) |
307 |
return (2, self.s) |
Lines 320-347
class Port(object):
Link Here
|
320 |
|
320 |
|
321 |
def state_string(self): |
321 |
def state_string(self): |
322 |
if self.state is None: |
322 |
if self.state is None: |
323 |
return u"unknown" |
323 |
return "unknown" |
324 |
else: |
324 |
else: |
325 |
return unicode(self.state) |
325 |
return str(self.state) |
326 |
|
326 |
|
327 |
def spec_string(self): |
327 |
def spec_string(self): |
328 |
return u"%d/%s" % self.spec |
328 |
return "%d/%s" % self.spec |
329 |
|
329 |
|
330 |
def __cmp__(self, other): |
330 |
def __lt__(self, other): |
331 |
d = cmp(self.spec, other.spec) |
331 |
return (self.spec, self.service, self.script_results) < ( |
332 |
if d != 0: |
332 |
other.spec, other.service, other.script_results) |
333 |
return d |
|
|
334 |
return cmp((self.spec, self.service, self.script_results), |
335 |
(other.spec, other.service, other.script_results)) |
336 |
|
333 |
|
337 |
def to_dom_fragment(self, document): |
334 |
def to_dom_fragment(self, document): |
338 |
frag = document.createDocumentFragment() |
335 |
frag = document.createDocumentFragment() |
339 |
elem = document.createElement(u"port") |
336 |
elem = document.createElement("port") |
340 |
elem.setAttribute(u"portid", unicode(self.spec[0])) |
337 |
elem.setAttribute("portid", str(self.spec[0])) |
341 |
elem.setAttribute(u"protocol", self.spec[1]) |
338 |
elem.setAttribute("protocol", self.spec[1]) |
342 |
if self.state is not None: |
339 |
if self.state is not None: |
343 |
state_elem = document.createElement(u"state") |
340 |
state_elem = document.createElement("state") |
344 |
state_elem.setAttribute(u"state", self.state) |
341 |
state_elem.setAttribute("state", self.state) |
345 |
elem.appendChild(state_elem) |
342 |
elem.appendChild(state_elem) |
346 |
elem.appendChild(self.service.to_dom_fragment(document)) |
343 |
elem.appendChild(self.service.to_dom_fragment(document)) |
347 |
for sr in self.script_results: |
344 |
for sr in self.script_results: |
Lines 385-391
class Service(object):
Link Here
|
385 |
if len(parts) == 0: |
382 |
if len(parts) == 0: |
386 |
return None |
383 |
return None |
387 |
else: |
384 |
else: |
388 |
return u"/".join(parts) |
385 |
return "/".join(parts) |
389 |
|
386 |
|
390 |
def version_string(self): |
387 |
def version_string(self): |
391 |
"""Get a string like in the VERSION column of Nmap output.""" |
388 |
"""Get a string like in the VERSION column of Nmap output.""" |
Lines 395-411
class Service(object):
Link Here
|
395 |
if self.version is not None: |
392 |
if self.version is not None: |
396 |
parts.append(self.version) |
393 |
parts.append(self.version) |
397 |
if self.extrainfo is not None: |
394 |
if self.extrainfo is not None: |
398 |
parts.append(u"(%s)" % self.extrainfo) |
395 |
parts.append("(%s)" % self.extrainfo) |
399 |
|
396 |
|
400 |
if len(parts) == 0: |
397 |
if len(parts) == 0: |
401 |
return None |
398 |
return None |
402 |
else: |
399 |
else: |
403 |
return u" ".join(parts) |
400 |
return " ".join(parts) |
404 |
|
401 |
|
405 |
def to_dom_fragment(self, document): |
402 |
def to_dom_fragment(self, document): |
406 |
frag = document.createDocumentFragment() |
403 |
frag = document.createDocumentFragment() |
407 |
elem = document.createElement(u"service") |
404 |
elem = document.createElement("service") |
408 |
for attr in (u"name", u"product", u"version", u"extrainfo", u"tunnel"): |
405 |
for attr in ("name", "product", "version", "extrainfo", "tunnel"): |
409 |
v = getattr(self, attr) |
406 |
v = getattr(self, attr) |
410 |
if v is None: |
407 |
if v is None: |
411 |
continue |
408 |
continue |
Lines 435-487
class ScriptResult(object):
Link Here
|
435 |
result = [] |
432 |
result = [] |
436 |
lines = self.output.splitlines() |
433 |
lines = self.output.splitlines() |
437 |
if len(lines) > 0: |
434 |
if len(lines) > 0: |
438 |
lines[0] = self.id + u": " + lines[0] |
435 |
lines[0] = self.id + ": " + lines[0] |
439 |
for line in lines[:-1]: |
436 |
for line in lines[:-1]: |
440 |
result.append(u"| " + line) |
437 |
result.append("| " + line) |
441 |
if len(lines) > 0: |
438 |
if len(lines) > 0: |
442 |
result.append(u"|_ " + lines[-1]) |
439 |
result.append("|_ " + lines[-1]) |
443 |
return result |
440 |
return result |
444 |
|
441 |
|
445 |
def to_dom_fragment(self, document): |
442 |
def to_dom_fragment(self, document): |
446 |
frag = document.createDocumentFragment() |
443 |
frag = document.createDocumentFragment() |
447 |
elem = document.createElement(u"script") |
444 |
elem = document.createElement("script") |
448 |
elem.setAttribute(u"id", self.id) |
445 |
elem.setAttribute("id", self.id) |
449 |
elem.setAttribute(u"output", self.output) |
446 |
elem.setAttribute("output", self.output) |
450 |
frag.appendChild(elem) |
447 |
frag.appendChild(elem) |
451 |
return frag |
448 |
return frag |
452 |
|
449 |
|
453 |
|
450 |
|
454 |
def format_banner(scan): |
451 |
def format_banner(scan): |
455 |
"""Format a startup banner more or less like Nmap does.""" |
452 |
"""Format a startup banner more or less like Nmap does.""" |
456 |
scanner = u"Nmap" |
453 |
scanner = "Nmap" |
457 |
if scan.scanner is not None and scan.scanner != u"nmap": |
454 |
if scan.scanner is not None and scan.scanner != "nmap": |
458 |
scanner = scan.scanner |
455 |
scanner = scan.scanner |
459 |
parts = [scanner] |
456 |
parts = [scanner] |
460 |
if scan.version is not None: |
457 |
if scan.version is not None: |
461 |
parts.append(scan.version) |
458 |
parts.append(scan.version) |
462 |
parts.append(u"scan") |
459 |
parts.append("scan") |
463 |
if scan.start_date is not None: |
460 |
if scan.start_date is not None: |
464 |
parts.append(u"initiated %s" % scan.start_date.strftime( |
461 |
parts.append("initiated %s" % scan.start_date.strftime( |
465 |
"%a %b %d %H:%M:%S %Y")) |
462 |
"%a %b %d %H:%M:%S %Y")) |
466 |
if scan.args is not None: |
463 |
if scan.args is not None: |
467 |
parts.append(u"as: %s" % scan.args) |
464 |
parts.append("as: %s" % scan.args) |
468 |
return u" ".join(parts) |
465 |
return " ".join(parts) |
469 |
|
466 |
|
470 |
|
467 |
|
471 |
def print_script_result_diffs_text(title, script_results_a, script_results_b, |
468 |
def print_script_result_diffs_text(title, script_results_a, script_results_b, |
472 |
script_result_diffs, f=sys.stdout): |
469 |
script_result_diffs, f=sys.stdout): |
473 |
table = Table(u"*") |
470 |
table = Table("*") |
474 |
for sr_diff in script_result_diffs: |
471 |
for sr_diff in script_result_diffs: |
475 |
sr_diff.append_to_port_table(table) |
472 |
sr_diff.append_to_port_table(table) |
476 |
if len(table) > 0: |
473 |
if len(table) > 0: |
477 |
print >> f |
474 |
print(file=f) |
478 |
if len(script_results_b) == 0: |
475 |
if len(script_results_b) == 0: |
479 |
print >> f, u"-%s:" % title |
476 |
print("-%s:" % title, file=f) |
480 |
elif len(script_results_a) == 0: |
477 |
elif len(script_results_a) == 0: |
481 |
print >> f, u"+%s:" % title |
478 |
print("+%s:" % title, file=f) |
482 |
else: |
479 |
else: |
483 |
print >> f, u" %s:" % title |
480 |
print(" %s:" % title, file=f) |
484 |
print >> f, table |
481 |
print(table, file=f) |
485 |
|
482 |
|
486 |
|
483 |
|
487 |
def script_result_diffs_to_dom_fragment(elem, script_results_a, |
484 |
def script_result_diffs_to_dom_fragment(elem, script_results_a, |
Lines 489-501
def script_result_diffs_to_dom_fragment(elem, script_results_a,
Link Here
|
489 |
if len(script_results_a) == 0 and len(script_results_b) == 0: |
486 |
if len(script_results_a) == 0 and len(script_results_b) == 0: |
490 |
return document.createDocumentFragment() |
487 |
return document.createDocumentFragment() |
491 |
elif len(script_results_b) == 0: |
488 |
elif len(script_results_b) == 0: |
492 |
a_elem = document.createElement(u"a") |
489 |
a_elem = document.createElement("a") |
493 |
for sr in script_results_a: |
490 |
for sr in script_results_a: |
494 |
elem.appendChild(sr.to_dom_fragment(document)) |
491 |
elem.appendChild(sr.to_dom_fragment(document)) |
495 |
a_elem.appendChild(elem) |
492 |
a_elem.appendChild(elem) |
496 |
return a_elem |
493 |
return a_elem |
497 |
elif len(script_results_a) == 0: |
494 |
elif len(script_results_a) == 0: |
498 |
b_elem = document.createElement(u"b") |
495 |
b_elem = document.createElement("b") |
499 |
for sr in script_results_b: |
496 |
for sr in script_results_b: |
500 |
elem.appendChild(sr.to_dom_fragment(document)) |
497 |
elem.appendChild(sr.to_dom_fragment(document)) |
501 |
b_elem.appendChild(elem) |
498 |
b_elem.appendChild(elem) |
Lines 581-590
class ScanDiffText(ScanDiff):
Link Here
|
581 |
banner_a = format_banner(self.scan_a) |
578 |
banner_a = format_banner(self.scan_a) |
582 |
banner_b = format_banner(self.scan_b) |
579 |
banner_b = format_banner(self.scan_b) |
583 |
if banner_a != banner_b: |
580 |
if banner_a != banner_b: |
584 |
print >> self.f, u"-%s" % banner_a |
581 |
print("-%s" % banner_a, file=self.f) |
585 |
print >> self.f, u"+%s" % banner_b |
582 |
print("+%s" % banner_b, file=self.f) |
586 |
elif verbose: |
583 |
elif verbose: |
587 |
print >> self.f, u" %s" % banner_a |
584 |
print(" %s" % banner_a, file=self.f) |
588 |
|
585 |
|
589 |
def output_pre_scripts(self, pre_script_result_diffs): |
586 |
def output_pre_scripts(self, pre_script_result_diffs): |
590 |
print_script_result_diffs_text("Pre-scan script results", |
587 |
print_script_result_diffs_text("Pre-scan script results", |
Lines 597-603
class ScanDiffText(ScanDiff):
Link Here
|
597 |
post_script_result_diffs, self.f) |
594 |
post_script_result_diffs, self.f) |
598 |
|
595 |
|
599 |
def output_host_diff(self, h_diff): |
596 |
def output_host_diff(self, h_diff): |
600 |
print >> self.f |
597 |
print(file=self.f) |
601 |
h_diff.print_text(self.f) |
598 |
h_diff.print_text(self.f) |
602 |
|
599 |
|
603 |
def output_ending(self): |
600 |
def output_ending(self): |
Lines 622-629
class ScanDiffXML(ScanDiff):
Link Here
|
622 |
|
619 |
|
623 |
def output_beginning(self): |
620 |
def output_beginning(self): |
624 |
self.writer.startDocument() |
621 |
self.writer.startDocument() |
625 |
self.writer.startElement(u"nmapdiff", {u"version": NDIFF_XML_VERSION}) |
622 |
self.writer.startElement("nmapdiff", {"version": NDIFF_XML_VERSION}) |
626 |
self.writer.startElement(u"scandiff", {}) |
623 |
self.writer.startElement("scandiff", {}) |
627 |
|
624 |
|
628 |
if self.nmaprun_differs(): |
625 |
if self.nmaprun_differs(): |
629 |
self.writer.frag_a( |
626 |
self.writer.frag_a( |
Lines 636-642
class ScanDiffXML(ScanDiff):
Link Here
|
636 |
|
633 |
|
637 |
def output_pre_scripts(self, pre_script_result_diffs): |
634 |
def output_pre_scripts(self, pre_script_result_diffs): |
638 |
if len(pre_script_result_diffs) > 0 or verbose: |
635 |
if len(pre_script_result_diffs) > 0 or verbose: |
639 |
prescript_elem = self.document.createElement(u"prescript") |
636 |
prescript_elem = self.document.createElement("prescript") |
640 |
frag = script_result_diffs_to_dom_fragment( |
637 |
frag = script_result_diffs_to_dom_fragment( |
641 |
prescript_elem, self.scan_a.pre_script_results, |
638 |
prescript_elem, self.scan_a.pre_script_results, |
642 |
self.scan_b.pre_script_results, pre_script_result_diffs, |
639 |
self.scan_b.pre_script_results, pre_script_result_diffs, |
Lines 646-652
class ScanDiffXML(ScanDiff):
Link Here
|
646 |
|
643 |
|
647 |
def output_post_scripts(self, post_script_result_diffs): |
644 |
def output_post_scripts(self, post_script_result_diffs): |
648 |
if len(post_script_result_diffs) > 0 or verbose: |
645 |
if len(post_script_result_diffs) > 0 or verbose: |
649 |
postscript_elem = self.document.createElement(u"postscript") |
646 |
postscript_elem = self.document.createElement("postscript") |
650 |
frag = script_result_diffs_to_dom_fragment( |
647 |
frag = script_result_diffs_to_dom_fragment( |
651 |
postscript_elem, self.scan_a.post_script_results, |
648 |
postscript_elem, self.scan_a.post_script_results, |
652 |
self.scan_b.post_script_results, post_script_result_diffs, |
649 |
self.scan_b.post_script_results, post_script_result_diffs, |
Lines 660-667
class ScanDiffXML(ScanDiff):
Link Here
|
660 |
frag.unlink() |
657 |
frag.unlink() |
661 |
|
658 |
|
662 |
def output_ending(self): |
659 |
def output_ending(self): |
663 |
self.writer.endElement(u"scandiff") |
660 |
self.writer.endElement("scandiff") |
664 |
self.writer.endElement(u"nmapdiff") |
661 |
self.writer.endElement("nmapdiff") |
665 |
self.writer.endDocument() |
662 |
self.writer.endDocument() |
666 |
|
663 |
|
667 |
|
664 |
|
Lines 719-727
class HostDiff(object):
Link Here
|
719 |
self.cost += os_cost |
716 |
self.cost += os_cost |
720 |
|
717 |
|
721 |
extraports_a = tuple((count, state) |
718 |
extraports_a = tuple((count, state) |
722 |
for (state, count) in self.host_a.extraports.items()) |
719 |
for (state, count) in list(self.host_a.extraports.items())) |
723 |
extraports_b = tuple((count, state) |
720 |
extraports_b = tuple((count, state) |
724 |
for (state, count) in self.host_b.extraports.items()) |
721 |
for (state, count) in list(self.host_b.extraports.items())) |
725 |
if extraports_a != extraports_b: |
722 |
if extraports_a != extraports_b: |
726 |
self.extraports_changed = True |
723 |
self.extraports_changed = True |
727 |
self.cost += 1 |
724 |
self.cost += 1 |
Lines 747-815
class HostDiff(object):
Link Here
|
747 |
# Names and addresses. |
744 |
# Names and addresses. |
748 |
if self.id_changed: |
745 |
if self.id_changed: |
749 |
if host_a.state is not None: |
746 |
if host_a.state is not None: |
750 |
print >> f, u"-%s:" % host_a.format_name() |
747 |
print("-%s:" % host_a.format_name(), file=f) |
751 |
if self.host_b.state is not None: |
748 |
if self.host_b.state is not None: |
752 |
print >> f, u"+%s:" % host_b.format_name() |
749 |
print("+%s:" % host_b.format_name(), file=f) |
753 |
else: |
750 |
else: |
754 |
print >> f, u" %s:" % host_a.format_name() |
751 |
print(" %s:" % host_a.format_name(), file=f) |
755 |
|
752 |
|
756 |
# State. |
753 |
# State. |
757 |
if self.state_changed: |
754 |
if self.state_changed: |
758 |
if host_a.state is not None: |
755 |
if host_a.state is not None: |
759 |
print >> f, u"-Host is %s." % host_a.state |
756 |
print("-Host is %s." % host_a.state, file=f) |
760 |
if host_b.state is not None: |
757 |
if host_b.state is not None: |
761 |
print >> f, u"+Host is %s." % host_b.state |
758 |
print("+Host is %s." % host_b.state, file=f) |
762 |
elif verbose: |
759 |
elif verbose: |
763 |
print >> f, u" Host is %s." % host_b.state |
760 |
print(" Host is %s." % host_b.state, file=f) |
764 |
|
761 |
|
765 |
# Extraports. |
762 |
# Extraports. |
766 |
if self.extraports_changed: |
763 |
if self.extraports_changed: |
767 |
if len(host_a.extraports) > 0: |
764 |
if len(host_a.extraports) > 0: |
768 |
print >> f, u"-Not shown: %s" % host_a.extraports_string() |
765 |
print("-Not shown: %s" % host_a.extraports_string(), file=f) |
769 |
if len(host_b.extraports) > 0: |
766 |
if len(host_b.extraports) > 0: |
770 |
print >> f, u"+Not shown: %s" % host_b.extraports_string() |
767 |
print("+Not shown: %s" % host_b.extraports_string(), file=f) |
771 |
elif verbose: |
768 |
elif verbose: |
772 |
if len(host_a.extraports) > 0: |
769 |
if len(host_a.extraports) > 0: |
773 |
print >> f, u" Not shown: %s" % host_a.extraports_string() |
770 |
print(" Not shown: %s" % host_a.extraports_string(), file=f) |
774 |
|
771 |
|
775 |
# Port table. |
772 |
# Port table. |
776 |
port_table = Table(u"** * * *") |
773 |
port_table = Table("** * * *") |
777 |
if host_a.state is None: |
774 |
if host_a.state is None: |
778 |
mark = u"+" |
775 |
mark = "+" |
779 |
elif host_b.state is None: |
776 |
elif host_b.state is None: |
780 |
mark = u"-" |
777 |
mark = "-" |
781 |
else: |
778 |
else: |
782 |
mark = u" " |
779 |
mark = " " |
783 |
port_table.append((mark, u"PORT", u"STATE", u"SERVICE", u"VERSION")) |
780 |
port_table.append((mark, "PORT", "STATE", "SERVICE", "VERSION")) |
784 |
|
781 |
|
785 |
for port in self.ports: |
782 |
for port in self.ports: |
786 |
port_diff = self.port_diffs[port] |
783 |
port_diff = self.port_diffs[port] |
787 |
port_diff.append_to_port_table(port_table, host_a, host_b) |
784 |
port_diff.append_to_port_table(port_table, host_a, host_b) |
788 |
|
785 |
|
789 |
if len(port_table) > 1: |
786 |
if len(port_table) > 1: |
790 |
print >> f, port_table |
787 |
print(port_table, file=f) |
791 |
|
788 |
|
792 |
# OS changes. |
789 |
# OS changes. |
793 |
if self.os_changed or verbose: |
790 |
if self.os_changed or verbose: |
794 |
if len(host_a.os) > 0: |
791 |
if len(host_a.os) > 0: |
795 |
if len(host_b.os) > 0: |
792 |
if len(host_b.os) > 0: |
796 |
print >> f, u" OS details:" |
793 |
print(" OS details:", file=f) |
797 |
else: |
794 |
else: |
798 |
print >> f, u"-OS details:" |
795 |
print("-OS details:", file=f) |
799 |
elif len(host_b.os) > 0: |
796 |
elif len(host_b.os) > 0: |
800 |
print >> f, u"+OS details:" |
797 |
print("+OS details:", file=f) |
801 |
# os_diffs is a list of 5-tuples returned by |
798 |
# os_diffs is a list of 5-tuples returned by |
802 |
# difflib.SequenceMatcher. |
799 |
# difflib.SequenceMatcher. |
803 |
for op, i1, i2, j1, j2 in self.os_diffs: |
800 |
for op, i1, i2, j1, j2 in self.os_diffs: |
804 |
if op == "replace" or op == "delete": |
801 |
if op == "replace" or op == "delete": |
805 |
for i in range(i1, i2): |
802 |
for i in range(i1, i2): |
806 |
print >> f, "- %s" % host_a.os[i] |
803 |
print("- %s" % host_a.os[i], file=f) |
807 |
if op == "replace" or op == "insert": |
804 |
if op == "replace" or op == "insert": |
808 |
for i in range(j1, j2): |
805 |
for i in range(j1, j2): |
809 |
print >> f, "+ %s" % host_b.os[i] |
806 |
print("+ %s" % host_b.os[i], file=f) |
810 |
if op == "equal": |
807 |
if op == "equal": |
811 |
for i in range(i1, i2): |
808 |
for i in range(i1, i2): |
812 |
print >> f, " %s" % host_a.os[i] |
809 |
print(" %s" % host_a.os[i], file=f) |
813 |
|
810 |
|
814 |
print_script_result_diffs_text("Host script results", |
811 |
print_script_result_diffs_text("Host script results", |
815 |
host_a.script_results, host_b.script_results, |
812 |
host_a.script_results, host_b.script_results, |
Lines 820-851
class HostDiff(object):
Link Here
|
820 |
host_b = self.host_b |
817 |
host_b = self.host_b |
821 |
|
818 |
|
822 |
frag = document.createDocumentFragment() |
819 |
frag = document.createDocumentFragment() |
823 |
hostdiff_elem = document.createElement(u"hostdiff") |
820 |
hostdiff_elem = document.createElement("hostdiff") |
824 |
frag.appendChild(hostdiff_elem) |
821 |
frag.appendChild(hostdiff_elem) |
825 |
|
822 |
|
826 |
if host_a.state is None or host_b.state is None: |
823 |
if host_a.state is None or host_b.state is None: |
827 |
# The host is missing in one scan. Output the whole thing. |
824 |
# The host is missing in one scan. Output the whole thing. |
828 |
if host_a.state is not None: |
825 |
if host_a.state is not None: |
829 |
a_elem = document.createElement(u"a") |
826 |
a_elem = document.createElement("a") |
830 |
a_elem.appendChild(host_a.to_dom_fragment(document)) |
827 |
a_elem.appendChild(host_a.to_dom_fragment(document)) |
831 |
hostdiff_elem.appendChild(a_elem) |
828 |
hostdiff_elem.appendChild(a_elem) |
832 |
elif host_b.state is not None: |
829 |
elif host_b.state is not None: |
833 |
b_elem = document.createElement(u"b") |
830 |
b_elem = document.createElement("b") |
834 |
b_elem.appendChild(host_b.to_dom_fragment(document)) |
831 |
b_elem.appendChild(host_b.to_dom_fragment(document)) |
835 |
hostdiff_elem.appendChild(b_elem) |
832 |
hostdiff_elem.appendChild(b_elem) |
836 |
return frag |
833 |
return frag |
837 |
|
834 |
|
838 |
host_elem = document.createElement(u"host") |
835 |
host_elem = document.createElement("host") |
839 |
|
836 |
|
840 |
# State. |
837 |
# State. |
841 |
if host_a.state == host_b.state: |
838 |
if host_a.state == host_b.state: |
842 |
if verbose: |
839 |
if verbose: |
843 |
host_elem.appendChild(host_a.state_to_dom_fragment(document)) |
840 |
host_elem.appendChild(host_a.state_to_dom_fragment(document)) |
844 |
else: |
841 |
else: |
845 |
a_elem = document.createElement(u"a") |
842 |
a_elem = document.createElement("a") |
846 |
a_elem.appendChild(host_a.state_to_dom_fragment(document)) |
843 |
a_elem.appendChild(host_a.state_to_dom_fragment(document)) |
847 |
host_elem.appendChild(a_elem) |
844 |
host_elem.appendChild(a_elem) |
848 |
b_elem = document.createElement(u"b") |
845 |
b_elem = document.createElement("b") |
849 |
b_elem.appendChild(host_b.state_to_dom_fragment(document)) |
846 |
b_elem.appendChild(host_b.state_to_dom_fragment(document)) |
850 |
host_elem.appendChild(b_elem) |
847 |
host_elem.appendChild(b_elem) |
851 |
|
848 |
|
Lines 854-884
class HostDiff(object):
Link Here
|
854 |
addrset_b = set(host_b.addresses) |
851 |
addrset_b = set(host_b.addresses) |
855 |
for addr in sorted(addrset_a.intersection(addrset_b)): |
852 |
for addr in sorted(addrset_a.intersection(addrset_b)): |
856 |
host_elem.appendChild(addr.to_dom_fragment(document)) |
853 |
host_elem.appendChild(addr.to_dom_fragment(document)) |
857 |
a_elem = document.createElement(u"a") |
854 |
a_elem = document.createElement("a") |
858 |
for addr in sorted(addrset_a - addrset_b): |
855 |
for addr in sorted(addrset_a - addrset_b): |
859 |
a_elem.appendChild(addr.to_dom_fragment(document)) |
856 |
a_elem.appendChild(addr.to_dom_fragment(document)) |
860 |
if a_elem.hasChildNodes(): |
857 |
if a_elem.hasChildNodes(): |
861 |
host_elem.appendChild(a_elem) |
858 |
host_elem.appendChild(a_elem) |
862 |
b_elem = document.createElement(u"b") |
859 |
b_elem = document.createElement("b") |
863 |
for addr in sorted(addrset_b - addrset_a): |
860 |
for addr in sorted(addrset_b - addrset_a): |
864 |
b_elem.appendChild(addr.to_dom_fragment(document)) |
861 |
b_elem.appendChild(addr.to_dom_fragment(document)) |
865 |
if b_elem.hasChildNodes(): |
862 |
if b_elem.hasChildNodes(): |
866 |
host_elem.appendChild(b_elem) |
863 |
host_elem.appendChild(b_elem) |
867 |
|
864 |
|
868 |
# Host names. |
865 |
# Host names. |
869 |
hostnames_elem = document.createElement(u"hostnames") |
866 |
hostnames_elem = document.createElement("hostnames") |
870 |
hostnameset_a = set(host_a.hostnames) |
867 |
hostnameset_a = set(host_a.hostnames) |
871 |
hostnameset_b = set(host_b.hostnames) |
868 |
hostnameset_b = set(host_b.hostnames) |
872 |
for hostname in sorted(hostnameset_a.intersection(hostnameset_b)): |
869 |
for hostname in sorted(hostnameset_a.intersection(hostnameset_b)): |
873 |
hostnames_elem.appendChild( |
870 |
hostnames_elem.appendChild( |
874 |
host_a.hostname_to_dom_fragment(document, hostname)) |
871 |
host_a.hostname_to_dom_fragment(document, hostname)) |
875 |
a_elem = document.createElement(u"a") |
872 |
a_elem = document.createElement("a") |
876 |
for hostname in sorted(hostnameset_a - hostnameset_b): |
873 |
for hostname in sorted(hostnameset_a - hostnameset_b): |
877 |
a_elem.appendChild( |
874 |
a_elem.appendChild( |
878 |
host_a.hostname_to_dom_fragment(document, hostname)) |
875 |
host_a.hostname_to_dom_fragment(document, hostname)) |
879 |
if a_elem.hasChildNodes(): |
876 |
if a_elem.hasChildNodes(): |
880 |
hostnames_elem.appendChild(a_elem) |
877 |
hostnames_elem.appendChild(a_elem) |
881 |
b_elem = document.createElement(u"b") |
878 |
b_elem = document.createElement("b") |
882 |
for hostname in sorted(hostnameset_b - hostnameset_a): |
879 |
for hostname in sorted(hostnameset_b - hostnameset_a): |
883 |
b_elem.appendChild( |
880 |
b_elem.appendChild( |
884 |
host_b.hostname_to_dom_fragment(document, hostname)) |
881 |
host_b.hostname_to_dom_fragment(document, hostname)) |
Lines 887-901
class HostDiff(object):
Link Here
|
887 |
if hostnames_elem.hasChildNodes(): |
884 |
if hostnames_elem.hasChildNodes(): |
888 |
host_elem.appendChild(hostnames_elem) |
885 |
host_elem.appendChild(hostnames_elem) |
889 |
|
886 |
|
890 |
ports_elem = document.createElement(u"ports") |
887 |
ports_elem = document.createElement("ports") |
891 |
# Extraports. |
888 |
# Extraports. |
892 |
if host_a.extraports == host_b.extraports: |
889 |
if host_a.extraports == host_b.extraports: |
893 |
ports_elem.appendChild(host_a.extraports_to_dom_fragment(document)) |
890 |
ports_elem.appendChild(host_a.extraports_to_dom_fragment(document)) |
894 |
else: |
891 |
else: |
895 |
a_elem = document.createElement(u"a") |
892 |
a_elem = document.createElement("a") |
896 |
a_elem.appendChild(host_a.extraports_to_dom_fragment(document)) |
893 |
a_elem.appendChild(host_a.extraports_to_dom_fragment(document)) |
897 |
ports_elem.appendChild(a_elem) |
894 |
ports_elem.appendChild(a_elem) |
898 |
b_elem = document.createElement(u"b") |
895 |
b_elem = document.createElement("b") |
899 |
b_elem.appendChild(host_b.extraports_to_dom_fragment(document)) |
896 |
b_elem.appendChild(host_b.extraports_to_dom_fragment(document)) |
900 |
ports_elem.appendChild(b_elem) |
897 |
ports_elem.appendChild(b_elem) |
901 |
# Port list. |
898 |
# Port list. |
Lines 911-928
class HostDiff(object):
Link Here
|
911 |
|
908 |
|
912 |
# OS changes. |
909 |
# OS changes. |
913 |
if self.os_changed or verbose: |
910 |
if self.os_changed or verbose: |
914 |
os_elem = document.createElement(u"os") |
911 |
os_elem = document.createElement("os") |
915 |
# os_diffs is a list of 5-tuples returned by |
912 |
# os_diffs is a list of 5-tuples returned by |
916 |
# difflib.SequenceMatcher. |
913 |
# difflib.SequenceMatcher. |
917 |
for op, i1, i2, j1, j2 in self.os_diffs: |
914 |
for op, i1, i2, j1, j2 in self.os_diffs: |
918 |
if op == "replace" or op == "delete": |
915 |
if op == "replace" or op == "delete": |
919 |
a_elem = document.createElement(u"a") |
916 |
a_elem = document.createElement("a") |
920 |
for i in range(i1, i2): |
917 |
for i in range(i1, i2): |
921 |
a_elem.appendChild(host_a.os_to_dom_fragment( |
918 |
a_elem.appendChild(host_a.os_to_dom_fragment( |
922 |
document, host_a.os[i])) |
919 |
document, host_a.os[i])) |
923 |
os_elem.appendChild(a_elem) |
920 |
os_elem.appendChild(a_elem) |
924 |
if op == "replace" or op == "insert": |
921 |
if op == "replace" or op == "insert": |
925 |
b_elem = document.createElement(u"b") |
922 |
b_elem = document.createElement("b") |
926 |
for i in range(j1, j2): |
923 |
for i in range(j1, j2): |
927 |
b_elem.appendChild(host_b.os_to_dom_fragment( |
924 |
b_elem.appendChild(host_b.os_to_dom_fragment( |
928 |
document, host_b.os[i])) |
925 |
document, host_b.os[i])) |
Lines 936-942
class HostDiff(object):
Link Here
|
936 |
|
933 |
|
937 |
# Host script changes. |
934 |
# Host script changes. |
938 |
if len(self.script_result_diffs) > 0 or verbose: |
935 |
if len(self.script_result_diffs) > 0 or verbose: |
939 |
hostscript_elem = document.createElement(u"hostscript") |
936 |
hostscript_elem = document.createElement("hostscript") |
940 |
host_elem.appendChild(script_result_diffs_to_dom_fragment( |
937 |
host_elem.appendChild(script_result_diffs_to_dom_fragment( |
941 |
hostscript_elem, host_a.script_results, |
938 |
hostscript_elem, host_a.script_results, |
942 |
host_b.script_results, self.script_result_diffs, |
939 |
host_b.script_results, self.script_result_diffs, |
Lines 989-1026
class PortDiff(object):
Link Here
|
989 |
self.port_b.service.version_string()] |
986 |
self.port_b.service.version_string()] |
990 |
if a_columns == b_columns: |
987 |
if a_columns == b_columns: |
991 |
if verbose or self.script_result_diffs > 0: |
988 |
if verbose or self.script_result_diffs > 0: |
992 |
table.append([u" "] + a_columns) |
989 |
table.append([" "] + a_columns) |
993 |
else: |
990 |
else: |
994 |
if not host_a.is_extraports(self.port_a.state): |
991 |
if not host_a.is_extraports(self.port_a.state): |
995 |
table.append([u"-"] + a_columns) |
992 |
table.append(["-"] + a_columns) |
996 |
if not host_b.is_extraports(self.port_b.state): |
993 |
if not host_b.is_extraports(self.port_b.state): |
997 |
table.append([u"+"] + b_columns) |
994 |
table.append(["+"] + b_columns) |
998 |
|
995 |
|
999 |
for sr_diff in self.script_result_diffs: |
996 |
for sr_diff in self.script_result_diffs: |
1000 |
sr_diff.append_to_port_table(table) |
997 |
sr_diff.append_to_port_table(table) |
1001 |
|
998 |
|
1002 |
def to_dom_fragment(self, document): |
999 |
def to_dom_fragment(self, document): |
1003 |
frag = document.createDocumentFragment() |
1000 |
frag = document.createDocumentFragment() |
1004 |
portdiff_elem = document.createElement(u"portdiff") |
1001 |
portdiff_elem = document.createElement("portdiff") |
1005 |
frag.appendChild(portdiff_elem) |
1002 |
frag.appendChild(portdiff_elem) |
1006 |
if (self.port_a.spec == self.port_b.spec and |
1003 |
if (self.port_a.spec == self.port_b.spec and |
1007 |
self.port_a.state == self.port_b.state): |
1004 |
self.port_a.state == self.port_b.state): |
1008 |
port_elem = document.createElement(u"port") |
1005 |
port_elem = document.createElement("port") |
1009 |
port_elem.setAttribute(u"portid", unicode(self.port_a.spec[0])) |
1006 |
port_elem.setAttribute("portid", str(self.port_a.spec[0])) |
1010 |
port_elem.setAttribute(u"protocol", self.port_a.spec[1]) |
1007 |
port_elem.setAttribute("protocol", self.port_a.spec[1]) |
1011 |
if self.port_a.state is not None: |
1008 |
if self.port_a.state is not None: |
1012 |
state_elem = document.createElement(u"state") |
1009 |
state_elem = document.createElement("state") |
1013 |
state_elem.setAttribute(u"state", self.port_a.state) |
1010 |
state_elem.setAttribute("state", self.port_a.state) |
1014 |
port_elem.appendChild(state_elem) |
1011 |
port_elem.appendChild(state_elem) |
1015 |
if self.port_a.service == self.port_b.service: |
1012 |
if self.port_a.service == self.port_b.service: |
1016 |
port_elem.appendChild( |
1013 |
port_elem.appendChild( |
1017 |
self.port_a.service.to_dom_fragment(document)) |
1014 |
self.port_a.service.to_dom_fragment(document)) |
1018 |
else: |
1015 |
else: |
1019 |
a_elem = document.createElement(u"a") |
1016 |
a_elem = document.createElement("a") |
1020 |
a_elem.appendChild( |
1017 |
a_elem.appendChild( |
1021 |
self.port_a.service.to_dom_fragment(document)) |
1018 |
self.port_a.service.to_dom_fragment(document)) |
1022 |
port_elem.appendChild(a_elem) |
1019 |
port_elem.appendChild(a_elem) |
1023 |
b_elem = document.createElement(u"b") |
1020 |
b_elem = document.createElement("b") |
1024 |
b_elem.appendChild( |
1021 |
b_elem.appendChild( |
1025 |
self.port_b.service.to_dom_fragment(document)) |
1022 |
self.port_b.service.to_dom_fragment(document)) |
1026 |
port_elem.appendChild(b_elem) |
1023 |
port_elem.appendChild(b_elem) |
Lines 1028-1037
class PortDiff(object):
Link Here
|
1028 |
port_elem.appendChild(sr_diff.to_dom_fragment(document)) |
1025 |
port_elem.appendChild(sr_diff.to_dom_fragment(document)) |
1029 |
portdiff_elem.appendChild(port_elem) |
1026 |
portdiff_elem.appendChild(port_elem) |
1030 |
else: |
1027 |
else: |
1031 |
a_elem = document.createElement(u"a") |
1028 |
a_elem = document.createElement("a") |
1032 |
a_elem.appendChild(self.port_a.to_dom_fragment(document)) |
1029 |
a_elem.appendChild(self.port_a.to_dom_fragment(document)) |
1033 |
portdiff_elem.appendChild(a_elem) |
1030 |
portdiff_elem.appendChild(a_elem) |
1034 |
b_elem = document.createElement(u"b") |
1031 |
b_elem = document.createElement("b") |
1035 |
b_elem.appendChild(self.port_b.to_dom_fragment(document)) |
1032 |
b_elem.appendChild(self.port_b.to_dom_fragment(document)) |
1036 |
portdiff_elem.appendChild(b_elem) |
1033 |
portdiff_elem.appendChild(b_elem) |
1037 |
|
1034 |
|
Lines 1086-1098
class ScriptResultDiff(object):
Link Here
|
1086 |
for op, i1, i2, j1, j2 in diffs.get_opcodes(): |
1083 |
for op, i1, i2, j1, j2 in diffs.get_opcodes(): |
1087 |
if op == "replace" or op == "delete": |
1084 |
if op == "replace" or op == "delete": |
1088 |
for k in range(i1, i2): |
1085 |
for k in range(i1, i2): |
1089 |
table.append_raw(u"-" + a_lines[k]) |
1086 |
table.append_raw("-" + a_lines[k]) |
1090 |
if op == "replace" or op == "insert": |
1087 |
if op == "replace" or op == "insert": |
1091 |
for k in range(j1, j2): |
1088 |
for k in range(j1, j2): |
1092 |
table.append_raw(u"+" + b_lines[k]) |
1089 |
table.append_raw("+" + b_lines[k]) |
1093 |
if op == "equal": |
1090 |
if op == "equal": |
1094 |
for k in range(i1, i2): |
1091 |
for k in range(i1, i2): |
1095 |
table.append_raw(u" " + a_lines[k]) |
1092 |
table.append_raw(" " + a_lines[k]) |
1096 |
|
1093 |
|
1097 |
def to_dom_fragment(self, document): |
1094 |
def to_dom_fragment(self, document): |
1098 |
frag = document.createDocumentFragment() |
1095 |
frag = document.createDocumentFragment() |
Lines 1102-1112
class ScriptResultDiff(object):
Link Here
|
1102 |
frag.appendChild(self.sr_a.to_dom_fragment(document)) |
1099 |
frag.appendChild(self.sr_a.to_dom_fragment(document)) |
1103 |
else: |
1100 |
else: |
1104 |
if self.sr_a is not None: |
1101 |
if self.sr_a is not None: |
1105 |
a_elem = document.createElement(u"a") |
1102 |
a_elem = document.createElement("a") |
1106 |
a_elem.appendChild(self.sr_a.to_dom_fragment(document)) |
1103 |
a_elem.appendChild(self.sr_a.to_dom_fragment(document)) |
1107 |
frag.appendChild(a_elem) |
1104 |
frag.appendChild(a_elem) |
1108 |
if self.sr_b is not None: |
1105 |
if self.sr_b is not None: |
1109 |
b_elem = document.createElement(u"b") |
1106 |
b_elem = document.createElement("b") |
1110 |
b_elem.appendChild(self.sr_b.to_dom_fragment(document)) |
1107 |
b_elem.appendChild(self.sr_b.to_dom_fragment(document)) |
1111 |
frag.appendChild(b_elem) |
1108 |
frag.appendChild(b_elem) |
1112 |
return frag |
1109 |
return frag |
Lines 1120-1126
class Table(object):
Link Here
|
1120 |
copied to the output.""" |
1117 |
copied to the output.""" |
1121 |
self.widths = [] |
1118 |
self.widths = [] |
1122 |
self.rows = [] |
1119 |
self.rows = [] |
1123 |
self.prefix = u"" |
1120 |
self.prefix = "" |
1124 |
self.padding = [] |
1121 |
self.padding = [] |
1125 |
j = 0 |
1122 |
j = 0 |
1126 |
while j < len(template) and template[j] != "*": |
1123 |
while j < len(template) and template[j] != "*": |
Lines 1145-1151
class Table(object):
Link Here
|
1145 |
|
1142 |
|
1146 |
for i in range(len(row)): |
1143 |
for i in range(len(row)): |
1147 |
if row[i] is None: |
1144 |
if row[i] is None: |
1148 |
s = u"" |
1145 |
s = "" |
1149 |
else: |
1146 |
else: |
1150 |
s = str(row[i]) |
1147 |
s = str(row[i]) |
1151 |
if i == len(self.widths): |
1148 |
if i == len(self.widths): |
Lines 1167-1173
class Table(object):
Link Here
|
1167 |
for row in self.rows: |
1164 |
for row in self.rows: |
1168 |
parts = [self.prefix] |
1165 |
parts = [self.prefix] |
1169 |
i = 0 |
1166 |
i = 0 |
1170 |
if isinstance(row, basestring): |
1167 |
if isinstance(row, str): |
1171 |
# A raw string. |
1168 |
# A raw string. |
1172 |
lines.append(row) |
1169 |
lines.append(row) |
1173 |
else: |
1170 |
else: |
Lines 1176-1188
class Table(object):
Link Here
|
1176 |
if i < len(self.padding): |
1173 |
if i < len(self.padding): |
1177 |
parts.append(self.padding[i]) |
1174 |
parts.append(self.padding[i]) |
1178 |
i += 1 |
1175 |
i += 1 |
1179 |
lines.append(u"".join(parts).rstrip()) |
1176 |
lines.append("".join(parts).rstrip()) |
1180 |
return u"\n".join(lines) |
1177 |
return "\n".join(lines) |
1181 |
|
1178 |
|
1182 |
|
1179 |
|
1183 |
def warn(str): |
1180 |
def warn(str): |
1184 |
"""Print a warning to stderr.""" |
1181 |
"""Print a warning to stderr.""" |
1185 |
print >> sys.stderr, str |
1182 |
print(str, file=sys.stderr) |
1186 |
|
1183 |
|
1187 |
|
1184 |
|
1188 |
class NmapContentHandler(xml.sax.handler.ContentHandler): |
1185 |
class NmapContentHandler(xml.sax.handler.ContentHandler): |
Lines 1200-1221
class NmapContentHandler(xml.sax.handler.ContentHandler):
Link Here
|
1200 |
self.current_port = None |
1197 |
self.current_port = None |
1201 |
|
1198 |
|
1202 |
self._start_elem_handlers = { |
1199 |
self._start_elem_handlers = { |
1203 |
u"nmaprun": self._start_nmaprun, |
1200 |
"nmaprun": self._start_nmaprun, |
1204 |
u"host": self._start_host, |
1201 |
"host": self._start_host, |
1205 |
u"status": self._start_status, |
1202 |
"status": self._start_status, |
1206 |
u"address": self._start_address, |
1203 |
"address": self._start_address, |
1207 |
u"hostname": self._start_hostname, |
1204 |
"hostname": self._start_hostname, |
1208 |
u"extraports": self._start_extraports, |
1205 |
"extraports": self._start_extraports, |
1209 |
u"port": self._start_port, |
1206 |
"port": self._start_port, |
1210 |
u"state": self._start_state, |
1207 |
"state": self._start_state, |
1211 |
u"service": self._start_service, |
1208 |
"service": self._start_service, |
1212 |
u"script": self._start_script, |
1209 |
"script": self._start_script, |
1213 |
u"osmatch": self._start_osmatch, |
1210 |
"osmatch": self._start_osmatch, |
1214 |
u"finished": self._start_finished, |
1211 |
"finished": self._start_finished, |
1215 |
} |
1212 |
} |
1216 |
self._end_elem_handlers = { |
1213 |
self._end_elem_handlers = { |
1217 |
u'host': self._end_host, |
1214 |
'host': self._end_host, |
1218 |
u'port': self._end_port, |
1215 |
'port': self._end_port, |
1219 |
} |
1216 |
} |
1220 |
|
1217 |
|
1221 |
def parent_element(self): |
1218 |
def parent_element(self): |
Lines 1245-1312
class NmapContentHandler(xml.sax.handler.ContentHandler):
Link Here
|
1245 |
def _start_nmaprun(self, name, attrs): |
1242 |
def _start_nmaprun(self, name, attrs): |
1246 |
assert self.parent_element() is None |
1243 |
assert self.parent_element() is None |
1247 |
if "start" in attrs: |
1244 |
if "start" in attrs: |
1248 |
start_timestamp = int(attrs.get(u"start")) |
1245 |
start_timestamp = int(attrs.get("start")) |
1249 |
self.scan.start_date = datetime.datetime.fromtimestamp( |
1246 |
self.scan.start_date = datetime.datetime.fromtimestamp( |
1250 |
start_timestamp) |
1247 |
start_timestamp) |
1251 |
self.scan.scanner = attrs.get(u"scanner") |
1248 |
self.scan.scanner = attrs.get("scanner") |
1252 |
self.scan.args = attrs.get(u"args") |
1249 |
self.scan.args = attrs.get("args") |
1253 |
self.scan.version = attrs.get(u"version") |
1250 |
self.scan.version = attrs.get("version") |
1254 |
|
1251 |
|
1255 |
def _start_host(self, name, attrs): |
1252 |
def _start_host(self, name, attrs): |
1256 |
assert self.parent_element() == u"nmaprun" |
1253 |
assert self.parent_element() == "nmaprun" |
1257 |
self.current_host = Host() |
1254 |
self.current_host = Host() |
1258 |
self.scan.hosts.append(self.current_host) |
1255 |
self.scan.hosts.append(self.current_host) |
1259 |
|
1256 |
|
1260 |
def _start_status(self, name, attrs): |
1257 |
def _start_status(self, name, attrs): |
1261 |
assert self.parent_element() == u"host" |
1258 |
assert self.parent_element() == "host" |
1262 |
assert self.current_host is not None |
1259 |
assert self.current_host is not None |
1263 |
state = attrs.get(u"state") |
1260 |
state = attrs.get("state") |
1264 |
if state is None: |
1261 |
if state is None: |
1265 |
warn(u'%s element of host %s is missing the "state" attribute; ' |
1262 |
warn(u'%s element of host %s is missing the "state" attribute; ' |
1266 |
'assuming \unknown\.' % ( |
1263 |
r'assuming \unknown\.' % ( |
1267 |
name, self.current_host.format_name())) |
1264 |
name, self.current_host.format_name())) |
1268 |
return |
1265 |
return |
1269 |
self.current_host.state = state |
1266 |
self.current_host.state = state |
1270 |
|
1267 |
|
1271 |
def _start_address(self, name, attrs): |
1268 |
def _start_address(self, name, attrs): |
1272 |
assert self.parent_element() == u"host" |
1269 |
assert self.parent_element() == "host" |
1273 |
assert self.current_host is not None |
1270 |
assert self.current_host is not None |
1274 |
addr = attrs.get(u"addr") |
1271 |
addr = attrs.get("addr") |
1275 |
if addr is None: |
1272 |
if addr is None: |
1276 |
warn(u'%s element of host %s is missing the "addr" ' |
1273 |
warn('%s element of host %s is missing the "addr" ' |
1277 |
'attribute; skipping.' % ( |
1274 |
'attribute; skipping.' % ( |
1278 |
name, self.current_host.format_name())) |
1275 |
name, self.current_host.format_name())) |
1279 |
return |
1276 |
return |
1280 |
addrtype = attrs.get(u"addrtype", u"ipv4") |
1277 |
addrtype = attrs.get("addrtype", "ipv4") |
1281 |
self.current_host.add_address(Address.new(addrtype, addr)) |
1278 |
self.current_host.add_address(Address.new(addrtype, addr)) |
1282 |
|
1279 |
|
1283 |
def _start_hostname(self, name, attrs): |
1280 |
def _start_hostname(self, name, attrs): |
1284 |
assert self.parent_element() == u"hostnames" |
1281 |
assert self.parent_element() == "hostnames" |
1285 |
assert self.current_host is not None |
1282 |
assert self.current_host is not None |
1286 |
hostname = attrs.get(u"name") |
1283 |
hostname = attrs.get("name") |
1287 |
if hostname is None: |
1284 |
if hostname is None: |
1288 |
warn(u'%s element of host %s is missing the "name" ' |
1285 |
warn('%s element of host %s is missing the "name" ' |
1289 |
'attribute; skipping.' % ( |
1286 |
'attribute; skipping.' % ( |
1290 |
name, self.current_host.format_name())) |
1287 |
name, self.current_host.format_name())) |
1291 |
return |
1288 |
return |
1292 |
self.current_host.add_hostname(hostname) |
1289 |
self.current_host.add_hostname(hostname) |
1293 |
|
1290 |
|
1294 |
def _start_extraports(self, name, attrs): |
1291 |
def _start_extraports(self, name, attrs): |
1295 |
assert self.parent_element() == u"ports" |
1292 |
assert self.parent_element() == "ports" |
1296 |
assert self.current_host is not None |
1293 |
assert self.current_host is not None |
1297 |
state = attrs.get(u"state") |
1294 |
state = attrs.get("state") |
1298 |
if state is None: |
1295 |
if state is None: |
1299 |
warn(u'%s element of host %s is missing the "state" ' |
1296 |
warn('%s element of host %s is missing the "state" ' |
1300 |
'attribute; assuming "unknown".' % ( |
1297 |
'attribute; assuming "unknown".' % ( |
1301 |
name, self.current_host.format_name())) |
1298 |
name, self.current_host.format_name())) |
1302 |
state = None |
1299 |
state = None |
1303 |
if state in self.current_host.extraports: |
1300 |
if state in self.current_host.extraports: |
1304 |
warn(u'Duplicate extraports state "%s" in host %s.' % ( |
1301 |
warn('Duplicate extraports state "%s" in host %s.' % ( |
1305 |
state, self.current_host.format_name())) |
1302 |
state, self.current_host.format_name())) |
1306 |
|
1303 |
|
1307 |
count = attrs.get(u"count") |
1304 |
count = attrs.get("count") |
1308 |
if count is None: |
1305 |
if count is None: |
1309 |
warn(u'%s element of host %s is missing the "count" ' |
1306 |
warn('%s element of host %s is missing the "count" ' |
1310 |
'attribute; assuming 0.' % ( |
1307 |
'attribute; assuming 0.' % ( |
1311 |
name, self.current_host.format_name())) |
1308 |
name, self.current_host.format_name())) |
1312 |
count = 0 |
1309 |
count = 0 |
Lines 1314-1412
class NmapContentHandler(xml.sax.handler.ContentHandler):
Link Here
|
1314 |
try: |
1311 |
try: |
1315 |
count = int(count) |
1312 |
count = int(count) |
1316 |
except ValueError: |
1313 |
except ValueError: |
1317 |
warn(u"Can't convert extraports count \"%s\" " |
1314 |
warn("Can't convert extraports count \"%s\" " |
1318 |
"to an integer in host %s; assuming 0." % ( |
1315 |
"to an integer in host %s; assuming 0." % ( |
1319 |
attrs[u"count"], self.current_host.format_name())) |
1316 |
attrs["count"], self.current_host.format_name())) |
1320 |
count = 0 |
1317 |
count = 0 |
1321 |
self.current_host.extraports[state] = count |
1318 |
self.current_host.extraports[state] = count |
1322 |
|
1319 |
|
1323 |
def _start_port(self, name, attrs): |
1320 |
def _start_port(self, name, attrs): |
1324 |
assert self.parent_element() == u"ports" |
1321 |
assert self.parent_element() == "ports" |
1325 |
assert self.current_host is not None |
1322 |
assert self.current_host is not None |
1326 |
portid_str = attrs.get(u"portid") |
1323 |
portid_str = attrs.get("portid") |
1327 |
if portid_str is None: |
1324 |
if portid_str is None: |
1328 |
warn(u'%s element of host %s missing the "portid" ' |
1325 |
warn('%s element of host %s missing the "portid" ' |
1329 |
'attribute; skipping.' % ( |
1326 |
'attribute; skipping.' % ( |
1330 |
name, self.current_host.format_name())) |
1327 |
name, self.current_host.format_name())) |
1331 |
return |
1328 |
return |
1332 |
try: |
1329 |
try: |
1333 |
portid = int(portid_str) |
1330 |
portid = int(portid_str) |
1334 |
except ValueError: |
1331 |
except ValueError: |
1335 |
warn(u"Can't convert portid \"%s\" to an integer " |
1332 |
warn("Can't convert portid \"%s\" to an integer " |
1336 |
"in host %s; skipping port." % ( |
1333 |
"in host %s; skipping port." % ( |
1337 |
portid_str, self.current_host.format_name())) |
1334 |
portid_str, self.current_host.format_name())) |
1338 |
return |
1335 |
return |
1339 |
protocol = attrs.get(u"protocol") |
1336 |
protocol = attrs.get("protocol") |
1340 |
if protocol is None: |
1337 |
if protocol is None: |
1341 |
warn(u'%s element of host %s missing the "protocol" ' |
1338 |
warn('%s element of host %s missing the "protocol" ' |
1342 |
'attribute; skipping.' % ( |
1339 |
'attribute; skipping.' % ( |
1343 |
name, self.current_host.format_name())) |
1340 |
name, self.current_host.format_name())) |
1344 |
return |
1341 |
return |
1345 |
self.current_port = Port((portid, protocol)) |
1342 |
self.current_port = Port((portid, protocol)) |
1346 |
|
1343 |
|
1347 |
def _start_state(self, name, attrs): |
1344 |
def _start_state(self, name, attrs): |
1348 |
assert self.parent_element() == u"port" |
1345 |
assert self.parent_element() == "port" |
1349 |
assert self.current_host is not None |
1346 |
assert self.current_host is not None |
1350 |
if self.current_port is None: |
1347 |
if self.current_port is None: |
1351 |
return |
1348 |
return |
1352 |
if "state" not in attrs: |
1349 |
if "state" not in attrs: |
1353 |
warn(u'%s element of port %s is missing the "state" ' |
1350 |
warn('%s element of port %s is missing the "state" ' |
1354 |
'attribute; assuming "unknown".' % ( |
1351 |
'attribute; assuming "unknown".' % ( |
1355 |
name, self.current_port.spec_string())) |
1352 |
name, self.current_port.spec_string())) |
1356 |
return |
1353 |
return |
1357 |
self.current_port.state = attrs[u"state"] |
1354 |
self.current_port.state = attrs["state"] |
1358 |
self.current_host.add_port(self.current_port) |
1355 |
self.current_host.add_port(self.current_port) |
1359 |
|
1356 |
|
1360 |
def _start_service(self, name, attrs): |
1357 |
def _start_service(self, name, attrs): |
1361 |
assert self.parent_element() == u"port" |
1358 |
assert self.parent_element() == "port" |
1362 |
assert self.current_host is not None |
1359 |
assert self.current_host is not None |
1363 |
if self.current_port is None: |
1360 |
if self.current_port is None: |
1364 |
return |
1361 |
return |
1365 |
self.current_port.service.name = attrs.get(u"name") |
1362 |
self.current_port.service.name = attrs.get("name") |
1366 |
self.current_port.service.product = attrs.get(u"product") |
1363 |
self.current_port.service.product = attrs.get("product") |
1367 |
self.current_port.service.version = attrs.get(u"version") |
1364 |
self.current_port.service.version = attrs.get("version") |
1368 |
self.current_port.service.extrainfo = attrs.get(u"extrainfo") |
1365 |
self.current_port.service.extrainfo = attrs.get("extrainfo") |
1369 |
self.current_port.service.tunnel = attrs.get(u"tunnel") |
1366 |
self.current_port.service.tunnel = attrs.get("tunnel") |
1370 |
|
1367 |
|
1371 |
def _start_script(self, name, attrs): |
1368 |
def _start_script(self, name, attrs): |
1372 |
result = ScriptResult() |
1369 |
result = ScriptResult() |
1373 |
result.id = attrs.get(u"id") |
1370 |
result.id = attrs.get("id") |
1374 |
if result.id is None: |
1371 |
if result.id is None: |
1375 |
warn(u'%s element missing the "id" attribute; skipping.' % name) |
1372 |
warn('%s element missing the "id" attribute; skipping.' % name) |
1376 |
return |
1373 |
return |
1377 |
|
1374 |
|
1378 |
result.output = attrs.get(u"output") |
1375 |
result.output = attrs.get("output") |
1379 |
if result.output is None: |
1376 |
if result.output is None: |
1380 |
warn(u'%s element missing the "output" attribute; skipping.' |
1377 |
warn('%s element missing the "output" attribute; skipping.' |
1381 |
% name) |
1378 |
% name) |
1382 |
return |
1379 |
return |
1383 |
if self.parent_element() == u"prescript": |
1380 |
if self.parent_element() == "prescript": |
1384 |
self.scan.pre_script_results.append(result) |
1381 |
self.scan.pre_script_results.append(result) |
1385 |
elif self.parent_element() == u"postscript": |
1382 |
elif self.parent_element() == "postscript": |
1386 |
self.scan.post_script_results.append(result) |
1383 |
self.scan.post_script_results.append(result) |
1387 |
elif self.parent_element() == u"hostscript": |
1384 |
elif self.parent_element() == "hostscript": |
1388 |
self.current_host.script_results.append(result) |
1385 |
self.current_host.script_results.append(result) |
1389 |
elif self.parent_element() == u"port": |
1386 |
elif self.parent_element() == "port": |
1390 |
self.current_port.script_results.append(result) |
1387 |
self.current_port.script_results.append(result) |
1391 |
else: |
1388 |
else: |
1392 |
warn(u"%s element not inside prescript, postscript, hostscript, " |
1389 |
warn("%s element not inside prescript, postscript, hostscript, " |
1393 |
"or port element; ignoring." % name) |
1390 |
"or port element; ignoring." % name) |
1394 |
return |
1391 |
return |
1395 |
|
1392 |
|
1396 |
def _start_osmatch(self, name, attrs): |
1393 |
def _start_osmatch(self, name, attrs): |
1397 |
assert self.parent_element() == u"os" |
1394 |
assert self.parent_element() == "os" |
1398 |
assert self.current_host is not None |
1395 |
assert self.current_host is not None |
1399 |
if "name" not in attrs: |
1396 |
if "name" not in attrs: |
1400 |
warn(u'%s element of host %s is missing the "name" ' |
1397 |
warn('%s element of host %s is missing the "name" ' |
1401 |
'attribute; skipping.' % ( |
1398 |
'attribute; skipping.' % ( |
1402 |
name, self.current_host.format_name())) |
1399 |
name, self.current_host.format_name())) |
1403 |
return |
1400 |
return |
1404 |
self.current_host.os.append(attrs[u"name"]) |
1401 |
self.current_host.os.append(attrs["name"]) |
1405 |
|
1402 |
|
1406 |
def _start_finished(self, name, attrs): |
1403 |
def _start_finished(self, name, attrs): |
1407 |
assert self.parent_element() == u"runstats" |
1404 |
assert self.parent_element() == "runstats" |
1408 |
if "time" in attrs: |
1405 |
if "time" in attrs: |
1409 |
end_timestamp = int(attrs.get(u"time")) |
1406 |
end_timestamp = int(attrs.get("time")) |
1410 |
self.scan.end_date = datetime.datetime.fromtimestamp(end_timestamp) |
1407 |
self.scan.end_date = datetime.datetime.fromtimestamp(end_timestamp) |
1411 |
|
1408 |
|
1412 |
def _end_host(self, name): |
1409 |
def _end_host(self, name): |
Lines 1425-1447
class XMLWriter (xml.sax.saxutils.XMLGenerator):
Link Here
|
1425 |
|
1422 |
|
1426 |
def frag(self, frag): |
1423 |
def frag(self, frag): |
1427 |
for node in frag.childNodes: |
1424 |
for node in frag.childNodes: |
1428 |
node.writexml(self.f, newl=u"\n") |
1425 |
node.writexml(self.f, newl="\n") |
1429 |
|
1426 |
|
1430 |
def frag_a(self, frag): |
1427 |
def frag_a(self, frag): |
1431 |
self.startElement(u"a", {}) |
1428 |
self.startElement("a", {}) |
1432 |
for node in frag.childNodes: |
1429 |
for node in frag.childNodes: |
1433 |
node.writexml(self.f, newl=u"\n") |
1430 |
node.writexml(self.f, newl="\n") |
1434 |
self.endElement(u"a") |
1431 |
self.endElement("a") |
1435 |
|
1432 |
|
1436 |
def frag_b(self, frag): |
1433 |
def frag_b(self, frag): |
1437 |
self.startElement(u"b", {}) |
1434 |
self.startElement("b", {}) |
1438 |
for node in frag.childNodes: |
1435 |
for node in frag.childNodes: |
1439 |
node.writexml(self.f, newl=u"\n") |
1436 |
node.writexml(self.f, newl="\n") |
1440 |
self.endElement(u"b") |
1437 |
self.endElement("b") |
1441 |
|
1438 |
|
1442 |
|
1439 |
|
1443 |
def usage(): |
1440 |
def usage(): |
1444 |
print u"""\ |
1441 |
print("""\ |
1445 |
Usage: %s [option] FILE1 FILE2 |
1442 |
Usage: %s [option] FILE1 FILE2 |
1446 |
Compare two Nmap XML files and display a list of their differences. |
1443 |
Compare two Nmap XML files and display a list of their differences. |
1447 |
Differences include host state changes, port state changes, and changes to |
1444 |
Differences include host state changes, port state changes, and changes to |
Lines 1451-1457
service and OS detection.
Link Here
|
1451 |
-v, --verbose also show hosts and ports that haven't changed. |
1448 |
-v, --verbose also show hosts and ports that haven't changed. |
1452 |
--text display output in text format (default) |
1449 |
--text display output in text format (default) |
1453 |
--xml display output in XML format\ |
1450 |
--xml display output in XML format\ |
1454 |
""" % sys.argv[0] |
1451 |
""" % sys.argv[0]) |
1455 |
|
1452 |
|
1456 |
EXIT_EQUAL = 0 |
1453 |
EXIT_EQUAL = 0 |
1457 |
EXIT_DIFFERENT = 1 |
1454 |
EXIT_DIFFERENT = 1 |
Lines 1459-1466
EXIT_ERROR = 2
Link Here
|
1459 |
|
1456 |
|
1460 |
|
1457 |
|
1461 |
def usage_error(msg): |
1458 |
def usage_error(msg): |
1462 |
print >> sys.stderr, u"%s: %s" % (sys.argv[0], msg) |
1459 |
print("%s: %s" % (sys.argv[0], msg), file=sys.stderr) |
1463 |
print >> sys.stderr, u"Try '%s -h' for help." % sys.argv[0] |
1460 |
print("Try '%s -h' for help." % sys.argv[0], file=sys.stderr) |
1464 |
sys.exit(EXIT_ERROR) |
1461 |
sys.exit(EXIT_ERROR) |
1465 |
|
1462 |
|
1466 |
|
1463 |
|
Lines 1471-1477
def main():
Link Here
|
1471 |
try: |
1468 |
try: |
1472 |
opts, input_filenames = getopt.gnu_getopt( |
1469 |
opts, input_filenames = getopt.gnu_getopt( |
1473 |
sys.argv[1:], "hv", ["help", "text", "verbose", "xml"]) |
1470 |
sys.argv[1:], "hv", ["help", "text", "verbose", "xml"]) |
1474 |
except getopt.GetoptError, e: |
1471 |
except getopt.GetoptError as e: |
1475 |
usage_error(e.msg) |
1472 |
usage_error(e.msg) |
1476 |
for o, a in opts: |
1473 |
for o, a in opts: |
1477 |
if o == "-h" or o == "--help": |
1474 |
if o == "-h" or o == "--help": |
Lines 1481-1495
def main():
Link Here
|
1481 |
verbose = True |
1478 |
verbose = True |
1482 |
elif o == "--text": |
1479 |
elif o == "--text": |
1483 |
if output_format is not None and output_format != "text": |
1480 |
if output_format is not None and output_format != "text": |
1484 |
usage_error(u"contradictory output format options.") |
1481 |
usage_error("contradictory output format options.") |
1485 |
output_format = "text" |
1482 |
output_format = "text" |
1486 |
elif o == "--xml": |
1483 |
elif o == "--xml": |
1487 |
if output_format is not None and output_format != "xml": |
1484 |
if output_format is not None and output_format != "xml": |
1488 |
usage_error(u"contradictory output format options.") |
1485 |
usage_error("contradictory output format options.") |
1489 |
output_format = "xml" |
1486 |
output_format = "xml" |
1490 |
|
1487 |
|
1491 |
if len(input_filenames) != 2: |
1488 |
if len(input_filenames) != 2: |
1492 |
usage_error(u"need exactly two input filenames.") |
1489 |
usage_error("need exactly two input filenames.") |
1493 |
|
1490 |
|
1494 |
if output_format is None: |
1491 |
if output_format is None: |
1495 |
output_format = "text" |
1492 |
output_format = "text" |
Lines 1502-1509
def main():
Link Here
|
1502 |
scan_a.load_from_file(filename_a) |
1499 |
scan_a.load_from_file(filename_a) |
1503 |
scan_b = Scan() |
1500 |
scan_b = Scan() |
1504 |
scan_b.load_from_file(filename_b) |
1501 |
scan_b.load_from_file(filename_b) |
1505 |
except IOError, e: |
1502 |
except IOError as e: |
1506 |
print >> sys.stderr, u"Can't open file: %s" % str(e) |
1503 |
print("Can't open file: %s" % str(e), file=sys.stderr) |
1507 |
sys.exit(EXIT_ERROR) |
1504 |
sys.exit(EXIT_ERROR) |
1508 |
|
1505 |
|
1509 |
if output_format == "text": |
1506 |
if output_format == "text": |