-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
control_cli.rb
127 lines (99 loc) · 2.49 KB
/
control_cli.rb
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
122
123
124
125
126
127
require 'optparse'
require 'puma/const'
require 'puma/configuration'
require 'yaml'
require 'uri'
require 'socket'
module Puma
class ControlCLI
def initialize(argv, stdout=STDOUT)
@argv = argv
@stdout = stdout
end
def setup_options
@parser = OptionParser.new do |o|
o.on "-S", "--state PATH", "Where the state file to use is" do |arg|
@path = arg
end
end
end
def connect
if str = @config.options[:control_url]
uri = URI.parse str
case uri.scheme
when "tcp"
return TCPSocket.new uri.host, uri.port
when "unix"
path = "#{uri.host}#{uri.path}"
return UNIXSocket.new path
else
raise "Invalid URI: #{str}"
end
end
raise "No status address configured"
end
def run
setup_options
@parser.parse! @argv
@state = YAML.load_file(@path)
@config = @state['config']
cmd = @argv.shift
meth = "command_#{cmd}"
if respond_to?(meth)
__send__(meth)
else
raise "Unknown command: #{cmd}"
end
end
def request(sock, url)
token = @config.options[:control_auth_token]
if token
url = "#{url}?token=#{token}"
end
sock << "GET #{url} HTTP/1.0\r\n\r\n"
rep = sock.read.split("\r\n")
m = %r!HTTP/1.\d (\d+)!.match(rep.first)
if m[1] == "403"
raise "Unauthorized access to server (wrong auth token)"
elsif m[1] != "200"
raise "Bad response code from server: #{m[1]}"
end
return rep.last
end
def command_pid
@stdout.puts "#{@state['pid']}"
end
def command_stop
sock = connect
body = request sock, "/stop"
if body != '{ "status": "ok" }'
raise "Invalid response: '#{body}'"
else
@stdout.puts "Requested stop from server"
end
end
def command_halt
sock = connect
body = request sock, "/halt"
if body != '{ "status": "ok" }'
raise "Invalid response: '#{body}'"
else
@stdout.puts "Requested halt from server"
end
end
def command_restart
sock = connect
body = request sock, "/restart"
if body != '{ "status": "ok" }'
raise "Invalid response: '#{body}'"
else
@stdout.puts "Requested restart from server"
end
end
def command_stats
sock = connect
body = request sock, "/stats"
@stdout.puts body
end
end
end