stingray-exec 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/.rspec +2 -0
- data/.simplecov +7 -0
- data/AUTHORS.md +2 -0
- data/CONTRIBUTING.md +8 -0
- data/Gemfile +12 -0
- data/LICENSE.txt +22 -0
- data/README.md +66 -0
- data/Rakefile +22 -0
- data/bin/stingray-exec +3 -0
- data/examples/add-pool +10 -0
- data/examples/bork +6 -0
- data/examples/credentials.conf +4 -0
- data/examples/delete-pool +10 -0
- data/examples/list-pools +8 -0
- data/examples/list-virtual-servers +8 -0
- data/generate-actions.rb +119 -0
- data/lib/stingray-exec.rb +5 -0
- data/lib/stingray/control_api.rb +112 -0
- data/lib/stingray/control_api/actions.rb +49 -0
- data/lib/stingray/control_api/catalog_rule_methods.rb +31 -0
- data/lib/stingray/control_api/endpoint.rb +23 -0
- data/lib/stingray/control_api/generated-actions-9.0.yml +9036 -0
- data/lib/stingray/control_api/generated-actions-9.1.yml +9172 -0
- data/lib/stingray/control_api/pool_methods.rb +156 -0
- data/lib/stingray/control_api/soap_helper_methods.rb +69 -0
- data/lib/stingray/exec.rb +16 -0
- data/lib/stingray/exec/cli.rb +134 -0
- data/lib/stingray/exec/dsl.rb +48 -0
- data/lib/stingray/exec/version.rb +5 -0
- data/lib/stingray/junk.rb +16 -0
- data/spec/integration/catalog_rule_spec.rb +116 -0
- data/spec/integration/pool_spec.rb +61 -0
- data/spec/integration/users_spec.rb +21 -0
- data/spec/lib/stingray/control_api_spec.rb +51 -0
- data/spec/lib/stingray/exec/cli_spec.rb +7 -0
- data/spec/lib/stingray/exec/version_spec.rb +5 -0
- data/spec/spec_helper.rb +26 -0
- data/stingray-exec.gemspec +29 -0
- metadata +131 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.simplecov
ADDED
data/AUTHORS.md
ADDED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
# Contributing
|
2
|
+
|
3
|
+
1. Fork it
|
4
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
5
|
+
3. Add yourself to the `AUTHORS.md` file
|
6
|
+
4. Commit your changes (`git commit -v`)
|
7
|
+
5. Push to the branch (`git push -u origin my-new-feature`)
|
8
|
+
6. Create new Pull Request
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 ModCloth, Inc.
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# `stingray-exec`
|
2
|
+
|
3
|
+
Stingray Traffic Manager Control API Client
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Install it via `gem`:
|
8
|
+
|
9
|
+
$ gem install stingray-exec
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
TODO: yup
|
14
|
+
|
15
|
+
## Hacking
|
16
|
+
|
17
|
+
Some (all?) of this may be obvious for those familiar with Ruby modern
|
18
|
+
projects. It'll be okay.
|
19
|
+
|
20
|
+
Clone down a copy
|
21
|
+
````` bash
|
22
|
+
git clone git://github.com/modcloth/stingray-exec.git
|
23
|
+
pushd stingray-exec
|
24
|
+
`````
|
25
|
+
|
26
|
+
Make sure you have `bundler`
|
27
|
+
````` bash
|
28
|
+
gem install bundler
|
29
|
+
`````
|
30
|
+
|
31
|
+
Pull in dependencies with `bundler`
|
32
|
+
````` bash
|
33
|
+
bundle install
|
34
|
+
`````
|
35
|
+
|
36
|
+
Verify basic operation with the `stingray-exec` script
|
37
|
+
````` bash
|
38
|
+
bundle exec bin/stingray-exec --help
|
39
|
+
`````
|
40
|
+
|
41
|
+
As you'll see in the usage text, all of the command-line flags may also
|
42
|
+
be passed as environmental variables. The idea here is that it's
|
43
|
+
sometimes easier to define an environmental variable soup instead of
|
44
|
+
having to pass lots of flags for every invocation.
|
45
|
+
|
46
|
+
### Running the tests
|
47
|
+
|
48
|
+
The test suite uses RSpec. By default, all specs tagged with
|
49
|
+
`:integration => true` are excluded. This results in very little being
|
50
|
+
tested. In order to exercise the really interesting tests, you'll have
|
51
|
+
to define a `STINGRAY_ENDOINT` environmental variable. Some examples of
|
52
|
+
how to do this are available in the `.local.integration.env` and
|
53
|
+
`.vagrant.integration.env` files in the root of the project tree.
|
54
|
+
|
55
|
+
````` bash
|
56
|
+
bundle exec rspec
|
57
|
+
`````
|
58
|
+
|
59
|
+
## Examples
|
60
|
+
|
61
|
+
There are some example `stingray-exec` scripts present in the
|
62
|
+
`./examples` directory. The `stingray-exec` script accepts a filename
|
63
|
+
as positional argument, so using it in the shebang line works great.
|
64
|
+
|
65
|
+
**WARNING**: some of the examples are destructive, so don't go pointing
|
66
|
+
them at production systems or any such nonsense.
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
stingray_tarball_name = 'ZeusTM_91_Linux-x86_64.tgz'
|
4
|
+
stingray_tarball_url = 'https://support.riverbed.com/download.htm' <<
|
5
|
+
"?filename=public/software/stingray/trafficmanager/9.1/#{stingray_tarball_name}"
|
6
|
+
stingray_tarball_sha1sum = 'bef75c80dbf7f13572ccfefec7791083180e78e0'
|
7
|
+
|
8
|
+
desc 'downloads zeus/stingray traffic manager tarball'
|
9
|
+
task :download_stingray do
|
10
|
+
unless have_stingray_tarball?(stingray_tarball_name, stingray_tarball_sha1sum)
|
11
|
+
sh "curl -o '#{stingray_tarball_name}' '#{stingray_tarball_url}'"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def have_stingray_tarball?(tarball, sha1sum)
|
16
|
+
File.exists?(tarball) &&
|
17
|
+
get_stingray_tarball_sha1sum(tarball) == sha1sum
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_stingray_tarball_sha1sum(tarball)
|
21
|
+
`openssl dgst -sha1 #{tarball}`.chomp.split.last
|
22
|
+
end
|
data/bin/stingray-exec
ADDED
data/examples/add-pool
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env stingray-exec
|
2
|
+
# vim:filetype=ruby
|
3
|
+
|
4
|
+
ssl_verify_mode :none
|
5
|
+
|
6
|
+
# Adds a pool named by the first positional argument with nodes given from all
|
7
|
+
# remaining arguments. Note that we don't start at `ARGV.first` because this
|
8
|
+
# script is evaluated from within an existing ruby process.
|
9
|
+
pool.add_pool(ARGV[1] => ARGV[2..ARGV.length])
|
10
|
+
puts "Added!"
|
data/examples/bork
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env stingray-exec
|
2
|
+
# vim:filetype=ruby
|
3
|
+
|
4
|
+
ssl_verify_mode :none
|
5
|
+
|
6
|
+
# Removes any number of named pools given as positional arguments. Note that
|
7
|
+
# we don't start at `ARGV.first` because this script is evaluated from within
|
8
|
+
# an existing ruby process.
|
9
|
+
pool.delete_pool(*ARGV[1..ARGV.length])
|
10
|
+
puts "Deleted!"
|
data/examples/list-pools
ADDED
data/generate-actions.rb
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'wasabi'
|
4
|
+
|
5
|
+
USAGE = <<-EOU
|
6
|
+
Usage: #{File.basename($0)} [-h|--help] <stingray-wsdl-dir>
|
7
|
+
|
8
|
+
Generate a YAML blob containing all methods found in the WSDL files provided in
|
9
|
+
the built-in Stingray docs. This is done so that we can use Savon::Model to
|
10
|
+
build classes with predefined actions without having to distribute the WSDL
|
11
|
+
files ourselves, which would be uncool and probably illegal.
|
12
|
+
EOU
|
13
|
+
STINGRAY_WSDL_CONFIGURATIONS = %w(
|
14
|
+
AFM
|
15
|
+
AlertCallback
|
16
|
+
Alerting.Action
|
17
|
+
Alerting.EventType
|
18
|
+
Catalog.Aptimizer.Profile
|
19
|
+
Catalog.Authenticators
|
20
|
+
Catalog.Bandwidth
|
21
|
+
Catalog.JavaExtension
|
22
|
+
Catalog.Monitor
|
23
|
+
Catalog.Persistence
|
24
|
+
Catalog.Protection
|
25
|
+
Catalog.Rate
|
26
|
+
Catalog.Rule
|
27
|
+
Catalog.SLM
|
28
|
+
Catalog.SSL.CertificateAuthorities
|
29
|
+
Catalog.SSL.Certificates
|
30
|
+
Catalog.SSL.ClientCertificates
|
31
|
+
Catalog.SSL.DNSSEC
|
32
|
+
Conf.Extra_1_0
|
33
|
+
Conf.Extra
|
34
|
+
Diagnose_1_0
|
35
|
+
Diagnose
|
36
|
+
GLB.Service
|
37
|
+
GlobalSettings
|
38
|
+
Location
|
39
|
+
Pool
|
40
|
+
System.AccessLogs
|
41
|
+
System.Backups
|
42
|
+
System.Cache_1_0
|
43
|
+
System.Cache_1_1
|
44
|
+
System.Cache
|
45
|
+
System.CloudCredentials
|
46
|
+
System.Connections
|
47
|
+
System.LicenseKeys
|
48
|
+
System.Log
|
49
|
+
System.MachineInfo
|
50
|
+
System.Management
|
51
|
+
System.RequestLogs
|
52
|
+
System.Stats
|
53
|
+
System.Steelhead
|
54
|
+
TrafficIPGroups
|
55
|
+
Users
|
56
|
+
VirtualServer
|
57
|
+
)
|
58
|
+
|
59
|
+
class ActionsGenerator
|
60
|
+
def self.main(argv)
|
61
|
+
wsdl_root = argv.first
|
62
|
+
if %w(-h --help).include?(wsdl_root)
|
63
|
+
$stderr.puts(USAGE)
|
64
|
+
return 0
|
65
|
+
elsif wsdl_root.nil? || wsdl_root.empty?
|
66
|
+
$stderr.puts "ERROR: Missing required argument <stingray-wsdl-dir>"
|
67
|
+
$stderr.puts(USAGE)
|
68
|
+
return 1
|
69
|
+
end
|
70
|
+
|
71
|
+
return new(wsdl_root).generate!
|
72
|
+
rescue => e
|
73
|
+
$stderr.puts "ERROR: #{e.class.name} #{e.message}"
|
74
|
+
$stderr.puts e.backtrace.join("\n") if ENV['DEBUG']
|
75
|
+
return 2
|
76
|
+
end
|
77
|
+
|
78
|
+
def initialize(wsdl_root, out = $stdout)
|
79
|
+
@wsdl_root = wsdl_root
|
80
|
+
@out = out
|
81
|
+
end
|
82
|
+
|
83
|
+
def generate!
|
84
|
+
@out.puts generate_actions_json
|
85
|
+
return 0
|
86
|
+
rescue => e
|
87
|
+
$stderr.puts "ERROR: #{e.class.name} #{e.message}"
|
88
|
+
$stderr.puts e.backtrace.join("\n") if ENV['DEBUG']
|
89
|
+
return 2
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
def generate_actions_json
|
94
|
+
actions = {}
|
95
|
+
STINGRAY_WSDL_CONFIGURATIONS.each do |cfg|
|
96
|
+
actions[cfg] = generate_actions_for_config(cfg)
|
97
|
+
end
|
98
|
+
|
99
|
+
YAML.dump(actions)
|
100
|
+
end
|
101
|
+
|
102
|
+
def generate_actions_for_config(cfg)
|
103
|
+
doc = Wasabi.document(File.read("#{@wsdl_root}/#{cfg}.wsdl"))
|
104
|
+
sorted_ops = {}
|
105
|
+
ops = doc.operations
|
106
|
+
ops.keys.sort.each do |k|
|
107
|
+
sorted_ops[k] = ops[k]
|
108
|
+
end
|
109
|
+
sorted_ops
|
110
|
+
rescue => e
|
111
|
+
$stderr.puts "ERROR: getting operations for #{cfg}: #{e.class.name} #{e.message}"
|
112
|
+
$stderr.puts e.backtrace.join("\n") if ENV['DEBUG']
|
113
|
+
{}
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
if $0 == __FILE__
|
118
|
+
exit(ActionsGenerator.main(ARGV))
|
119
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'stingray/junk'
|
2
|
+
|
3
|
+
module Stingray
|
4
|
+
module ControlApi
|
5
|
+
CONFIGURATIONS = {}.tap do |c|
|
6
|
+
%w(
|
7
|
+
AFM
|
8
|
+
AlertCallback
|
9
|
+
Alerting.Action
|
10
|
+
Alerting.EventType
|
11
|
+
Catalog.Aptimizer.Profile
|
12
|
+
Catalog.Authenticators
|
13
|
+
Catalog.Bandwidth
|
14
|
+
Catalog.JavaExtension
|
15
|
+
Catalog.Monitor
|
16
|
+
Catalog.Persistence
|
17
|
+
Catalog.Protection
|
18
|
+
Catalog.Rate
|
19
|
+
Catalog.Rule
|
20
|
+
Catalog.SLM
|
21
|
+
Catalog.SSL.CertificateAuthorities
|
22
|
+
Catalog.SSL.Certificates
|
23
|
+
Catalog.SSL.ClientCertificates
|
24
|
+
Catalog.SSL.DNSSEC
|
25
|
+
Conf.Extra_1_0
|
26
|
+
Conf.Extra
|
27
|
+
Diagnose_1_0
|
28
|
+
Diagnose
|
29
|
+
GLB.Service
|
30
|
+
GlobalSettings
|
31
|
+
Location
|
32
|
+
Pool
|
33
|
+
System.AccessLogs
|
34
|
+
System.Backups
|
35
|
+
System.Cache_1_0
|
36
|
+
System.Cache_1_1
|
37
|
+
System.Cache
|
38
|
+
System.CloudCredentials
|
39
|
+
System.Connections
|
40
|
+
System.LicenseKeys
|
41
|
+
System.Log
|
42
|
+
System.MachineInfo
|
43
|
+
System.Management
|
44
|
+
System.RequestLogs
|
45
|
+
System.Stats
|
46
|
+
System.Steelhead
|
47
|
+
TrafficIPGroups
|
48
|
+
Users
|
49
|
+
VirtualServer
|
50
|
+
).each do |cfg|
|
51
|
+
c[cfg] = {
|
52
|
+
:snaked => Stingray::Junk.snakify(cfg),
|
53
|
+
:consted => Stingray::Junk.constify(cfg),
|
54
|
+
}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
CONFIGURATIONS_BY_CONST = {}.tap do |c|
|
58
|
+
CONFIGURATIONS.each do |k, v|
|
59
|
+
c[v[:consted]] = v.merge(:ns => k)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.const_missing(sym)
|
64
|
+
const = sym.to_s
|
65
|
+
snaked = (CONFIGURATIONS_BY_CONST[const] || {})[:snaked]
|
66
|
+
unless snaked
|
67
|
+
return super
|
68
|
+
end
|
69
|
+
|
70
|
+
require 'savon'
|
71
|
+
require 'stingray/control_api/endpoint'
|
72
|
+
require 'stingray/control_api/actions'
|
73
|
+
|
74
|
+
const_set(sym, Class.new(Object) do
|
75
|
+
extend Savon::Model
|
76
|
+
|
77
|
+
class << self
|
78
|
+
attr_accessor :_action_map
|
79
|
+
end
|
80
|
+
self._action_map = Stingray::ControlApi::Actions.send(:"#{snaked}_action_map")
|
81
|
+
|
82
|
+
actions(*_action_map.keys.map(&:to_sym))
|
83
|
+
_action_map.keys.each do |action|
|
84
|
+
action_str = action.to_s
|
85
|
+
response_key = :"#{action_str}_response"
|
86
|
+
define_method(action) do |*args|
|
87
|
+
custom_method = :"_custom_#{action_str}"
|
88
|
+
if respond_to?(custom_method)
|
89
|
+
# use a custom method defined in a *Methods module
|
90
|
+
return send(custom_method, *args).body[response_key]
|
91
|
+
else
|
92
|
+
# fall back to the Savon::Model version
|
93
|
+
return super(*args).body[response_key]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
basic_auth(*Stingray::ControlApi::Endpoint.auth)
|
99
|
+
endpoint Stingray::ControlApi::Endpoint.full_endpoint_uri
|
100
|
+
namespace Stingray::ControlApi::Actions.send(:"#{snaked}_namespace")
|
101
|
+
|
102
|
+
_methods_file = File.expand_path("../control_api/#{snaked}_methods.rb", __FILE__)
|
103
|
+
if File.exists?(_methods_file)
|
104
|
+
load _methods_file
|
105
|
+
instance_eval do
|
106
|
+
include Stingray::ControlApi.const_get("#{const}Methods")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|