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.
@@ -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