Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 702288 | Differences between
and this patch

Collapse All | Expand All

(-)a/.travis.yml (-1 / +7 lines)
Lines 4-10 compiler: Link Here
4
  - clang
4
  - clang
5
# Change this to your needs
5
# Change this to your needs
6
sudo: false
6
sudo: false
7
script: mkdir /tmp/n && ./configure $SSL_FLAG $LUA_FLAG --prefix=/tmp/n && make && make check && make install && /tmp/n/bin/nmap -A localhost
7
script:
8
  - "mkdir /tmp/n"
9
  - "./configure $SSL_FLAG $LUA_FLAG --prefix=/tmp/n"
10
  - "make"
11
  - "make check"
12
  - "make install"
13
  - "/tmp/n/bin/nmap -A localhost"
8
14
9
env:
15
env:
10
  - SSL_FLAG="--without-openssl" LUA_FLAG="--without-liblua"
16
  - SSL_FLAG="--without-openssl" LUA_FLAG="--without-liblua"
(-)a/Makefile.in (-2 / +4 lines)
Lines 35-40 ZENMAPDIR = @ZENMAPDIR@ Link Here
35
NDIFFDIR = @NDIFFDIR@
35
NDIFFDIR = @NDIFFDIR@
36
NPINGDIR = @NPINGDIR@
36
NPINGDIR = @NPINGDIR@
37
PYTHON = @PYTHON@
37
PYTHON = @PYTHON@
38
PYTHON3 = /usr/bin/env python3
38
DEFS = @DEFS@ -DNMAP_PLATFORM=\"$(NMAP_PLATFORM)\" -DNMAPDATADIR=\"$(nmapdatadir)\"
39
DEFS = @DEFS@ -DNMAP_PLATFORM=\"$(NMAP_PLATFORM)\" -DNMAPDATADIR=\"$(nmapdatadir)\"
39
# With GCC, add extra security checks to source code.
40
# With GCC, add extra security checks to source code.
40
# http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html
41
# http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html
Lines 368-373 tests/check_dns: $(OBJS) Link Here
368
# this as the location of the interpreter whenever we're not doing a
369
# this as the location of the interpreter whenever we're not doing a
369
# local installation.
370
# local installation.
370
DEFAULT_PYTHON_PATH = /usr/bin/env python
371
DEFAULT_PYTHON_PATH = /usr/bin/env python
372
DEFAULT_PYTHON3_PATH = /usr/bin/env python3
371
373
372
build-zenmap: $(ZENMAPDIR)/setup.py $(ZENMAPDIR)/zenmapCore/Version.py
374
build-zenmap: $(ZENMAPDIR)/setup.py $(ZENMAPDIR)/zenmapCore/Version.py
373
# When DESTDIR is defined, assume we're building an executable
375
# When DESTDIR is defined, assume we're building an executable
Lines 388-394 install-zenmap: $(ZENMAPDIR)/setup.py Link Here
388
	ln -sf zenmap $(DESTDIR)$(bindir)/xnmap
390
	ln -sf zenmap $(DESTDIR)$(bindir)/xnmap
389
391
390
build-ndiff:
392
build-ndiff:
391
	cd $(NDIFFDIR) && $(PYTHON) setup.py build $(if $(DESTDIR),--executable "$(DEFAULT_PYTHON_PATH)")
393
	cd $(NDIFFDIR) && $(PYTHON) setup.py build $(if $(DESTDIR),--executable "$(DEFAULT_PYTHON3_PATH)")
392
394
393
build-nping: $(NPINGDIR)/Makefile build-nbase build-nsock build-netutil $(NPINGDIR)/nping.h @DNET_BUILD@ @PCAP_BUILD@
395
build-nping: $(NPINGDIR)/Makefile build-nbase build-nsock build-netutil $(NPINGDIR)/nping.h @DNET_BUILD@ @PCAP_BUILD@
394
	@cd $(NPINGDIR) && $(MAKE)
396
	@cd $(NPINGDIR) && $(MAKE)
Lines 458-464 check-ncat: Link Here
458
	@cd $(NCATDIR) && $(MAKE) check
460
	@cd $(NCATDIR) && $(MAKE) check
459
461
460
check-ndiff:
462
check-ndiff:
461
	@cd $(NDIFFDIR) && $(PYTHON) ndifftest.py
463
	@cd $(NDIFFDIR) && $(PYTHON3) ndifftest.py
