nmap-parser 0.3 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/LICENSE +1 -1
  2. data/README +5 -2
  3. data/lib/nmap/parser.rb +123 -138
  4. metadata +40 -33
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007, 2008 Kris Katterjohn
1
+ Copyright (c) 2007, 2008, 2009 Kris Katterjohn
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README CHANGED
@@ -3,18 +3,21 @@
3
3
  == Kris Katterjohn katterjohn@gmail.com ==
4
4
  ===============================================================================
5
5
 
6
- $Id: README 70 2008-04-22 23:13:01Z kjak $
6
+ $Id: README 91 2009-01-01 20:50:08Z kjak $
7
7
 
8
8
 
9
9
  OVERVIEW
10
10
  ========
11
11
 
12
12
  This library provides a Ruby interface to Nmap's scan data. It can run Nmap
13
- and parse it's XML output directly from the scan, parse a file containing the
13
+ and parse its XML output directly from the scan, parse a file containing the
14
14
  XML data from a separate scan, parse a String of XML data from a scan, or parse
15
15
  XML data from an object via its read() method. This information is presented
16
16
  in an easy-to-use and intuitive fashion for storing and manipulating.
17
17
 
18
+ This is not just some Ruby port of Anthony Persaud's Perl Nmap::Parser! There
19
+ are more classes, many different methods, and blocks are extensively available.
20
+
18
21
 
19
22
  REQUIREMENTS and RECOMMENDATIONS
20
23
  ================================
@@ -4,7 +4,7 @@
4
4
  #
5
5
  # Author: Kris Katterjohn <katterjohn@gmail.com>
6
6
  #
7
- # Copyright (c) 2007, 2008 Kris Katterjohn
7
+ # Copyright (c) 2007, 2008, 2009 Kris Katterjohn
8
8
  #
9
9
  # Permission is hereby granted, free of charge, to any person obtaining a copy
10
10
  # of this software and associated documentation files (the "Software"), to deal
@@ -24,7 +24,7 @@
24
24
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
25
  # THE SOFTWARE.
26
26
 
27
- # $Id: parser.rb 77 2008-04-24 22:19:29Z kjak $
27
+ # $Id: parser.rb 92 2009-01-01 21:14:58Z kjak $
28
28
  # https://rubynmap.svn.sourceforge.net/svnroot/rubynmap
29
29
 
30
30
  require 'rexml/document'
@@ -44,22 +44,20 @@ end
44
44
  == What Is This Library For?
45
45
 
46
46
  This library provides a Ruby interface to Nmap's scan data. It can run Nmap
47
- and parse it's XML output directly from the scan, parse a file containing the
47
+ and parse its XML output directly from the scan, parse a file containing the
48
48
  XML data from a separate scan, parse a String of XML data from a scan, or parse
49
49
  XML data from an object via its read() method. This information is presented
50
50
  in an easy-to-use and intuitive fashion for storing and manipulating.
51
51
 
52
+ This is not just some Ruby port of Anthony Persaud's Perl Nmap::Parser! There
53
+ are more classes, many different methods, and blocks are extensively available.
54
+
52
55
  The Nmap Security Scanner is a great program written and maintained by
53
56
  Fyodor <fyodor@insecure.org>. Its main function is port scanning, but it also
54
- has service and operating system detection, it's own scripting engine and a
55
- whole lot more. One of it's many available output formats is XML, which allows
57
+ has service and operating system detection, its own scripting engine and a
58
+ whole lot more. One of its many available output formats is XML, which allows
56
59
  machines to handle all of the information instead of us slowly sifting through
57
- tons of output!
58
-
59
- If you've ever used Anthony Persaud's Perl Nmap::Parser, you'll notice some
60
- similarities and should pick up on this API quickly. Just remember, it's far
61
- from exactly the same! There are more classes, many different methods, and
62
- blocks are used extensively (or available for use).
60
+ tons of output.
63
61
 
64
62
  == Conventions
65
63
 
@@ -78,29 +76,29 @@ is given.
78
76
 
79
77
  Nmap::Parser
80
78
  |
81
- + ::Session <- Scan session information
79
+ + Session <- Scan session information
82
80
  |
