diff --git a/data/export/bluepill/master.pill.erb b/data/export/bluepill/master.pill.erb new file mode 100644 index 0000000..e02785f --- /dev/null +++ b/data/export/bluepill/master.pill.erb @@ -0,0 +1,27 @@ +Bluepill.application("<%= app %>", :foreground => false, :log_file => "/var/log/bluepill.log") do |app| + + app.uid = "<%= user %>" + app.gid = "<%= user %>" + +<% engine.processes.values.each do |process| %> +<% 1.upto(concurrency[process.name]) do |num| %> +<% port = engine.port_for(process, num, options[:port]) %> + app.process("<%= process.name %>-<%=num%>") do |process| + process.start_command = "<%= process.command.gsub("$PORT", port.to_s) %>" + + process.working_dir = "<%= engine.directory %>" + process.daemonize = true + process.environment = {"PORT" => "<%= port %>"} + process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill] + + process.stdout = process.stderr = "<%= log_root %>/<%= app %>-<%= process.name %>-<%=num%>.log" + + process.monitor_children do |children| + children.stop_command "kill -QUIT {{PID}}" + end + + process.group = "<%= app %>-<%= process.name %>" + end +<% end %> +<% end %> +end \ No newline at end of file diff --git a/lib/foreman/cli.rb b/lib/foreman/cli.rb index e36d3b9..cea8e7b 100644 --- a/lib/foreman/cli.rb +++ b/lib/foreman/cli.rb @@ -40,6 +40,7 @@ class Foreman::CLI < Thor formatter = case format when "inittab" then Foreman::Export::Inittab when "upstart" then Foreman::Export::Upstart + when "bluepill" then Foreman::Export::Bluepill else error "Unknown export format: #{format}." end diff --git a/lib/foreman/export.rb b/lib/foreman/export.rb index ab206c1..7976694 100644 --- a/lib/foreman/export.rb +++ b/lib/foreman/export.rb @@ -7,3 +7,4 @@ end require "foreman/export/base" require "foreman/export/inittab" require "foreman/export/upstart" +require "foreman/export/bluepill" diff --git a/lib/foreman/export/bluepill.rb b/lib/foreman/export/bluepill.rb new file mode 100644 index 0000000..8cf8e5a --- /dev/null +++ b/lib/foreman/export/bluepill.rb @@ -0,0 +1,29 @@ +require "erb" +require "foreman/export" + +class Foreman::Export::Bluepill < Foreman::Export::Base + + def export(location, options={}) + error("Must specify a location") unless location + + FileUtils.mkdir_p location + + app = options[:app] || File.basename(engine.directory) + user = options[:user] || app + log_root = options[:log] || "/var/log/#{app}" + template_root = options[:template] + + Dir["#{location}/#{app}.pill"].each do |file| + say "cleaning up: #{file}" + FileUtils.rm(file) + end + + concurrency = Foreman::Utils.parse_concurrency(options[:concurrency]) + + master_template = export_template("bluepill", "master.pill.erb", template_root) + master_config = ERB.new(master_template).result(binding) + write_file "#{location}/#{app}.pill", master_config + + end + +end diff --git a/spec/foreman/export/bluepill_spec.rb b/spec/foreman/export/bluepill_spec.rb new file mode 100644 index 0000000..35d74e6 --- /dev/null +++ b/spec/foreman/export/bluepill_spec.rb @@ -0,0 +1,20 @@ +require "spec_helper" +require "foreman/engine" +require "foreman/export/bluepill" +require "tmpdir" + +describe Foreman::Export::Bluepill do + let(:procfile) { FileUtils.mkdir_p("/tmp/app"); write_procfile("/tmp/app/Procfile") } + let(:engine) { Foreman::Engine.new(procfile) } + let(:bluepill) { Foreman::Export::Bluepill.new(engine) } + + before(:each) { load_export_templates_into_fakefs("bluepill") } + before(:each) { stub(bluepill).say } + + it "exports to the filesystem" do + bluepill.export("/tmp/init") + + File.read("/tmp/init/app.pill").should == example_export_file("bluepill/app.pill") + end + +end \ No newline at end of file diff --git a/spec/resources/export/bluepill/app.pill b/spec/resources/export/bluepill/app.pill new file mode 100644 index 0000000..bef2f13 --- /dev/null +++ b/spec/resources/export/bluepill/app.pill @@ -0,0 +1,65 @@ +Bluepill.application("app", :foreground => false, :log_file => "/var/log/bluepill.log") do |app| + + app.uid = "app" + app.gid = "app" + + + + + app.process("alpha-1") do |process| + process.start_command = "./alpha" + + process.working_dir = "/tmp/app" + process.daemonize = true + process.environment = {"PORT" => "5000"} + process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill] + + process.stdout = process.stderr = "/var/log/app/app-alpha-1.log" + + process.monitor_children do |children| + children.stop_command "kill -QUIT {{PID}}" + end + + process.group = "app-alpha" + end + + + app.process("alpha-2") do |process| + process.start_command = "./alpha" + + process.working_dir = "/tmp/app" + process.daemonize = true + process.environment = {"PORT" => "5001"} + process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill] + + process.stdout = process.stderr = "/var/log/app/app-alpha-2.log" + + process.monitor_children do |children| + children.stop_command "kill -QUIT {{PID}}" + end + + process.group = "app-alpha" + end + + + + + app.process("bravo-1") do |process| + process.start_command = "./bravo" + + process.working_dir = "/tmp/app" + process.daemonize = true + process.environment = {"PORT" => "5100"} + process.stop_signals = [:quit, 30.seconds, :term, 5.seconds, :kill] + + process.stdout = process.stderr = "/var/log/app/app-bravo-1.log" + + process.monitor_children do |children| + children.stop_command "kill -QUIT {{PID}}" + end + + process.group = "app-bravo" + end + + +end