haproxyctl 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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in haproxyctl.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ Copyright (C) 2010-2012
2
+ author: Carlo Flores <github@petalphile.com>
3
+ contributors: Scott Gonyea, John A. Barbuto, Ben Lovett,
4
+ Till Klampaeckel, Erik Osterman
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ "Software"), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be
15
+ included in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,314 @@
1
+ HAProxyCTL
2
+ ==========
3
+
4
+ This is a simple wrapper to make life with HAProxy a little more convenient.
5
+
6
+ * Acts as an init script for start, stop, reload, restart, etc
7
+ * Leverages 'socket' to enable and disable servers on the fly
8
+ * Formats server weight and backends in a readable way
9
+ * Provides Nagios and Cloudkick health checks
10
+ * chkconfig/service-able for Redhat folk
11
+
12
+ [Here](http://scale10x.biggiantnerds.com) is a presentation about it.
13
+
14
+ Installation
15
+ ------------
16
+
17
+ On most UNIX, assuming HAProxy is in the $PATH:
18
+
19
+ git clone git@github.com:flores/haproxyctl.git
20
+ ln -s haproxyctl/haproxyctl /etc/init.d/haproxyctl
21
+
22
+ For chkconfig/RedHat/Centos, add:
23
+
24
+ chkconfig --add haproxyctl
25
+
26
+ There is also an HAProxy source installation script. This installs not only the steps above but latest HAProxy sources!
27
+
28
+ Options
29
+ -----------------
30
+ <pre>
31
+ # ./haproxyctl help
32
+ usage: ./haproxyctl <argument>
33
+ where argument can be:
34
+ start: start haproxy unless it is already running
35
+ stop: stop an existing haproxy
36
+ restart: immediately shutdown and restart
37
+ reload: gracefully terminate existing connections, reload /etc/haproxy/haproxy.cfg
38
+ status: is haproxy running? on what ports per lsof?
39
+ configcheck: check /etc/haproxy/haproxy.cfg
40
+ nagios: nagios-friendly status for running process and listener
41
+ cloudkick: cloudkick.com-friendly status and metric for connected users
42
+ show health: show status of all frontends and backend servers
43
+ show backends: show status of backend pools of servers
44
+ enable all <server>: re-enable a server previously in maint mode on multiple backends
45
+ disable all <server>: disable a server from every backend it exists
46
+ enable all EXCEPT <server>: like 'enable all', but re-enables every backend except for <server>
47
+ disable all EXCEPT <server>: like 'disable all', but disables every backend except for <server>
48
+ clear counters: clear max statistics counters (add 'all' for all counters)
49
+ help: this message
50
+ prompt: toggle interactive mode with prompt
51
+ quit: disconnect
52
+ show info: report information about the running process
53
+ show stat: report counters for each proxy and server
54
+ show errors: report last request and response errors for each proxy
55
+ show sess [id]: report the list of current sessions or dump this session
56
+ get weight: report a server's current weight
57
+ set weight: change a server's weight
58
+ set timeout: change a timeout setting
59
+ disable server: set a server in maintenance mode
60
+ enable server: re-enable a server that was previously in maintenance mode
61
+ </pre>
62
+
63
+ Examples
64
+ --------
65
+
66
+ ## Status check
67
+ <pre>
68
+ ./haproxyctl status
69
+ haproxy is running on pid 23162.
70
+ these ports are used and guys are connected:
71
+ 173.255.194.115:www->98.154.245.132:52025 (ESTABLISHED)
72
+ 173.255.194.115:www->97.89.32.126:52043 (ESTABLISHED)
73
+ *:www (LISTEN)
74
+ *:53093
75
+ 173.255.194.115:www->83.39.69.106:19338 (ESTABLISHED)
76
+ </pre>
77
+
78
+ ## Errors to the backend servers
79
+ <pre>
80
+ ./haproxyctl "show errors"
81
+ [04/Feb/2011:21:05:59.542] frontend http (#1): invalid request
82
+ src 209.59.188.205, session #39574, backend <NONE> (#-1), server <NONE> (#-1)
83
+ request length 125 bytes, error at position 27:
84
+
85
+ 00000 GET /logs/images/stuff/someurl
86
+ 00070+ HTTP/1.1\r\n
87
+ 00081 Host: wet.biggiantnerds.com\r\n
88
+ 00110 Accept: */*\r\n
89
+ 00123 \r\n
90
+ </pre>
91
+ ## Human readable health check
92
+ <pre>
93
+ ./haproxyctl "show health"
94
+ pxname svname status weight
95
+ http FRONTEND OPEN
96
+ sinatra sinatra_downoi DOWN 1
97
+ sinatra sinatra_rindica DOWN 1
98
+ sinatra sinatra_guinea UP 1
99
+ sinatra BACKEND UP 1
100
+ ei guinea UP 1
101
+ ei belem UP 1
102
+ ei BACKEND UP 1
103
+ drop guinea UP 1
104
+ drop belem UP 1
105
+ drop BACKEND UP 1
106
+ apache guinea UP 1
107
+ apache belem UP 1
108
+ apache BACKEND UP 1
109
+ static ngnix_downoi UP 1
110
+ static ngnix_petite UP 1
111
+ static ngnix_rindica UP 1
112
+ static nginx_stellatus UP 1
113
+ static nginx_belem UP 1
114
+ static nginx_petite DOWN 1
115
+ static apache_guinea UP 1
116
+ static BACKEND UP 6
117
+ ssh localhost UP 1
118
+ ssh BACKEND UP 1
119
+
120
+ ./haproxyctl "show backends"
121
+ contact BACKEND UP 1
122
+ alpha BACKEND DOWN 0
123
+ sinatra BACKEND DOWN 0
124
+ python BACKEND UP 1
125
+ mobile BACKEND DOWN 0
126
+ ei BACKEND UP 1
127
+ showoff BACKEND UP 1
128
+ drop BACKEND UP 1
129
+ cheap BACKEND UP 1
130
+ apache BACKEND UP 1
131
+ static BACKEND UP 1
132
+ ssh BACKEND UP 1
133
+ </pre>
134
+
135
+ ## Disable servers on the fly
136
+ <pre>
137
+ ./haproxyctl "disable server static/nginx_belem"
138
+
139
+ ./haproxyctl "show health" |grep nginx_belem
140
+ static nginx_belem MAINT 1
141
+ </pre>
142
+ ## Graceful reloads
143
+ <pre>
144
+ ./haproxyctl reload
145
+ gracefully stopping connections on pid 23162...
146
+ checking if connections still alive on 23162...
147
+ reloaded haproxy on pid 1119
148
+ </pre>
149
+ ## Cloudkick/Nagios checks with graph-friendly output for queue size, total connections, etc
150
+ <pre>
151
+ ./haproxyctl cloudkick
152
+ status ok haproxy is running
153
+ metric connections int 12
154
+ metric http_FRONTEND_request_rate int 45
155
+ metric http_FRONTEND_health_check_duration int 45
156
+ metric sinatra_sinatra_guinea_health_check_duration int 4
157
+ metric sinatra_BACKEND_health_check_duration int 4
158
+ metric mobile_sinatra_mobile_health_check_duration int 2
159
+ metric mobile_BACKEND_health_check_duration int 2
160
+ metric ei_guinea_health_check_duration int 4
161
+ metric ei_BACKEND_health_check_duration int 4
162
+ metric drop_guinea_total_requests gauge 1
163
+ metric drop_guinea_health_check_duration int 6
164
+ metric drop_BACKEND_total_requests gauge 1
165
+ metric drop_BACKEND_health_check_duration int 6
166
+ metric apache_guinea_health_check_duration int 41
167
+ metric apache_BACKEND_health_check_duration int 41
168
+ metric static_ngnix_downoi_total_requests gauge 472
169
+ metric static_ngnix_downoi_health_check_duration int 7
170
+ metric static_ngnix_petite_total_requests gauge 475
171
+ metric static_ngnix_petite_health_check_duration int 8
172
+ metric static_ngnix_rindica_total_requests gauge 457
173
+ metric static_ngnix_rindica_health_check_duration int 8
174
+ metric static_nginx_stellatus_total_requests gauge 470
175
+ metric static_nginx_stellatus_health_check_duration int 7
176
+ metric static_nginx_belem_total_requests gauge 460
177
+ metric static_nginx_belem_health_check_duration int 8
178
+ metric static_apache_guinea_total_requests gauge 449
179
+ metric static_apache_guinea_health_check_duration int 14
180
+ metric static_BACKEND_total_requests gauge 2783
181
+ metric static_BACKEND_health_check_duration int 45
182
+ </pre>
183
+ ## does normal things like checks if a process is running before starting it...
184
+ <pre>
185
+ ./haproxyctl start
186
+ ./haproxyctl:35: haproxy is already running on pid 20317! (RuntimeError)
187
+
188
+ ./haproxyctl restart
189
+ stopping existing haproxy on pid 20317...
190
+ waiting a ms...
191
+ checking if haproxy is still running...
192
+ starting haproxy...
193
+ done. running on pid 20348
194
+ </pre>
195
+ ## keeps all the regular UNIX socket stuff
196
+ <pre>
197
+ ./haproxyctl "show stat"
198
+ pxname,svname,qcur,qmax,scur,smax,slim,stot,bin,bout,dreq,dresp,ereq,econ,eresp,wretr,wredis,status,weight,act,bck,chkfail,chkdown,lastchg,downtime,qlimit,pid,iid,sid,throttle,lbtot,tracked,type,rate,rate_lim,rate_max,check_status,check_code,check_duration,hrsp_1xx,hrsp_2xx,hrsp_3xx,hrsp_4xx,hrsp_5xx,hrsp_other,hanafail,req_rate,req_rate_max,req_tot,cli_abrt,srv_abrt,
199
+ http,FRONTEND,,,3,82,2000,39585,47067637,12818945246,0,0,1465,,,,,OPEN,,,,,,,,,1,1,0,,,,0,0,0,59,,,,0,91460,13125,4115,305,73,,0,131,109078,,,
200
+ sinatra,sinatra_downoi,0,0,0,1,,791,452469,2258353,,0,,0,0,0,0,UP,1,1,0,60,13,304106,59545,,1,2,1,,791,,2,0,,1,L4OK,,46,0,736,0,40,15,0,0,,,,0,0,
201
+ sinatra,sinatra_rindica,0,0,0,1,,795,450488,2333534,,0,,0,0,3,1,UP,1,1,0,68,10,347679,52849,,1,2,2,,792,,2,0,,1,L4OK,,46,0,753,0,28,10,0,0,,,,0,0,
202
+ sinatra,sinatra_guinea,0,0,0,7,,638,360994,1046343,,0,,0,258,1,0,UP,1,1,0,4,4,1892969,72241,,1,2,3,,637,,2,0,,3,L4OK,,0,0,317,0,13,11,0,0,,,,0,0,
203
+ sinatra,BACKEND,0,0,0,7,0,2219,1263951,5638230,0,0,,0,299,4,1,UP,3,3,0,,0,2144680,0,,1,2,0,,2220,,1,0,,3,,,,0,1806,0,81,291,41,,,,,0,0,
204
+ ei,guinea,0,0,0,4,,3514,2067456,68408884,,0,,0,0,0,0,UP,1,1,0,6,1,2142278,70,,1,3,1,,3514,,2,0,,11,L4OK,,0,0,3060,323,131,0,0,0,,,,3,0,
205
+ ei,belem,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,0,1,28,7,259858,1274,,1,3,2,,0,,2,0,,0,L4OK,,43,0,0,0,0,0,0,0,,,,0,0,
206
+ ei,BACKEND,0,0,0,4,0,3514,2067456,68408884,0,0,,0,0,0,0,UP,1,1,1,,0,2144680,0,,1,3,0,,3514,,1,0,,11,,,,0,3060,323,131,0,0,,,,,3,0,
207
+ drop,guinea,0,0,0,2,,1042,634412,15327695,,0,,0,0,0,0,UP,1,1,0,5,1,2142277,70,,1,4,1,,1042,,2,0,,5,L4OK,,0,0,935,28,79,0,0,0,,,,2,0,
208
+ drop,belem,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,0,1,42,7,259855,958,,1,4,2,,0,,2,0,,0,L4OK,,44,0,0,0,0,0,0,0,,,,0,0,
209
+ drop,BACKEND,0,0,0,2,0,1042,634412,15327695,0,0,,0,0,0,0,UP,1,1,1,,0,2144680,0,,1,4,0,,1042,,1,0,,5,,,,0,935,28,79,0,0,,,,,2,0,
210
+ apache,guinea,0,0,0,3,,3781,3733003,19959026,,0,,0,0,0,0,UP,1,1,0,4,1,2142276,70,,1,5,1,,3781,,2,0,,5,L4OK,,0,0,3267,304,208,2,0,0,,,,2,0,
211
+ apache,belem,0,0,0,1,,1,379,528,,0,,0,0,0,0,UP,1,0,1,41,7,259854,1023,,1,5,2,,1,,2,0,,1,L4OK,,43,0,0,0,1,0,0,0,,,,0,0,
212
+ apache,BACKEND,0,0,0,3,0,3782,3733382,19959554,0,0,,0,0,0,0,UP,1,1,1,,0,2144680,0,,1,5,0,,3782,,1,0,,5,,,,0,3267,304,209,2,0,,,,,2,0,
213
+ static,ngnix_downoi,0,0,0,10,,12665,4970818,1883260969,,0,,0,4,25,5,UP,1,1,0,72,10,303928,61648,,1,6,1,,12640,,2,0,,10,L4OK,,46,0,10671,1656,307,0,0,0,,,,1167,4,
214
+ static,ngnix_petite,0,0,0,10,,13052,5141468,2033386644,,0,,1,5,13,3,UP,1,1,0,63,6,347401,11776,,1,6,2,,13039,,2,0,,10,L4OK,,46,0,10988,1694,352,0,0,0,,,,1223,4,
215
+ static,ngnix_rindica,0,0,0,10,,12736,5007655,2002399557,,0,,0,8,20,5,UP,1,1,0,64,10,347499,55375,,1,6,3,,12716,,2,0,,10,L4OK,,45,0,10736,1649,321,0,0,0,,,,1146,3,
216
+ static,nginx_stellatus,0,0,0,10,,15142,6017327,2194578425,,0,,0,7,0,0,UP,1,1,0,8,1,1555595,786,,1,6,4,,15142,,2,0,,10,L4OK,,42,0,12932,1844,364,0,0,0,,,,1253,8,
217
+ static,nginx_belem,0,0,0,10,,15227,6075157,2231761586,,0,,0,5,1,0,UP,1,1,0,10,1,1555573,787,,1,6,5,,15226,,2,0,,12,L4OK,,44,0,12981,1882,362,0,0,0,,,,1227,4,
218
+ static,nginx_petite,0,0,0,0,,0,0,0,,0,,0,0,0,0,DOWN,1,1,0,0,1,2144610,2144610,,1,6,6,,0,,2,0,,0,L4CON,,21000,0,0,0,0,0,0,0,,,,0,0,
219
+ static,apache_guinea,0,0,0,10,,24091,9895320,2263895160,,0,,0,0,0,0,UP,1,1,0,2,0,2144680,0,,1,6,7,,24091,,2,0,,100,L4OK,,0,0,20593,3038,459,0,0,0,,,,1241,0,
220
+ static,BACKEND,0,0,0,60,0,92841,37107745,12609282341,0,0,,1,29,59,13,UP,6,6,0,,0,2144680,0,,1,6,0,,92854,,1,0,,131,,,,0,78901,11763,2165,12,0,,,,,7257,23,
221
+ ssh,localhost,0,0,0,3,,122,54524,291662,,0,,0,0,0,0,UP,1,1,0,0,0,2144680,0,,1,7,1,,122,,2,0,,10,L4OK,,0,0,121,0,1,0,0,0,,,,0,0,
222
+ ssh,BACKEND,0,0,0,3,0,122,54524,291662,0,0,,0,0,0,0,UP,1,1,0,,0,2144680,0,,1,7,0,,122,,1,0,,10,,,,0,121,0,1,0,0,,,,,0,0,
223
+ </pre>
224
+
225
+ ## More additions: Enables or disables a target server from every backend it appears.
226
+ <pre>
227
+ ./haproxyctl "show health"
228
+ # pxname svname status weight
229
+ http FRONTEND OPEN
230
+ sinatra sinatra_downoi DOWN 1
231
+ sinatra sinatra_rindica DOWN 1
232
+ sinatra sinatra_guinea UP 1
233
+ sinatra BACKEND UP 1
234
+ ei guinea UP 1
235
+ ei BACKEND UP 1
236
+ drop guinea UP 1
237
+ drop BACKEND UP 1
238
+ apache guinea UP 1
239
+ apache BACKEND UP 1
240
+ static ngnix_downoi UP 1
241
+ static ngnix_petite UP 1
242
+ static ngnix_rindica UP 1
243
+ static nginx_stellatus UP 1
244
+ static nginx_belem UP 1
245
+ static nginx_petite MAINT 1
246
+ static apache_guinea UP 1
247
+ static BACKEND UP 6
248
+ ssh localhost UP 1
249
+ ssh BACKEND UP 1
250
+
251
+
252
+ ./haproxyctl "disable all guinea"
253
+ ./haproxyctl "show health"
254
+ pxname svname status weight
255
+ http FRONTEND OPEN
256
+ sinatra sinatra_downoi DOWN 1
257
+ sinatra sinatra_rindica DOWN 1
258
+ sinatra sinatra_guinea UP 1
259
+ sinatra BACKEND UP 1
260
+ ei guinea MAINT 1
261
+ ei BACKEND DOWN 0
262
+ drop guinea MAINT 1
263
+ drop BACKEND DOWN 0
264
+ apache guinea MAINT 1
265
+ apache BACKEND DOWN 0
266
+ static ngnix_downoi UP 1
267
+ static ngnix_petite UP 1
268
+ static ngnix_rindica UP 1
269
+ static nginx_stellatus UP 1
270
+ static nginx_belem UP 1
271
+ static nginx_petite UP 1
272
+ static apache_guinea UP 1
273
+ static BACKEND UP 1
274
+ ssh localhost UP 1
275
+ ssh BACKEND UP 1
276
+ </pre>
277
+
278
+ ## Has an EXCEPT flag, too
279
+ <pre>
280
+ ./haproxyctl "enable all EXCEPT apache_guinea"
281
+ ./haproxyctl "show health"
282
+ pxname svname status weight
283
+ http FRONTEND OPEN
284
+ sinatra sinatra_downoi DOWN 1
285
+ sinatra sinatra_rindica DOWN 1
286
+ sinatra sinatra_guinea UP 1
287
+ sinatra BACKEND UP 1
288
+ ei guinea UP 1
289
+ ei BACKEND UP 1
290
+ drop guinea UP 1
291
+ drop BACKEND UP 1
292
+ apache guinea UP 1
293
+ apache BACKEND UP 1
294
+ static ngnix_downoi UP 1/2 1
295
+ static ngnix_petite UP 1/2 1
296
+ static ngnix_rindica UP 1/2 1
297
+ static nginx_stellatus UP 1/2 1
298
+ static nginx_belem UP 1/2 1
299
+ static nginx_petite UP 1/2 1
300
+ static apache_guinea UP 1
301
+ static BACKEND UP 7
302
+ ssh localhost UP 1
303
+ ssh BACKEND UP 1
304
+ </pre>
305
+
306
+ Contributors
307
+ ------------
308
+
309
+ * Carlo Flores <github@petalphile.com> - Core Application
310
+
311
+ License
312
+ -----------------
313
+
314
+ This code is released under the MIT License. You should feel free to do whatever you want with it.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
data/bin/haproxyctl ADDED
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # HAProxy control script to start, stop, restart, configcheck, etc, as
4
+ # well as communicate to the stats socket.
5
+ #
6
+ # See https://github.com/flores/haproxyctl/README
7
+ #
8
+ # This line here is just for Redhat users who like "service haproxyctl blah"
9
+ # chkconfig: 2345 80 30
10
+ # description: HAProxy is a fast and reliable load balancer for UNIX systems
11
+ # HAProxyctl is an easy way to do init shit and talk to its stats socket
12
+ #
13
+
14
+ require 'pathname'
15
+ lib = File.join(File.dirname(Pathname.new(__FILE__).realpath), '../lib')
16
+ $:.unshift lib unless $:.include?(lib)
17
+
18
+ require 'haproxyctl'
19
+ include HAProxyCTL
20
+
21
+ argument = ARGV.join(' ')
22
+
23
+ unless has_exec?
24
+ puts usage if argument =~ /help/ || ARGV.length < 1
25
+
26
+ raise "Cannot find haproxy executable. Please ensure it is in your $PATH, or set $HAPROXY_BIN environment variable."
27
+ end
28
+
29
+ display_usage! if argument =~ /help/ || ARGV.length < 1
30
+
31
+ begin
32
+ case argument
33
+ when "start"
34
+ if pidof
35
+ raise("haproxy is already running on pid #{pidof}!")
36
+ else
37
+ start
38
+ end
39
+ when "stop"
40
+ stop(check_running)
41
+ when "restart"
42
+ if pidof
43
+ stop(pidof)
44
+ stillpidof = check_running()
45
+ while stillpidof == pidof
46
+ puts "still haven't killed old pid. waiting 3s for existing connections to die... (ctrl+c to stop)"
47
+ sleep 3
48
+ stillpidof = check_running() || 0
49
+ end
50
+ start()
51
+ else
52
+ puts "haproxy was not running. starting..."
53
+ start()
54
+ end
55
+ when "reload"
56
+ if ( pidof )
57
+ reload(pidof)
58
+ else
59
+ puts "haproxy not running. starting..."
60
+ start()
61
+ end
62
+ when "status"
63
+ if ( pidof )
64
+ puts "haproxy is running on pid #{pidof}.\nthese ports are used and guys are connected:"
65
+ system("lsof -ln -i |awk \'$2 ~ /#{pidof}/ {print $8\" \"$9}\'")
66
+ else
67
+ puts "haproxy is not running"
68
+ end
69
+ when "configcheck"
70
+ puts `#{exec} -c -f #{config_path}`
71
+ when "nagios"
72
+ if ( pidof )
73
+ puts "OK"
74
+ exit
75
+ else
76
+ puts "CRITICAL: HAProxy is not running!"
77
+ exit(2)
78
+ end
79
+ when "cloudkick"
80
+ if ( pidof )
81
+ puts "status ok haproxy is running"
82
+ conn = `lsof -ln -i |grep -c #{pidof}`.chomp.to_i
83
+ # removes the listener
84
+ conn = conn - 1
85
+ puts "metric connections int #{conn}"
86
+ status=unixsock("show stat")
87
+ status.each do |line|
88
+ line = line.split(',')
89
+ if (line[0] !~ /^#/)
90
+ host = "#{line[0]}_#{line[1]}"
91
+ puts "metric #{host}_request_rate int #{line[47]}" if line[47].to_i > 0
92
+ puts "metric #{host}_total_requests gauge #{line[49]}" if line[49].to_i > 0
93
+ puts "metric #{host}_health_check_duration int #{line[35]}" if line[35].to_i > 0
94
+ puts "metric ${host}_current_queue int #{line[3]}" if line[3].to_i > 0
95
+ end
96
+ end
97
+ else
98
+ puts "status err haproxy is not running!"
99
+ end
100
+ when "show health"
101
+ status=unixsock("show stat")
102
+ status.each do |line|
103
+ data = line.split(',')
104
+ printf "%-30s %-30s %-7s %3s\n", data[0], data[1], data[17], data[18]
105
+ end
106
+ when /show backend(s?)/
107
+ status=unixsock("show stat").grep(/BACKEND/)
108
+ status.each do |line|
109
+ data = line.split(',')
110
+ printf "%-30s %-30s %-7s %3s\n", data[0], data[1], data[17], data[18]
111
+ end
112
+ when /disable all EXCEPT (.+)/
113
+ servername=$1
114
+ status=unixsock("show stat")
115
+ backend = status.grep(/#{servername}/)
116
+ backend.each do |line|
117
+ backend_group = line.split(',')
118
+ status.each do |pool|
119
+ data = pool.split(',')
120
+ if ( (data[0] == backend_group[0]) && ( data[1] !~ /#{servername}|BACKEND|FRONTEND/ ) && ( data[17] = 'UP' ) )
121
+ unixsock("disable server #{data[0]}/#{data[1]}")
122
+ end
123
+ end
124
+ end
125
+ when /disable all (.+)/
126
+ servername=$1
127
+ status=unixsock("show stat")
128
+ status.each do |line|
129
+ data = line.split(',')
130
+ if ( ( data[1] = servername ) && ( data[17] = 'UP' ) )
131
+ unixsock("disable server #{data[0]}/#{servername}")
132
+ end
133
+ end
134
+ when /enable all EXCEPT (.+)/
135
+ servername=$1
136
+ status=unixsock("show stat")
137
+ backend = status.grep(/#{servername}/)
138
+ backend.each do |line|
139
+ backend_group = line.split(',')
140
+ status.each do |pool|
141
+ data = pool.split(',')
142
+ if ( (data[0] == backend_group[0]) && ( data[1] !~ /#{servername}|BACKEND|FRONTEND/ ) && ( data[17] =~ /Down|MAINT/i ) )
143
+ unixsock("enable server #{data[0]}/#{data[1]}")
144
+ end
145
+ end
146
+ end
147
+ when /enable all (.+)/
148
+ servername=$1
149
+ status=unixsock("show stat")
150
+ status.each do |line|
151
+ data = line.split(',')
152
+ if ( ( data[1] = servername ) && ( data[17] =~ /Down|MAINT/i ) )
153
+ unixsock("enable server #{data[0]}/#{servername}")
154
+ end
155
+ end
156
+ when 'version'
157
+ version
158
+ else
159
+ puts unixsock(argument)
160
+ end
161
+ rescue Errno::ENOENT => e
162
+ STDERR.puts e
163
+ exit 1
164
+ end