Skip to end of metadata
Go to start of metadata

How to add a service to Solaris' SMF architecture (with example for rsyncd)

Write a manifesto

[root@sol2 FILER /root]# cat /var/svc/manifest/network/rsync.xml
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="rsync">
<service name="network/rsync" type="service" version="1">
<create_default_instance enabled="false"/>
<single_instance/>
<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="config_data" grouping="require_all" restart_on="restart" type="path">
<service_fmri value="file://localhost/etc/rsyncd.conf"/>
<service_fmri value="file://localhost/etc/default/rsync"/>
</dependency>
<exec_method type="method" name="start" exec="/lib/svc/method/rsync %m" timeout_seconds="30">
</exec_method>
<exec_method type="method" name="restart" exec="/lib/svc/method/rsync %m" timeout_seconds="30">
</exec_method>
<exec_method type="method" name="stop" exec="/lib/svc/method/rsync %m" timeout_seconds="30">
</exec_method>
<template>
<common_name>
<loctext xml:lang="C">
Rsync Service
</loctext>
</common_name>
</template>
</service>
</service_bundle>

Write a method

[root@sol2 FILER /root]# cat /lib/svc/method/rsync
#!/usr/bin/bash
set -e

# /lib/svc/method/rsync: start and stop the RSYNC daemon

DAEMON=/usr/local/bin/rsync
RSYNC_ENABLE=false
RSYNC_OPTS=
RSYNC_DEFAULTS_FILE=/etc/default/rsync
RSYNC_CONFIG_FILE=/etc/rsyncd.conf
PIDFILE=/var/run/rsyncd.pid

test -x $DAEMON || exit 0

if [ -s $RSYNC_DEFAULTS_FILE ]; then
. $RSYNC_DEFAULTS_FILE
case "x$RSYNC_ENABLE" in
xtrue|xfalse) ;;
xinetd) exit 0
;;
*) echo "Value of RSYNC_ENABLE in $RSYNC_DEFAULTS_FILE must be either 'true' or 'false';"
echo "not starting rsync daemon."
exit 1
;;
esac
fi

export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"

case "$1" in
start)
if "$RSYNC_ENABLE"; then
echo -n "Starting rsync daemon: rsync"
if [ -s $PIDFILE ] && kill -0 $(cat $PIDFILE) >/dev/null 2>&1; then
echo " apparently already running."
exit 0
fi
if [ ! -s "$RSYNC_CONFIG_FILE" ]; then
echo " missing or empty config file $RSYNC_CONFIG_FILE"
exit 1
fi
$DAEMON --daemon --config="$RSYNC_CONFIG_FILE" $RSYNC_OPTS
echo "."
else
if [ -s "$RSYNC_CONFIG_FILE" ]; then
echo "rsync daemon not enabled in /etc/default/rsync"
fi
fi
;;
stop)
if [ -s $PIDFILE ] && kill -0 $(cat $PIDFILE) >/dev/null 2>&1; then
echo -n "Stopping rsync daemon: rsync"
/usr/bin/kill -TERM `/usr/bin/cat $PIDFILE`
rm -f $PIDFILE 
echo "."
fi
;;

reload|force-reload)
echo "Reloading rsync daemon: not needed, as the daemon"
echo "re-reads the config file whenever a client connects."
;;

restart)
# set +e
if $RSYNC_ENABLE; then
echo -n "Restarting rsync daemon: "
if [ -s $PIDFILE ] && kill -0 $(cat $PIDFILE) >/dev/null 2>&1; then
/usr/bin/kill -TERM `/usr/bin/cat $PIDFILE`
rm -f $PIDFILE
echo -n "."
fi
if [ ! -s "$RSYNC_CONFIG_FILE" ]; then
echo " missing or empty config file $RSYNC_CONFIG_FILE"
exit 1
fi
sleep 5
$DAEMON --daemon --config="$RSYNC_CONFIG_FILE" $RSYNC_OPTS
if [ $? -ne 0 ]; then
echo "start failed? $?"
rm -f $PIDFILE 
else 
echo "."
fi
else
echo "rsync daemon not enabled in /etc/default/rsync"
fi
;;

*)
echo "Usage: /etc/init.d/rsync {start|stop|reload|force-reload|restart}"
exit 1
esac

exit 0

Validate and import

svccfg validate /var/svc/manifest/network/rsync.xml 
svccfg import /var/svc/manifest/network/rsync.xml

Configure

svcadm enable svc:/network/rsync
svcs -xv

This article was based on the now-dead blog post: http://blogs.sun.com/ritu/entry/how_to_configure_mysql_to