[e58af05] | 1 | import errors |
---|
| 2 | from errors import * |
---|
| 3 | __all__ = ['errors'] |
---|
| 4 | __all__.extend(errors.__all__) |
---|
| 5 | |
---|
[cf0d7e8] | 6 | def 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] | 20 | from job import GutenbachJob |
---|
| 21 | __all__.append('GutenbachJob') |
---|
[e58af05] | 22 | |
---|
| 23 | from printer import GutenbachPrinter |
---|
| 24 | __all__.append('GutenbachPrinter') |
---|
| 25 | |
---|
| 26 | from requests import make_empty_response, GutenbachRequestHandler |
---|
| 27 | __all__.append('make_empty_response') |
---|
| 28 | __all__.append('GutenbachRequestHandler') |
---|
| 29 | |
---|
[eee389a] | 30 | from server import IPPServer |
---|
[e58af05] | 31 | __all__.append('IPPServer') |
---|
| 32 | |
---|
[287d6ec] | 33 | import BaseHTTPServer |
---|
[d04a689] | 34 | import logging |
---|
[6effd50] | 35 | import sys |
---|
[ee8e6d0] | 36 | import traceback |
---|
[a9eb577e] | 37 | import os |
---|
| 38 | import shutil |
---|
[d04a689] | 39 | |
---|
[e58af05] | 40 | # configure and initialize logging |
---|
[609a9b0] | 41 | logger = None |
---|
[ee8e6d0] | 42 | |
---|
[e58af05] | 43 | def 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] | 52 | def 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] | 66 | def 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') |
---|