Git Product home page Git Product logo

voxpupuli / puppet-yum Goto Github PK

View Code? Open in Web Editor NEW

This project forked from cerit-sc/puppet-yum

16.0 18.0 99.0 644 KB

Puppet module for Yum

Home Page: https://forge.puppet.com/puppet/yum

License: MIT License

Puppet 29.10% Ruby 70.51% Pascal 0.39%
linux-puppet-module puppet hacktoberfest amazon-puppet-module centos-puppet-module fedora-puppet-module oraclelinux-puppet-module redhat-puppet-module scientific-puppet-module

puppet-yum's Introduction

Yum

Build Status Release Puppet Forge Puppet Forge - downloads Puppet Forge - endorsement Puppet Forge - scores puppetmodule.info docs AGPL v3 License

Module description

This module provides helpful definitions for dealing with yum.

Requirements

Module has been tested on:

  • Puppet 4.10.9 and newer
  • CentOS 7,8
  • Amazon Linux 2017
  • RHEL 7
  • Fedora 35,36

For the official list of all tested distributions, please take a look at the metadata.json.

Usage

Manage global Yum configuration via the primary class

class { 'yum':
  keep_kernel_devel => false|true,
  clean_old_kernels => false|true,
  config_options    => {
      my_cachedir => {
        ensure => '/home/waldo/.local/yum/cache',
        key    => 'cachedir',
      },
      gpgcheck    => true,
      debuglevel  => 5,
      assumeyes   => {
        ensure => 'absent',
      },
    },
  },
}

NOTE: The config_options parameter takes a Hash where keys are the names of Yum::Config resources and the values are either the direct ensure value (gpgcheck or debuglevel in the example above), or a Hash of the resource's attributes (my_cachedir or assumeyes in the example above). Values may be Strings, Integers, or Booleans. Booleans will be converted to either a 1 or 0; use a quoted string to get a literal true or false.

If installonly_limit is changed, purging of old kernel packages is triggered if clean_old_kernels is true.

Manage yum.conf entries via defined types

yum::config { 'installonly_limit':
  ensure => 2,
}

yum::config { 'debuglevel':
  ensure => absent,
}

Manage COPR repositories

This module also supports managing COPR (Cool Other Package Repo) repositories via the yum::copr resource. The resource title specifies the COPR repository name, and ensure accepts the values enabled, disabled or removed. Example usage:

yum::copr { 'copart/restic':
  ensure => enabled,
}

Please note that repositories added this way are not managed via yumrepo resources, but enabled and disabled via native package manager commands. As such, they would be purged by a declaration such as:

resources { 'yumrepo':
   purge => true,
}

However, you can use modules such as crayfishx-purge to exclude these resources from purging:

purge { 'yumrepo':
  unless => [ 'name', '=~', 'copr:.*' ],
}

Manage a custom repo via Hiera data

Using Hiera and automatic parameter lookup (APL), this module can manage Yumrepos. The repos parameter takes a hash of hashes, where the first-level keys are the Yumrepo resource names and their value hashes contain parameters and values to feed into the resource definition. On its own, the repos parameter does nothing. The resource names from the hash must be selected via the managed_repos parameter. This example defines a custom repo.

First, include the class.

include 'yum'

In Hiera data, add the name of the repo to the yum::managed_repos key (an Array), and define the repo in the yum::repos key:

---
yum::managed_repos:
    - 'example_repo'
yum::repos:
    example_repo:
        ensure: 'present'
        enabled: true
        descr: 'Example Repo'
        baseurl: 'https://repos.example.com/example/'
        gpgcheck: true
        gpgkey: 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Example'

You can include gpgkeys in yaml as well, and if the key filename matches a gpgkey from a mananged repo, it will be included. For example a gpg key for the repo above could look like:

---
yum::gpgkeys:
    /etc/pki/rpm-gpg/RPM-GPG-KEY-Example:
        content: |
            -----BEGIN PGP PUBLIC KEY BLOCK-----
            Version: GnuPG v1.4.11 (GNU/Linux)

            mQINBFKuaIQBEAC1UphXwMqCAarPUH/ZsOFslabeTVO2pDk5YnO96f+rgZB7xArB
            OSeQk7B90iqSJ85/c72OAn4OXYvT63gfCeXpJs5M7emXkPsNQWWSju99lW+AqSNm
            (SNIP SEVERAL LINES)
            RjsC7FDbL017qxS+ZVA/HGkyfiu4cpgV8VUnbql5eAZ+1Ll6Dw==
            =hdPa
            -----END PGP PUBLIC KEY BLOCK-----

... or

---
yum::gpgkeys:
    /etc/pki/rpm-gpg/RPM-GPG-KEY-Example:
        source: puppet:///repos/RPM-GPG-KEY-Example

Enable management of one of the pre-defined repos

This module includes several pre-defined Yumrepos for easy management. This example enables management of the EPEL repository using its default settings.

NOTE: This only works if the data for the repository is included with the module. Please see the /data directory of this module for a list of available repos.

include 'yum'
---
yum::managed_repos:
    - 'epel'

Enable management of one of the pre-defined repos AND modify its settings

Here the Extras repository for CentOS is enabled and its settings are modified. Because the repos parameter uses a deep merge strategy when fed via automatic parameter lookup (APL), only the values requiring modification need be defined.

To clear a value set below (from default repos, or lower in the hierarchy), pass it the knockout prefix, --. This will blank out the value.

---
yum::managed_repos:
    - 'extras'
yum::repos:
    extras:
        enabled: true
        baseurl: 'https://myrepo.example.com/extras'
        gpgcheck: false
        gpgkey: '--'

The built-in repos by default have data in mirrorlist, but baseurl is undefined. Using the knockout prefix won't work with mirrorlist, as it requires a valid URL or the value absent.

In case of Puppet 5, you can find more information in the Puppet docs. Since Puppet 6, this resource type has been moved to the puppetlabs/yumrepo_core module.

---
yum::managed_repos:
    - 'extras'
yum::repos:
    extras:
        enabled: true
        baseurl: 'https://mirror.example.com/extras'
        mirrorlist: 'absent'

Enable managemnt of multiple repos

The managed_repos parameter uses the unique Hiera merge strategy, so it's possible to define repos to be managed at multiple levels of the hierarchy. For example, given the following hierarchy and the following two yaml files, the module would receive the array ['base', 'extras', 'debug'].

---
hierarchy:
    - name: 'Common'
      paths:
        - "%{trusted.certname}"
        - 'common.yaml'
---
# node01
yum::managed_repos:
    - 'base'
    - 'debug'
# common
yum::managed_repos:
    - 'base'
    - 'extras'

Negate previously enabled repos

The repo_exclusions parameter is used to exclude repos from management. It is mainly useful in complex Hiera hierarchies where repos need to be removed from a baseline. Here we define a baseline set of repos in common.yaml, but disable one of them for a specific node.

---
hierarchy:
    - name: 'Common'
      paths:
        - "%{trusted.certname}"
        - 'common.yaml'
---
# node01
yum::repo_exclusions:
    - 'updates' #yolo
---
# common
yum::managed_repos:
    - 'base'
    - 'updates'
    - 'extras'

Enable management of the default OS Yumrepos

This module includes the boolean helper parameter manage_os_default_repos easily select select OS repos. It uses module data to add the appropriate repos to the managed_repos parameter based on OS facts. Just like adding them manually, they can be negated via the repo_exclusions parameter.

NOTE: This only works for operating systems who's Yumrepos are defined in the module's data AND who's default repos are defined in the module's data.

On a CentOS 7 machine these two snippets are functionally equivalent.

class { 'yum':
  manage_os_default_repos => true,
}
class { 'yum':
  managed_repos => [
    'base',
    'updates',
    'extras',
    'centosplus',
    'base-source',
    'updates-source',
    'extras-source',
    'base-debuginfo',
    'centos-media',
    'cr',
  ]
}

Add/remove a GPG RPM signing key using an inline key block

yum::gpgkey { '/etc/pki/rpm-gpg/RPM-GPG-KEY-puppet-smoketest1':
  ensure  => present,
  content => '-----BEGIN PGP PUBLIC KEY BLOCK-----
...
-----END PGP PUBLIC KEY BLOCK-----',
}

Add/remove a GPG RPM signing key using a key stored on a Puppet fileserver

yum::gpgkey { '/etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org':
  ensure => present,
  source => 'puppet:///modules/elrepo/RPM-GPG-KEY-elrepo.org',
}

Install or remove yum plugin

yum::plugin { 'versionlock':
  ensure => present,
}

Lock a package with the versionlock plugin

The versionlock type changed between CentOS 7 and CentOS 8.

CentOS 7 and older

Locks explicitly specified packages from updates. Package name must be precisely specified in format EPOCH:NAME-VERSION-RELEASE.ARCH. Wild card in package name is allowed provided it does not span a field seperator.

yum::versionlock { '0:bash-4.1.2-9.el6_2.*':
  ensure => present,
}

Use the following command to retrieve a properly-formated string:

PACKAGE_NAME='bash'
rpm -q "$PACKAGE_NAME" --qf '%|EPOCH?{%{EPOCH}}:{0}|:%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n'

To run a yum clean all after the versionlock file is updated.

class{'yum::plugin::versionlock':
  clean => true,
}
yum::versionlock { '0:bash-4.1.2-9.el6_2.*':
  ensure => present,
}

Note the CentOS 8 mechansim can be used if the parameter version is also set to anything other than the default undef. This allows common code to be used on CentOS 7 and 8 if the new style is used.

CentOS 8 and newer

Specify some of the version, release, epoch and arch values as parameters.

yum::versionlock{'bash':
  ensure => present,
  version => '4.1.2',
  release => '9.el8.2.*',
  epoch   => 0,
  arch    => 'x86_64',
}

Run a post transaction command

Specify a command to run after transactions of packages.

yum::post_transaction_action{'touch_file':
  key     => 'openssh-*',
  command => 'touch /tmp/openssh-package-updated',
}

Install or remove yum package group

Install yum package groups. To list groups: yum group list. Then use that name in your puppet manifest. With support for install_options (e.g. enable repos if disabled by default).

yum::group { 'X Window System':
  ensure          => present,
  timeout         => 600,
  install_options => ['--enablerepo=*'];
}

Install or remove packages via yum install

This is a workaround for PUP-3323. It enables the installation of packages from non-repo sources while still providing dependency resolution. For example, say there is a package foo that requires the package bar. bar is in a Yum repository and foo is stored on a stand-alone HTTP server. Using the standard providers for the Package resource type, rpm and yum, the rpm provider would be required to install foo, because only it can install from a non-repo source, i.e., a URL. However, since the rpm provider cannot do dependency resolution, it would fail on its own unless bar was already installed. This workaround enables foo to be installed without having to define its dependencies in Puppet.

From URL:

yum::install { 'package-name':
  ensure => present,
  source => 'http://example.com/path/to/package/filename.rpm',
}

From local filesystem:

