[Yum-devel] [PATCH] Move protect-packages plugin into core, and fix some bugs in it. Added some docs. for yum.conf => protected_packages, and yum on the remove command.

Seth Vidal skvidal at fedoraproject.org
Tue Apr 27 20:48:57 UTC 2010



On Tue, 27 Apr 2010, James Antill wrote:

> Add parse_default to Option, ListOption, UrlListOption ... so we can
> use the .parse() behaviour.
>
> Default: yum, glob:/etc/yum/protected.d/*.conf
> Created dir. and owned it.
> ---
> docs/yum.8      |    3 +++
> docs/yum.conf.5 |    8 ++++++++
> etc/Makefile    |    1 +
> yum.spec        |    1 +
> yum/__init__.py |   39 +++++++++++++++++++++++++++++++++++++++
> yum/config.py   |   16 +++++++++++-----
> 6 files changed, 63 insertions(+), 5 deletions(-)
>
> diff --git a/docs/yum.8 b/docs/yum.8
> index 14622b5..f9eb7fd 100644
> --- a/docs/yum.8
> +++ b/docs/yum.8
> @@ -138,6 +138,9 @@ Are used to remove the specified packages from the system
> as well as removing any packages which depend on the package being
> removed\&. remove operates on groups, files, provides and filelists just like
> the "install" command\&.(See \fBSpecifying package names\fP for more information)
> +
> +Note that "yum" is included in the protected_packages configuration, by default.
> +So you can't accidentally remove yum itself.
> .IP
> .IP "\fBlist\fP"
> Is used to list various information about available
> diff --git a/docs/yum.conf.5 b/docs/yum.conf.5
> index 8200d43..5f1a5c7 100644
> --- a/docs/yum.conf.5
> +++ b/docs/yum.conf.5
> @@ -62,6 +62,14 @@ Debug scriptlet output level. 'info' is the default, other
> options are: 'critical', 'emergency', 'error', 'warn' and 'debug'.
>
> .IP
> +\fBprotected_packages\fR
> +This is a list of packages that yum should never completely remove. They are
> +protected via. Obsoletes as well as user/plugin removals.
> +
> +The default is: yum glob:/etc/yum/protected.d/*.conf
> +So any packages which should be protected can do so by including a file in
> +/etc/yum/protected.d with their package name in it.
> +.IP
> \fBlogfile\fR
> Full directory and file name for where yum should write its log file.
>
> diff --git a/etc/Makefile b/etc/Makefile
> index 91b1791..a512cdf 100644
> --- a/etc/Makefile
> +++ b/etc/Makefile
> @@ -8,6 +8,7 @@ clean:
>
> install:
> 	mkdir -p $(DESTDIR)/etc/yum/
> +	mkdir -p $(DESTDIR)/etc/yum/protected.d
> 	mkdir -p $(DESTDIR)/etc/yum/repos.d
> 	mkdir -p $(DESTDIR)/etc/yum/vars
>
> diff --git a/yum.spec b/yum.spec
> index a559eda..909354e 100644
> --- a/yum.spec
> +++ b/yum.spec
> @@ -87,6 +87,7 @@ exit 0
> %config(noreplace) %{_sysconfdir}/yum/yum.conf
> %config(noreplace) %{_sysconfdir}/yum/version-groups.conf
> %dir %{_sysconfdir}/yum
> +%dir %{_sysconfdir}/yum/protected.d
> %dir %{_sysconfdir}/yum/repos.d
> %dir %{_sysconfdir}/yum/vars
> %config %{_sysconfdir}/logrotate.d/%{name}
> diff --git a/yum/__init__.py b/yum/__init__.py
> index dbe08ee..a41079a 100644
> --- a/yum/__init__.py
> +++ b/yum/__init__.py
> @@ -888,6 +888,45 @@ class YumBase(depsolve.Depsolve):
>
>         if self.tsInfo.pkgSack is not None: # rm Transactions don't have pkgSack
>             self.tsInfo.pkgSack.dropCachedData()
> +
> +        #  This is a version of the old "protect-packages" plugin, it allows
> +        # you to erase duplicates and do remove+install.
> +        #  But we don't allow you to turn it off!:)
> +        protect_states = [TS_OBSOLETED, TS_ERASE]
> +        txmbrs = []
> +        if rescode == 2 and self.conf.protected_packages:
> +            protected = set(self.conf.protected_packages)
> +            txmbrs = self.tsInfo.getMembersWithState(None, protect_states)
> +        bad_togo = {}
> +        for txmbr in txmbrs:
> +            if txmbr.name not in protected:
> +                continue
> +            if txmbr.name not in bad_togo:
> +                bad_togo[txmbr.name] = []
> +            bad_togo[txmbr.name].append(txmbr.pkgtup)
> +        for ipkg in self.rpmdb.searchNames(bad_togo.keys()):
> +            if ipkg.name not in bad_togo:
> +                continue
> +            # If there is at least one version not being removed, allow it
> +            if ipkg.pkgtup not in bad_togo[ipkg.name]:
> +                del bad_togo[ipkg.name]
> +        for pkgname in bad_togo.keys():
> +            for txmbr in self.tsInfo.matchNaevr(name=pkgname):
> +                if txmbr.name not in bad_togo:
> +                    continue
> +                if txmbr.pkgtup in bad_togo[ipkg.name]:
> +                    continue
> +                # If we are installing one version we aren't removing, allow it
> +                if txmbr.output_state in TS_INSTALL_STATES:
> +                    del bad_togo[ipkg.name]
> +
> +        if bad_togo:
> +            rescode = 1
> +            restring = []
> +            for pkgname in sorted(bad_togo):
> +                restring.append(_('Trying to remove "%s", which is protected') %
> +                                pkgname)
> +
>         self.rpmdb.dropCachedData()
>
>         self.verbose_logger.debug('Depsolve time: %0.3f' % (time.time() - ds_st))
> diff --git a/yum/config.py b/yum/config.py
> index 37d4d10..1b78fcd 100644
> --- a/yum/config.py
> +++ b/yum/config.py
> @@ -55,9 +55,11 @@ class Option(object):
>     definition easy and consise.
>     '''
>
> -    def __init__(self, default=None):
> +    def __init__(self, default=None, parse_default=False):
>         self._setattrname()
>         self.inherit = False
> +        if parse_default:
> +            default = self.parse(default)
>         self.default = default
>
>     def _setattrname(self):
> @@ -155,10 +157,10 @@ class ListOption(Option):
>     An option containing a list of strings.
>     """
>
> -    def __init__(self, default=None):
> +    def __init__(self, default=None, parse_default=False):
>         if default is None:
>             default = []
> -        super(ListOption, self).__init__(default)
> +        super(ListOption, self).__init__(default, parse_default)
>
>     def parse(self, s):
>         """Converts a string from the config file to a workable list, parses
> @@ -226,8 +228,9 @@ class UrlListOption(ListOption):
>     Option for handling lists of URLs with validation of the URL scheme.
>     '''
>
> -    def __init__(self, default=None, schemes=('http', 'ftp', 'file', 'https')):
> -        super(UrlListOption, self).__init__(default)
> +    def __init__(self, default=None, schemes=('http', 'ftp', 'file', 'https'),
> +                 parse_default=False):
> +        super(UrlListOption, self).__init__(default, parse_default)
>
>         # Hold a UrlOption instance to assist with parsing
>         self._urloption = UrlOption(schemes=schemes)
> @@ -730,6 +733,9 @@ class YumConf(StartupConf):
>
>     rpmverbosity = Option('info')
>
> +    protected_packages = ListOption("yum, glob:/etc/yum/protected.d/*.conf",
> +                                    parse_default=True)
> +
>     _reposlist = []
>
>     def dump(self):
> -- 
> 1.7.0.1

ACK

-sv



More information about the Yum-devel mailing list