# == Class: etherpad_lite
#
# Class to install etherpad lite. Puppet acts a lot like a package manager
# through this class.
#
# To use etherpad lite you will want the following includes:
# include etherpad_lite
# include etherpad_lite::mysql # necessary to use mysql as the backend
# include etherpad_lite::site # configures etherpad lite instance
# include etherpad_lite::apache # will add reverse proxy on localhost
# The defaults for all the classes should just work (tm)
#
#
class etherpad_lite (
  $ep_user          = 'eplite',
  $base_log_dir     = '/var/log',
  $base_install_dir = '/opt/etherpad-lite',
  $nodejs_version   = 'v0.10.21',
  $eplite_version   = 'develop',
  $ep_ensure        = 'present',
) {

  # where the modules are, needed to easily install modules later
  $modules_dir = "${base_install_dir}/etherpad-lite/node_modules"
  $path = "/usr/bin:/bin:/usr/local/bin:${base_install_dir}/etherpad-lite"

  user { $ep_user:
    shell   => '/usr/sbin/nologin',
    home    => "${base_log_dir}/${ep_user}",
    system  => true,
    gid     => $ep_user,
    require => Group[$ep_user],
  }

  group { $ep_user:
    ensure => present,
  }

  # Below is what happens when you treat puppet as a package manager.
  # This is probably bad, but it works and you don't need to roll .debs.
  file { $base_install_dir:
    ensure => directory,
    group  => $ep_user,
    mode   => '0664',
  }

  vcsrepo { "${base_install_dir}/nodejs":
    ensure   => present,
    provider => git,
    source   => 'https://github.com/joyent/node.git',
    revision => $nodejs_version,
    require  => [
        Package['git'],
        File[$base_install_dir],
    ],
  }

  package { [
      'gzip',
      'curl',
      'python',
      'libssl-dev',
      'pkg-config',
      'abiword',
      'build-essential',
    ]:
    ensure => present,
  }

  package { ['nodejs', 'npm']:
    ensure => purged,
  }

  buildsource { "${base_install_dir}/nodejs":
    timeout => 900, # 15 minutes
    creates => '/usr/local/bin/node',
    require => [
      Package['gzip'],
      Package['curl'],
      Package['python'],
      Package['libssl-dev'],
      Package['pkg-config'],
      Package['build-essential'],
      Vcsrepo["${base_install_dir}/nodejs"],
    ],
  }

  vcsrepo { "${base_install_dir}/etherpad-lite":
    ensure   => $ep_ensure,
    provider => git,
    source   => 'https://github.com/ether/etherpad-lite.git',
    owner    => $ep_user,
    revision => $eplite_version,
    require  => [
        Package['git'],
        User[$ep_user],
    ],
  }

  exec { 'install_etherpad_dependencies':
    command     => './bin/installDeps.sh',
    path        => $path,
    user        => $ep_user,
    cwd         => "${base_install_dir}/etherpad-lite",
    environment => "HOME=${base_log_dir}/${ep_user}",
    require     => [
      Vcsrepo["${base_install_dir}/etherpad-lite"],
      Buildsource["${base_install_dir}/nodejs"],
    ],
    before      => File["${base_install_dir}/etherpad-lite/settings.json"],
    creates     => "${base_install_dir}/etherpad-lite/node_modules",
  }

  file { '/etc/init/etherpad-lite.conf':
    ensure  => present,
    content => template('etherpad_lite/upstart.erb'),
    replace => true,
    owner   => 'root',
  }

  file { '/etc/init.d/etherpad-lite':
    ensure => link,
    target => '/lib/init/upstart-job',
  }

  file { "${base_log_dir}/${ep_user}":
    ensure => directory,
    owner  => $ep_user,
  }
  # end package management ugliness
}