yum::install { 'package-name':
  ensure => present,
  source => 'file:///path/to/package/filename.rpm',
}

Reinstall if rpm-verify fails:

yum::install { 'package-name':
  ensure => present,
  source => 'file:///path/to/package/filename.rpm',
  require_verify => true,
}

Please note that resource name must be same as installed package name.

Manage DNF modules streams

When changing from one enabled stream to another one, the provider runs dnf module switch-to <Stream>, which replaces all installed profiles from the DNF module. Bear the consequences in mind.

Enable default stream

dnf_module_stream { '<Module>':
  stream => default,
}

Keep current enabled stream - if there isn't, enable default one

dnf_module_stream { '<Module>':
  stream => present,
}

Enable a specific stream

dnf_module_stream { '<Module>':
  stream => <Stream name>,
}

Disable stream (reset module)

dnf_module_stream { '<Module>':
  stream => absent,
}

dnf_module_stream resource versus dnfmodule provider

DNF modules is a feature from yum successor, dnf, which allows easier and more robust selections of software versions and collections.

As of Aug 22, 2023, core Puppet package resource dnfmodule provider has some support for managing streams and profiles, but it has some issues:

  1. Setting stream is mandatory when (un)installing profiles - No way of just keeping currently enabled stream
  2. It only supports installing a single profile, despite the fact dnf supports multi-profile installations and there are use cases for that
  3. Managing two things - streams setting and profile (un)installation - in the same resource invocation is inherently messy

One can fix 1 and 2, and add good docs to deal with 3. A compelling reason not to keep 1 and 3 is that a stream is a setting, not something one (un)installs. This makes it unsuitable for the package resource which, in principle, should only (un)install stuff.

So, while one fix 2, this custom resource aims to fully and better replace dnfmodule provider stream support.

Puppet tasks

The module has a puppet task that allows to run yum update or yum upgrade. This task needs puppet agent installed on the remote.

Please refer to the Bolt documentation on how to execute a task.

$ bolt task show yum

yum - Allows you to perform yum functions

USAGE:
bolt task run --nodes <node-name> yum action=<value> [quiet=<value>]

PARAMETERS:
- action: Enum['update', 'upgrade']
    Action to perform
- quiet: Optional[Boolean]
    Run without output

Fedora partial support

Support for fedora is minimal at this time. The yum class can be included without error and resources such as yum::group can be managed. No repositories or GPG keys are managed by default. Old kernel cleanup is known not to work, and plugins may not work due to different package naming. Pull requests for additional support would be welcomed.


This module was donated by CERIT Scientific Cloud, [email protected] to Vox Pupuli

puppet-yum's People

Contributors

alexjfisher avatar bastelfreak avatar bonehead5338 avatar dhollinger avatar dhoppe avatar ekohl avatar emersonprado avatar igalic avatar jcpunk avatar jhoblitt avatar jskarpe avatar juniorsysadmin avatar jyaworski avatar keithward avatar kengelhardt-godaddy avatar kenyon avatar lamawithonel avatar llowder avatar olifre avatar optiz0r avatar rnelson0 avatar smortex avatar teluq-pbrideau avatar traylenator avatar trevor-vaughan avatar treydock avatar vchepkov avatar vholer avatar yorickps avatar zilchms avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

puppet-yum's Issues

Can this module purge/remove unwanted/unmanaged repos?

Hi

As the subject implies, I'm looking for a way to ensure that puppet manages all the yum repos on a system. I like that this module provides a group install feature, but it seems like it does not have the option to purge unmanaged repos. Is that correct?

Thanks!

Support for RHEL8/CentOS8 appstreams

Hi,

Maybe I am missing something, but this module doesn't seem to support setting Appstreams in RHEL/CentOs 8.

For example;
If I want to use the Remi php 7.4 appstream, I have to manually edit /etc/dnf/modules.d/php.module to be able to use their stream.

Are there any plans to add this in the future?

Thanks in Advance.

In Puppet 6, remove_undef_values doesn't work as expected

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 6.0.0
  • Ruby: 2.0.0p648
  • Distribution: RHEL 7
  • Module version: 3.1.0

How to reproduce (e.g Puppet code you use)

  1. Include the module in Puppet 6, any way you'd like.

What are you seeing

The puppet run fails due to trying to get the "length" member from a Nil object (because remove_undef_values does not remove the undef (Nil) value).

What behaviour did you expect instead

Puppet runs without errors.

Output log

Server Error: Evaluation Error: Error while evaluating a Function Call, undefined method 'length' for nil:NilClass (file: /etc/puppetlabs/code/environments/production/modules/yum/manifests/init.pp, line: 222, column: 20) on node mynode.com.

Any additional information you'd like to impart

I'm submitting a PR to fix this issue by removing undefined values with a filter.

Default OS repositories layout messed up by yum module

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 5.5.10
  • Ruby: 2.4.5p33
  • Distribution: Centos 7.6.1810
  • Module version: 3.1.1

How to reproduce (e.g Puppet code you use)

I'm using roles and profiles so this is in my site/profile/manifests/base.pp

class { 'yum':
  manage_os_default_repos => true,
}

This is in my data/common.yaml

yum::managed_repos:
  - 'base'
  - 'updates'
  - 'extras'
  - 'centosplus'
  - 'example'
yum::repos:
  base:
    enabled: true
    baseurl: 'http://repo.example.org/CentOS/$releasever/os/$basearch/'
    mirrorlist: 'absent'
  updates:
    enabled: true
    baseurl: 'http://repo.example.org/CentOS/$releasever/updates/$basearch/'
    mirrorlist: 'absent'
  extras:
    enabled: true
    baseurl: 'http://repo.example.org/CentOS/$releasever/extras/$basearch/'
    mirrorlist: 'absent'
  centosplus:
    enabled: true
    baseurl: 'http://repo.example.org/CentOS/$releasever/centosplus/$basearch/'
    mirrorlist: 'absent'
  example:
    ensure: 'present'
    enabled: true
    descr: 'Example Repository'
    baseurl: 'http://repo.example.org/example/'
    gpgcheck: false
    target: '/etc/yum.repos.d/example.repo'

What are you seeing

When using the yum module to manage the default repositories, I get a messed up repofile. It still works, but it looks very chaotic because the whitespaces aren't correct. See the example below.

/etc/yum/repos.d/CentOS-Base.repo

[base]
name=CentOS-$releasever - Base
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
ย 
#released updates
baseurl=http://repo.example.org/CentOS/$releasever/os/$basearch/
enabled=1
[updates]
name=CentOS-$releasever - Updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

What behaviour did you expect instead

/etc/yum/repos.d/CentOS-Base.repo

[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://repo.example.org/CentOS/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updatesinfra=$infra
baseurl=http://repo.example.org/CentOS/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

Output log

Any additional information you'd like to impart

The example repository is looking fine. There's a separate example.repo file which has the following contents:

[example]
name=Example Repository
baseurl=http://repo.example.org/example/
enabled=1
gpgcheck=0

In attachment also the CentOS-Base.repo file in 3 different versions (added .txt for Github support):

how does the module get the name of the package?

Hello,
i have couple of basic questions about installing using this module.
Q1. How does the module get he package name? for example i need to install rng-tools, what is the proper package name that i should provide?
Q2. How do i install multiple packages with the same name?
for example i have libgcc++ for x86_64 and i686 and i need to install both of them but i can't provide the same package name as it errors out.
Any inputs will be helpful.
thanks,
haim.

--knock-out-prefix "--" knocks out valid content of yum::gpgkeys

Most of the yum gpg keys start with something like '-----BEGIN PGP PUBLIC KEY BLOCK-----'
which gets knocked out by --knock-out-prefix "--" when hiera deep merges yum::gpgkeys set outside of the module.

This module works fine when I change --knock-out-prefix to a different value.

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 4.10
  • Ruby:
  • Distribution: EL7
  • Module version: 3.1

How to reproduce (e.g Puppet code you use)

add yum::gpgkey with defined content outside of module bundled hiera.

What are you seeing

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Resource Statement, Evaluation Error: Error while evaluating a Function Call, Missing params: $content or $source must be specified at /etc/puppetlabs/code/environments/production/modules/yum/manifests/gpgkey.pp:49:18

Add CentOS 8 repositories

Currently, module doesn't define/manage CentOS8 repositories.

I locally added the following configuration in CentOS-8.yaml

lookup_options:
  yum::os_default_repos:
    merge: first

yum::os_default_repos:
  - AppStream
  - BaseOS
  - cr
  - extras
  - PowerTools

yum::repos:
  AppStream:
    enabled: true
    descr: 'CentOS-$releasever - AppStream'
    mirrorlist: 'http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra'
    gpgcheck: true
    gpgkey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial"
    target: '/etc/yum.repos.d/CentOS-AppStream.repo'
  BaseOS:
    enabled: true
    descr: 'CentOS-$releasever - Base'
    mirrorlist: 'http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra'
    gpgcheck: true
    gpgkey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial"
    target: '/etc/yum.repos.d/CentOS-Base.repo'
  cr:
    enabled: false
    descr: 'CentOS-$releasever - cr'
    baseurl: 'http://mirror.centos.org/$contentdir/$releasever/cr/$basearch/os/'
    gpgcheck: true
    gpgkey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial"
    target: '/etc/yum.repos.d/CentOS-CR.repo'
  extras:
    enabled: true
    descr: 'CentOS-$releasever - Extras'
    mirrorlist: 'http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra'
    gpgcheck: true
    gpgkey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial"
    target: '/etc/yum.repos.d/CentOS-Extras.repo'
  PowerTools:
    enabled: false
    descr: 'CentOS-$releasever - PowerTools'
    mirrorlist: 'http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=PowerTools&infra=$infra'
    gpgcheck: true
    gpgkey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial"
    target: '/etc/yum.repos.d/CentOS-PowerTools.repo'

Support Amazon Linux 2

Amazon Linux 2 is compatible with EL7, not EL6

# facter os
{
  architecture => "x86_64",
  family => "RedHat",
  hardware => "x86_64",
  name => "Amazon",
  release => {
    full => "2",
    major => "2"
  },
  selinux => {
    enabled => false
  }
}

The gpgkey key of the repos parameter should support arrays

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 6.0.4
  • Ruby: 2.0.0
  • Distribution: RHEL 7 / CentOS 7
  • Module version: 3.1.1

How to reproduce (e.g Puppet code you use)

Pass a repo in the repos parameter with a gpgkey argument that's an array.

What are you seeing

Only the first element of the array is used.

What behaviour did you expect instead

Output log

Any additional information you'd like to impart

According to the yum.conf man page, multiple GPG keys per repo are supported:

gpgkey A URL pointing to the ASCII-armored GPG key file for the repository. This option is used if yum needs a public key to verify a package and the required key hasn't been imported into the RPM database. If this option is set, yum will automatically import the key from the specified URL. You will be prompted before the key is installed unless the assumeyes option is set.

Multiple URLs may be specified here in the same manner as the baseurl option (above). If a GPG key is required to install a package from a repository, all keys specified for that repository will be installed.

Does not handle multiple keys in a source file

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: PE 2018.1.4 / Puppet agent 5.5.6
  • Module version: 3.1.0

How to reproduce (e.g Puppet code you use)

yum::gpgkey { '/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release':
ensure => present,
source => 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release',
}

rpm -e gpg-pubkey-2fa658e0
puppet agent -t

What are you seeing

The key is NOT replaced because the manifest only looks for the first key (head -1)

What behaviour did you expect instead

All keys in the file should be checked.

Feature Request: purge

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: puppet-agent-5.3.5-1.el7.x86_64
  • Ruby: ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-linux]
  • Distribution: CentOS
  • Module version: 2.2.1

