--- /dev/null
+# Apt module for Puppet
+
+## Description
+Provides helpful definitions for dealing with Apt.
+
+## Usage
+
+### apt::force
+Force a package to be installed from a specific release. Useful when using repositoires like Debian unstable in Ubuntu.
+<pre>
+apt::force { "glusterfs-server":
+ release => "unstable",
+ version => '3.0.3',
+ require => Apt::Source["debian_unstable"],
+}
+</pre>
+
+### apt::pin
+Add an apt pin for a certain release.
+<pre>
+apt::pin { "karmic": priority => 700 }
+apt::pin { "karmic-updates": priority => 700 }
+apt::pin { "karmic-security": priority => 700 }
+</pre>
+
+### apt::ppa
+Add a ppa repository using `add-apt-repository`. Somewhat experimental.
+<pre>
+apt::ppa { "ppa:drizzle-developers/ppa" }
+</pre>
+
+### apt::release
+Set the default apt release. Useful when using repositoires like Debian unstable in Ubuntu.
+<pre>
+apt::release { "karmic": }
+</pre>
+
+## apt::source
+Add an apt source to `/etc/apt/sources.list.d/`.
+<pre>
+apt::source { "debian_unstable":
+ location => "http://debian.mirror.iweb.ca/debian/",
+ release => "unstable",
+ repos => "main contrib non-free",
+ required_packages => "debian-keyring debian-archive-keyring",
+ key => "55BE302B",
+ key_server => "subkeys.pgp.net",
+ pin => "-10"
+}
+</pre>
--- /dev/null
+# testing.pp
+
+class apt::debian::testing {
+
+ # deb http://debian.mirror.iweb.ca/debian/ testing main contrib non-free
+ # deb-src http://debian.mirror.iweb.ca/debian/ testing main contrib non-free
+ # Key: 55BE302B Server: subkeys.pgp.net
+ # debian-keyring
+ # debian-archive-keyring
+
+ apt::source { "debian_testing":
+ location => "http://debian.mirror.iweb.ca/debian/",
+ release => "testing",
+ repos => "main contrib non-free",
+ required_packages => "debian-keyring debian-archive-keyring",
+ key => "55BE302B",
+ key_server => "subkeys.pgp.net",
+ pin => "-10"
+ }
+
+}
--- /dev/null
+# unstable.pp
+
+class apt::debian::unstable {
+
+ # deb http://debian.mirror.iweb.ca/debian/ unstable main contrib non-free
+ # deb-src http://debian.mirror.iweb.ca/debian/ unstable main contrib non-free
+ # Key: 55BE302B Server: subkeys.pgp.net
+ # debian-keyring
+ # debian-archive-keyring
+
+ apt::source { "debian_unstable":
+ location => "http://debian.mirror.iweb.ca/debian/",
+ release => "unstable",
+ repos => "main contrib non-free",
+ required_packages => "debian-keyring debian-archive-keyring",
+ key => "55BE302B",
+ key_server => "subkeys.pgp.net",
+ pin => "-10"
+ }
+
+}
--- /dev/null
+# force.pp
+# force a package from a specific release
+
+define apt::force(
+ $release = 'testing',
+ $version = false
+) {
+
+ exec { "aptitude -y -t ${release} install ${name}":
+ unless => $version ? {
+ false => "dpkg -l | grep ${name}",
+ default => "dpkg -l | grep ${name} | grep ${version}"
+ }
+ }
+
+}
--- /dev/null
+# apt.pp
+
+class apt {
+ $root = '/etc/apt'
+ $provider = 'apt-get'
+
+ file { "sources.list":
+ name => "${root}/sources.list",
+ ensure => present,
+ owner => root,
+ group => root,
+ mode => 644,
+ }
+
+ file { "sources.list.d":
+ name => "${root}/sources.list.d",
+ ensure => directory,
+ owner => root,
+ group => root,
+ }
+
+ exec { "apt_update":
+ command => "${provider} update",
+ subscribe => [ File["sources.list"], File["sources.list.d"] ],
+ refreshonly => true,
+ }
+}
--- /dev/null
+# pin.pp
+# pin a release in apt, useful for unstable repositories
+
+define apt::pin(
+ $packages = '*',
+ $priority = 0
+) {
+
+ include apt
+
+ file { "${name}.pref":
+ name => "${apt::root}/preferences.d/${name}",
+ ensure => file,
+ owner => root,
+ group => root,
+ mode => 644,
+ content => "# ${name}\nPackage: ${packages}\nPin: release a=${name}\nPin-Priority: ${priority}",
+ }
+
+}
--- /dev/null
+# ppa.pp
+
+define apt::ppa(
+
+) {
+ include apt
+
+ exec { "add-apt-repository ${name}":
+ require => Package["python-software-properties"],
+ # TODO: unless => 'check'
+ }
+}
+
--- /dev/null
+# release.pp
+
+define apt::release (
+
+) {
+ include apt
+
+ file { "${apt::root}/apt.conf.d/01release":
+ owner => root,
+ group => root,
+ mode => 644,
+ content => "APT::Default-Release \"${name}\";"
+ }
+}
--- /dev/null
+# source.pp
+# add an apt source
+
+define apt::source(
+ $location = '',
+ $release = 'karmic',
+ $repos = 'main',
+ $include_src = true,
+ $required_packages = false,
+ $key = false,
+ $key_server = 'keyserver.ubuntu.com',
+ $pin = false
+) {
+
+ include apt
+
+ file { "${name}.list":
+ name => "${apt::root}/sources.list.d/${name}.list",
+ ensure => file,
+ owner => root,
+ group => root,
+ mode => 644,
+ content => template("apt/source.list.erb"),
+ }
+
+ if $pin != false {
+ apt::pin { "${release}": priority => "${pin}" }
+ }
+
+ exec { "${name} apt update":
+ command => "${apt::provider} update",
+ subscribe => File["${name}.list"],
+ refreshonly => true,
+ }
+
+ if $required_packages != false {
+ exec { "${apt::provider} -y install ${required_packages}":
+ subscribe => File["${name}.list"],
+ refreshonly => true,
+ }
+ }
+
+ if $key != false {
+ exec { "apt-key adv --keyserver ${key_server} --recv-keys ${key}":
+ unless => "apt-key list | grep ${key}",
+ before => File["${name}.list"],
+ }
+ }
+
+}
--- /dev/null
+# <%= name %>
+deb <%= location %> <%= release %> <%= repos %>
+<%- if include_src then -%>
+deb-src <%= location %> <%= release %> <%= repos %>
+<%- end -%>