repctl 0.0.6 → 0.0.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.
- data/lib/repctl/client.rb +131 -0
- data/lib/repctl/version.rb +1 -1
- data/webserver/webserver.rb +7 -2
- metadata +17 -16
@@ -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
|
data/lib/repctl/version.rb
CHANGED
data/webserver/webserver.rb
CHANGED
@@ -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.
|
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-
|
12
|
+
date: 2012-03-13 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
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: *
|
24
|
+
version_requirements: *185309620
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: shotgun
|
27
|
-
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: *
|
35
|
+
version_requirements: *185309200
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: compass
|
38
|
-
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: *
|
46
|
+
version_requirements: *185308780
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: thor
|
49
|
-
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: *
|
57
|
+
version_requirements: *185308360
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: mysql2
|
60
|
-
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: *
|
68
|
+
version_requirements: *185307940
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: sinatra
|
71
|
-
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: *
|
79
|
+
version_requirements: *185307520
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: thin
|
82
|
-
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: *
|
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
|