def get_printers(req): """Get the list of printers and requested attributes""" # Get the list of requested attributes from the request req_al = req.find_attribute('requested-attributes') try: # Just get the requested attributes strings if req_al: req_al = attrib_tools.expand_multi_attributes(req_al) # Now get the list of available printers ptr_list = Config_data.list_printers() # Set up response response = ipp.ipp(request=req) response.setrespcode(ipp.IPP_OK, req.id) response.pushvalue(opgrp_hdr(req)) for ptr in ptr_list: ptrgrp = ipp.ippgroup(ipp.IPP_TAG_PRINTER) ptratts = Config_data.get_config(ptr, req_al) for attitem in ptratts: name, typenum, attlist = attitem val = ipp.ippvalue(typenum) val.setnamevalues(name, attlist) ptrgrp.setvalue(val) response.pushvalue(ptrgrp) return response.generate() except ValueError: return ipp_status(req, 'IPP_INTERNAL_ERROR', 'Error in get_printers()')
def ipp_ok(req): """Report that everything went OK with IPP request (Even if nothing was done)""" lmsg = "No-op OK response to op %s" % ipp.op_to_name[req.statuscode] syslog.syslog(syslog.LOG_NOTICE, lmsg) response = ipp.ipp(request=req) response.setrespcode(ipp.IPP_OK, req.id) response.pushvalue(opgrp_hdr(req)) return response.generate()
def ipp_status(req, code, msg): """Deliver a status message back to sender""" lmsg = "Op code %s returning result %s - %s" % ( ipp.op_to_name[req.statuscode], code, msg) syslog.syslog(syslog.LOG_WARNING, lmsg) response = ipp.ipp(request=req) response.setrespcode(code, req.id) # If code is a string it gets converted opgrp = opgrp_hdr(req) msgv = ipp.ippvalue(ipp.IPP_TAG_TEXT) msgv.setnamevalues('status-message', msg) opgrp.setvalue(msgv) response.pushvalue(opgrp) return response.generate()
def created_job_ok(req, jobnum): """Return response that document was sent OK""" response = ipp.ipp(request=req) response.setrespcode(ipp.IPP_OK, req.id) opgrp = opgrp_hdr(req) msg = ipp.ippvalue(ipp.IPP_TAG_TEXT) msg.setnamevalues('status-message', 'successful-ok') opgrp.setvalue(msg) response.pushvalue(opgrp) jobgrp = ipp.ippgroup(ipp.IPP_TAG_JOB) idval = ipp.ippvalue(ipp.IPP_TAG_INTEGER) idval.setnamevalues('job-id', jobnum) jobgrp.setvalue(idval) iduri = "ipp://%s:631/jobs/%d" % (Config_data.serverip(), jobnum) idval = ipp.ippvalue(ipp.IPP_TAG_URI) idval.setnamevalues('job-uri', iduri) jobgrp.setvalue(idval) jobstat = ipp.ippvalue(ipp.IPP_TAG_ENUM) jobstat.setnamevalues('job-state', ipp.IPP_JOB_PROCESSING) jobgrp.setvalue(jobstat) response.pushvalue(jobgrp) return response.generate()
def get_ptr_attributes(req, pname, al): """Get given attributes for given printer""" # Set up response response = ipp.ipp(request=req) response.setrespcode(ipp.IPP_OK, req.id) response.pushvalue(opgrp_hdr(req)) # Printer group stuff ptrgrp = ipp.ippgroup(ipp.IPP_TAG_PRINTER) ptratts = Config_data.get_config(pname, al) # Add each attribute for attitem in ptratts: name, typenum, attlist = attitem val = ipp.ippvalue(typenum) val.setnamevalues(name, attlist) ptrgrp.setvalue(val) response.pushvalue(ptrgrp) return response.generate()
def process_post(f): """Process an HTTP POST request""" ipplength = 0 exp = False chnk = False hadka = False kato = 60 # Read rest of header while 1: line = f.readline() if line is None: return None l = line.rstrip() if len(l) == 0: break m = re.match('Content-Length:\s*(\d+)', l, re.I) if m: ipplength = int(m.group(1)) continue m = re.match('Expect:', l, re.I) if m: exp = True continue m = re.match('Transfer-Encoding:\s+chunked', l, re.I) if m: chnk = True continue m = re.match('Connection:\s+Keep-Alive', l, re.I) if m: hadka = True continue m = re.match('Keep-Alive:\s+timeout=(\d+)', l, re.I) if m: kato = int(m.group(1)) continue # If we've had a request to request more, satisfy it if exp: f.write("HTTP/1.1 100 Continue\r\n\r\n") if chnk: f.set_chunked() else: syslog.syslog(syslog.LOG_DEBUG, "Expecting %d bytes" % ipplength) if ipplength == 0: syslog.syslog(syslog.LOG_ERR, "No POST data") return None f.set_expected(ipplength) # Parse IPP request ipr = ipp.ipp(f) try: ipr.parse() if Log_level > 3: ipr.display() except ipp.IppError as err: syslog.syslog(syslog.LOG_DEBUG, "Had IPP error: %s" % err.args[0]) return None iprcode = ipr.statuscode try: iprname = ipp.op_to_name[iprcode] syslog.syslog(syslog.LOG_INFO, "Request operation %s" % iprname) func = functab[iprname] except KeyError: return None # Actually do the business and return an IPP string (filebuf is a structure member) resp = func(ipr) if Log_level > 2: ipresp = ipp.ipp(filebuf.stringbuf(resp, 0)) ipresp.parse() syslog.syslog(syslog.LOG_INFO, "Reply sent %s" % ipp.resp_to_name[ipresp.statuscode]) # Now decorate the response f.write("HTTP/1.1 200 OK\r\n") f.write("Date: %s\n" % time.ctime()) f.write("Server: %s\r\n" % Config_data.parameters.servername) if hadka: f.write("Connection: Keep-Alive\r\n") f.write("Keep-Alive: timeout=%d\r\n" % kato) f.write("Content-Language: en_US\r\n") f.write("Content-Type: application/ipp\r\n") f.write("Content-Length: %d\r\n\r\n" % len(resp)) f.write(resp) if hadka: return kato return None