netscaler-cli 0.3.3 → 0.4.0
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.
- data/Gemfile +7 -3
- data/Gemfile.lock +17 -8
- data/README.markdown +6 -3
- data/Rakefile +4 -6
- data/bin/{netscaler-server → netscaler} +2 -2
- data/etc/Version +1 -1
- data/lib/netscaler/{baseexecutor.rb → base_request.rb} +3 -4
- data/lib/netscaler/cli.rb +201 -0
- data/lib/netscaler/config.rb +20 -15
- data/lib/netscaler/executor.rb +34 -0
- data/lib/netscaler/extensions.rb +47 -0
- data/lib/netscaler/server/request.rb +35 -0
- data/lib/netscaler/server/response.rb +67 -0
- data/lib/netscaler/service/request.rb +42 -0
- data/lib/netscaler/service/response.rb +44 -0
- data/lib/netscaler/vserver/request.rb +67 -0
- data/lib/netscaler/vserver/response.rb +125 -0
- data/spec/netscaler/cli_spec.rb +140 -0
- data/spec/{config_spec.rb → netscaler/config_spec.rb} +23 -9
- data/spec/{configs → netscaler/configs}/bad-yaml.yml +0 -0
- data/spec/{configs → netscaler/configs}/missing-username.yml +0 -0
- data/spec/{configs → netscaler/configs}/simple-config.yml +2 -1
- data/spec/netscaler/extenstions_spec.rb +26 -0
- data/spec/{helpers.rb → spec_helpers.rb} +0 -0
- metadata +108 -53
- data/bin/netscaler-service +0 -5
- data/bin/netscaler-vserver +0 -5
- data/lib/netscaler/clitemplate.rb +0 -147
- data/lib/netscaler/server/cli.rb +0 -60
- data/lib/netscaler/server/executor.rb +0 -115
- data/lib/netscaler/service/cli.rb +0 -49
- data/lib/netscaler/service/executor.rb +0 -82
- data/lib/netscaler/vserver/cli.rb +0 -92
- data/lib/netscaler/vserver/executor.rb +0 -194
- data/spec/server/cli_spec.rb +0 -33
- data/spec/service/cli_spec.rb +0 -45
- data/spec/vserver/cli_spec.rb +0 -75
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helpers'
|
2
2
|
require 'netscaler/config'
|
3
3
|
require 'netscaler/errors'
|
4
4
|
|
@@ -7,28 +7,42 @@ module Netscaler
|
|
7
7
|
module ConfigurationHelper
|
8
8
|
def reading(file)
|
9
9
|
actual_file = File.expand_path("./configs/#{file}", File.dirname(__FILE__))
|
10
|
-
Netscaler::ConfigurationReader.
|
10
|
+
Netscaler::ConfigurationReader.read_config_file(actual_file)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
describe "Configuration Reader" do
|
15
15
|
include ConfigurationHelper
|
16
16
|
|
17
|
+
before :each do
|
18
|
+
@config = reading('simple-config.yml')
|
19
|
+
end
|
20
|
+
|
17
21
|
describe "when reading an existing file" do
|
18
22
|
it "should be able to load the basic config file" do
|
19
|
-
|
23
|
+
@config.load_balancers.length.should eql(2)
|
20
24
|
end
|
21
25
|
|
22
26
|
it "should set the username and password correctly when set in the file." do
|
23
|
-
|
24
|
-
|
25
|
-
|
27
|
+
ns = @config['something.goes.here']
|
28
|
+
ns.username.should eql('some_user')
|
29
|
+
ns.password.should eql('somepass')
|
26
30
|
end
|
27
31
|
|
28
32
|
it "should load via an alias" do
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
ns = @config['else']
|
34
|
+
ns.alias.should eql('else')
|
35
|
+
ns.username.should eql('here')
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should set the default version to 9.2" do
|
39
|
+
ns = @config['something.goes.here']
|
40
|
+
ns.version.should eql("9.2")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should read the version if present" do
|
44
|
+
ns = @config['else']
|
45
|
+
ns.version.should eql("9.1")
|
32
46
|
end
|
33
47
|
end
|
34
48
|
|
File without changes
|
File without changes
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helpers'
|
2
|
+
require 'netscaler/extensions'
|
3
|
+
|
4
|
+
describe Array do
|
5
|
+
it "should just print out the [] when empty" do
|
6
|
+
[].to_json.should eql('[]')
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should indent the [] if given" do
|
10
|
+
[].to_json(' ').should eql(' []')
|
11
|
+
end
|
12
|
+
|
13
|
+
class Integer
|
14
|
+
def to_json(prefix=nil)
|
15
|
+
to_s
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should print out the contents, one line each." do
|
20
|
+
[1, 2, 3].to_json.should eql("[\n 1,\n 2,\n 3\n]\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should print out the contents indented" do
|
24
|
+
[1, 2, 3].to_json(' ').should eql(" [\n 1,\n 2,\n 3\n ]\n")
|
25
|
+
end
|
26
|
+
end
|
File without changes
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netscaler-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 21
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
7
|
+
- 4
|
8
|
+
- 0
|
9
|
+
version: 0.4.0
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Gabe McArthur
|
@@ -15,8 +14,8 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date:
|
19
|
-
default_executable:
|
17
|
+
date: 2011-03-08 00:00:00 -08:00
|
18
|
+
default_executable: netscaler
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: log4r
|
@@ -26,7 +25,6 @@ dependencies:
|
|
26
25
|
requirements:
|
27
26
|
- - ~>
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 13
|
30
28
|
segments:
|
31
29
|
- 1
|
32
30
|
- 1
|
@@ -41,11 +39,11 @@ dependencies:
|
|
41
39
|
requirements:
|
42
40
|
- - ~>
|
43
41
|
- !ruby/object:Gem::Version
|
44
|
-
hash: 5
|
45
42
|
segments:
|
46
43
|
- 0
|
47
44
|
- 7
|
48
|
-
|
45
|
+
- 0
|
46
|
+
version: 0.7.0
|
49
47
|
type: :runtime
|
50
48
|
version_requirements: *id002
|
51
49
|
- !ruby/object:Gem::Dependency
|
@@ -56,7 +54,6 @@ dependencies:
|
|
56
54
|
requirements:
|
57
55
|
- - ">="
|
58
56
|
- !ruby/object:Gem::Version
|
59
|
-
hash: 3
|
60
57
|
segments:
|
61
58
|
- 1
|
62
59
|
- 6
|
@@ -64,75 +61,137 @@ dependencies:
|
|
64
61
|
type: :runtime
|
65
62
|
version_requirements: *id003
|
66
63
|
- !ruby/object:Gem::Dependency
|
67
|
-
name:
|
64
|
+
name: choosy
|
68
65
|
prerelease: false
|
69
66
|
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ~>
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
- 2
|
74
|
+
version: "0.2"
|
75
|
+
type: :runtime
|
76
|
+
version_requirements: *id004
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
name: rspec
|
79
|
+
prerelease: false
|
80
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
type: :development
|
89
|
+
version_requirements: *id005
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: autotest
|
92
|
+
prerelease: false
|
93
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
segments:
|
99
|
+
- 0
|
100
|
+
version: "0"
|
101
|
+
type: :development
|
102
|
+
version_requirements: *id006
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: autotest-notification
|
105
|
+
prerelease: false
|
106
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
segments:
|
112
|
+
- 0
|
113
|
+
version: "0"
|
114
|
+
type: :development
|
115
|
+
version_requirements: *id007
|
116
|
+
- !ruby/object:Gem::Dependency
|
117
|
+
name: log4r
|
118
|
+
prerelease: false
|
119
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
70
120
|
none: false
|
71
121
|
requirements:
|
72
122
|
- - ">="
|
73
123
|
- !ruby/object:Gem::Version
|
74
|
-
hash: 1
|
75
124
|
segments:
|
76
125
|
- 1
|
77
126
|
- 1
|
78
127
|
- 9
|
79
128
|
version: 1.1.9
|
80
129
|
type: :runtime
|
81
|
-
version_requirements: *
|
130
|
+
version_requirements: *id008
|
82
131
|
- !ruby/object:Gem::Dependency
|
83
132
|
name: savon
|
84
133
|
prerelease: false
|
85
|
-
requirement: &
|
134
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
86
135
|
none: false
|
87
136
|
requirements:
|
88
137
|
- - ">="
|
89
138
|
- !ruby/object:Gem::Version
|
90
|
-
hash: 17
|
91
139
|
segments:
|
92
140
|
- 0
|
93
141
|
- 7
|
94
142
|
- 9
|
95
143
|
version: 0.7.9
|
96
144
|
type: :runtime
|
97
|
-
version_requirements: *
|
145
|
+
version_requirements: *id009
|
98
146
|
- !ruby/object:Gem::Dependency
|
99
147
|
name: highline
|
100
148
|
prerelease: false
|
101
|
-
requirement: &
|
149
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
102
150
|
none: false
|
103
151
|
requirements:
|
104
152
|
- - ">="
|
105
153
|
- !ruby/object:Gem::Version
|
106
|
-
hash: 3
|
107
154
|
segments:
|
108
155
|
- 1
|
109
156
|
- 6
|
110
157
|
version: "1.6"
|
111
158
|
type: :runtime
|
112
|
-
version_requirements: *
|
159
|
+
version_requirements: *id010
|
113
160
|
- !ruby/object:Gem::Dependency
|
114
|
-
name:
|
161
|
+
name: choosy
|
115
162
|
prerelease: false
|
116
|
-
requirement: &
|
163
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
117
164
|
none: false
|
118
165
|
requirements:
|
119
166
|
- - ">="
|
120
167
|
- !ruby/object:Gem::Version
|
121
|
-
hash: 7
|
122
168
|
segments:
|
169
|
+
- 0
|
123
170
|
- 2
|
171
|
+
- 3
|
172
|
+
version: 0.2.3
|
173
|
+
type: :runtime
|
174
|
+
version_requirements: *id011
|
175
|
+
- !ruby/object:Gem::Dependency
|
176
|
+
name: rspec
|
177
|
+
prerelease: false
|
178
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
179
|
+
none: false
|
180
|
+
requirements:
|
181
|
+
- - ">="
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
segments:
|
124
184
|
- 2
|
185
|
+
- 5
|
125
186
|
- 0
|
126
|
-
version: 2.
|
187
|
+
version: 2.5.0
|
127
188
|
type: :development
|
128
|
-
version_requirements: *
|
189
|
+
version_requirements: *id012
|
129
190
|
description: This gem installs several simple command line utilities locally. It uses the NSConfig.wsdl SOAP interface for remote access.
|
130
191
|
email:
|
131
192
|
- madeonamac@gmail.com
|
132
193
|
executables:
|
133
|
-
- netscaler
|
134
|
-
- netscaler-service
|
135
|
-
- netscaler-server
|
194
|
+
- netscaler
|
136
195
|
extensions: []
|
137
196
|
|
138
197
|
extra_rdoc_files:
|
@@ -142,31 +201,30 @@ files:
|
|
142
201
|
- Gemfile.lock
|
143
202
|
- README.markdown
|
144
203
|
- Rakefile
|
145
|
-
- bin/netscaler
|
146
|
-
- bin/netscaler-service
|
147
|
-
- bin/netscaler-vserver
|
204
|
+
- bin/netscaler
|
148
205
|
- etc/Version
|
149
|
-
- lib/netscaler/
|
150
|
-
- lib/netscaler/
|
206
|
+
- lib/netscaler/base_request.rb
|
207
|
+
- lib/netscaler/cli.rb
|
151
208
|
- lib/netscaler/config.rb
|
152
209
|
- lib/netscaler/errors.rb
|
210
|
+
- lib/netscaler/executor.rb
|
211
|
+
- lib/netscaler/extensions.rb
|
153
212
|
- lib/netscaler/logging.rb
|
154
|
-
- lib/netscaler/server/
|
155
|
-
- lib/netscaler/server/
|
156
|
-
- lib/netscaler/service/
|
157
|
-
- lib/netscaler/service/
|
213
|
+
- lib/netscaler/server/request.rb
|
214
|
+
- lib/netscaler/server/response.rb
|
215
|
+
- lib/netscaler/service/request.rb
|
216
|
+
- lib/netscaler/service/response.rb
|
158
217
|
- lib/netscaler/transaction.rb
|
159
218
|
- lib/netscaler/version.rb
|
160
|
-
- lib/netscaler/vserver/
|
161
|
-
- lib/netscaler/vserver/
|
162
|
-
- spec/
|
163
|
-
- spec/
|
164
|
-
- spec/configs/
|
165
|
-
- spec/configs/
|
166
|
-
- spec/
|
167
|
-
- spec/
|
168
|
-
- spec/
|
169
|
-
- spec/vserver/cli_spec.rb
|
219
|
+
- lib/netscaler/vserver/request.rb
|
220
|
+
- lib/netscaler/vserver/response.rb
|
221
|
+
- spec/netscaler/cli_spec.rb
|
222
|
+
- spec/netscaler/config_spec.rb
|
223
|
+
- spec/netscaler/configs/bad-yaml.yml
|
224
|
+
- spec/netscaler/configs/missing-username.yml
|
225
|
+
- spec/netscaler/configs/simple-config.yml
|
226
|
+
- spec/netscaler/extenstions_spec.rb
|
227
|
+
- spec/spec_helpers.rb
|
170
228
|
has_rdoc: true
|
171
229
|
homepage: http://github.com/gabemc/netscaler-cli
|
172
230
|
licenses: []
|
@@ -181,7 +239,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
181
239
|
requirements:
|
182
240
|
- - ">="
|
183
241
|
- !ruby/object:Gem::Version
|
184
|
-
hash: 3
|
185
242
|
segments:
|
186
243
|
- 0
|
187
244
|
version: "0"
|
@@ -190,7 +247,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
247
|
requirements:
|
191
248
|
- - ">="
|
192
249
|
- !ruby/object:Gem::Version
|
193
|
-
hash: 3
|
194
250
|
segments:
|
195
251
|
- 0
|
196
252
|
version: "0"
|
@@ -202,8 +258,7 @@ signing_key:
|
|
202
258
|
specification_version: 3
|
203
259
|
summary: Simple command line utilities for interacting remotely with a Netscaler load balancer.
|
204
260
|
test_files:
|
205
|
-
- spec/
|
206
|
-
- spec/
|
207
|
-
- spec/
|
208
|
-
- spec/
|
209
|
-
- spec/vserver/cli_spec.rb
|
261
|
+
- spec/netscaler/cli_spec.rb
|
262
|
+
- spec/netscaler/config_spec.rb
|
263
|
+
- spec/netscaler/extenstions_spec.rb
|
264
|
+
- spec/spec_helpers.rb
|
data/bin/netscaler-service
DELETED
data/bin/netscaler-vserver
DELETED
@@ -1,147 +0,0 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
require 'netscaler/errors'
|
3
|
-
require 'netscaler/version'
|
4
|
-
require 'netscaler/logging'
|
5
|
-
require 'netscaler/transaction'
|
6
|
-
require 'netscaler/config'
|
7
|
-
|
8
|
-
module Netscaler
|
9
|
-
class CLITemplate
|
10
|
-
attr_reader :options, :args, :host, :cli_type
|
11
|
-
|
12
|
-
def initialize(cli_type, args)
|
13
|
-
@cli_type = cli_type
|
14
|
-
@args = args
|
15
|
-
end
|
16
|
-
|
17
|
-
def execute!
|
18
|
-
begin
|
19
|
-
parse!(@args.dup)
|
20
|
-
Netscaler::Logging.configure(options[:debug])
|
21
|
-
|
22
|
-
Netscaler::Transaction.new(netscaler_configuration) do |client|
|
23
|
-
action = options[:action][0]
|
24
|
-
executor = create_executor(client)
|
25
|
-
|
26
|
-
executor.send(action, options)
|
27
|
-
end
|
28
|
-
rescue SystemExit => e
|
29
|
-
raise
|
30
|
-
rescue Netscaler::ConfigurationError => e
|
31
|
-
print_error(e.message)
|
32
|
-
rescue OptionParser::ParseError => e
|
33
|
-
print_error(e.message)
|
34
|
-
rescue Exception => e
|
35
|
-
STDERR.puts e.backtrace
|
36
|
-
print_error(e.message)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def parse!(args)
|
41
|
-
parse_options(args)
|
42
|
-
validate_args(args)
|
43
|
-
end
|
44
|
-
|
45
|
-
def parse_options(args)
|
46
|
-
@options ||= {}
|
47
|
-
if @options.empty?
|
48
|
-
@options[:action] = Array.new
|
49
|
-
end
|
50
|
-
@parsed_options ||= OptionParser.new do |opts|
|
51
|
-
interface_header(opts)
|
52
|
-
interface_configuration(opts)
|
53
|
-
interface_actions(opts)
|
54
|
-
interface_information(opts)
|
55
|
-
end.parse!(args)
|
56
|
-
end
|
57
|
-
|
58
|
-
def interface_configuration(opts)
|
59
|
-
opts.separator " Configuration: "
|
60
|
-
opts.on('-n', '--netscaler NETSCALER',
|
61
|
-
"The IP or hostname of the Netscaler",
|
62
|
-
"load balancer.",
|
63
|
-
"This argument is required.") do |n|
|
64
|
-
options[:netscaler] = n
|
65
|
-
end
|
66
|
-
opts.on('-c', '--config CONFIG',
|
67
|
-
"The path to the netscaler-cli configuration",
|
68
|
-
"file. By default, it is the ",
|
69
|
-
"~/.netscaler-cli.yml") do |c|
|
70
|
-
options[:config] = c
|
71
|
-
end
|
72
|
-
opts.separator ""
|
73
|
-
end
|
74
|
-
|
75
|
-
def interface_information(opts)
|
76
|
-
opts.separator " Informative:"
|
77
|
-
opts.on('--debug',
|
78
|
-
"Prints extra debug information") do |d|
|
79
|
-
options[:debug] = d
|
80
|
-
end
|
81
|
-
opts.on('--json',
|
82
|
-
"Prints out JSON data instead of textual output.") do |j|
|
83
|
-
options[:json] = j
|
84
|
-
end
|
85
|
-
opts.on('-v', '--version',
|
86
|
-
"Show the version information") do |v|
|
87
|
-
puts "#{File.basename($0)} version: #{Netscaler::Version.to_s}"
|
88
|
-
exit
|
89
|
-
end
|
90
|
-
opts.on('-h', '--help',
|
91
|
-
"Show this help message") do
|
92
|
-
puts opts
|
93
|
-
exit
|
94
|
-
end
|
95
|
-
|
96
|
-
opts.separator ""
|
97
|
-
end
|
98
|
-
|
99
|
-
def requires_argument?
|
100
|
-
true
|
101
|
-
end
|
102
|
-
|
103
|
-
def validate_noargs
|
104
|
-
end
|
105
|
-
|
106
|
-
def validate_args(args)
|
107
|
-
if args.length == 0
|
108
|
-
if requires_argument?
|
109
|
-
raise Netscaler::ConfigurationError.new("No hosts specified to act on.")
|
110
|
-
else
|
111
|
-
validate_noargs
|
112
|
-
end
|
113
|
-
elsif args.length != 1
|
114
|
-
raise Netscaler::ConfigurationError.new("Only one #{cli_type} can be acted on at a time.")
|
115
|
-
else
|
116
|
-
@host = args[0]
|
117
|
-
end
|
118
|
-
|
119
|
-
if options[:action].empty?
|
120
|
-
options[:action] << :status
|
121
|
-
elsif options[:action].length != 1
|
122
|
-
raise Netscaler::ConfigurationError.new("Multiple actions specified -- only one action is supported at a time.")
|
123
|
-
end
|
124
|
-
|
125
|
-
if options[:netscaler].nil?
|
126
|
-
raise Netscaler::ConfigurationError.new("No Netscaler IP/Hostname given.")
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
def netscaler_configuration
|
131
|
-
reader = Netscaler::ConfigurationReader.new(options[:config])
|
132
|
-
config = reader[options[:netscaler]]
|
133
|
-
if config.nil?
|
134
|
-
raise Netscaler::ConfigurationError.new("The Netscaler address '#{options[:netscaler]}' is not defined in the configuration file")
|
135
|
-
end
|
136
|
-
|
137
|
-
config
|
138
|
-
end
|
139
|
-
|
140
|
-
private
|
141
|
-
def print_error(e)
|
142
|
-
STDERR.puts "#{File.basename($0)}: #{e}"
|
143
|
-
STDERR.puts "Try '#{File.basename($0)} --help' for more information"
|
144
|
-
exit 1
|
145
|
-
end
|
146
|
-
end # CLI
|
147
|
-
end
|