83
- + ::Host <- General host information
84
- |
85
- + ::ExtraPorts <- Ports consolidated in an "ignored" state
86
- |
87
- + ::Port <- General port information
88
- | |
89
- | + ::Service <- Port Service information
90
- |
91
- + ::Script <- NSE Script information (both host and port)
92
- |
93
- + ::Times <- Timimg information (srtt, etc)
94
- |
95
- + ::Traceroute <- General Traceroute information
96
- | |
97
- | + ::Hop <- Individual Hop information
98
- |
99
- + ::OS <- OS Detection information
100
- |
101
- + ::OSClass <- OS Class information
102
- |
103
- + ::OSMatch <- OS Match information
81
+ + Host <- General host information
82
+ |
83
+ + ExtraPorts <- Ports consolidated in an "ignored" state
84
+ |
85
+ + Port <- General port information
86
+ | |
87
+ | + Service <- Port Service information
88
+ |
89
+ + Script <- NSE Script information (both host and port)
90
+ |
91
+ + Times <- Timimg information (srtt, etc)
92
+ |
93
+ + Traceroute <- General Traceroute information
94
+ | |
95
+ | + Hop <- Individual Hop information
96
+ |
97
+ + OS <- OS Detection information
98
+ |
99
+ + OSClass <- OS Class information
100
+ |
101
+ + OSMatch <- OS Match information
104
102
 
105
103
  == Parsing XML Data Already Available
106
104
 
@@ -116,9 +114,8 @@ is given.
116
114
 
117
115
  == Reading and Parsing from an Object
118
116
 
119
- The parseread() function isn't limited to IO objects like $stdin is
120
- in the example: it can read from any object that responds to a read()
121
- method that returns a String.
117
+ This method can read from any object that responds to a read() method that
118
+ returns a String: $stdin is just one example.
122
119
 
123
120
  require 'nmap/parser'
124
121
 
@@ -126,11 +123,11 @@ method that returns a String.
126
123
 
127
124
  == Scanning and Parsing
128
125
 
129
- This is the only parser option that requires Nmap to be available
126
+ This is the only parser method that requires Nmap to be available.
130
127
 
131
128
  require 'nmap/parser'
132
129
 
133
- parser = Nmap::Parser.parsescan("sudo nmap", "--script all 192.168.1.0/24")
130
+ parser = Nmap::Parser.parsescan("sudo nmap", "-sVC 192.168.1.0/24")
134
131
 
135
132
  == Actually Doing Something
136
133
 
@@ -140,9 +137,7 @@ open TCP ports, along with the name and output of any scripts that
140
137
  ran (on the host and individual ports).
141
138
 
142
139
  puts "Nmap args: #{parser.session.scan_args}"
143
-
144
140
  puts "Runtime: #{parser.session.scan_time} seconds"
145
-
146
141
  puts
147
142
 
148
143
  parser.hosts("up") do |host|
@@ -155,7 +150,7 @@ ran (on the host and individual ports).
155
150
  puts "Port ##{port.num} is open (#{port.reason})"
156
151
  puts "\tService: #{srv.name}" if srv.name
157
152
  puts "\tProduct: #{srv.product}" if srv.product
158
- puts "\tVersion: #{srv.product}" if srv.version
153
+ puts "\tVersion: #{srv.version}" if srv.version
159
154
  puts
160
155
 
161
156
  port.scripts do |script|
@@ -183,7 +178,7 @@ ran (on the host and individual ports).
183
178
  class Nmap::Parser
184
179
  # Holds the raw XML output from Nmap
185
180
  attr_reader :rawxml
186
- # ::Session object for this scan
181
+ # Session object for this scan
187
182
  attr_reader :session
188
183
 
189
184
  # Read and parse XML from the +obj+. +obj+ can be any object type
@@ -199,7 +194,9 @@ class Nmap::Parser
199
194
 
200
195
  r = obj.read
201
196
 
202
- raise "read() returned #{r.class} type!" if not r.is_a?String
197
+ if not r.is_a?String
198
+ raise "read() returned #{r.class} instead of a String"
199
+ end
203
200
 
204
201
  p = new(r)
205
202
 
@@ -305,7 +302,7 @@ class Nmap::Parser
305
302
  # get_ips(), calling this method on a host passed to the block may
306
303
  # lead to adverse effects:
307
304
  #
308
- # parser.hosts { |x| puts x.addr; del_host(x) } # Don't do this!
305
+ # parser.hosts { |h| puts h.addr; parser.del_host(h) } # Don't do this!
309
306
  def del_host(hostip)
