[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