Class: RocketJob::CLI
- Inherits:
-
Object
- Object
- RocketJob::CLI
- Includes:
- SemanticLogger::Loggable
- Defined in:
- lib/rocket_job/cli.rb
Overview
Command Line Interface parser for RocketJob
Instance Attribute Summary collapse
-
#directory ⇒ Object
Returns the value of attribute directory.
-
#environment ⇒ Object
Returns the value of attribute environment.
-
#filter ⇒ Object
Returns the value of attribute filter.
-
#log_file ⇒ Object
Returns the value of attribute log_file.
-
#log_level ⇒ Object
Returns the value of attribute log_level.
-
#mongo_config ⇒ Object
Returns the value of attribute mongo_config.
-
#name ⇒ Object
Returns the value of attribute name.
-
#pidfile ⇒ Object
Returns the value of attribute pidfile.
-
#quiet ⇒ Object
Returns the value of attribute quiet.
-
#symmetric_encryption_config ⇒ Object
Returns the value of attribute symmetric_encryption_config.
-
#workers ⇒ Object
Returns the value of attribute workers.
Class Method Summary collapse
-
.eager_load_jobs(path = 'jobs') ⇒ Object
Eager load files in jobs folder.
Instance Method Summary collapse
-
#boot_rails ⇒ Object
Initialize the Rails environment Returns [true|false] whether Rails is present.
-
#boot_standalone ⇒ Object
In a standalone environment, explicitly load config files.
-
#initialize(argv) ⇒ CLI
constructor
A new instance of CLI.
-
#parse(argv) ⇒ Object
Parse command line options placing results in the corresponding instance variables.
- #rails? ⇒ Boolean
-
#run ⇒ Object
Run a RocketJob::Server from the command line.
- #setup_environment ⇒ Object
- #setup_logger ⇒ Object
-
#write_pidfile ⇒ Object
Create a PID file if requested.
Constructor Details
#initialize(argv) ⇒ CLI
Returns a new instance of CLI.
12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/rocket_job/cli.rb', line 12 def initialize(argv) @name = nil @workers = nil @quiet = false @environment = nil @pidfile = nil @directory = '.' @log_level = nil @log_file = nil @mongo_config = nil @symmetric_encryption_config = nil @filter = nil parse(argv) end |
Instance Attribute Details
#directory ⇒ Object
Returns the value of attribute directory.
8 9 10 |
# File 'lib/rocket_job/cli.rb', line 8 def directory @directory end |
#environment ⇒ Object
Returns the value of attribute environment.
8 9 10 |
# File 'lib/rocket_job/cli.rb', line 8 def environment @environment end |
#filter ⇒ Object
Returns the value of attribute filter.
8 9 10 |
# File 'lib/rocket_job/cli.rb', line 8 def filter @filter end |
#log_file ⇒ Object
Returns the value of attribute log_file.
8 9 10 |
# File 'lib/rocket_job/cli.rb', line 8 def log_file @log_file end |
#log_level ⇒ Object
Returns the value of attribute log_level.
8 9 10 |
# File 'lib/rocket_job/cli.rb', line 8 def log_level @log_level end |
#mongo_config ⇒ Object
Returns the value of attribute mongo_config.
8 9 10 |
# File 'lib/rocket_job/cli.rb', line 8 def mongo_config @mongo_config end |
#name ⇒ Object
Returns the value of attribute name.
8 9 10 |
# File 'lib/rocket_job/cli.rb', line 8 def name @name end |
#pidfile ⇒ Object
Returns the value of attribute pidfile.
8 9 10 |
# File 'lib/rocket_job/cli.rb', line 8 def pidfile @pidfile end |
#quiet ⇒ Object
Returns the value of attribute quiet.
8 9 10 |
# File 'lib/rocket_job/cli.rb', line 8 def quiet @quiet end |
#symmetric_encryption_config ⇒ Object
Returns the value of attribute symmetric_encryption_config.
8 9 10 |
# File 'lib/rocket_job/cli.rb', line 8 def symmetric_encryption_config @symmetric_encryption_config end |
#workers ⇒ Object
Returns the value of attribute workers.
8 9 10 |
# File 'lib/rocket_job/cli.rb', line 8 def workers @workers end |
Class Method Details
.eager_load_jobs(path = 'jobs') ⇒ Object
Eager load files in jobs folder
137 138 139 140 141 142 143 |
# File 'lib/rocket_job/cli.rb', line 137 def self.eager_load_jobs(path = 'jobs') Pathname.glob("#{path}/**/*.rb").each do |path| next if path.directory? logger.debug "Loading #{path.to_s}" require path..to_s end end |
Instance Method Details
#boot_rails ⇒ Object
Initialize the Rails environment Returns [true|false] whether Rails is present
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/rocket_job/cli.rb', line 54 def boot_rails logger.info "Loading Rails environment: #{environment}" boot_file = Pathname.new(directory).join('config/environment.rb'). require(boot_file.to_s) begin require 'rails_semantic_logger' rescue LoadError raise "Add the following line to your Gemfile when running rails:\n gem 'rails_semantic_logger'" end # Override Rails log level if command line option was supplied SemanticLogger.default_level = log_level.to_sym if log_level if Rails.configuration.eager_load logger.measure_info('Eager loaded Rails and all Engines') do Rails.application.eager_load! Rails::Engine.subclasses.each(&:eager_load!) self.class.eager_load_jobs(File.('jobs', File.dirname(__FILE__))) end end end |
#boot_standalone ⇒ Object
In a standalone environment, explicitly load config files
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/rocket_job/cli.rb', line 79 def boot_standalone # Try to load bundler if present begin require 'bundler/setup' Bundler.require(environment) rescue LoadError end require 'rocketjob' begin require 'rocketjob_pro' rescue LoadError end # Log to file except when booting rails, when it will add the log file path path = log_file ? Pathname.new(log_file) : Pathname.pwd.join("log/#{environment}.log") path.dirname.mkpath SemanticLogger.add_appender(file_name: path.to_s, formatter: :color) logger.info "Rails not detected. Running standalone: #{environment}" RocketJob::Config.load!(environment, mongo_config, symmetric_encryption_config) self.class.eager_load_jobs(File.('jobs', File.dirname(__FILE__))) self.class.eager_load_jobs end |
#parse(argv) ⇒ Object
Parse command line options placing results in the corresponding instance variables
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/rocket_job/cli.rb', line 146 def parse(argv) parser = OptionParser.new do |o| o.on('-n', '--name NAME', 'Unique Name of this server (Default: host_name:PID)') do |arg| @name = arg end o.on('-w', '--workers COUNT', 'Number of workers (threads) to start') do |arg| @workers = arg.to_i end o.on('-t', '--threads COUNT', 'Deprecated') do |arg| warn '-t and --threads are deprecated, use -w or --workers' @workers = arg.to_i end o.on('-F', '--filter REGEXP', 'Limit this worker to only those job classes that match this regular expression (case-insensitive)') do |arg| @filter = Regexp.new(arg, true) end o.on('-q', '--quiet', 'Do not write to stdout, only to logfile. Necessary when running as a daemon') do @quiet = true end o.on('-d', '--dir DIR', 'Directory containing Rails app, if not current directory') do |arg| @directory = arg end o.on('-e', '--environment ENVIRONMENT', 'The environment to run the app on (Default: RAILS_ENV || RACK_ENV || development)') do |arg| @environment = arg end o.on('-l', '--log_level trace|debug|info|warn|error|fatal', 'The log level to use') do |arg| @log_level = arg end o.on('-f', '--log_file FILE_NAME', 'The log file to write to. Default: log/<environment>.log') do |arg| @log_file = arg end o.on('--pidfile PATH', 'Use PATH as a pidfile') do |arg| @pidfile = arg end o.on('-m', '--mongo MONGO_CONFIG_FILE_NAME', 'Path and filename of config file. Default: config/mongoid.yml') do |arg| @mongo_config = arg end o.on('-s', '--symmetric-encryption SYMMETRIC_ENCRYPTION_CONFIG_FILE_NAME', 'Path and filename of Symmetric Encryption config file. Default: config/symmetric-encryption.yml') do |arg| @symmetric_encryption_config = arg end o.on('-v', '--version', 'Print the version information') do puts "Rocket Job v#{RocketJob::VERSION}" exit 1 end end parser. = 'rocketjob <options>' parser.on_tail '-h', '--help', 'Show help' do puts parser exit 1 end parser.parse! argv end |
#rails? ⇒ Boolean
45 46 47 48 49 50 |
# File 'lib/rocket_job/cli.rb', line 45 def rails? @rails ||= begin boot_file = Pathname.new(directory).join('config/environment.rb'). boot_file.file? end end |
#run ⇒ Object
Run a RocketJob::Server from the command line
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/rocket_job/cli.rb', line 28 def run Thread.current.name = 'rocketjob main' setup_environment setup_logger rails? ? boot_rails : boot_standalone write_pidfile # In case Rails did not load the Mongoid Config RocketJob::Config.load!(environment, mongo_config, symmetric_encryption_config) if Mongoid::Config.clients.empty? opts = {} opts[:name] = name if name opts[:max_workers] = workers if workers opts[:filter] = {:_type => filter} if filter Server.run(opts) end |
#setup_environment ⇒ Object
116 117 118 119 120 121 122 123 |
# File 'lib/rocket_job/cli.rb', line 116 def setup_environment # Override Env vars when environment is supplied if environment ENV['RACK_ENV'] = ENV['RAILS_ENV'] = environment else self.environment = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development' end end |
#setup_logger ⇒ Object
125 126 127 128 129 130 131 132 133 134 |
# File 'lib/rocket_job/cli.rb', line 125 def setup_logger SemanticLogger.add_appender(io: STDOUT, formatter: :color) unless quiet SemanticLogger.default_level = log_level.to_sym if log_level # Enable SemanticLogger signal handling for this process SemanticLogger.add_signal_handler Mongoid.logger = SemanticLogger[Mongoid] Mongo::Logger.logger = SemanticLogger[Mongo] end |
#write_pidfile ⇒ Object
Create a PID file if requested
105 106 107 108 109 110 111 112 113 114 |
# File 'lib/rocket_job/cli.rb', line 105 def write_pidfile return unless pidfile pid = $PID File.open(pidfile, 'w') { |f| f.puts(pid) } # Remove pidfile on exit at_exit do File.delete(pidfile) if pid == $PID end end |