Report abuse

# $Id: supervise.pp 1250 2009-12-09 01:43:27Z monachus $

class global::supervise {

    # This can be overridden in a client config
    $service_dir = "/service"

    # === Overview
    # This sets up the daemontools environment according to our needs.  We
    # link from /service to directories in /etc/service.d.
    #
    # === Variables
    # None
    #
    # === Usage
    # To set up a default daemontools environment, simply call:
    # 
    #     daemontools { $fqdn: }
    # 
    define supervise() {
    
        # Install daemontools and keep it current
        os::package { "daemontools":
            ensure => latest,
        }
        
        # Don't enable svscan because we run it out of inittab
        service { "svscan":
            enable => false,
            running => false,
        }
        
        # Make sure our directory is in place
        file { $service: 
            ensure => directory,
            require => Package["daemontools"],
        }
        
        # Make sure our target directory is in place
        file { "/etc/service.d":
            ensure => directory,
            mode => 0644,
            require => Package["daemontools"],
       	 }
       	 
    }
    
    # === Overview
    # This will create a link from <tt>/etc/service.d/something</tt> to
    # <tt>/service/something</tt>.  We force the user to specify the
    # full path to +target+ in case it's not in <tt>/etc/service.d</tt>.
    #
    # Once this link is made, the service will come up, so call this
    # after you call <tt>setup_env</tt> below.
    #
    # === Variables
    # +target+:: Target for symlink []
    #
    # === Usage
    # To create a link to a service "tinydns" use the following:
    #
    #     link { "tinydns":
    #         target => "/etc/service.d/tinydns",
    #     }
    #
    define link( $target ) {
        file { "service-${name}":
            path => "${service}/${name}",
            ensure => $target,
            require => Service["svscan"],
        }
    }

    # === Overview
    # This will create a full daemontools directory from puppet sources.  It pulls
    # the source directory in its entirety from the specified source location.
    # 
    # If the title has <tt>::</tt> in it, then those are broken out into <tt>/</tt>
    # to designate a location.
    #
    # === Variables
    # +user+:: Owner of the directory [+root+]
    # +group+:: Group owner of the directory [<tt>$rootgroup</tt>]
    # +log+:: If we're using multilog to write to <tt>/var/log/service</tt> [+false+]
    # +svcdir+:: Target service directory [<tt>/etc/service.d</tt>]
    # 
    # === Usage
    # To set up an environment for "tinydns" with defaults:
    #
    #     setup_env { "tinydns":
    #        log => true,
    #        user => "tinydns",
    #     }
    #
    # A more complicated example that gets its content from <tt>modules/arces/ldap/server/service.d</tt>
    # and writes it out as <tt>/etc/service.d/slapd</tt>
    #
    #     setup_env { "arces::ldap::server":
    #         name => "slapd",
    #     }  
    define setup_env( $user="root", $group=$rootgroup, log=false, $svcdir="/etc/service.d" ) {
    
        # turn :: into /
        $location = regsubst( $title, '::', '/' )
        
        # set up our log destination
        if( $log ) {
            file { "/var/log/${name}":
                ensure => directory,
                owner => $user,
                group => $group,
                mode => 0640,
            }
        } else {
            file { "/var/log/${name}":
                ensure => absent,
            }
        }
        
        # Bring over our service.d content and make sure it sticks   
        file { "svcdir_${name}":
            path => "${svcdir}/${name}",
            ensure => directory,
            mode => 0640,
            source => [
                "puppet:///${client}/${location}/service.d.${hostname}",
                "puppet:///${client}/${location}/service.d.${cluster}",
                "puppet:///${client}/${location}/service.d",
                "puppet:///global/${location}/service.d",
            ],
            recurse => true,
            force => true,
            purge => true,
            ignore => ["supervise"],
        }
    }
}