unicorn, rails, and symlinked deployment

Eric Wong normalperson at yhbt.net
Wed Nov 18 20:51:26 EST 2009


Eric Wong <normalperson at yhbt.net> wrote:
> Michael Guterl <mguterl at gmail.com> wrote:
> > cd ~/public_html/rm/current
> > unicorn_rails -D -E production -c config/unicorn.rb
> > 
> > I determined the -c config/unicorn.rb was the problem.  If I change it to:
> > 
> > unicorn_rails -D -E production -c ~/public_html/rm/current/config/unicorn.rb
> > 
> > everything works fine.
> 
> Hmm, maybe the config file path shouldn't be expanded then.  Especially
> since it's only specified in the command-line.  /me ponders a bit...

Hi Michael,

Just pushed this out, too.  This should work better for you with:

  unicorn_rails -D -E production -c config/unicorn.rb

Oddly, this has been a problem since the beginning of time and probably
confused a good amount of people.

Thanks Michael for finally bringing it to my attention.  Most folks I
know favor absolute ones (including myself), and don't hit this
problem...  Of course let me know if I broke something for anyone,
I hope not...

>From 15217fe1162a400fa1cd2216e395d9f17be8083e Mon Sep 17 00:00:00 2001
From: Eric Wong <normalperson at yhbt.net>
Date: Wed, 18 Nov 2009 17:28:12 -0800
Subject: [PATCH] Do not expand paths given on the shell

Shells already expand '~' before the executables see it, and
relative paths inside symlinks can get set incorrectly to the
actual directory name, and not the (usually desired) symlink
name for things like Capistrano.

Since our paths are now unexpanded, we must now check the
"working_directory" directive and raise an error if the user
specifies the config file in a way that makes the config file
unreloadable.
---
 bin/unicorn                 |    4 +-
 bin/unicorn_rails           |    2 +-
 lib/unicorn/configurator.rb |    7 ++++++
 test/exec/test_exec.rb      |   51 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 61 insertions(+), 3 deletions(-)

diff --git a/bin/unicorn b/bin/unicorn
index 225e819..325afb3 100755
--- a/bin/unicorn
+++ b/bin/unicorn
@@ -68,7 +68,7 @@ opts = OptionParser.new("", 24, '  ') do |opts|
   opts.on("-P", "--pid FILE", "DEPRECATED") do |f|
     warn %q{Use of --pid/-P is strongly discouraged}
     warn %q{Use the 'pid' directive in the Unicorn config file instead}
-    options[:pid] = File.expand_path(f)
+    options[:pid] = f
   end
 
   opts.on("-s", "--server SERVER",
@@ -85,7 +85,7 @@ opts = OptionParser.new("", 24, '  ') do |opts|
   end
 
   opts.on("-c", "--config-file FILE", "Unicorn-specific config file") do |f|
-    options[:config_file] = File.expand_path(f)
+    options[:config_file] = f
   end
 
   # I'm avoiding Unicorn-specific config options on the command-line.
diff --git a/bin/unicorn_rails b/bin/unicorn_rails
index 36ed660..e46de70 100755
--- a/bin/unicorn_rails
+++ b/bin/unicorn_rails
@@ -75,7 +75,7 @@ opts = OptionParser.new("", 24, '  ') do |opts|
   end
 
   opts.on("-c", "--config-file FILE", "Unicorn-specific config file") do |f|
-    options[:config_file] = File.expand_path(f)
+    options[:config_file] = f
   end
 
   opts.on("-P PATH", "DEPRECATED") do |v|
diff --git a/lib/unicorn/configurator.rb b/lib/unicorn/configurator.rb
index 2d92aa3..e809b22 100644
--- a/lib/unicorn/configurator.rb
+++ b/lib/unicorn/configurator.rb
@@ -372,6 +372,13 @@ module Unicorn
     def working_directory(path)
       # just let chdir raise errors
       path = File.expand_path(path)
+      if config_file &&
+         config_file[0] != ?/ &&
+         ! test(?r, "#{path}/#{config_file}")
+        raise ArgumentError,
+              "config_file=#{config_file} would not be accessible in" \
+              " working_directory=#{path}"
+      end
       Dir.chdir(path)
       HttpServer::START_CTX[:cwd] = ENV["PWD"] = path
     end
diff --git a/test/exec/test_exec.rb b/test/exec/test_exec.rb
index f6dfd6a..49762c0 100644

<snip ridiculously verbose test case>
-- 
Eric Wong


More information about the mongrel-unicorn mailing list