Sitelet https://github.com/snerstack/python-libnmap/commit/8afdfd43ff76d23e0a043fbc2e7bdb750532dc2b
Skip to content

Commit 8afdfd4

Browse files
authored
Merge pull request savon-noir#114 from savon-noir/fix/coverage
Fix/coverage
2 parents ce38707 + f42fbbb commit 8afdfd4

7 files changed

Lines changed: 123 additions & 70 deletions

File tree

‎examples/proc_nmap_like.py‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ def do_scan(targets, options):
1212
rc = nmproc.run()
1313
if rc != 0:
1414
print("nmap scan failed: {0}".format(nmproc.stderr))
15-
print(type(nmproc.stdout))
1615

1716
try:
1817
parsed = NmapParser.parse(nmproc.stdout)

‎libnmap/parser.py‎

Lines changed: 67 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,28 @@ class NmapParser(object):
1818
@classmethod
1919
def parse(cls, nmap_data=None, data_type="XML", incomplete=False):
2020
"""
21-
Generic class method of NmapParser class.
21+
Generic class method of NmapParser class.
2222
23-
The data to be parsed does not need to be a complete nmap
24-
scan report. You can possibly give <hosts>...</hosts>
25-
or <port> XML tags.
23+
The data to be parsed does not need to be a complete nmap
24+
scan report. You can possibly give <hosts>...</hosts>
25+
or <port> XML tags.
2626
27-
:param nmap_data: any portion of nmap scan result. \
28-
nmap_data should always be a string representing a part \
29-
or a complete nmap scan report.
30-
:type nmap_data: string
27+
:param nmap_data: any portion of nmap scan result. \
28+
nmap_data should always be a string representing a part \
29+
or a complete nmap scan report.
30+
:type nmap_data: string
3131
32-
:param data_type: specifies the type of data to be parsed.
33-
:type data_type: string ("XML"|"JSON"|"YAML").
32+
:param data_type: specifies the type of data to be parsed.
33+
:type data_type: string ("XML"|"JSON"|"YAML").
3434
35-
:param incomplete: enable you to parse interrupted nmap scans \
36-
and/or incomplete nmap xml blocks by adding a </nmaprun> at \
37-
the end of the scan.
38-
:type incomplete: boolean
35+
:param incomplete: enable you to parse interrupted nmap scans \
36+
and/or incomplete nmap xml blocks by adding a </nmaprun> at \
37+
the end of the scan.
38+
:type incomplete: boolean
3939
40-
As of today, only XML parsing is supported.
40+
As of today, only XML parsing is supported.
4141
42-
:return: NmapObject (NmapHost, NmapService or NmapReport)
42+
:return: NmapObject (NmapHost, NmapService or NmapReport)
4343
"""
4444

4545
nmapobj = None
@@ -56,32 +56,32 @@ def parse(cls, nmap_data=None, data_type="XML", incomplete=False):
5656
@classmethod
5757
def _parse_xml(cls, nmap_data=None, incomplete=False):
5858
"""
59-
Protected class method used to process a specific data type.
60-
In this case: XML. This method is called by cls.parse class
61-
method and receives nmap scan results data (in XML).
59+
Protected class method used to process a specific data type.
60+
In this case: XML. This method is called by cls.parse class
61+
method and receives nmap scan results data (in XML).
6262
63-
:param nmap_data: any portion of nmap scan result can be given \
64-
as argument. nmap_data should always be a string representing \
65-
a part or a complete nmap scan report.
66-
:type nmap_data: string
63+
:param nmap_data: any portion of nmap scan result can be given \
64+
as argument. nmap_data should always be a string representing \
65+
a part or a complete nmap scan report.
66+
:type nmap_data: string
6767
68-
This method checks which portion of a nmap scan is given \
69-
as argument.
70-
It could be:
68+
This method checks which portion of a nmap scan is given \
69+
as argument.
70+
It could be:
7171
72-
1. a full nmap scan report;
73-
2. a scanned host: <host> tag in a nmap scan report
74-
3. a scanned service: <port> tag
75-
4. a list of hosts: <hosts/> tag (TODO)
76-
5. a list of ports: <ports/> tag
72+
1. a full nmap scan report;
73+
2. a scanned host: <host> tag in a nmap scan report
74+
3. a scanned service: <port> tag
75+
4. a list of hosts: <hosts/> tag (TODO)
76+
5. a list of ports: <ports/> tag
7777
78-
:param incomplete: enable you to parse interrupted nmap scans \
79-
and/or incomplete nmap xml blocks by adding a </nmaprun> at \
80-
the end of the scan.
81-
:type incomplete: boolean
78+
:param incomplete: enable you to parse interrupted nmap scans \
79+
and/or incomplete nmap xml blocks by adding a </nmaprun> at \
80+
the end of the scan.
81+
:type incomplete: boolean
8282
83-
:return: NmapObject (NmapHost, NmapService or NmapReport) \
84-
or a list of NmapObject
83+
:return: NmapObject (NmapHost, NmapService or NmapReport) \
84+
or a list of NmapObject
8585
"""
8686

