def mod_repo(repo, **kwargs): ''' Modify one or more values for a repo. If the repo does not exist, it will be created, so long as the following values are specified: repo or alias alias by which the zypper refers to the repo url, mirrorlist or baseurl the URL for zypper to reference enabled enable or disable (True or False) repository, but do not remove if disabled. refresh enable or disable (True or False) auto-refresh of the repository. cache Enable or disable (True or False) RPM files caching. gpgcheck Enable or disable (True or False) GOG check for this repository. gpgautoimport Automatically trust and import new repository. Key/Value pairs may also be removed from a repo's configuration by setting a key to a blank value. Bear in mind that a name cannot be deleted, and a url can only be deleted if a mirrorlist is specified (or vice versa). CLI Examples: .. code-block:: bash salt '*' pkg.mod_repo alias alias=new_alias salt '*' pkg.mod_repo alias url= mirrorlist=http://host.com/ ''' repos_cfg = _get_configured_repos() added = False # An attempt to add new one? if repo not in repos_cfg.sections(): url = kwargs.get('url', kwargs.get('mirrorlist', kwargs.get('baseurl'))) if not url: raise CommandExecutionError( 'Repository \'{0}\' not found, and neither \'baseurl\' nor ' '\'mirrorlist\' was specified'.format(repo)) if not _urlparse(url).scheme: raise CommandExecutionError( 'Repository \'{0}\' not found and URL for baseurl/mirrorlist ' 'is malformed'.format(repo)) # Is there already such repo under different alias? for alias in repos_cfg.sections(): repo_meta = _get_repo_info(alias, repos_cfg=repos_cfg) # Complete user URL, in case it is not new_url = _urlparse(url) if not new_url.path: new_url = _urlparse.ParseResult( scheme=new_url.scheme, # pylint: disable=E1123 netloc=new_url.netloc, path='/', params=new_url.params, query=new_url.query, fragment=new_url.fragment) base_url = _urlparse(repo_meta['baseurl']) if new_url == base_url: raise CommandExecutionError( 'Repository \'{0}\' already exists as \'{1}\'.'.format( repo, alias)) # Add new repo __zypper__.xml.call('ar', url, repo) # Verify the repository has been added repos_cfg = _get_configured_repos() if repo not in repos_cfg.sections(): raise CommandExecutionError( 'Failed add new repository \'{0}\' for unspecified reason. ' 'Please check zypper logs.'.format(repo)) added = True # Modify added or existing repo according to the options cmd_opt = [] global_cmd_opt = [] call_refresh = False if 'enabled' in kwargs: cmd_opt.append(kwargs['enabled'] and '--enable' or '--disable') if 'refresh' in kwargs: cmd_opt.append(kwargs['refresh'] and '--refresh' or '--no-refresh') if 'cache' in kwargs: cmd_opt.append(kwargs['cache'] and '--keep-packages' or '--no-keep-packages') if 'gpgcheck' in kwargs: cmd_opt.append(kwargs['gpgcheck'] and '--gpgcheck' or '--no-gpgcheck') if 'priority' in kwargs: cmd_opt.append("--priority={0}".format( kwargs.get('priority', DEFAULT_PRIORITY))) if 'humanname' in kwargs: cmd_opt.append("--name='{0}'".format(kwargs.get('humanname'))) if kwargs.get('gpgautoimport') is True: global_cmd_opt.append('--gpg-auto-import-keys') call_refresh = True if cmd_opt: cmd_opt = global_cmd_opt + ['mr'] + cmd_opt + [repo] __zypper__.refreshable.xml.call(*cmd_opt) if call_refresh: # when used with "zypper ar --refresh" or "zypper mr --refresh" # --gpg-auto-import-keys is not doing anything # so we need to specifically refresh here with --gpg-auto-import-keys refresh_opts = global_cmd_opt + ['refresh'] + [repo] __zypper__.xml.call(*refresh_opts) elif not added and not cmd_opt: raise CommandExecutionError( 'Specified arguments did not result in modification of repo') return get_repo(repo)
def mod_repo(repo, **kwargs): ''' Modify one or more values for a repo. If the repo does not exist, it will be created, so long as the following values are specified: repo or alias alias by which the zypper refers to the repo url, mirrorlist or baseurl the URL for zypper to reference enabled enable or disable (True or False) repository, but do not remove if disabled. refresh enable or disable (True or False) auto-refresh of the repository. cache Enable or disable (True or False) RPM files caching. gpgcheck Enable or disable (True or False) GOG check for this repository. gpgautoimport Automatically trust and import new repository. Key/Value pairs may also be removed from a repo's configuration by setting a key to a blank value. Bear in mind that a name cannot be deleted, and a url can only be deleted if a mirrorlist is specified (or vice versa). CLI Examples: .. code-block:: bash salt '*' pkg.mod_repo alias alias=new_alias salt '*' pkg.mod_repo alias url= mirrorlist=http://host.com/ ''' repos_cfg = _get_configured_repos() added = False # An attempt to add new one? if repo not in repos_cfg.sections(): url = kwargs.get('url', kwargs.get('mirrorlist', kwargs.get('baseurl'))) if not url: raise CommandExecutionError( 'Repository \'{0}\' not found, and neither \'baseurl\' nor ' '\'mirrorlist\' was specified'.format(repo)) if not _urlparse(url).scheme: raise CommandExecutionError( 'Repository \'{0}\' not found and URL for baseurl/mirrorlist ' 'is malformed'.format(repo)) # Is there already such repo under different alias? for alias in repos_cfg.sections(): repo_meta = _get_repo_info(alias, repos_cfg=repos_cfg) # Complete user URL, in case it is not new_url = _urlparse(url) if not new_url.path: new_url = _urlparse.ParseResult( scheme=new_url.scheme, # pylint: disable=E1123 netloc=new_url.netloc, path='/', params=new_url.params, query=new_url.query, fragment=new_url.fragment) base_url = _urlparse(repo_meta['baseurl']) if new_url == base_url: raise CommandExecutionError( 'Repository \'{0}\' already exists as \'{1}\'.'.format( repo, alias)) # Add new repo doc = None try: # Try to parse the output and find the error, # but this not always working (depends on Zypper version) ret = __salt__['cmd.run'](_zypper('-x', 'ar', url, repo), output_loglevel='trace', python_shell=False) doc = dom.parseString(_zypper_check_result(ret, xml=True)) except Exception: # No XML out available, but the the result is still unknown pass if doc: msg_nodes = doc.getElementsByTagName('message') if msg_nodes: msg_node = msg_nodes[0] if msg_node.getAttribute('type') == 'error': raise CommandExecutionError( msg_node.childNodes[0].nodeValue) # Verify the repository has been added repos_cfg = _get_configured_repos() if repo not in repos_cfg.sections(): raise CommandExecutionError( 'Failed add new repository \'{0}\' for unspecified reason. ' 'Please check zypper logs.'.format(repo)) added = True # Modify added or existing repo according to the options cmd_opt = [] if 'enabled' in kwargs: cmd_opt.append(kwargs['enabled'] and '--enable' or '--disable') if 'refresh' in kwargs: cmd_opt.append(kwargs['refresh'] and '--refresh' or '--no-refresh') if 'cache' in kwargs: cmd_opt.append(kwargs['cache'] and '--keep-packages' or '--no-keep-packages') if 'gpgcheck' in kwargs: cmd_opt.append(kwargs['gpgcheck'] and '--gpgcheck' or '--no-gpgcheck') if kwargs.get('gpgautoimport') is True: cmd_opt.append('--gpg-auto-import-keys') if 'priority' in kwargs: cmd_opt.append("--priority='{0}'".format( kwargs.get('priority', DEFAULT_PRIORITY))) if 'humanname' in kwargs: cmd_opt.append("--name='{0}'".format(kwargs.get('humanname'))) if cmd_opt: cmd_opt.append(repo) ret = __salt__['cmd.run_all'](_zypper('-x', 'mr', *cmd_opt), python_shell=False, output_loglevel='trace') _zypper_check_result(ret, xml=True) # If repo nor added neither modified, error should be thrown if not added and not cmd_opt: raise CommandExecutionError( 'Specified arguments did not result in modification of repo') return get_repo(repo)