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