dynect-utils 0.0.1

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,3 @@
1
+ *.gem
2
+ .bundle
3
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in dynect-utils.gemspec
4
+ gemspec
@@ -0,0 +1,26 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ dynect-utils (0.0.1)
5
+ dynect_rest
6
+ trollop
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ dynect_rest (0.4.0)
12
+ json
13
+ json
14
+ rest-client
15
+ rest-client
16
+ json (1.6.5)
17
+ mime-types (1.17.2)
18
+ rest-client (1.6.7)
19
+ mime-types (>= 1.16)
20
+ trollop (1.16.2)
21
+
22
+ PLATFORMS
23
+ ruby
24
+
25
+ DEPENDENCIES
26
+ dynect-utils!
@@ -0,0 +1,71 @@
1
+ # dynect-utils
2
+
3
+ This is a set of utilities that use the
4
+ [DynECT](http://dyn.com/dns/dynect-managed-dns/) REST API to help
5
+ monitor and manage the service.
6
+
7
+ ## Nagios plugin: check_dynect_gslb_region
8
+
9
+ Checks the health-check status of the addresses in a GSLB region's pool.
10
+
11
+ Usage:
12
+
13
+ Options:
14
+ --customer, -c <s>: Dynect customer name
15
+ --user, -u <s>: Dynect user name
16
+ --pass, -p <s>: Dynect password
17
+ --zone, -z <s>: Zone name
18
+ --record, -r <s>: GSLB record name
19
+ --region, -R <s>: GSLB region (default: global)
20
+ --help, -h: Show this message
21
+
22
+ Example output:
23
+
24
+ $ check_dynect_gslb_region -c Customer -u user -p pass123 -z example.org -r foo.example.org
25
+ OK: all GSLB addresses are healthy
26
+
27
+ $ check_dynect_gslb_region -c Customer -u user -p pass123 -z example.org -r bar.example.org
28
+ CRITICAL: GSLB addresses unhealthy: 1.2.3.4=down
29
+
30
+ ## Utility: dynect_gslb_manage
31
+
32
+ Drains/undrains a specific address in a GSLB region's pool.
33
+
34
+ Usage:
35
+
36
+ Usage: dynect_gslb_manage [options] command [command opts]
37
+
38
+ Possible sub-commands:
39
+
40
+ list
41
+ List all GSLB IPs
42
+
43
+ drain <address|label>
44
+ Set the serving mode to "no" for a GSLB address, identified by IP
45
+ address or label.
46
+
47
+ undrain <address|label>
48
+ Set the serving mode to "obey" for a GSLB address, identified by IP
49
+ address or label.
50
+
51
+ Main options:
52
+
53
+ --customer, -c <s>: Dynect customer name
54
+ --user, -u <s>: Dynect user name
55
+ --pass, -p <s>: Dynect password
56
+ --zone, -z <s>: Zone name
57
+ --record, -r <s>: GSLB record name
58
+ --region, -R <s>: GSLB region (default: global)
59
+ --help, -h: Show this message
60
+
61
+ Example output:
62
+
63
+ $ dynect_gslb_manage -c Customer -u user -p pass123 -z example.org -r foo.example.org list
64
+ foo-backend-1 | 1.2.3.4 | status=up | weight=1 | serve_mode=obey
65
+ foo-backend-2 | 1.2.3.5 | status=up | weight=1 | serve_mode=obey
66
+
67
+ $ dynect_gslb_manage -c Customer -u user -p pass123 -z example.org -r foo.example.org drain foo-backend-1
68
+ 1.2.3.4 serve_mode changed from obey to no
69
+
70
+ $ dynect_gslb_manage -c Customer -u user -p pass123 -z example.org -r foo.example.org undrain foo-backend-1
71
+ 1.2.3.4 serve_mode changed from no to obey
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+ # Nagios plugin to monitor the status of IP addresses in a GSLB region.
3
+
4
+ require "rubygems"
5
+ require "bundler/setup"
6
+
7
+ require "dynect_rest"
8
+ require "trollop"
9
+
10
+ progname = File.basename($0)
11
+
12
+ opts = Trollop::options do
13
+ opt :customer, "Dynect customer name", :short => "-c", :type => :string,
14
+ :required => true
15
+ opt :user, "Dynect user name", :short => "-u", :type => :string,
16
+ :required => true
17
+ opt :pass, "Dynect password", :short => "-p", :type => :string,
18
+ :required => true
19
+ opt :zone, "Zone name", :short => "-z", :type => :string,
20
+ :required => true
21
+ opt :record, "GSLB record name", :short => "-r", :type => :string,
22
+ :required => true
23
+ opt :region, "GSLB region", :short => "-R", :type => :string,
24
+ :default => "global"
25
+ end
26
+
27
+ dyn = DynectRest.new(opts[:customer], opts[:user], opts[:pass], opts[:zone])
28
+ gslb = dyn.get("GSLB/#{opts[:zone]}/#{opts[:record]}")
29
+
30
+ region = gslb["region"].select { |r| r["region_code"] == opts[:region] }.first
31
+ if region.nil?
32
+ puts "UNKNOWN: can't find region #{region}"
33
+ exit 3
34
+ end
35
+
36
+ down = {}
37
+ region["pool"].each do |address|
38
+ if address["status"] != "up"
39
+ down[address["address"]] = address["status"]
40
+ end
41
+ end
42
+
43
+ if down.length > 0
44
+ msg = down.collect { |addr, status| "#{addr}=#{status}" }.join("; ")
45
+ puts "CRITICAL: GSLB addresses unhealthy: #{msg}"
46
+ exit 2
47
+ end
48
+
49
+ puts "OK: all GSLB addresses are healthy"
50
+ exit 0
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env ruby
2
+ # Nagios plugin to monitor the status of IP addresses in a GSLB region.
3
+
4
+ require "rubygems"
5
+ require "bundler/setup"
6
+
7
+ require "dynect_rest"
8
+ require "trollop"
9
+
10
+ progname = File.basename($0)
11
+
12
+ opts = Trollop::options do
13
+ banner <<-EOF
14
+ Usage: #{progname} [options] command [command opts]
15
+
16
+ Possible sub-commands:
17
+
18
+ list
19
+ List all GSLB IPs
20
+
21
+ drain <address|label>
22
+ Set the serving mode to "no" for a GSLB address, identified by IP
23
+ address or label.
24
+
25
+ Main options:
26
+ EOF
27
+ banner ""
28
+
29
+ opt :customer, "Dynect customer name", :short => "-c", :type => :string,
30
+ :required => true
31
+ opt :user, "Dynect user name", :short => "-u", :type => :string,
32
+ :required => true
33
+ opt :pass, "Dynect password", :short => "-p", :type => :string,
34
+ :required => true
35
+ opt :zone, "Zone name", :short => "-z", :type => :string,
36
+ :required => true
37
+ opt :record, "GSLB record name", :short => "-r", :type => :string,
38
+ :required => true
39
+ opt :region, "GSLB region", :short => "-R", :type => :string,
40
+ :default => "global"
41
+
42
+ end
43
+
44
+ dyn = DynectRest.new(opts[:customer], opts[:user], opts[:pass], opts[:zone])
45
+
46
+ command = ARGV.shift
47
+
48
+ pool = dyn.get("GSLBRegionPoolEntry/#{opts[:zone]}/#{opts[:record]}/#{opts[:region]}/").collect { |p| p.sub("/REST/", "") }
49
+
50
+ # Takes an IP or label.
51
+ def find_address(dyn, pool, match)
52
+ pool.each do |path|
53
+ entry = dyn.get(path)
54
+ if entry["label"] == match or entry["address"] == match
55
+ return path, entry
56
+ end
57
+ end
58
+
59
+ raise "can't find GSLB entry with address or label matching #{match}"
60
+ end
61
+
62
+ case command
63
+ when "list"
64
+ pool.each do |path|
65
+ entry = dyn.get(path)
66
+ puts "#{entry["label"]} | #{entry["address"]} | " \
67
+ "status=#{entry["status"]} | weight=#{entry["weight"]} | " \
68
+ "serve_mode=#{entry["serve_mode"]}"
69
+ end
70
+ when "drain", "undrain"
71
+ match = ARGV.shift
72
+ if !match
73
+ Trollop::die "must specify an address to drain"
74
+ end
75
+ path, entry = find_address(dyn, pool, match)
76
+ serve_mode = (command == "drain") ? "no" : "obey"
77
+ res = dyn.put(path, {"serve_mode" => serve_mode})
78
+ puts "#{entry["address"]} serve_mode changed from #{entry["serve_mode"]} " \
79
+ "to #{res["serve_mode"]}"
80
+ when nil
81
+ Trollop::die "must specify a command"
82
+ else
83
+ Trollop::die "invalid command #{command}"
84
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "dynect-utils"
6
+ s.version = "0.0.1"
7
+ s.authors = ["Pete Fritchman"]
8
+ s.email = ["petef@databits.net"]
9
+ s.homepage = "https://github.com/fetep/dynect-utils"
10
+ s.summary = %q{Utilities to interact with the DynECT API}
11
+ s.description = %q{
12
+ Utilities included: nagios plugin to check GSLB status, tool to manipulate
13
+ the serving mode of GSLB addresses
14
+ }
15
+
16
+ s.rubyforge_project = "dynect-utils"
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.require_paths = ["lib"]
22
+
23
+ s.add_runtime_dependency "dynect_rest"
24
+ s.add_runtime_dependency "trollop"
25
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dynect-utils
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Pete Fritchman
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-03-07 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: dynect_rest
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: trollop
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ description: |
49
+
50
+ Utilities included: nagios plugin to check GSLB status, tool to manipulate
51
+ the serving mode of GSLB addresses
52
+
53
+ email:
54
+ - petef@databits.net
55
+ executables:
56
+ - check_dynect_gslb_region
57
+ - dynect_gslb_manage
58
+ extensions: []
59
+
60
+ extra_rdoc_files: []
61
+
62
+ files:
63
+ - .gitignore
64
+ - Gemfile
65
+ - Gemfile.lock
66
+ - README.md
67
+ - Rakefile
68
+ - bin/check_dynect_gslb_region
69
+ - bin/dynect_gslb_manage
70
+ - dynect-utils.gemspec
71
+ homepage: https://github.com/fetep/dynect-utils
72
+ licenses: []
73
+
74
+ post_install_message:
75
+ rdoc_options: []
76
+
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ hash: 3
94
+ segments:
95
+ - 0
96
+ version: "0"
97
+ requirements: []
98
+
99
+ rubyforge_project: dynect-utils
100
+ rubygems_version: 1.8.10
101
+ signing_key:
102
+ specification_version: 3
103
+ summary: Utilities to interact with the DynECT API
104
+ test_files: []
105
+