Changes

From SME Server
Jump to navigationJump to search
6,862 bytes added ,  19:23, 15 May 2014
Created page with "==Start a boot a custom service== If you want to start a custom service on the SME Server, you will have to follow some steps. add a script to /etc/rc.d/init.d like the scri..."
==Start a boot a custom service==

If you want to start a custom service on the SME Server, you will have to follow some steps.

add a script to /etc/rc.d/init.d like the script below

nano /etc/rc.d/init.d/YOUR_SERVICE_NAME

#!/bin/sh
### BEGIN INIT INFO
# Provides: <NAME>
# Required-Start: $local_fs $network $named $time $syslog
# Required-Stop: $local_fs $network $named $time $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: <DESCRIPTION>
### END INIT INFO

SCRIPT=<COMMAND>
RUNAS=<USERNAME>
NAME=<YOUR_SERVICE_NAME>

PIDFILE=/var/run/$NAME.pid
LOGFILE=/var/log/$NAME.log

start() {
if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE); then
echo 'Service already running' >&2
return 1
fi
echo 'Starting service…' >&2
local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!"
su -c "$CMD" $RUNAS > "$PIDFILE"
echo 'Service started' >&2
}

stop() {
if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then
echo 'Service not running' >&2
return 1
fi
echo 'Stopping service…' >&2
kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"
echo 'Service stopped' >&2
}

status() {
printf "%-50s" "Checking $NAME..."
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
if [ -z "`ps axf | grep ${PID} | grep -v grep`" ]; then
printf "%s\n" "Process dead but pidfile exists"
else
echo "Running, the PID is $PID"
fi
else
printf "%s\n" "Service not running"
fi
}


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

you have to fill these fields with the relevant values

<nowiki># Provides: <NAME></nowiki>
..
<nowiki># Description: <DESCRIPTION></nowiki>
..
SCRIPT=<COMMAND> #path to the script you want to start automatically
RUNAS=<USERNAME> #user who run the script (can be root or other choice)
NAME=<YOUR_SERVICE_NAME> #name of the service.

make that script executable

chmod u+x /etc/rc.d/init.d/YOUR_SERVICE_NAME

You have to say to SME Server to add that script to each run level you have specified at the top of your init script( Default-Start: 2 3 4 5 and Default-Stop: 0 1 6 ). For Linux using rpm as centos or redhat, you can use

chkconfig YOUR_SERVICE_NAME --add

if you want to see which level you start the script

chkconfig YOUR_SERVICE_NAME --list

example :
# chkconfig dhcp-dns --list
dhcp-dns 0:arrêt 1:arrêt 2:marche 3:marche 4:marche 5:marche 6:arrêt


However it is not enough for SME server since we have to add service to rc7.d and to say to our distro to start thab service at boot



===allow a service to start for a particular time===
If your package implements a server or daemon, you will probably want it to be started automatically when the system boots. The SME Server boots in runlevel 7, so you can get an idea of the startup processes by listing the contents of /etc/rc.d/rc7.d.

These are similar to the init scripts you may be familiar with from other Linux systems, with one important difference. Instead of pointing to scripts within /etc/rc.d/init.d, all of those init entries are links to /etc/rc.d/init.d/e-smith-service. This is a wrapper which checks the configuration database to see if the service is supposed to be running and if so, starts the service from /etc/rc.d/init.d/whatever.

So for example, you might have:

S90squid -> /etc/rc.d/init.d/e-smith-service

The e-smith-service script looks up the name it was invoked with (S90squid), drops the prefix (leaving squid), checks the configuration database for the "squid" service, then if it's supposed to run, does:

/etc/rc.d/init.d/squid start

* with this way SME's knows how to/if start the service at startup

config set '''YOUR_SERVICE_NAME''' service status enabled

if your init script is not already in etc/rc.d/init.d you can do a link to you the init script
cd /etc/rc.d/init.d
ln -s /path/to/myinitscript '''YOUR_SERVICE_NAME'''

'''We are creating a symlink of the original startup script with a new name (the point is that '''YOUR_SERVICE_NAME''' must be identical to the service name above)'''

then in /etc/rc7.d we do a link to the wrapper e-smith-service

cd /etc/rc7.d
ln -s /etc/rc.d/init.d/e-smith-service '''SXXYOUR_SERVICE_NAME'''

we create a symlink to e-smith-service startup script with a name where: S tells SME to start XX are numbers

You can decide when to start the service '''YOUR_SERVICE_NAME''', but you should not start something that need the network before the network itself is up and running. Therefore you can see the content of /etc/rc7.d and see which scripts are needed to execute your new startup script

signal-event remoteaccess-update
service '''YOUR_SERVICE_NAME''' start
====Creating or deleting a service====
Some examples
*Creating and starting service

ln -f -s /etc/rc.d/init.d/e-smith-service /etc/rc7.d/S98popfile
/sbin/e-smith/db configuration set popfile service status enabled
/sbin/e-smith/signal-event remoteaccess-update
service popfile start

*Deleting and unregistering service

service popfile stop
sleep 3
rm -f /etc/rc7.d/S98popfile
rm -f /etc/rc.d/init.d/popfile
/sbin/e-smith/config delete popfile
/sbin/e-smith/signal-event remoteaccess-update

====Create a service with db command and set network access====
[[DB_Variables_Configuration#Additional_information_on_customizing_iptables]]

Create a custom-named service definition in the configuration database.

db configuration set <servicename> service

Apply your desired firewall restrictions to any existing SME 'service' or to a custom-named service that you have created. Combine a custom-named service with port-forwarding to create customized firewall rules.

db configuration setprop <servicename> TCPPort <portnumber>
db configuration setprop <servicename> TCPPorts <portnumbers> # Ranges of ports are defined with a : not a -
db configuration setprop <servicename> UDPPort <portnumber>
db configuration setprop <servicename> UDPPorts <portnumbers> # Ranges of ports are defined with a : not a -
db configuration setprop <servicename> status enabled|disabled
db configuration setprop <servicename> access public|private
db configuration setprop <servicename> AllowHosts a.b.c.d,x.y.z.0/24
db configuration setprop <servicename> DenyHosts e.f.g.h,l.m.n.0/24


Effectuate the changes you have made
signal-event remoteaccess-update

=== General Service Handling ===

*start
sv u /service/servicename
*stop
sv d /service/servicename
*restart
sv t /service/servicename

{{tip box|you may use TAB to auto-complete your command line}}

All other linux common way to start or stop services are also valuable

/etc/init.d/servicename start/stop/status
service servicename start/stop/status

====Example====

Restarting:

sv t /service/httpd-e-smith

[[category:developer]]

Navigation menu