462
464
463
check-nsock:
465
check-nsock:
464
	@cd $(NSOCKDIR)/src && $(MAKE) check
466
	@cd $(NSOCKDIR)/src && $(MAKE) check
(-)a/ndiff/ndiff.py (-249 / +246 lines)
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":
(-)a/ndiff/ndifftest.py (-47 / +47 lines)
Lines 1-4 Link Here
1
#!/usr/bin/env python
1
#!/usr/bin/env python3
2
2
3
# Unit tests for Ndiff.
3
# Unit tests for Ndiff.
4
4
Lines 22-28 for x in dir(ndiff): Link Here
22
sys.dont_write_bytecode = dont_write_bytecode
22
sys.dont_write_bytecode = dont_write_bytecode
23
del dont_write_bytecode
23
del dont_write_bytecode
24
24
25
import StringIO
25
import io
26
26
27
27
28
class scan_test(unittest.TestCase):
28
class scan_test(unittest.TestCase):
Lines 52-58 class scan_test(unittest.TestCase): Link Here
52
        scan.load_from_file("test-scans/single.xml")
52
        scan.load_from_file("test-scans/single.xml")
53
        host = scan.hosts[0]
53
        host = scan.hosts[0]
54
        self.assertEqual(len(host.ports), 5)
54
        self.assertEqual(len(host.ports), 5)
55
        self.assertEqual(host.extraports.items(), [("filtered", 95)])
55
        self.assertEqual(list(host.extraports.items()), [("filtered", 95)])
56
56
57
    def test_extraports_multi(self):
57
    def test_extraports_multi(self):
58
        """Test that the correct number of known ports is returned when there
58
        """Test that the correct number of known ports is returned when there
Lines 68-76 class scan_test(unittest.TestCase): Link Here
68
        """Test that nmaprun information is recorded."""
68
        """Test that nmaprun information is recorded."""
69
        scan = Scan()
69
        scan = Scan()
70
        scan.load_from_file("test-scans/empty.xml")
70
        scan.load_from_file("test-scans/empty.xml")
71
        self.assertEqual(scan.scanner, u"nmap")
71
        self.assertEqual(scan.scanner, "nmap")
72
        self.assertEqual(scan.version, u"4.90RC2")
72
        self.assertEqual(scan.version, "4.90RC2")
73
        self.assertEqual(scan.args, u"nmap -oX empty.xml -p 1-100")
73
        self.assertEqual(scan.args, "nmap -oX empty.xml -p 1-100")
74
74
75
    def test_addresses(self):
75
    def test_addresses(self):
76
        """Test that addresses are recorded."""
76
        """Test that addresses are recorded."""
Lines 84-90 class scan_test(unittest.TestCase): Link Here
84
        scan = Scan()
84
        scan = Scan()
85
        scan.load_from_file("test-scans/simple.xml")
85
        scan.load_from_file("test-scans/simple.xml")
86
        host = scan.hosts[0]
86
        host = scan.hosts[0]
87
        self.assertEqual(host.hostnames, [u"scanme.nmap.org"])
87
        self.assertEqual(host.hostnames, ["scanme.nmap.org"])
88
88
89
    def test_os(self):
89
    def test_os(self):
90
        """Test that OS information is recorded."""
90
        """Test that OS information is recorded."""
Lines 99-105 class scan_test(unittest.TestCase): Link Here
99
        scan.load_from_file("test-scans/complex.xml")
99
        scan.load_from_file("test-scans/complex.xml")
100
        host = scan.hosts[0]
100
        host = scan.hosts[0]
101
        self.assertTrue(len(host.script_results) > 0)
101
        self.assertTrue(len(host.script_results) > 0)
102
        self.assertTrue(len(host.ports[(22, u"tcp")].script_results) > 0)
102
        self.assertTrue(len(host.ports[(22, "tcp")].script_results) > 0)
103
103
104
# This test is commented out because Nmap XML doesn't store any information
104
# This test is commented out because Nmap XML doesn't store any information
105
# about down hosts, not even the fact that they are down. Recovering the list
105
# about down hosts, not even the fact that they are down. Recovering the list
Lines 128-143 class host_test(unittest.TestCase): Link Here
128
128
129
    def test_format_name(self):
129
    def test_format_name(self):
130
        h = Host()
130
        h = Host()
