]> review.fuel-infra Code Review - puppet-modules/puppetlabs-apt.git/commitdiff
Merge pull request #752 from antaflos/apt_auth_conf_support
authorTP Honey <tphoney@users.noreply.github.com>
Thu, 21 Jun 2018 12:25:50 +0000 (13:25 +0100)
committerGitHub <noreply@github.com>
Thu, 21 Jun 2018 12:25:50 +0000 (13:25 +0100)
Support managing login configurations in /etc/apt/auth.conf

README.md
manifests/init.pp
manifests/params.pp
spec/classes/apt_spec.rb
templates/auth_conf.epp [new file with mode: 0644]
types/auth_conf_entry.pp [new file with mode: 0644]

index 73272c2ffaa6e2e2ae3ca415aa0ce9130238fb8b..9ece72bd1d83d63fcd2e93bda343ed87d9e745d1 100644 (file)
--- a/README.md
+++ b/README.md
@@ -226,6 +226,38 @@ apt::source { "archive.ubuntu.com-${lsbdistcodename}-backports":
 }
 ```
 
+### Manage login configuration settings for an APT source or proxy in `/etc/apt/auth.conf`
+
+Starting with APT version 1.5 you can define login configuration settings (like
+username and password) for APT sources or proxies that require authentication
+in the file `/etc/apt/auth.conf`. This is preferable to embedding login
+information directly in `source.list` entries which are usually world-readable.
+
+The file `/etc/apt/auth.conf` follows the format of netrc (as used by ftp or
+curl) and has restrictive file permissions. See
+https://manpages.debian.org/testing/apt/apt_auth.conf.5.en.html for details.
+
+Use the optional `apt::auth_conf_entries` parameter to specify an array of
+hashes containing login configuration settings. These hashes may only contain
+the keys `machine`, `login` and `password`.
+
+```puppet
+class { 'apt':
+  auth_conf_entries => [
+    {
+      'machine'  => 'apt-proxy.example.net',
+      'login'    => 'proxylogin',
+      'password' => 'proxypassword',
+    },
+    {
+      'machine'  => 'apt.example.com/ubuntu',
+      'login'    => 'reader',
+      'password' => 'supersecret',
+    },
+  ],
+}
+```
+
 ## Reference
 
 ### Classes
@@ -298,7 +330,7 @@ All parameters are optional unless specified.
   * `https`: Specifies whether to enable https proxies. Valid options: `true` and `false`. Default: `false`.
 
   * `ensure`: Optional parameter. Valid options: 'file', 'present', and 'absent'. Default: `undef`. Prefer 'file' over 'present'.
-  
+
   * `direct`: Specifies whether or not to use a 'DIRECT' https proxy if http proxy is used but https is not. Valid options: `true` and `false`. Default: `false`.
 
 * `purge`: Specifies whether to purge any existing settings that aren't managed by Puppet. Valid options: a hash made up from the following keys:
@@ -313,6 +345,8 @@ All parameters are optional unless specified.
 
 * `settings`: Creates new `apt::setting` resources. Valid options: a hash to be passed to the [`create_resources` function](https://docs.puppetlabs.com/references/latest/function.html#createresources). Default: {}.
 
+* `auth_conf_entries`: An optional array of login configuration settings (hashes) that will be recorded in the file `/etc/apt/auth.conf`. This file has a netrc-like format (similar to what curl uses) and contains the login configuration for APT sources and proxies that require authentication. See https://manpages.debian.org/testing/apt/apt_auth.conf.5.en.html for details. If specified each hash must contain the keys `machine`, `login` and `password` and no others. Default: [].
+
 * `sources`: Creates new `apt::source` resources. Valid options: a hash to be passed to the [`create_resources` function](https://docs.puppetlabs.com/references/latest/function.html#createresources). Default: {}.
 
 * `pins`: Creates new `apt::pin` resources. Valid options: a hash to be passed to the [`create_resources` function](https://docs.puppetlabs.com/references/latest/function.html#createresources). Default: {}.
index e9a7e53bbee72e723c65d88871661a40042f7e84..06dc0acf458e07155db933198999552340489467 100644 (file)
@@ -21,6 +21,8 @@ class apt (
   Hash $ppas                    = $apt::params::ppas,
   Hash $pins                    = $apt::params::pins,
   Hash $settings                = $apt::params::settings,
+  Array[Apt::Auth_conf_entry]
+    $auth_conf_entries          = $apt::params::auth_conf_entries,
   String $root                  = $apt::params::root,
   String $sources_list          = $apt::params::sources_list,
   String $sources_list_d        = $apt::params::sources_list_d,
@@ -178,6 +180,22 @@ class apt (
     create_resources('apt::setting', $settings)
   }
 
+  $auth_conf_ensure = $auth_conf_entries ? {
+    []      => 'absent',
+    default => 'present',
+  }
+
+  $auth_conf_tmp = epp('apt/auth_conf.epp')
+
+  file { '/etc/apt/auth.conf':
+    ensure  => $auth_conf_ensure,
+    owner   => 'root',
+    group   => 'root',
+    mode    => '0600',
+    content => "${confheadertmp}${auth_conf_tmp}",
+    notify  => Class['apt::update'],
+  }
+
   # manage pins if present
   if $pins {
     create_resources('apt::pin', $pins)
index c954aa36dc4335b28346fa47028df6839f720b22..b0ad60c71ada96d8aa812aa5518c353c0b8155b9 100644 (file)
@@ -22,6 +22,7 @@ class apt::params {
   $ppas           = {}
   $pins           = {}
   $settings       = {}
+  $auth_conf_entries = []
 
   $config_files = {
     'conf'   => {
index 7fdfb775ec31cf38240550b7686513b6001217f5..011286d876bc96fd78cf9a73a81e233a2b160252 100644 (file)
@@ -60,6 +60,8 @@ describe 'apt' do
       is_expected.to contain_file('preferences.d').that_notifies('Class[Apt::Update]').only_with(preferences_d)
     }
 
+    it { is_expected.to contain_file('/etc/apt/auth.conf').with_ensure('absent') }
+
     it 'lays down /etc/apt/apt.conf.d/15update-stamp' do
       is_expected.to contain_file('/etc/apt/apt.conf.d/15update-stamp').with(group: 'root',
                                                                              mode: '0644',
@@ -186,6 +188,52 @@ describe 'apt' do
     }
   end
 
+  context 'with entries for /etc/apt/auth.conf' do
+    let(:params) do
+      {
+        auth_conf_entries: [
+          { machine: 'deb.example.net',
+            login: 'foologin',
+            password: 'secret' },
+          { machine: 'apt.example.com',
+            login: 'aptlogin',
+            password: 'supersecret' },
+        ],
+      }
+    end
+
+    auth_conf_content = "// This file is managed by Puppet. DO NOT EDIT.
+machine deb.example.net login foologin password secret
+machine apt.example.com login aptlogin password supersecret
+"
+
+    it {
+      is_expected.to contain_file('/etc/apt/auth.conf').with(ensure: 'present',
+                                                             owner: 'root',
+                                                             group: 'root',
+                                                             mode: '0600',
+                                                             notify: 'Class[Apt::Update]',
+                                                             content: auth_conf_content)
+    }
+  end
+
+  context 'with improperly specified entries for /etc/apt/auth.conf' do
+    let(:params) do
+      {
+        auth_conf_entries: [
+          { machinn: 'deb.example.net',
+            username: 'foologin',
+            password: 'secret' },
+          { machine: 'apt.example.com',
+            login: 'aptlogin',
+            password: 'supersecret' },
+        ],
+      }
+    end
+
+    it { is_expected.to raise_error(Puppet::Error) }
+  end
+
   context 'with sources defined on valid osfamily' do
     let :facts do
       { os: { family: 'Debian', name: 'Ubuntu', release: { major: '16', full: '16.04' } },
diff --git a/templates/auth_conf.epp b/templates/auth_conf.epp
new file mode 100644 (file)
index 0000000..5b3000f
--- /dev/null
@@ -0,0 +1,5 @@
+<% if $apt::auth_conf_entries != [] { -%>
+<% $apt::auth_conf_entries.each | $auth_conf_entry | { -%>
+machine <%= $auth_conf_entry['machine'] %> login <%= $auth_conf_entry['login'] %> password <%= $auth_conf_entry['password'] %>
+<% } -%>
+<% } -%>
diff --git a/types/auth_conf_entry.pp b/types/auth_conf_entry.pp
new file mode 100644 (file)
index 0000000..40648d1
--- /dev/null
@@ -0,0 +1 @@
+type Apt::Auth_conf_entry = Struct[{ machine => String[1], login => String, password => String }]