
# Install and configure munin node.
#
class munin::node {
    
    package { "munin-node":
	ensure => installed,
    }
    
    service { "munin-node":
	ensure  => running,
	enable  => true,
	require => Package["munin-node"],
	start   => $operatingsystem ? {
	    OpenBSD => "/usr/bin/install -d -o _munin /var/run/munin; /usr/local/sbin/munin-node",
	    default => undef,
	},
	stop    => $operatingsystem ? {
	    OpenBSD => "/usr/bin/pkill -f /usr/local/sbin/munin-node",
	    default => undef,
	},
    }

    file { "/etc/munin/munin-node.conf":
	ensure  => present,
	content => template("munin/munin-node.conf.erb"),
	owner   => root,
	group   => $operatingsystem ? {
	    OpenBSD => wheel,
	    default => root,
	},
	mode    => 0644,
	require => Package["munin-node"],
	notify  => Exec["munin-node-configure"],
    }
    
    @@file { "/etc/munin/nodes.d/${homename}.conf":
	content => "[${homename}]\n  address ${ipaddress}\n  use_node_name yes\n",
	ensure  => present,
	tag     => "munin",
	notify  => Exec["generate-munin-conf"],
    }
    
    exec { "munin-node-configure":
	command     => "munin-node-configure --shell 2>/dev/null | /bin/sh",
	path        => "/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin",
	user        => root,
	refreshonly => true,
	notify      => Service["munin-node"],
    }

    munin::plugin { "vmware_vms": config => "vmware" }
    
}


# Configure SNMP node.
#
# === Parameters
#
#   $name:
#       Target SNMP host.
#   $snmp_community:
#       SNMP community. Defaults to public.
#   $snmp_version:
#       SNMP version. Defaults to 2.
#
# === Sample usage
#
# munin::snmpnode { "sw1.example.com":
#     snmp_community => "mycommunity",
# }
#
define munin::snmpnode($snmp_community="public", $snmp_version="2") {

    file { "/etc/munin/plugin-conf.d/snmp_${name}":
        content => "[snmp_${name}_*]\nenv.community ${snmp_community}\nenv.version ${snmp_version}\n",
        ensure  => present,
        owner   => root,
        group   => $operatingsystem ? {
            OpenBSD => wheel,
            default => root,
        },
        mode    => 0600,
        notify  => Service["munin-node"],
    }

    @@file { "/etc/munin/nodes.d/${name}.conf":
        content => "[${name}]\n  address ${ipaddress}\n  use_node_name no\n",
        ensure  => present,
        tag     => "munin",
        notify  => Exec["generate-munin-conf"],
    }

}


# Add new custom munin plugin.
#
# === Parameters
#
#   $name:
#	Plugin name to install.
#   $config:
#       Configuration file name associated with plugin. Defaults to none.
#
# === Sample usage
#
# munin::plugin { "vmware_vms":
#     config => "vmware",
# }
#
define munin::plugin($config = "") {

    case $operatingsystem {
	OpenBSD: {
	    file { "/usr/local/libexec/munin/plugins/${name}":
		ensure  => present,
		source  => "puppet:///modules/munin/plugins/${name}",
		owner   => root,
		group   => wheel,
		mode    => 0755,
		require => Package["munin-node"],
	    }
        }
	default: {
	    file { "/usr/share/munin/plugins/${name}":
		ensure  => present,
		source  => "puppet:///modules/munin/plugins/${name}",
		owner   => root,
		group   => root,
		mode    => 0755,
		require => Package["munin-node"],
	    }
	}
    }

    if ($config) {
	file { "/etc/munin/plugin-conf.d/${config}":
	    ensure  => present,
	    source  => [ "puppet:///files/munin/plugin-conf/${config}.${fqdn}",
			 "puppet:///files/munin/plugin-conf/${config}",
			 "puppet:///modules/munin/plugin-conf/${config}", ],
	    owner   => root,
	    group   => $operatingsystem ? {
		OpenBSD => wheel,
		default => root,
	    },
	    mode    => 0644,
	    notify  => Service["munin-node"],
	    require => $operatingsystem ? {
		OpenBSD => File["/usr/local/libexec/munin/plugins/${name}"],
		default => File["/usr/share/munin/plugins/${name}"],
            },
	}
    }

    case $operatingsystem {
	OpenBSD: {
	    exec { "munin-enable-${name}":
		command => "ln -s /usr/local/libexec/munin/plugins/${name} /etc/munin/plugins/${name}",
		path    => "/bin:/usr/bin:/sbin:/usr/sbin",
		user    => root,
		onlyif  => [ "test ! -h /etc/munin/plugins/${name}",
			     "/usr/local/libexec/munin/plugins/${name} autoconf", ],
		notify  => Service["munin-node"],
		require => File["/usr/local/libexec/munin/plugins/${name}"],
	    }
	}
	default: {
	    exec { "munin-enable-${name}":
		command => "ln -s /usr/share/munin/plugins/${name} /etc/munin/plugins/${name}",
		path    => "/bin:/usr/bin:/sbin:/usr/sbin",
		user    => root,
		onlyif  => [ "test ! -h /etc/munin/plugins/${name}",
			     "/usr/share/munin/plugins/${name} autoconf", ],
		notify  => Service["munin-node"],
		require => File["/usr/share/munin/plugins/${name}"],
	    }
	}
    }

}


# Install and configure munin server.
#
# === Requires
#
#  * Storedconfigs
#
class munin::server {
    
    package { "munin":
	ensure => installed,
    }
    
    if $munin_datadir {
        file { "${munin_datadir}":
            ensure  => directory,
            mode    => 0755,
            owner   => munin,
            group   => munin,
            require => Package["munin"],
        }

        file { "/var/lib/munin":
            ensure  => "${munin_datadir}",
            force   => true,
            backup  => ".orig",
            require => File["${munin_datadir}"],
        }
    }

    if $munin_htmldir {
        file { "${munin_htmldir}":
            ensure  => directory,
            mode    => 0755,
            owner   => munin,
            group   => munin,
            require => Package["munin"],
        }

        file { "/var/www/html/munin":
            ensure  => "${munin_htmldir}",
            force   => true,
            backup  => ".orig",
            require => File["${munin_htmldir}"],
        }
    }

    file { "/etc/munin/nodes.d":
	ensure  => directory,
	purge   => true,
	force   => true,
	recurse => true,
	owner   => root,
	group   => root,
	mode    => 0644,
	source  => "puppet:///modules/custom/empty",
	require => Package["munin"],
    }
    
    file { "/etc/munin/munin.conf.in":
	ensure  => present,
	source  => [ "puppet:///files/munin/munin.conf.in",
		     "puppet:///modules/munin/munin.conf.in", ],
	owner   => root,
	group   => root,
	mode    => 0644,
	require => Package["munin"],
	notify  => Exec["generate-munin-conf"],
    }
    
    exec { "generate-munin-conf":
	command     => "cat /etc/munin/munin.conf.in /etc/munin/nodes.d/*.conf > /etc/munin/munin.conf",
	path        => "/bin:/usr/bin:/sbin:/usr/sbin",
	user        => root,
	refreshonly => true,
	require     => File["/etc/munin/munin.conf.in"],
    }
    
    File <<| tag == "munin" |>>
    
}
