Sha256: 8afd569042cfefd9f84c63e9dfce83a26f227e0edb755af88eb2e3c11556aeeb

Contents?: true

Size: 1.64 KB

Versions: 1

Compression:

Stored size: 1.64 KB

Contents

module Zeus
  class Server
    class CommandRunner

      def initialize(name, action, s_acceptor)
        @name = name
        @action = action
        @s_acceptor = s_acceptor
      end

      def run(terminal, exit_status_socket, arguments)
        child = fork { _run(terminal, exit_status_socket, arguments) }
        terminal.close
        exit_status_socket.close
        Process.detach(child)
        child
      end

      private

      def _run(terminal, exit_status_socket, arguments)
        $0 = "zeus runner: #{@name}"
        @exit_status_socket = exit_status_socket
        @terminal = terminal
        Process.setsid
        reconnect_activerecord!
        @s_acceptor << $$ << "\n"
        reopen_streams(terminal, terminal, terminal)
        ARGV.replace(arguments)

        return_process_exit_status

        run_action
      end

      def return_process_exit_status
        at_exit do
          if $!.nil? || $!.is_a?(SystemExit) && $!.success?
            @exit_status_socket.puts(0)
          else
            code = $!.is_a?(SystemExit) ? $!.status : 1
            @exit_status_socket.puts(code)
          end

          @exit_status_socket.close
          @terminal.close
        end
      end

      def run_action
        @action.call
      rescue StandardError => error
        ErrorPrinter.new(error).write_to($stderr)
        raise
      end

      def reopen_streams(i, o, e)
        $stdin.reopen(i)
        $stdout.reopen(o)
        $stderr.reopen(e)
      end

      def reconnect_activerecord!
        ActiveRecord::Base.clear_all_connections! rescue nil
        ActiveRecord::Base.establish_connection   rescue nil
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
zeus-0.4.6 lib/zeus/server/command_runner.rb