# == 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.6.16',
  $eplite_version   = ''
) {

  user { $ep_user:
    shell   => '/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"],
    ],
  }

  # Allow existing install to exist without modifying its git repo.
  # But give the option to specify versions for new installs.
  if $eplite_version != '' {
    vcsrepo { "${base_install_dir}/etherpad-lite":
      ensure   => present,
      provider => git,
      source   => 'https://github.com/ether/etherpad-lite.git',
      owner    => $ep_user,
      revision => $eplite_version,
      require  => Package['git'],
    }
  } else {
    vcsrepo { "${base_install_dir}/etherpad-lite":
      ensure   => present,
      provider => git,
      source   => 'https://github.com/Pita/etherpad-lite.git',
      owner    => $ep_user,
      require  => Package['git'],
    }
  }

  exec { 'install_etherpad_dependencies':
    command     => './bin/installDeps.sh',
    path        =>
      "/usr/bin:/bin:/usr/local/bin:${base_install_dir}/etherpad-lite",
    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
}