131
        self.assertTrue(isinstance(h.format_name(), basestring))
131
        self.assertTrue(isinstance(h.format_name(), str))
132
        h.add_address(IPv4Address(u"127.0.0.1"))
132
        h.add_address(IPv4Address("127.0.0.1"))
133
        self.assertTrue(u"127.0.0.1" in h.format_name())
133
        self.assertTrue("127.0.0.1" in h.format_name())
134
        h.add_address(IPv6Address("::1"))
134
        h.add_address(IPv6Address("::1"))
135
        self.assertTrue(u"127.0.0.1" in h.format_name())
135
        self.assertTrue("127.0.0.1" in h.format_name())
136
        self.assertTrue(u"::1" in h.format_name())
136
        self.assertTrue("::1" in h.format_name())
137
        h.add_hostname(u"localhost")
137
        h.add_hostname("localhost")
138
        self.assertTrue(u"127.0.0.1" in h.format_name())
138
        self.assertTrue("127.0.0.1" in h.format_name())
139
        self.assertTrue(u"::1" in h.format_name())
139
        self.assertTrue("::1" in h.format_name())
140
        self.assertTrue(u"localhost" in h.format_name())
140
        self.assertTrue("localhost" in h.format_name())
141
141
142
    def test_empty_get_port(self):
142
    def test_empty_get_port(self):
143
        h = Host()
143
        h = Host()
Lines 197-204 class host_test(unittest.TestCase): Link Here
197
        h = s.hosts[0]
197
        h = s.hosts[0]
198
        self.assertEqual(len(h.ports), 5)
198
        self.assertEqual(len(h.ports), 5)
199
        self.assertEqual(len(h.extraports), 1)
199
        self.assertEqual(len(h.extraports), 1)
200
        self.assertEqual(h.extraports.keys()[0], u"filtered")
200
        self.assertEqual(list(h.extraports.keys())[0], "filtered")
201
        self.assertEqual(h.extraports.values()[0], 95)
201
        self.assertEqual(list(h.extraports.values())[0], 95)
202
        self.assertEqual(h.state, "up")
202
        self.assertEqual(h.state, "up")
203
203
204
204
Lines 241-253 class port_test(unittest.TestCase): Link Here
241
    """Test the Port class."""
241
    """Test the Port class."""
242
    def test_spec_string(self):
242
    def test_spec_string(self):
243
        p = Port((10, "tcp"))
243
        p = Port((10, "tcp"))
244
        self.assertEqual(p.spec_string(), u"10/tcp")
244
        self.assertEqual(p.spec_string(), "10/tcp")
245
        p = Port((100, "ip"))
245
        p = Port((100, "ip"))
246
        self.assertEqual(p.spec_string(), u"100/ip")
246
        self.assertEqual(p.spec_string(), "100/ip")
247
247
248
    def test_state_string(self):
248
    def test_state_string(self):
249
        p = Port((10, "tcp"))
249
        p = Port((10, "tcp"))
250
        self.assertEqual(p.state_string(), u"unknown")
250
        self.assertEqual(p.state_string(), "unknown")
251
251
252
252
253
class service_test(unittest.TestCase):
253
class service_test(unittest.TestCase):
Lines 255-301 class service_test(unittest.TestCase): Link Here
255
    def test_compare(self):
255
    def test_compare(self):
256
        """Test that services with the same contents compare equal."""
256
        """Test that services with the same contents compare equal."""
257
        a = Service()
257
        a = Service()
258
        a.name = u"ftp"
258
        a.name = "ftp"
259
        a.product = u"FooBar FTP"
259
        a.product = "FooBar FTP"
260
        a.version = u"1.1.1"
260
        a.version = "1.1.1"
261
        a.tunnel = u"ssl"
261
        a.tunnel = "ssl"
262
        self.assertEqual(a, a)
262
        self.assertEqual(a, a)
263
        b = Service()
263
        b = Service()
264
        b.name = u"ftp"
264
        b.name = "ftp"
265
        b.product = u"FooBar FTP"
265
        b.product = "FooBar FTP"
266
        b.version = u"1.1.1"
266
        b.version = "1.1.1"
267
        b.tunnel = u"ssl"
267
        b.tunnel = "ssl"
268
        self.assertEqual(a, b)
268
        self.assertEqual(a, b)
269
        b.name = u"http"
269
        b.name = "http"
270
        self.assertNotEqual(a, b)
