hastats 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in hastats.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem 'rake'
8
+ end
9
+
data/README.rdoc ADDED
@@ -0,0 +1,14 @@
1
+ == HAStats -- An HAProxy socket tool for Ruby
2
+
3
+ HAStats communicates with a running HAProxy process through the "stats socket" (not enabled by default). Through this socket you can query stats, reset counters, change server weightings, put servers in maintenance mode, and more.
4
+
5
+ === Using the command line tool
6
+
7
+ $ hastats info
8
+ Name: HAProxy
9
+ Version: 1.4.8
10
+ Release_date: 2010/06/16
11
+ Nbproc: 1
12
+ Process_num: 1
13
+ ...
14
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/hastats ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'hastats'
5
+ require 'thor'
6
+
7
+ class HAStats::Bin < Thor
8
+ map %w(-h --help) => :help
9
+ class_option :socket, :aliases => %w(-s), :default => '/usr/local/var/run/haproxy.sock'
10
+ class_option :json, :aliases => %w(-j), :type => :boolean, :default => false, :desc => "Return results in JSON for easy parsing"
11
+
12
+ desc 'info', 'Get information about the HAProxy process'
13
+ def info
14
+ print_result HAStats::Actions::Info.new(options[:socket]).run
15
+ end
16
+
17
+ desc 'stat', 'Get information about all frontends/backends/servers'
18
+ def stat
19
+ print_result HAStats::Actions::Stat.new(options[:socket]).run
20
+ end
21
+
22
+ desc 'disable [BACKEND] [SERVER]', 'Put a server into MAINT mode'
23
+ def disable(backend, server)
24
+ print_result HAStats::Actions::Disable.new(options[:socket]).run(backend, server)
25
+ end
26
+
27
+ desc 'enable [BACKEND] [SERVER]', 'Remove a server from MAINT mode'
28
+ def enable(backend, server)
29
+ print_result HAStats::Actions::Enable.new(options[:socket]).run(backend, server)
30
+ end
31
+
32
+ desc 'sess', '[FUTURE] Get current session information'
33
+ def sess
34
+ raise NotImplementedError
35
+ end
36
+
37
+ desc 'errors', '[FUTURE] Get current error information'
38
+ def errors
39
+ raise NotImplementedError
40
+ end
41
+
42
+ desc 'clear', '[FUTURE] Clear counter maximums (see --all option)'
43
+ method_option :all, :type => :boolean, :default => false, :desc => "Clear all counters"
44
+ def clear
45
+ raise NotImplementedError
46
+ end
47
+
48
+ desc 'set_weight [BACKEND] [SERVER] [WEIGHT]', '[FUTURE] Set a server\'s weight. Weight is a number or percentage of current weight'
49
+ def set_weight(backend, server, weight)
50
+ raise NotImplementedError
51
+ end
52
+
53
+ desc 'get_weight [BACKEND]/[SERVER]', '[FUTURE] Get a server\'s weight'
54
+ def get_weight(backend, server)
55
+ raise NotImplementedError
56
+ end
57
+
58
+ protected
59
+
60
+ def print_result(result)
61
+ if options[:json]
62
+ puts result.to_json
63
+ else
64
+ puts result.raw
65
+ end
66
+ end
67
+ end
68
+
69
+ HAStats::Bin.start
70
+
data/hastats.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "hastats/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "hastats"
7
+ s.version = HAStats::VERSION
8
+ s.authors = ["Travis Petticrew"]
9
+ s.email = ["bobo@petticrew.net"]
10
+ s.homepage = ""
11
+ s.summary = %q{A tool for interfacing with HAProxy through UNIX sockets}
12
+ s.description = %q{Allows reading and writing to the haproxy stats socket. See the HAProxy documentation for available commands.}
13
+
14
+ s.rubyforge_project = "hastats"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ s.add_runtime_dependency "thor", '~>0.14.6'
24
+ s.add_runtime_dependency "json", '>=1'
25
+ end
@@ -0,0 +1,22 @@
1
+ class HAStats::Actions::Base
2
+
3
+ attr_accessor :socket, :options
4
+
5
+ def initialize(socket, options={})
6
+ self.socket = socket.is_a?(HAStats::Socket) ? socket : HAStats::Socket.new(socket)
7
+ self.options = options
8
+ end
9
+
10
+ def run(*args)
11
+ response.new socket.run(command(*args))
12
+ end
13
+
14
+ def response
15
+ HAStats::Responses::Base
16
+ end
17
+
18
+ def command(*args)
19
+ raise NotImplementedError
20
+ end
21
+
22
+ end
@@ -0,0 +1,12 @@
1
+ class HAStats::Actions::Disable < HAStats::Actions::Base
2
+
3
+ def response
4
+ HAStats::Responses::BlankResult
5
+ end
6
+
7
+ def command(backend, server)
8
+ "disable server #{backend}/#{server}"
9
+ end
10
+
11
+ end
12
+
@@ -0,0 +1,12 @@
1
+ class HAStats::Actions::Enable < HAStats::Actions::Base
2
+
3
+ def response
4
+ HAStats::Responses::BlankResult
5
+ end
6
+
7
+ def command(backend, server)
8
+ "enable server #{backend}/#{server}"
9
+ end
10
+
11
+ end
12
+
@@ -0,0 +1,11 @@
1
+ class HAStats::Actions::Info < HAStats::Actions::Base
2
+
3
+ def response
4
+ HAStats::Responses::Text
5
+ end
6
+
7
+ def command
8
+ "show info"
9
+ end
10
+
11
+ end
@@ -0,0 +1,11 @@
1
+ class HAStats::Actions::Stat < HAStats::Actions::Base
2
+
3
+ def response
4
+ HAStats::Responses::CSV
5
+ end
6
+
7
+ def command
8
+ "show stat"
9
+ end
10
+
11
+ end
@@ -0,0 +1,8 @@
1
+ module HAStats::Actions
2
+ autoload :Base, 'hastats/actions/base'
3
+ autoload :Info, 'hastats/actions/info'
4
+ autoload :Stat, 'hastats/actions/stat'
5
+ autoload :Enable, 'hastats/actions/enable'
6
+ autoload :Disable, 'hastats/actions/disable'
7
+ end
8
+
@@ -0,0 +1,20 @@
1
+ class HAStats::Responses::Base
2
+
3
+ attr_accessor :raw, :parsed
4
+
5
+ def initialize(raw)
6
+ self.raw = raw
7
+ parse
8
+ end
9
+
10
+ # The base class does no parsing
11
+ def parse
12
+ self.parsed = self.raw
13
+ end
14
+
15
+ def to_json
16
+ JSON.dump(self.parsed)
17
+ end
18
+
19
+ end
20
+
@@ -0,0 +1,11 @@
1
+ class HAStats::Responses::BlankResult < HAStats::Responses::Base
2
+
3
+ def parse
4
+ if self.raw.strip.empty?
5
+ self.parsed = { :success => true }
6
+ else
7
+ self.parsed = { :success => false, :message => self.raw.strip }
8
+ end
9
+ end
10
+
11
+ end
@@ -0,0 +1,24 @@
1
+ require 'csv'
2
+
3
+ class HAStats::Responses::CSV < HAStats::Responses::Base
4
+
5
+ def parse
6
+ self.parsed = []
7
+ header = nil
8
+ self.raw.each do |row|
9
+ row = CSV.parse(row.gsub(/#*\s*/, '').strip).first
10
+ if row && header
11
+ result = {}
12
+ header.each_index do |i|
13
+ result[header[i]] = row[i]
14
+ end
15
+ self.parsed << result
16
+ elsif row
17
+ header = row
18
+ end
19
+ end
20
+ self.parsed
21
+ end
22
+
23
+ end
24
+
@@ -0,0 +1,12 @@
1
+ class HAStats::Responses::Text < HAStats::Responses::Base
2
+
3
+ def parse
4
+ self.parsed = {}
5
+ self.raw.split("\n").each do |line|
6
+ name, value = line.split(/:/, 2)
7
+ self.parsed[name.strip.downcase.to_sym] = value.strip if name && value
8
+ end
9
+ end
10
+
11
+ end
12
+
@@ -0,0 +1,7 @@
1
+ module HAStats::Responses
2
+ autoload :Base, 'hastats/responses/base'
3
+ autoload :Text, 'hastats/responses/text'
4
+ autoload :CSV, 'hastats/responses/csv'
5
+ autoload :BlankResult, 'hastats/responses/blank_result'
6
+ end
7
+
@@ -0,0 +1,27 @@
1
+ class HAStats::Socket
2
+
3
+ attr_accessor :socket_addr
4
+
5
+ def initialize(socket_addr)
6
+ @socket_addr = socket_addr
7
+ end
8
+
9
+ def socket
10
+ @socket ||= UNIXSocket.new(socket_addr)
11
+ end
12
+
13
+ def reset
14
+ @socket = nil
15
+ end
16
+
17
+ def run(cmd)
18
+ reset
19
+ socket.puts(cmd)
20
+ result = ""
21
+ while out = socket.gets
22
+ result += out
23
+ end
24
+ result
25
+ end
26
+
27
+ end
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,4 @@
1
+ module HAStats
2
+ VERSION = "0.0.1"
3
+ end
4
+
data/lib/hastats.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'socket'
2
+ require 'json'
3
+
4
+ require "hastats/version"
5
+
6
+ module HAStats
7
+ autoload :Socket, 'hastats/socket'
8
+ autoload :Actions, 'hastats/actions'
9
+ autoload :Responses, 'hastats/responses'
10
+ end
11
+
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hastats
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
+ - Travis Petticrew
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-10-04 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ prerelease: false
22
+ type: :runtime
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 43
29
+ segments:
30
+ - 0
31
+ - 14
32
+ - 6
33
+ version: 0.14.6
34
+ name: thor
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ prerelease: false
38
+ type: :runtime
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 1
45
+ segments:
46
+ - 1
47
+ version: "1"
48
+ name: json
49
+ version_requirements: *id002
50
+ description: Allows reading and writing to the haproxy stats socket. See the HAProxy documentation for available commands.
51
+ email:
52
+ - bobo@petticrew.net
53
+ executables:
54
+ - hastats
55
+ extensions: []
56
+
57
+ extra_rdoc_files: []
58
+
59
+ files:
60
+ - .gitignore
61
+ - Gemfile
62
+ - README.rdoc
63
+ - Rakefile
64
+ - bin/hastats
65
+ - hastats.gemspec
66
+ - lib/hastats.rb
67
+ - lib/hastats/actions.rb
68
+ - lib/hastats/actions/base.rb
69
+ - lib/hastats/actions/disable.rb
70
+ - lib/hastats/actions/enable.rb
71
+ - lib/hastats/actions/info.rb
72
+ - lib/hastats/actions/stat.rb
73
+ - lib/hastats/responses.rb
74
+ - lib/hastats/responses/base.rb
75
+ - lib/hastats/responses/blank_result.rb
76
+ - lib/hastats/responses/csv.rb
77
+ - lib/hastats/responses/text.rb
78
+ - lib/hastats/socket.rb
79
+ - lib/hastats/text_response.rb
80
+ - lib/hastats/version.rb
81
+ homepage: ""
82
+ licenses: []
83
+
84
+ post_install_message:
85
+ rdoc_options: []
86
+
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ hash: 3
95
+ segments:
96
+ - 0
97
+ version: "0"
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ hash: 3
104
+ segments:
105
+ - 0
106
+ version: "0"
107
+ requirements: []
108
+
109
+ rubyforge_project: hastats
110
+ rubygems_version: 1.8.9
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: A tool for interfacing with HAProxy through UNIX sockets
114
+ test_files: []
115
+