#!/usr/bin/env ruby require 'rbbt-util' require 'rbbt/util/simpleopt' $0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands options = SOPT.setup < -h--help Print this help -e--environment* Execution environment: production or development -Ho--Host* Host name -B--Bind* Bind IP -p--port* TCP port -s--server* Server type: thin, webrick, unicorn, etc -f--finder Start server with finder functionality -RS--Rserve_session* Rserve session to use, otherwise start new one -wd--workdir* Change the working directory of the workflow -W--workflows* List of additional workflows to load -R--requires* Require a list of files --views* Directory with view templates --stream Activate streaming of workflow tasks -fs--file_server Activate file serving for resources -mj--monitor_jobs Monitor jobs (UNSAFE) -a--app_dir* Application execution directory --export_all Export all workflow tasks (use with caution!) --export* Export workflow tasks (asynchronous) --export_asynchronous* Export workflow tasks as asynchronous --export_synchronous* Export workflow tasks as synchronous --export_exec* Export workflow tasks as exec --export_stream* Export workflow tasks as stream --options* Additional options for server (e.g. option1=value1;option2=value2) EOF if options[:help] if defined? rbbt_usage rbbt_usage else puts SOPT.usage end exit 0 end if options[:workdir] require 'rbbt/workflow' Workflow.workdir = options[:workdir] end options[:Port] = options.delete "port" options[:server] = options.delete "server" options[:Host] = options.delete "Host" options[:Bind] = options.delete "Bind" options[:environment] = options.delete "environment" options[:Host] ||= "0.0.0.0" options[:Bind] ||= "0.0.0.0" workflow = ARGV.shift workflows = options[:workflows] || "" requires = options[:requires] || "" workflow = File.expand_path(workflow) if File.exist?(workflow) ENV["RServe-session"] = options[:RServe_session] || workflow server = options[:server] || 'puma' exports = options[:export].split(/\s*,/) if options[:export] stream_exports = options[:export_stream].split(/\s*,/) if options[:export_stream] async_exports = options[:export_asynchronous].split(/\s*,/) if options[:export_asynchronous] sync_exports = options[:export_synchronous].split(/\s*,/) if options[:export_synchronous] exec_exports = options[:export_exec].split(/\s*,/) if options[:export_exec] TmpFile.with_file do |app_dir| app_dir = options[:app_dir] if options[:app_dir] Misc.in_dir(app_dir) do app_dir = Path.setup(app_dir.dup) Open.write(app_dir.etc.target_workflow.find, workflow) Open.write(app_dir.etc.target_workflow_exports.find, exports * "\n") if exports Open.write(app_dir.etc.target_workflow_stream_exports.find, stream_exports * "\n") if stream_exports Open.write(app_dir.etc.target_workflow_async_exports.find, async_exports * "\n") if async_exports Open.write(app_dir.etc.target_workflow_sync_exports.find, sync_exports * "\n") if sync_exports Open.write(app_dir.etc.target_workflow_exec_exports.find, exec_exports * "\n") if exec_exports Open.write(app_dir.etc.workflows.find, workflows.split(/,\s*/)*"\n") if workflows and not workflows.empty? Open.write(app_dir.etc.requires.find, requires.split(/,\s*/)*"\n") if requires and not requires.empty? require 'rack' ENV["RBBT_FINDER"] = "true" if options[:finder] ENV["RACK_ENV"] = options[:environment] if options.include?(:environment) ENV["RBBT_VIEWS_DIR"] = options[:views] if options.include?(:views) ENV["RBBT_REST_FILE_SERVER"] = "true" if options[:file_server] ENV["RBBT_MONITOR_REST_JOBS"] = "true" if options[:monitor_jobs] if options[:export_all] ENV["RBBT_WORKFLOW_EXPORT_ALL"] = 'true' end if options[:stream] raise "No streaming available for any server other than puma" unless true or options[:server].include? 'puma' ENV["RBBT_WORKFLOW_TASK_STREAM"] = 'true' end config_ru_file = File.exist?('./workflow_config.ru') ? './workflow_config.ru' : Rbbt.share['workflow_config.ru'].find if options[:options] options[:options].split(";").each do |pair| name, _sep, value = pair.partition("=") name = name[1..-1].to_sym if name[0] == ':' options[name] = value end end case server when 'unicorn' `env RBBT_LOG=#{Log.severity.to_s} unicorn -c #{ Rbbt.share['unicorn.rb'].find } '#{config_ru_file}' -p #{options[:Port] || "2887"}` when 'puma_alt' #`puma '#{config_ru_file}' -p #{options[:Port] || "2887"} -w 3 -t 8:32 --preload` `env RBBT_LOG=#{Log.severity.to_s} puma '#{config_ru_file}' -p #{options[:Port] || "2887"} -w 20 -t 10:160 --preload` else options[:config] = config_ru_file fixed_options = {} options.each do |k,v| fixed_options[k.to_sym] = v end options = fixed_options Rack::Server.start(options) end end end