help-cfengine
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

cfservd under Solaris 10 SMF


From: Kurt Reimer
Subject: cfservd under Solaris 10 SMF
Date: Wed, 8 Feb 2006 14:55:44 -0500 (EST)


A search of the help-cfengine and bug-cfengine archives for the acronym "SMF", as in "Solaris 10 Service Management Facility" turns up very little. SMF is a replacement for the familiar system of rc scripts, rc.d directories, and run-levels in earlier Solaris and most other Unix versions. The folks at Sun Microsystems go on at length about it's superior reliability & fault tolerance, finer granularity, etc., but one of it's disadvantages is that you have to develop a "Service Manifest" XML file to describe each service under SMF manaagement, and install them to be read at boot time.

My organization is installing cfengine to manage alot of Solaris and Linux (and some old DEC alpha) machines, and eventually Mac and Windows systems also. Here is a service manifest for cfservd that seems to work. It registers cservd under SMF, starts it at boot, and allows me to monitor and control cfservd via the "svcs" and "svcadm" commands:

cfservd.xml:
============

<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">

<service_bundle type='manifest' name='fccc:cfengine'>

<service
        name='application/cfservd'
        type='service'
        version='2.18'>

        <create_default_instance enabled='false' />

        <single_instance />

        <dependency name='fs-local'
                grouping='require_all'
                restart_on='none'
                type='service'>
                <service_fmri
                        value='svc:/system/filesystem/local' />
        </dependency>

        <dependency name='net-loopback'
                grouping='require_all'
                restart_on='none'
                type='service'>
                <service_fmri value='svc:/network/loopback' />
        </dependency>

        <dependency name='net-physical'
                grouping='require_all'
                restart_on='none'
                type='service'>
                <service_fmri value='svc:/network/physical' />
        </dependency>

        <dependency name='utmp'
                grouping='require_all'
                restart_on='none'
                type='service'>
                <service_fmri value='svc:/system/utmp' />
        </dependency>

        <dependency name='executable_file'
                grouping='require_all'
                restart_on='refresh'
                type='path'>
                <service_fmri
                    value='file://localhost/var/cfengine/bin/cfservd' />
        </dependency>

        <dependency name='config_data'
                grouping='require_all'
                restart_on='restart'
                type='path'>
                <service_fmri
                    value='file://localhost/var/cfengine/inputs/cfservd.conf' />
        </dependency>

        <dependent name='cfservd_multi-user-server'
                grouping='require_all'
                restart_on='none'>
                <service_fmri value='svc:/milestone/multi-user-server' />
        </dependent>

        <exec_method
                type='method'
                name='start'
                exec='/lib/svc/method/cfservd_ctl start'
                timeout_seconds='60'/>

        <exec_method
                type='method'
                name='stop'
                exec=':kill'
                timeout_seconds='60' />

        <exec_method
                type='method'
                name='refresh'
                exec='/lib/svc/method/cfservd_ctl restart'
                timeout_seconds='60' />

        <stability value='Unstable' />

        <template>
                <common_name>
                        <loctext xml:lang='C'>
                        Cfengine cfservd remote exec/copy daemon
                        </loctext>
                </common_name>
                <documentation>
                        <manpage title='cfservd' section='8' 
manpath='/usr/local/man' />
                </documentation>
        </template>

</service>

</service_bundle>

This file goes in /var/svc/manifest/application. The /lib/svc/method/cfservd_ctl file mentioned in it is alot like an RC file, supplying "start", "stop", and "restart" methods used by the SMF system:

cfservd_ctl
===========

#!/sbin/sh
#

# find the named process(es)
findproc() {
  pid=`/usr/bin/ps -ef |
  /usr/bin/grep -w $1 |
  /usr/bin/grep -v grep |
  /usr/bin/awk '{print $2}'`
  echo $pid
}

# kill the named process(es) (borrowed from S15nfs.server)
killproc() {
   pid=`findproc $1`
   [ "$pid" != "" ] && kill $pid
}

case $1 in 'start')
        /var/cfengine/bin/cfservd -f /var/cfengine/inputs/cfservd.conf
        ;;

'stop')
        killproc cfservd
        ;;

'restart')
        killproc cfservd
        /var/cfengine/bin/cfservd -f /var/cfengine/inputs/cfservd.conf
        ;;

*)
        echo "Usage: $0 { start | stop | restart }"
        exit 1
        ;;
esac

exit $?

Yours,

Kurt Reimer




reply via email to

[Prev in Thread] Current Thread [Next in Thread]