4181b5811d3686fa4f0f9744e2f1d289a7913023
[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 ) {
9   if ! $release {
10     fail('lsbdistcodename fact not available: release parameter required')
11   }
12
13   if $::operatingsystem != 'Ubuntu' {
14     fail('apt::ppa is currently supported on Ubuntu only.')
15   }
16
17   $filename_without_slashes = regsubst($name, '/', '-', 'G')
18   $filename_without_dots    = regsubst($filename_without_slashes, '\.', '_', 'G')
19   $filename_without_ppa     = regsubst($filename_without_dots, '^ppa:', '', 'G')
20   $sources_list_d_filename  = "${filename_without_ppa}-${release}.list"
21
22   if $ensure == 'present' {
23     if $package_manage {
24       package { $package_name: }
25
26       $_require = [File['sources.list.d'], Package[$package_name]]
27     } else {
28       $_require = File['sources.list.d']
29     }
30
31     case $::apt::proxy_host {
32       false, '', undef: {
33         $_proxy_env = []
34       }
35       default: {
36         $_proxy_env = ["http_proxy=http://${::apt::proxy_host}:${::apt::proxy_port}", "https_proxy=http://${::apt::proxy_host}:${::apt::proxy_port}"]
37       }
38     }
39
40     exec { "add-apt-repository-${name}":
41       environment => $_proxy_env,
42       command     => "/usr/bin/add-apt-repository ${options} ${name}",
43       unless      => "/usr/bin/test -s ${::apt::sources_list_d}/${sources_list_d_filename}",
44       user        => 'root',
45       logoutput   => 'on_failure',
46       notify      => Exec['apt_update'],
47       require     => $_require,
48     }
49
50     file { "${::apt::sources_list_d}/${sources_list_d_filename}":
51       ensure  => file,
52       require => Exec["add-apt-repository-${name}"],
53     }
54   }
55   else {
56     file { "${::apt::sources_list_d}/${sources_list_d_filename}":
57       ensure => 'absent',
58       notify => Exec['apt_update'],
59     }
60   }
61
62   # Need anchor to provide containment for dependencies.
63   anchor { "apt::ppa::${name}":
64     require => Class['apt::update'],
65   }
66 }