From e5a30424d51f9c20cd0ec6cd3e515ac5509a9287 Mon Sep 17 00:00:00 2001 From: Jaroslav Rohel Date: Thu, 18 Jul 2019 09:50:43 +0200 Subject: [PATCH 1/6] [config-manager] --setopt: Fix crash with "--save --dump" (RhBug:1702678) Removes useless code which only causes crash. Example of crash: dnf config-manager --save --dump --setopt=fedora.gpgcheck=1 fedora ============================================================== repo: fedora ============================================================== Error: Error parsing '['1']': Wrong number or type of arguments for overloaded function 'OptionChildBool_set'. Possible C/C++ prototypes are: libdnf::OptionChild< libdnf::OptionBool >::set(libdnf::Option::Priority,libdnf::OptionBool::ValueType const &) libdnf::OptionChild< libdnf::OptionBool >::set(libdnf::Option::Priority,std::string const &) --- plugins/config_manager.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/plugins/config_manager.py b/plugins/config_manager.py index 38fd51d..6db1bcb 100644 --- a/plugins/config_manager.py +++ b/plugins/config_manager.py @@ -90,8 +90,6 @@ class ConfigManagerCommand(dnf.cli.Command): self.base.conf.write_raw_configfile(dnf.const.CONF_FILENAME, 'main', sbc.substitutions, modify) if self.opts.dump: print(self.base.output.fmtSection('main')) - for name, val in modify.items(): - sbc._set_value(name, val) print(self.base.conf.dump()) if self.opts.set_enabled or self.opts.set_disabled: @@ -120,9 +118,6 @@ class ConfigManagerCommand(dnf.cli.Command): self.base.conf.write_raw_configfile(repo.repofile, repo.id, sbc.substitutions, repo_modify) if self.opts.dump: print(self.base.output.fmtSection('repo: ' + repo.id)) - for name, val in repo_modify.items(): - if repo._has_option(name): - repo._set_value(name, val) print(repo.dump()) def add_repo(self): -- 2.21.0 From f096fe3e88884f8cc212bfcee5549bfc6b8a3ad0 Mon Sep 17 00:00:00 2001 From: Jaroslav Rohel Date: Wed, 10 Jul 2019 09:21:37 +0200 Subject: [PATCH 2/6] [config-manager] --setopt: Add globs support to repoid (RhBug:1702678) Set key in all repositories whose id starts with "updates-testing": dnf config-manager --save --setopt=updates-testing*.skip_if_unavailable=true --- plugins/config_manager.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/config_manager.py b/plugins/config_manager.py index 6db1bcb..dedcc82 100644 --- a/plugins/config_manager.py +++ b/plugins/config_manager.py @@ -23,6 +23,7 @@ from dnfpluginscore import _, logger, P_ import dnf import dnf.cli import dnf.pycomp +import fnmatch import os import re import shutil @@ -111,9 +112,10 @@ class ConfigManagerCommand(dnf.cli.Command): repo_modify['enabled'] = "1" elif self.opts.set_disabled: repo_modify['enabled'] = "0" - if (hasattr(self.opts, 'repo_setopts') - and repo.id in self.opts.repo_setopts): - repo_modify.update(self.opts.repo_setopts[repo.id]) + if hasattr(self.opts, 'repo_setopts'): + for repoid, setopts in self.opts.repo_setopts.items(): + if fnmatch.fnmatch(repo.id, repoid): + repo_modify.update(setopts) if self.opts.save and repo_modify: self.base.conf.write_raw_configfile(repo.repofile, repo.id, sbc.substitutions, repo_modify) if self.opts.dump: -- 2.21.0 From c2ef00188a7ec911a5efc36d3df0cceae5a682c1 Mon Sep 17 00:00:00 2001 From: Jaroslav Rohel Date: Tue, 16 Jul 2019 13:32:39 +0200 Subject: [PATCH 3/6] [config-manager] --setopt=key=value is not applied to repositories config (RhBug:1702678) The command "dnf config-manager --setopt=key=value repo1 main" set key value in repo1 and global config before the patch. It was inconsistent with the rest of DNF because "--setopt=key=value" means to set key in global config only. To set key in repos we can use "--setopt=*.key=value". --- plugins/config_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/config_manager.py b/plugins/config_manager.py index dedcc82..1dcf085 100644 --- a/plugins/config_manager.py +++ b/plugins/config_manager.py @@ -107,7 +107,7 @@ class ConfigManagerCommand(dnf.cli.Command): raise dnf.exceptions.Error(_("No matching repo to modify: %s.") % ', '.join(self.opts.crepo)) for repo in sorted(matched): - repo_modify = dict(modify) # create local copy + repo_modify = {} if self.opts.set_enabled: repo_modify['enabled'] = "1" elif self.opts.set_disabled: -- 2.21.0 From 3af60a1613877ad2fd090a83ba9da00623a00818 Mon Sep 17 00:00:00 2001 From: Jaroslav Rohel Date: Tue, 16 Jul 2019 14:05:54 +0200 Subject: [PATCH 4/6] [config-manager] --setopt and empty list of repositories (RhBug:1702678) This: "dnf config-manager --save --setopts=repo1.key1=value1 --setopt=repo2.key2=value2 repo1 repo2" can be replaced by this now: "dnf config-manager --save --setopts=repo1.key1=value1 --setopt=repo2.key2=value2" Empty list of repositories allowed to change only the global configuration before. Now empty list of repositories means that setopt works for any repository too. Better compatibility with YUM. It solves : https://bugzilla.redhat.com/show_bug.cgi?id=1702678 --- plugins/config_manager.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/config_manager.py b/plugins/config_manager.py index 1dcf085..41b36fa 100644 --- a/plugins/config_manager.py +++ b/plugins/config_manager.py @@ -96,12 +96,16 @@ class ConfigManagerCommand(dnf.cli.Command): if self.opts.set_enabled or self.opts.set_disabled: self.opts.save = True + matched = [] if self.opts.crepo: - matched = [] for name in self.opts.crepo: matched.extend(self.base.repos.get_matching(name)) else: - return + if hasattr(self.opts, 'repo_setopts'): + for name in self.opts.repo_setopts.keys(): + matched.extend(self.base.repos.get_matching(name)) + if not matched: + return if not matched: raise dnf.exceptions.Error(_("No matching repo to modify: %s.") -- 2.21.0 From 27205851a592a3383a7592d87ceee5b69c9dfb70 Mon Sep 17 00:00:00 2001 From: Jaroslav Rohel Date: Tue, 16 Jul 2019 15:51:38 +0200 Subject: [PATCH 5/6] [config-manager] --setopt: Add check for existence of input repositories (RhBug:1702678) Examples: dnf config-manager --save --setopt=non_existent.key=value Error: No matching repo to modify: non_existent. dnf config-manager --save --setopt=non_existent*.key=value Error: No matching repo to modify: non_existent*. None change in configuration is done after the error. --- plugins/config_manager.py | 44 ++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/plugins/config_manager.py b/plugins/config_manager.py index 41b36fa..83d58be 100644 --- a/plugins/config_manager.py +++ b/plugins/config_manager.py @@ -78,6 +78,31 @@ class ConfigManagerCommand(dnf.cli.Command): def modify_repo(self): """ process --set-enabled, --set-disabled and --setopt options """ + matching_repos = [] # list of matched repositories + not_matching_repos_id = set() # IDs of not matched repositories + + def match_repos(key, add_matching_repos): + matching = self.base.repos.get_matching(key) + if not matching: + not_matching_repos_id.add(name) + elif add_matching_repos: + matching_repos.extend(matching) + + if self.opts.crepo: + for name in self.opts.crepo: + match_repos(name, True) + if hasattr(self.opts, 'repo_setopts'): + for name in self.opts.repo_setopts.keys(): + match_repos(name, False) + else: + if hasattr(self.opts, 'repo_setopts'): + for name in self.opts.repo_setopts.keys(): + match_repos(name, True) + + if not_matching_repos_id: + raise dnf.exceptions.Error(_("No matching repo to modify: %s.") + % ', '.join(not_matching_repos_id)) + sbc = self.base.conf modify = {} if hasattr(self.opts, 'main_setopts') and self.opts.main_setopts: @@ -93,24 +118,13 @@ class ConfigManagerCommand(dnf.cli.Command): print(self.base.output.fmtSection('main')) print(self.base.conf.dump()) + if not matching_repos: + return + if self.opts.set_enabled or self.opts.set_disabled: self.opts.save = True - matched = [] - if self.opts.crepo: - for name in self.opts.crepo: - matched.extend(self.base.repos.get_matching(name)) - else: - if hasattr(self.opts, 'repo_setopts'): - for name in self.opts.repo_setopts.keys(): - matched.extend(self.base.repos.get_matching(name)) - if not matched: - return - - if not matched: - raise dnf.exceptions.Error(_("No matching repo to modify: %s.") - % ', '.join(self.opts.crepo)) - for repo in sorted(matched): + for repo in sorted(matching_repos): repo_modify = {} if self.opts.set_enabled: repo_modify['enabled'] = "1" -- 2.21.0 From f7d1fa8e5f657b3cc8ed60acdeaa02f6b725312a Mon Sep 17 00:00:00 2001 From: Jaroslav Rohel Date: Thu, 18 Jul 2019 12:13:43 +0200 Subject: [PATCH 6/6] [config-manager] Update documentation (RhBug:1702678) --- doc/config_manager.rst | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/doc/config_manager.rst b/doc/config_manager.rst index 2feafcb..80ee0fa 100644 --- a/doc/config_manager.rst +++ b/doc/config_manager.rst @@ -19,22 +19,25 @@ DNF config-manager Plugin ========================== -Manage main DNF configuration options, toggle which +Manage main and repository DNF configuration options, toggle which repositories are enabled or disabled, and add new repositories. -------- Synopsis -------- -``dnf config-manager [options] ...`` +``dnf config-manager [options]
...`` --------- Arguments --------- -```` - Display / modify a repository identified by . If not specified, display / modify - main DNF configuration. Repositories can be specified using globs. +``
`` + This argument can be used to explicitly select the configuration sections to manage. + A section can either be ``main`` or a repoid. + If not specified, the program will select the ``main`` section and each repoid + used within any ``--setopt`` options. + A repoid can be specified using globs. ------- Options @@ -51,13 +54,17 @@ Options Print dump of current configuration values to stdout. ``--set-disabled``, ``--disable`` - Disable the specified repos (automatically saves). + Disable the specified repos (implies ``--save``). ``--set-enabled``, ``--enable`` - Enable the specified repos (automatically saves). + Enable the specified repos (implies ``--save``). ``--save`` - Save the current options (useful with --setopt). + Save the current options (useful with ``--setopt``). + +``--setopt=