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