310
307
  @hosts.delete_if do |host|
311
308
  host.addr == hostip or host.hostname == hostip
@@ -361,10 +358,8 @@ class Nmap::Parser
361
358
 
362
359
  @session = Session.new(root)
363
360
 
364
- @hosts = []
365
-
366
- root.each_element('host') do |host|
367
- @hosts << Host.new(host)
361
+ @hosts = root.elements.collect('host') do |host|
362
+ Host.new(host)
368
363
  end
369
364
  end
370
365
  end
@@ -432,6 +427,16 @@ class Nmap::Parser::Session
432
427
  types
433
428
  end
434
429
 
430
+ # Returns the scanflags associated with the specified scan +type+
431
+ # (e.g. "PSHACK" for type "ack")
432
+ def scanflags(type)
433
+ @scaninfo.each do |info|
434
+ return info.scanflags if info.type == type
435
+ end
436
+
437
+ nil
438
+ end
439
+
435
440
  private
436
441
 
437
442
  def initialize(root)
@@ -456,16 +461,14 @@ class Nmap::Parser::Session
456
461
  @verbose = root.elements['verbose'].attributes['level'].to_i
457
462
  @debug = root.elements['debugging'].attributes['level'].to_i
458
463
 
459
- @scaninfo = []
460
-
461
- root.each_element('scaninfo') do |info|
462
- @scaninfo << ScanInfo.new(info)
464
+ @scaninfo = root.elements.collect('scaninfo') do |info|
465
+ ScanInfo.new(info)
463
466
  end
464
467
  end
465
468
  end
466
469
 
467
470
  class Nmap::Parser::Session::ScanInfo # :nodoc: all
468
- attr_reader :type, :proto, :numservices
471
+ attr_reader :type, :scanflags, :proto, :numservices
469
472
 
470
473
  private
471
474
 
@@ -475,6 +478,7 @@ class Nmap::Parser::Session::ScanInfo # :nodoc: all
475
478
 
476
479
  def parse(info)
477
480
  @type = info.attributes['type']
481
+ @scanflags = info.attributes['scanflags']
478
482
  @proto = info.attributes['protocol']
479
483
  @numservices = info.attributes['numservices'].to_i
480
484
  end
@@ -498,7 +502,7 @@ class Nmap::Parser::Host
498
502
  attr_reader :mac_addr
499
503
  # The MAC vendor
500
504
  attr_reader :mac_vendor
501
- # ::OS object holding Operating System information
505
+ # OS object holding Operating System information
502
506
  attr_reader :os
503
507
  # The number of "weird responses"
504
508
  attr_reader :smurf
@@ -512,12 +516,14 @@ class Nmap::Parser::Host
512
516
  attr_reader :tcptssequence_class, :tcptssequence_values
513
517
  # Uptime information
514
518
  attr_reader :uptime_seconds, :uptime_lastboot
515
- # ::Traceroute object
519
+ # Traceroute object
516
520
  attr_reader :traceroute
517
521
  # Network distance (not necessarily the same as from traceroute)
518
522
  attr_reader :distance
519
- # ::Times object holding timing information
523
+ # Times object holding timing information
520
524
  attr_reader :times
525
+ # Host start and end times
526
+ attr_reader :starttime, :endtime
521
527
 
522
528
  alias ipv4_addr ip4_addr
523
529
  alias ipv6_addr ip6_addr
@@ -572,13 +578,9 @@ class Nmap::Parser::Host
572
578
  # If an argument is given, only ports matching +state+ are given.
573
579
  # Note: "open" will also match "open|filtered", but not vice versa.
574
580
  def tcp_ports(state = "")
575
- list = []
576
-
577
- @tcpPorts.invert.each_key do |port|
578
- list << port if state.empty? or port.state >= state
579
- end
580
-
581
- list.sort!
581
+ list = @tcpPorts.invert.keys.find_all { |port|
582
+ state.empty? or port.state >= state
583
+ }.sort
582
584
 
583
585
  if block_given?
584
586
  list.each do |port|
@@ -595,13 +597,9 @@ class Nmap::Parser::Host
595
597
  # If an argument is given, only ports matching +state+ are given.
596
598
  # Note: "open" will also match "open|filtered", but not vice versa.
597
599
  def tcp_port_list(state = "")
