Sha256: 4fca467d7d233df82067a2cf1c6ba8eee27a5fb83a2b5792f2a256569300bd13

Contents?: true

Size: 1.86 KB

Versions: 11

Compression:

Stored size: 1.86 KB

Contents

module LitmusPaper
  module Dependency
    class Script
      attr_reader :script_pid

      def initialize(command, options = {})
        @command = command
        @timeout = options.fetch(:timeout, 5)
      end

      def available?
        Timeout.timeout(@timeout) do
          script_stdout = script_stderr = nil
          script_status = POpen4.popen4(@command) do |stdout, stderr, stdin, pid|
            @script_pid = pid
            script_stdout = stdout.read.strip
            script_stderr = stderr.read.strip
          end
          unless script_status.success?
            LitmusPaper.logger.info("Available check to #{@command} failed with status #{$CHILD_STATUS.exitstatus}")
            LitmusPaper.logger.info("Failed stdout: #{script_stdout}")
            LitmusPaper.logger.info("Failed stderr: #{script_stderr}")
          end
          script_status.success?
        end
      rescue Timeout::Error
        LitmusPaper.logger.info("Timeout running command: '#{@command}'")
        kill_and_reap_script(@script_pid)
        false
      rescue => e
        LitmusPaper.logger.info("Available check to #{@uri} failed with #{e.message}")
        false
      end

      def kill_and_reap_script(pid)
        Process.kill(9, pid)
        stop_time = Time.now + 2
        while Time.now < stop_time
          if Process.waitpid(pid, Process::WNOHANG)
            LitmusPaper.logger.info("Reaped PID #{pid}")
            return
          else
            sleep 0.1
          end
        end
        LitmusPaper.logger.error("Unable to reap PID #{pid}")
      rescue Errno::ESRCH
        LitmusPaper.logger.info("Attempted to kill non-existent PID #{pid} (ESRCH)")
      rescue Errno::ECHILD
        LitmusPaper.logger.info("Attempted to reap PID #{pid} but it has already been reaped (ECHILD)")
      end

      def to_s
        "Dependency::Script(#{@command})"
      end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
litmus_paper-0.9.6 lib/litmus_paper/dependency/script.rb
litmus_paper-0.9.5 lib/litmus_paper/dependency/script.rb
litmus_paper-0.9.4 lib/litmus_paper/dependency/script.rb
litmus_paper-0.9.3 lib/litmus_paper/dependency/script.rb
litmus_paper-0.9.2 lib/litmus_paper/dependency/script.rb
litmus_paper-0.9.1 lib/litmus_paper/dependency/script.rb
litmus_paper-0.9.0 lib/litmus_paper/dependency/script.rb
litmus_paper-0.8.9 lib/litmus_paper/dependency/script.rb
litmus_paper-0.8.8 lib/litmus_paper/dependency/script.rb
litmus_paper-0.8.7 lib/litmus_paper/dependency/script.rb
litmus_paper-0.8.6 lib/litmus_paper/dependency/script.rb