From 29a8a52cef61c5f7bf4b9f6c5d51fb94013de12c Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 26 Jan 2023 16:17:00 +0100 Subject: [PATCH] Execute over SSH too --- lib/mrsk/cli/app.rb | 20 +++++++++++++++++--- lib/mrsk/commands/app.rb | 8 ++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/lib/mrsk/cli/app.rb b/lib/mrsk/cli/app.rb index d71987a1..150ec1ff 100644 --- a/lib/mrsk/cli/app.rb +++ b/lib/mrsk/cli/app.rb @@ -40,10 +40,24 @@ class Mrsk::Cli::App < Mrsk::Cli::Base end desc "exec [CMD]", "Execute a custom command on servers" - option :run, type: :boolean, default: false, desc: "Start a new container to run the command rather than reusing existing" + option :method, aliases: "-m", default: "exec", desc: "Execution method: [exec] perform inside app container / [run] perform in new container / [ssh] perform over ssh" def exec(cmd) - runner = options[:run] ? :run_exec : :exec - on(MRSK.hosts) { |host| puts_by_host host, capture_with_info(*MRSK.app.send(runner, cmd)) } + runner = \ + case options[:method] + when "exec" then "exec" + when "run" then "run_exec" + when "ssh" then "exec_over_ssh" + else raise "Unknown method: #{options[:method]}" + end.inquiry + + if runner.exec_over_ssh? + run_locally do + info "Launching command on #{MRSK.primary_host}" + exec MRSK.app.exec_over_ssh(cmd, host: MRSK.primary_host) + end + else + on(MRSK.hosts) { |host| puts_by_host host, capture_with_info(*MRSK.app.send(runner, cmd)) } + end end desc "console", "Start Rails Console on primary host (or specific host set by --hosts)" diff --git a/lib/mrsk/commands/app.rb b/lib/mrsk/commands/app.rb index 9ca79482..99b9db33 100644 --- a/lib/mrsk/commands/app.rb +++ b/lib/mrsk/commands/app.rb @@ -60,6 +60,10 @@ class Mrsk::Commands::App < Mrsk::Commands::Base *command end + def exec_over_ssh(*command, host:) + run_over_ssh run_exec(*command, interactive: true).join(" "), host: host + end + def follow_logs(host:, grep: nil) run_over_ssh pipe( current_container_id, @@ -89,10 +93,6 @@ class Mrsk::Commands::App < Mrsk::Commands::Base end private - def exec_over_ssh(*command, host:) - run_over_ssh run_exec(*command, interactive: true).join(" "), host: host - end - def service_filter [ "--filter", "label=service=#{config.service}" ] end