598
- list = []
599
-
600
- @tcpPorts.invert.each_key do |port|
601
- list << port.num if state.empty? or port.state >= state
602
- end
603
-
604
- list.sort!
600
+ list = @tcpPorts.invert.keys.map { |port|
601
+ port.num if state.empty? or port.state >= state
602
+ }.compact.sort
605
603
 
606
604
  if block_given?
607
605
  list.each do |port|
@@ -612,7 +610,7 @@ class Nmap::Parser::Host
612
610
  list
613
611
  end
614
612
 
615
- # Returns state reason of TCP port +portnum+
613
+ # Returns the state reason of TCP port +portnum+
616
614
  def tcp_reason(portnum)
617
615
  return nil if @tcpPorts[portnum.to_s].nil?
618
616
 
@@ -655,7 +653,7 @@ class Nmap::Parser::Host
655
653
  @tcpPorts[portnum.to_s].service
656
654
  end
657
655
 
658
- # Returns state of TCP port +portnum+
656
+ # Returns the state of TCP port +portnum+
659
657
  def tcp_state(portnum)
660
658
  return nil if @tcpPorts[portnum.to_s].nil?
661
659
 
@@ -676,13 +674,9 @@ class Nmap::Parser::Host
676
674
  # If an argument is given, only ports matching +state+ are given.
677
675
  # Note: "open" will also match "open|filtered", but not vice versa.
678
676
  def udp_ports(state = "")
679
- list = []
680
-
681
- @udpPorts.invert.each_key do |port|
682
- list << port if state.empty? or port.state >= state
683
- end
684
-
685
- list.sort!
677
+ list = @udpPorts.invert.keys.find_all { |port|
678
+ state.empty? or port.state >= state
679
+ }.sort
686
680
 
687
681
  if block_given?
688
682
  list.each do |port|
@@ -699,13 +693,9 @@ class Nmap::Parser::Host
699
693
  # If an argument is given, only ports matching +state+ are given.
700
694
  # Note: "open" will also match "open|filtered", but not vice versa.
701
695
  def udp_port_list(state = "")
702
- list = []
703
-
704
- @udpPorts.invert.each_key do |port|
705
- list << port.num if state.empty? or port.state >= state
706
- end
707
-
708
- list.sort!
696
+ list = @udpPorts.invert.keys.map { |port|
697
+ port.num if state.empty? or port.state >= state
698
+ }.compact.sort
709
699
 
710
700
  if block_given?
711
701
  list.each do |port|
@@ -716,7 +706,7 @@ class Nmap::Parser::Host
716
706
  list
717
707
  end
718
708
 
719
- # Returns state reason of UDP port +portnum+
709
+ # Returns the state reason of UDP port +portnum+
720
710
  def udp_reason(portnum)
721
711
  return nil if @udpPorts[portnum.to_s].nil?
722
712
 
@@ -759,7 +749,7 @@ class Nmap::Parser::Host
759
749
  @udpPorts[portnum.to_s].service
760
750
  end
761
751
 
762
- # Returns state of UDP port +portnum+
752
+ # Returns the state of UDP port +portnum+
763
753
  def udp_state(portnum)
764
754
  return nil if @udpPorts[portnum.to_s].nil?
765
755
 
@@ -780,13 +770,9 @@ class Nmap::Parser::Host
780
770
  # If an argument is given, only protocols matching +state+ are given.
781
771
  # Note: "open" will also match "open|filtered", but not vice versa.
782
772
  def ip_protos(state = "")
783
- list = []
784
-
785
- @ipProtos.invert.each_key do |proto|
786
- list << proto if state.empty? or proto.state >= state
787
- end
788
-
789
- list.sort!
773
+ list = @ipProtos.invert.keys.find_all { |proto|
774
+ state.empty? or proto.state >= state
775
+ }.sort
790
776
 
791
777
  if block_given?
792
778
  list.each do |proto|
@@ -803,13 +789,9 @@ class Nmap::Parser::Host
803
789
  # If an argument is given, only protocols matching +state+ are given.
804
790
  # Note: "open" will also match "open|filtered", but not vice versa.
805
791
  def ip_proto_list(state = "")
806
- list = []
807
-
808
- @ipProtos.invert.each_key do |proto|
809
- list << proto.num if state.empty? or proto.state >= state
810
- end
811
-
812
- list.sort!
792
+ list = @ipProtos.invert.keys.map { |proto|
793
+ proto.num if state.empty? or proto.state >= state
794
+ }.compact.sort
813
795
 