How to reproduce (e.g Puppet code you use)

include ::yum

What are you seeing

New repos are added, but old ones are not removed

What behaviour did you expect instead

I expect the old ones to be removed.

Output log

Any additional information you'd like to impart

I think we should add a parameter:

  Boolean $purge = true,

... and add the following puppet code:

resources { 'yumrepo':
  purge => $purge,
}

RHEL - rhui2-cds01.REGION.aws.ce.redhat.com not resolvable

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: PE 2017.3.5 (puppet-agent-5.3.5-1.el7.x86_64)
  • Ruby: ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-linux]
  • Distribution: RHEL - Red Hat Enterprise Linux Server release 7.5 (Maipo)
  • Module version: puppet-yum 2.2.1

How to reproduce (e.g Puppet code you use)

include ::yum
yum::manage_os_default_repos: true

What are you seeing

Errors during yum operations:

Could not retrieve mirrorlist https://rhui2-cds01.REGION.aws.ce.redhat.com/pulp/mirror/content/dist/rhel/rhui/server/7/7Server/x86_64/os error was
14: curl#6 - "Could not resolve host: rhui2-cds01.REGION.aws.ce.redhat.com; Name or service not known"
Could not retrieve mirrorlist https://rhui2-cds01.REGION.aws.ce.redhat.com/pulp/mirror/content/dist/rhel/rhui/server/7/7Server/x86_64/rh-common/os error was
14: curl#6 - "Could not resolve host: rhui2-cds01.REGION.aws.ce.redhat.com; Name or service not known"

What behaviour did you expect instead

I think the defaults provided through module data should work as a general rule. Perhaps, if they are "Amazon" specific defaults, we should add a layer to the hiera.yaml to detect the amazon-ness and include these defaults then? or come up with a generic default, and only override the "mirrorlist"

Output log

Relevant information included above.

Any additional information you'd like to impart

This relates to PR #75 and Issue #76 ... Perhaps @pillarsdotnet can shed some light on how it is supposed to work.

yum::versionlock with ensure => absent doesn't purge entries

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 3, 4, 5
  • Ruby: *
  • Distribution: RedHat bases
  • Module version: >= 0.10.0

How to reproduce (e.g Puppet code you use)

yum::versionlock { "0:mongodb-org-shell-3.4.7-1.el7.*":
  ensure => 'present',
}

----> add entry

yum::versionlock { "0:mongodb-org-shell-3.4.7-1.el7.*":
  ensure => 'absent',
}

---> nothing

Exclude option could be a workaround, but not a correct solution.

What are you seeing

Entry is not deleted

What behaviour did you expect instead

Entry is deleted

Output log

Any additional information you'd like to impart

concat:fragment need at least one fragment to purge entries

Cannot set 'exclude' key value

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 5.4.0
  • Distribution: CentOS 6.9
  • Ruby:
rubysitedir => /opt/puppetlabs/puppet/lib/ruby/site_ruby/2.4.0
rubyversion => 2.4.3
  • Module version: puppet-yum (v2.2.0)

How to reproduce (e.g Puppet code you use)

[root@centos-test ~]# cat test.pp
yum::config { 'exclude':
  ensure => 'dog cat'
}
[root@centos-test ~]#  puppet apply --debug test.pp

What are you seeing

Puppet errors:

Debug: Augeas[yum.conf_exclude](provider=augeas): Opening augeas with root /, lens path , flags 64
Debug: Augeas[yum.conf_exclude](provider=augeas): Augeas version 1.10.1 is installed
Debug: Augeas[yum.conf_exclude](provider=augeas): Will attempt to save and only run if files changed
Debug: Augeas[yum.conf_exclude](provider=augeas): sending command 'set' with params ["/files/etc/yum.conf/main/exclude", "dog cat"]
Debug: Augeas[yum.conf_exclude](provider=augeas): Put failed on one or more files, output from /augeas//error:
Debug: Augeas[yum.conf_exclude](provider=augeas): /augeas/files/etc/yum.conf/error = put_failed
Debug: Augeas[yum.conf_exclude](provider=augeas): /augeas/files/etc/yum.conf/error/path = /files/etc/yum.conf/files/etc/yum.conf/main
Debug: Augeas[yum.conf_exclude](provider=augeas): /augeas/files/etc/yum.conf/error/lens = /opt/puppetlabs/puppet/share/augeas/lenses/dist/yum.aug:43.20-.35:
Debug: Augeas[yum.conf_exclude](provider=augeas): /augeas/files/etc/yum.conf/error/message = Failed to match tree under /files/etc/yum.conf/main

     { "cachedir" = "/var/cache/yum/$basearch/$releasever" }
     { "keepcache" = "0" }
     { "debuglevel" = "2" }
     { "logfile" = "/var/log/yum.log" }
     { "exactarch" = "1" }
     { "obsoletes" = "1" }
     { "gpgcheck" = "1" }
     { "plugins" = "1" }
     { "installonly_limit" = "3" }
     { "bugtracker_url" = "http://bugs.centos.org/set_project.php?project_id=19&ref=http://bugs.centos.org/bug_report_page.php?category=yum" }
     { "distroverpkg" = "centos-release" }
     { "installonlypkgs" = "vim" }
     {  }
     { "#comment" = "This is the default, if you make this bigger yum won't see if the metadata" }
     { "#comment" = "is newer on the remote and so you'll "gain" the bandwidth of not having to" }
     { "#comment" = "download the new metadata and "pay" for it by yum not having correct" }
     { "#comment" = "information." }
     { "#comment" = "It is esp. important, to have correct metadata, for distributions like" }
     { "#comment" = "Fedora which don't keep old packages around. If you don't like this checking" }
     { "#comment" = "interupting your command line usage, it's much better to have something" }
     { "#comment" = "manually check the metadata once an hour (yum-updatesd will do this)." }
     { "#comment" = "metadata_expire=90m" }
     {  }
     { "#comment" = "PUT YOUR REPOS HERE OR IN separate files named file.repo" }
     { "#comment" = "in /etc/yum.repos.d" }
     { "excludes" = "dog cat" }
     { "exclude" = "dog cat" }

  with pattern

     { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
        | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
        | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
        | { })*
