Bladeren bron

Delay automatic log creation until after setuid.

Chris McDonough 19 jaren geleden
bovenliggende
commit
b1d8062577
3 gewijzigde bestanden met toevoegingen van 18 en 16 verwijderingen
  1. 3 14
      src/supervisor/options.py
  2. 14 0
      src/supervisor/supervisord.py
  3. 1 2
      src/supervisor/tests.py

+ 3 - 14
src/supervisor/options.py

@@ -40,8 +40,6 @@ import errno
 import signal
 import re
 
-AUTOMATIC = []
-
 class FileHandler(logging.StreamHandler):
     """File handler which supports reopening of logs.
 
@@ -453,6 +451,7 @@ class ServerOptions(Options):
     passwdfile = None
     nodaemon = None
     prompt = None
+    AUTOMATIC = []
     
     def __init__(self):
         Options.__init__(self)
@@ -555,17 +554,7 @@ class ServerOptions(Options):
 
         self.programs = self.configroot.supervisord.programs
 
-        for program in self.programs:
-            if program.logfile is AUTOMATIC:
-                # temporary logfile which is erased at restart
-                section = self.configroot.supervisord
-                prefix='%s---%s-' % (program.name, section.identifier)
-                fd, logfile = tempfile.mkstemp(
-                    suffix='.log',
-                    prefix=prefix,
-                    dir=section.childlogdir)
-                os.close(fd)
-                program.logfile = logfile
+        self.identifier = self.configroot.supervisord.identifier
 
         if self.nodaemon:
             self.daemon = False
@@ -701,7 +690,7 @@ class ServerOptions(Options):
             elif logfile is not None:
                 logfile = datatypes.existing_dirpath(logfile)
             else:
-                logfile = AUTOMATIC
+                logfile = self.AUTOMATIC
             logfile_backups = config.saneget(section, 'logfile_backups', 1)
             logfile_backups = datatypes.integer(logfile_backups)
             logfile_maxbytes = config.saneget(section, 'logfile_maxbytes',

+ 14 - 0
src/supervisor/supervisord.py

@@ -28,6 +28,7 @@ import StringIO
 import resource
 import stat
 import re
+import tempfile
 
 from fcntl import fcntl
 from fcntl import F_SETFL, F_GETFL
@@ -449,6 +450,19 @@ class Supervisor:
         if not self.options.nocleanup:
             self.options.clear_childlogdir()
 
+        # delay "automatic" child log creation until after setuid because
+        # we want to use mkstemp, which needs to create the file eagerly
+        for program in self.options.programs:
+            if program.logfile is self.options.AUTOMATIC:
+                # temporary logfile which is erased at restart
+                prefix='%s---%s-' % (program.name, self.options.identifier)
+                fd, logfile = tempfile.mkstemp(
+                    suffix='.log',
+                    prefix=prefix,
+                    dir=self.options.childlogdir)
+                os.close(fd)
+                program.logfile = logfile
+
         self.run(test)
 
     def get_state(self):

+ 1 - 2
src/supervisor/tests.py

@@ -141,8 +141,7 @@ command=/bin/cat
         self.assertEqual(cat3.autostart, True)
         self.assertEqual(cat3.autorestart, True)
         self.assertEqual(cat3.uid, None)
-        self.failUnless(cat3.logfile.startswith('%s/cat3---fleeb' %
-                                                tempfile.gettempdir()))
+        self.assertEqual(cat3.logfile, instance.AUTOMATIC)
         self.assertEqual(cat3.logfile_maxbytes, datatypes.byte_size('5MB'))
         self.assertEqual(cat3.logfile_backups, 1)