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)