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
Line 
1import errors
2from errors import *
3__all__ = ['errors']
4__all__.extend(errors.__all__)
5
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
20from job import GutenbachJob
21__all__.append('GutenbachJob')
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
30from server import IPPServer
31__all__.append('IPPServer')
32
33import BaseHTTPServer
34import logging
35import sys
36import traceback
37import os
38import shutil
39
40# configure and initialize logging
41logger = None
42
43def error(self, request=None, client_address=None):
44    logger.fatal(traceback.format_exc())
45    self.gutenbach_printer.running = False
46    try:
47        if self.gutenbach_printer.isAlive():
48            self.gutenbach_printer.stop()
49    finally:
50        sys.exit(1)
51
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
66def start(config):
67    global logger
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   
76    logger.info("Starting Gutenbach server...")
77    printers = sorted(config['printers'].keys())
78    gutenbach = GutenbachPrinter(printers[0], config['printers'][printers[0]])
79    gutenbach.start()
80
81    logger.info("Starting IPP server...")
82    server_address = ('', config['port'])
83    httpd = BaseHTTPServer.HTTPServer(server_address, IPPServer)
84    httpd.handle_error = error.__get__(httpd)
85    httpd.gutenbach_printer = gutenbach
86    try:
87        while gutenbach.isAlive():
88            httpd.handle_request()
89    except:
90        error(httpd)
91
92__all__.append('start')
Note: See TracBrowser for help on using the repository browser.