def test_configparsers_equal(self, tidy_writer, stub_create): rf = YumRepoFile() other = RawConfigParser() for parser in [rf, other]: parser.add_section('test') parser.set('test', 'key', 'val') self.assertTrue(rf._configparsers_equal(other))
def __init__(self): # http://standards.freedesktop.org/basedir-spec/latest/ar01s03.html self.app_dir = join(getenv('XDG_DATA_HOME', expanduser('~/.local/share')), appname) if not isdir(self.app_dir): makedirs(self.app_dir) self.plugin_dir = join(self.app_dir, 'plugins') if not isdir(self.plugin_dir): mkdir(self.plugin_dir) self.home = expanduser('~') self.respath = dirname(__file__) self.filename = join(getenv('XDG_CONFIG_HOME', expanduser('~/.config')), appname, '%s.ini' % appname) if not isdir(dirname(self.filename)): makedirs(dirname(self.filename)) self.config = RawConfigParser() try: self.config.readfp(codecs.open(self.filename, 'r', 'utf-8')) except: self.config.add_section('config') if not self.get('outdir') or not isdir(self.get('outdir')): self.set('outdir', expanduser('~'))
def inifile_readstring(inifilename, section, key, default=None): """Read a string parameter from inifile""" inifile = RawConfigParser() inifile.read(inifilename) if inifile.has_section(section) and inifile.has_option(section, key): return inifile.get(section, key) else: return default
def test_configparsers_diff_items(self, tidy_writer, stub_create): rf = RepoFile() other = RawConfigParser() for parser in [rf, other]: parser.add_section('test') parser.set('test', 'key', 'val') rf.set('test', 'somekey', 'val') self.assertFalse(rf._configparsers_equal(other))
def inifile_writestring(inifilename, section, key, value): """Write a string parameter to inifile""" inifile = RawConfigParser() inifile.read(inifilename) if not inifile.has_section(section): inifile.add_section(section) inifile.set(section, key, value) inifile.write(open(inifilename, 'w'))
def get_packages_filenames(packages, with_depends=True, waptconfigfile=None, repo_name='wapt-templates', remoterepo=None): """Returns list of package filenames (latest version) and md5 matching comma separated list of packages names and their dependencies helps to batch download a list of selected packages using tools like curl or wget Args: packages (list): list of package entries as dicts or PackageEntry with_depends (bool): get recursively the all depends filenames waptconfigfile (str): path to wapt ini file repo_name : section name in wapt ini file for repo parameters (repo_url, http_proxy, timeout, verify_cert) remoterepo (WaptRemoteRepo) : remote repo to query. Mutually exclusive with waptconfigfile and repo_name Returns: list: list of (wapt file basename,md5) >>> get_packages_filenames(r"c:\users\htouvet\AppData\Local\waptconsole\waptconsole.ini","tis-firefox-esr,tis-flash,tis-wapttest") [u'tis-firefox-esr_24.4.0-0_all.wapt', u'tis-flash_12.0.0.77-3_all.wapt', u'tis-wapttest.wapt', u'tis-wapttestsub_0.1.0-1_all.wapt', u'tis-7zip_9.2.0-15_all.wapt'] """ result = [] defaults = { 'repo_url': 'https://store.wapt.fr/wapt', 'http_proxy': '', 'verify_cert': '0', } if remoterepo is None: config = RawConfigParser(defaults=defaults) config.read(waptconfigfile) remoterepo = WaptRemoteRepo(name=repo_name, config=config) remoterepo.update() for pe in packages: if not isinstance(pe, PackageEntry): pe = PackageEntry(**pe) result.append(( pe.filename, pe.md5sum, )) if with_depends and pe.depends: depends_list = [] for depname in ensure_list(pe.depends): pe_dep = remoterepo.packages_matching(depname) if pe_dep: depends_list.append(pe_dep[-1]) for (fn, md5) in get_packages_filenames(depends_list, remoterepo=remoterepo): if not fn in result: result.append(( fn, md5, )) return result
def read_config(filename, providers): cp = RawConfigParser() cp.read(filename) while providers: providers.pop() for provider_name in cp.sections(): provider = Provider(provider_name) provider.read_config(cp) providers.append(provider)
def inifile_writestring(inifilename, section, key, value): r"""Write a string parameter to inifile >>> inifile_writestring('c:/tranquilit/wapt/tests/test.ini','global','version','1.1.1') >>> print inifile_readstring('c:/tranquilit/wapt/tests/test.ini','global','version') 1.1.1 """ inifile = RawConfigParser() inifile.read(inifilename) if not inifile.has_section(section): inifile.add_section(section) inifile.set(section, key, value) inifile.write(open(inifilename, 'w'))
def inifile_readstring(inifilename, section, key, default=None): """Read a string parameter from inifile >>> inifile_writestring('c:/tranquilit/wapt/tests/test.ini','global','version','1.1.2') >>> print inifile_readstring('c:/tranquilit/wapt/tests/test.ini','global','version') 1.1.2 >>> print inifile_readstring('c:/tranquilit/wapt/tests/test.ini','global','undefaut','defvalue') defvalue """ inifile = RawConfigParser() inifile.read(inifilename) if inifile.has_section(section) and inifile.has_option(section, key): return inifile.get(section, key) else: return default
def inifile_deletesection(inifilename, section): """Remove a section within the inifile Args: inifilename (str): Path to the ini file section (str): section to remove Returns: boolean : True if the section has been removed """ inifile = RawConfigParser() inifile.read(inifilename) inifile.remove_section(section) inifile.write(open(inifilename, 'w')) return not inifile.has_section(section)
def inifile_hassection(inifilename, section): """Check if an option is present in section of the inifile Args: inifilename (str): Path to the ini file section (str): section Returns: boolean : True if the key exists >>> inifile_writestring('c:/tranquilit/wapt/tests/test.ini','global','version','1.1.2') >>> print inifile_hassection('c:/tranquilit/wapt/tests/test.ini','global') True """ inifile = RawConfigParser() inifile.read(inifilename) return inifile.has_section(section)
def get_packages_filenames(waptconfigfile,packages_names,with_depends=True,verify_cert=None,repo_name='wapt-templates'): """Returns list of package filenames (latest version) and md5 matching comma separated list of packages names and their dependencies helps to batch download a list of selected packages using tools like curl or wget Args: waptconfigfile (str): path to wapt ini file packages_names (list or csv str): list of package names verify_cert (0/1,path to certificate or ca) : check https connection with_depends (bool): get recursively the all depends filenames repo_name : section name in wapt ini file for repo parameters (repo_url, http_proxy, timeout, verify_cert) Returns: list: list of (wapt file basename,md5) >>> get_packages_filenames(r"c:\users\htouvet\AppData\Local\waptconsole\waptconsole.ini","tis-firefox-esr,tis-flash,tis-wapttest") [u'tis-firefox-esr_24.4.0-0_all.wapt', u'tis-flash_12.0.0.77-3_all.wapt', u'tis-wapttest.wapt', u'tis-wapttestsub_0.1.0-1_all.wapt', u'tis-7zip_9.2.0-15_all.wapt'] """ result = [] defaults = { 'repo_url':'https://store.wapt.fr/wapt', 'http_proxy':'', 'verify_cert':'0', } config = RawConfigParser(defaults=defaults) config.read(waptconfigfile) templates = WaptRemoteRepo(name=repo_name,verify_cert=verify_cert,config=config) templates.update() packages_names = ensure_list(packages_names) for name in packages_names: entries = templates.packages_matching(name) if entries: pe = entries[-1] result.append((pe.filename,pe.md5sum,)) if with_depends and pe.depends: for (fn,md5) in get_packages_filenames(waptconfigfile,pe.depends): if not fn in result: result.append((fn,md5,)) return result
def inifile_deleteoption(inifilename, section, key): """Remove a key within the section of the inifile Args: inifilename (str): Path to the ini file section (str): section key (str): value key of option to remove Returns: boolean : True if the key/option has been removed >>> inifile_writestring('c:/tranquilit/wapt/tests/test.ini','global','version','1.1.2') >>> print inifile_hasoption('c:/tranquilit/wapt/tests/test.ini','global','version') True >>> print inifile_deleteoption('c:/tranquilit/wapt/tests/test.ini','global','version') False """ inifile = RawConfigParser() inifile.read(inifilename) inifile.remove_option(section, key) inifile.write(open(inifilename, 'w')) return inifile.has_section(section) and not inifile.has_option( section, key)
def main(): if len(args) == 0: print "ERROR : You must provide one action to perform" parser.print_usage() sys.exit(2) action = args[0] # Config file if not os.path.isfile(config_file): logger.error("Error : could not find file : " + config_file + ", please check the path") logger.debug('Config file: %s' % config_file) defaults = { 'repositories': '', 'repo_url': '', 'default_source_url': '', 'private_key': '', 'public_cert': '', 'default_development_base': 'c:\tranquilit', 'default_package_prefix': 'tis', 'default_sources_suffix': 'wapt', 'default_sources_url': '', 'upload_cmd': '', 'wapt_server': '', 'loglevel': 'info', } cp = RawConfigParser(defaults=defaults) cp.add_section('global') cp.read(config_file) global loglevel if not loglevel and cp.has_option('global', 'loglevel'): loglevel = cp.get('global', 'loglevel') setloglevel(loglevel) mywapt = Wapt(config=cp) if options.wapt_url: mywapt.wapt_repourl = options.wapt_url if options.private_key: mywapt.private_key = options.private_key else: mywapt.private_key = cp.get('global', 'private_key') mywapt.dry_run = options.dry_run #logger.info("Main wapt Repository %s" % mywapt.wapt_repourl) logger.debug('WAPT base directory : %s' % mywapt.wapt_base_dir) logger.debug('Package cache dir : %s' % mywapt.packagecachedir) logger.debug('WAPT DB Structure version;: %s' % mywapt.waptdb.db_version) try: params_dict = {} try: params_dict = json.loads(options.params.replace("'", '"')) except: raise Exception('Install Parameters must be in json format') if action == 'install' or action == 'download': if len(args) < 2: print "You must provide at least one package name" sys.exit(1) if os.path.isdir(args[1]) or os.path.isfile(args[1]): print "installing WAPT file %s" % args[1] if action == 'install': mywapt.install_wapt(args[1], params_dict=params_dict) else: print "%sing WAPT packages %s" % (action, ','.join(args[1:])) if options.update_packages: print "Update package list" mywapt.update() result = mywapt.install( args[1:], force=options.force, params_dict=params_dict, download_only=(action == 'download'), ) print "\nResults :" if action <> 'download': for k in ('install', 'additional', 'upgrade', 'skipped', 'errors'): if result.get(k, []): print "\n=== %s packages ===\n%s" % ( k, '\n'.join([ " %-30s | %s (%s)" % (s[0], s[1].package, s[1].version) for s in result[k] ]), ) else: for k in ('downloaded', 'skipped', 'errors'): if result.get('downloads', { 'downloaded': [], 'skipped': [], 'errors': [] })[k]: print "\n=== %s packages ===\n%s" % ( k, '\n'.join([ " %s" % (s, ) for s in result['downloads'][k] ]), ) elif action == 'download': if len(args) < 2: print "You must provide at least one package name to download" sys.exit(1) if options.update_packages: print "Update package list" mywapt.update() print "Downloading packages %s" % (','.join(args[1:]), ) result = mywapt.download_packages(args[1:], usecache=not options.force) if result['downloaded']: print "\nDownloaded packages : \n%s" % "\n".join( [" %s" % p for p in result['downloaded']]) if result['skipped']: print "Skipped packages : \n%s" % "\n".join( [" %s" % p for p in result['skipped']]) if result['errors']: logger.critical('Unable to download some files : %s' % (result['errors'], )) sys.exit(1) elif action == 'show': if len(args) < 2: print "You must provide at least one package name to show" sys.exit(1) if os.path.isdir(args[1]) or os.path.isfile(args[1]): entry = PackageEntry().load_control_from_wapt(args[1]) print "%s" % entry else: print "Display package control data for %s\n" % (','.join( args[1:]), ) if options.update_packages: print "Update package list" mywapt.update() for packagename in args[1:]: entries = mywapt.waptdb.packages_matching(packagename) if entries: for e in entries: print "%s\n" % e.ascontrol( with_non_control_attributes=True) else: print "None packages found matching package name and version" elif action == 'show-params': if len(args) < 2: print "You must provide at one package name to show params for" sys.exit(1) for packagename in args[1:]: params = mywapt.waptdb.params(packagename) print "%s" % params elif action == 'list-registry': print "%-39s%-70s%-20s%-70s" % ('UninstallKey', 'Software', 'Version', 'Uninstallstring') print '-' * 39 + '-' * 70 + '-' * 20 + '-' * 70 for p in setuphelpers.installed_softwares(' '.join(args[1:])): print u"%-39s%-70s%-20s%-70s" % ( p['key'], p['name'], p['version'], p['uninstall_string']) elif action == 'showlog': if len(args) < 2: print "You must provide at least one package name" sys.exit(1) for packagename in args[1:]: result = mywapt.last_install_log(packagename) print "Package : %s\nStatus : %s\n\nInstallation log:\n%s" % ( packagename, result['status'], result['log']) elif action == 'remove': if len(args) < 2: print "You must provide at least one package name to remove" sys.exit(1) for packagename in args[1:]: print "Removing %s ..." % (packagename, ), mywapt.remove(packagename, force=options.force) print "done" elif action == 'session-setup': if len(args) < 2: print "You must provide at least one package to be configured in user's session" sys.exit(1) for packagename in args[1:]: print "Configuring %s ..." % (packagename, ), mywapt.session_setup(packagename, params_dict=params_dict) print "done" elif action == 'uninstall': # launch the setup.uninstall() procedure for the given packages # can be used when registering in registry a custom install with a python script if len(args) < 2: print "You must provide at least one package to be uninstalled" sys.exit(1) for packagename in args[1:]: print "uninstalling %s ..." % (packagename, ), mywapt.uninstall(packagename, params_dict=params_dict) print "uninstall done" elif action == 'update': print "Update package list" result = mywapt.update() print "Total packages : %i" % result['count'] print "Added packages : \n%s" % "\n".join( [" %s (%s)" % p for p in result['added']]) print "Removed packages : \n%s" % "\n".join( [" %s (%s)" % p for p in result['removed']]) print "Repositories URL : \n%s" % "\n".join( [" %s" % p for p in result['repos']]) elif action == 'upgradedb': (old, new) = mywapt.waptdb.upgradedb() if old == new: print "No database upgrade required, current %s, required %s" % ( old, mywapt.waptdb.curr_db_version) else: print "Old version : %s to new : %s" % (old, new) elif action == 'upgrade': if options.update_packages: print "Update package list" mywapt.update() result = mywapt.upgrade() if not result['install'] and not result[ 'additional'] and not result['upgrade'] and not result[ 'skipped']: print "Nothing to upgrade" else: for k in ('install', 'additional', 'upgrade', 'skipped', 'errors'): if result[k]: print "\n=== %s packages ===\n%s" % ( k, '\n'.join([ " %-30s | %s (%s)" % (s[0], s[1].package, s[1].version) for s in result[k] ]), ) sys.exit(0) elif action == 'list-upgrade': if options.update_packages: print "Update package list" mywapt.update() q = mywapt.list_upgrade() if not q: print "Nothing to upgrade" else: print ppdicttable([p[0] for p in q], [('package', 20), ('version', 10)]) elif action == 'download-upgrade': if options.update_packages: print "Update package list" mywapt.update() result = mywapt.download_upgrades() print "Downloaded packages : \n%s" % "\n".join( [" %s" % p for p in result['downloaded']]) print "Skipped packages : \n%s" % "\n".join( [" %s" % p for p in result['skipped']]) if result['errors']: logger.critical('Unable to download some files : %s' % (result['errors'], )) sys.exit(1) elif action == 'update-packages': if len(args) < 2: print "You must provide the directory" sys.exit(1) print update_packages(args[1]) elif action == 'sources': if len(args) < 2: print "You must provide the package name" sys.exit(1) os.startfile(mywapt.get_sources(args[1])) elif action == 'make-template': if len(args) < 2: print "You must provide the installer path" sys.exit(1) source_dir = mywapt.maketemplate(*args[1:]) print "Template created. You can build the WAPT package by launching\n %s build-package %s" % ( sys.argv[0], source_dir) os.startfile(source_dir) elif action == 'make-host-template': source_dir = mywapt.makehosttemplate(*args[1:]) print "Template created. You can build the WAPT package by launching\n %s build-package %s" % ( sys.argv[0], source_dir) os.startfile(source_dir) elif action == 'build-package': if len(args) < 2: print "You must provide at least one source directory for package build" sys.exit(1) for source_dir in [os.path.abspath(p) for p in args[1:]]: if os.path.isdir(source_dir): print('Building %s' % source_dir) result = mywapt.buildpackage( source_dir, inc_package_release=options.increlease, excludes=options.excludes.split(',')) package_fn = result['filename'] if package_fn: print "Package content:" for f in result['files']: print " %s" % f[0] print('...done. Package filename %s' % (package_fn, )) def pwd_callback(*args): """Default password callback for opening private keys""" return open(options.private_key_passwd, 'r').read() if mywapt.private_key: print('Signing %s' % package_fn) if options.private_key_passwd: signature = mywapt.signpackage( package_fn, excludes=options.excludes.split(','), callback=pwd_callback) else: signature = mywapt.signpackage( package_fn, excludes=options.excludes.split(',')) print "Package %s signed : signature :\n%s" % ( package_fn, signature) else: logger.warning( 'No private key provided, package %s is unsigned !' % package_fn) if mywapt.upload_cmd: print '\nYou can upload to repository with\n %s upload-package %s ' % ( sys.argv[0], package_fn) return 0 else: logger.critical('package not created') return 1 else: logger.critical('Directory %s not found' % source_dir) elif action == 'sign-package': if len(args) < 2: print "You must provide at least one source directory or package to sign" sys.exit(1) for waptfile in [os.path.abspath(p) for p in args[1:]]: if os.path.isdir(waptfile) or os.path.isfile(waptfile): print('Signing %s' % waptfile) signature = mywapt.signpackage( waptfile, excludes=options.excludes.split(',')) print "Package %s signed : signature :\n%s" % (waptfile, signature) else: logger.critical('Package %s not found' % waptfile) return 1 elif action == 'upload-package': if len(args) < 2: print "You must provide a package to upload" sys.exit(1) waptfiles = [] for a in args[1:]: waptfiles += glob.glob(a) waptfile_arg = " ".join(['"%s"' % f for f in waptfiles]) print setuphelpers.run(mywapt.upload_cmd % {'waptfile': waptfile_arg}) if mywapt.after_upload: print setuphelpers.run(mywapt.after_upload % {'waptfile': waptfile_arg}) elif action == 'search': if options.update_packages: print "Update package list" mywapt.update() result = mywapt.waptdb.packages_search(args[1:]) print ppdicttable(result, (('package', 30), ('version', 10), ('description', 80))) elif action == 'cleanup': result = mywapt.cleanup() print "Removed files : \n%s" % "\n".join( [" %s" % p for p in result]) elif action == 'inventory': print mywapt.inventory() elif action == 'setup-tasks': print mywapt.setup_tasks() elif action == 'list': def cb(fieldname, value): if value and fieldname == 'install_date': return value[0:16] else: return value print ppdicttable( mywapt.waptdb.installed_search(args[1:]).values(), (('package', 20), ('version', 15), ('install_status', 10), ('install_date', 16), ('description', 80)), callback=cb) else: print 'Unknown action %s' % action sys.exit(1) except Exception, e: print "FATAL ERROR : %s" % e if logger.level == logging.DEBUG: raise sys.exit(3)
def get_packages_filenames(packages, with_depends=True, waptconfigfile=None, repo_name='wapt-templates', remoterepo=None, package_request=None, privaterepo=None, local_prefix=None): """Returns list of package filenames (latest version) and md5 matching comma separated list of packages names and their dependencies helps to batch download a list of selected packages using tools like curl or wget Args: packages (list): list of package entries as dicts or PackageEntry with_depends (bool): get recursively the all depends filenames waptconfigfile (str): path to wapt ini file repo_name : section name in wapt ini file for repo parameters (repo_url, http_proxy, timeout, verify_cert) remoterepo (WaptRemoteRepo) : remote repo to query. Mutually exclusive with waptconfigfile and repo_name privaterepo (WaptRemoteRepo) : local private repo where to check if dependencies already exists Returns: list: list of (wapt file basename,md5) >>> get_packages_filenames(r"c:\users\htouvet\AppData\Local\waptconsole\waptconsole.ini","tis-firefox-esr,tis-flash,tis-wapttest") [u'tis-firefox-esr_24.4.0-0_all.wapt', u'tis-flash_12.0.0.77-3_all.wapt', u'tis-wapttest.wapt', u'tis-wapttestsub_0.1.0-1_all.wapt', u'tis-7zip_9.2.0-15_all.wapt'] """ result = [] defaults = { 'repo_url': 'https://store.wapt.fr/wapt', 'http_proxy': '', 'verify_cert': '0', } try: import waptconsole progress_hook = waptconsole.UpdateProgress private_key_password_callback = waptconsole.GetPrivateKeyPassword except ImportError as e: def print_progress(show=False, n=0, max=100, msg=''): if show: print('%s %s/%s\r' % (msg, n, max), end='') else: if not msg: msg = 'Done' print("%s%s" % (msg, ' ' * (80 - len(msg)))) progress_hook = print_progress private_key_password_callback = None if remoterepo is None: config = RawConfigParser(defaults=defaults) config.read(waptconfigfile) remoterepo = WaptRemoteRepo(name=repo_name, config=config) remoterepo.private_key_password_callback = private_key_password_callback remoterepo.update() if privaterepo is None and waptconfigfile: config = RawConfigParser(defaults=defaults) config.read(waptconfigfile) privaterepo = WaptRemoteRepo(name='wapt', config=config) privaterepo.private_key_password_callback = private_key_password_callback privaterepo.update() if package_request is not None and isinstance(package_request, dict): package_request = PackageRequest(**package_request) for pe in packages: if not isinstance(pe, PackageEntry): pe = PackageEntry(**pe) # propagate capa to parent package if package_request is None: request_filter = PackageRequest() if pe.locale != 'all' and pe.locale: request_filter.locales = [pe.locale] if pe.architecture != 'all' and pe.architecture: request_filter.architectures = [pe.architecture] if pe.min_os_version: request_filter.min_os_version = pe.min_os_version if pe.max_os_version: request_filter.max_os_version = pe.max_os_version else: request_filter = package_request if pe.filename: result.append(( pe.filename, pe.md5sum, )) if with_depends and pe.depends: depends_list = [] for depname in ensure_list(pe.depends): request_filter.request = depname pe_dep = remoterepo.packages_matching(request_filter) if privaterepo and local_prefix: request_filter.request = change_prefix( depname, local_prefix) pe_local = privaterepo.packages_matching( request_filter) else: pe_local = None if pe_dep and not pe_local: depends_list.append(pe_dep[-1]) for (fn, md5) in get_packages_filenames(depends_list, remoterepo=remoterepo): if not (fn, md5) in result: result.append(( fn, md5, )) return result
with open(args.config, "r") as f: config = read_config(f) sbuild_arch = get_sbuild_architecture() if args.sbuild_path is None: if not args.base_directory: parser.print_usage() parser.exit() sbuild_path = os.path.join(args.base_directory, config.distribution.chroot) else: sbuild_path = args.sbuild_path if args.remove_old: for entry in os.scandir('/etc/schroot/chroot.d'): cp = RawConfigParser() cp.read([entry.path]) if config.distribution.chroot in cp.sections(): old_sbuild_path = cp.get('unstable-amd64-sbuild', 'directory') if old_sbuild_path != sbuild_path: raise AssertionError('sbuild path has changed: %s != %s' % (old_sbuild_path, sbuild_path)) if os.path.isdir(old_sbuild_path): shutil.rmtree(old_sbuild_path) os.unlink(entry.path) create_chroot(config.distribution, sbuild_path, config.suite, sbuild_arch, args.include,
def inifile_hasoption(inifilename, section, key): """Read a string parameter from inifile""" inifile = RawConfigParser() inifile.read(inifilename) return inifile.has_section(section) and inifile.has_option(section, key)
loglevel = 'debug' defaults = { 'repositories': '', 'repo_url': '', 'default_source_url': '', 'gpgkey': '', 'default_development_base': 'c:\tranquilit', 'default_package_prefix': 'tis', 'default_sources_suffix': 'wapt', 'default_sources_url': '', 'upload_cmd': '', 'wapt_server': '', } cp = RawConfigParser(defaults=defaults) cp.add_section('global') cp.read(config_file) if len(logger.handlers) < 1: hdlr = logging.StreamHandler(sys.stdout) hdlr.setFormatter( logging.Formatter('%(asctime)s %(levelname)s %(message)s')) logger.addHandler(hdlr) # set loglevel if loglevel in ('debug', 'warning', 'info', 'error', 'critical'): numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logger.setLevel(numeric_level)