source: server/lib/gutenbach/server/job.py @ be6ff03

no-cups
Last change on this file since be6ff03 was be6ff03, checked in by Jessica B. Hamrick <jhamrick@…>, 12 years ago

Log mplayer output better and run it in slave mode

  • Property mode set to 100644
File size: 6.0 KB
Line 
1from . import InvalidJobException, InvalidPrinterStateException
2from gutenbach.ipp import JobStates as States
3import os
4import gutenbach.ipp as ipp
5import logging
6import subprocess
7import time
8
9# initialize logger
10logger = logging.getLogger(__name__)
11
12class Job(object):
13
14    # for IPP
15    attributes = [
16        "job-id",
17        "job-name",
18        "job-originating-user-name",
19        "job-k-octets",
20        "job-state",
21        "job-printer-uri"
22    ]
23
24    def __init__(self, job_id=-1, printer=None, creator=None, name=None, size=None):
25        """Create an empty Gutenbach job.
26
27        """
28
29        self.printer = printer
30        self.player = None
31
32        self.id = job_id
33        self.creator = creator
34        self.name = name
35        self.size = size
36        self.status = States.HELD
37
38        self.document = None
39        self.document_name = None
40        self.document_format = None
41        self.document_natural_language = None
42        self.compression = None
43   
44    def __repr__(self):
45        return str(self)
46
47    def __str__(self):
48        return "<Job %d '%s'>" % (self.id, self.name)
49
50    ######################################################################
51    ###                          Properties                            ###
52    ######################################################################
53
54    @property
55    def id(self):
56        """Unique job identifier.  Should be a positive integer,
57        except when unassigned, when it defaults to -1.
58       
59        """
60        return self._id
61    @id.setter
62    def id(self, val):
63        try:
64            self._id = int(val)
65        except TypeError:
66            self._id = -1
67
68    @property
69    def creator(self):
70        """The user who created the job; analogous to the IPP
71        requesting-user-name.
72
73        """
74        return self._creator
75    @creator.setter
76    def creator(self, val):
77        if val is None:
78            self._creator = ""
79        else:
80            self._creator = str(val)
81
82    @property
83    def name(self):
84        """The job's name.
85
86        """
87        return self._name
88    @name.setter
89    def name(self, val):
90        if val is None:
91            self._name = ""
92        else:
93            self._name = str(val)
94
95    @property
96    def size(self):
97        """The size of the job in bytes.
98
99        """
100        if self.document:
101            size = os.path.getsize(self.document.name)
102        else:
103            size = self._size
104        return size
105    @size.setter
106    def size(self, val):
107        try:
108            self._size = int(val)
109        except TypeError:
110            self._size = 0
111
112    ######################################################################
113    ###                            Methods                             ###
114    ######################################################################
115
116    def play(self):
117        logger.info("playing job %s" % str(self))
118        self.status = States.PROCESSING
119        self.player = subprocess.Popen(
120            "/usr/bin/mplayer -really-quiet -slave %s" % self.document.name,
121            shell=True,
122            stderr=subprocess.PIPE,
123            stdout=subprocess.PIPE)
124        while self.player.poll() is None:
125            time.sleep(0.1)
126        logger.info("mplayer finished with code %d" % self.player.returncode)
127        stderr = self.player.stderr.read()
128        stdout = self.player.stdout.read()
129        if stderr.strip() != "":
130            logger.error(stderr)
131        logger.debug(stdout)
132        self.player = None
133        self.printer.complete_job(self.id)
134
135    def finish(self):
136        logger.info("finished job %s" % str(self))
137        self.status = States.COMPLETE
138
139    ######################################################################
140    ###                        IPP Attributes                          ###
141    ######################################################################
142
143    @property
144    def job_id(self):
145        return ipp.JobId(self.id)
146
147    @property
148    def job_name(self):
149        return ipp.JobName(self.name)
150
151    # XXX: we need to actually calculate this!
152    @property
153    def job_originating_user_name(self):
154        return ipp.JobOriginatingUserName(self.creator)
155
156    # XXX: we need to actually calculate this!
157    @property
158    def job_k_octets(self):
159        return ipp.JobKOctets(self.size)
160
161    @property
162    def job_state(self):
163        return ipp.JobState(self.status)
164
165    @property
166    def job_printer_uri(self):
167        return ipp.JobPrinterUri(self.printer.uri)
168
169
170    ######################################################################
171    ###                        IPP Operations                          ###
172    ######################################################################
173
174    def cancel_job(self):
175        pass
176
177    def send_document(self,
178                      document,
179                      document_name=None,
180                      document_format=None,
181                      document_natural_language=None,
182                      requesting_user_name=None,
183                      compression=None,
184                      last_document=None):
185
186        if self.status != States.HELD:
187            raise InvalidJobStateException(self.status)
188       
189        self.document = document
190        self.document_name = str(document_name)
191        self.document_format = str(document_format)
192        self.document_natural_language = str(document_natural_language)
193        self.creator = str(requesting_user_name)
194        self.compression = str(compression)
195        self.status = States.PENDING
196
197        logger.debug("document for job %d is '%s'" % (self.id, self.document_name))
198
199    def send_uri(self):
200        pass
201
202    def get_job_attributes(self, requested_attributes=None):
203        if requested_attributes is None:
204            requested = self.attributes
205        else:
206            requested = [a for a in self.attributes if a in requested_attributes]
207
208        _attributes = [attr.replace("-", "_") for attr in requested]
209        attributes = [getattr(self, attr) for attr in _attributes]
210        return attributes
211
212    def set_job_attributes(self):
213        pass
214
215    def restart_job(self):
216        pass
217
218    def promote_job(self):
219        pass
Note: See TracBrowser for help on using the repository browser.