class SpiderGazelle::LaunchControl

Attributes

args[R]
password[R]

Public Instance Methods

exec(args) click to toggle source
# File lib/spider-gazelle.rb, line 34
def exec(args)
    options = SpiderGazelle::Options.sanitize(args)
    @args = args
    launch(options)
end
launch(options) click to toggle source
# File lib/spider-gazelle.rb, line 40
def launch(options)
    # Enable verbose messages if requested
    Logger.instance.verbose! if options[0][:verbose]

    # Start the Libuv Event Loop
    reactor = ::SpiderGazelle::Reactor.instance
    reactor.run do

        # Check if SG is already running
        signaller = ::SpiderGazelle::Signaller.instance

        if options[0][:isolate]
            # This ensures this process will load the spider code
            options[0][:spider] = true
            boot(true, signaller, options)
        else
            signaller.check.then do |running|
                boot(running, signaller, options)
            end
        end
    end
end
launch_spider(args) click to toggle source

SPIDER LAUNCH CONTROL


# File lib/spider-gazelle.rb, line 74
def launch_spider(args)
    require 'securerandom'

    @password ||= SecureRandom.hex

    #cmd = "#{EXEC_NAME} -s #{@password} #{Shellwords.join(args)}"

    thread = Reactor.instance.thread
    spider = thread.spawn(EXEC_NAME, args: (['-s', @password] + args), mode: :inherit)
    spider.finally do
        signaller = ::SpiderGazelle::Signaller.instance
        signaller.panic!('Unexpected spider exit') unless signaller.shutting_down
    end
end
shutdown() click to toggle source
# File lib/spider-gazelle.rb, line 63
def shutdown
    reactor = Reactor.instance
    reactor.thread.schedule do
        reactor.shutdown
    end
end
signal_master(reactor, signaller, logger, options) click to toggle source

TTY SIGNALLING CONTROL


# File lib/spider-gazelle.rb, line 99
def signal_master(reactor, signaller, logger, options)
    # This is a signal request
    promise = signaller.request(options)

    promise.then do |result|
        logger.info "signal recieved #{result}"
    end
    promise.catch do |error|
        logger.info "there was an error #{error}"
    end
    promise.finally do
        reactor.shutdown
    end
end
start_spider(signaller, logger, options) click to toggle source

This is called when a spider process starts

# File lib/spider-gazelle.rb, line 90
def start_spider(signaller, logger, options)
    require 'spider-gazelle/spider'
    Spider.instance.run!(options)
end

Protected Instance Methods

boot(running, signaller, options) click to toggle source
# File lib/spider-gazelle.rb, line 118
def boot(running, signaller, options)
    logger = ::SpiderGazelle::Logger.instance

    begin
        # What do we want to do?
        master = options[0]

        if running
            if master[:spider]
                logger.verbose "Starting Spider"
                start_spider(signaller, logger, options)
            else
                logger.verbose "Sending signal to SG Master"
                signal_master(reactor, signaller, logger, options)
            end

        elsif master[:debug]
            logger.verbose "SG is now running in debug mode"
        else
            logger.verbose "SG was not running, launching Spider"
            launch_spider(@args)
        end
    rescue => e
        logger.verbose "Error performing requested operation"
        logger.print_error(e)
        shutdown
    end
end