814
796
  if block_given?
815
797
  list.each do |proto|
@@ -820,7 +802,7 @@ class Nmap::Parser::Host
820
802
  list
821
803
  end
822
804
 
823
- # Returns state reason of IP protocol +protonum+
805
+ # Returns the state reason of IP protocol +protonum+
824
806
  def ip_reason(protonum)
825
807
  return nil if @ipProtos[protonum.to_s].nil?
826
808
 
@@ -834,7 +816,7 @@ class Nmap::Parser::Host
834
816
  @ipProtos[protonum.to_s].service
835
817
  end
836
818
 
837
- # Returns state of IP protocol +protonum+
819
+ # Returns the state of IP protocol +protonum+
838
820
  def ip_state(protonum)
839
821
  return nil if @ipProtos[protonum.to_s].nil?
840
822
 
@@ -875,25 +857,26 @@ class Nmap::Parser::Host
875
857
  parse(hostinfo)
876
858
  end
877
859
 
878
- # Convert a string like '22-25,80,110-900' into
860
+ # Convert a string like "22-25,80,110-900" into
879
861
  # an array with all the uncondensed elements, e.g.
880
- # [ '22', '23', '24', '25, '80', '110', '111' ... ]
862
+ # [ 22, 23, 24, 25, 80, 110, 111 ... ]
881
863
  def parsePortlist(ports)
882
864
  list = []
883
865
 
884
- ports.split(",").each do |set|
885
- pa = set.split("-")
866
+ # Build array from port specification
867
+ ports.split(/,/).each do |item|
868
+ start, stop = item.split(/-/).map { |p| p.to_i }
886
869
 
887
- if pa.length > 1
888
- pa[0].upto(pa[1]) do |p|
889
- list << p
890
- end
891
- else
892
- list << portc
893
- end
870
+ start ||= 0
871
+ stop ||= item.match(/-/) ? 65535 : start
872
+
873
+ start, stop = stop, start if stop < start
874
+
875
+ start.upto(stop) { |p| list << p }
894
876
  end
895
877
 
896
- list
878
+ # Sort, and remove dups and invalid ports
879
+ list.sort.uniq.delete_if { |p| p < 0 or p > 65535 }
897
880
  end
898
881
 
899
882
  def parseAddr(elem)
@@ -913,8 +896,8 @@ class Nmap::Parser::Host
913
896
 
914
897
  return nil if elem.nil?
915
898
 
916
- elem.each_element('hostname') do |name|
917
- @hostnames << name.attributes['name']
899
+ @hostnames = elem.elements.collect('hostname') do |name|
900
+ name.attributes['name']
918
901
  end
919
902
  end
920
903
 
@@ -944,8 +927,8 @@ class Nmap::Parser::Host
944
927
 
945
928
  return nil if ports.nil?
946
929
 
947
- ports.each_element('extraports') do |e|
948
- @extraports << ExtraPorts.new(e)
930
+ @extraports = ports.elements.collect('extraports') do |e|
931
+ ExtraPorts.new(e)
949
932
  end
950
933
 
951
934
  @extraports.sort! do |x, y|
@@ -958,8 +941,8 @@ class Nmap::Parser::Host
958
941
 
959
942
  return nil if scriptlist.nil?
960
943
 
961
- scriptlist.each_element('script') do |script|
962
- @scripts << Script.new(script)
944
+ @scripts = scriptlist.elements.collect('script') do |script|
945
+ Script.new(script)
963
946
  end
964
947
  end
965
948
 
@@ -1035,6 +1018,12 @@ class Nmap::Parser::Host
1035
1018
  @distance = distance.attributes['value'].to_i if distance
1036
1019
 
1037
1020
  @times = Times.new(host.elements['times'])
1021
+
1022
+ stime = host.attributes['starttime']
1023
+ @starttime = stime.to_i if stime
1024
+
1025
+ etime = host.attributes['endtime']
1026
+ @endtime = etime.to_i if etime
1038
1027
  end
1039
1028
  end
1040
1029
 
@@ -1089,7 +1078,7 @@ end
1089
1078
  class Nmap::Parser::Host::Port
1090
1079
  # Port number
1091
1080
  attr_reader :num
