server/server.py
changeset 5555 a64f48dd5fe4
parent 5553 646737f80c88
child 5692 59ceed788bdb
equal deleted inserted replaced
5545:25fd74c23f91 5555:a64f48dd5fe4
    13 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
    13 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
    14 # details.
    14 # details.
    15 #
    15 #
    16 # You should have received a copy of the GNU Lesser General Public License along
    16 # You should have received a copy of the GNU Lesser General Public License along
    17 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    17 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
    18 """Pyro RQL server
    18 """Pyro RQL server"""
    19 
    19 
    20 """
       
    21 __docformat__ = "restructuredtext en"
    20 __docformat__ = "restructuredtext en"
    22 
    21 
    23 import os
    22 import os
    24 import sys
    23 import sys
    25 import select
    24 import select
    26 import warnings
    25 import warnings
    27 from time import localtime, mktime
    26 from time import localtime, mktime
       
    27 
       
    28 from logilab.common.daemon import daemonize
    28 
    29 
    29 from cubicweb.cwconfig import CubicWebConfiguration
    30 from cubicweb.cwconfig import CubicWebConfiguration
    30 from cubicweb.server.repository import Repository
    31 from cubicweb.server.repository import Repository
    31 
    32 
    32 class Finished(Exception):
    33 class Finished(Exception):
    81         self.repo = Repository(config, debug=debug)
    82         self.repo = Repository(config, debug=debug)
    82         self.ns = None
    83         self.ns = None
    83         self.quiting = None
    84         self.quiting = None
    84         # event queue
    85         # event queue
    85         self.events = []
    86         self.events = []
    86         # start repository looping tasks
       
    87 
    87 
    88     def add_event(self, event):
    88     def add_event(self, event):
    89         """add an event to the loop"""
    89         """add an event to the loop"""
    90         self.info('adding event %s', event)
    90         self.info('adding event %s', event)
    91         self.events.append(event)
    91         self.events.append(event)
   101                 except Finished:
   101                 except Finished:
   102                     self.events.remove(event)
   102                     self.events.remove(event)
   103 
   103 
   104     def run(self, req_timeout=5.0):
   104     def run(self, req_timeout=5.0):
   105         """enter the service loop"""
   105         """enter the service loop"""
       
   106         # start repository looping tasks
   106         self.repo.start_looping_tasks()
   107         self.repo.start_looping_tasks()
   107         while self.quiting is None:
   108         while self.quiting is None:
   108             try:
   109             try:
   109                 self.daemon.handleRequests(req_timeout)
   110                 self.daemon.handleRequests(req_timeout)
   110             except select.error:
   111             except select.error:
   128         import signal
   129         import signal
   129         self.info('installing signal handlers')
   130         self.info('installing signal handlers')
   130         signal.signal(signal.SIGINT, lambda x, y, s=self: s.quit())
   131         signal.signal(signal.SIGINT, lambda x, y, s=self: s.quit())
   131         signal.signal(signal.SIGTERM, lambda x, y, s=self: s.quit())
   132         signal.signal(signal.SIGTERM, lambda x, y, s=self: s.quit())
   132 
   133 
   133     def daemonize(self, pid_file=None):
       
   134         """daemonize the process"""
       
   135         # fork so the parent can exist
       
   136         if (os.fork()):
       
   137             return -1
       
   138         # deconnect from tty and create a new session
       
   139         os.setsid()
       
   140         # fork again so the parent, (the session group leader), can exit.
       
   141         # as a non-session group leader, we can never regain a controlling
       
   142         # terminal.
       
   143         if (os.fork()):
       
   144             return -1
       
   145         # move to the root to avoit mount pb
       
   146         os.chdir('/')
       
   147         # set paranoid umask
       
   148         os.umask(077)
       
   149         if pid_file is not None:
       
   150             # write pid in a file
       
   151             f = open(pid_file, 'w')
       
   152             f.write(str(os.getpid()))
       
   153             f.close()
       
   154         # filter warnings
       
   155         warnings.filterwarnings('ignore')
       
   156         # close standard descriptors
       
   157         sys.stdin.close()
       
   158         sys.stdout.close()
       
   159         sys.stderr.close()
       
   160 
       
   161 from logging import getLogger
   134 from logging import getLogger
   162 from cubicweb import set_log_methods
   135 from cubicweb import set_log_methods
   163 LOGGER = getLogger('cubicweb.reposerver')
   136 LOGGER = getLogger('cubicweb.reposerver')
   164 set_log_methods(CubicWebConfiguration, LOGGER)
   137 set_log_methods(RepositoryServer, LOGGER)