8787
if not nmap_data:
@@ -159,22 +159,22 @@ def _parse_xml_report(cls, root=None):
159159
@classmethod
160160
def parse_fromstring(cls, nmap_data, data_type="XML", incomplete=False):
161161
"""
162-
Call generic cls.parse() method and ensure that a string is \
163-
passed on as argument. If not, an exception is raised.
162+
Call generic cls.parse() method and ensure that a string is \
163+
passed on as argument. If not, an exception is raised.
164164
165-
:param nmap_data: Same as for parse(), any portion of nmap scan. \
166-
Reports could be passed as argument. Data type _must_ be a string.
165+
:param nmap_data: Same as for parse(), any portion of nmap scan. \
166+
Reports could be passed as argument. Data type _must_ be a string.
167167
168-
:type nmap_data: string
168+
:type nmap_data: string
169169
170-
:param data_type: Specifies the type of data passed on as argument.
170+
:param data_type: Specifies the type of data passed on as argument.
171171
172-
:param incomplete: enable you to parse interrupted nmap scans \
173-
and/or incomplete nmap xml blocks by adding a </nmaprun> at \
174-
the end of the scan.
175-
:type incomplete: boolean
172+
:param incomplete: enable you to parse interrupted nmap scans \
173+
and/or incomplete nmap xml blocks by adding a </nmaprun> at \
174+
the end of the scan.
175+
:type incomplete: boolean
176176
177-
:return: NmapObject
177+
:return: NmapObject
178178
"""
179179

180180
if not isinstance(nmap_data, str):
@@ -189,22 +189,22 @@ def parse_fromfile(
189189
cls, nmap_report_path, data_type="XML", incomplete=False
190190
):
191191
"""
192-
Call generic cls.parse() method and ensure that a correct file \
193-
path is given as argument. If not, an exception is raised.
192+
Call generic cls.parse() method and ensure that a correct file \
193+
path is given as argument. If not, an exception is raised.
194194
195-
:param nmap_data: Same as for parse(). \
196-
Any portion of nmap scan reports could be passed as argument. \
197-
Data type _must be a valid path to a file containing \
198-
nmap scan results.
195+
:param nmap_data: Same as for parse(). \
196+
Any portion of nmap scan reports could be passed as argument. \
197+
Data type _must be a valid path to a file containing \
198+
nmap scan results.
199199
200-
:param data_type: Specifies the type of serialization in the file.
200+
:param data_type: Specifies the type of serialization in the file.
201201
202-
:param incomplete: enable you to parse interrupted nmap scans \
203-
and/or incomplete nmap xml blocks by adding a </nmaprun> at \
204-
the end of the scan.
205-
:type incomplete: boolean
202+
:param incomplete: enable you to parse interrupted nmap scans \
203+
and/or incomplete nmap xml blocks by adding a </nmaprun> at \
204+
the end of the scan.
205+
:type incomplete: boolean
206206
207-
:return: NmapObject
207+
:return: NmapObject
208208
"""
209209

