repctl 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,131 @@
1
+ #
2
+ # This module is intended to be used on the client side to connect to
3
+ # the repctl webserver. It is not part of repctl itself, as it is not
4
+ # 'required' by any file in the repctl source code.
5
+ #
6
+ require 'net/http'
7
+
8
+ module Repctl
9
+ module Client
10
+
11
+ USER = 'admin'
12
+ PASSWORD = 'secret'
13
+
14
+ def get_status(host, opts = {})
15
+ components = {
16
+ :host => host,
17
+ :path => "/status",
18
+ :port => opts[:port] || 9393, # 7250
19
+ }
20
+ uri = URI::HTTP.build(components)
21
+ do_get(uri)
22
+ end
23
+
24
+ def switch_master(host, master, slaves, opts = {})
25
+ master = master.to_s
26
+ slaves = slaves.reduce("") { |list, slave| list + " " + slave.to_s}
27
+ body = "switch[master]=#{master}&switch[slaves]=#{slaves}"
28
+ components = {
29
+ :host => host,
30
+ :path => "/switch_master",
31
+ :port => opts[:port] || 9393, # 7250
32
+ }
33
+ uri = URI::HTTP.build(components)
34
+ do_post(uri, body)
35
+ end
36
+
37
+ def add_slave(host, master, slave, opts = {})
38
+ master = master.to_s
39
+ slave = slave.to_s
40
+ body = "add_slave[master]=#{master}&add_slave[slaves]=#{slave}"
41
+ if opts[:sync]
42
+ body += "&add_slave[sync]=sync"
43
+ end
44
+ components = {
45
+ :host => host,
46
+ :path => "/add_slave",
47
+ :port => opts[:port] || 9393, # 7250
48
+ }
49
+ uri = URI::HTTP.build(components)
50
+ do_post(uri, body)
51
+ end
52
+
53
+ def remove_slave(host, slave, opts = {})
54
+ slave = slave.to_s
55
+ body = "remove_slave[slave]=#{slave}"
56
+ components = {
57
+ :host => host,
58
+ :path => "/remove_slave",
59
+ :port => opts[:port] || 9393, # 7250
60
+ }
61
+ uri = URI::HTTP.build(components)
62
+ do_post(uri, body)
63
+ end
64
+
65
+ def repl_trio(host, master, slaves, opts = {})
66
+ master = master.to_s
67
+ slaves = slaves.reduce("") { |list, slave| list + " " + slave.to_s}
68
+ body = "repl_trio[master]=#{master}&repl_trio[slaves]=#{slaves}"
69
+ components = {
70
+ :host => host,
71
+ :path => "/repl_trio",
72
+ :port => opts[:port] || 9393, # 7250
73
+ }
74
+ uri = URI::HTTP.build(components)
75
+ do_post(uri, body)
76
+ end
77
+
78
+ private
79
+
80
+ def do_get(uri)
81
+ http = Net::HTTP.new(uri.host, uri.port)
82
+ # http.use_ssl = true
83
+ # http.verify_mode = OpenSSL::SSL::VERIFY_NONE
84
+
85
+ req = Net::HTTP::Get.new(uri.request_uri)
86
+ req.basic_auth(USER, PASSWORD)
87
+ req['Accept'] = 'text/plain'
88
+ response = http.request(req)
89
+ if response.is_a?(Net::HTTPOK)
90
+ response.body
91
+ else
92
+ response.message
93
+ end
94
+ end
95
+
96
+ def do_post(uri, body)
97
+ http = Net::HTTP.new(uri.host, uri.port)
98
+ #http.use_ssl = true
99
+ #http.verify_mode = OpenSSL::SSL::VERIFY_NONE
100
+ req = Net::HTTP::Post.new(uri.request_uri)
101
+ req.basic_auth(USER, PASSWORD)
102
+ req['Accept'] = 'text/plain'
103
+ req['Content-Type'] = "application/x-www-form-urlencoded"
104
+ req.body = body
105
+ response = http.request(req)
106
+ if response.is_a?(Net::HTTPOK)
107
+ response.body
108
+ else
109
+ response.message
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ include Repctl::Client
116
+
117
+ def self_test
118
+ host = "deimos"
119
+ puts repl_trio(host, 2, [3, 4])
120
+ puts get_status(host)
121
+ puts add_slave(host, 2, 1)
122
+ puts get_status(host)
123
+ puts switch_master(host, 3, [1, 2, 4])
124
+ puts get_status(host)
125
+ puts remove_slave(host, 1)
126
+ puts get_status(host)
127
+ puts remove_slave(host, 4)
128
+ puts get_status(host)
129
+ end
130
+
131
+ self_test
@@ -1,3 +1,3 @@
1
1
  module Repctl
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -1,6 +1,11 @@
1
1
  require 'sinatra'
