source: server/lib/gutenbach/server/__init__.py @ 28b2e89

no-cups
Last change on this file since 28b2e89 was 28b2e89, checked in by Steven Allen <steven@…>, 12 years ago

Stop the printer on error (so that gutenbach actually exits on SIGINT/SIGTERM.

  • Property mode set to 100644
File size: 2.5 KB
RevLine 
[e58af05]1import errors
2from errors import *
3__all__ = ['errors']
4__all__.extend(errors.__all__)
5
[cf0d7e8]6def sync(func):
7    """Lock decorator
8
9    Holds a lock (self.lock) for the durration of a method call.
10    """
11
12    def do(self, *args, **kwargs):
13        with self.lock:
14            return func(self, *args, **kwargs)
15
16    return do
17__all__.append('sync')
18
19
[33ea505]20from job import GutenbachJob
21__all__.append('GutenbachJob')
[e58af05]22
23from printer import GutenbachPrinter
24__all__.append('GutenbachPrinter')
25
26from requests import make_empty_response, GutenbachRequestHandler
27__all__.append('make_empty_response')
28__all__.append('GutenbachRequestHandler')
29
[eee389a]30from server import IPPServer
[e58af05]31__all__.append('IPPServer')
32
[287d6ec]33import BaseHTTPServer
[d04a689]34import logging
[6effd50]35import sys
[ee8e6d0]36import traceback
[a9eb577e]37import os
38import shutil
[d04a689]39
[e58af05]40# configure and initialize logging
[609a9b0]41logger = None
[ee8e6d0]42
[e58af05]43def error(self, request=None, client_address=None):
[ee8e6d0]44    logger.fatal(traceback.format_exc())
[eee389a]45    self.gutenbach_printer.running = False
[28b2e89]46    try:
47        if self.gutenbach_printer.isAlive():
48            self.gutenbach_printer.stop()
49    finally:
50        sys.exit(1)
[478ca74]51
[a9eb577e]52def new_logfile(logfile):
53    if os.path.exists(logfile):
54        pth = os.path.abspath(os.path.dirname(logfile))
55        filename = os.path.basename(logfile)
56        logfiles = [f for f in os.listdir(pth) if f.startswith(filename + ".")]
57        lognums = [0]
58        for f in logfiles:
59            try:
60                lognums.append(int(f.lstrip(filename + ".")))
61            except TypeError:
62                pass
63        nextnum = max(lognums) + 1
64        shutil.move(logfile, os.path.join(pth, "%s.%d" % (filename, nextnum)))
65
[609a9b0]66def start(config):
67    global logger
[a9eb577e]68    logkwargs = {}
69    logkwargs['level'] = getattr(logging, config['loglevel'].upper())
70    if 'logfile' in config:
71        logkwargs['filename'] = config['logfile']
72        new_logfile(config['logfile'])           
73    logging.basicConfig(**logkwargs)
74    logger = logging.getLogger(__name__)
75   
[e58af05]76    logger.info("Starting Gutenbach server...")
[609a9b0]77    printers = sorted(config['printers'].keys())
78    gutenbach = GutenbachPrinter(printers[0], config['printers'][printers[0]])
[e58af05]79    gutenbach.start()
80
81    logger.info("Starting IPP server...")
[609a9b0]82    server_address = ('', config['port'])
[e58af05]83    httpd = BaseHTTPServer.HTTPServer(server_address, IPPServer)
[6effd50]84    httpd.handle_error = error.__get__(httpd)
[eee389a]85    httpd.gutenbach_printer = gutenbach
[28b2e89]86    try:
87        while gutenbach.isAlive():
[e58af05]88            httpd.handle_request()
[28b2e89]89    except:
90        error(httpd)
[287d6ec]91
[e58af05]92__all__.append('start')
Note: See TracBrowser for help on using the repository browser.