diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/remote_host.rb | 25 | ||||
-rw-r--r-- | lib/shell_utils.rb | 14 |
2 files changed, 38 insertions, 1 deletions
diff --git a/lib/remote_host.rb b/lib/remote_host.rb new file mode 100644 index 0000000..9110394 --- /dev/null +++ b/lib/remote_host.rb @@ -0,0 +1,25 @@ +# GOV.UK Mini Environment Admin +# Copyright © 2018 Christopher Baines <mail@cbaines.net> +# +# This file is part of the GOV.UK Mini Environment Admin. +# +# The GOV.UK Mini Environment Admin is free software: you can +# redistribute it and/or modify it under the terms of the GNU Affero +# General Public License as published by the Free Software Foundation, +# either version 3 of the License, or (at your option) any later +# version. +# +# The GOV.UK Mini Environment Admin is distributed in the hope that it +# will be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public +# License along with the GOV.UK Mini Environment Admin. If not, see +# <http://www.gnu.org/licenses/>. + +RemoteHost = Struct.new(:user, :address, :private_key) do + def user_at_address + "#{user}@#{address}" + end +end diff --git a/lib/shell_utils.rb b/lib/shell_utils.rb index 0cd8947..75ee3ca 100644 --- a/lib/shell_utils.rb +++ b/lib/shell_utils.rb @@ -20,6 +20,7 @@ require 'open3' require 'shellwords' +require 'tempfile' module ShellUtils def run_command(*command, run_remotely_on_host: nil) @@ -28,11 +29,19 @@ module ShellUtils Shellwords.escape(arg) end + identity_file = Tempfile.new( + 'private-identity-file', + Rails.root.join('tmp') + ) + identity_file.write(run_remotely_on_host.private_key) + identity_file.close + command = [ 'ssh', # Use a automatically trust on first use model '-o', 'StrictHostKeyChecking=no', - run_remotely_on_host, + '-i', identity_file.path, + run_remotely_on_host.user_at_address, *command ] end @@ -52,9 +61,12 @@ module ShellUtils unless exit_status == 0 logger.error(self.class) { "failed, exit status #{exit_status}" } + identity_file.unlink if identity_file raise "Running #{command.join(' ')} failed:\n\n#{output.join}\n" end + identity_file.unlink if identity_file + output end end |