210210
try:
@@ -218,15 +218,15 @@ def parse_fromfile(
218218
@classmethod
219219
def parse_fromdict(cls, rdict):
220220
"""
221-
Strange method which transforms a python dict \
222-
representation of a NmapReport and turns it into an \
223-
NmapReport object. \
224-
Needs to be reviewed and possibly removed.
221+
Strange method which transforms a python dict \
222+
representation of a NmapReport and turns it into an \
223+
NmapReport object. \
224+
Needs to be reviewed and possibly removed.
225225
226-
:param rdict: python dict representation of an NmapReport
227-
:type rdict: dict
226+
:param rdict: python dict representation of an NmapReport
227+
:type rdict: dict
228228
229-
:return: NmapReport
229+
:return: NmapReport
230230
"""
231231

232232
nreport = {}

‎libnmap/reportjson.py‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@
1515

1616

1717
class ReportEncoder(json.JSONEncoder):
18+
"""
19+
ReportEncoder is a internal class used mostly by plugins to convert
20+
NmapReport objects in json format.
21+
e.g.:
22+
nmapreport_obj = NmapParser.parse_fromfile(
23+
"libnmap/test/files/1_hosts.xml"
24+
)
25+
nmapreport_json = json.dumps(nmapreport_obj, cls=ReportEncoder)
26+
"""
1827
def default(self, obj):
1928
otype = {
2029
"NmapHost": NmapHost,
@@ -33,6 +42,12 @@ def default(self, obj):
3342

3443

3544
class ReportDecoder(json.JSONDecoder):
45+
"""
46+
ReportDecoder is a internal class used mostly by plugins to convert
47+
json nmap report in to NmapReport objects.
48+
e.g.:
49+
nmap_report_obj = json.loads(nmap_report_json, cls=ReportDecoder)
50+
"""
3651
def decode(self, json_str):
3752
r = NmapParser.parse_fromdict(json.loads(json_str))
3853
return r

‎libnmap/test/files/2_hosts.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"__NmapReport__": {"_nmaprun": {"scanner": "nmap", "args": "nmap -sS -vv -oX 2_hosts.xml localhost scanme.nmap.org", "start": "1361737906", "startstr": "Sun Feb 24 21:31:46 2013", "version": "5.51", "xmloutputversion": "1.03"}, "_scaninfo": {"type": "syn", "protocol": "tcp", "numservices": "1000", "services": "1,3-4,6-7,9,13,17,19-26,30,32-33,37,42-43,49,53,70,79-85,88-90,99-100,106,109-111,113,119,125,135,139,143-144,146,161,163,179,199,211-212,222,254-256,259,264,280,301,306,311,340,366,389,406-407,416-417,425,427,443-445,458,464-465,481,497,500,512-515,524,541,543-545,548,554-555,563,587,593,616-617,625,631,636,646,648,666-668,683,687,691,700,705,711,714,720,722,726,749,765,777,783,787,800-801,808,843,873,880,888,898,900-903,911-912,981,987,990,992-993,995,999-1002,1007,1009-1011,1021-1100,1102,1104-1108,1110-1114,1117,1119,1121-1124,1126,1130-1132,1137-1138,1141,1145,1147-1149,1151-1152,1154,1163-1166,1169,1174-1175,1183,1185-1187,1192,1198-1199,1201,1213,1216-1218,1233-1234,1236,1244,1247-1248,1259,1271-1272,1277,1287,1296,1300-1301,1309-1311,1322,1328,1334,1352,1417,1433-1434,1443,1455,1461,1494,1500-1501,1503,1521,1524,1533,1556,1580,1583,1594,1600,1641,1658,1666,1687-1688,1700,1717-1721,1723,1755,1761,1782-1783,1801,1805,1812,1839-1840,1862-1864,1875,1900,1914,1935,1947,1971-1972,1974,1984,1998-2010,2013,2020-2022,2030,2033-2035,2038,2040-2043,2045-2049,2065,2068,2099-2100,2103,2105-2107,2111,2119,2121,2126,2135,2144,2160-2161,2170,2179,2190-2191,2196,2200,2222,2251,2260,2288,2301,2323,2366,2381-2383,2393-2394,2399,2401,2492,2500,2522,2525,2557,2601-2602,2604-2605,2607-2608,2638,2701-2702,2710,2717-2718,2725,2800,2809,2811,2869,2875,2909-2910,2920,2967-2968,2998,3000-3001,3003,3005-3007,3011,3013,3017,3030-3031,3052,3071,3077,3128,3168,3211,3221,3260-3261,3268-3269,3283,3300-3301,3306,3322-3325,3333,3351,3367,3369-3372,3389-3390,3404,3476,3493,3517,3527,3546,3551,3580,3659,3689-3690,3703,3737,3766,3784,3800-3801,3809,3814,3826-3828,3851,3869,3871,3878,3880,3889,3905,3914,3918,3920,3945,3971,3986,3995,3998,4000-4006,4045,4111,4125-4126,4129,4224,4242,4279,4321,4343,4443-4446,4449,4550,4567,4662,4848,4899-4900,4998,5000-5004,5009,5030,5033,5050-5051,5054,5060-5061,5080,5087,5100-5102,5120,5190,5200,5214,5221-5222,5225-5226,5269,5280,5298,5357,5405,5414,5431-5432,5440,5500,5510,5544,5550,5555,5560,5566,5631,5633,5666,5678-5679,5718,5730,5800-5802,5810-5811,5815,5822,5825,5850,5859,5862,5877,5900-5904,5906-5907,5910-5911,5915,5922,5925,5950,5952,5959-5963,5987-5989,5998-6007,6009,6025,6059,6100-6101,6106,6112,6123,6129,6156,6346,6389,6502,6510,6543,6547,6565-6567,6580,6646,6666-6669,6689,6692,6699,6779,6788-6789,6792,6839,6881,6901,6969,7000-7002,7004,7007,7019,7025,7070,7100,7103,7106,7200-7201,7402,7435,7443,7496,7512,7625,7627,7676,7741,7777-7778,7800,7911,7920-7921,7937-7938,7999-8002,8007-8011,8021-8022,8031,8042,8045,8080-8090,8093,8099-8100,8180-8181,8192-8194,8200,8222,8254,8290-8292,8300,8333,8383,8400,8402,8443,8500,8600,8649,8651-8652,8654,8701,8800,8873,8888,8899,8994,9000-9003,9009-9011,9040,9050,9071,9080-9081,9090-9091,9099-9103,9110-9111,9200,9207,9220,9290,9415,9418,9485,9500,9502-9503,9535,9575,9593-9595,9618,9666,9876-9878,9898,9900,9917,9929,9943-9944,9968,9998-10004,10009-10010,10012,10024-10025,10082,10180,10215,10243,10566,10616-10617,10621,10626,10628-10629,10778,11110-11111,11967,12000,12174,12265,12345,13456,13722,13782-13783,14000,14238,14441-14442,15000,15002-15004,15660,15742,16000-16001,16012,16016,16018,16080,16113,16992-16993,17877,17988,18040,18101,18988,19101,19283,19315,19350,19780,19801,19842,20000,20005,20031,20221-20222,20828,21571,22939,23502,24444,24800,25734-25735,26214,27000,27352-27353,27355-27356,27715,28201,30000,30718,30951,31038,31337,32768-32785,33354,33899,34571-34573,35500,38292,40193,40911,41511,42510,44176,44442-44443,44501,45100,48080,49152-49161,49163,49165,49167,49175-49176,49400,49999-50003,50006,50300,50389,50500,50636,50800,51103,51493,52673,52822,52848,52869,54045,54328,55055-55056,55555,55600,56737-56738,57294,57797,58080,60020,60443,61532,61900,62078,63331,64623,64680,65000,65129,65389"}, "_hosts": [{"__NmapHost__": {"_starttime": "1361737906", "_endtime": "1361737906", "_hostnames": ["localhost", "localhost"], "_status": {"state": "up", "reason": "localhost-response"}, "_services": [{"__NmapService__": {"_portid": 22, "_protocol": "tcp", "_state": {"state": "open", "reason": "syn-ack", "reason_ttl": "64"}, "_service": {"name": "ssh", "method": "table", "conf": "3", "cpelist": []}, "_cpelist": [], "_owner": "", "_reason": "syn-ack", "_reason_ip": "", "_reason_ttl": "64", "_servicefp": "", "_tunnel": "", "_service_extras": {"scripts": []}}}, {"__NmapService__": {"_portid": 25, "_protocol": "tcp", "_state": {"state": "open", "reason": "syn-ack", "reason_ttl": "64"}, "_service": {"name": "smtp", "method": "table", "conf": "3", "cpelist": []}, "_cpelist": [], "_owner": "", "_reason": "syn-ack", "_reason_ip": "", "_reason_ttl": "64", "_servicefp": "", "_tunnel": "", "_service_extras": {"scripts": []}}}, {"__NmapService__": {"_portid": 111, "_protocol": "tcp", "_state": {"state": "open", "reason": "syn-ack", "reason_ttl": "64"}, "_service": {"name": "rpcbind", "method": "table", "conf": "3", "cpelist": []}, "_cpelist": [], "_owner": "", "_reason": "syn-ack", "_reason_ip": "", "_reason_ttl": "64", "_servicefp": "", "_tunnel": "", "_service_extras": {"scripts": []}}}, {"__NmapService__": {"_portid": 631, "_protocol": "tcp", "_state": {"state": "open", "reason": "syn-ack", "reason_ttl": "64"}, "_service": {"name": "ipp", "method": "table", "conf": "3", "cpelist": []}, "_cpelist": [], "_owner": "", "_reason": "syn-ack", "_reason_ip": "", "_reason_ttl": "64", "_servicefp": "", "_tunnel": "", "_service_extras": {"scripts": []}}}, {"__NmapService__": {"_portid": 3306, "_protocol": "tcp", "_state": {"state": "open", "reason": "syn-ack", "reason_ttl": "64"}, "_service": {"name": "mysql", "method": "table", "conf": "3", "cpelist": []}, "_cpelist": [], "_owner": "", "_reason": "syn-ack", "_reason_ip": "", "_reason_ttl": "64", "_servicefp": "", "_tunnel": "", "_service_extras": {"scripts": []}}}], "_extras": {"extraports": {"state": {"state": "closed", "count": "995"}, "count": {"state": "closed", "count": "995"}, "reasons": [{"reason": "resets", "count": "995"}]}, "times": {"srtt": "7", "rttvar": "0", "to": "100000"}}, "_osfingerprinted": false, "os": {"__NmapOSFingerprint__": {"_NmapOSFingerprint__osmatches": [], "_NmapOSFingerprint__ports_used": [], "_NmapOSFingerprint__fingerprints": []}}, "_ipv4_addr": "127.0.0.1", "_ipv6_addr": null, "_mac_addr": null, "_vendor": null, "_main_address": "127.0.0.1", "_address": [{"addr": "127.0.0.1", "addrtype": "ipv4"}]}}, {"__NmapHost__": {"_starttime": "1361737906", "_endtime": "1361738040", "_hostnames": ["scanme.nmap.org", "scanme.nmap.org"], "_status": {"state": "up", "reason": "echo-reply"}, "_services": [{"__NmapService__": {"_portid": 22, "_protocol": "tcp", "_state": {"state": "open", "reason": "syn-ack", "reason_ttl": "53"}, "_service": {"name": "ssh", "method": "table", "conf": "3", "cpelist": []}, "_cpelist": [], "_owner": "", "_reason": "syn-ack", "_reason_ip": "", "_reason_ttl": "53", "_servicefp": "", "_tunnel": "", "_service_extras": {"scripts": []}}}, {"__NmapService__": {"_portid": 25, "_protocol": "tcp", "_state": {"state": "filtered", "reason": "admin-prohibited", "reason_ttl": "253", "reason_ip": "109.133.192.1"}, "_service": {"name": "smtp", "method": "table", "conf": "3", "cpelist": []}, "_cpelist": [], "_owner": "", "_reason": "admin-prohibited", "_reason_ip": "109.133.192.1", "_reason_ttl": "253", "_servicefp": "", "_tunnel": "", "_service_extras": {"scripts": []}}}, {"__NmapService__": {"_portid": 80, "_protocol": "tcp", "_state": {"state": "open", "reason": "syn-ack", "reason_ttl": "51"}, "_service": {"name": "http", "method": "table", "conf": "3", "cpelist": []}, "_cpelist": [], "_owner": "", "_reason": "syn-ack", "_reason_ip": "", "_reason_ttl": "51", "_servicefp": "", "_tunnel": "", "_service_extras": {"scripts": []}}}, {"__NmapService__": {"_portid": 9929, "_protocol": "tcp", "_state": {"state": "open", "reason": "syn-ack", "reason_ttl": "53"}, "_service": {"name": "nping-echo", "method": "table", "conf": "3", "cpelist": []}, "_cpelist": [], "_owner": "", "_reason": "syn-ack", "_reason_ip": "", "_reason_ttl": "53", "_servicefp": "", "_tunnel": "", "_service_extras": {"scripts": []}}}], "_extras": {"extraports": {"state": {"state": "closed", "count": "996"}, "count": {"state": "closed", "count": "996"}, "reasons": [{"reason": "resets", "count": "996"}]}, "times": {"srtt": "177425", "rttvar": "1981", "to": "185349"}}, "_osfingerprinted": false, "os": {"__NmapOSFingerprint__": {"_NmapOSFingerprint__osmatches": [], "_NmapOSFingerprint__ports_used": [], "_NmapOSFingerprint__fingerprints": []}}, "_ipv4_addr": "74.207.244.221", "_ipv6_addr": null, "_mac_addr": null, "_vendor": null, "_main_address": "74.207.244.221", "_address": [{"addr": "74.207.244.221", "addrtype": "ipv4"}]}}], "_runstats": {"finished": {"time": "1361738040", "timestr": "Sun Feb 24 21:34:00 2013", "elapsed": "134.36", "summary": "Nmap done at Sun Feb 24 21:34:00 2013; 2 IP addresses (2 hosts up) scanned in 134.36 seconds", "exit": "success"}, "hosts": {"up": "2", "down": "0", "total": "2"}}}}

‎libnmap/test/test_cpe.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ def test_full_cpe(self):
6666
"edition": ocpe.get_edition(),
6767
}
6868
self.assertEqual(objdict, resdict)
69-
69+
# self.assertEqual(ocpe.cpedict, resdict)
70+
self.assertEqual(str(ocpe), cpestr)
7071

7172
if __name__ == "__main__":
7273
test_suite = ["test_cpe", "test_full_cpe"]

0 commit comments

Comments
 (0)