def test_ppds(): picklefile="pickled-ppds" try: with open (picklefile, "rb") as f: cupsppds = pickle.load (f) except IOError: with open (picklefile, "wb") as f: c = cups.Connection () try: cupsppds = c.getPPDs2 () print ("Using getPPDs2()") except AttributeError: # Need pycups >= 1.9.52 for getPPDs2 cupsppds = c.getPPDs () print ("Using getPPDs()") pickle.dump (cupsppds, f) xml_dir = os.path.join (os.environ.get ("top_srcdir", "."), "xml") ppds = PPDs (cupsppds, xml_dir=xml_dir) makes = ppds.getMakes () models_count = 0 for make in makes: models = ppds.getModels (make) models_count += len (models) print ("%d makes, %d models" % (len (makes), models_count)) ppds.getPPDNameFromDeviceID ("HP", "PSC 2200 Series") makes = list(ppds.ids.keys ()) models_count = 0 for make in makes: models = ppds.ids[make] models_count += len (models) print ("%d ID makes, %d ID models" % (len (makes), models_count)) print ("\nID matching tests\n") MASK_STATUS = (1 << 2) - 1 FLAG_INVERT = (1 << 2) FLAG_IGNORE_STATUS = (1 << 3) idlist = [ # Format is: # (ID string, max status code (plus flags), # expected ppd-make-and-model RE match) # Specific models ("MFG:EPSON;CMD:ESCPL2,BDC,D4,D4PX;MDL:Stylus D78;CLS:PRINTER;" "DES:EPSON Stylus D78;", 1, 'Epson Stylus D68'), ("MFG:Hewlett-Packard;MDL:LaserJet 1200 Series;" "CMD:MLC,PCL,POSTSCRIPT;CLS:PRINTER;", 0, 'HP LaserJet 1200'), ("MFG:Hewlett-Packard;MDL:LaserJet 3390 Series;" "CMD:MLC,PCL,POSTSCRIPT;CLS:PRINTER;", 0, 'HP LaserJet 3390'), ("MFG:Hewlett-Packard;MDL:PSC 2200 Series;CMD:MLC,PCL,PML,DW-PCL,DYN;" "CLS:PRINTER;1284.4DL:4d,4e,1;", 0, "HP PSC 22[01]0"), ("MFG:HEWLETT-PACKARD;MDL:DESKJET 990C;CMD:MLC,PCL,PML;CLS:PRINTER;" "DES:Hewlett-Packard DeskJet 990C;", 0, "HP DeskJet 990C"), ("CLASS:PRINTER;MODEL:HP LaserJet 6MP;MANUFACTURER:Hewlett-Packard;" "DESCRIPTION:Hewlett-Packard LaserJet 6MP Printer;" "COMMAND SET:PJL,MLC,PCLXL,PCL,POSTSCRIPT;", 0, "HP LaserJet (6P/)?6MP"), # Canon PIXMA iP3000 (from gutenprint) ("MFG:Canon;CMD:BJL,BJRaster3,BSCCe;SOJ:TXT01;MDL:iP3000;CLS:PRINTER;" "DES:Canon iP3000;VER:1.09;STA:10;FSI:03;", 1, "Canon PIXMA iP3000"), ("MFG:HP;MDL:Deskjet 5400 series;CMD:MLC,PCL,PML,DW-PCL,DESKJET,DYN;" "1284.4DL:4d,4e,1;CLS:PRINTER;DES:5440;", 1, "HP DeskJet (5440|5550)"), # foomatic-db-hpijs used to say 5440 ("MFG:Hewlett-Packard;MDL:HP LaserJet 3390;" "CMD:PJL,MLC,PCL,POSTSCRIPT,PCLXL;", 0, "HP LaserJet 3390"), # Ricoh printers should use PostScript versions of # manufacturer's PPDs (bug #550315 comment #8). ("MFG:RICOH;MDL:Aficio 3045;", 0, "Ricoh Aficio 3045 PS"), # Don't mind which driver gets used here so long as it isn't # gutenprint (bug #645993). ("MFG:Brother;MDL:HL-2030;", 0 | FLAG_INVERT | FLAG_IGNORE_STATUS, ".*Gutenprint"), # Make sure we get a colour driver for this one, see launchpad # #669152. ("MFG:Xerox;MDL:6250DP;", 1, ".*(Postscript|pcl5e)"), # Generic models ("MFG:New;MDL:Unknown PS Printer;CMD:POSTSCRIPT;", 2, "Generic postscript printer"), # Make sure pxlcolor is used for PCLXL. The gutenprint driver # is black and white, and pxlcolor is the foomatic-recommended # generic driver for "Generic PCL 6/PCL XL Printer". ("MFG:New;MDL:Unknown PCL6 Printer;CMD:PCLXL;", 2, "Generic PCL 6.*pxlcolor"), ("MFG:New;MDL:Unknown PCL5e Printer;CMD:PCL5e;", 2, "Generic PCL 5e"), ("MFG:New;MDL:Unknown PCL5c Printer;CMD:PCL5c;", 2, "Generic PCL 5c"), ("MFG:New;MDL:Unknown PCL5 Printer;CMD:PCL5;", 2, "Generic PCL 5"), ("MFG:New;MDL:Unknown PCL3 Printer;CMD:PCL;", 2, "Generic PCL"), ("MFG:New;MDL:Unknown Printer;", 100, None), ] all_passed = True for id, max_status_code, modelre in idlist: flags = max_status_code & ~MASK_STATUS max_status_code &= MASK_STATUS id_dict = parseDeviceID (id) (status, ppdname) = ppds.getPPDNameFromDeviceID (id_dict["MFG"], id_dict["MDL"], id_dict["DES"], id_dict["CMD"]) ppddict = ppds.getInfoFromPPDName (ppdname) if flags & FLAG_IGNORE_STATUS: status = max_status_code if status < max_status_code: success = True else: if status == max_status_code: match = re.match (modelre, _singleton (ppddict['ppd-make-and-model']), re.I) success = match is not None else: success = False if flags & FLAG_INVERT: success = not success if success: result = "PASS" else: result = "*** FAIL ***" print ("%s: %s %s (%s)" % (result, id_dict["MFG"], id_dict["MDL"], _singleton (ppddict['ppd-make-and-model']))) all_passed = all_passed and success assert all_passed
obj = bus.get_object ("com.redhat.PrinterDriversInstaller", "/com/redhat/PrinterDriversInstaller") proxy = dbus.Interface (obj, "com.redhat.PrinterDriversInstaller") for device_id in device_ids: id_dict = cupshelpers.parseDeviceID (device_id) proxy.InstallDrivers (id_dict['MFG'], id_dict['MDL'], '', timeout=3600) except dbus.exceptions.DBusException as e: print "Ignoring exception: %s" % e except dbus.exceptions.DBusException: print "D-Bus not available so skipping package installation" print "Fetching driver list" ppds = PPDs (c.getPPDs ()) ppds._init_ids () makes = ppds.getMakes () def driver_uri_to_filename (uri): schemeparts = uri.split (':', 2) if len (schemeparts) < 2: if uri.startswith ("lsb/usr/"): return "/usr/share/ppd/" + uri[8:] elif uri.startswith ("lsb/opt/"): return "/opt/share/ppd/" + uri[8:] elif uri.startswith ("lsb/local/"): return "/usr/local/share/ppd/" + uri[10:] return "/usr/share/cups/model/" + uri
obj = bus.get_object ("com.redhat.PrinterDriversInstaller", "/com/redhat/PrinterDriversInstaller") proxy = dbus.Interface (obj, "com.redhat.PrinterDriversInstaller") for device_id in device_ids: id_dict = cupshelpers.parseDeviceID (device_id) proxy.InstallDrivers (id_dict['MFG'], id_dict['MDL'], '', timeout=3600) except dbus.exceptions.DBusException as e: print("Ignoring exception: %s" % e) except dbus.exceptions.DBusException: print("D-Bus not available so skipping package installation") print("Fetching driver list") ppds = PPDs (c.getPPDs ()) ppds._init_ids () makes = ppds.getMakes () def driver_uri_to_filename (uri): schemeparts = uri.split (':', 2) if len (schemeparts) < 2: if uri.startswith ("lsb/usr/"): return "/usr/share/ppd/" + uri[8:] elif uri.startswith ("lsb/opt/"): return "/opt/share/ppd/" + uri[8:] elif uri.startswith ("lsb/local/"): return "/usr/local/share/ppd/" + uri[10:] return "/usr/share/cups/model/" + uri
def test_ppds(): picklefile="pickled-ppds" try: with open (picklefile, "rb") as f: cupsppds = pickle.load (f) except IOError: with open (picklefile, "wb") as f: c = cups.Connection () try: cupsppds = c.getPPDs2 () print ("Using getPPDs2()") except AttributeError: # Need pycups >= 1.9.52 for getPPDs2 cupsppds = c.getPPDs () print ("Using getPPDs()") pickle.dump (cupsppds, f) xml_dir = os.path.join (os.environ.get ("top_srcdir", "."), "xml") ppds = PPDs (cupsppds, xml_dir=xml_dir) makes = ppds.getMakes () models_count = 0 for make in makes: models = ppds.getModels (make) models_count += len (models) print ("%d makes, %d models" % (len (makes), models_count)) ppds.getPPDNameFromDeviceID ("HP", "PSC 2200 Series") makes = list(ppds.ids.keys ()) models_count = 0 for make in makes: models = ppds.ids[make] models_count += len (models) print ("%d ID makes, %d ID models" % (len (makes), models_count)) print ("\nID matching tests\n") MASK_STATUS = (1 << 2) - 1 FLAG_INVERT = (1 << 2) FLAG_IGNORE_STATUS = (1 << 3) idlist = [ # Format is: # (ID string, max status code (plus flags), # expected ppd-make-and-model RE match) # Specific models ("MFG:EPSON;CMD:ESCPL2,BDC,D4,D4PX;MDL:Stylus D78;CLS:PRINTER;" "DES:EPSON Stylus D78;", 1, 'Epson Stylus D68'), ("MFG:Hewlett-Packard;MDL:LaserJet 1200 Series;" "CMD:MLC,PCL,POSTSCRIPT;CLS:PRINTER;", 0, 'HP LaserJet 1200'), ("MFG:Hewlett-Packard;MDL:LaserJet 3390 Series;" "CMD:MLC,PCL,POSTSCRIPT;CLS:PRINTER;", 0, 'HP LaserJet 3390'), ("MFG:Hewlett-Packard;MDL:PSC 2200 Series;CMD:MLC,PCL,PML,DW-PCL,DYN;" "CLS:PRINTER;1284.4DL:4d,4e,1;", 0, "HP PSC 22[01]0"), ("MFG:HEWLETT-PACKARD;MDL:DESKJET 990C;CMD:MLC,PCL,PML;CLS:PRINTER;" "DES:Hewlett-Packard DeskJet 990C;", 0, "HP DeskJet 990C"), ("CLASS:PRINTER;MODEL:HP LaserJet 6MP;MANUFACTURER:Hewlett-Packard;" "DESCRIPTION:Hewlett-Packard LaserJet 6MP Printer;" "COMMAND SET:PJL,MLC,PCLXL,PCL,POSTSCRIPT;", 0, "HP LaserJet (6P/)?6MP"), # Canon PIXMA iP3000 (from gutenprint) ("MFG:Canon;CMD:BJL,BJRaster3,BSCCe;SOJ:TXT01;MDL:iP3000;CLS:PRINTER;" "DES:Canon iP3000;VER:1.09;STA:10;FSI:03;", 1, "Canon PIXMA iP3000"), ("MFG:HP;MDL:Deskjet 5400 series;CMD:MLC,PCL,PML,DW-PCL,DESKJET,DYN;" "1284.4DL:4d,4e,1;CLS:PRINTER;DES:5440;", 1, "HP DeskJet (5440|5550)"), # foomatic-db-hpijs used to say 5440 ("MFG:Hewlett-Packard;MDL:HP LaserJet 3390;" "CMD:PJL,MLC,PCL,POSTSCRIPT,PCLXL;", 0, "HP LaserJet 3390"), # Ricoh printers should use PostScript versions of # manufacturer's PPDs (bug #550315 comment #8). ("MFG:RICOH;MDL:Aficio 3045;", 0, "Ricoh Aficio 3045 PS"), # Don't mind which driver gets used here so long as it isn't # gutenprint (bug #645993). ("MFG:Brother;MDL:HL-2030;", 0 | FLAG_INVERT | FLAG_IGNORE_STATUS, ".*Gutenprint"), # Make sure we get a colour driver for this one, see launchpad # #669152. ("MFG:Xerox;MDL:6250DP;", 1, ".*(Postscript|pcl5e)"), # Generic models ("MFG:New;MDL:Unknown PS Printer;CMD:POSTSCRIPT;", 2, "Generic postscript printer"), # Make sure pxlcolor is used for PCLXL. The gutenprint driver # is black and white, and pxlcolor is the foomatic-recommended # generic driver for "Generic PCL 6/PCL XL Printer". ("MFG:New;MDL:Unknown PCL6 Printer;CMD:PCLXL;", 2, "Generic PCL 6.*pxlcolor"), ("MFG:New;MDL:Unknown PCL5e Printer;CMD:PCL5e;", 2, "Generic PCL 5e"), ("MFG:New;MDL:Unknown PCL5c Printer;CMD:PCL5c;", 2, "Generic PCL 5c"), ("MFG:New;MDL:Unknown PCL5 Printer;CMD:PCL5;", 2, "Generic PCL 5"), ("MFG:New;MDL:Unknown PCL3 Printer;CMD:PCL;", 2, "Generic PCL"), ("MFG:New;MDL:Unknown Printer;", 100, None), ] all_passed = True for id, max_status_code, modelre in idlist: flags = max_status_code & ~MASK_STATUS max_status_code &= MASK_STATUS id_dict = parseDeviceID (id) (status, ppdname) = ppds.getPPDNameFromDeviceID (id_dict["MFG"], id_dict["MDL"], id_dict["DES"], id_dict["CMD"]) ppddict = ppds.getInfoFromPPDName (ppdname) if flags & FLAG_IGNORE_STATUS: status = max_status_code if status < max_status_code: success = True else: if status == max_status_code: match = re.match (modelre, _singleton (ppddict['ppd-make-and-model']), re.I) success = match != None else: success = False if flags & FLAG_INVERT: success = not success if success: result = "PASS" else: result = "*** FAIL ***" print ("%s: %s %s (%s)" % (result, id_dict["MFG"], id_dict["MDL"], _singleton (ppddict['ppd-make-and-model']))) all_passed = all_passed and success assert all_passed