Colleen Murphy 65eab03783 Use versioncmp function
Without this patch, puppet uses lexicographic ordering to compare the
version string in the operatingsystemrelease fact to the string '14.04',
which works fine on puppet 4 since it is comparing two strings but it is
more correct to use the versioncmp function.

Change-Id: I56d989d22229db3d606e4ac7f788925c216721a0
2018-08-13 17:35:42 +02:00

199 lines
5.3 KiB
Puppet

# == Class: ethercalc
#
# Class to install ethercalc.
#
# To use ethercalc you will want the following includes:
# include ethercalc
# include ethercalc::redis # necessary to use mysql as the backend
# include ethercalc::site # configures ethercalc instance
# include ethercalc::apache # will add reverse proxy on localhost
# The defaults for all the classes should just work (tm)
#
#
class ethercalc (
$base_install_dir = '/opt/ethercalc',
$base_log_dir = '/var/log',
$ethercalc_user = 'ethercalc',
$ethercalc_version= '0.20161220.1',
# If set to system will install system package, otherwise
# we try to choose one based on the host platform
$nodejs_version = undef,
) {
$path = '/usr/local/bin:/usr/bin:/bin'
# For trusty default to upstart, node 4.x. For Xenial onwards use
# node 6.x for updated dependencies and the default systemd service
# file
case $::operatingsystem {
'Ubuntu': {
if versioncmp($::operatingsystemrelease, '14.04') <= 0 {
$use_upstart = true
if ! $nodejs_version {
$use_nodejs_version = '4.x'
}
}
else {
if ! $nodejs_version {
$use_nodejs_version = '6.x'
}
}
}
default: {
# TODO(ianw) -- not sure this is a sane default, but it's the
# way it was...
if ! $nodejs_version {
$use_nodejs_version = '4.x'
} else {
$use_nodejs_version = $nodejs_version
}
}
}
group { $ethercalc_user:
ensure => present,
}
user { $ethercalc_user:
shell => '/usr/sbin/nologin',
home => $base_install_dir,
system => true,
gid => $ethercalc_user,
require => Group[$ethercalc_user],
}
file { $base_install_dir:
ensure => directory,
owner => $ethercalc_user,
group => $ethercalc_user,
mode => '0664',
}
if !defined(Package['curl']) {
package { 'curl':
ensure => present,
}
}
file { "${base_log_dir}/${ethercalc_user}":
ensure => directory,
owner => $ethercalc_user,
}
anchor { 'nodejs-package-install': }
if ($use_nodejs_version != 'system') {
class { '::nodejs':
repo_url_suffix => $use_nodejs_version,
legacy_debian_symlinks => false,
before => Anchor['nodejs-package-install'],
}
} else {
package { ['nodejs', 'npm']:
ensure => present,
before => Anchor['nodejs-package-install'],
}
}
exec { 'install-ethercalc':
command => "npm install ethercalc@${ethercalc_version}",
unless => "npm ls | grep ethercalc@${ethercalc_version}",
path => $path,
cwd => $base_install_dir,
require => Anchor['nodejs-package-install'],
}
# NOTE(cmurphy) Workaround global install issue
# https://github.com/audreyt/ethercalc/issues/542
if ($use_nodejs_version == '6.x') {
file { "${base_install_dir}/node_modules/ethercalc/node_modules":
ensure => directory,
require => [File[$base_install_dir], Exec['install-ethercalc']],
}
file { "${base_install_dir}/node_modules/ethercalc/node_modules/socialcalc":
ensure => link,
target => "${base_install_dir}/node_modules/socialcalc",
require => File["${base_install_dir}/node_modules/ethercalc/node_modules"],
}
}
# TODO(ianw): remove this when trusty is dropped
if $use_upstart {
file { '/etc/init/ethercalc.conf':
ensure => present,
content => template('ethercalc/upstart.erb'),
replace => true,
owner => 'root',
require => Exec['install-ethercalc'],
}
file { '/etc/init.d/ethercalc':
ensure => link,
target => '/lib/init/upstart-job'
}
service { 'ethercalc':
ensure => running,
enable => true,
require => File['/etc/init/ethercalc.conf'],
}
include ::logrotate
logrotate::file { 'ethercalc_error':
log => "${base_log_dir}/${ethercalc_user}/error.log",
options => [
'compress',
'copytruncate',
'missingok',
'rotate 7',
'daily',
'notifempty',
],
require => Service['ethercalc'],
}
logrotate::file { 'ethercalc_access':
log => "${base_log_dir}/${ethercalc_user}/access.log",
options => [
'compress',
'copytruncate',
'missingok',
'rotate 7',
'daily',
'notifempty',
],
require => Service['ethercalc'],
}
} else {
# Note logs go to syslog, can maybe change when
# https://github.com/systemd/systemd/pull/7198 is available
file { '/etc/systemd/system/ethercalc.service':
ensure => present,
content => template('ethercalc/ethercalc.service.erb'),
replace => true,
owner => 'root',
require => Exec['install-ethercalc'],
}
# This is a hack to make sure that systemd is aware of the new service
# before we attempt to start it.
exec { 'ethercalc-systemd-daemon-reload':
command => '/bin/systemctl daemon-reload',
before => Service['ethercalc'],
subscribe => File['/etc/systemd/system/ethercalc.service'],
refreshonly => true,
}
service { 'ethercalc':
ensure => running,
enable => true,
require => File['/etc/systemd/system/ethercalc.service'],
}
}
}