1 | import errors |
---|
2 | from errors import * |
---|
3 | __all__ = ['errors'] |
---|
4 | __all__.extend(errors.__all__) |
---|
5 | |
---|
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 | |
---|
20 | from job import GutenbachJob |
---|
21 | __all__.append('GutenbachJob') |
---|
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 | |
---|
30 | from server import IPPServer |
---|
31 | __all__.append('IPPServer') |
---|
32 | |
---|
33 | import BaseHTTPServer |
---|
34 | import logging |
---|
35 | import sys |
---|
36 | import traceback |
---|
37 | import os |
---|
38 | import shutil |
---|
39 | |
---|
40 | # configure and initialize logging |
---|
41 | logger = None |
---|
42 | |
---|
43 | def 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 | |
---|
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 | |
---|
66 | def 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') |
---|