Example #1
0
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()')
Example #2
0
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()
Example #3
0
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()
Example #4
0
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()
Example #5
0
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()
Example #6
0
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