commit c2e92a8940d68478e622bd312501d577cd22474e
parent 3c30427e0352c5b4e43089b7892a399b00df9f86
Author: James Alexander Shield <james.shield@zoodata.com.au>
Date: Sun, 5 Jul 2020 20:16:46 +0800
Port to Python 3
Diffstat:
M | docopt.py | | | 44 | ++++++++++++++++++++++---------------------- |
M | nmap-scan.py | | | 31 | ++++++++++++++++++------------- |
2 files changed, 40 insertions(+), 35 deletions(-)
diff --git a/docopt.py b/docopt.py
@@ -81,7 +81,7 @@ def transform(pattern):
while groups:
children = groups.pop(0)
parents = [Required, Optional, OptionsShortcut, Either, OneOrMore]
- if any(t in map(type, children) for t in parents):
+ if any(t in list(map(type, children)) for t in parents):
child = [c for c in children if type(c) in parents][0]
children.remove(child)
if type(child) is Either:
@@ -179,19 +179,19 @@ class Command(Argument):
class Option(LeafPattern):
- def __init__(self, short=None, long=None, argcount=0, value=False):
+ def __init__(self, short=None, long_opt=None, argcount=0, value=False):
assert argcount in (0, 1)
- self.short, self.long, self.argcount = short, long, argcount
+ self.short, self.long_opt, self.argcount = short, long_opt, argcount
self.value = None if value is False and argcount else value
@classmethod
def parse(class_, option_description):
- short, long, argcount, value = None, None, 0, False
+ short, long_opt, argcount, value = None, None, 0, False
options, _, description = option_description.strip().partition(' ')
options = options.replace(',', ' ').replace('=', ' ')
for s in options.split():
if s.startswith('--'):
- long = s
+ long_opt = s
elif s.startswith('-'):
short = s
else:
@@ -199,7 +199,7 @@ class Option(LeafPattern):
if argcount:
matched = re.findall('\[default: (.*)\]', description, flags=re.I)
value = matched[0] if matched else None
- return class_(short, long, argcount, value)
+ return class_(short, long_opt, argcount, value)
def single_match(self, left):
for n, pattern in enumerate(left):
@@ -209,10 +209,10 @@ class Option(LeafPattern):
@property
def name(self):
- return self.long or self.short
+ return self.long_opt or self.short
def __repr__(self):
- return 'Option(%r, %r, %r, %r)' % (self.short, self.long,
+ return 'Option(%r, %r, %r, %r)' % (self.short, self.long_opt,
self.argcount, self.value)
@@ -300,31 +300,31 @@ class Tokens(list):
def parse_long(tokens, options):
"""long ::= '--' chars [ ( ' ' | '=' ) chars ] ;"""
- long, eq, value = tokens.move().partition('=')
- assert long.startswith('--')
+ long_opt, eq, value = tokens.move().partition('=')
+ assert long_opt.startswith('--')
value = None if eq == value == '' else value
- similar = [o for o in options if o.long == long]
+ similar = [o for o in options if o.long_opt == long_opt]
if tokens.error is DocoptExit and similar == []: # if no exact match
- similar = [o for o in options if o.long and o.long.startswith(long)]
+ similar = [o for o in options if o.long_opt and o.long_opt.startswith(long_opt)]
if len(similar) > 1: # might be simply specified ambiguously 2+ times?
raise tokens.error('%s is not a unique prefix: %s?' %
- (long, ', '.join(o.long for o in similar)))
+ (long_opt, ', '.join(o.long_opt for o in similar)))
elif len(similar) < 1:
argcount = 1 if eq == '=' else 0
- o = Option(None, long, argcount)
+ o = Option(None, long_opt, argcount)
options.append(o)
if tokens.error is DocoptExit:
- o = Option(None, long, argcount, value if argcount else True)
+ o = Option(None, long_opt, argcount, value if argcount else True)
else:
- o = Option(similar[0].short, similar[0].long,
+ o = Option(similar[0].short, similar[0].long_opt,
similar[0].argcount, similar[0].value)
if o.argcount == 0:
if value is not None:
- raise tokens.error('%s must not have an argument' % o.long)
+ raise tokens.error('%s must not have an argument' % o.long_opt)
else:
if value is None:
if tokens.current() in [None, '--']:
- raise tokens.error('%s requires argument' % o.long)
+ raise tokens.error('%s requires argument' % o.long_opt)
value = tokens.move()
if tokens.error is DocoptExit:
o.value = value if value is not None else True
@@ -349,7 +349,7 @@ def parse_shorts(tokens, options):
if tokens.error is DocoptExit:
o = Option(short, None, 0, True)
else: # why copying is necessary here?
- o = Option(short, similar[0].long,
+ o = Option(short, similar[0].long_opt,
similar[0].argcount, similar[0].value)
value = None
if o.argcount != 0:
@@ -475,7 +475,7 @@ def formal_usage(section):
def extras(help, version, options, doc):
if help and any((o.name in ('-h', '--help')) and o.value for o in options):
- print(doc.strip("\n"))
+ print((doc.strip("\n")))
sys.exit()
if version and any(o.name == '--version' and o.value for o in options):
print(version)
@@ -484,7 +484,7 @@ def extras(help, version, options, doc):
class Dict(dict):
def __repr__(self):
- return '{%s}' % ',\n '.join('%r: %r' % i for i in sorted(self.items()))
+ return '{%s}' % ',\n '.join('%r: %r' % i for i in self.items())
def docopt(doc, argv=None, help=True, version=None, options_first=False):
@@ -572,7 +572,7 @@ def docopt(doc, argv=None, help=True, version=None, options_first=False):
doc_options = parse_defaults(doc)
options_shortcut.children = list(set(doc_options) - pattern_options)
#if any_options:
- # options_shortcut.children += [Option(o.short, o.long, o.argcount)
+ # options_shortcut.children += [Option(o.short, o.long_opt, o.argcount)
# for o in argv if type(o) is Option]
extras(help, version, argv, doc)
matched, left, collected = pattern.fix().match(argv)
diff --git a/nmap-scan.py b/nmap-scan.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python
+#! /usr/bin/env python3
"""
Usage: nmap-scan [options] <network>
@@ -24,6 +24,8 @@ import datetime
import os
import sys
+from pprint import pprint
+
if os.name == 'posix' and sys.version_info[0] < 3:
import subprocess32 as subprocess
from subprocess32 import CalledProcessError
@@ -34,7 +36,7 @@ out = ""
def debug(msg, obj):
if obj is not None:
- print "DEBUG: {0} {1}\n".format(msg, pprint(obj))
+ print("DEBUG: {0} {1}\n".format(msg, pprint(obj)))
def run_nmap(net):
try:
@@ -61,10 +63,13 @@ def parsexml(f):
if _address_type == 'mac':
_macaddress = addr.get('addr')
_vendor = addr.get('vendor')
- if (args['--snmp']):
+ if args["--snmp"]:
if debug:
- print("Run SNMPGET for {}".format(_ipaddress))
- varBind = snmpget(_ipaddress)
+ print("Run SNMPGET for {}".format(_ipaddress))
+ varBind = snmpget(_ipaddress)
+
+
+
hostname = host.find("./hostnames/hostname").get('name') if ET.iselement(host.find("./hostnames/hostname")) else _ipaskey
# Per Host
_host[_ipaskey] = { '_id': _ipaskey, 'name': hostname, 'ip': _ipaddress, 'mac': _macaddress, 'vendor': _vendor}
@@ -96,7 +101,7 @@ def parsexml(f):
'product' : service.get("product"),
'service_name' : service.get("name"),}
- if port.get("portid") not in _services.values():
+ if port.get("portid") not in list(_services.values()):
_services.setdefault('services',[]).append(_service)
@@ -123,28 +128,28 @@ def snmpget(host):
# Check for errors and print out results
if errorIndication:
- print("Found ErrorI: {}".format(errI))
+ print(("Found ErrorI: {}".format(errI)))
return None
elif errorStatus:
errS = errorStatus
- print("Found ErrorS: {}".format(errorStatus))
+ print(("Found ErrorS: {}".format(errorStatus)))
return None
else:
for v in varBinds:
if debug:
- print("Varbinds: {}".format(pprint(varBinds)))
+ print(("Varbinds: {}".format(pprint(varBinds))))
# print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
return varBinds
def print_hosts(collection):
- for k,v in collection.iteritems():
- print "%s\t%s" % (v['ip'],v['name'])
+ for k,v in collection.items():
+ print("%s\t%s" % (v['ip'],v['name']))
def print_ansible(collection):
- print "[hosts]"
+ print("[hosts]")
for i in collection:
- print "%s\tansible_ssh_user=%s\tansible_ssh_pass=%s" % (i, 'root', '#password#')
+ print("%s\tansible_ssh_user=%s\tansible_ssh_pass=%s" % (i, 'root', '#password#'))
def print_raw(collection):
pprint(collection)