Exemple #1
0
class DaemonService(object):
    _svc_tmpl_ = """#!/bin/sh
#
# chkconfig: 2345 86 14
#
# description: Daemon Service to support deployment

if [ -f /etc/init.d/functions ] ; then
  . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
  . /etc/rc.d/init.d/functions
else
  exit 0
fi

RETVAL=0

prog="service_name"
args=""
binary=/xormedia/build/xdeploy/xagent/dist/DeployAgent
pidfile=/var/run/${prog}.pid

start() {
    echo -n $"Starting ${prog} services: "
    if [ -f $pidfile ] ; then
        rm -f $pidfile
    fi
    daemon --pidfile=$pidfile $binary $args
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/${prog} || RETVAL=1
    return $RETVAL
}

stop() {
    echo -n $"Shutting down ${prog} services: "
    killproc -p $pidfile $binary
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/${prog}
    return $RETVAL
}


case "$1" in
    start)
        ps_log=`mktemp /var/tmp/ps.log.XXXXXX`
        ps aux --cols 1024 >"ps_log"
        if grep $binary "ps_log" >/dev/null 2>/dev/null ; then
            echo "${prog} service is up and running, no need start this service again"
        else
            start
        fi
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status ${prog}
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 1
esac
exit $RETVAL
"""

    def __init__(self, cls):
        if not issubclass(cls, Daemon):
            raise TypeError
        self.svc_name = cls._svc_name_
        self.svc_loct = "/etc/init.d/%s" % self.svc_name
        self._txt = TextEditor()

    def create(self, **kwargs):
        if not os.path.exists(self.svc_loct):
            self._txt.load(text=self._svc_tmpl_)
            self._txt.set_param("prog", self.svc_name)
            self._txt.save(self.svc_loct)
            fs.chmod(self.svc_loct, 0o755)
        self.config(**kwargs)

        os.system("chkconfig --add %s" % self.svc_name)

    def delete(self):
        os.system("chkconfig --del %s" % self.svc_name)
        if os.path.exists(self.svc_loct):
            fs.remove(self.svc_loct)

    def config(self, svc_desp=None, exe_name=None, exe_args=None, startup=None):
        exe_name = exe_name or os.path.realpath(sys.argv[0])

        self._txt.load(self.svc_loct)
        self._txt.set_param("binary", '%s' % exe_name)
        if exe_args is not None:
            self._txt.set_param("args", '"%s"' % exe_args)
        if exe_args is not None:
            self._txt.set_param("description", svc_desp, '%(name)s: %(value)s')
        self._txt.save()

        if startup is not None:
            if startup:
                os.system("chkconfig %s on" % self.svc_name)
            else:
                os.system("chkconfig %s off" % self.svc_name)