peplum-nmap 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b8b8cbc832f6aba1427bc571e95d2dcf1bdcf1cca46373f1ea291bb43923586f
4
+ data.tar.gz: 06a2cbcae6e9d5bb77d4502eb4f29e82dd6425ec473e70a38fd39a2d9f8d8c5c
5
+ SHA512:
6
+ metadata.gz: e5b9cabeeeda80a9f419ecfbdf0248edd4e43d90940aa099b023b0d510c04fd6fa568073704a24a4dc187d6ec4d0d5ba7929da5f939ef0ee20dd46efe8bb16be
7
+ data.tar.gz: 3fec8a89cf625873b304f3d487e6be807d3e33a18294552a41ee8a1107bbf79d6d62619a4488214de082154507bfe44231ae5b28f87cdc724d5e4226a342ed4b
data/bin/console ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "peplum/nmap"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ require "irb"
11
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,189 @@
1
+ {
2
+ "hosts": {
3
+ "192.168.1.1": {
4
+ "start_time": "2023-05-21 19:30:39 +0300",
5
+ "end_time": "2023-05-21 19:31:20 +0300",
6
+ "status": "up",
7
+ "addresses": [
8
+ "192.168.1.1"
9
+ ],
10
+ "mac": null,
11
+ "vendor": null,
12
+ "ipv4": "192.168.1.1",
13
+ "ipv6": null,
14
+ "hostname": "mywebui.net",
15
+ "hostnames": [
16
+ "mywebui.net"
17
+ ],
18
+ "os": null,
19
+ "uptime": null,
20
+ "ports": {
21
+ "53": {
22
+ "protocol": "tcp",
23
+ "state": "open",
24
+ "reason": "syn-ack",
25
+ "reason_ttl": "syn-ack",
26
+ "service": "dnsmasq 2.85",
27
+ "scripts": {
28
+ "dns-nsid": {
29
+ "output": "\n bind.version: dnsmasq-2.85",
30
+ "data": {
31
+ "bind.version": "dnsmasq-2.85"
32
+ }
33
+ }
34
+ }
35
+ },
36
+ "80": {
37
+ "protocol": "tcp",
38
+ "state": "open",
39
+ "reason": "syn-ack",
40
+ "reason_ttl": "syn-ack",
41
+ "service": "http",
42
+ "scripts": {
43
+ "http-server-header": {
44
+ "output": "httpd/2.7 (Netgear; D86)",
45
+ "data": [
46
+ "httpd/2.7 (Netgear; D86)"
47
+ ]
48
+ },
49
+ "http-title": {
50
+ "output": "NETGEAR\nRequested resource was http://mywebui.net/index.html?sessionId=00000005%2DqJnmUh51Zh2tSmWlMkdD4dXOUxF7xn3",
51
+ "data": {
52
+ "title": "NETGEAR",
53
+ "redirect_url": "http://mywebui.net/index.html?sessionId=00000005%2DqJnmUh51Zh2tSmWlMkdD4dXOUxF7xn3"
54
+ }
55
+ }
56
+ }
57
+ },
58
+ "5510": {
59
+ "protocol": "tcp",
60
+ "state": "filtered",
61
+ "reason": "no-response",
62
+ "reason_ttl": "no-response",
63
+ "service": "secureidprop",
64
+ "scripts": {
65
+ }
66
+ }
67
+ }
68
+ },
69
+ "192.168.1.43": {
70
+ "start_time": "2023-05-21 19:30:40 +0300",
71
+ "end_time": "2023-05-21 19:33:15 +0300",
72
+ "status": "up",
73
+ "addresses": [
74
+ "192.168.1.43"
75
+ ],
76
+ "mac": null,
77
+ "vendor": null,
78
+ "ipv4": "192.168.1.43",
79
+ "ipv6": null,
80
+ "hostname": "deco_X60.net",
81
+ "hostnames": [
82
+ "deco_X60.net"
83
+ ],
84
+ "os": null,
85
+ "uptime": null,
86
+ "ports": {
87
+ "80": {
88
+ "protocol": "tcp",
89
+ "state": "open",
90
+ "reason": "syn-ack",
91
+ "reason_ttl": "syn-ack",
92
+ "service": "http",
93
+ "scripts": {
94
+ "fingerprint-strings": {
95
+ "output": "\n FourOhFourRequest: \n HTTP/1.0 404 Not Found\n Connection: close\n Content-Type: text/html\n <h1>Not Found</h1>The requested URL /nice%20ports%2C/Tri%6Eity.txt%2ebak was not found on this server.\n GetRequest, HTTPOptions: \n HTTP/1.0 200 OK\n Connection: close\n ETag: \"86b-110-5ce64ee5\"\n Last-Modified: Thu, 23 May 2019 07:42:29 GMT\n Date: Sun, 21 May 2023 16:30:46 GMT\n X-Frame-Options: deny\n Content-Security-Policy: frame-ancestors 'none'\n Content-Type: text/html\n Content-Length: 272\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n <html xmlns=\"http://www.w3.org/1999/xhtml\">\n <head>\n <meta http-equiv=\"refresh\" content=\"0; URL=/webpages/index.html\" />\n </head>\n </html>\n Help: \n HTTP/0.9 400 Bad Request\n Connection: Keep-Alive\n Keep-Alive: timeout=20\n Content-Type: text/html\n <h1>Bad Request</h1>\n RTSPRequest: \n HTTP/1.0 400 Bad Request\n Connection: Keep-Alive\n Keep-Alive: timeout=20\n Content-Type: text/html\n <h1>Bad Request</h1>",
96
+ "data": {
97
+ "FourOhFourRequest": "\n HTTP/1.0 404 Not Found\n Connection: close\n Content-Type: text/html\n <h1>Not Found</h1>The requested URL /nice%20ports%2C/Tri%6Eity.txt%2ebak was not found on this server.",
98
+ "GetRequest, HTTPOptions": "\n HTTP/1.0 200 OK\n Connection: close\n ETag: \"86b-110-5ce64ee5\"\n Last-Modified: Thu, 23 May 2019 07:42:29 GMT\n Date: Sun, 21 May 2023 16:30:46 GMT\n X-Frame-Options: deny\n Content-Security-Policy: frame-ancestors 'none'\n Content-Type: text/html\n Content-Length: 272\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n <html xmlns=\"http://www.w3.org/1999/xhtml\">\n <head>\n <meta http-equiv=\"refresh\" content=\"0; URL=/webpages/index.html\" />\n </head>\n </html>",
99
+ "Help": "\n HTTP/0.9 400 Bad Request\n Connection: Keep-Alive\n Keep-Alive: timeout=20\n Content-Type: text/html\n <h1>Bad Request</h1>",
100
+ "RTSPRequest": "\n HTTP/1.0 400 Bad Request\n Connection: Keep-Alive\n Keep-Alive: timeout=20\n Content-Type: text/html\n <h1>Bad Request</h1>"
101
+ }
102
+ },
103
+ "http-title": {
104
+ "output": "Site doesn't have a title (text/html).",
105
+ "data": null
106
+ }
107
+ }
108
+ },
109
+ "443": {
110
+ "protocol": "tcp",
111
+ "state": "open",
112
+ "reason": "syn-ack",
113
+ "reason_ttl": "syn-ack",
114
+ "service": "https",
115
+ "scripts": {
116
+ "http-title": {
117
+ "output": "Site doesn't have a title (text/html).",
118
+ "data": null
119
+ },
120
+ "ssl-cert": {
121
+ "output": "Subject: commonName=tplinkdeco.net/countryName=CN\nNot valid before: 2010-01-01T00:00:00\nNot valid after: 2030-12-31T00:00:00",
122
+ "data": {
123
+ "subject": {
124
+ "countryName": "CN",
125
+ "commonName": "tplinkdeco.net"
126
+ },
127
+ "issuer": {
128
+ "countryName": "CN",
129
+ "commonName": "tplinkdeco.net"
130
+ },
131
+ "pubkey": {
132
+ "exponent": "BIGNUM: 0x5574815bd108",
133
+ "bits": "2048",
134
+ "modulus": "BIGNUM: 0x5574815bd148",
135
+ "type": "rsa"
136
+ },
137
+ "extensions": [
138
+ {
139
+ "name": "X509v3 Basic Constraints",
140
+ "value": "CA:FALSE"
141
+ },
142
+ {
143
+ "name": "Netscape Comment",
144
+ "value": "OpenSSL Generated Certificate"
145
+ },
146
+ {
147
+ "name": "X509v3 Subject Key Identifier",
148
+ "value": "9D:23:AE:93:2D:A9:BB:3D:F1:4B:1E:5B:23:C5:86:30:C9:2E:B3:23"
149
+ },
150
+ {
151
+ "name": "X509v3 Authority Key Identifier",
152
+ "value": "11:D9:C7:7D:04:5B:F3:B3:B7:2A:3C:02:56:88:75:63:48:A4:47:BB"
153
+ }
154
+ ],
155
+ "validity": {
156
+ "notAfter": "2030-12-31T00:00:00",
157
+ "notBefore": "2010-01-01T00:00:00"
158
+ }
159
+ }
160
+ },
161
+ "ssl-date": {
162
+ "output": "TLS randomness does not represent time",
163
+ "data": null
164
+ }
165
+ }
166
+ },
167
+ "1900": {
168
+ "protocol": "tcp",
169
+ "state": "open",
170
+ "reason": "syn-ack",
171
+ "reason_ttl": "syn-ack",
172
+ "service": "MiniUPnP 1.8",
173
+ "scripts": {
174
+ "fingerprint-strings": {
175
+ "output": "\n FourOhFourRequest, GetRequest: \n HTTP/1.0 404 Not Found\n Content-Type: text/html\n Connection: close\n Content-Length: 134\n Server: TP-LINK/TP-LINK UPnP/1.1 MiniUPnPd/1.8\n Ext:\n <HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD><BODY><H1>Not Found</H1>The requested URL was not found on this server.</BODY></HTML>\n GenericLines: \n 501 Not Implemented\n Content-Type: text/html\n Connection: close\n Content-Length: 149\n Server: TP-LINK/TP-LINK UPnP/1.1 MiniUPnPd/1.8\n Ext:\n <HTML><HEAD><TITLE>501 Not Implemented</TITLE></HEAD><BODY><H1>Not Implemented</H1>The HTTP Method is not implemented by this server.</BODY></HTML>\n HTTPOptions: \n HTTP/1.0 501 Not Implemented\n Content-Type: text/html\n Connection: close\n Content-Length: 149\n Server: TP-LINK/TP-LINK UPnP/1.1 MiniUPnPd/1.8\n Ext:\n <HTML><HEAD><TITLE>501 Not Implemented</TITLE></HEAD><BODY><H1>Not Implemented</H1>The HTTP Method is not implemented by this server.</BODY></HTML>\n RTSPRequest: \n RTSP/1.0 501 Not Implemented\n Content-Type: text/html\n Connection: close\n Content-Length: 149\n Server: TP-LINK/TP-LINK UPnP/1.1 MiniUPnPd/1.8\n Ext:\n <HTML><HEAD><TITLE>501 Not Implemented</TITLE></HEAD><BODY><H1>Not Implemented</H1>The HTTP Method is not implemented by this server.</BODY></HTML>\n SIPOptions: \n SIP/2.0 501 Not Implemented\n Content-Type: text/html\n Connection: close\n Content-Length: 149\n Server: TP-LINK/TP-LINK UPnP/1.1 MiniUPnPd/1.8\n Ext:\n <HTML><HEAD><TITLE>501 Not Implemented</TITLE></HEAD><BODY><H1>Not Implemented</H1>The HTTP Method is not implemented by this server.</BODY></HTML>",
176
+ "data": {
177
+ "FourOhFourRequest, GetRequest": "\n HTTP/1.0 404 Not Found\n Content-Type: text/html\n Connection: close\n Content-Length: 134\n Server: TP-LINK/TP-LINK UPnP/1.1 MiniUPnPd/1.8\n Ext:\n <HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD><BODY><H1>Not Found</H1>The requested URL was not found on this server.</BODY></HTML>",
178
+ "GenericLines": "\n 501 Not Implemented\n Content-Type: text/html\n Connection: close\n Content-Length: 149\n Server: TP-LINK/TP-LINK UPnP/1.1 MiniUPnPd/1.8\n Ext:\n <HTML><HEAD><TITLE>501 Not Implemented</TITLE></HEAD><BODY><H1>Not Implemented</H1>The HTTP Method is not implemented by this server.</BODY></HTML>",
179
+ "HTTPOptions": "\n HTTP/1.0 501 Not Implemented\n Content-Type: text/html\n Connection: close\n Content-Length: 149\n Server: TP-LINK/TP-LINK UPnP/1.1 MiniUPnPd/1.8\n Ext:\n <HTML><HEAD><TITLE>501 Not Implemented</TITLE></HEAD><BODY><H1>Not Implemented</H1>The HTTP Method is not implemented by this server.</BODY></HTML>",
180
+ "RTSPRequest": "\n RTSP/1.0 501 Not Implemented\n Content-Type: text/html\n Connection: close\n Content-Length: 149\n Server: TP-LINK/TP-LINK UPnP/1.1 MiniUPnPd/1.8\n Ext:\n <HTML><HEAD><TITLE>501 Not Implemented</TITLE></HEAD><BODY><H1>Not Implemented</H1>The HTTP Method is not implemented by this server.</BODY></HTML>",
181
+ "SIPOptions": "\n SIP/2.0 501 Not Implemented\n Content-Type: text/html\n Connection: close\n Content-Length: 149\n Server: TP-LINK/TP-LINK UPnP/1.1 MiniUPnPd/1.8\n Ext:\n <HTML><HEAD><TITLE>501 Not Implemented</TITLE></HEAD><BODY><H1>Not Implemented</H1>The HTTP Method is not implemented by this server.</BODY></HTML>"
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
@@ -0,0 +1,44 @@
1
+ require 'json'
2
+ require 'tmpdir'
3
+ require 'net/http'
4
+
5
+ def response
6
+ if @last_response['Content-Type'].include? 'json'
7
+ data = JSON.load( @last_response.body )
8
+ else
9
+ data = @last_response.body
10
+ end
11
+ {
12
+ code: @last_response.code,
13
+ data: data
14
+ }
15
+ end
16
+
17
+ def response_data
18
+ response[:data]
19
+ end
20
+
21
+ def request( method, resource = nil, parameters = nil )
22
+ uri = URI( "http://127.0.0.1:7331/#{resource}" )
23
+
24
+ Net::HTTP.start( uri.host, uri.port) do |http|
25
+ case method
26
+ when :get
27
+ uri.query = URI.encode_www_form( parameters ) if parameters
28
+ request = Net::HTTP::Get.new( uri )
29
+
30
+ when :post
31
+ request = Net::HTTP::Post.new( uri )
32
+ request.body = parameters.to_json
33
+
34
+ when :delete
35
+ request = Net::HTTP::Delete.new( uri )
36
+
37
+ when :put
38
+ request = Net::HTTP::Put.new( uri )
39
+ request.body = parameters.to_json
40
+ end
41
+
42
+ @last_response = http.request( request )
43
+ end
44
+ end
data/examples/rest.rb ADDED
@@ -0,0 +1,56 @@
1
+ require 'peplum/nmap'
2
+ require 'pp'
3
+ require_relative 'rest/helpers'
4
+
5
+ # Boot up our REST nmap server for easy integration.
6
+ rest_pid = Peplum::Nmap::Application.spawn( :rest, daemonize: true )
7
+ at_exit { Cuboid::Processes::Manager.kill rest_pid }
8
+
9
+ # Wait for the REST server to boot up.
10
+ while sleep 1
11
+ begin
12
+ request :get
13
+ rescue Errno::ECONNREFUSED
14
+ next
15
+ end
16
+
17
+ break
18
+ end
19
+
20
+ # Assign an nmap Agent to the REST service for it to provide us with scanner Instances.
21
+ nmap_agent = Peplum::Nmap::Application.spawn( :agent, daemonize: true )
22
+ request :put, 'agent/url', nmap_agent.url
23
+ at_exit { nmap_agent.shutdown rescue nil }
24
+
25
+ # Create a new scanner Instance (process) and run a scan with the following options.
26
+ request :post, 'instances', {
27
+ peplum: {
28
+ objects: ['192.168.1.*'],
29
+ max_workers: 5
30
+ },
31
+ native: {
32
+ connect_scan: true,
33
+ service_scan: true,
34
+ default_script: true
35
+ }
36
+ }
37
+
38
+ # The ID is used to represent that instance and allow us to manage it from here on out.
39
+ instance_id = response_data['id']
40
+
41
+ while sleep( 1 )
42
+ # Continue looping while instance status is 'busy'.
43
+ request :get, "instances/#{instance_id}"
44
+ break if !response_data['busy']
45
+ end
46
+
47
+ puts '*' * 88
48
+
49
+ # Get the scan report.
50
+ request :get, "instances/#{instance_id}/report.json"
51
+
52
+ # Print out the report.
53
+ puts JSON.pretty_generate( JSON.load( response_data['data'] ) )
54
+
55
+ # Shutdown the Instance.
56
+ request :delete, "instances/#{instance_id}"
data/examples/rpc.rb ADDED
@@ -0,0 +1,30 @@
1
+ require 'pp'
2
+ require 'peplum/nmap'
3
+
4
+ # Spawn an nmap Agent as a daemon.
5
+ nmap_agent = Peplum::Nmap::Application.spawn( :agent, daemonize: true )
6
+ at_exit { nmap_agent.shutdown rescue nil }
7
+
8
+ # Spawn and connect to an nmap Instance.
9
+ nmap = Peplum::Nmap::Application.connect( nmap_agent.spawn )
10
+ # Don't forget this!
11
+ at_exit { nmap.shutdown }
12
+
13
+ # Run a distributed scan.
14
+ nmap.run(
15
+ peplum: {
16
+ objects: ['192.168.1.*'],
17
+ max_workers: 5
18
+ },
19
+ native: {
20
+ connect_scan: true,
21
+ service_scan: true,
22
+ default_script: true
23
+ }
24
+ )
25
+
26
+ # Waiting to complete.
27
+ sleep 1 while nmap.running?
28
+
29
+ # Hooray!
30
+ puts JSON.pretty_generate( nmap.generate_report.data )
@@ -0,0 +1,145 @@
1
+ require 'nmap/command'
2
+ require 'nmap/xml'
3
+ require 'tmpdir'
4
+
5
+ module Peplum
6
+ class Nmap
7
+
8
+ module Native
9
+
10
+ DEFAULT_OPTIONS = {
11
+ 'output_normal' => '/dev/null',
12
+ 'quiet' => true
13
+ }
14
+
15
+ PING_REPORT = "#{Dir.tmpdir}/nmap-ping-#{Process.pid}.xml"
16
+ SCAN_REPORT = "#{Dir.tmpdir}/nmap-scan-#{Process.pid}.xml"
17
+
18
+ at_exit do
19
+ FileUtils.rm_f PING_REPORT
20
+ FileUtils.rm_f SCAN_REPORT
21
+ end
22
+
23
+ def run( targets, options )
24
+ _run options.merge( targets: targets, output_xml: SCAN_REPORT )
25
+ report_from_xml( SCAN_REPORT )
26
+ end
27
+
28
+ def group( targets, chunks )
29
+ @hosts ||= self.live_hosts( targets )
30
+ @hosts.chunk( chunks ).reject(&:empty?)
31
+ end
32
+
33
+ def merge( data )
34
+ report = { 'hosts' => {} }
35
+ data.each do |d|
36
+ report['hosts'].merge! d['hosts']
37
+ end
38
+ report
39
+ end
40
+
41
+ private
42
+
43
+ def live_hosts( targets )
44
+ _run targets: targets,
45
+ ping: true,
46
+ output_xml: PING_REPORT
47
+
48
+ hosts_from_xml( PING_REPORT )
49
+ end
50
+
51
+ def set_default_options( nmap )
52
+ set_options( nmap, DEFAULT_OPTIONS )
53
+ end
54
+
55
+ def set_options( nmap, options )
56
+ options.each do |k, v|
57
+ nmap.send "#{k}=", v
58
+ end
59
+ end
60
+
61
+ def _run( options = {}, &block )
62
+ ::Nmap::Command.run do |nmap|
63
+ set_default_options nmap
64
+ set_options nmap, options
65
+ block.call nmap if block_given?
66
+ end
67
+ end
68
+
69
+ def hosts_from_xml( xml )
70
+ hosts = []
71
+ ::Nmap::XML.open( xml ) do |xml|
72
+ xml.each_host do |host|
73
+ hosts << host.ip
74
+ end
75
+ end
76
+ hosts
77
+ end
78
+
79
+ def report_from_xml( xml )
80
+ report_data = {}
81
+ ::Nmap::XML.open( xml ) do |xml|
82
+ xml.each_host do |host|
83
+ report_data['hosts'] ||= {}
84
+ report_data['hosts'][host.ip] = host_to_hash( host )
85
+
86
+ report_data['hosts'][host.ip]['ports'] = {}
87
+ host.each_port do |port|
88
+ report_data['hosts'][host.ip]['ports'][port.number] = port_to_hash( port )
89
+ end
90
+ end
91
+ end
92
+ report_data
93
+ end
94
+
95
+ def host_to_hash( host )
96
+ h = {}
97
+ %w(start_time end_time status addresses mac vendor ipv4 ipv6 hostname hostnames os uptime).each do |k|
98
+ v = host.send( k )
99
+ next if !v
100
+
101
+ if v.is_a? Array
102
+ h[k] = v.map(&:to_s)
103
+ else
104
+ h[k] = v.to_s
105
+ end
106
+ end
107
+
108
+ if host.host_script
109
+ h['scripts'] = {}
110
+ host.host_script.scripts.each do |name, script|
111
+ h['scripts'][name] = {
112
+ output: script.output,
113
+ data: script.data
114
+ }
115
+ end
116
+ end
117
+
118
+ h
119
+ end
120
+
121
+ def port_to_hash( port )
122
+ h = {}
123
+
124
+ %w(protocol state reason reason_ttl).each do |k|
125
+ h[k] = port.send( k )
126
+ end
127
+ h['service'] = port.service.to_s
128
+
129
+ h['scripts'] ||= {}
130
+ port.scripts.each do |name, script|
131
+ h['scripts'][name] = {
132
+ output: script.output,
133
+ data: script.data
134
+ }
135
+ end
136
+
137
+ h
138
+ end
139
+
140
+ extend self
141
+
142
+ end
143
+
144
+ end
145
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Peplum
4
+ class Nmap
5
+ VERSION = "0.1.0"
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'peplum'
4
+
5
+ module Peplum
6
+ class Nmap
7
+
8
+ require_relative "nmap/version"
9
+ require_relative "nmap/native"
10
+
11
+ class Error < Peplum::Error; end
12
+
13
+ class Application < Peplum::Application
14
+ def native_app
15
+ Native
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/peplum/nmap/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "peplum-nmap"
7
+ spec.version = Peplum::Nmap::VERSION
8
+ spec.authors = ["Tasos Laskos"]
9
+ spec.email = ["tasos.laskos@ecsypno.com"]
10
+
11
+ spec.summary = "Distributed NMap."
12
+ spec.description = "Distributed NMap backed by Peplum."
13
+ spec.homepage = "http://ecsypno.com/"
14
+ spec.required_ruby_version = ">= 2.6.0"
15
+
16
+ spec.files = Dir.glob( 'bin/*')
17
+ spec.files += Dir.glob( 'lib/**/*')
18
+ spec.files += Dir.glob( 'examples/**/*')
19
+ spec.files += %w(peplum-nmap.gemspec)
20
+
21
+
22
+ spec.add_dependency "peplum"
23
+ spec.add_dependency 'ruby-nmap'
24
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: peplum-nmap
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Tasos Laskos
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-05-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: peplum
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-nmap
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Distributed NMap backed by Peplum.
42
+ email:
43
+ - tasos.laskos@ecsypno.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - bin/console
49
+ - bin/setup
50
+ - examples/output.json
51
+ - examples/rest.rb
52
+ - examples/rest/helpers.rb
53
+ - examples/rpc.rb
54
+ - lib/peplum/nmap.rb
55
+ - lib/peplum/nmap/native.rb
56
+ - lib/peplum/nmap/version.rb
57
+ - peplum-nmap.gemspec
58
+ homepage: http://ecsypno.com/
59
+ licenses: []
60
+ metadata: {}
61
+ post_install_message:
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 2.6.0
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ requirements: []
76
+ rubygems_version: 3.4.13
77
+ signing_key:
78
+ specification_version: 4
79
+ summary: Distributed NMap.
80
+ test_files: []