Changes in / [079ef11:b77e57e]
- Location:
- server
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
server/lib/gutenbach/server/errors.py
r951ab1b r5e70cc2 13 13 14 14 class InvalidPrinterStateException(Exception): 15 errstr = { 16 3: "idle", 17 4: "processing", 18 5: "stopped" 19 } 20 15 21 def __init__(self, state): 16 self.state = hex(state)22 self.state = int(state) 17 23 def __str__(self): 18 return "Invalid printer state: %s" % self.state 24 return "Invalid printer state: %s (%s)" % \ 25 (self.errstr[self.state], hex(self.state)) 19 26 20 27 class InvalidJobStateException(Exception): -
server/lib/gutenbach/server/job.py
rbd5bffc r0494098 415 415 raise errors.InvalidJobStateException(self.state) 416 416 417 logger.debug("restarting job %d" % (self.id, self.document))417 logger.debug("restarting job %d", self.id) 418 418 419 419 self._why_done = None 420 self.spool(self.document) 420 fh = self.player.fh 421 422 if not fh or fh.closed: 423 raise RuntimeError, "file handler is closed" 424 425 self.player = Player(fh) -
server/lib/gutenbach/server/printer.py
r57bc2dc r7e29e6a 85 85 86 86 self.lock = threading.RLock() 87 self. running = False87 self._running = False 88 88 self.paused = False 89 89 … … 91 91 self._next_job_id = 1 92 92 93 @sync 93 94 def __repr__(self): 94 95 return str(self) 95 96 97 @sync 96 98 def __str__(self): 97 return "<Printer '%s'>" % self.name 99 return "<Printer '%s'>" % self.name 98 100 99 101 def run(self): 100 self. running = True101 while self. running:102 with self.lock:103 try:104 if not self.paused andself.current_job is None:102 self._running = True 103 while self._running: 104 try: 105 with self.lock: 106 if self.current_job is None: 105 107 self.start_job() 106 108 elif self.current_job.is_done: 107 109 self.complete_job() 108 109 110 110 except: 111 logger.fatal(traceback.format_exc()) 112 sys.exit(1) 111 113 time.sleep(0.1) 112 114 115 def stop(self): 116 with self.lock: 117 self._running = False 118 if self.ident is not None and self.isAlive(): 119 self.join() 120 113 121 ###################################################################### 114 122 ### Properties ### 115 123 ###################################################################### 124 125 @property 126 def name(self): 127 return self._name 128 @name.setter 129 def name(self, val): 130 try: 131 self._name = str(val) 132 except: 133 self._name = "gutenbach-printer" 134 135 @property 136 def config(self): 137 return self._config 138 @config.setter 139 def config(self, val): 140 try: 141 _config = dict(val).copy() 142 except: 143 raise ValueError, "not a dictionary" 144 if 'ipp-versions' not in _config: 145 raise ValueError, "missing ipp-versions" 146 self._config = _config 116 147 117 148 @property … … 128 159 @sync 129 160 def state(self): 130 if self. current_job is not None:131 returnStates.PROCESSING132 elif len(self.pending_jobs) == 0:133 returnStates.IDLE161 if self.is_running and self.current_job is not None: 162 state = States.PROCESSING 163 elif self.is_running and len(self.pending_jobs) == 0: 164 state = States.IDLE 134 165 else: 135 return States.STOPPED 166 state = States.STOPPED 167 return state 136 168 137 169 @property … … 143 175 return jobs 144 176 177 @property 178 def is_running(self): 179 running = self.ident is not None and self.isAlive() and self._running 180 return running 181 145 182 ###################################################################### 146 183 ### Methods ### … … 148 185 149 186 @sync 187 def assert_running(self): 188 if not self.is_running: 189 raise RuntimeError, "%s not started" % str(self) 190 191 @sync 150 192 def start_job(self): 151 if self.current_job is None: 193 self.assert_running() 194 if not self.paused and self.current_job is None: 152 195 try: 153 196 job_id = heapq.heappop(self.pending_jobs) … … 162 205 @sync 163 206 def complete_job(self): 164 if self.current_job is None: 165 return 166 167 try: 168 if not self.current_job.is_done: 169 self.current_job.stop() 170 finally: 171 self.finished_jobs.append(self.current_job.id) 172 self.current_job = None 207 self.assert_running() 208 if not self.paused and self.current_job is not None: 209 try: 210 if not self.current_job.is_done: 211 self.current_job.stop() 212 finally: 213 self.finished_jobs.append(self.current_job.id) 214 self.current_job = None 173 215 174 216 @sync 175 217 def get_job(self, job_id): 218 self.assert_running() 176 219 if job_id not in self.jobs: 177 220 raise InvalidJobException(job_id) … … 184 227 @property 185 228 def printer_uri_supported(self): 229 self.assert_running() 186 230 return ipp.PrinterUriSupported(self.uri) 187 231 @printer_uri_supported.setter 188 232 def printer_uri_supported(self, val): 233 self.assert_running() 189 234 raise ipp.errors.AttributesNotSettable("printer-uri-supported") 190 235 191 236 @property 192 237 def uri_authentication_supported(self): 238 self.assert_running() 193 239 return ipp.UriAuthenticationSupported("none") 194 240 @uri_authentication_supported.setter 195 241 def uri_authentication_supported(self, val): 242 self.assert_running() 196 243 raise ipp.errors.AttributesNotSettable("uri-authentication-supported") 197 244 198 245 @property 199 246 def uri_security_supported(self): 247 self.assert_running() 200 248 return ipp.UriSecuritySupported("none") 201 249 @uri_security_supported.setter 202 250 def uri_security_supported(self, val): 251 self.assert_running() 203 252 raise ipp.errors.AttributesNotSettable("uri-security-supported") 204 253 205 254 @property 206 255 def printer_name(self): 256 self.assert_running() 207 257 return ipp.PrinterName(self.name) 208 258 @printer_name.setter 209 259 def printer_name(self, val): 260 self.assert_running() 210 261 raise ipp.errors.AttributesNotSettable("printer-name") 211 262 212 263 @property 213 264 def printer_state(self): 265 self.assert_running() 214 266 return ipp.PrinterState(self.state) 215 267 @printer_state.setter 216 268 def printer_state(self, val): 269 self.assert_running() 217 270 raise ipp.errors.AttributesNotSettable("printer-state") 218 271 219 272 @property 220 273 def printer_state_reasons(self): 274 self.assert_running() 221 275 return ipp.PrinterStateReasons("none") 222 276 @printer_state_reasons.setter 223 277 def printer_state_reasons(self, val): 278 self.assert_running() 224 279 raise ipp.errors.AttributesNotSettable("printer-state-reasons") 225 280 226 281 @property 227 282 def ipp_versions_supported(self): 283 self.assert_running() 228 284 return ipp.IppVersionsSupported(*self.config['ipp-versions']) 229 285 @ipp_versions_supported.setter 230 286 def ipp_versions_supported(self, val): 287 self.assert_running() 231 288 raise ipp.errors.AttributesNotSettable("ipp-versions-supported") 232 289 … … 234 291 @property 235 292 def operations_supported(self): 293 self.assert_running() 236 294 return ipp.OperationsSupported(ipp.OperationCodes.GET_JOBS) 237 295 @operations_supported.setter 238 296 def operations_supported(self, val): 297 self.assert_running() 239 298 raise ipp.errors.AttributesNotSettable("operations-supported") 240 299 241 300 @property 242 301 def charset_configured(self): 302 self.assert_running() 243 303 return ipp.CharsetConfigured("utf-8") # XXX 244 304 @charset_configured.setter 245 305 def charset_configured(self, val): 306 self.assert_running() 246 307 raise ipp.errors.AttributesNotSettable("charset-configured") 247 308 248 309 @property 249 310 def charset_supported(self): 311 self.assert_running() 250 312 return ipp.CharsetSupported("utf-8") # XXX 251 313 @charset_supported.setter 252 314 def charset_supported(self, val): 315 self.assert_running() 253 316 raise ipp.errors.AttributesNotSettable("charset-supported") 254 317 255 318 @property 256 319 def natural_language_configured(self): 320 self.assert_running() 257 321 return ipp.NaturalLanguageConfigured("en-us") 258 322 @natural_language_configured.setter 259 323 def natural_language_configured(self, val): 324 self.assert_running() 260 325 raise ipp.errors.AttributesNotSettable("natural-language-configured") 261 326 262 327 @property 263 328 def generated_natural_language_supported(self): 329 self.assert_running() 264 330 return ipp.GeneratedNaturalLanguageSupported("en-us") 265 331 @generated_natural_language_supported.setter 266 332 def generated_natural_language_supported(self, val): 333 self.assert_running() 267 334 raise ipp.errors.AttributesNotSettable("generated-natural-language-supported") 268 335 269 336 @property 270 337 def document_format_default(self): 338 self.assert_running() 271 339 return ipp.DocumentFormatDefault("application/octet-stream") 272 340 @document_format_default.setter 273 341 def document_format_default(self, val): 342 self.assert_running() 274 343 raise ipp.errors.AttributesNotSettable("document-format-default") 275 344 276 345 @property 277 346 def document_format_supported(self): 347 self.assert_running() 278 348 return ipp.DocumentFormatSupported("application/octet-stream", "audio/mp3") 279 349 @document_format_supported.setter 280 350 def document_format_supported(self, val): 351 self.assert_running() 281 352 raise ipp.errors.AttributesNotSettable("document-format-supported") 282 353 283 354 @property 284 355 def printer_is_accepting_jobs(self): 356 self.assert_running() 285 357 return ipp.PrinterIsAcceptingJobs(True) 286 358 @printer_is_accepting_jobs.setter 287 359 def printer_is_accepting_jobs(self, val): 360 self.assert_running() 288 361 raise ipp.errors.AttributesNotSettable("printer-is-accepting-jobs") 289 362 290 363 @property 291 364 def queued_job_count(self): 365 self.assert_running() 292 366 return ipp.QueuedJobCount(len(self.active_jobs)) 293 367 @queued_job_count.setter 294 368 def queued_job_count(self, val): 369 self.assert_running() 295 370 raise ipp.errors.AttributesNotSettable("queued-job-count") 296 371 297 372 @property 298 373 def pdl_override_supported(self): 374 self.assert_running() 299 375 return ipp.PdlOverrideSupported("not-attempted") 300 376 @pdl_override_supported.setter 301 377 def pdl_override_supported(self, val): 378 self.assert_running() 302 379 raise ipp.errors.AttributesNotSettable("pdl-override-supported") 303 380 304 381 @property 305 382 def printer_up_time(self): 383 self.assert_running() 306 384 return ipp.PrinterUpTime(int(time.time()) - self.time_created) 307 385 @printer_up_time.setter 308 386 def printer_up_time(self, val): 387 self.assert_running() 309 388 raise ipp.errors.AttributesNotSettable("printer-up-time") 310 389 311 390 @property 312 391 def compression_supported(self): 392 self.assert_running() 313 393 return ipp.CompressionSupported("none") 314 394 @compression_supported.setter 315 395 def compression_supported(self, val): 396 self.assert_running() 316 397 raise ipp.errors.AttributesNotSettable("compression-supported") 317 398 318 399 @property 319 400 def multiple_operation_time_out(self): 401 self.assert_running() 320 402 return ipp.MultipleOperationTimeOut(240) 321 403 @multiple_operation_time_out.setter 322 404 def multiple_operation_time_out(self, val): 405 self.assert_running() 323 406 raise ipp.errors.AttributesNotSettable("multiple-operation-time-out") 324 407 325 408 @property 326 409 def multiple_document_jobs_supported(self): 410 self.assert_running() 327 411 return ipp.MultipleDocumentJobsSupported(False) 328 412 @multiple_document_jobs_supported.setter 329 413 def multiple_document_jobs_supported(self, val): 414 self.assert_running() 330 415 raise ipp.errors.AttributesNotSettable("multiple-document-jobs-supported") 331 416 … … 335 420 336 421 def job_id(self, job_id): 422 self.assert_running() 337 423 job = self.get_job(job_id) 338 424 return ipp.JobId(job.id) 339 425 340 426 def job_name(self, job_id): 427 self.assert_running() 341 428 job = self.get_job(job_id) 342 429 return ipp.JobName(job.name) 343 430 344 431 def job_originating_user_name(self, job_id): 432 self.assert_running() 345 433 job = self.get_job(job_id) 346 434 return ipp.JobOriginatingUserName(job.creator) 347 435 348 436 def job_k_octets(self, job_id): 437 self.assert_running() 349 438 job = self.get_job(job_id) 350 439 return ipp.JobKOctets(job.size) 351 440 352 441 def job_state(self, job_id): 442 self.assert_running() 353 443 job = self.get_job(job_id) 354 444 return ipp.JobState(job.state) 355 445 356 446 def job_printer_uri(self, job_id): 447 self.assert_running() 357 448 job = self.get_job(job_id) 358 449 return ipp.JobPrinterUri(self.uri) … … 362 453 ###################################################################### 363 454 455 @sync 364 456 def print_job(self, document, document_name=None, document_format=None, 365 457 document_natural_language=None, requesting_user_name=None, 366 458 compression=None, job_name=None, job_k_octets=None): 459 460 self.assert_running() 367 461 368 462 # create the job … … 385 479 return job_id 386 480 387 def verify_job(self, document_name=None, document_format=None, 388 document_natural_language=None, requesting_user_name=None, 389 compression=None, job_name=None, job_k_octets=None): 481 @sync 482 def validate_job(self, document_name=None, document_format=None, 483 document_natural_language=None, requesting_user_name=None, 484 compression=None, job_name=None, job_k_octets=None): 485 486 self.assert_running() 390 487 391 488 job_id = self._next_job_id … … 398 495 del job 399 496 497 @sync 400 498 def get_jobs(self, requesting_user_name=None, which_jobs=None, 401 499 requested_attributes=None): 402 500 501 self.assert_running() 502 403 503 # Filter by the which-jobs attribute 404 504 if which_jobs is None: … … 425 525 return job_attrs 426 526 527 @sync 427 528 def print_uri(self): 428 pass 429 529 self.assert_running() 530 531 @sync 430 532 def create_job(self, requesting_user_name=None, job_name=None, 431 533 job_k_octets=None): 534 535 self.assert_running() 432 536 433 537 job_id = self._next_job_id … … 450 554 Does nothing if the printer is already paused. 451 555 """ 452 if self.paused:453 return454 455 if self.current_job is not None and self.current_job.is_playing:456 self.current_job.pause()457 458 self.paused = True556 557 self.assert_running() 558 if not self.paused: 559 if self.current_job is not None and self.current_job.is_playing: 560 self.current_job.pause() 561 self.paused = True 562 logger.info("%s paused", str(self)) 459 563 460 564 @sync … … 464 568 Does nothing if the printer is not paused. 465 569 """ 466 if not self.paused:467 return468 469 if self.current_job is not None:470 self.current_job.resume()471 472 self.paused = False570 571 self.assert_running() 572 if self.paused: 573 if self.current_job is not None: 574 self.current_job.resume() 575 self.paused = False 576 logger.info("%s unpaused", str(self)) 473 577 474 578 @sync 475 579 def get_printer_attributes(self, requested_attributes=None): 580 self.assert_running() 476 581 if requested_attributes is None: 477 582 requested = self.printer_attributes … … 485 590 486 591 @sync 487 def set_printer_attributes(self, job_id, attributes): 592 def set_printer_attributes(self, attributes): 593 self.assert_running() 488 594 for attr in attributes: 489 595 try: … … 494 600 @sync 495 601 def cancel_job(self, job_id, requesting_user_name=None): 602 self.assert_running() 496 603 job = self.get_job(job_id) 497 604 try: … … 507 614 last_document=None): 508 615 616 self.assert_running() 509 617 job = self.get_job(job_id) 510 618 job.spool(document) … … 515 623 requesting_user_name=None, compression=None, 516 624 last_document=None): 625 626 self.assert_running() 517 627 job = self.get_job(job_id) 518 628 # XXX: need to validate URI … … 522 632 @sync 523 633 def get_job_attributes(self, job_id, requested_attributes=None): 634 635 self.assert_running() 524 636 if requested_attributes is None: 525 637 requested = self.job_attributes … … 534 646 @sync 535 647 def set_job_attributes(self, job_id, attributes): 648 649 self.assert_running() 536 650 job = self.get_job(job_id) 537 651 for attr in attributes: … … 545 659 @sync 546 660 def restart_job(self, job_id, requesting_user_name=None): 661 662 self.assert_running() 547 663 job = self.get_job(job_id) 548 664 try: … … 561 677 # completes, this one will go next 562 678 679 self.assert_running() 563 680 job = self.get_job(job_id) 564 681 job.priority = 1 # XXX we need to actually do something -
server/lib/gutenbach/server/requests.py
r079ef11 rb77e57e 169 169 170 170 """ 171 171 172 operation = request.attribute_groups[0] 172 173 document = request.data … … 178 179 compression = None 179 180 last_document = None 180 181 182 181 # requested printer uri 183 182 if 'printer-uri' not in operation: -
server/test/server/job.py
rbd5bffc r0494098 201 201 202 202 def testRestart(self): 203 # XXX: Todo 204 pass 203 self.assertRaises(errors.InvalidJobStateException, self.job.restart) 204 205 self.job.play() 206 self.assertTrue(self.job.is_playing) 207 self.assertFalse(self.job.is_done) 208 209 self.assertRaises(errors.InvalidJobStateException, self.job.restart) 210 211 self.job.cancel() 212 self.assertFalse(self.job.is_playing) 213 self.assertTrue(self.job.is_done) 214 self.assertTrue(self.job.is_cancelled) 215 self.assertFalse(self.job.is_aborted) 216 217 self.job.restart() 218 self.assertTrue(self.job.is_ready) 205 219 206 220 if __name__ == "__main__":
Note: See TracChangeset
for help on using the changeset viewer.