nexposecli 0.1.7
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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/README.md +24 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/nexposecli +1723 -0
- data/bin/nexposecli.test +6 -0
- data/bin/setup +8 -0
- data/lib/nexposecli/argparse.rb +167 -0
- data/lib/nexposecli/version.rb +3 -0
- data/lib/nexposecli.rb +10 -0
- data/nexposecli.gemspec +25 -0
- data/spec/nexposecli_spec.rb +11 -0
- data/spec/spec_helper.rb +2 -0
- metadata +135 -0
data/bin/nexposecli.test
ADDED
data/bin/setup
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
module Nexposecli
|
2
|
+
|
3
|
+
class ArgParse
|
4
|
+
|
5
|
+
#
|
6
|
+
# Error types. Shamelessly stolen from GetoptLong.
|
7
|
+
#
|
8
|
+
|
9
|
+
class Error < StandardError; end
|
10
|
+
class MissingArgument < Error; end
|
11
|
+
class ExtraneousArgument < Error; end
|
12
|
+
class InvalidArgument < Error; end
|
13
|
+
|
14
|
+
attr_accessor :opt_table
|
15
|
+
|
16
|
+
def initialize(yaml_str)
|
17
|
+
@opt_def = YAML.parse(yaml_str).transform
|
18
|
+
@opt_table = Hash.new
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse
|
23
|
+
|
24
|
+
short_to_name = {}
|
25
|
+
|
26
|
+
@opt_def.each { |hash|
|
27
|
+
next if hash['comment']
|
28
|
+
if hash['short']
|
29
|
+
sa = '-' + hash['short']
|
30
|
+
short_to_name[sa] = hash['name']
|
31
|
+
end
|
32
|
+
opt_table[hash['name']] = hash['default'] if hash['default']
|
33
|
+
}
|
34
|
+
|
35
|
+
acount = 0
|
36
|
+
|
37
|
+
arg_len = ARGV.length
|
38
|
+
opt_name = nil
|
39
|
+
opt_hash = nil
|
40
|
+
|
41
|
+
while (acount <= ARGV.length)
|
42
|
+
#puts "ARGV: " + ARGV.inspect
|
43
|
+
#puts "acount: #{acount}"
|
44
|
+
#puts "SW: #{ARGV[acount]}"
|
45
|
+
str = ARGV[acount]
|
46
|
+
#puts "1STR: #{str}"
|
47
|
+
|
48
|
+
opt_arg = true
|
49
|
+
case str
|
50
|
+
when /^--([^=]+)$/
|
51
|
+
opt_name = $1.gsub(/-/, '_')
|
52
|
+
opt_hash = @opt_def.select { |h| h['name'] == opt_name }.shift
|
53
|
+
raise InvalidArgument, "No such opt: #{str}" unless opt_hash
|
54
|
+
|
55
|
+
#p opt_hash
|
56
|
+
ARGV.delete_at(acount)
|
57
|
+
|
58
|
+
if opt_hash['required']
|
59
|
+
opt_arg = ARGV.delete_at(acount)
|
60
|
+
#puts "ARG: '#{opt_arg}'"
|
61
|
+
end
|
62
|
+
|
63
|
+
when /^--([^=]+)=(.*)/
|
64
|
+
opt_name, opt_arg = $1, $2
|
65
|
+
opt_name.gsub!(/-/, '_')
|
66
|
+
|
67
|
+
opt_hash = @opt_def.select { |h| h['name'] == opt_name }.shift
|
68
|
+
raise InvalidArgument, "No such opt: #{str}" unless opt_hash
|
69
|
+
raise ExtraneousArgument, "Option '--#{opt_name}' does not take an argument" unless opt_hash['required']
|
70
|
+
|
71
|
+
ARGV.delete_at(acount)
|
72
|
+
|
73
|
+
when /^-(.*)/
|
74
|
+
#puts "*three"
|
75
|
+
sopts = $1.split(//)
|
76
|
+
slen = sopts.length
|
77
|
+
|
78
|
+
ARGV.delete_at(acount)
|
79
|
+
sopts.each_with_index { |short_opt, i|
|
80
|
+
sopt = '-' + short_opt
|
81
|
+
opt_name = short_to_name[sopt]
|
82
|
+
|
83
|
+
raise InvalidArgument, "No such opt: #{sopt}" unless opt_name
|
84
|
+
|
85
|
+
opt_hash = @opt_def.select { |h| h['name'] == opt_name }.shift
|
86
|
+
|
87
|
+
#p @opt_def
|
88
|
+
#p sopt, opt_name, opt_hash
|
89
|
+
|
90
|
+
raise InvalidArgument, "No such opt: #{sopt}" unless opt_hash
|
91
|
+
# p opt_hash
|
92
|
+
|
93
|
+
raise MissingArgument, "#{sopt} requires argument" if opt_hash['required'] && i != slen - 1
|
94
|
+
|
95
|
+
if i == slen - 1 && opt_hash['required']
|
96
|
+
opt_arg = ARGV.delete_at(acount)
|
97
|
+
raise MissingArgument, "#{sopt} requires argument" unless opt_arg
|
98
|
+
end
|
99
|
+
|
100
|
+
@opt_table[opt_name] = opt_arg
|
101
|
+
#puts "NA: #{opt_name} #{opt_arg}"
|
102
|
+
}
|
103
|
+
next
|
104
|
+
|
105
|
+
else
|
106
|
+
#puts "STR: #{str}"
|
107
|
+
#puts "ELSE: #{ARGV}"
|
108
|
+
#puts
|
109
|
+
acount += 1
|
110
|
+
next
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
if opt_arg == '-' # read from stdin
|
115
|
+
opt_arg = STDIN.readlines.map(&:strip).map { |s| s != '' ? s : nil }.compact
|
116
|
+
opt_hash['proc'] = nil
|
117
|
+
end
|
118
|
+
|
119
|
+
@opt_table[opt_name] = opt_arg
|
120
|
+
|
121
|
+
#puts "acount end : #{acount}"
|
122
|
+
#puts
|
123
|
+
end
|
124
|
+
|
125
|
+
#p @opt_table
|
126
|
+
|
127
|
+
@opt_table.keys.each { |opt_name|
|
128
|
+
|
129
|
+
opt_hash = @opt_def.select { |h| h['name'] == opt_name }.shift
|
130
|
+
|
131
|
+
if prc = opt_hash['proc']
|
132
|
+
@opt_table[opt_name] = @opt_table[opt_name].instance_eval(prc)
|
133
|
+
end
|
134
|
+
}
|
135
|
+
|
136
|
+
#p @opt_table
|
137
|
+
return OpenStruct.new(@opt_table)
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
def usage(usage_str = nil)
|
142
|
+
|
143
|
+
if usage_str
|
144
|
+
str = "Usage: #{usage_str}\n"
|
145
|
+
else
|
146
|
+
str = ""
|
147
|
+
end
|
148
|
+
|
149
|
+
@opt_def.each { |opt_hash|
|
150
|
+
if opt_hash['comment']
|
151
|
+
str << "\n" + opt_hash['comment'] + "\n\n"
|
152
|
+
else
|
153
|
+
long_opt = '--' + opt_hash["name"].gsub(/_/, '-')
|
154
|
+
short_opt = opt_hash['short'] ? '-' + opt_hash['short'] : " "
|
155
|
+
desc = opt_hash['desc']
|
156
|
+
req_str = opt_hash['required'] ? " ARG" : " "
|
157
|
+
def_str = opt_hash['default'] ? " (def: #{opt_hash['default']})" : " "
|
158
|
+
|
159
|
+
str << sprintf(" %-40s (%s) : %s\n", "#{long_opt}#{req_str}", short_opt, desc + def_str)
|
160
|
+
end
|
161
|
+
}
|
162
|
+
return str
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
data/lib/nexposecli.rb
ADDED
data/nexposecli.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/nexposecli/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = "nexposecli"
|
6
|
+
spec.version = Nexposecli::VERSION
|
7
|
+
spec.authors = ['Erik Gomez', 'frozenr7']
|
8
|
+
spec.email = ['erik_gomez@rapid7.com', 'frozen@pobox.com']
|
9
|
+
|
10
|
+
spec.summary = 'Ruby command-line utility for Rapid7 Nexpose'
|
11
|
+
spec.description = 'This gem provides a Ruby command-line utility to the Nexpose vulnerability management product by Rapid7.'
|
12
|
+
spec.homepage = 'https://github.com/frozenr7/nexposecli'
|
13
|
+
|
14
|
+
spec.files = `git ls-files`.split($\)
|
15
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
16
|
+
spec.executables = ["nexposecli"]
|
17
|
+
spec.require_paths = ["lib"]
|
18
|
+
|
19
|
+
spec.add_runtime_dependency "nexpose", "~> 4.0.4"
|
20
|
+
spec.add_runtime_dependency "netaddr", "~> 1.5.1"
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.12"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
25
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nexposecli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.7
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Erik Gomez
|
8
|
+
- frozenr7
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2016-06-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: nexpose
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 4.0.4
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 4.0.4
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: netaddr
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.5.1
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 1.5.1
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: bundler
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '1.12'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '1.12'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rake
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '10.0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '10.0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rspec
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '3.0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '3.0'
|
84
|
+
description: This gem provides a Ruby command-line utility to the Nexpose vulnerability
|
85
|
+
management product by Rapid7.
|
86
|
+
email:
|
87
|
+
- erik_gomez@rapid7.com
|
88
|
+
- frozen@pobox.com
|
89
|
+
executables:
|
90
|
+
- nexposecli
|
91
|
+
extensions: []
|
92
|
+
extra_rdoc_files: []
|
93
|
+
files:
|
94
|
+
- ".gitignore"
|
95
|
+
- ".rspec"
|
96
|
+
- ".travis.yml"
|
97
|
+
- Gemfile
|
98
|
+
- README.md
|
99
|
+
- Rakefile
|
100
|
+
- bin/console
|
101
|
+
- bin/nexposecli
|
102
|
+
- bin/nexposecli.test
|
103
|
+
- bin/setup
|
104
|
+
- lib/nexposecli.rb
|
105
|
+
- lib/nexposecli/argparse.rb
|
106
|
+
- lib/nexposecli/version.rb
|
107
|
+
- nexposecli.gemspec
|
108
|
+
- spec/nexposecli_spec.rb
|
109
|
+
- spec/spec_helper.rb
|
110
|
+
homepage: https://github.com/frozenr7/nexposecli
|
111
|
+
licenses: []
|
112
|
+
metadata: {}
|
113
|
+
post_install_message:
|
114
|
+
rdoc_options: []
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
requirements: []
|
128
|
+
rubyforge_project:
|
129
|
+
rubygems_version: 2.5.1
|
130
|
+
signing_key:
|
131
|
+
specification_version: 4
|
132
|
+
summary: Ruby command-line utility for Rapid7 Nexpose
|
133
|
+
test_files:
|
134
|
+
- spec/nexposecli_spec.rb
|
135
|
+
- spec/spec_helper.rb
|