270
        self.assertNotEqual(a, b)
271
        c = Service()
271
        c = Service()
272
        self.assertNotEqual(a, c)
272
        self.assertNotEqual(a, c)
273
273
274
    def test_tunnel(self):
274
    def test_tunnel(self):
275
        serv = Service()
275
        serv = Service()
276
        serv.name = u"http"
276
        serv.name = "http"
277
        serv.tunnel = u"ssl"
277
        serv.tunnel = "ssl"
278
        self.assertEqual(serv.name_string(), u"ssl/http")
278
        self.assertEqual(serv.name_string(), "ssl/http")
279
279
280
    def test_version_string(self):
280
    def test_version_string(self):
281
        serv = Service()
281
        serv = Service()
282
        serv.product = u"FooBar"
282
        serv.product = "FooBar"
283
        self.assertTrue(len(serv.version_string()) > 0)
283
        self.assertTrue(len(serv.version_string()) > 0)
284
        serv = Service()
284
        serv = Service()
285
        serv.version = u"1.2.3"
285
        serv.version = "1.2.3"
286
        self.assertTrue(len(serv.version_string()) > 0)
286
        self.assertTrue(len(serv.version_string()) > 0)
287
        serv = Service()
287
        serv = Service()
288
        serv.extrainfo = u"misconfigured"
288
        serv.extrainfo = "misconfigured"
289
        self.assertTrue(len(serv.version_string()) > 0)
289
        self.assertTrue(len(serv.version_string()) > 0)
290
        serv = Service()
290
        serv = Service()
291
        serv.product = u"FooBar"
291
        serv.product = "FooBar"
292
        serv.version = u"1.2.3"
292
        serv.version = "1.2.3"
293
        # Must match Nmap output.
293
        # Must match Nmap output.
294
        self.assertEqual(serv.version_string(),
294
        self.assertEqual(serv.version_string(),
295
                u"%s %s" % (serv.product, serv.version))
295
                "%s %s" % (serv.product, serv.version))
296
        serv.extrainfo = u"misconfigured"
296
        serv.extrainfo = "misconfigured"
297
        self.assertEqual(serv.version_string(),
297
        self.assertEqual(serv.version_string(),
298
                u"%s %s (%s)" % (serv.product, serv.version, serv.extrainfo))
298
                "%s %s (%s)" % (serv.product, serv.version, serv.extrainfo))
299
299
300
300
301
class ScanDiffSub(ScanDiff):
301
class ScanDiffSub(ScanDiff):
Lines 703-709 class scan_diff_xml_test(unittest.TestCase): Link Here
703
        a.load_from_file("test-scans/empty.xml")
703
        a.load_from_file("test-scans/empty.xml")
704
        b = Scan()
704
        b = Scan()
705
        b.load_from_file("test-scans/simple.xml")
705
        b.load_from_file("test-scans/simple.xml")
706
        f = StringIO.StringIO()
706
        f = io.StringIO()
707
        self.scan_diff = ScanDiffXML(a, b, f)
707
        self.scan_diff = ScanDiffXML(a, b, f)
708
        self.scan_diff.output()
708
        self.scan_diff.output()
709
        self.xml = f.getvalue()
709
        self.xml = f.getvalue()
Lines 712-719 class scan_diff_xml_test(unittest.TestCase): Link Here
712
    def test_well_formed(self):
712
    def test_well_formed(self):
713
        try:
713
        try:
714
            document = xml.dom.minidom.parseString(self.xml)
714
            document = xml.dom.minidom.parseString(self.xml)
715
        except Exception, e:
715
        except Exception as e:
716
            self.fail(u"Parsing XML diff output caused the exception: %s"
716
            self.fail("Parsing XML diff output caused the exception: %s"
717
                    % str(e))
717
                    % str(e))
718
718
719
719
Lines 739-746 def host_apply_diff(host, diff): Link Here
739
        host.os = diff.host_b.os[:]
739
        host.os = diff.host_b.os[:]
740
740
741
    if diff.extraports_changed:
741
    if diff.extraports_changed:
742
        for state in host.extraports.keys():
742
        for state in list(host.extraports.keys()):
743
            for port in host.ports.values():
743
            for port in list(host.ports.values()):
744
                if port.state == state:
744
                if port.state == state:
745
                    del host.ports[port.spec]
745
                    del host.ports[port.spec]
