diff --git a/data/export/upstart/process.conf.erb b/data/export/upstart/process.conf.erb index e16ed3a..b5c762c 100644 --- a/data/export/upstart/process.conf.erb +++ b/data/export/upstart/process.conf.erb @@ -2,4 +2,4 @@ start on starting <%= app %>-<%= process.name %> stop on stopping <%= app %>-<%= process.name %> respawn -exec su - <%= user %> -c 'cd <%= engine.directory %>; export PORT=<%= port %>;<% engine.environment.each_pair do |var,env| %> export <%= var.upcase %>=<%= env %>; <% end %> <%= process.command %> >> <%= log_root %>/<%=process.name%>-<%=num%>.log 2>&1' +exec su - <%= user %> -c 'cd <%= engine.directory %>; export PORT=<%= port %>;<% engine.environment.each_pair do |var,env| %> export <%= var.upcase %>=<%= shell_quote(env) %>; <% end %> <%= process.command %> >> <%= log_root %>/<%=process.name%>-<%=num%>.log 2>&1' diff --git a/lib/foreman/export/base.rb b/lib/foreman/export/base.rb index c17f9d9..9580971 100644 --- a/lib/foreman/export/base.rb +++ b/lib/foreman/export/base.rb @@ -48,4 +48,19 @@ private ###################################################################### end end + # Quote a string to be used on the command line. Backslashes are escapde to \\ and quotes + # escaped to \" + # + # str - string to be quoted + # + # Examples + # + # shell_quote("FB|123\"\\1") + # # => "\"FB|123\"\\"\\\\1\"" + # + # Returns the the escaped string surrounded by quotes + def shell_quote(str) + "\"#{str.gsub(/\\/){ '\\\\' }.gsub(/["]/){ "\\\"" }}\"" + end + end diff --git a/spec/foreman/export/upstart_spec.rb b/spec/foreman/export/upstart_spec.rb index 62f21dd..4f357ef 100644 --- a/spec/foreman/export/upstart_spec.rb +++ b/spec/foreman/export/upstart_spec.rb @@ -33,6 +33,12 @@ describe Foreman::Export::Upstart, :fakefs do upstart.export end + it "quotes and escapes environment variables" do + engine.environment['KEY'] = 'd"\|d' + upstart.export + File.read("/tmp/init/app-alpha-1.conf").should include('KEY="d\"\\\\|d"') + end + context "with concurrency" do let(:options) { Hash[:concurrency => "alpha=2"] }