nexposecli 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'nexposecli'
4
+
5
+ chatter = Nexposecli::Chatter.new
6
+ chatter.say_hello
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,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
@@ -0,0 +1,3 @@
1
+ module Nexposecli
2
+ VERSION = "0.1.7"
3
+ end
data/lib/nexposecli.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "nexposecli/version"
2
+ require "nexposecli/argparse"
3
+
4
+ module Nexposecli
5
+ class Chatter
6
+ def say_hello
7
+ puts 'This is nexposecli. Coming Soon.'
8
+ end
9
+ end
10
+ end
@@ -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
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Nexposecli do
4
+ it 'has a version number' do
5
+ expect(Nexposecli::VERSION).not_to be nil
6
+ end
7
+
8
+ it 'does something useful' do
9
+ expect(false).to eq(true)
10
+ end
11
+ end
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'nexposecli'
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