mirror of
https://github.com/nmap/nmap.git
synced 2025-12-06 04:31:29 +00:00
Add nmaprun information to Ndiff output.
Patch by Daniel Miller.
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
# Nmap Changelog ($Id$); -*-text-*-
|
||||
|
||||
o [Ndiff] Added nmaprun element information to the diff. [Daniel
|
||||
Miller]
|
||||
|
||||
o Added a GKrellM service probe from Toni Ruottu.
|
||||
|
||||
o [NSE] Removed the nmap.get_interface_link function, which was
|
||||
|
||||
@@ -73,6 +73,13 @@ version 0, which was rather different. -->
|
||||
|
||||
<!ELEMENT scandiff (prescript | hostdiff | host | postscript | (a, b?) | b)*>
|
||||
|
||||
<!ELEMENT nmaprun EMPTY>
|
||||
<!ATTLIST nmaprun
|
||||
scanner CDATA #REQUIRED
|
||||
args CDATA #IMPLIED
|
||||
start CDATA #IMPLIED
|
||||
startstr CDATA #IMPLIED
|
||||
version CDATA #REQUIRED>
|
||||
|
||||
<!ELEMENT prescript (script* | (a, b?) | b)>
|
||||
<!ELEMENT postscript (script* | (a, b?) | b)>
|
||||
@@ -127,6 +134,6 @@ version 0, which was rather different. -->
|
||||
|
||||
<!ELEMENT hostscript (script | a | b)*>
|
||||
|
||||
<!ENTITY % diff-elem "(prescript | postscript | host | status | address | hostname | extraports* | port | state | service | script | os | osmatch* | hostscript)">
|
||||
<!ENTITY % diff-elem "(nmaprun | prescript | postscript | host | status | address | hostname | extraports* | port | state | service | script | os | osmatch* | hostscript)">
|
||||
<!ELEMENT a %diff-elem;>
|
||||
<!ELEMENT b %diff-elem;>
|
||||
|
||||
48
ndiff/ndiff
48
ndiff/ndiff
@@ -30,7 +30,9 @@ class Scan(object):
|
||||
container for a list of hosts. It also has utility methods to load itself
|
||||
from an Nmap XML file."""
|
||||
def __init__(self):
|
||||
self.scanner = None
|
||||
self.version = None
|
||||
self.args = None
|
||||
self.start_date = None
|
||||
self.end_date = None
|
||||
self.hosts = []
|
||||
@@ -59,6 +61,21 @@ class Scan(object):
|
||||
finally:
|
||||
f.close()
|
||||
|
||||
def nmaprun_to_dom_fragment(self, document):
|
||||
frag = document.createDocumentFragment()
|
||||
elem = document.createElement(u"nmaprun")
|
||||
if self.scanner is not None:
|
||||
elem.setAttribute(u"scanner", self.scanner)
|
||||
if self.args is not None:
|
||||
elem.setAttribute(u"args", self.args)
|
||||
if self.start_date is not None:
|
||||
elem.setAttribute(u"start", "%d" % time.mktime(self.start_date.timetuple()))
|
||||
elem.setAttribute(u"startstr", self.start_date.strftime("%a %b %d %H:%M:%S %Y"))
|
||||
if self.version is not None:
|
||||
elem.setAttribute(u"version", self.version)
|
||||
frag.appendChild(elem)
|
||||
return frag
|
||||
|
||||
class Host(object):
|
||||
"""A single host, with a state, addresses, host names, a dict mapping port
|
||||
specs to Ports, and a list of OS matches. Host states are strings, or None
|
||||
@@ -383,11 +400,17 @@ class ScriptResult(object):
|
||||
|
||||
def format_banner(scan):
|
||||
"""Format a startup banner more or less like Nmap does."""
|
||||
parts = [u"Nmap"]
|
||||
scanner = u"Nmap"
|
||||
if scan.scanner is not None and scan.scanner != u"nmap":
|
||||
scanner = scan.scanner
|
||||
parts = [ scanner ]
|
||||
if scan.version is not None:
|
||||
parts.append(scan.version)
|
||||
parts.append(u"scan")
|
||||
if scan.start_date is not None:
|
||||
parts.append(u"at %s" % scan.start_date.strftime("%Y-%m-%d %H:%M"))
|
||||
parts.append(u"initiated %s" % scan.start_date.strftime("%a %b %d %H:%M:%S %Y"))
|
||||
if scan.args is not None:
|
||||
parts.append(u"as: %s" % scan.args)
|
||||
return u" ".join(parts)
|
||||
|
||||
def print_script_result_diffs_text(title, script_results_a, script_results_b,
|
||||
@@ -482,6 +505,16 @@ class ScanDiff(object):
|
||||
self.scan_a.post_script_results, self.scan_b.post_script_results,
|
||||
self.post_script_result_diffs)
|
||||
|
||||
def nmaprun_to_dom_fragment(self, document):
|
||||
frag = document.createDocumentFragment()
|
||||
a_elem = document.createElement(u"a")
|
||||
a_elem.appendChild(self.scan_a.nmaprun_to_dom_fragment(document))
|
||||
frag.appendChild(a_elem)
|
||||
b_elem = document.createElement(u"b")
|
||||
b_elem.appendChild(self.scan_b.nmaprun_to_dom_fragment(document))
|
||||
frag.appendChild(b_elem)
|
||||
return frag
|
||||
|
||||
def print_xml(self, f = sys.stdout):
|
||||
impl = xml.dom.minidom.getDOMImplementation()
|
||||
document = impl.createDocument(None, u"nmapdiff", None)
|
||||
@@ -490,6 +523,15 @@ class ScanDiff(object):
|
||||
scandiff_elem = document.createElement(u"scandiff")
|
||||
root.appendChild(scandiff_elem)
|
||||
|
||||
# nmaprun changes
|
||||
if ( verbose or
|
||||
self.scan_a.scanner != self.scan_b.scanner or
|
||||
self.scan_a.version != self.scan_b.version or
|
||||
self.scan_a.args != self.scan_b.args or
|
||||
self.scan_a.start_date != self.scan_b.start_date or
|
||||
self.scan_a.end_date != self.scan_b.end_date ):
|
||||
scandiff_elem.appendChild(self.nmaprun_to_dom_fragment(document))
|
||||
|
||||
# prerule script changes.
|
||||
if len(self.pre_script_result_diffs) > 0 or verbose:
|
||||
prescript_elem = document.createElement(u"prescript")
|
||||
@@ -1052,6 +1094,8 @@ class NmapContentHandler(xml.sax.handler.ContentHandler):
|
||||
if attrs.has_key(u"start"):
|
||||
start_timestamp = int(attrs.get(u"start"))
|
||||
self.scan.start_date = datetime.datetime.fromtimestamp(start_timestamp)
|
||||
self.scan.scanner = attrs.get(u"scanner")
|
||||
self.scan.args = attrs.get(u"args")
|
||||
self.scan.version = attrs.get(u"version")
|
||||
elif name == u"host":
|
||||
assert self.parent_element() == u"nmaprun"
|
||||
|
||||
@@ -48,6 +48,14 @@ class scan_test(unittest.TestCase):
|
||||
self.assertEqual(len(host.ports), 6)
|
||||
self.assertEqual(set(host.extraports.items()), set([("filtered", 95), ("open|filtered", 99)]))
|
||||
|
||||
def test_nmaprun(self):
|
||||
"""Test that nmaprun information is recorded."""
|
||||
scan = Scan()
|
||||
scan.load_from_file("test-scans/empty.xml")
|
||||
self.assertEqual(scan.scanner, u"nmap")
|
||||
self.assertEqual(scan.version, u"4.90RC2")
|
||||
self.assertEqual(scan.args, u"nmap -oX empty.xml -p 1-100")
|
||||
|
||||
def test_addresses(self):
|
||||
"""Test that addresses are recorded."""
|
||||
scan = Scan()
|
||||
|
||||
Reference in New Issue
Block a user