# Class: mediawiki
#
class mediawiki(
  $mediawiki_location         = '/srv/mediawiki/w',
  $mediawiki_images_location  = '/srv/mediawiki/images',
  $role                       = 'all',
  $site_hostname              = $::fqdn,
  $serveradmin                = "webmaster@${::fqdn}",
  $ssl_cert_file              = undef,
  $ssl_cert_file_contents     = undef,
  $ssl_chain_file             = undef,
  $ssl_chain_file_contents    = undef,
  $ssl_key_file               = undef,
  $ssl_key_file_contents      = undef,
  $wg_recaptchasitekey        = undef,
  $wg_recaptchasecretkey      = undef,
  $wg_googleanalyticsaccount  = undef,
  $wg_dbserver                = 'localhost',
  $wg_dbname                  = 'wikidb',
  $wg_dbuser                  = 'wikiuser',
  $wg_dbpassword              = undef,
  $wg_secretkey               = undef,
  $wg_upgradekey              = undef,
  $wg_sitename                = undef,
  $wg_logo                    = undef,
  $favicon_path               = undef,
  $wg_openidforcedprovider    = 'https://login.launchpad.net/+openid',
  $disallow_robots            = false,
) {

  if ($role == 'app' or $role == 'all') {
    # This is equivalent to apache::dev which is not puppet3
    # compatible with puppetlabs-apache 0.0.4:
    package { ['libaprutil1-dev', 'libapr1-dev', 'apache2-prefork-dev']:
      ensure => present,
    }

    file { '/srv/mediawiki':
      ensure => directory,
    }

    file { '/srv/mediawiki/Settings.php':
      ensure  => file,
      content => template('mediawiki/Settings.php.erb'),
      group   => 'www-data',
      mode    => '0640',
      owner   => 'root',
      require => File['/srv/mediawiki'],
    }

    if $disallow_robots == true {
      file { '/srv/mediawiki/robots.txt':
        ensure  => file,
        group   => 'root',
        mode    => '0444',
        owner   => 'root',
        source  => 'puppet:///modules/mediawiki/disallow_robots.txt',
        require => File['/srv/mediawiki'],
      }
    }

    include ::httpd
    include ::mediawiki::php
    include ::mediawiki::app

    mediawiki::extension { [ 'ConfirmEdit',
        'OpenID',
        'Renameuser',
        'WikiEditor',
        'CodeEditor',
        'Scribunto',
        'Gadgets',
        'CategoryTree',
        'ParserFunctions',
        'SyntaxHighlight_GeSHi',
        'Cite',
        'cldr',
        'Babel',
        'Translate',
        'Collection',
        'Nuke',
        'AntiSpoof',
        'Mantle',
        'MobileFrontend',
        'SubPageList3',
        'ReplaceText',
        'googleAnalytics',
        'Echo',
        'UniversalLanguageSelector',
        'Elastica',
        'CirrusSearch',
        'SpamBlacklist',
        'SmiteSpam' ]:
    }

    mediawiki::extension { 'EmbedVideo':
        ensure   => present,
        source   => 'https://github.com/HydraWiki/mediawiki-embedvideo.git',
        revision => 'origin/master', # Not from Wikimedia repos :(
    }

    mediawiki::extension { 'strapping':
        type   => 'skin',
        source => 'https://gerrit.wikimedia.org/r/p/mediawiki/skins/mediawiki-strapping.git',
    }

    file { '/srv/mediawiki/w/LocalSettings.php':
        ensure  => link,
        target  => '/srv/mediawiki/Settings.php',
        require => Vcsrepo['/srv/mediawiki/w'],
    }

    package { ['libapache2-mod-php',
      'lua5.2']:
      ensure => present,
    }

    # To use the standard ssl-certs package snakeoil certificate, leave both
    # $ssl_cert_file and $ssl_cert_file_contents empty. To use an existing
    # certificate, specify its path for $ssl_cert_file and leave
    # $ssl_cert_file_contents empty. To manage the certificate with puppet,
    # provide $ssl_cert_file_contents and optionally specify the path to use for
    # it in $ssl_cert_file.
    if ($ssl_cert_file == undef) and ($ssl_cert_file_contents == undef) {
      $cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem'
      if ! defined(Package['ssl-cert']) {
        package { 'ssl-cert':
          ensure => present,
          before => Httpd::Vhost[$site_hostname],
        }
      }
    } else {
      if $ssl_cert_file == undef {
        $cert_file = "/etc/ssl/certs/${::fqdn}.pem"
        if ! defined(File['/etc/ssl/certs']) {
          file { '/etc/ssl/certs':
            ensure => directory,
            owner  => 'root',
            group  => 'root',
            mode   => '0755',
            before => File[$cert_file],
          }
        }
      } else {
        $cert_file = $ssl_cert_file
      }
      if $ssl_cert_file_contents != undef {
        file { $cert_file:
          ensure  => present,
          owner   => 'root',
          group   => 'root',
          mode    => '0644',
          content => $ssl_cert_file_contents,
          before  => Httpd::Vhost[$site_hostname],
        }
      }
    }

    # To avoid using an intermediate certificate chain, leave both
    # $ssl_chain_file and $ssl_chain_file_contents empty. To use an existing
    # chain, specify its path for $ssl_chain_file and leave
    # $ssl_chain_file_contents empty. To manage the chain with puppet, provide
    # $ssl_chain_file_contents and optionally specify the path to use for it in
    # $ssl_chain_file.
    if ($ssl_chain_file == undef) and ($ssl_chain_file_contents == undef) {
      $chain_file = undef
    } else {
      if $ssl_chain_file == undef {
        $chain_file = "/etc/ssl/certs/${::fqdn}_intermediate.pem"
        if ! defined(File['/etc/ssl/certs']) {
          file { '/etc/ssl/certs':
            ensure => directory,
            owner  => 'root',
            group  => 'root',
            mode   => '0755',
            before => File[$chain_file],
          }
        }
      } else {
        $chain_file = $ssl_chain_file
      }
      if $ssl_chain_file_contents != undef {
        file { $chain_file:
          ensure  => present,
          owner   => 'root',
          group   => 'root',
          mode    => '0644',
          content => $ssl_chain_file_contents,
          before  => Httpd::Vhost[$site_hostname],
        }
      }
    }

    # To use the standard ssl-certs package snakeoil key, leave both
    # $ssl_key_file and $ssl_key_file_contents empty. To use an existing key,
    # specify its path for $ssl_key_file and leave $ssl_key_file_contents empty.
    # To manage the key with puppet, provide $ssl_key_file_contents and
    # optionally specify the path to use for it in $ssl_key_file.
    if ($ssl_key_file == undef) and ($ssl_key_file_contents == undef) {
      $key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'
      if ! defined(Package['ssl-cert']) {
        package { 'ssl-cert':
          ensure => present,
          before => Httpd::Vhost[$site_hostname],
        }
      }
    } else {
      if $ssl_key_file == undef {
        $key_file = "/etc/ssl/private/${::fqdn}.key"
        if ! defined(File['/etc/ssl/private']) {
          file { '/etc/ssl/private':
            ensure => directory,
            owner  => 'root',
            group  => 'root',
            mode   => '0700',
            before => File[$key_file],
          }
        }
      } else {
        $key_file = $ssl_key_file
      }
      if $ssl_key_file_contents != undef {
        file { $key_file:
          ensure  => present,
          owner   => 'root',
          group   => 'root',
          mode    => '0600',
          content => $ssl_key_file_contents,
          before  => Httpd::Vhost[$site_hostname],
        }
      }
    }

    ::httpd::vhost { $site_hostname:
      port       => 443, # Is required despite not being used.
      docroot    => '/var/www',
      priority   => '50',
      template   => 'mediawiki/apache/mediawiki.erb',
      ssl        => true,
      vhost_name => $site_hostname,
    }
    httpd_mod { 'rewrite':
      ensure => present,
      before => Service['httpd'],
    }
    httpd_mod { 'expires':
      ensure => present,
      before => Service['httpd'],
    }
  }
  if ($role == 'image-scaler' or $role == 'all') {
    include ::mediawiki::image_scaler
    include ::mediawiki::php
    include ::mediawiki::app
  }
}

# vim:sw=2:ts=2:expandtab:textwidth=79