[Calypso] [PATCH] Only import lockfile.pidlockfile when needed

Petter Reinholdtsen pere at hungry.com
Mon Jan 25 13:40:13 PST 2016

[Petter Reinholdtsen]
> Perhaps fail gracefully to use daemon.pidlockfile if lockfile do not
> have pidlockfile?  It would allow it to work with older
> python-lockfile versions too?

I had something like this in mind:

diff --git a/calypso.py b/calypso.py
index c3c1999..000d88d 100755
--- a/calypso.py
+++ b/calypso.py
@@ -38,7 +38,6 @@ arguments.
 import daemon
 import lockfile
-from lockfile import pidlockfile
 import logging
 import optparse
 import os
@@ -149,6 +148,10 @@ if not options.daemon:
 context = daemon.DaemonContext()
 context.umask = 0o002
 if options.pidfile:
+    try:
+        from lockfile import pidlockfile
+    except ImportError:
+        from daemon import pidlockfile
     # Generate a pidfile where requested
     context.pidfile = pidlockfile.PIDLockFile(options.pidfile)
 with context:

But when I test it in Jessie without pidlockfile in lockfile, I get this
error, which I do not understand:

% ./calypso.py -g --pid-file=/tmp/foo -d
enable debugging
Traceback (most recent call last):
  File "./calypso.py", line 154, in <module>
    from daemon import pidlockfile
  File "/usr/lib/pymodules/python2.7/daemon/pidlockfile.py", line 33, in <module>
    class PIDLockFile(LinkFileLock, object):
TypeError: Error when calling the metaclass bases
    function() argument 1 must be code, not str

Note, there is a usability problem with the current pidfile handling.
When using --daemon as a normal user and the pidfile configuration point
to a unwritable location, the daemon dies without any messages and
without any trace about what went wrong.  I had to strace the process to
figure out what went wrong... :)

Happy hacking
Petter Reinholdtsen

More information about the Calypso mailing list