require 'eventmachine' module Adminix class Watcher attr_reader :quit def self.run!(app_service, options) Adminix.logger.info "Starting watcher PID is #{Process.pid}" EM.run do w = Adminix.watcher = Adminix::Watcher.new(app_service, options) c = Adminix.config p = c.watcher_period if c.web_debugger_enabled? Adminix.logger.info "Web debugger is running on port #{c.server_port}" EM.start_server('0.0.0.0', c.server_port, Web::Router) end if Adminix.config.watch_system_load? EM.add_periodic_timer(p[:check_system_load]) { w.perform(:check_system_load) } EM.add_periodic_timer(p[:send_system_load]) { w.perform(:send_system_load) } end if Adminix.config.watch_logs? EM.add_periodic_timer(p[:send_logs]) { w.perform(:send_logs) } Adminix.config.log_files.each do |path| EventMachine.file_tail(path, Adminix::Helpers::LogReader) end end if c.credentials_defined? EM.add_periodic_timer(p[:sync_service]) { w.perform(:sync_service) } end EM.add_periodic_timer(p[:execute_jobs]) { w.perform(:execute_jobs) } EM.add_periodic_timer(2) do if w.quit && !w.wait? Adminix.logger.info 'Stopping watcher...' EM.stop end end trap('TERM') { w.stop } trap('INT') { w.stop } end end def initialize(app_service, options) @options = options @running_jobs = [] @app_service = app_service @system_load_service = Services::SystemLoadService.new(service) @quit = false end def perform(job) return if @running_jobs.include?(job) || @quit @running_jobs << job send(job) @running_jobs.delete(job) end def check_logs Adminix.logger.debug 'Checking logs...' end def check_system_load Adminix.logger.debug 'Checking system load...' @system_load_service.create_stamp end def sync_service Adminix.logger.info 'Syncing service...' @app_service.sync end def execute_jobs return unless @app_service.service.new_jobs? Adminix.logger.info 'Executing jobs...' @app_service.run_jobs end def send_logs Adminix.logger.debug 'Adding logs to sending queue...' @app_service.allow_sending_logs end def send_system_load Adminix.logger.debug 'Adding system load to sending queue...' @app_service.allow_sending_system_load end def wait? !@running_jobs.count.zero? end def service @app_service.service end def app_service @app_service end def stop @quit = true end end end