File: haproxyctl.rb

package info (click to toggle)
haproxyctl 1.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 152 kB
  • ctags: 18
  • sloc: ruby: 333; sh: 57; makefile: 5
file content (121 lines) | stat: -rw-r--r-- 4,141 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
require 'haproxyctl/version'
require 'haproxyctl/environment'
require 'socket'

module HAProxyCTL
  include Environment

  def start
    puts 'starting haproxy...'
    system("#{exec} -f #{config_path} -D -p #{pidfile}")
    newpid = check_running
    if newpid =~ /^\d+$/
      puts "haproxy is running on pid #{newpid}"
      return true
    else
      puts 'error. haproxy did not start!'
      return nil
    end
  end

  def stop(pid)
    if pid
      puts "stopping haproxy on pid #{pid}..."
      system("kill #{pid}") || system("kill -9 #{pid}")
      puts '... stopped'
    else
      puts 'haproxy is not running!'
    end
  end

  def reload(pid)
    if pid
      puts "gracefully stopping connections on pid #{pid}..."
      system("#{exec} -f #{config_path} -sf #{pid}")
      puts "checking if connections still alive on #{pid}..."
      nowpid = check_running
      while  pid == nowpid
        puts "still haven't killed old pid.
                            waiting 2s for existing connections to die...
                            (ctrl+c to stop this check)"
        sleep 2
        nowpid = check_running || 0
      end
      puts "reloaded haproxy on pid #{nowpid}"
    else
      puts 'haproxy is not running!'
    end
  end

  def unixsock(command)
    output = []
    runs = 0

    begin
      ctl = UNIXSocket.open(socket)
      if ctl
        ctl.write "#{command}\r\n"
      else
        puts "cannot talk to #{socket}"
      end
    rescue Errno::EPIPE
      ctl.close
      sleep 0.5
      runs += 1
      if  runs < 4
        retry
      else
        puts "the unix socket at #{socket} closed before we could complete this request"
        exit
      end
    end
    while (line = ctl.gets)
      unless  line =~ /Unknown command/
        output << line
      end
    end
    ctl.close

    output
  end

  def display_usage!
    puts usage
    exit
  end

  def usage
    <<-USAGE
usage: #{$PROGRAM_NAME} <argument>
  where <argument> can be:
    start                       : start haproxy unless it is already running
    stop                        : stop an existing haproxy
    restart                     : immediately shutdown and restart
    reload                      : gracefully terminate existing connections, reload #{config_path}
    status                      : is haproxy running?  on what ports per lsof?
    configcheck                 : check #{config_path}
    nagios                      : nagios-friendly status for running process and listener
    cloudkick                   : cloudkick.com-friendly status and metric for connected users
    show health                 : show status of all frontends and backend servers
    show backends               : show status of backend pools of servers
    enable all <server>         : re-enable a server previously in maint mode on multiple backends
    disable all <server>        : disable a server from every backend it exists
    enable all EXCEPT <server>  : like 'enable all', but re-enables every backend except for <server>
    disable all EXCEPT <server> : like 'disable all', but disables every backend except for <server>
    clear counters              : clear max statistics counters (add 'all' for all counters)
    help                        : this message
    prompt                      : toggle interactive mode with prompt
    quit                        : disconnect
    show info                   : report information about the running process
    show stat                   : report counters for each proxy and server
    show errors                 : report last request and response errors for each proxy
    show sess [id]              : report the list of current sessions or dump this session
    get weight                  : report a server's current weight
    set weight                  : change a server's weight
    set timeout                 : change a timeout setting
    disable server              : set a server in maintenance mode
    enable server               : re-enable a server that was previously in maintenance mode
    version                     : version of this script
USAGE
  end
end