Merge pull request #443 from mhaskel/proxy_updates
[puppet-modules/puppetlabs-apt.git] / manifests / ppa.pp
1 # ppa.pp
2 define apt::ppa(
3   $ensure         = 'present',
4   $release        = $::lsbdistcodename,
5   $options        = $::apt::ppa_options,
6   $package_name   = $::apt::ppa_package,
7   $package_manage = false,
8   $proxy          = {},
9 ) {
10   if ! $release {
11     fail('lsbdistcodename fact not available: release parameter required')
12   }
13
14   if $::operatingsystem != 'Ubuntu' {
15     fail('apt::ppa is currently supported on Ubuntu only.')
16   }
17
18   $filename_without_slashes = regsubst($name, '/', '-', 'G')
19   $filename_without_dots    = regsubst($filename_without_slashes, '\.', '_', 'G')
20   $filename_without_ppa     = regsubst($filename_without_dots, '^ppa:', '', 'G')
21   $sources_list_d_filename  = "${filename_without_ppa}-${release}.list"
22
23   $_proxy = merge($apt::proxy, $proxy)
24
25   if $ensure == 'present' {
26     if $package_manage {
27       package { $package_name: }
28
29       $_require = [File['sources.list.d'], Package[$package_name]]
30     } else {
31       $_require = File['sources.list.d']
32     }
33
34     case $_proxy['host'] {
35       false, '', undef: {
36         $_proxy_env = []
37       }
38       default: {
39         $_proxy_env = ["http_proxy=http://${_proxy['host']}:${_proxy['port']}", "https_proxy=http://${_proxy['host']}:${_proxy['port']}"]
40       }
41     }
42
43     exec { "add-apt-repository-${name}":
44       environment => $_proxy_env,
45       command     => "/usr/bin/add-apt-repository ${options} ${name}",
46       unless      => "/usr/bin/test -s ${::apt::sources_list_d}/${sources_list_d_filename}",
47       user        => 'root',
48       logoutput   => 'on_failure',
49       notify      => Exec['apt_update'],
50       require     => $_require,
51     }
52
53     file { "${::apt::sources_list_d}/${sources_list_d_filename}":
54       ensure  => file,
55       require => Exec["add-apt-repository-${name}"],
56     }
57   }
58   else {
59     file { "${::apt::sources_list_d}/${sources_list_d_filename}":
60       ensure => 'absent',
61       notify => Exec['apt_update'],
62     }
63   }
64
65   # Need anchor to provide containment for dependencies.
66   anchor { "apt::ppa::${name}":
67     require => Class['apt::update'],
68   }
69 }