746
        host.extraports = diff.host_b.extraports.copy()
746
        host.extraports = diff.host_b.extraports.copy()
(-)a/ndiff/scripts/ndiff (-7 / +7 lines)
Lines 1-4 Link Here
1
#!/usr/bin/env python
1
#!/usr/bin/env python3
2
2
3
# Ndiff
3
# Ndiff
4
#
4
#
Lines 67-81 if INSTALL_LIB is not None and is_secure_dir(INSTALL_LIB): Link Here
67
67
68
try:
68
try:
69
    import ndiff
69
    import ndiff
70
except ImportError, e:
70
except ImportError as e:
71
    print >> sys.stderr, """\
71
    print("""\
72
Could not import the ndiff module: %s.
72
Could not import the ndiff module: %s.
73
I checked in these directories:""" % repr(e.message)
73
I checked in these directories:""" % repr(e), file=sys.stderr)
74
    for dir in sys.path:
74
    for dir in sys.path:
75
        print >> sys.stderr, "    %s" % dir
75
        print("    %s" % dir, file=sys.stderr)
76
    print >> sys.stderr, """\
76
    print("""\
77
If you installed Ndiff in another directory, you may have to add the
77
If you installed Ndiff in another directory, you may have to add the
78
modules directory to the PYTHONPATH environment variable."""
78
modules directory to the PYTHONPATH environment variable.""", file=sys.stderr)
79
    sys.exit(1)
79
    sys.exit(1)
80
80
81
import ndiff
81
import ndiff
(-)a/ndiff/setup.py (-17 / +17 lines)
Lines 94-100 class checked_install(distutils.command.install.install): Link Here
94
        self.saved_prefix = sys.prefix
94
        self.saved_prefix = sys.prefix
95
        try:
95
        try:
96
            distutils.command.install.install.finalize_options(self)
96
            distutils.command.install.install.finalize_options(self)
97
        except distutils.errors.DistutilsPlatformError, e:
97
        except distutils.errors.DistutilsPlatformError as e:
