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 _has_changed(self): ''' Check if the version on disk is different from what we have loaded ''' on_disk = ConfigParser() on_disk.read(self.path) return not self._configparsers_equal(on_disk)
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 test_configparsers_equal_int(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", "k", 1) other.set("test", "k", "1") self.assertTrue(rf._configparsers_equal(other))
def write(self): if not self.manage_repos: log.debug("Skipping write due to manage_repos setting: %s" % self.path) return if self._has_changed(): with open(self.path, "w") as f: tidy_writer = TidyWriter(f) ConfigParser.write(self, tidy_writer) tidy_writer.close()
def test_configparsers_equal_int(self, tidy_writer, stub_create): rf = YumRepoFile() other = RawConfigParser() for parser in [rf, other]: parser.add_section('test') parser.set('test', 'key', 'val') rf.set('test', 'k', 1) other.set('test', 'k', '1') self.assertTrue(rf._configparsers_equal(other))
def update(self, repo): # Need to clear out the old section to allow unsetting options: # don't use remove section though, as that will reorder sections, # and move whitespace around (resulting in more and more whitespace # as time progresses). for (k, v) in self.items(repo.id): self.remove_option(repo.id, k) for k, v in list(repo.items()): ConfigParser.set(self, repo.id, k, v)
def update(self, repo): # Need to clear out the old section to allow unsetting options: # don't use remove section though, as that will reorder sections, # and move whitespace around (resulting in more and more whitespace # as time progresses). for (k, v) in self.items(repo.id): self.remove_option(repo.id, k) for k, v in repo.items(): ConfigParser.set(self, repo.id, k, v)
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 write(self): if not self.manage_repos: log.debug("Skipping write due to manage_repos setting: %s" % self.path) return if self._has_changed(): f = open(self.path, 'w') tidy_writer = TidyWriter(f) ConfigParser.write(self, tidy_writer) tidy_writer.close() f.close()
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 __init__(self, name='redhat.repo'): ConfigParser.__init__(self) # note PATH get's expanded with chroot info, etc self.path = Path.join(self.PATH, name) self.repos_dir = Path.abs(self.PATH) self.manage_repos = manage_repos_enabled() # Simulate manage repos turned off if no yum.repos.d directory exists. # This indicates yum is not installed so clearly no need for us to # manage repos. if not self.path_exists(self.repos_dir): log.warn("%s does not exist, turning manage_repos off." % self.repos_dir) self.manage_repos = False self.create()
def __init__(self, name='redhat.repo'): ConfigParser.__init__(self) # note PATH get's expanded with chroot info, etc self.path = Path.join(self.PATH, name) self.repos_dir = Path.abs(self.PATH) self.manage_repos = 1 if CFG.has_option('rhsm', 'manage_repos'): self.manage_repos = int(CFG.get('rhsm', 'manage_repos')) # Simulate manage repos turned off if no yum.repos.d directory exists. # This indicates yum is not installed so clearly no need for us to # manage repos. if not os.path.exists(self.repos_dir): log.warn("%s does not exist, turning manage_repos off." % self.repos_dir) self.manage_repos = 0 self.create()
def test_configparsers_diff_items(self, tidy_writer, stub_create): rf = YumRepoFile() 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_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 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 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 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_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 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 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 __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.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 read(self): ConfigParser.read(self, self.path)
class Config: OUT_EDDN = 1 OUT_BPC = 2 OUT_TD = 4 OUT_CSV = 8 if platform=='darwin': def __init__(self): self.app_dir = join(NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, True)[0], appname) if not isdir(self.app_dir): mkdir(self.app_dir) self.bundle = getattr(sys, 'frozen', False) and NSBundle.mainBundle().bundleIdentifier() or 'uk.org.marginal.%s' % appname.lower() # Don't use Python's settings if interactive self.defaults = NSUserDefaults.standardUserDefaults() settings = self.defaults.persistentDomainForName_(self.bundle) or {} self.settings = dict(settings) # Check out_dir exists if not self.get('outdir') or not isdir(self.get('outdir')): self.set('outdir', NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, True)[0]) def get(self, key): return self.settings.get(key) def getint(self, key): try: return int(self.settings.get(key, 0)) # should already be int, but check by casting except: return 0 def set(self, key, val): self.settings[key] = val def close(self): self.defaults.setPersistentDomain_forName_(self.settings, self.bundle) self.defaults.synchronize() self.defaults = None elif platform=='win32': def __init__(self): CSIDL_PERSONAL = 0x0005 CSIDL_LOCAL_APPDATA = 0x001C buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) ctypes.windll.shell32.SHGetSpecialFolderPathW(0, buf, CSIDL_LOCAL_APPDATA, 0) self.app_dir = join(buf.value, appname) if not isdir(self.app_dir): mkdir(self.app_dir) self.handle = _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, r'Software\%s' % appname) if not self.get('outdir') or not isdir(self.get('outdir')): ctypes.windll.shell32.SHGetSpecialFolderPathW(0, buf, CSIDL_PERSONAL, 0) self.set('outdir', buf.value) def get(self, key): try: return _winreg.QueryValueEx(self.handle, key)[0] except: return None def getint(self, key): try: return int(_winreg.QueryValueEx(self.handle, key)[0]) # should already be int, but check by casting except: return 0 def set(self, key, val): if isinstance(val, basestring): _winreg.SetValueEx(self.handle, key, 0, _winreg.REG_SZ, val) elif isinstance(val, numbers.Integral): _winreg.SetValueEx(self.handle, key, 0, _winreg.REG_DWORD, val) else: raise NotImplementedError() def close(self): _winreg.CloseKey(self.handle) self.handle = None elif platform=='linux2': 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.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')) # XXX handle missing? except: self.config.add_section('DEFAULT') if not self.get('outdir') or not isdir(self.get('outdir')): self.set('outdir', expanduser('~')) def set(self, key, val): self.config.set('DEFAULT', key, val) def get(self, key): try: return self.config.get('DEFAULT', key) # all values are stored as strings except: return None def getint(self, key): try: return int(self.config.get('DEFAULT', key)) # all values are stored as strings except: return 0 def close(self): h = codecs.open(self.filename, 'w', 'utf-8') h.write(unicode(self.config.data)) h.close() self.config = None else: # ??? def __init__(self): raise NotImplementedError('Implement me')
def enable_yum_plugins(cls): """ This function tries to enable yum plugins: subscription-manager and product-id. It takes no action, when automatic enabling of yum plugins is disabled in rhsm.conf. :return: It returns list of enabled plugins """ # When user doesn't want to automatically enable yum plugins, then return empty list if cls.is_auto_enable_enabled() is False: log.info( 'The rhsm.auto_enable_yum_plugins is disabled. Skipping the enablement of yum plugins.' ) return [] log.debug('The rhsm.auto_enable_yum_plugins is enabled') # List of successfully enabled plugins enabled_yum_plugins = [] plugin_dir = "" if version.use_dnf: plugin_dir = cls.DNF_PLUGIN_DIR else: plugin_dir = cls.YUM_PLUGIN_DIR # Go through the list of yum plugins and try to find configuration # file of these plugins. for yum_plugin_name in cls.YUM_PLUGINS: yum_plugin_file_name = plugin_dir + '/' + yum_plugin_name + '.conf' yum_plugin_config = ConfigParser() try: result = yum_plugin_config.read(yum_plugin_file_name) except Exception as err: # Capture all errors during reading yum plugin conf file # report them and skip this conf file log.error( "Error during reading yum plugin config file '%s': %s. Skipping this file." % (yum_plugin_file_name, err)) continue if len(result) == 0: log.info( 'Configuration file of yum plugin: "%s" cannot be read' % yum_plugin_file_name) continue is_plugin_enabled = False if not yum_plugin_config.has_section('main'): log.warn( 'Configuration file of yum plugin: "%s" does not include main section. Adding main section.' % yum_plugin_file_name) yum_plugin_config.add_section('main') elif yum_plugin_config.has_option('main', 'enabled'): try: # Options 'enabled' can be 0 or 1 is_plugin_enabled = yum_plugin_config.getint( 'main', 'enabled') except ValueError: try: # Options 'enabled' can be also: true or false is_plugin_enabled = yum_plugin_config.getboolean( 'main', 'enabled') except ValueError: log.warn( "File %s has wrong value of options: 'enabled' in section: 'main' (not a int nor boolean)" % yum_plugin_file_name) if is_plugin_enabled == cls.YUM_PLUGIN_ENABLED: log.debug('Yum plugin: "%s" already enabled. Nothing to do.' % yum_plugin_file_name) else: log.warn('Enabling yum plugin: "%s".' % yum_plugin_file_name) # Change content of plugin configuration file and enable this plugin. with open(yum_plugin_file_name, 'w') as cfg_file: yum_plugin_config.set('main', 'enabled', cls.YUM_PLUGIN_ENABLED) yum_plugin_config.write(cfg_file) enabled_yum_plugins.append(yum_plugin_file_name) return enabled_yum_plugins
def __init__(self, path=None, name=None): ConfigParser.__init__(self) RepoFileBase.__init__(self, path, name)
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 enable_yum_plugins(cls): """ This function tries to enable yum plugins: subscription-manager and product-id. It takes no action, when automatic enabling of yum plugins is disabled in rhsm.conf. :return: It returns list of enabled plugins """ # When user doesn't want to automatically enable yum plugins, then return empty list if cls.is_auto_enable_enabled() is False: log.info('The rhsm.auto_enable_yum_plugins is disabled. Skipping the enablement of yum plugins.') return [] log.debug('The rhsm.auto_enable_yum_plugins is enabled') # List of successfully enabled plugins enabled_yum_plugins = [] # Go through the list of yum plugins and try to find configuration # file of these plugins. for yum_plugin_name in cls.YUM_PLUGINS: yum_plugin_file_name = cls.YUM_PLUGIN_DIR + '/' + yum_plugin_name + '.conf' yum_plugin_config = ConfigParser() try: result = yum_plugin_config.read(yum_plugin_file_name) except Exception as err: # Capture all errors during reading yum plugin conf file # report them and skip this conf file log.error( "Error during reading yum plugin config file '%s': %s. Skipping this file." % (yum_plugin_file_name, err) ) continue if len(result) == 0: log.info('Configuration file of yum plugin: "%s" cannot be read' % yum_plugin_file_name) continue is_plugin_enabled = False if not yum_plugin_config.has_section('main'): log.warn( 'Configuration file of yum plugin: "%s" does not include main section. Adding main section.' % yum_plugin_file_name ) yum_plugin_config.add_section('main') elif yum_plugin_config.has_option('main', 'enabled'): try: # Options 'enabled' can be 0 or 1 is_plugin_enabled = yum_plugin_config.getint('main', 'enabled') except ValueError: try: # Options 'enabled' can be also: true or false is_plugin_enabled = yum_plugin_config.getboolean('main', 'enabled') except ValueError: log.warn( "File %s has wrong value of options: 'enabled' in section: 'main' (not a int nor boolean)" % yum_plugin_file_name ) if is_plugin_enabled == cls.YUM_PLUGIN_ENABLED: log.debug('Yum plugin: "%s" already enabled. Nothing to do.' % yum_plugin_file_name) else: log.warn('Enabling yum plugin: "%s".' % yum_plugin_file_name) # Change content of plugin configuration file and enable this plugin. with open(yum_plugin_file_name, 'w') as cfg_file: yum_plugin_config.set('main', 'enabled', cls.YUM_PLUGIN_ENABLED) yum_plugin_config.write(cfg_file) enabled_yum_plugins.append(yum_plugin_file_name) return enabled_yum_plugins
class Config: OUT_EDDN = 1 OUT_BPC = 2 OUT_TD = 4 OUT_CSV = 8 OUT_SHIP = 16 OUT_LOG = 32 if platform == "darwin": def __init__(self): self.app_dir = join( NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, True)[0], appname ) if not isdir(self.app_dir): mkdir(self.app_dir) if not getattr(sys, "frozen", False): # Don't use Python's settings if interactive self.bundle = "uk.org.marginal.%s" % appname.lower() NSBundle.mainBundle().infoDictionary()["CFBundleIdentifier"] = self.bundle self.bundle = NSBundle.mainBundle().bundleIdentifier() self.defaults = NSUserDefaults.standardUserDefaults() settings = self.defaults.persistentDomainForName_(self.bundle) or {} self.settings = dict(settings) # Check out_dir exists if not self.get("outdir") or not isdir(self.get("outdir")): self.set("outdir", NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, True)[0]) def get(self, key): return self.settings.get(key) def getint(self, key): try: return int(self.settings.get(key, 0)) # should already be int, but check by casting except: return 0 def set(self, key, val): self.settings[key] = val def close(self): self.defaults.setPersistentDomain_forName_(self.settings, self.bundle) self.defaults.synchronize() self.defaults = None elif platform == "win32": def __init__(self): buf = ctypes.create_unicode_buffer(MAX_PATH) ctypes.windll.shell32.SHGetSpecialFolderPathW(0, buf, CSIDL_LOCAL_APPDATA, 0) self.app_dir = join(buf.value, appname) if not isdir(self.app_dir): mkdir(self.app_dir) self.hkey = HKEY() disposition = DWORD() if RegCreateKeyEx( HKEY_CURRENT_USER, r"Software\Marginal\EDMarketConnector", 0, None, 0, KEY_ALL_ACCESS, None, ctypes.byref(self.hkey), ctypes.byref(disposition), ): raise Exception() if disposition.value == REG_CREATED_NEW_KEY: # Migrate pre-1.3.4 registry location oldkey = HKEY() if not RegOpenKeyEx( HKEY_CURRENT_USER, r"Software\EDMarketConnector", 0, KEY_ALL_ACCESS, ctypes.byref(oldkey) ): SHCopyKey(oldkey, None, self.hkey, 0) SHDeleteKey(oldkey, "") RegCloseKey(oldkey) # set WinSparkle defaults - https://github.com/vslavik/winsparkle/wiki/Registry-Settings sparklekey = HKEY() if not RegCreateKeyEx( self.hkey, "WinSparkle", 0, None, 0, KEY_ALL_ACCESS, None, ctypes.byref(sparklekey), ctypes.byref(disposition), ): if disposition.value == REG_CREATED_NEW_KEY: buf = ctypes.create_unicode_buffer("1") RegSetValueEx(sparklekey, "CheckForUpdates", 0, 1, buf, len(buf) * 2) buf = ctypes.create_unicode_buffer(unicode(47 * 60 * 60)) RegSetValueEx(sparklekey, "UpdateInterval", 0, 1, buf, len(buf) * 2) RegCloseKey(sparklekey) if not self.get("outdir") or not isdir(self.get("outdir")): ctypes.windll.shell32.SHGetSpecialFolderPathW(0, buf, CSIDL_PERSONAL, 0) self.set("outdir", buf.value) def get(self, key): typ = DWORD() size = DWORD() if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), None, ctypes.byref(size)) or typ.value != REG_SZ: return None buf = ctypes.create_unicode_buffer(size.value / 2) if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), buf, ctypes.byref(size)): return None else: return buf.value def getint(self, key): typ = DWORD() size = DWORD(4) val = DWORD() if ( RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), ctypes.byref(val), ctypes.byref(size)) or typ.value != REG_DWORD ): return 0 else: return val.value def set(self, key, val): if isinstance(val, basestring): buf = ctypes.create_unicode_buffer(val) RegSetValueEx(self.hkey, key, 0, REG_SZ, buf, len(buf) * 2) elif isinstance(val, numbers.Integral): RegSetValueEx(self.hkey, key, 0, REG_DWORD, ctypes.byref(DWORD(val)), 4) else: raise NotImplementedError() def close(self): RegCloseKey(self.hkey) self.hkey = None elif platform == "linux2": 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.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 set(self, key, val): self.config.set("config", key, val) def get(self, key): try: return self.config.get("config", key) # all values are stored as strings except: return None def getint(self, key): try: return int(self.config.get("config", key)) # all values are stored as strings except: return 0 def close(self): h = codecs.open(self.filename, "w", "utf-8") h.write(unicode(self.config.data)) h.close() self.config = None else: # ??? def __init__(self): raise NotImplementedError("Implement me")
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'))
import dialog from iniparse import RawConfigParser import shutil import fileinput import os, glob, sys import hashlib postconf = dialog.Dialog(dialog="dialog") if postconf.yesno("Do you want to launch post configuration tool ?") == postconf.DIALOG_OK: shutil.copyfile("/opt/wapt/waptserver/waptserver.ini.template", "/opt/wapt/waptserver/waptserver.ini") waptserver_ini = RawConfigParser() waptserver_ini.read("/opt/wapt/waptserver/waptserver.ini") if os.path.isdir("/var/www/wapt"): waptserver_ini.set("options", "wapt_folder", "/var/www/wapt") code, tag = postconf.menu("Mongodb server location", choices=[("1", "localhost (default)"), ("2", "other server")]) if code == postconf.DIALOG_OK: if tag == "1": waptserver_ini.set("options", "mongodb_ip", "127.0.0.1") elif tag == "2": (code, mongodb_ip) = postconf.inputbox("IP address of the mongodb server:") if code != postconf.DIALOG_OK: exit(1) else: waptserver_ini.set("options", "mongodb_ip", mongodb_ip) elif code != postconf.DIALOG_OK: exit(1)
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)
def _enable_plugins(cls, pkg_mgr_name, plugin_dir): """ This class method tries to enable plugins for DNF or YUM :param pkg_mgr_name: It can be "dnf" or "yum" :type pkg_mgr_name: str :param plugin_dir: Directory with configuration files for (dnf/yum) plugins :type plugin_dir: str :return: """ # List of successfully enabled plugins enabled_lugins = [] # Go through the list of yum plugins and try to find configuration # file of these plugins. for plugin_name in cls.PLUGINS: plugin_file_name = plugin_dir + '/' + plugin_name + '.conf' plugin_config = ConfigParser() try: result = plugin_config.read(plugin_file_name) except Exception as err: # Capture all errors during reading yum plugin conf file # report them and skip this conf file log.error( "Error during reading %s plugin config file '%s': %s. Skipping this file." % (pkg_mgr_name, plugin_file_name, err) ) continue if len(result) == 0: log.warn('Configuration file of %s plugin: "%s" cannot be read' % (pkg_mgr_name, plugin_file_name)) continue is_plugin_enabled = False if not plugin_config.has_section('main'): log.warning( 'Configuration file of %s plugin: "%s" does not include main section. Adding main section.' % (pkg_mgr_name, plugin_file_name) ) plugin_config.add_section('main') elif plugin_config.has_option('main', 'enabled'): try: # Options 'enabled' can be 0 or 1 is_plugin_enabled = plugin_config.getint('main', 'enabled') except ValueError: try: # Options 'enabled' can be also: true or false is_plugin_enabled = plugin_config.getboolean('main', 'enabled') except ValueError: log.warning( "File %s has wrong value of options: 'enabled' in section: 'main' (not a int nor boolean)" % plugin_file_name ) if is_plugin_enabled == cls.PLUGIN_ENABLED: log.debug('%s plugin: "%s" already enabled. Nothing to do.' % (pkg_mgr_name, plugin_file_name)) else: log.warning('Enabling %s plugin: "%s".' % (pkg_mgr_name, plugin_file_name)) # Change content of plugin configuration file and enable this plugin. with open(plugin_file_name, 'w') as cfg_file: plugin_config.set('main', 'enabled', cls.PLUGIN_ENABLED) plugin_config.write(cfg_file) enabled_lugins.append(plugin_file_name) return enabled_lugins
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)
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
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)
def _enable_plugins(cls, pkg_mgr_name, plugin_dir): """ This class method tries to enable plugins for DNF or YUM :param pkg_mgr_name: It can be "dnf" or "yum" :type pkg_mgr_name: str :param plugin_dir: Directory with configuration files for (dnf/yum) plugins :type plugin_dir: str :return: """ # List of successfully enabled plugins enabled_lugins = [] # Go through the list of yum plugins and try to find configuration # file of these plugins. for plugin_name in cls.PLUGINS: plugin_file_name = plugin_dir + '/' + plugin_name + '.conf' plugin_config = ConfigParser() try: result = plugin_config.read(plugin_file_name) except Exception as err: # Capture all errors during reading yum plugin conf file # report them and skip this conf file log.error( "Error during reading %s plugin config file '%s': %s. Skipping this file." % (pkg_mgr_name, plugin_file_name, err)) continue if len(result) == 0: log.info( 'Configuration file of %s plugin: "%s" cannot be read' % (pkg_mgr_name, plugin_file_name)) continue is_plugin_enabled = False if not plugin_config.has_section('main'): log.warning( 'Configuration file of %s plugin: "%s" does not include main section. Adding main section.' % (pkg_mgr_name, plugin_file_name)) plugin_config.add_section('main') elif plugin_config.has_option('main', 'enabled'): try: # Options 'enabled' can be 0 or 1 is_plugin_enabled = plugin_config.getint('main', 'enabled') except ValueError: try: # Options 'enabled' can be also: true or false is_plugin_enabled = plugin_config.getboolean( 'main', 'enabled') except ValueError: log.warning( "File %s has wrong value of options: 'enabled' in section: 'main' (not a int nor boolean)" % plugin_file_name) if is_plugin_enabled == cls.PLUGIN_ENABLED: log.debug('%s plugin: "%s" already enabled. Nothing to do.' % (pkg_mgr_name, plugin_file_name)) else: log.warning('Enabling %s plugin: "%s".' % (pkg_mgr_name, plugin_file_name)) # Change content of plugin configuration file and enable this plugin. with open(plugin_file_name, 'w') as cfg_file: plugin_config.set('main', 'enabled', cls.PLUGIN_ENABLED) plugin_config.write(cfg_file) enabled_lugins.append(plugin_file_name) return enabled_lugins
def get_packages_filenames(packages,with_depends=True,waptconfigfile=None,repo_name='wapt-templates',remoterepo=None,package_request=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() 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 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 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
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,
class Config: OUT_MKT_EDDN = 1 # OUT_MKT_BPC = 2 # No longer supported OUT_MKT_TD = 4 OUT_MKT_CSV = 8 OUT_SHIP = 16 OUT_SHIP_EDS = 16 # Replaced by OUT_SHIP # OUT_SYS_FILE = 32 # No longer supported # OUT_STAT = 64 # No longer available OUT_SHIP_CORIOLIS = 128 # Replaced by OUT_SHIP OUT_STATION_ANY = OUT_MKT_EDDN | OUT_MKT_TD | OUT_MKT_CSV | OUT_SHIP | OUT_SHIP_EDS | OUT_SHIP_CORIOLIS # OUT_SYS_EDSM = 256 # Now a plugin # OUT_SYS_AUTO = 512 # Now always automatic OUT_MKT_MANUAL = 1024 OUT_SYS_EDDN = 2048 OUT_SYS_DELAY = 4096 # shipyard setting SHIPYARD_EDSHIPYARD = 0 SHIPYARD_CORIOLIS = 1 if platform == 'darwin': def __init__(self): self.app_dir = join( NSSearchPathForDirectoriesInDomains( NSApplicationSupportDirectory, NSUserDomainMask, True)[0], appname) if not isdir(self.app_dir): mkdir(self.app_dir) self.plugin_dir = join(self.app_dir, 'plugins') if not isdir(self.plugin_dir): mkdir(self.plugin_dir) self.internal_plugin_dir = getattr( sys, 'frozen', False) and normpath( join( dirname( sys.executable.decode( sys.getfilesystemencoding())), pardir, 'Library', 'plugins')) or join( dirname(__file__), 'plugins') self.default_journal_dir = join( NSSearchPathForDirectoriesInDomains( NSApplicationSupportDirectory, NSUserDomainMask, True)[0], 'Frontier Developments', 'Elite Dangerous') self.home = expanduser('~') self.respath = getattr(sys, 'frozen', False) and normpath( join( dirname(sys.executable.decode( sys.getfilesystemencoding())), pardir, 'Resources')) or dirname(__file__) if not getattr(sys, 'frozen', False): # Don't use Python's settings if interactive self.identifier = 'uk.org.marginal.%s' % appname.lower() NSBundle.mainBundle().infoDictionary( )['CFBundleIdentifier'] = self.identifier else: self.identifier = NSBundle.mainBundle().bundleIdentifier() self.defaults = NSUserDefaults.standardUserDefaults() self.settings = dict( self.defaults.persistentDomainForName_(self.identifier) or {}) # make writeable # Check out_dir exists if not self.get('outdir') or not isdir(self.get('outdir')): self.set( 'outdir', NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, True)[0]) def get(self, key): val = self.settings.get(key) if val is None: return None elif hasattr(val, '__iter__'): return list(val) # make writeable else: return unicode(val) def getint(self, key): try: return int(self.settings.get( key, 0)) # should already be int, but check by casting except: return 0 def set(self, key, val): self.settings[key] = val def delete(self, key): self.settings.pop(key, None) def save(self): self.defaults.setPersistentDomain_forName_(self.settings, self.identifier) self.defaults.synchronize() def close(self): self.save() self.defaults = None elif platform == 'win32': def __init__(self): self.app_dir = join(KnownFolderPath(FOLDERID_LocalAppData), appname) if not isdir(self.app_dir): mkdir(self.app_dir) self.plugin_dir = join(self.app_dir, 'plugins') if not isdir(self.plugin_dir): mkdir(self.plugin_dir) self.internal_plugin_dir = join( dirname( getattr(sys, 'frozen', False) and sys.executable.decode(sys.getfilesystemencoding()) or __file__), u'plugins') # expanduser in Python 2 on Windows doesn't handle non-ASCII - http://bugs.python.org/issue13207 self.home = KnownFolderPath(FOLDERID_Profile) or u'\\' journaldir = KnownFolderPath(FOLDERID_SavedGames) self.default_journal_dir = journaldir and join( journaldir, 'Frontier Developments', 'Elite Dangerous') or None self.respath = dirname( getattr(sys, 'frozen', False) and sys.executable.decode(sys.getfilesystemencoding()) or __file__) self.identifier = applongname self.hkey = HKEY() disposition = DWORD() if RegCreateKeyEx(HKEY_CURRENT_USER, r'Software\Marginal\EDMarketConnector', 0, None, 0, KEY_ALL_ACCESS, None, ctypes.byref(self.hkey), ctypes.byref(disposition)): raise Exception() if disposition.value == REG_CREATED_NEW_KEY: # Migrate pre-1.3.4 registry location oldkey = HKEY() if not RegOpenKeyEx(HKEY_CURRENT_USER, r'Software\EDMarketConnector', 0, KEY_ALL_ACCESS, ctypes.byref(oldkey)): RegCopyTree(oldkey, None, self.hkey) RegCloseKey(oldkey) RegDeleteKey(HKEY_CURRENT_USER, r'Software\EDMarketConnector') # set WinSparkle defaults - https://github.com/vslavik/winsparkle/wiki/Registry-Settings sparklekey = HKEY() if not RegCreateKeyEx(self.hkey, 'WinSparkle', 0, None, 0, KEY_ALL_ACCESS, None, ctypes.byref(sparklekey), ctypes.byref(disposition)): if disposition.value == REG_CREATED_NEW_KEY: buf = ctypes.create_unicode_buffer('1') RegSetValueEx(sparklekey, 'CheckForUpdates', 0, 1, buf, len(buf) * 2) buf = ctypes.create_unicode_buffer( unicode(update_interval)) RegSetValueEx(sparklekey, 'UpdateInterval', 0, 1, buf, len(buf) * 2) RegCloseKey(sparklekey) if not self.get('outdir') or not isdir(self.get('outdir')): self.set('outdir', KnownFolderPath(FOLDERID_Documents) or self.home) def get(self, key): typ = DWORD() size = DWORD() if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), None, ctypes.byref(size)) or typ.value not in [ REG_SZ, REG_MULTI_SZ ]: return None buf = ctypes.create_unicode_buffer(size.value / 2) if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), buf, ctypes.byref(size)): return None elif typ.value == REG_MULTI_SZ: return [ x for x in ctypes.wstring_at(buf, len(buf) - 2).split(u'\x00') ] else: return unicode(buf.value) def getint(self, key): typ = DWORD() size = DWORD(4) val = DWORD() if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), ctypes.byref(val), ctypes.byref(size)) or typ.value != REG_DWORD: return 0 else: return val.value def set(self, key, val): if isinstance(val, basestring): buf = ctypes.create_unicode_buffer(val) RegSetValueEx(self.hkey, key, 0, REG_SZ, buf, len(buf) * 2) elif isinstance(val, numbers.Integral): RegSetValueEx(self.hkey, key, 0, REG_DWORD, ctypes.byref(DWORD(val)), 4) elif hasattr(val, '__iter__'): # iterable stringval = u'\x00'.join( [unicode(x) or u' ' for x in val] + [u'']) # null terminated non-empty strings buf = ctypes.create_unicode_buffer(stringval) RegSetValueEx(self.hkey, key, 0, REG_MULTI_SZ, buf, len(buf) * 2) else: raise NotImplementedError() def delete(self, key): RegDeleteValue(self.hkey, key) def save(self): pass # Redundant since registry keys are written immediately def close(self): RegCloseKey(self.hkey) self.hkey = None elif platform == 'linux2': SECTION = 'config' 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.internal_plugin_dir = join(dirname(__file__), 'plugins') self.default_journal_dir = None self.home = expanduser('~') self.respath = dirname(__file__) self.identifier = 'uk.org.marginal.%s' % appname.lower() 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(self.SECTION) if not self.get('outdir') or not isdir(self.get('outdir')): self.set('outdir', expanduser('~')) def get(self, key): try: val = self.config.get(self.SECTION, key) if u'\n' in val: return [self._unescape(x) for x in val.split(u'\n')[:-1]] else: return self._unescape(val) except: return None def getint(self, key): try: return self.config.getint(self.SECTION, key) except: return 0 def set(self, key, val): if isinstance(val, basestring) or isinstance( val, numbers.Integral): self.config.set(self.SECTION, key, self._escape(val)) elif hasattr(val, '__iter__'): # iterable self.config.set( self.SECTION, key, u'\n'.join([self._escape(x) for x in val] + [u';'])) else: raise NotImplementedError() def delete(self, key): self.config.remove_option(self.SECTION, key) def save(self): with codecs.open(self.filename, 'w', 'utf-8') as h: h.write(unicode(self.config.data)) def close(self): self.save() self.config = None def _escape(self, val): return unicode(val).replace(u'\\', u'\\\\').replace( u'\n', u'\\n').replace(u';', u'\\;') def _unescape(self, val): chars = list(val) i = 0 while i < len(chars): if chars[i] == '\\': chars.pop(i) if chars[i] == 'n': chars[i] = '\n' i += 1 return u''.join(chars) else: # ??? def __init__(self): raise NotImplementedError('Implement me') # Common def get_password(self, account): return keyring.get_password(self.identifier, account) def set_password(self, account, password): keyring.set_password(self.identifier, account, password) def delete_password(self, account): try: keyring.delete_password(self.identifier, account) except: pass # don't care - silently fail
class Config: OUT_MKT_EDDN = 1 OUT_MKT_BPC = 2 OUT_MKT_TD = 4 OUT_MKT_CSV = 8 OUT_SHIP_EDS = 16 # OUT_SYS_FILE = 32 # No longer supported # OUT_STAT = 64 # No longer available OUT_SHIP_CORIOLIS = 128 OUT_STATION_ANY = OUT_MKT_EDDN|OUT_MKT_BPC|OUT_MKT_TD|OUT_MKT_CSV|OUT_SHIP_EDS|OUT_SHIP_CORIOLIS OUT_SYS_EDSM = 256 # OUT_SYS_AUTO = 512 # Now always automatic OUT_MKT_MANUAL = 1024 OUT_SYS_EDDN = 2048 OUT_SYS_DELAY = 4096 if platform=='darwin': def __init__(self): self.app_dir = join(NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, True)[0], appname) if not isdir(self.app_dir): mkdir(self.app_dir) self.plugin_dir = join(self.app_dir, 'plugins') if not isdir(self.plugin_dir): mkdir(self.plugin_dir) self.default_journal_dir = join(NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, True)[0], 'Frontier Developments', 'Elite Dangerous') self.home = expanduser('~') self.respath = getattr(sys, 'frozen', False) and normpath(join(dirname(sys.executable), pardir, 'Resources')) or dirname(__file__) if not getattr(sys, 'frozen', False): # Don't use Python's settings if interactive self.bundle = 'uk.org.marginal.%s' % appname.lower() NSBundle.mainBundle().infoDictionary()['CFBundleIdentifier'] = self.bundle else: self.bundle = NSBundle.mainBundle().bundleIdentifier() self.defaults = NSUserDefaults.standardUserDefaults() self.settings = dict(self.defaults.persistentDomainForName_(self.bundle) or {}) # make writeable # Check out_dir exists if not self.get('outdir') or not isdir(self.get('outdir')): self.set('outdir', NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, True)[0]) def get(self, key): val = self.settings.get(key) if hasattr(val, '__iter__'): return list(val) # make writeable else: return val def getint(self, key): try: return int(self.settings.get(key, 0)) # should already be int, but check by casting except: return 0 def set(self, key, val): self.settings[key] = val def delete(self, key): self.settings.pop(key, None) def save(self): self.defaults.setPersistentDomain_forName_(self.settings, self.bundle) self.defaults.synchronize() def close(self): self.save() self.defaults = None elif platform=='win32': def __init__(self): self.app_dir = join(KnownFolderPath(FOLDERID_LocalAppData), appname) if not isdir(self.app_dir): mkdir(self.app_dir) self.plugin_dir = join(self.app_dir, 'plugins') if not isdir(self.plugin_dir): mkdir(self.plugin_dir) # expanduser in Python 2 on Windows doesn't handle non-ASCII - http://bugs.python.org/issue13207 self.home = KnownFolderPath(FOLDERID_Profile) or u'\\' journaldir = KnownFolderPath(FOLDERID_SavedGames) self.default_journal_dir = journaldir and join(journaldir, 'Frontier Developments', 'Elite Dangerous') or None self.respath = dirname(getattr(sys, 'frozen', False) and sys.executable or __file__) self.hkey = HKEY() disposition = DWORD() if RegCreateKeyEx(HKEY_CURRENT_USER, r'Software\Marginal\EDMarketConnector', 0, None, 0, KEY_ALL_ACCESS, None, ctypes.byref(self.hkey), ctypes.byref(disposition)): raise Exception() if disposition.value == REG_CREATED_NEW_KEY: # Migrate pre-1.3.4 registry location oldkey = HKEY() if not RegOpenKeyEx(HKEY_CURRENT_USER, r'Software\EDMarketConnector', 0, KEY_ALL_ACCESS, ctypes.byref(oldkey)): RegCopyTree(oldkey, None, self.hkey) RegCloseKey(oldkey) RegDeleteKey(HKEY_CURRENT_USER, r'Software\EDMarketConnector') # set WinSparkle defaults - https://github.com/vslavik/winsparkle/wiki/Registry-Settings sparklekey = HKEY() if not RegCreateKeyEx(self.hkey, 'WinSparkle', 0, None, 0, KEY_ALL_ACCESS, None, ctypes.byref(sparklekey), ctypes.byref(disposition)): if disposition.value == REG_CREATED_NEW_KEY: buf = ctypes.create_unicode_buffer('1') RegSetValueEx(sparklekey, 'CheckForUpdates', 0, 1, buf, len(buf)*2) buf = ctypes.create_unicode_buffer(unicode(update_interval)) RegSetValueEx(sparklekey, 'UpdateInterval', 0, 1, buf, len(buf)*2) RegCloseKey(sparklekey) if not self.get('outdir') or not isdir(self.get('outdir')): self.set('outdir', KnownFolderPath(FOLDERID_Documents)) def get(self, key): typ = DWORD() size = DWORD() if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), None, ctypes.byref(size)) or typ.value not in [REG_SZ, REG_MULTI_SZ]: return None buf = ctypes.create_unicode_buffer(size.value / 2) if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), buf, ctypes.byref(size)): return None elif typ.value == REG_MULTI_SZ: return [x.strip() for x in ctypes.wstring_at(buf, len(buf)-2).split(u'\x00')] else: return buf.value def getint(self, key): typ = DWORD() size = DWORD(4) val = DWORD() if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), ctypes.byref(val), ctypes.byref(size)) or typ.value != REG_DWORD: return 0 else: return val.value def set(self, key, val): if isinstance(val, basestring): buf = ctypes.create_unicode_buffer(val) RegSetValueEx(self.hkey, key, 0, REG_SZ, buf, len(buf)*2) elif isinstance(val, numbers.Integral): RegSetValueEx(self.hkey, key, 0, REG_DWORD, ctypes.byref(DWORD(val)), 4) elif hasattr(val, '__iter__'): # iterable stringval = u'\x00'.join([unicode(x) or u' ' for x in val] + [u'']) # null terminated non-empty strings buf = ctypes.create_unicode_buffer(stringval) RegSetValueEx(self.hkey, key, 0, REG_MULTI_SZ, buf, len(buf)*2) else: raise NotImplementedError() def delete(self, key): RegDeleteValue(self.hkey, key) def save(self): pass # Redundant since registry keys are written immediately def close(self): RegCloseKey(self.hkey) self.hkey = None elif platform=='linux2': SECTION = 'config' 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.default_journal_dir = None 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(self.SECTION) if not self.get('outdir') or not isdir(self.get('outdir')): self.set('outdir', expanduser('~')) def get(self, key): try: val = self.config.get(self.SECTION, key) if u'\n' in val: return val.split(u'\n') else: return val except: return None def getint(self, key): try: return self.config.getint(self.SECTION, key) except: return 0 def set(self, key, val): if isinstance(val, basestring) or isinstance(val, numbers.Integral): self.config.set(self.SECTION, key, val) elif hasattr(val, '__iter__'): # iterable self.config.set(self.SECTION, key, u'\n'.join([unicode(x) for x in val])) else: raise NotImplementedError() def delete(self, key): self.config.remove_option(self.SECTION, key) def save(self): with codecs.open(self.filename, 'w', 'utf-8') as h: h.write(unicode(self.config.data)) def close(self): self.save() self.config = None else: # ??? def __init__(self): raise NotImplementedError('Implement me')
class Config: OUT_EDDN = 1 OUT_BPC = 2 OUT_TD = 4 OUT_CSV = 8 OUT_SHIP_EDS = 16 OUT_LOG_FILE = 32 #OUT_STAT = 64 # No longer available OUT_SHIP_CORIOLIS = 128 OUT_LOG_EDSM = 256 OUT_LOG_AUTO = 512 if platform=='darwin': def __init__(self): self.app_dir = join(NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, True)[0], appname) if not isdir(self.app_dir): mkdir(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 = getattr(sys, 'frozen', False) and normpath(join(dirname(sys.executable), pardir, 'Resources')) or dirname(__file__) if not getattr(sys, 'frozen', False): # Don't use Python's settings if interactive self.bundle = 'uk.org.marginal.%s' % appname.lower() NSBundle.mainBundle().infoDictionary()['CFBundleIdentifier'] = self.bundle self.bundle = NSBundle.mainBundle().bundleIdentifier() self.defaults = NSUserDefaults.standardUserDefaults() settings = self.defaults.persistentDomainForName_(self.bundle) or {} self.settings = dict(settings) # Check out_dir exists if not self.get('outdir') or not isdir(self.get('outdir')): self.set('outdir', NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, True)[0]) def get(self, key): return self.settings.get(key) def getint(self, key): try: return int(self.settings.get(key, 0)) # should already be int, but check by casting except: return 0 def set(self, key, val): self.settings[key] = val def save(self): self.defaults.setPersistentDomain_forName_(self.settings, self.bundle) self.defaults.synchronize() def close(self): self.save() self.defaults = None elif platform=='win32': def __init__(self): buf = ctypes.create_unicode_buffer(MAX_PATH) ctypes.windll.shell32.SHGetSpecialFolderPathW(0, buf, CSIDL_LOCAL_APPDATA, 0) self.app_dir = join(buf.value, appname) if not isdir(self.app_dir): mkdir(self.app_dir) self.plugin_dir = join(self.app_dir, 'plugins') if not isdir(self.plugin_dir): mkdir(self.plugin_dir) # expanduser in Python 2 on Windows doesn't handle non-ASCII - http://bugs.python.org/issue13207 ctypes.windll.shell32.SHGetSpecialFolderPathW(0, buf, CSIDL_PROFILE, 0) self.home = buf.value self.respath = dirname(getattr(sys, 'frozen', False) and sys.executable or __file__) self.hkey = HKEY() disposition = DWORD() if RegCreateKeyEx(HKEY_CURRENT_USER, r'Software\Marginal\EDMarketConnector', 0, None, 0, KEY_ALL_ACCESS, None, ctypes.byref(self.hkey), ctypes.byref(disposition)): raise Exception() if disposition.value == REG_CREATED_NEW_KEY: # Migrate pre-1.3.4 registry location oldkey = HKEY() if not RegOpenKeyEx(HKEY_CURRENT_USER, r'Software\EDMarketConnector', 0, KEY_ALL_ACCESS, ctypes.byref(oldkey)): RegCopyTree(oldkey, None, self.hkey) RegCloseKey(oldkey) RegDeleteKey(HKEY_CURRENT_USER, r'Software\EDMarketConnector') # set WinSparkle defaults - https://github.com/vslavik/winsparkle/wiki/Registry-Settings sparklekey = HKEY() if not RegCreateKeyEx(self.hkey, 'WinSparkle', 0, None, 0, KEY_ALL_ACCESS, None, ctypes.byref(sparklekey), ctypes.byref(disposition)): if disposition.value == REG_CREATED_NEW_KEY: buf = ctypes.create_unicode_buffer('1') RegSetValueEx(sparklekey, 'CheckForUpdates', 0, 1, buf, len(buf)*2) buf = ctypes.create_unicode_buffer(unicode(update_interval)) RegSetValueEx(sparklekey, 'UpdateInterval', 0, 1, buf, len(buf)*2) RegCloseKey(sparklekey) if not self.get('outdir') or not isdir(self.get('outdir')): buf = ctypes.create_unicode_buffer(MAX_PATH) ctypes.windll.shell32.SHGetSpecialFolderPathW(0, buf, CSIDL_PERSONAL, 0) self.set('outdir', buf.value) def get(self, key): typ = DWORD() size = DWORD() if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), None, ctypes.byref(size)) or typ.value != REG_SZ: return None buf = ctypes.create_unicode_buffer(size.value / 2) if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), buf, ctypes.byref(size)): return None else: return buf.value def getint(self, key): typ = DWORD() size = DWORD(4) val = DWORD() if RegQueryValueEx(self.hkey, key, 0, ctypes.byref(typ), ctypes.byref(val), ctypes.byref(size)) or typ.value != REG_DWORD: return 0 else: return val.value def set(self, key, val): if isinstance(val, basestring): buf = ctypes.create_unicode_buffer(val) RegSetValueEx(self.hkey, key, 0, REG_SZ, buf, len(buf)*2) elif isinstance(val, numbers.Integral): RegSetValueEx(self.hkey, key, 0, REG_DWORD, ctypes.byref(DWORD(val)), 4) else: raise NotImplementedError() def save(self): pass # Redundant since registry keys are written immediately def close(self): RegCloseKey(self.hkey) self.hkey = None elif platform=='linux2': 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 set(self, key, val): assert isinstance(val, basestring) or isinstance(val, numbers.Integral), type(val) self.config.set('config', key, val) def get(self, key): try: return self.config.get('config', key) # all values are stored as strings except: return None def getint(self, key): try: return int(self.config.get('config', key)) # all values are stored as strings except: return 0 def save(self): h = codecs.open(self.filename, 'w', 'utf-8') h.write(unicode(self.config.data)) h.close() def close(self): self.save() self.config = None else: # ??? def __init__(self): raise NotImplementedError('Implement me')
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)