2
2
  require 'repctl'
3
3
 
4
+ # Add middleware for HTTP Basic Authentication.
5
+ use Rack::Auth::Basic do |username, password|
6
+ username == 'admin' && password == 'secret'
7
+ end
8
+
4
9
  include Repctl::Config
5
10
  include Repctl::Commands
6
11
  include Repctl::Servers
@@ -58,7 +63,7 @@ post '/switch_master' do
58
63
  secs = time do
59
64
  do_switch_master(master, slaves)
60
65
  end
61
- @message = "Switch master processed in #{secs} secs."
66
+ @message = "Switch to master #{master.to_s} processed in #{secs} secs."
62
67
  @success = true
63
68
  end
64
69
  if request.accept == ['text/plain']
@@ -135,7 +140,7 @@ post '/repl_trio' do
135
140
  do_repl_trio(master, slaves[0], slaves[1])
136
141
  end
137
142
  @message = "Create replication trio with master #{master} and " +
138
- "slaves #{slaves[0] and slaves[1]} in #{secs} secs."
143
+ "slaves #{slaves[0]} and #{slaves[1]} in #{secs} secs."
139
144
  @success = true
140
145
  end
141
146
  if request.accept == ['text/plain']
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: repctl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-09 00:00:00.000000000Z
12
+ date: 2012-03-13 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &195841920 !ruby/object:Gem::Requirement
16
+ requirement: &185309620 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *195841920
24
+ version_requirements: *185309620
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: shotgun
27
- requirement: &195841500 !ruby/object:Gem::Requirement
27
+ requirement: &185309200 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *195841500
35
+ version_requirements: *185309200
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: compass
38
- requirement: &195841080 !ruby/object:Gem::Requirement
38
+ requirement: &185308780 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *195841080
46
+ version_requirements: *185308780
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: thor
49
- requirement: &195840660 !ruby/object:Gem::Requirement
49
+ requirement: &185308360 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *195840660
57
+ version_requirements: *185308360
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: mysql2
60
- requirement: &195840240 !ruby/object:Gem::Requirement
60
+ requirement: &185307940 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *195840240
68
+ version_requirements: *185307940
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: sinatra
71
- requirement: &195839820 !ruby/object:Gem::Requirement
71
+ requirement: &185307520 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *195839820
79
+ version_requirements: *185307520
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: thin
82
- requirement: &195839400 !ruby/object:Gem::Requirement
82
+ requirement: &185307100 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *195839400
90
+ version_requirements: *185307100
91
91
  description: Ruby gem with Thor script to manage MySQL and PostgreSQL replication
92
92
  email:
93
93
  - lydianblues@gmail.com
@@ -107,6 +107,7 @@ files:
107
107
  - config/mysql.cnf
108
108
  - config/servers.yml
109
109
  - lib/repctl.rb
110
+ - lib/repctl/client.rb
110
111
  - lib/repctl/color.rb
111
112
  - lib/repctl/helpers.rb
112
113
  - lib/repctl/mysql_admin.rb