98
            raise distutils.errors.DistutilsPlatformError(str(e) + """
98
            raise distutils.errors.DistutilsPlatformError(str(e) + """
99
Installing your distribution's python-dev package may solve this problem.""")
99
Installing your distribution's python-dev package may solve this problem.""")
100
100
Lines 155-167 Installing your distribution's python-dev package may solve this problem.""") Link Here
155
#!/usr/bin/env python
155
#!/usr/bin/env python
156
import errno, os, os.path, sys
156
import errno, os, os.path, sys
157
157
158
print 'Uninstall %(name)s'
158
print('Uninstall %(name)s')
159
159
160
answer = raw_input('Are you sure that you want to uninstall '
160
answer = raw_input('Are you sure that you want to uninstall '
161
    '%(name)s (yes/no) ')
161
    '%(name)s (yes/no) ')
162
162
163
if answer != 'yes' and answer != 'y':
163
if answer != 'yes' and answer != 'y':
164
    print 'Not uninstalling.'
164
    print('Not uninstalling.')
165
    sys.exit(0)
165
    sys.exit(0)
166
166
167
""" % {'name': APP_NAME}
167
""" % {'name': APP_NAME}
Lines 177-184 if answer != 'yes' and answer != 'y': Link Here
177
                    # This should never happen (everything gets installed
177
                    # This should never happen (everything gets installed
178
                    # inside the root), but if it does, be safe and don't
178
                    # inside the root), but if it does, be safe and don't
179
                    # delete anything.
179
                    # delete anything.
180
                    uninstaller += ("print '%s was not installed inside "
180
                    uninstaller += ("print('%s was not installed inside "
181
                        "the root %s; skipping.'\n" % (output, self.root))
181
                        "the root %s; skipping.')\n" % (output, self.root))
182
                    continue
182
                    continue
183
                output = path_strip_prefix(output, self.root)
183
                output = path_strip_prefix(output, self.root)
184
                assert os.path.isabs(output)
184
                assert os.path.isabs(output)
Lines 202-225 for path in INSTALLED_FILES: Link Here
202
        dirs.append(path)
202
        dirs.append(path)
203
# Delete the files.
203
# Delete the files.
204
for file in files:
204
for file in files:
205
    print "Removing '%s'." % file
205
    print("Removing '%s'." % file)
206
    try:
206
    try:
207
        os.remove(file)
207
        os.remove(file)
208
    except OSError, e:
208
    except OSError as e:
209
        print >> sys.stderr, '  Error: %s.' % str(e)
209
        print('  Error: %s.' % str(e), file=sys.stderr)
210
# Delete the directories. First reverse-sort the normalized paths by
210
# Delete the directories. First reverse-sort the normalized paths by
211
# length so that child directories are deleted before their parents.
211
# length so that child directories are deleted before their parents.
212
dirs = [os.path.normpath(dir) for dir in dirs]
212
dirs = [os.path.normpath(dir) for dir in dirs]
213
dirs.sort(key = len, reverse = True)
213
dirs.sort(key = len, reverse = True)
214
for dir in dirs:
214
for dir in dirs:
215
    try:
215
    try:
216
        print "Removing the directory '%s'." % dir
216
        print("Removing the directory '%s'." % dir)
217
        os.rmdir(dir)
217
        os.rmdir(dir)
218
    except OSError, e:
218
    except OSError as e:
219
        if e.errno == errno.ENOTEMPTY:
219
        if e.errno == errno.ENOTEMPTY:
220
            print "Directory '%s' not empty; not removing." % dir
220
            print("Directory '%s' not empty; not removing." % dir)
221
        else:
221
        else:
222
            print >> sys.stderr, str(e)
222
            print(str(e), file=sys.stderr)
223
"""
223
"""
224
224
225
        uninstaller_file = open(uninstaller_filename, 'w')
225
        uninstaller_file = open(uninstaller_filename, 'w')
Lines 227-233 for dir in dirs: Link Here
227
        uninstaller_file.close()
227
        uninstaller_file.close()
228
228
229
        # Set exec bit for uninstaller
229
        # Set exec bit for uninstaller
230
        mode = ((os.stat(uninstaller_filename)[ST_MODE]) | 0555) & 07777
230
        mode = ((os.stat(uninstaller_filename)[ST_MODE]) | 0o555) & 0o7777
231
        os.chmod(uninstaller_filename, mode)
231
        os.chmod(uninstaller_filename, mode)
232
232
233
    def write_installed_files(self):
233
    def write_installed_files(self):
Lines 242-248 for dir in dirs: Link Here
242
        try:
242
        try:
243
            for output in self.get_installed_files():
243
            for output in self.get_installed_files():
244
                assert "\n" not in output
244
                assert "\n" not in output
245
                print >> f, output
245
                print(output, file=f)
246
        finally:
246
        finally:
247
            f.close()
247
            f.close()
248
248
Lines 266-272 class my_uninstall(distutils.cmd.Command): Link Here
266
        # Read the list of installed files.
266
        # Read the list of installed files.
267
        try:
267
        try:
268
            f = open(INSTALLED_FILES_NAME, "r")
268
            f = open(INSTALLED_FILES_NAME, "r")
269
        except IOError, e:
269
        except IOError as e:
270
            if e.errno == errno.ENOENT:
270
            if e.errno == errno.ENOENT:
271
                log.error("Couldn't open the installation record '%s'. "
271
                log.error("Couldn't open the installation record '%s'. "
272
                        "Have you installed yet?" % INSTALLED_FILES_NAME)
272
                        "Have you installed yet?" % INSTALLED_FILES_NAME)
Lines 289-295 class my_uninstall(distutils.cmd.Command): Link Here
289
            try:
289
            try:
290
                if not self.dry_run:
290
                if not self.dry_run:
291
                    os.remove(file)
291
                    os.remove(file)
292
            except OSError, e:
292
            except OSError as e:
293
                log.error(str(e))
293
                log.error(str(e))
294
        # Delete the directories. First reverse-sort the normalized paths by
294
        # Delete the directories. First reverse-sort the normalized paths by
295
        # length so that child directories are deleted before their parents.
295
        # length so that child directories are deleted before their parents.
Lines 300-306 class my_uninstall(distutils.cmd.Command): Link Here
300
                log.info("Removing the directory '%s'." % dir)
300
                log.info("Removing the directory '%s'." % dir)
301
                if not self.dry_run:
301
                if not self.dry_run:
302
                    os.rmdir(dir)
302
                    os.rmdir(dir)
303
            except OSError, e:
303
            except OSError as e:
304
                if e.errno == errno.ENOTEMPTY:
304
                if e.errno == errno.ENOTEMPTY:
305
                    log.info("Directory '%s' not empty; not removing." % dir)
305
                    log.info("Directory '%s' not empty; not removing." % dir)
306
                else:
306
                else:
(-)a/ndiff/test-scans/anonymize.py (-9 / +9 lines)
Lines 1-4 Link Here
1
#!/usr/bin/env python
1
#!/usr/bin/env python3
2
2
3
# Anonymize an Nmap XML file, replacing host name and IP addresses with random
3
# Anonymize an Nmap XML file, replacing host name and IP addresses with random
4
# anonymous ones. Anonymized names will be consistent between runs of the
4
# anonymous ones. Anonymized names will be consistent between runs of the
Lines 20-39 r = random.Random() Link Here
20
20
21
21
22
def hash(s):
22
def hash(s):
23
    digest = hashlib.sha512(s).hexdigest()
23
    digest = hashlib.sha512(s.encode()).hexdigest()
24
    return int(digest, 16)
24
    return int(digest, 16)
25
25
26
26
27
def anonymize_mac_address(addr):
27
def anonymize_mac_address(addr):
28
    r.seed(hash(addr))
28
    r.seed(hash(addr))
29
    nums = (0, 0, 0) + tuple(r.randrange(256) for i in range(3))
29
    nums = (0, 0, 0) + tuple(r.randrange(256) for i in range(3))
30
    return u":".join(u"%02X" % x for x in nums)
30
    return ":".join("%02X" % x for x in nums)
31
31
32
32
33
def anonymize_ipv4_address(addr):
33
def anonymize_ipv4_address(addr):
34
    r.seed(hash(addr))
34
    r.seed(hash(addr))
35
    nums = (10,) + tuple(r.randrange(256) for i in range(3))
35
    nums = (10,) + tuple(r.randrange(256) for i in range(3))
36
    return u".".join(unicode(x) for x in nums)
36
    return ".".join(str(x) for x in nums)
37
37
38
38
39
def anonymize_ipv6_address(addr):
39
def anonymize_ipv6_address(addr):
Lines 41-47 def anonymize_ipv6_address(addr): Link Here
41
    # RFC 4193.
41
    # RFC 4193.
42
    nums = (0xFD00 + r.randrange(256),)
42
    nums = (0xFD00 + r.randrange(256),)
43
    nums = nums + tuple(r.randrange(65536) for i in range(7))
43
    nums = nums + tuple(r.randrange(65536) for i in range(7))
44
    return u":".join("%04X" % x for x in nums)
44
    return ":".join("%04X" % x for x in nums)
45
45
46
# Maps to memoize address and host name conversions.
46
# Maps to memoize address and host name conversions.
47
hostname_map = {}
47
hostname_map = {}
Lines 54-64 def anonymize_hostname(name): Link Here
54
    LETTERS = "acbdefghijklmnopqrstuvwxyz"
54
    LETTERS = "acbdefghijklmnopqrstuvwxyz"
55
    r.seed(hash(name))
55
    r.seed(hash(name))
56
    length = r.randrange(5, 10)
56
    length = r.randrange(5, 10)
57
    prefix = u"".join(r.sample(LETTERS, length))
57
    prefix = "".join(r.sample(LETTERS, length))
58
    num = r.randrange(1000)
58
    num = r.randrange(1000)
59
    hostname_map[name] = u"%s-%d.example.com" % (prefix, num)
59
    hostname_map[name] = "%s-%d.example.com" % (prefix, num)
60
    if VERBOSE:
60
    if VERBOSE:
61
        print >> sys.stderr, "Replace %s with %s" % (name, hostname_map[name])
61
        print("Replace %s with %s" % (name, hostname_map[name]), file=sys.stderr)
62
    return hostname_map[name]
62
    return hostname_map[name]
63
63
64
mac_re = re.compile(r'\b([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}\b')
64
mac_re = re.compile(r'\b([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}\b')
Lines 78-84 def anonymize_address(addr): Link Here
78
    else:
78
    else:
79
        assert False
79
        assert False
80
    if VERBOSE:
80
    if VERBOSE:
81
        print >> sys.stderr, "Replace %s with %s" % (addr, address_map[addr])
81
        print("Replace %s with %s" % (addr, address_map[addr]), file=sys.stderr)
82
    return address_map[addr]
82
    return address_map[addr]
83
83
84
84

Return to bug 702288