1092
- # ::Service object for this port
1081
+ # Service object for this port
1093
1082
  attr_reader :service
1094
1083
  # Port state ("open", "closed", "filtered", etc)
1095
1084
  attr_reader :state
@@ -1150,10 +1139,8 @@ class Nmap::Parser::Host::Port
1150
1139
 
1151
1140
  @service = Service.new(port)
1152
1141
 
1153
- @scripts = []
1154
-
1155
- port.each_element('script') do |script|
1156
- @scripts << Nmap::Parser::Host::Script.new(script)
1142
+ @scripts = port.elements.collect('script') do |script|
1143
+ Nmap::Parser::Host::Script.new(script)
1157
1144
  end
1158
1145
  end
1159
1146
  end
@@ -1219,7 +1206,7 @@ class Nmap::Parser::Host::Traceroute
1219
1206
 
1220
1207
  # Returns an array of Hop objects, which are each a responsive hop,
1221
1208
  # and passes them each to a block if one if given.
1222
- def hops
1209
+ def hops() # :yields: hop
1223
1210
  if block_given?
1224
1211
  @hops.each do |h|
1225
1212
  yield h
@@ -1239,10 +1226,8 @@ class Nmap::Parser::Host::Traceroute
1239
1226
  @port = trace.attributes['port'].to_i
1240
1227
  @proto = trace.attributes['proto']
1241
1228
 
1242
- @hops = []
1243
-
1244
- trace.each_element('hop') do |hop|
1245
- @hops << Hop.new(hop)
1229
+ @hops = trace.each_element('hop') do |hop|
1230
+ Hop.new(hop)
1246
1231
  end
1247
1232
  end
1248
1233
  end
@@ -1506,18 +1491,18 @@ class Nmap::Parser::Host::OS
1506
1491
 
1507
1492
  return nil if os.nil?
1508
1493
 
1509
- os.each_element('portused') do |port|
1510
- @portsused << PortUsed.new(port)
1494
+ @portsused = os.elements.collect('portused') do |port|
1495
+ PortUsed.new(port)
1511
1496
  end
1512
1497
 
1513
- os.each_element('osclass') do |osclass|
1514
- @osclasses << OSClass.new(osclass)
1498
+ @osclasses = os.elements.collect('osclass') do |osclass|
1499
+ OSClass.new(osclass)
1515
1500
  end
1516
1501
 
1517
1502
  @osclasses.sort!.reverse!
1518
1503
 
1519
- os.each_element('osmatch') do |match|
1520
- @osmatches << OSMatch.new(match)
1504
+ @osmatches = os.elements.collect('osmatch') do |match|
1505
+ OSMatch.new(match)
1521
1506
  end
1522
1507
 
1523
1508
  @osmatches.sort!.reverse!
metadata CHANGED
@@ -1,52 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: nmap-parser
5
3
  version: !ruby/object:Gem::Version
6
- version: "0.3"
7
- date: 2008-04-24 00:00:00 -05:00
8
- summary: Ruby Interface to Nmap's Scan Data (Nmap::Parser Library)
9
- require_paths:
10
- - lib
11
- email: katterjohn@gmail.com
12
- homepage: http://rubynmap.sourceforge.net
13
- rubyforge_project: rubynmap
14
- description: Nmap::Parser Library
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.3.1
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Kris Katterjohn
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-01-01 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Nmap::Parser Library
17
+ email: katterjohn@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
31
24
  files:
32
25
  - BUGS
33
26
  - LICENSE
34
27
  - README
35
28
  - lib/nmap/parser.rb
36
- test_files: []
37
-
29
+ has_rdoc: true
30
+ homepage: http://rubynmap.sourceforge.net
31
+ post_install_message:
38
32
  rdoc_options:
39
33
  - --title
40
34
  - Ruby Nmap::Parser Library
41
35
  - --main
42
36
  - Nmap::Parser
43
- extra_rdoc_files: []
44
-
45
- executables: []
46
-
47
- extensions: []
48
-
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ version:
49
51
  requirements: []
50
52
 
51
- dependencies: []
53
+ rubyforge_project: rubynmap
54
+ rubygems_version: 1.2.0
55
+ signing_key:
56
+ specification_version: 2
57
+ summary: Ruby Interface to Nmap's Scan Data (Nmap::Parser Library)
58
+ test_files: []
52
59