class Train::Transports::Train::Transports::Podman::Connection
def close
def close # nothing to do at the moment end
def cmd_run_command(cmd)
def cmd_run_command(cmd) ["cmd.exe", "/s", "/c", cmd] end
def file_via_connection(path)
def file_via_connection(path) if os.aix? Train::File::Remote::Aix.new(self, path) elsif os.solaris? Train::File::Remote::Unix.new(self, path) elsif os.windows? Train::File::Remote::Windows.new(self, path) else Train::File::Remote::Linux.new(self, path) end end
def initialize(options)
def initialize(options) super(options) @id = options[:host] if RUBY_PLATFORM =~ /windows|mswin|msys|mingw|cygwin/ raise "Unsupported host platform." end # Currently Podman url can be set using option and setting the environment variable. uid = Process.uid podman_url = options[:podman_url] || ENV["CONTAINER_HOST"] podman_url ||= "unix:///run/podman/podman.sock" if uid == 0 podman_url ||= "unix:///run/user/#{uid}/podman/podman.sock" Docker.url = podman_url # Using docker-api ruby library to fetch the Podman container data. @container = ::Docker::Container.get(@id) || raise("Can't find Podman container #{@id}") @cmd_wrapper = nil @cmd_wrapper = CommandWrapper.load(self, @options) @probably_windows = nil rescue Excon::Error::Socket raise Train::TransportError, "Unable to connect to Podman using #{podman_url}" rescue Docker::Error::NotFoundError => e raise Train::TransportError, "Container Not Found: #{e.message}" rescue Docker::Error::ServerError => e raise Train::TransportError, "#{e.message}" end
def run_command_via_connection(cmd, &_data_handler)
def run_command_via_connection(cmd, &_data_handler) cmd = @cmd_wrapper.run(cmd) unless @cmd_wrapper.nil? # Cannot use os.windows? here because it calls run_command_via_connection, # causing infinite recursion during initial platform detection if sniff_for_windows? invocation = cmd_run_command(cmd) else invocation = sh_run_command(cmd) end stdout, stderr, exit_status = @container.exec( invocation, user: @options[:user] ) CommandResult.new(stdout.join, stderr.join, exit_status) rescue ::Docker::Error::DockerError => _ raise rescue => _ # @TODO: differentiate any other error raise end
def sh_run_command(cmd)
def sh_run_command(cmd) ["/bin/sh", "-c", cmd] end
def sniff_for_windows?
def sniff_for_windows? return @probably_windows unless @probably_windows.nil? # Run a command using /bin/sh, which should fail under Windows stdout, _stderr, _exit_status = @container.exec( sh_run_command("true"), user: @options[:user] ) @probably_windows = !!stdout.detect { |l| l.include? "failure in a Windows system call" } end
def unique_identifier
def unique_identifier @container.nil? ? @id : @container.id # default uuid set to the podman host. end
def uri
def uri if @container.nil? "podman://#{@id}" else "podman://#{@container.id}" end end