Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for --control-url in cli #1487

Merged
merged 1 commit into from May 9, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Expand Up @@ -167,15 +167,15 @@ $ puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert'
Puma has a built-in status/control app that can be used to query and control Puma itself.

```
$ puma --control tcp://127.0.0.1:9293 --control-token foo
$ puma --control-url tcp://127.0.0.1:9293 --control-token foo
```

Puma will start the control server on localhost port 9293. All requests to the control server will need to include `token=foo` as a query parameter. This allows for simple authentication. Check out [status.rb](https://github.com/puma/puma/blob/master/lib/puma/app/status.rb) to see what the app has available.

You can also interact with the control server via `pumactl`. This command will restart Puma:

```
$ pumactl -C 'tcp://127.0.0.1:9293' --control-token foo restart
$ pumactl --control-url 'tcp://127.0.0.1:9293' --control-token foo restart
```

To see a list of `pumactl` options, use `pumactl --help`.
Expand Down
22 changes: 15 additions & 7 deletions lib/puma/cli.rb
Expand Up @@ -84,6 +84,14 @@ def unsupported(str)
raise UnsupportedOption
end

def configure_control_url(command_line_arg)
if command_line_arg
@control_url = command_line_arg
elsif Puma.jruby?
unsupported "No default url available on JRuby"
end
end

# Build the OptionParser object to handle the available options.
#

Expand All @@ -98,13 +106,13 @@ def setup_options
file_config.load arg
end

o.on "--control URL", "The bind url to use for the control server",
"Use 'auto' to use temp unix server" do |arg|
if arg
@control_url = arg
elsif Puma.jruby?
unsupported "No default url available on JRuby"
end
o.on "--control-url URL", "The bind url to use for the control server. Use 'auto' to use temp unix server" do |arg|
configure_control_url(arg)
end

# alias --control-url for backwards-compatibility
o.on "--control URL", "DEPRECATED alias for --control-url" do |arg|
configure_control_url(arg)
end

o.on "--control-token TOKEN",
Expand Down
2 changes: 1 addition & 1 deletion lib/puma/control_cli.rb
Expand Up @@ -220,7 +220,7 @@ def send_signal
end

def run
start if @command == "start"
return start if @command == "start"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prior to this change, send_request was being called with @command == "start". The control server does not respond to this command, so returns a 404, which then ultimately calls exit 1, making it very difficult to figure out why my test was failing silently. This early return short-circuits all that mess.


prepare_configuration

Expand Down
58 changes: 58 additions & 0 deletions test/test_pumactl.rb
Expand Up @@ -3,8 +3,66 @@
require 'puma/control_cli'

class TestPumaControlCli < Minitest::Test
def setup
# use a pipe to get info across thread boundary
@wait, @ready = IO.pipe
end

def wait_booted
line = @wait.gets until line =~ /Listening on/
end

def teardown
@wait.close
@ready.close
end

def find_open_port
begin
server = TCPServer.new("127.0.0.1", 0)
server.addr[1]
ensure
server.close
end
end

def test_config_file
control_cli = Puma::ControlCLI.new ["--config-file", "test/config/state_file_testing_config.rb", "halt"]
assert_equal "t3-pid", control_cli.instance_variable_get("@pidfile")
end

def test_control_url
skip if Puma.jruby? || Puma.windows?

host = "127.0.0.1"
port = find_open_port
url = "tcp://#{host}:#{port}/"

opts = [
"--control-url", url,
"--control-token", "ctrl",
"--config-file", "test/config/app.rb",
]

control_cli = Puma::ControlCLI.new (opts + ["start"]), @ready, @ready
t = Thread.new do
Thread.current.abort_on_exception = true
control_cli.run
end

wait_booted

s = TCPSocket.new host, 9292
s << "GET / HTTP/1.0\r\n\r\n"
body = s.read
assert_match "200 OK", body
assert_match "embedded app", body

shutdown_cmd = Puma::ControlCLI.new(opts + ["halt"])
shutdown_cmd.run

# TODO: assert something about the stop command

t.join
end
end