def show_title(): utils.log_title(__title__, __version__) log.info(log.bold("Note: hp-check can be run in three modes:")) for l in tui.format_paragraph("1. Compile-time check mode (-c or --compile): Use this mode before compiling the HPLIP supplied tarball (.tar.gz or .run) to determine if the proper dependencies are installed to successfully compile HPLIP."): log.info(l) for l in tui.format_paragraph("2. Run-time check mode (-r or --run): Use this mode to determine if a distro supplied package (.deb, .rpm, etc) or an already built HPLIP supplied tarball has the proper dependencies installed to successfully run."): log.info(l) for l in tui.format_paragraph("3. Both compile- and run-time check mode (-b or --both) (Default): This mode will check both of the above cases (both compile- and run-time dependencies)."): log.info(l) log.info() for l in tui.format_paragraph("Check types:"): log.info(l) for l in tui.format_paragraph("a. EXTERNALDEP - External Dependencies"): log.info(l) for l in tui.format_paragraph("b. GENERALDEP - General Dependencies (required both at compile and run time)"): log.info(l) for l in tui.format_paragraph("c. COMPILEDEP - Compile time Dependencies"): log.info(l) for l in tui.format_paragraph("d. [All are run-time checks]"): log.info(l) for l in tui.format_paragraph("PYEXT\nSCANCONF\nQUEUES\nPERMISSION"): log.info(l) log.info() log.info("Status Types:") log.info(" OK") log.info(" MISSING - Missing Dependency or Permission or Plug-in") log.info(" INCOMPAT - Incompatible dependency-version or Plugin-version") log.info()
def usage(typ='text'): if typ == 'text': utils.log_title(__title__, __version__) utils.format_text(USAGE, typ, __title__, __mod__, __version__) hold_terminal() sys.exit(0)
def usage(typ='text'): if typ == 'text': utils.log_title(__title__, __version__) utils.format_text(USAGE, typ, __title__, __mod__, __version__) clean_exit(2)
def usage(typ='text'): if typ == 'text': utils.log_title(__title__, __version__) utils.format_text(USAGE, typ, title=__title__, crumb='hpfax:') sys.exit(CUPS_BACKEND_OK)
def usage(typ='text'): if typ == 'text': utils.log_title(__title__, __version__) utils.format_text(USAGE, typ, __title__, 'drv2xml.py', __version__) sys.exit(0)
def main(args): global errors global model_dat line_num = 0 log.set_module("dat2drv.py") cur_path = os.path.realpath(os.path.normpath(os.getcwd())) dat_path = os.path.join(cur_path, 'data', 'models') model_dat = models.ModelData(dat_path) load_models() verbose = False quiet = False try: opts, args = getopt.getopt(args, 'd:l:ho:vq', ['logging=', 'help', 'help-rest', 'help-man', 'drv=', 'output=', 'verbose', 'quiet']) except getopt.GetoptError as e: log.error(e.msg) usage() sys.exit(0) log_level = 'info' if os.getenv("HPLIP_DEBUG"): log.set_level('debug') for o, a in opts: if o in ('-h', '--help'): usage() elif o == '--help-rest': usage('rest') elif o == '--help-man': usage('man') elif o in ('-v', '--verbose'): verbose = True elif o in ('-q', '--quiet'): quiet = True elif o in ('-l', '--logging'): log.set_level(a.lower().strip()) if not quiet: utils.log_title(__title__, __version__) drv_dir = os.path.join(cur_path, 'prnt', 'drv') errors = [] warns = [] notes = [] for template_file in utils.walkFiles(drv_dir, recurse=False, abs_paths=True, return_folders=False, pattern='*.in.template'): basename = os.path.basename(template_file).split('.')[0] # Output drv_in_file = os.path.join(cur_path, 'prnt', 'drv', '%s.drv.in' % basename) # XML output (per model) output_path = os.path.join(cur_path, 'prnt', 'drv', 'foomatic_xml', basename) # XML Output (master driver list) driver_path = os.path.join(cur_path, 'prnt', 'drv', 'foomatic_xml', basename, '%s.xml' % basename) log.info("Working on %s file..." % basename) log.info("Input file: %s" % template_file) log.info("Output file: %s" % drv_in_file) log.info("Output XML directory: %s" % output_path) log.info("Output driver XML file: %s" % driver_path) # CREATE DRV.IN FILE log.info("Processing %s.drv.in.template..." % basename) tui.update_spinner() template_classes = [] template_file_f = open(template_file, 'r') drv_in_file_f = open(drv_in_file, 'w') models_placement = {} for m in models_dict: models_placement[m] = 0 line = 0 for x in template_file_f: if verbose: log.info(x.strip()) line += 1 tui.update_spinner() drv_in_file_f.write(x) match = pat_template.match(x) if match is not None: matches = [] indent = match.group(1) indent2 = ' '*(len(indent)+2) classes = match.group(2).split(':') tech_class = classes[0] if tech_class not in models.TECH_CLASSES: errors.append("(%s:line %d) Invalid tech-class (%s): %s" % (basename, line, tech_class, x.strip())) continue template_classes.append(tech_class) tech_subclass = classes[1:] ok = True for sc in tech_subclass: if sc not in models.TECH_SUBCLASSES: errors.append("(%s:line %d) Invalid tech-subclass (%s): %s" % (basename, line, sc, x.strip())) ok = False if not ok: continue for m in models_dict: include = False if tech_class in models_dict[m]['tech-class'] and \ len(models_dict[m]['tech-subclass']) == len(tech_subclass): for msc in models_dict[m]['tech-subclass']: if msc not in tech_subclass: break else: include = True if include: models_placement[m] += 1 matches.append(m) if matches: try: matches.sort(key=lambda y: pat_prod_num.search(y).group(1)) except: matches.sort(key=str.lower) for p in matches: if verbose: log.info("(%s) Adding section for model: %s" % (basename, p)) drv_in_file_f.write("%s{\n" % indent) if basename == 'hpcups': model_name = models_dict[p]['norm_model'] else: model_name = models_dict[p]['norm_model'] + " %s" % basename orig_model_name = model_name while True: if len(model_name) > 31: for k in SHORTENING_REPLACEMENTS: if k in model_name.lower(): model_name = utils.ireplace(model_name, k, SHORTENING_REPLACEMENTS[k]) model_name = model_name.replace(' ', ' ') if len(model_name) < 32: warns.append('len("%s")>31, shortened to len("%s")=%d using sub-brand shortening replacements.' % (orig_model_name, model_name, len(model_name))) break if len(model_name) < 32: break if "series" in model_name.lower(): model_name = utils.ireplace(model_name, "series", "Ser.") model_name = model_name.replace(' ', ' ') if len(model_name) < 32: warns.append('len("%s")>31, shortened to len("%s")=%d using "series" to "ser." replacement.' % (orig_model_name, model_name, len(model_name))) break if "ser." in model_name.lower(): model_name = utils.ireplace(model_name, "ser.", "") model_name = model_name.replace(' ', ' ') if len(model_name) < 32: warns.append('len("%s")>31, shortened to len("%s")=%d using "ser." removal.' % (orig_model_name, model_name, len(model_name))) break if len(model_name) > 31: model_name = model_name[:31] errors.append('len("%s")>31 chars, could not shorten to <32. Truncating to 31 chars (%s).' % (orig_model_name, model_name)) break drv_in_file_f.write('%sModelName "%s"\n' % (indent2, orig_model_name)) if len(models_dict[p]['tech-class']) > 1: if basename == "hpcups": drv_in_file_f.write('%sAttribute "NickName" "" "%s %s, %s $Version' % (indent2, orig_model_name, models.TECH_CLASS_PDLS[tech_class],basename)) else: drv_in_file_f.write('%sAttribute "NickName" "" "%s %s, $Version' % (indent2, orig_model_name, models.TECH_CLASS_PDLS[tech_class])) else: if basename == "hpcups": drv_in_file_f.write('%sAttribute "NickName" "" "%s, %s $Version' % (indent2, orig_model_name, basename)) else: drv_in_file_f.write('%sAttribute "NickName" "" "%s, $Version' % (indent2, orig_model_name)) if models_dict[p]['plugin'] in (1, 2): if (models_dict[p]['plugin-reason'] & 15 ) in (1, 2, 3, 4, 5, 6, 8, 9, 10, 12): drv_in_file_f.write(', requires proprietary plugin') drv_in_file_f.write('"\n') drv_in_file_f.write('%sAttribute "ShortNickName" "" "%s"\n' % (indent2, model_name)) pp = p.replace('_', ' ') if 'apollo' in p.lower(): devid = "MFG:Apollo;MDL:%s;DES:%s;" % (pp, pp) elif 'laserjet' in p.lower() or 'designjet' in p.lower(): devid = "MFG:Hewlett-Packard;MDL:%s;DES:%s;" % (pp, pp) else: devid = "MFG:HP;MDL:%s;DES:%s;" % (pp, pp) drv_in_file_f.write('%sAttribute "1284DeviceID" "" "%s"\n' % (indent2, devid)) if len(models_dict[p]['tech-class']) > 1: if basename == 'hpcups': drv_in_file_f.write('%sPCFileName "%s-%s.ppd"\n' % (indent2, fixFileName(p), models.TECH_CLASS_PDLS[tech_class])) else: drv_in_file_f.write('%sPCFileName "%s-%s-%s.ppd"\n' % (indent2, fixFileName(p), basename, models.TECH_CLASS_PDLS[tech_class])) elif tech_class != 'Postscript': if basename == 'hpcups': drv_in_file_f.write('%sPCFileName "%s.ppd"\n' % (indent2, fixFileName(p))) else: drv_in_file_f.write('%sPCFileName "%s-%s.ppd"\n' % (indent2, fixFileName(p), basename)) else: drv_in_file_f.write('%sPCFileName "%s-ps.ppd"\n' % (indent2, fixFileName(p))) for c in models_dict[p]['case_models']: drv_in_file_f.write('%sAttribute "Product" "" "(%s)"\n' % (indent2, c)) drv_in_file_f.write("%s}\n" % indent) else: errors.append("(%s:line %d) No models matched the specified classes on line: %s" % (basename, line, x.strip())) else: match = pat_template2.match(x) if match is not None: errors.append("(%s:line %d) Malformed line: %s (missing initial //)" % (basename, line, x.strip())) template_file_f.close() drv_in_file_f.close() tui.cleanup_spinner() for tc in models.TECH_CLASSES: if tc.lower() in ('undefined', 'postscript', 'unsupported'): continue if tc not in template_classes: warns.append("(%s) Section <%%%s:...%%> not found." % (basename, tc)) # OUTPUT XML FILES if not os.path.exists(output_path): os.makedirs(output_path) if os.path.exists(driver_path): os.remove(driver_path) files_to_delete = [] for f in utils.walkFiles(output_path, recurse=True, abs_paths=True, return_folders=False, pattern='*'): files_to_delete.append(f) for f in files_to_delete: os.remove(f) driver_f = open(driver_path, 'w') driver_doc = XMLDocument("driver", id="driver/hplip") name_node = driver_doc.add("name") name_node.addText("hplip") url_node = driver_doc.add("url") url_node.addText("http://hplipopensource.com") supplier_node = driver_doc.add("supplier") supplier_node.addText("Hewlett-Packard") mfg_node = driver_doc.add("manufacturersupplied") mfg_node.addText("HP|Apollo") lic_node = driver_doc.add("license") lic_node.addText("BSD/GPL/MIT") driver_doc.add("freesoftware") support_node = driver_doc.add("supportcontact", level="voluntary", url="https://launchpad.net/hplip") support_node.addText("HPLIP Support at Launchpad.net") shortdesc_node = driver_doc.add("shortdescription") shortdesc_en_node = shortdesc_node.add("en") shortdesc_en_node.addText("HP's driver suite for printers and multi-function devices") func_node = driver_doc.add("functionality") maxresx_node = func_node.add("maxresx") maxresx_node.addText("1200") maxresy_node = func_node.add("maxresy") maxresy_node.addText("1200") func_node.add("color") exec_node = driver_doc.add("execution") exec_node.add("nopjl") exec_node.add("ijs") proto_node = exec_node.add("prototype") #proto_node.addText("gs -q -dBATCH -dPARANOIDSAFER -dQUIET -dNOPAUSE -sDEVICE=ijs -sIjsServer=hpijs%A%B%C -dIjsUseOutputFD%Z -sOutputFile=- -") comments_node = driver_doc.add("comments") comments_en_node = comments_node.add("en") comments_en_node.addText("") printers_node = driver_doc.add("printers") for m in models_dict: if models_dict[m]['support-type'] == SUPPORT_TYPE_NONE: continue if 'apollo' in m.lower(): make = 'Apollo' else: make = 'HP' if 'apollo' in m.lower(): ieee1284 = "MFG:Apollo;MDL:%s;DES:%s;" % (m, m) else: ieee1284 = "MFG:HP;MDL:%s;DES:%s;" % (m, m) postscriptppd = '' if 'Postscript' in models_dict[m]['tech-class']: postscriptppd = "%s-ps.ppd" % fixFileName(m) stripped_model = m if stripped_model.startswith('hp_'): stripped_model = stripped_model.replace('hp_', '').capitalize() elif stripped_model.startswith('apollo_'): stripped_model = stripped_model.replace('apollo_', '').capitalize() fixed_model = stripped_model.replace('_', ' ').capitalize() # Output to the per-model XML file outputModel(m, fixed_model, stripped_model, make, postscriptppd, ieee1284, output_path, verbose) # Output to driver master XML file outputDriver(m, fixed_model, stripped_model, make, printers_node, verbose) driver_f.write(str(driver_doc)) driver_f.close() # Make sure all models ended up in drv.in file log.info("Checking for errors...") tui.update_spinner() for m in models_dict: tui.update_spinner() tc = models_dict[m]['tech-class'] st = models_dict[m]['support-type'] if not tc or 'Undefined' in tc: if st: errors.append('(%s) Invalid tech-class for model %s ("Undefined" or missing)' % (basename, m)) #else: # warns.append('(%s) Invalid tech-class for unsupported model %s ("Undefined" or missing)' % (basename, m)) else: if not models_placement[m] and st and \ len(tc) == 1 and 'Postscript' not in tc: sects = [] for tc in models_dict[m]['tech-class']: for sc in models_dict[m]['tech-subclass']: sects.append(sc) errors.append("(%s) Model '%s' did not have a matching section. Needed section: <%%%s:%s%%>" % (basename, m, tc, ':'.join(sects))) if len(tc) == 1 and 'Postscript' in tc: notes.append("(%s) Postscript-only model %s was not included in DRV file." % (basename, m)) tui.cleanup_spinner() # end for if not quiet or verbose: if notes: tui.header("NOTES") for n in notes: log.note(n) if warns: tui.header("WARNINGS") for w in warns: log.warn(w) if errors: tui.header("ERRORS") for e in errors: log.error(e) else: if warns: log.warn("%d warnings" % len(warns)) if errors: log.error("%d errors" % len(errors))
def do_about(self, args): """About fab.""" utils.log_title(__title__, __version__)
def usage(typ="text"): if typ == "text": utils.log_title(__title__, __version__) utils.format_text(USAGE, typ, title=__title__, crumb="hpfax:") sys.exit(CUPS_BACKEND_OK)
def do_about(self, args): utils.log_title(__title__, __version__)
def usage(typ="text"): if typ == "text": utils.log_title(__title__, __version__) utils.format_text(USAGE, typ, __title__, __mod__, __version__) sys.exit(0)
log.debug("Log file=%s" % log_file) ac_init_pat = re.compile(r"""AC_INIT\(\[(.*?)\], *\[(.*?)\], *\[(.*?)\], *\[(.*?)\] *\)""", re.IGNORECASE) try: config_in = open('./configure.in', 'r') except IOError: prop.version = 'x.x.x' else: for c in config_in: if c.startswith("AC_INIT"): match_obj = ac_init_pat.search(c) prop.version = match_obj.group(2) break config_in.close() utils.log_title(__title__, __version__, True) log.info("Installer log saved in: %s" % log.bold(log_file)) log.info("") try: from installer import text_install log.debug("Starting text installer...") text_install.start(language, auto, test_depends, test_unknown, assume_network, max_retries, enable, disable) except KeyboardInterrupt: log.error("User exit")
if log_level is not None: if not log.set_level(log_level): usage() log_file = os.path.normpath('%s/hplip-uninstall.log' % prop.user_dir) if os.getuid() != 0: log.error( "To run 'hp-uninstall' utility, you must have root privileges.(Try using 'sudo' or 'su -c')" ) sys.exit(1) if os.path.exists(log_file): os.remove(log_file) log.set_logfile(log_file) log.set_where(log.LOG_TO_CONSOLE_AND_FILE) log.debug("Log file=%s" % log_file) log.debug("euid = %d" % os.geteuid()) utils.log_title(__title__, __version__, True) log.info("Uninstaller log saved in: %s" % log.bold(log_file)) log.info("") core = CoreInstall(MODE_CHECK, INTERACTIVE_MODE) core.init() core.uninstall(mode)