(     |  { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
        | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
        | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
        | { })*
      ({ /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
        { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
        { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(        { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
          | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
          | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
          | { })*
(        { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*
(          { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*)?
          | { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*
(          { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*)?)?
        | { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
        { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
        { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(        { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
          | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
          | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
          | { })*
(        { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*
(          { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*)?
          | { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*
(          { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*)?)?
        | { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
        { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
        { /exclude/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(        { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
          | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
          | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
          | { })*
(        { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*
(          { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*)?
          | { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /baseurl/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*
(          { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ }
(
          { /gpgkey/ = /[^\t\n\r #,][^\t\n\r ,]*[^\t\n\r #,]|[^\t\n\r #,]/ })*)?
(          { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /((([^\t\n\r "#;](([^\n\r#;]+)*[^\t\n\r "#;])?)))?/ }
            | { /baseur((l[.0-9A-Z_a-z-]|[.0-9A-Z_a-km-z-])[.0-9A-Z_a-z-]*|)|baseu([.0-9A-Z_a-qs-z-][.0-9A-Z_a-z-]*|)|base([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|bas([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|ba([.0-9A-Z_a-rt-z-][.0-9A-Z_a-z-]*|)|exclud((e[.0-9A-Z_a-z-]|[.0-9A-Z_a-df-z-])[.0-9A-Z_a-z-]*|)|exclu([.0-9A-Z_a-ce-z-][.0-9A-Z_a-z-]*|)|excl([.0-9A-Z_a-tv-z-][.0-9A-Z_a-z-]*|)|exc([.0-9A-Z_a-km-z-][.0-9A-Z_a-z-]*|)|ex([.0-9A-Z_abd-z-][.0-9A-Z_a-z-]*|)|gpgke((y[.0-9A-Z_a-z-]|[.0-9A-Z_a-xz-])[.0-9A-Z_a-z-]*|)|gpgk([.0-9A-Z_a-df-z-][.0-9A-Z_a-z-]*|)|gpg([.0-9A-Z_a-jl-z-][.0-9A-Z_a-z-]*|)|gp([.0-9A-Z_a-fh-z-][.0-9A-Z_a-z-]*|)|(g[.0-9A-Z_a-oq-z-]|e[.0-9A-Z_a-wyz-]|b[.0-9A-Z_b-z-]|[A-Zacdfh-z][.0-9A-Z_a-z-])[.0-9A-Z_a-z-]*|g|e|b|[A-Zacdfh-z]/ = /([^\n\r"]*[#;]+[^\n\r"]*)/ }
            | { /#comment/ = /[^\t\n\r ].*[^\t\n\r ]|[^\t\n\r ]/ }
            | { })*)?)?)

Debug: Augeas[yum.conf_exclude](provider=augeas): Closed the augeas connection
Error: /Stage[main]/Main/Yum::Config[exclude]/Augeas[yum.conf_exclude]: Could not evaluate: Saving failed, see debug

What behaviour did you expect instead

expected yum.conf to contain the following line under [main]
exclude=dog cat

According to yum.conf documentation the exclude value should be separated by spaces:
https://linux.die.net/man/5/yum.conf:

exclude List of packages to exclude from updates or installs. This should be a space separated list. Shell globs using wildcards (eg. * and ?) are allowed.

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/sec-configuring_yum_and_yum_repositories

exclude=package_name [more_package_names]
    This option allows you to exclude packages by keyword during installation/updates. Listing multiple packages for exclusion can be accomplished by quoting a space-delimited list of packages. Shell globs using wildcards (for example, * and ?) are allowed. 

Additional information

The following manifest also fails, showing that this problem is the augeas resource:

augeas { "yum_exclude_test":
  incl    => '/etc/yum.conf',
  lens    => 'Yum.lns',
  context => '/files/etc/yum.conf/main',
  changes => "set exclude 'dog cat'"
}

Amazon Linux manage_os_default_repos does not compile due to unsupported parameters

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 5.5.1
  • Ruby: 2.4.4
  • Distribution: Amazon Linux
  • Module version: 2.2.1

How to reproduce (e.g Puppet code you use)

node default {
  lookup('classes', {merge => unique}).include
}
classes:
  - yum
yum::manage_os_default_repos: true

What are you seeing

Failure to configure Amazon Linux default puppet repos due to the setting of parameters that Yumrepo does not support, such as fastestmirror_enabled and report_instanceid

What behaviour did you expect instead

Amazon default yum repos successfully configured

Output log

Error: no parameter named 'fastestmirror_enabled' (file: /etc/puppetlabs/code/environments/mot2/modules/yum/manifests/init.pp, line: 130) on Yumrepo[amzn-main] (file: /etc/puppetlabs/code/environments/mot2/modules/yum/manifests/init.pp, line: 130)

Add support for SLC6

Hi,
SLC6 can be supported too.
It is basically Scientific Linux CERN (it is CenOS fork) and the module is completely compatible.
Just the following needs to be added to the metadata:
{
"operatingsystem": "SLC",
"operatingsystemrelease": [
"6"
]
},

gpgkey applied on every run due to output change

Affected Puppet, Ruby, OS and module versions/distributions

  • Module version: <= 3.1.1
  • GPG version: >= 2.2 (assumption)

How to reproduce (e.g Puppet code you use)

yum::gpgkey { "/etc/pki/rpm-gpg/${keyname}.key":
  ensure => present,
  source => $keyfile,
}

What are you seeing

Resource being reapplied ad infinitum, due to GPG 2.2 (or a version between 2.0.9 and 2.2.5 inclusively) having a different return format for gpg $file.

What behaviour did you expect instead

Applied once.

Output log

hawking:~ # puppet agent --test
[...]
Notice: /Stage[main]/Profile::Base::Yum/Yum::Gpgkey[/etc/pki/rpm-gpg/Puppet.key]/Exec[rpm-import-/etc/pki/rpm-gpg/Puppet.key]/returns: executed successfully
[...]
Notice: Applied catalog in 4.70 seconds
hawking:~ # puppet agent --test
[...]
Notice: /Stage[main]/Profile::Base::Yum/Yum::Gpgkey[/etc/pki/rpm-gpg/Puppet.key]/Exec[rpm-import-/etc/pki/rpm-gpg/Puppet.key]/returns: executed successfully
[...]
Notice: Applied catalog in 4.76 seconds

Any additional information you'd like to impart

PR incoming after this issue.

Unable to exclude multiple packages in yum.conf

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 3.8.7
  • Ruby: ruby 2.0.0p648 (2015-12-16) [x86_64-linux
  • Distribution: Red Hat Enterprise Linux Server release 7.4 (Maipo)
  • Module version: 0.10.0

How to reproduce (e.g Puppet code you use)

I'm trying to exclude multiple packages in /etc/yum.conf. The man page for yum.conf says that this must be a space separated list of values, so i tried the following:

yum::config { 'exclude':
  ensure => 'openmotif* compat-libstdc*'
}

What are you seeing

Only the first element is being put into the config.

[main]
exclude=openmotif*
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=3

What behaviour did you expect instead

A config file with the full string i specified for exclude:

[main]
exclude=openmotif* compat-libstdc*'
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=3

Output log

Any additional information you'd like to impart

Update to puppetlabs/concat 3 or 4

Could you please update this module so to support puppetlabs/concat 4 (or at least 3)?
The current advertised dependency of puppetlabs/concat 2 is just connected to the old Puppet 3...

EPEL managed_repo broken

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 4.10.1
  • Ruby: bundled
  • Distribution: CentOS 7
  • Module version: 2.0.0

How to reproduce (e.g Puppet code you use)

Hiera:

yum::managed_repos:
    - epel

Puppet Profile:

  include ::yum

What are you seeing

Instead of a a file being created at /etc/repos.d/epel.repo, it is created at "/etc/yum.repos.d/Extra Packages for Enterprise Linux 7 - $basearch.repo".

At that point if you try to add a package from epel, such as glances, the yum command will fail. When trying to run a manual yum install to verify the package exists, you get the error below.

What behaviour did you expect instead

A functional package install with yum from epel. It should have payed attention to the target parameter to Yumrepo.

Output log

[jonathan.gray@puppet yum.repos.d]$ sudo yum repolist
Loaded plugins: fastestmirror, versionlock
Bad id for repo: Extra Packages for Enterprise Linux 7 - x86_64, byte =   5
Loading mirror speeds from cached hostfile
 * base: dist1.800hosting.com
 * updates: www.gtlib.gatech.edu
repo id                                                                              repo name                                                                                             status
base/7/x86_64                                                                        CentOS-7 - Base                                                                                       9,363
puppet_enterprise                                                                    PuppetLabs PE Packages 7 - x86_64                                                                        24
updates/7/x86_64                                                                     CentOS-7 - Updates                                                                                    1,857
repolist: 11,244
[jonathan.gray@puppet yum.repos.d]$ sudo vim
CentOS-Base.repo                                        centos-media.repo                                       Extra Packages for Enterprise Linux 7 - $basearch.repo
CentOS-CR.repo                                          CentOS-Media.repo                                       puppet_enterprise.repo
CentOS-Debuginfo.repo                                   CentOS-Sources.repo
CentOS-fasttrack.repo                                   CentOS-Vault.repo

Any additional information you'd like to impart

It looks like this isn't the module's fault but rather the core YumRepo Resource Type. In the meantime it can be worked around by treating epel like a custom repo again. The gotcha there is you have to give it a new title suffix such as epel_workaround so it doesn't pick up on the broken definitions inside the module. This also has the limitation that only a single repo definition can be present inside the file.

versionlock.list updated after package {} install

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 4.9
  • Ruby: bundeled
  • Distribution: CentOS 7
  • Module version: 1.0.0

How to reproduce (e.g Puppet code you use)

Hieradata (working):

mymod::myclass::pkglist: ['git', 'which', 'puppetserver']
mymod::myclass::pkg_locks: ['0:puppetserver-2.7.2-1.el7.noarch']

Extract from real class (only the non-working part):

class mymod::myclass (Array[String] $pkglist, Array[String] $pkg_locks) {   
    exec {'somecmd':
        ....
        require => Package[$pkglist],
    }

    package {$pkglist:
        ensure => installed,
    }

    yum::versionlock {$pkg_locks:
        ensure => present,
        before => Package[$pkglist],
    }
}

What are you seeing

The versionlock.list file is updated after package installation.

What behaviour did you expect instead

versionlock.list to be updated before package installation.

Output log

Warning: /opt/rob-bootstrap/puppet/hieradata/common.yaml: file does not contain a valid yaml hash
Debug: Scope(Class[Rob_bspuppetmaster::Bspuppetmaster]): Retrieving epp template rob_bspuppetmaster/hiera.yaml.epp
Debug: Scope(Class[Rob_bspuppetmaster::Bspuppetmaster]): Retrieving epp template rob_bspuppetmaster/rob_mastersync.sh.epp
Debug: Scope(Class[Rob_bspuppetmaster::Bspuppetmaster]): Retrieving epp template rob_bspuppetmaster/r10k.yaml.epp
Debug: importing '/opt/rob-bootstrap/puppet/modules/yum/manifests/init.pp' in environment devel
Debug: importing '/opt/rob-bootstrap/puppet/modules/yum/manifests/versionlock.pp' in environment devel
Debug: Automatically imported yum::versionlock from yum/versionlock into devel
Debug: importing '/opt/rob-bootstrap/puppet/modules/yum/manifests/plugin/versionlock.pp' in environment devel
Debug: Automatically imported yum::plugin::versionlock from yum/plugin/versionlock into devel
Warning: /opt/rob-bootstrap/puppet/modules/yum/hiera.yaml: Use of 'hiera.yaml' version 4 is deprecated. It should be converted to version 5
   (in /opt/rob-bootstrap/puppet/modules/yum/hiera.yaml)
Warning: /opt/rob-bootstrap/puppet/modules/yum/data/os/RedHat.yaml: file does not contain a valid yaml hash
Debug: importing '/opt/rob-bootstrap/puppet/modules/yum/manifests/plugin.pp' in environment devel
Debug: Automatically imported yum::plugin from yum/plugin into devel
Debug: importing '/opt/rob-bootstrap/puppet/modules/concat/manifests/init.pp' in environment devel
Debug: Automatically imported concat from concat into devel
Debug: importing '/opt/rob-bootstrap/puppet/modules/concat/manifests/fragment.pp' in environment devel
Debug: Automatically imported concat::fragment from concat/fragment into devel
Debug: importing '/opt/rob-bootstrap/puppet/modules/yum/manifests/config.pp' in environment devel
Debug: Automatically imported yum::config from yum/config into devel
Warning: This method is deprecated, please use the stdlib validate_legacy function, with Pattern[]. There is further documentation for validate_legacy function in the README. at ["/opt/rob-bootstrap/puppet/modules/concat/manifests/init.pp", 69]:
   (at /opt/rob-bootstrap/puppet/modules/stdlib/lib/puppet/functions/deprecation.rb:25:in `deprecation')
Warning: This method is deprecated, please use the stdlib validate_legacy function, with Stdlib::Compat::Absolute_Path. There is further documentation for validate_legacy function in the README. at ["/opt/rob-bootstrap/puppet/modules/concat/manifests/init.pp", 70]:
   (at /opt/rob-bootstrap/puppet/modules/stdlib/lib/puppet/functions/deprecation.rb:25:in `deprecation')
Warning: This method is deprecated, please use the stdlib validate_legacy function, with Stdlib::Compat::String. There is further documentation for validate_legacy function in the README. at ["/opt/rob-bootstrap/puppet/modules/concat/manifests/init.pp", 71]:
   (at /opt/rob-bootstrap/puppet/modules/stdlib/lib/puppet/functions/deprecation.rb:25:in `deprecation')
Warning: This method is deprecated, please use match expressions with Stdlib::Compat::String instead. They are described at https://docs.puppet.com/puppet/latest/reference/lang_data_type.html#match-expressions. at ["/opt/rob-bootstrap/puppet/modules/concat/manifests/init.pp", 72]:
   (at /opt/rob-bootstrap/puppet/modules/stdlib/lib/puppet/functions/deprecation.rb:25:in `deprecation')
Warning: This method is deprecated, please use the stdlib validate_legacy function, with Stdlib::Compat::Bool. There is further documentation for validate_legacy function in the README. at ["/opt/rob-bootstrap/puppet/modules/concat/manifests/init.pp", 81]:
   (at /opt/rob-bootstrap/puppet/modules/stdlib/lib/puppet/functions/deprecation.rb:25:in `deprecation')
Warning: This method is deprecated, please use match expressions with Stdlib::Compat::Bool instead. They are described at https://docs.puppet.com/puppet/latest/reference/lang_data_type.html#match-expressions. at ["/opt/rob-bootstrap/puppet/modules/concat/manifests/init.pp", 82]:
   (at /opt/rob-bootstrap/puppet/modules/stdlib/lib/puppet/functions/deprecation.rb:25:in `deprecation')
Notice: Compiled catalog for vm-centos7 in environment devel in 0.60 seconds
Debug: Creating default schedules
Debug: Loaded state in 0.01 seconds
Debug: Loaded state in 0.01 seconds
Debug: Loaded transaction store file in 0.00 seconds
Info: Applying configuration version '1489509080'
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[rob_mastersync]/require: subscribes to File[/etc/puppetlabs/code/rob_mastersync.sh]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[rob_mastersync]/require: subscribes to File[/etc/puppetlabs/puppet/hiera.yaml]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[rob_mastersync]/require: subscribes to File[/etc/puppetlabs/r10k/r10k.yaml]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[rob_mastersync]/require: subscribes to Exec[r10k-install]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[rob_mastersync]/require: subscribes to Exec[librarian-install]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/File[/etc/puppetlabs/r10k/r10k.yaml]/require: subscribes to File[/etc/puppetlabs/r10k]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/File[/etc/puppetlabs/r10k]/require: subscribes to Exec[r10k-install]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[librarian-install]/require: subscribes to Package[git]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[librarian-install]/require: subscribes to Package[which]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[librarian-install]/require: subscribes to Package[puppetserver]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[r10k-install]/require: subscribes to Package[git]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[r10k-install]/require: subscribes to Package[which]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[r10k-install]/require: subscribes to Package[puppetserver]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Yum::Versionlock[0:puppetserver-2.7.2-1.el7.noarch]/before: subscribes to Package[git]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Yum::Versionlock[0:puppetserver-2.7.2-1.el7.noarch]/before: subscribes to Package[which]
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Yum::Versionlock[0:puppetserver-2.7.2-1.el7.noarch]/before: subscribes to Package[puppetserver]
Debug: /Stage[main]/Yum::Plugin::Versionlock/Concat[/etc/yum/pluginconf.d/versionlock.list]/Concat_file[/etc/yum/pluginconf.d/versionlock.list]/before: subscribes to File[/etc/yum/pluginconf.d/versionlock.list]
Debug: /Stage[main]/Yum::Plugin::Versionlock/Concat[/etc/yum/pluginconf.d/versionlock.list]/Concat_file[/etc/yum/pluginconf.d/versionlock.list]: Adding autorequire relationship with Concat_fragment[yum-versionlock-0:puppetserver-2.7.2-1.el7.noarch]
Debug: /Stage[main]/Yum::Plugin::Versionlock/Concat[/etc/yum/pluginconf.d/versionlock.list]/Concat_file[/etc/yum/pluginconf.d/versionlock.list]: Skipping automatic relationship with File[/etc/yum/pluginconf.d/versionlock.list]
Debug: Prefetching yum resources for package
Debug: Executing: '/usr/bin/rpm --version'
Debug: Executing '/usr/bin/rpm -qa --nosignature --nodigest --qf '%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\n''
Debug: Executing: '/usr/bin/rpm -q puppetserver --nosignature --nodigest --qf '%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\n''
Debug: Executing: '/usr/bin/rpm -q puppetserver --nosignature --nodigest --qf '%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\n' --whatprovides'
Debug: Package[puppetserver](provider=yum): Ensuring => present
Debug: Executing: '/usr/bin/yum -d 0 -e 0 -y install puppetserver'
Notice: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Package[puppetserver]/ensure: created
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Package[puppetserver]: The container Class[Rob_bspuppetmaster::Bspuppetmaster] will propagate my refresh event
Notice: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/File[/etc/puppetlabs/r10k]/ensure: created
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/File[/etc/puppetlabs/r10k]: The container Class[Rob_bspuppetmaster::Bspuppetmaster] will propagate my refresh event
Notice: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/File[/etc/puppetlabs/r10k/r10k.yaml]/ensure: defined content as '{md5}31a4551bc81c80f2b82300bc047f10c8'
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/File[/etc/puppetlabs/r10k/r10k.yaml]: The container Class[Rob_bspuppetmaster::Bspuppetmaster] will propagate my refresh event
Debug: Exec[rob_mastersync](provider=posix): Executing '/etc/puppetlabs/code/rob_mastersync.sh'
Debug: Executing: '/etc/puppetlabs/code/rob_mastersync.sh'
Notice: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[rob_mastersync]/returns: executed successfully
Debug: /Stage[main]/Rob_bspuppetmaster::Bspuppetmaster/Exec[rob_mastersync]: The container Class[Rob_bspuppetmaster::Bspuppetmaster] will propagate my refresh event
Debug: Class[Rob_bspuppetmaster::Bspuppetmaster]: The container Stage[main] will propagate my refresh event
Info: Computing checksum on file /etc/yum/pluginconf.d/versionlock.list
Debug: Evicting cache entry for environment 'devel'
Debug: Caching environment 'devel' (ttl = 0 sec)
Info: FileBucket got a duplicate file {md5}d41d8cd98f00b204e9800998ecf8427e
Info: /Stage[main]/Yum::Plugin::Versionlock/Concat[/etc/yum/pluginconf.d/versionlock.list]/File[/etc/yum/pluginconf.d/versionlock.list]: Filebucketed /etc/yum/pluginconf.d/versionlock.list to puppet with sum d41d8cd98f00b204e9800998ecf8427e
Notice: /Stage[main]/Yum::Plugin::Versionlock/Concat[/etc/yum/pluginconf.d/versionlock.list]/File[/etc/yum/pluginconf.d/versionlock.list]/content: content changed '{md5}d41d8cd98f00b204e9800998ecf8427e' to '{md5}ab731e4e185b325d1d4bb8097c142f25'
Debug: /Stage[main]/Yum::Plugin::Versionlock/Concat[/etc/yum/pluginconf.d/versionlock.list]/File[/etc/yum/pluginconf.d/versionlock.list]: The container Concat[/etc/yum/pluginconf.d/versionlock.list] will propagate my refresh event
Debug: /Stage[main]/Yum::Plugin::Versionlock/Concat[/etc/yum/pluginconf.d/versionlock.list]/File[/etc/yum/pluginconf.d/versionlock.list]: The container /etc/yum/pluginconf.d/versionlock.list will propagate my refresh event
Debug: /etc/yum/pluginconf.d/versionlock.list: The container Concat[/etc/yum/pluginconf.d/versionlock.list] will propagate my refresh event
Debug: Concat[/etc/yum/pluginconf.d/versionlock.list]: The container Class[Yum::Plugin::Versionlock] will propagate my refresh event
Debug: Augeas[yum.conf_main_plugins](provider=augeas): Opening augeas with root /, lens path , flags 64
Debug: Augeas[yum.conf_main_plugins](provider=augeas): Augeas version 1.4.0 is installed
Debug: Augeas[yum.conf_main_plugins](provider=augeas): Will attempt to save and only run if files changed
Debug: Augeas[yum.conf_main_plugins](provider=augeas): sending command 'set' with params ["/files/etc/yum.conf/main/plugins", "1"]
Debug: Augeas[yum.conf_main_plugins](provider=augeas): Skipping because no files were changed
Debug: Augeas[yum.conf_main_plugins](provider=augeas): Closed the augeas connection
Debug: Class[Yum::Plugin::Versionlock]: The container Stage[main] will propagate my refresh event
Debug: Finishing transaction 20046600
Debug: Storing state
Debug: Stored state in 0.01 seconds
Notice: Applied catalog in 239.22 seconds
Debug: Applying settings catalog for sections reporting, metrics
Debug: Finishing transaction 20342480
Debug: Received report to process from vm-centos7
Debug: Evicting cache entry for environment 'devel'
Debug: Caching environment 'devel' (ttl = 0 sec)
Debug: Processing report from vm-centos7 with processor Puppet::Reports::Store

Workaround

Add require => Concat['/etc/yum/pluginconf.d/versionlock.list'] to package {$pkglist:`.

removal of mirrorlist is set by 'absent' not by using a knockout.

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: puppet-agent-1.9.3-1.el6.x86_64
  • Ruby: Puppet-Agent packages 2.1.0
  • Distribution: Centos 6
  • Module version: 2.0.1-rc0

How to reproduce (e.g Puppet code you use)

Pass hiera data using a knockout for mirrorlist

yum::managed_repos:
  - 'base'

yum::manage_os_default_repos: false

yum::repos:
  base:
    enabled: true
    descr: 'CentOS-$releasever - Base'
    baseurl: 'https://my.artifactory.server/yum-centos/$releasever/os/$basearch/'
    mirrorlist: '--'
    gpgcheck: true
    gpgkey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-%{facts.os.release.major}"
    target: '/etc/yum.repos.d/CentOS-Base.repo'

What are you seeing

Error: Parameter mirrorlist failed on Yumrepo[base]: Validate method failed for class mirrorlist: Must be a valid URL at /etc/puppetlabs/code/environments/production/modules/yum/manifests/init.pp:130

What behaviour did you expect instead

The yumrepo resource is expecting 'absent' for mirrorlist not undef.

Any additional information you'd like to impart

Works fine if I set the mirrorlist to 'absent' , think this just needs an update to the documentation, or maybe you want to tackle this another way?

Have a good day.

-Shawn

Augeas errors arise when applying yum settings on Cent OS 6 clients

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 4.10.0
  • Ruby: shippe with Puppet
  • Distribution: Cent OS 6
  • Module version: 1.0.0

How to reproduce (e.g Puppet code you use)

Install puppet-yum:

# puppet module install puppet-yum

Assign yum module to all nodes in site.pp on puppetserver:

node default {
    class {yum:}

     file_line { 'yum_proxy':
       path => '/etc/yum.conf',
       line => "proxy=$proxy",
     }
}

Apply yum setting on the client node:

client# cat /dev/null > /etc/yum.conf; puppet agent --verbose --debug -t

What are you seeing

Debug: Augeas[yum.conf_main_keepcache](provider=augeas): Opening augeas with root /, lens path , flags 64                                 
Debug: Augeas[yum.conf_main_keepcache](provider=augeas): Augeas version 1.4.0 is installed                                         
Warning: Augeas[yum.conf_main_keepcache](provider=augeas): Loading failed for one or more files, see debug for /augeas//error output                  
Debug: Augeas[yum.conf_main_keepcache](provider=augeas): /augeas/files/etc/yum.conf/error = parse_failed                        
Debug: Augeas[yum.conf_main_keepcache](provider=augeas): /augeas/files/etc/yum.conf/error/pos = 7                                           
Debug: Augeas[yum.conf_main_keepcache](provider=augeas): /augeas/files/etc/yum.conf/error/line = 2                                                    
Debug: Augeas[yum.conf_main_keepcache](provider=augeas): /augeas/files/etc/yum.conf/error/char = 0                               
Debug: Augeas[yum.conf_main_keepcache](provider=augeas): /augeas/files/etc/yum.conf/error/lens = /opt/puppetlabs/puppet/share/augeas/lenses/dist/yum.aug:49.13-.41:
Debug: Augeas[yum.conf_main_keepcache](provider=augeas): /augeas/files/etc/yum.conf/error/message = Get did not match entire input 
Debug: Augeas[yum.conf_main_keepcache](provider=augeas): Will attempt to save and only run if files changed                      
Debug: Augeas[yum.conf_main_keepcache](provider=augeas): sending command 'set' with params ["/files/etc/yum.conf/main/keepcache", "0"]                             
Debug: Augeas[yum.conf_main_keepcache](provider=augeas): Closed the augeas connection                                             
Error: /Stage[main]/Yum/Yum::Config[keepcache]/Augeas[yum.conf_main_keepcache]: Could not evaluate: Saving failed, see debug     
Debug: Yum::Config[keepcache]: Resource is being skipped, unscheduling all events                                                     
Debug: Augeas[yum.conf_main_debuglevel](provider=augeas): Opening augeas with root /, lens path , flags 64                       
Debug: Augeas[yum.conf_main_debuglevel](provider=augeas): Augeas version 1.4.0 is installed                                         
Warning: Augeas[yum.conf_main_debuglevel](provider=augeas): Loading failed for one or more files, see debug for /augeas//error output 
Debug: Augeas[yum.conf_main_debuglevel](provider=augeas): /augeas/files/etc/yum.conf/error = parse_failed                        
Debug: Augeas[yum.conf_main_debuglevel](provider=augeas): /augeas/files/etc/yum.conf/error/pos = 7                               
Debug: Augeas[yum.conf_main_debuglevel](provider=augeas): /augeas/files/etc/yum.conf/error/line = 2                                
Debug: Augeas[yum.conf_main_debuglevel](provider=augeas): /augeas/files/etc/yum.conf/error/char = 0                               
Debug: Augeas[yum.conf_main_debuglevel](provider=augeas): /augeas/files/etc/yum.conf/error/lens = /opt/puppetlabs/puppet/share/augeas/lenses/dist/yum.aug:49.13-.41:
Debug: Augeas[yum.conf_main_debuglevel](provider=augeas): /augeas/files/etc/yum.conf/error/message = Get did not match entire input
Debug: Augeas[yum.conf_main_debuglevel](provider=augeas): Will attempt to save and only run if files changed
Debug: Augeas[yum.conf_main_debuglevel](provider=augeas): sending command 'set' with params ["/files/etc/yum.conf/main/debuglevel", "2"]
Debug: Augeas[yum.conf_main_debuglevel](provider=augeas): Closed the augeas connection
Error: /Stage[main]/Yum/Yum::Config[debuglevel]/Augeas[yum.conf_main_debuglevel]: Could not evaluate: Saving failed, see debug
Debug: Yum::Config[debuglevel]: Resource is being skipped, unscheduling all events
Debug: Augeas[yum.conf_main_exactarch](provider=augeas): Opening augeas with root /, lens path , flags 64
Debug: Augeas[yum.conf_main_exactarch](provider=augeas): Augeas version 1.4.0 is installed
Warning: Augeas[yum.conf_main_exactarch](provider=augeas): Loading failed for one or more files, see debug for /augeas//error output
Debug: Augeas[yum.conf_main_exactarch](provider=augeas): /augeas/files/etc/yum.conf/error = parse_failed
Debug: Augeas[yum.conf_main_exactarch](provider=augeas): /augeas/files/etc/yum.conf/error/pos = 7
Debug: Augeas[yum.conf_main_exactarch](provider=augeas): /augeas/files/etc/yum.conf/error/line = 2
Debug: Augeas[yum.conf_main_exactarch](provider=augeas): /augeas/files/etc/yum.conf/error/char = 0
Debug: Augeas[yum.conf_main_exactarch](provider=augeas): /augeas/files/etc/yum.conf/error/lens = /opt/puppetlabs/puppet/share/augeas/lenses/dist/yum.aug:49.13-.41:
Debug: Augeas[yum.conf_main_exactarch](provider=augeas): /augeas/files/etc/yum.conf/error/message = Get did not match entire input
Debug: Augeas[yum.conf_main_exactarch](provider=augeas): Will attempt to save and only run if files changed
Debug: Augeas[yum.conf_main_exactarch](provider=augeas): sending command 'set' with params ["/files/etc/yum.conf/main/exactarch", "1"]
Debug: Augeas[yum.conf_main_exactarch](provider=augeas): Closed the augeas connection
Error: /Stage[main]/Yum/Yum::Config[exactarch]/Augeas[yum.conf_main_exactarch]: Could not evaluate: Saving failed, see debug
Debug: Yum::Config[exactarch]: Resource is being skipped, unscheduling all events
Debug: Augeas[yum.conf_main_obsoletes](provider=augeas): Opening augeas with root /, lens path , flags 64
Debug: Augeas[yum.conf_main_obsoletes](provider=augeas): Augeas version 1.4.0 is installed
Warning: Augeas[yum.conf_main_obsoletes](provider=augeas): Loading failed for one or more files, see debug for /augeas//error output
Debug: Augeas[yum.conf_main_obsoletes](provider=augeas): /augeas/files/etc/yum.conf/error = parse_failed
Debug: Augeas[yum.conf_main_obsoletes](provider=augeas): /augeas/files/etc/yum.conf/error/pos = 7
Debug: Augeas[yum.conf_main_obsoletes](provider=augeas): /augeas/files/etc/yum.conf/error/line = 2
Debug: Augeas[yum.conf_main_obsoletes](provider=augeas): /augeas/files/etc/yum.conf/error/char = 0
Debug: Augeas[yum.conf_main_obsoletes](provider=augeas): /augeas/files/etc/yum.conf/error/lens = /opt/puppetlabs/puppet/share/augeas/lenses/dist/yum.aug:49.13-.41:
Debug: Augeas[yum.conf_main_obsoletes](provider=augeas): /augeas/files/etc/yum.conf/error/message = Get did not match entire input
Debug: Augeas[yum.conf_main_obsoletes](provider=augeas): Will attempt to save and only run if files changed
Debug: Augeas[yum.conf_main_obsoletes](provider=augeas): sending command 'set' with params ["/files/etc/yum.conf/main/obsoletes", "1"]
Debug: Augeas[yum.conf_main_obsoletes](provider=augeas): Closed the augeas connection
Error: /Stage[main]/Yum/Yum::Config[obsoletes]/Augeas[yum.conf_main_obsoletes]: Could not evaluate: Saving failed, see debug
Error: /Stage[main]/Yum/Yum::Config[obsoletes]/Augeas[yum.conf_main_obsoletes]: Could not evaluate: Saving failed, see debug
Debug: Yum::Config[obsoletes]: Resource is being skipped, unscheduling all events
Debug: Augeas[yum.conf_main_gpgcheck](provider=augeas): Opening augeas with root /, lens path , flags 64
Debug: Augeas[yum.conf_main_gpgcheck](provider=augeas): Augeas version 1.4.0 is installed
Warning: Augeas[yum.conf_main_gpgcheck](provider=augeas): Loading failed for one or more files, see debug for /augeas//error output
Debug: Augeas[yum.conf_main_gpgcheck](provider=augeas): /augeas/files/etc/yum.conf/error = parse_failed
Debug: Augeas[yum.conf_main_gpgcheck](provider=augeas): /augeas/files/etc/yum.conf/error/pos = 7
Debug: Augeas[yum.conf_main_gpgcheck](provider=augeas): /augeas/files/etc/yum.conf/error/line = 2
Debug: Augeas[yum.conf_main_gpgcheck](provider=augeas): /augeas/files/etc/yum.conf/error/char = 0
Debug: Augeas[yum.conf_main_gpgcheck](provider=augeas): /augeas/files/etc/yum.conf/error/lens = /opt/puppetlabs/puppet/share/augeas/lenses/dist/yum.aug:49.13-.41:
Debug: Augeas[yum.conf_main_gpgcheck](provider=augeas): /augeas/files/etc/yum.conf/error/message = Get did not match entire input
Debug: Augeas[yum.conf_main_gpgcheck](provider=augeas): Will attempt to save and only run if files changed
Debug: Augeas[yum.conf_main_gpgcheck](provider=augeas): sending command 'set' with params ["/files/etc/yum.conf/main/gpgcheck", "1"]
Debug: Augeas[yum.conf_main_gpgcheck](provider=augeas): Closed the augeas connection
Error: /Stage[main]/Yum/Yum::Config[gpgcheck]/Augeas[yum.conf_main_gpgcheck]: Could not evaluate: Saving failed, see debug
Debug: Yum::Config[gpgcheck]: Resource is being skipped, unscheduling all events
Debug: Augeas[yum.conf_main_installonly_limit](provider=augeas): Opening augeas with root /, lens path , flags 64
Debug: Augeas[yum.conf_main_installonly_limit](provider=augeas): Augeas version 1.4.0 is installed
Warning: Augeas[yum.conf_main_installonly_limit](provider=augeas): Loading failed for one or more files, see debug for /augeas//error output
Debug: Augeas[yum.conf_main_installonly_limit](provider=augeas): /augeas/files/etc/yum.conf/error = parse_failed
Debug: Augeas[yum.conf_main_installonly_limit](provider=augeas): /augeas/files/etc/yum.conf/error/pos = 7
Debug: Augeas[yum.conf_main_installonly_limit](provider=augeas): /augeas/files/etc/yum.conf/error/line = 2
Debug: Augeas[yum.conf_main_installonly_limit](provider=augeas): /augeas/files/etc/yum.conf/error/char = 0
Debug: Augeas[yum.conf_main_installonly_limit](provider=augeas): /augeas/files/etc/yum.conf/error/lens = /opt/puppetlabs/puppet/share/augeas/lenses/dist/yum.aug:49.13-.41:
Debug: Augeas[yum.conf_main_installonly_limit](provider=augeas): /augeas/files/etc/yum.conf/error/message = Get did not match entire input
Debug: Augeas[yum.conf_main_installonly_limit](provider=augeas): Will attempt to save and only run if files changed
Debug: Augeas[yum.conf_main_installonly_limit](provider=augeas): sending command 'set' with params ["/files/etc/yum.conf/main/installonly_limit", "5"]
Debug: Augeas[yum.conf_main_installonly_limit](provider=augeas): Closed the augeas connection
Error: /Stage[main]/Yum/Yum::Config[installonly_limit]/Augeas[yum.conf_main_installonly_limit]: Could not evaluate: Saving failed, see debug
Debug: Yum::Config[installonly_limit]: Resource is being skipped, unscheduling all events
Notice: /Stage[main]/Yum/Exec[package-cleanup_oldkernels]: Dependency Augeas[yum.conf_main_installonly_limit] has failures: true
Warning: /Stage[main]/Yum/Exec[package-cleanup_oldkernels]: Skipping because of failed dependencies
Debug: /Stage[main]/Yum/Exec[package-cleanup_oldkernels]: Resource is being skipped, unscheduling all events

What behaviour did you expect instead

Yum settings should be applied on to the client node.

Output log

Any additional information you'd like to impart

The same configuration works well for Cent OS 7 clients.

feature yum update puppet task support

Hi,

Would there be an interest to accept a PR which adds a Puppet task that triggers a yum update ?
Similar like the task in the puppetlabs/puppetlabs-apt module.

Cheers.

Steven

yum::versionlock causes configuration loss

yum::versionlock should only manage relevant configuration and do not 'purge' existing configuration.
imagine if 'host' resource did the same. Since resource uses 'concat' for implementation it overrides all existing configuration. augeas or file_line would be more appropriate

Question: dnf separate or included?

Sorry for wiping the template but this isn't really a traditional issue. =D

Anyway, this plugin "almost perfectly" works just fine with RHEL8's (and later Fedora's) dnf replacement for yum since the configs and such are more or less drop-in replacements. But clearly there are -some- differences here and there. For example clean_old_kernels doesn't work, plugin package names are different slightly, etc.

I had considered "copy forking" and s/yum/dnf/ and releasing another sister module on PuppetForge, but this is so close to working out of the box, I'd like to ask y'all's thoughts on it.

Basically, would y'all prefer:

Scenario A: We will never suppor dnf formally in the yum module
In which case, it makes more sense for me to fork-copy like I was thinking about doing.

Scenario B: Make tweaks necessary to yum module and officially support dnf
In which case it could be added to the module's description, added as formal support, and with what I believe will be a very simple list of changes, we could support both in tandem.

I'm happy to do the work to make either of these scenarios happen. What are y'all's thoughts? Alternatively do you already have something in mind and I should just exercise patience? ;)

add ability to configure yum plugins

Currently module doesn't provide an option to configure yum plugins, for example

# cat /etc/yum/pluginconf.d/rhnplugin.conf 
[main]
enabled = 1
keepcache = 0 

or

# cat /etc/yum/pluginconf.d/priorities.conf
[main]
enabled = 1
check_obsoletes = 1

anyway to import gpg from url using source param in gpgkey class?

Don't see this documented, and from what I can tell the manifest doesn't look like it supports this, but is it possible to use the actual URL of the GPG key and import it in and use that instead of having the file already downloaded or just copy/pasting the content of it in the code? Something like...

yum::gpgkey { '/etc/pki/rpm-gpg/RPM-GPG-KEY-microsoft-azure-release':
  ensure => present,
  source => 'https://packages.microsoft.com/keys/microsoft.asc',
}

No Repos getting added

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 2018.1.3
  • Ruby:
  • Distribution: centos
  • Module version:4.1.1

How to reproduce (e.g Puppet code you use)

yum::managed_repos:
    - 'azure_cli'
    - 'kubernetes'
yum::repos:
  azure_cli:
    ensure: 'present'
    enabled: true
    descr: 'Repo for Azure CLI'
    baseurl: 'https://packages.microsoft.com/yumrepos/azure-cli/'
    gpgcheck: true
    gpgkey: 'https://packages.microsoft.com/keys/microsoft.asc'
    target: '/etc/yum.repos.d/azure_cli.repo'
  kubernetes:
    ensure: 'present'
    enabled: true
    descr: 'Repo for Kubernetes'
    baseurl: 'https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/'
    gpgcheck: false
    gpgkey: 'https://packages.cloud.google.com/yum/doc/yum-key.gpg'
    target: '/etc/yum.repos.d/kubernetes.repo'

What are you seeing

I am trying to setup two additional yum repos. I have followed the docs and setup the hieradata as above, however this does not appear to work. No errors occur during Puppet apply, however the repos are not added and I cannot install any packages from those repos. Am I doing anything obviously wrong?

What behaviour did you expect instead

Repos to be added

Output log

Any additional information you'd like to impart

yum_package_updates fact misinterprets output

yum_package_updates fact's code assumes that only first line in output should be ignored, this is not the case when multiple yum plugins are installed (satellite 6).

Here is the output:

# /usr/bin/yum --assumeyes --quiet --cacheonly list updates
Loaded plugins: auto-update-debuginfo, priorities, product-id, subscription-
              : manager, versionlock

Which creates this fact

# facter -p yum_package_updates
[
  ""
]

[RFC] COPR support

This module does not have support for COPR yet, i.e. repos from https://copr.fedorainfracloud.org which are handled via yum-plugin-copr or dnf-plugins-core.

This is an RFC to find out if:

  • Devs think this should be in the scope of this module.
  • How to best implement it.

To trigger off discussion a bit, I am currently using a custom ressource defined like this:

define profile::repo::copr(
        String                                  $copr_repo      = $title,
        Enum['enabled', 'disabled', 'removed']  $ensure         = 'enabled',
) {
  $prereq_plugin = $facts['package_provider'] ? {
    'dnf'   => 'dnf-plugins-core',
    default => 'yum-plugin-copr',
  }
  ensure_packages([ $prereq_plugin ])
  if $facts['package_provider'] == 'dnf' {
    case $ensure {
      'enabled':
        {
          exec { "dnf -y copr enable ${copr_repo}":
            unless  => "dnf copr list | egrep -q '${copr_repo}\$'",
            require => Package[$prereq_plugin],
          }
        }
      'disabled':
        {
          exec { "dnf -y copr disable ${copr_repo}":
            unless  => "dnf copr list | egrep -q '${copr_repo} (disabled)\$'",
            require => Package[$prereq_plugin],
          }
        }
      'removed':
        {
          exec { "dnf -y copr remove ${copr_repo}":
            unless  => "dnf copr list | egrep -q '${copr_repo}'",
            require => Package[$prereq_plugin],
          }
        }
    }
  } else {
    $copr_repo_name_part = regsubst($copr_repo, '/', '-', 'G')
    case $ensure {
      'enabled':
        {
          exec { "yum -y copr enable ${copr_repo}":
            onlyif  => "test ! -e /etc/yum.repos.d/_copr_${copr_repo_name_part}.repo",
          }
        }
      'disabled', 'removed':
        {
          exec { "yum -y copr disable ${copr_repo}":
            onlyif  => "test -e /etc/yum.repos.d/_copr_${copr_repo_name_part}.repo",
          }
        }
    }
  }
}

which allows me to do:

profile::repo::copr { 'copart/restic':
  ensure  => 'enabled',
}

CentOS/RHEL 8 Uses DNF but utils package is provided by yum-utils.

Although CentOS 8 uses DNF by default, unfortunately it appears that dnf-utils isn't actually provided by DNF, and is provided by yum-utils instead this looks to have been changed in Release 1 of CentOS8/RHEL 8.

I'm not sure of the reasoning behind this, however at present this results in the manifest applying every run because it's looking for dnf-utils and it's actually installing yum-utils.

Incoming PR that fixes this.

No file resources created when creating yumrepo resources

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 6.0.0
  • Ruby: 2.0.0p648
  • Distribution: RHEL 7
  • Module version: 3.1.0

This isn't a bug or glaring problem in particular, but rather a suggestion. I think it would be helpful to create a backing File resource for each Yumrepo created.

This would be useful, for example, on RHEL 7 when using a Tidy on /etc/yum.repos.d. The Tidy resource (helpfully) ignores any File resources that are part of the catalog. Unfortunately, the ::yum module does not create file resources for the yum repos it creates, so any tidies that happen on /etc/yum.repos.d may delete yum repos unless a strict ordering relationship is maintained. Even if you carefully declared the tidy before the class:

tidy { '/etc/yum.repos.d': matches => '*.repo', } -> class { '::yum': stage => first, }

you'd still have Puppet deleting and creating files every run, which isn't good practice.

I think something as simple as

file { "/etc/yum.repos.d/${repo}": ensure => file, }

after each Yumrepo declaration would be great.

Hiera 5 warning on puppet 5.3.2

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: puppet-agent-5.3.2-1.el7
  • Ruby: 2.4.1p111
  • Distribution: Centos
  • Module version: 2.1.0

How to reproduce (e.g Puppet code you use)

Just run puppet apply -e 'class { yum: }'

What are you seeing

Warning: /opt/aquari/puppet/modules/yum/hiera.yaml: Use of 'hiera.yaml' version 4 is deprecated. It should be converted to version 5
   (in /some/directory/puppet/modules/yum/hiera.yaml)

What behaviour did you expect instead

No warning.

Output log

Any additional information you'd like to impart

Is there a plan for going to hiera 5?

Class[Yum]: has no parameter named 'config_options'

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 4.10.0
  • Ruby: shippe with Puppet
  • Distribution: Cent OS 7
  • Module version: 1.0.0

How to reproduce (e.g Puppet code you use)

Install puppet-yum:

# puppet module install puppet-yum

Assign yum module to all nodes in site.pp on puppetserver:

node default {

    class { 'yum':
      keep_kernel_devel => true,
      clean_old_kernels => true,
      config_options    => {
          my_cachedir => {
            ensure => '/home/waldo/.local/yum/cache',
            key    => 'cachedir',
          },
          gpgcheck    => true,
          debuglevel  => 5,
          assumeyes   => {
            ensure => 'absent',
          },
        },
    }

}

Apply yum setting on the client node:

client# cat /dev/null > /etc/yum.conf; puppet agent --verbose --debug -t

What are you seeing

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error wh
ile evaluating a Resource Statement, Class[Yum]: has no parameter named 'config_options' at /etc/puppetlabs/code/en
vironments/production/manifests/site.pp:3:5 on node mu05.

What behaviour did you expect instead

Yum settings should be applied on to the client node.

Output log

Any additional information you'd like to impart

The settings above come from puppet-yum's README. On pupetforge page, config_options usage is not documented yet. https://forge.puppet.com/puppet/yum

Fix versionlock regex

The current regular expressions for the yum::versionlock defined type are too liberal and will match invalid strings as long as they end in an asterisk. In my experience, although the official documentation is a little vague on this, wildcard characters cannot cover the field separators. For example, 0:bash-4.1.2-9.el6_2.*, the example from the header docs, is valid, because it uses the wildcard to cover the %{ARCH} field. However, this seemingly similar input would be invalid to yum-versionlock (but valid to the module): 0:bash-4.1.2-9*.

Fixing this will be a breaking change, so I wanted to open this before it gets tagged 1.0.0. I am working on a fix.

Module supports http://, https:// or file:// as baseurl only without checking other yum plugins that support other schemes

Puppet, Ruby, OS and module versions/distributions

  • Puppet: 4.10.12
  • Ruby: 2.4.9p362
  • Distribution: CentOS 7
  • Module version: 4.0.0

How to reproduce (e.g Puppet code you use)

Hiera values below:

yum::managed_repos:
    - 'my-project'
yum::repos:
    my-project:
        ensure: 'present'
        enabled: true
        descr: 'My Project Repo'
        baseurl: "gs://my-project-%{::envname}-repo/myproject"
        gpgcheck: false
        gpgkey: '--'
        target: '/etc/yum.repos.d/my-project.repo'

eg. try to use a different baseurl, other than http/https/file, like me above.

What are you seeing

I'm using the yum-gs-iam plugin for yum, which allows yum to be able to fetch packages from GCS.

puppet-yum plugin will try to validate baseurl without letting yum do so.

What behaviour did you expect instead

Since I've got a yum plugin installed to handle the gs:// baseurl, module should not check it?

Output log

Dec 02 12:14:33 test-server puppet[1848]: Error: Parameter baseurl failed on Yumrepo[spareroom-secure]: Validate method failed for class baseurl: Must be a valid URL at /etc/puppetlabs/code/modules/yum/manifests/init.pp:136

Any additional information you'd like to impart

Yumrepo provider fork?

I'm planning on forking the Yumrepo inifile provider from upstream. I know Puppet, Inc. will accept patches, but I want to move faster than their release cycle. Is this something the project is open to hosting/supporting? If not I can take it elsewhere, but I imagine Puppet, Inc. is eager to rid themselves of the type/provider in some future major release and this seems like an obvious place to maintain a successor.

Rhel/Centos 8 versionlock doesn't work

Seems like the format of the file has changed in Centos 8

I have to configure like so
yum::versionlock { '1:java-1.8.0-openjdk-headless-1:1.8.0.232.b09-0.el8_0.*':
ensure => present,
}

but the line should be

yum::versionlock { 'java-1.8.0-openjdk-headless-1:1.8.0.232.b09-0.el8_0.*':
ensure => present,
}

But the module balks at that !

EPEL GPG Key

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: puppet-agent-5.3.5-1.el7.x86_64
  • Ruby: ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-linux]
  • Distribution: CentOS Linux release 7.4.1708 (Core)
  • Module version: 2.2.1

How to reproduce (e.g Puppet code you use)

include ::yum

package { 'rootsh':
  ensure => installed,
}
yum::managed_repos:
  - epel

What are you seeing

Error: /Stage[main]/Profile::Davita_base::Rootsh/Package[rootsh]/ensure: change from 'purged' to 'present' failed: Execution of '/bin/yum -d 0 -e 0 -y install rootsh' returned 1: warning: /var/cache/yum/x86_64/7/epel/packages/rootsh-1.5.3-17.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY


GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7"

What behaviour did you expect instead

I expected the package to be installed ;)

Output log

see error above

Any additional information you'd like to impart

The GPG key should be somehow included?

Workaround

You can manually install the GPG Key file with the following puppet code:

# Linux Software Repository Servers
# For RedHat family: https://forge.puppet.com/puppet/yum
class profile::linux::software (
  Boolean $purge = true,
  Hash $rpm_gpg_keys = {},
) {

  case $facts['os']['family'] {
    'RedHat': {
      include ::yum
      # Purge?
      resources { 'yumrepo':
        purge => $purge,
      }
      # GPG Keys
      create_resources('yum::gpgkey', $rpm_gpg_keys)
      # Resource ordering
      Yumrepo <| |> -> Yum::Gpgkey <| |> -> Package <| provider != 'rpm' |>
    }
    default: { notify { "profile::linux::software does not support osfamily: ${facts['os']['family']}": } }
  }
}

... and the following yaml:

yum::managed_repos:
  - epel

profile::linux::software::rpm_gpg_keys:
  /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7:
    content: |
      -----BEGIN PGP PUBLIC KEY BLOCK-----
      Version: GnuPG v1.4.11 (GNU/Linux)

      mQINBFKuaIQBEAC1UphXwMqCAarPUH/ZsOFslabeTVO2pDk5YnO96f+rgZB7xArB
      OSeQk7B90iqSJ85/c72OAn4OXYvT63gfCeXpJs5M7emXkPsNQWWSju99lW+AqSNm
      jYWhmRlLRGl0OO7gIwj776dIXvcMNFlzSPj00N2xAqjMbjlnV2n2abAE5gq6VpqP
      vFXVyfrVa/ualogDVmf6h2t4Rdpifq8qTHsHFU3xpCz+T6/dGWKGQ42ZQfTaLnDM
      jToAsmY0AyevkIbX6iZVtzGvanYpPcWW4X0RDPcpqfFNZk643xI4lsZ+Y2Er9Yu5
      S/8x0ly+tmmIokaE0wwbdUu740YTZjCesroYWiRg5zuQ2xfKxJoV5E+Eh+tYwGDJ
      n6HfWhRgnudRRwvuJ45ztYVtKulKw8QQpd2STWrcQQDJaRWmnMooX/PATTjCBExB
      9dkz38Druvk7IkHMtsIqlkAOQMdsX1d3Tov6BE2XDjIG0zFxLduJGbVwc/6rIc95
      T055j36Ez0HrjxdpTGOOHxRqMK5m9flFbaxxtDnS7w77WqzW7HjFrD0VeTx2vnjj
      GqchHEQpfDpFOzb8LTFhgYidyRNUflQY35WLOzLNV+pV3eQ3Jg11UFwelSNLqfQf
      uFRGc+zcwkNjHh5yPvm9odR1BIfqJ6sKGPGbtPNXo7ERMRypWyRz0zi0twARAQAB
      tChGZWRvcmEgRVBFTCAoNykgPGVwZWxAZmVkb3JhcHJvamVjdC5vcmc+iQI4BBMB
      AgAiBQJSrmiEAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBqL66iNSxk
      5cfGD/4spqpsTjtDM7qpytKLHKruZtvuWiqt5RfvT9ww9GUUFMZ4ZZGX4nUXg49q
      ixDLayWR8ddG/s5kyOi3C0uX/6inzaYyRg+Bh70brqKUK14F1BrrPi29eaKfG+Gu
      MFtXdBG2a7OtPmw3yuKmq9Epv6B0mP6E5KSdvSRSqJWtGcA6wRS/wDzXJENHp5re
      9Ism3CYydpy0GLRA5wo4fPB5uLdUhLEUDvh2KK//fMjja3o0L+SNz8N0aDZyn5Ax
      CU9RB3EHcTecFgoy5umRj99BZrebR1NO+4gBrivIfdvD4fJNfNBHXwhSH9ACGCNv
      HnXVjHQF9iHWApKkRIeh8Fr2n5dtfJEF7SEX8GbX7FbsWo29kXMrVgNqHNyDnfAB
      VoPubgQdtJZJkVZAkaHrMu8AytwT62Q4eNqmJI1aWbZQNI5jWYqc6RKuCK6/F99q
      thFT9gJO17+yRuL6Uv2/vgzVR1RGdwVLKwlUjGPAjYflpCQwWMAASxiv9uPyYPHc
      ErSrbRG0wjIfAR3vus1OSOx3xZHZpXFfmQTsDP7zVROLzV98R3JwFAxJ4/xqeON4
      vCPFU6OsT3lWQ8w7il5ohY95wmujfr6lk89kEzJdOTzcn7DBbUru33CQMGKZ3Evt
      RjsC7FDbL017qxS+ZVA/HGkyfiu4cpgV8VUnbql5eAZ+1Ll6Dw==
      =hdPa
      -----END PGP PUBLIC KEY BLOCK-----

Section "cr" is already defined, cannot redefine

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: puppet-agent-5.5.1-1.el7.x86_64
  • Ruby: ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-linux]
  • Distribution: CentOS Linux release 7.4.1708 (Core)
  • Module version: 2.2.1

How to reproduce (e.g Puppet code you use)

      include ::yum
      # Purge?
      resources { 'yumrepo':
        purge => true,
      }
      # RPM GPG Keys
      create_resources('yum::gpgkey', $rpm_gpg_keys)
      # Resource Ordering
      Yumrepo <| |> -> Yum::Gpgkey <| |> -> Package <| provider != 'rpm' |>

NOTE: $rpm_gpg_keys=>(epel gpg key) until PR96 is in :)

What are you seeing

After doing yum upgrade from 7.3 -> 7.4, the centos-release package automatically created the "default' /etc/yum.repos.d files. (specifically /etc/yum.repos.d/CentOS-*.repo)

The following error comes up during a puppet run:

Error: /Stage[main]/Profile::Linux::Software/Resources[yumrepo]: Failed to generate additional resources using 'generate': Section "cr" is already defined, cannot redefine (file: /etc/yum.repos.d/CentOS-CR.repo)

What behaviour did you expect instead

Shouldn't the resources { 'yumrepo': purge => true } take care of removing that duplicate?

Output log

See Error above

Any additional information you'd like to impart

Asked this question in Puppet Community Slack too, I think it may be a "puppet" bug, but I am considering that we should maybe try to create the "default" OS files as the same filenames as they would be created by the -release package, so that they are not duplicated? (if that is possible even)

[root@linux01 yum.repos.d]# rpm -ql centos-release | grep repo
/etc/yum.repos.d/CentOS-Base.repo
/etc/yum.repos.d/CentOS-CR.repo
/etc/yum.repos.d/CentOS-Debuginfo.repo
/etc/yum.repos.d/CentOS-Media.repo
/etc/yum.repos.d/CentOS-Sources.repo
/etc/yum.repos.d/CentOS-Vault.repo
/etc/yum.repos.d/CentOS-fasttrack.repo

They are listed as "config" files, so they would not be overwritten during upgrade.

~tommy

yum::config fails with comma separated values

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: 4.8.0
  • Ruby: ruby 2.1.9p490 (2016-03-30 revision 54437) [x86_64-linux]
  • Distribution: OEL Linux 7.3
  • Module version: 0.9.15

How to reproduce (e.g Puppet code you use)

Give a yum::config resources a comma separated value e.g.

yum::config{'exclude':
  ensure => 'kernel, kernel-uek',
}

What are you seeing

Error: /Stage[main]/Profile_base::Linux::Yum/Yum::Config[exclude]/Augeas[yum.conf_main_exclude]: Could not evaluate: Saving failed, see debug

What behaviour did you expect instead

exclude=kernel, kernel-uek

in /etc/yum.conf

Output log

Any additional information you'd like to impart

https://ask.puppet.com/question/17826/using-commas-in-augeas-set-commands/

Maybe accept an array of values

yum::config{'exclude':
  ensure => [ 'kernel', 'kernel-uek' ],
}

So that augeas vaues can be correctly defined ?

target parameter not applying

Affected Puppet, Ruby, OS and module versions/distributions

  • Puppet: Open 4.10 (puppetserver 2.7.2)
  • Ruby: 2.0.0p648
  • Distribution: Oracle Linux 7.3
  • Module version: 2.0.0

How to reproduce (e.g Puppet code you use)

builtin epel repository

What are you seeing

epel repository file gets written as:
/etc/yum.repos.d/Extra Packages for Enterprise Linux 7 - $basearch - Debug.repo

What behaviour did you expect instead

expected /etc/yum.repos.d/epel-debuginfo.repo

I expected the target parameter to control the file name based on the yumrepo resource type. I have seen that this is a previous know issue. Are there any recommendations to work around this? The only one I have is to remove the name parameter so that it takes the name of the resource.

Output log

Any additional information you'd like to impart

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.