merged latest from rel/5.1
This commit is contained in:
commit
615b723270
16 changed files with 165 additions and 751 deletions
|
@ -167,6 +167,7 @@ all: change-files
|
||||||
change-files:
|
change-files:
|
||||||
$(call change-files,gui/core-gui)
|
$(call change-files,gui/core-gui)
|
||||||
$(call change-files,scripts/core-daemon.service)
|
$(call change-files,scripts/core-daemon.service)
|
||||||
|
$(call change-files,scripts/core-daemon)
|
||||||
$(call change-files,daemon/core/constants.py)
|
$(call change-files,daemon/core/constants.py)
|
||||||
|
|
||||||
CORE_DOC_HTML = core-html-$(PACKAGE_VERSION)
|
CORE_DOC_HTML = core-html-$(PACKAGE_VERSION)
|
||||||
|
|
|
@ -15,11 +15,11 @@ AM_INIT_AUTOMAKE([tar-ustar])
|
||||||
PACKAGE_DATE=m4_esyscmd_s([date +%Y%m%d])
|
PACKAGE_DATE=m4_esyscmd_s([date +%Y%m%d])
|
||||||
PACKAGE_VENDOR="CORE Developers"
|
PACKAGE_VENDOR="CORE Developers"
|
||||||
PACKAGE_MAINTAINERS="$PACKAGE_VENDOR <$PACKAGE_BUGREPORT>"
|
PACKAGE_MAINTAINERS="$PACKAGE_VENDOR <$PACKAGE_BUGREPORT>"
|
||||||
|
|
||||||
|
# core specific variables
|
||||||
CORE_LIB_DIR="\${prefix}/lib/core"
|
CORE_LIB_DIR="\${prefix}/lib/core"
|
||||||
# TODO: hard setting path, until support by setup.py
|
|
||||||
CORE_CONF_DIR="/etc/core"
|
CORE_CONF_DIR="/etc/core"
|
||||||
CORE_DATA_DIR="\${datarootdir}/core"
|
CORE_DATA_DIR="\${datadir}/core"
|
||||||
# TODO: verify there is need to hard set /var
|
|
||||||
CORE_STATE_DIR="/var"
|
CORE_STATE_DIR="/var"
|
||||||
|
|
||||||
AC_SUBST(PACKAGE_DATE)
|
AC_SUBST(PACKAGE_DATE)
|
||||||
|
@ -194,7 +194,6 @@ AM_CONDITIONAL(WANT_PYTHON, test x$want_python = xyes)
|
||||||
AM_CONDITIONAL(WANT_NETNS, test x$want_linux_netns = xyes)
|
AM_CONDITIONAL(WANT_NETNS, test x$want_linux_netns = xyes)
|
||||||
AM_CONDITIONAL(WANT_INITD, test x$with_startup = xinitd)
|
AM_CONDITIONAL(WANT_INITD, test x$with_startup = xinitd)
|
||||||
AM_CONDITIONAL(WANT_SYSTEMD, test x$with_startup = xsystemd)
|
AM_CONDITIONAL(WANT_SYSTEMD, test x$with_startup = xsystemd)
|
||||||
AM_CONDITIONAL(WANT_SUSE, test x$with_startup = xsuse)
|
|
||||||
|
|
||||||
if test $cross_compiling = no; then
|
if test $cross_compiling = no; then
|
||||||
AM_MISSING_PROG(HELP2MAN, help2man)
|
AM_MISSING_PROG(HELP2MAN, help2man)
|
||||||
|
|
|
@ -17,9 +17,6 @@ endif
|
||||||
SCRIPT_FILES := $(notdir $(wildcard scripts/*))
|
SCRIPT_FILES := $(notdir $(wildcard scripts/*))
|
||||||
MAN_FILES := $(notdir $(wildcard ../doc/man/*.1))
|
MAN_FILES := $(notdir $(wildcard ../doc/man/*.1))
|
||||||
|
|
||||||
LOGROTATE_DIR = $(DESTDIR)/$(sysconfdir)/logrotate.d
|
|
||||||
LOGROTATE_FILE = data/core-daemon.logrotate
|
|
||||||
|
|
||||||
# Python package build
|
# Python package build
|
||||||
noinst_SCRIPTS = build
|
noinst_SCRIPTS = build
|
||||||
build:
|
build:
|
||||||
|
@ -33,20 +30,11 @@ install-exec-hook:
|
||||||
--install-lib=$(pythondir) \
|
--install-lib=$(pythondir) \
|
||||||
--single-version-externally-managed
|
--single-version-externally-managed
|
||||||
|
|
||||||
#install-data-local:
|
|
||||||
# $(MKDIR_P) $(DESTDIR)$(LOGROTATE_DIR)
|
|
||||||
# $(INSTALL_DATA) $(LOGROTATE_FILE) \
|
|
||||||
# $(DESTDIR)$(LOGROTATE_DIR)/`basename $(LOGROTATE_FILE) .logrotate`
|
|
||||||
|
|
||||||
#uninstall-local:
|
|
||||||
# rm -f $(DESTDIR)$(LOGROTATE_DIR)/`basename $(LOGROTATE_FILE) .logrotate`
|
|
||||||
|
|
||||||
# Python package uninstall
|
# Python package uninstall
|
||||||
#rmdir -p $(LOGROTATE_DIR) || true
|
|
||||||
uninstall-hook:
|
uninstall-hook:
|
||||||
rm -rf $(DESTDIR)/etc/core
|
rm -rf $(DESTDIR)/etc/core
|
||||||
rm -rf $(DESTDIR)/$(datadir)/core
|
rm -rf $(DESTDIR)/$(datadir)/core
|
||||||
rm -f $(addprefix $(DESTDIR)/$(datadir)/man/man1/, $(MAN_FILES))
|
rm -f $(addprefix $(DESTDIR)/$(datarootdir)/man/man1/, $(MAN_FILES))
|
||||||
rm -f $(addprefix $(DESTDIR)/$(bindir)/,$(SCRIPT_FILES))
|
rm -f $(addprefix $(DESTDIR)/$(bindir)/,$(SCRIPT_FILES))
|
||||||
rm -rf $(DESTDIR)/$(pythondir)/core-$(PACKAGE_VERSION)-py$(PYTHON_VERSION).egg-info
|
rm -rf $(DESTDIR)/$(pythondir)/core-$(PACKAGE_VERSION)-py$(PYTHON_VERSION).egg-info
|
||||||
rm -rf $(DESTDIR)/$(pythondir)/core
|
rm -rf $(DESTDIR)/$(pythondir)/core
|
||||||
|
@ -62,7 +50,7 @@ dist-hook:
|
||||||
|
|
||||||
distclean-local:
|
distclean-local:
|
||||||
-rm -rf core.egg-info
|
-rm -rf core.egg-info
|
||||||
|
|
||||||
|
|
||||||
DISTCLEANFILES = Makefile.in
|
DISTCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
@ -76,5 +64,4 @@ EXTRA_DIST = $(SETUPPY) \
|
||||||
tests \
|
tests \
|
||||||
test.py \
|
test.py \
|
||||||
setup.cfg \
|
setup.cfg \
|
||||||
requirements.txt \
|
requirements.txt
|
||||||
$(LOGROTATE_FILE)
|
|
||||||
|
|
|
@ -1,18 +1,27 @@
|
||||||
|
import os
|
||||||
|
|
||||||
COREDPY_VERSION = "@PACKAGE_VERSION@"
|
COREDPY_VERSION = "@PACKAGE_VERSION@"
|
||||||
CORE_STATE_DIR = "@CORE_STATE_DIR@"
|
CORE_STATE_DIR = "@CORE_STATE_DIR@"
|
||||||
CORE_CONF_DIR = "@CORE_CONF_DIR@"
|
CORE_CONF_DIR = "@CORE_CONF_DIR@"
|
||||||
CORE_DATA_DIR = "@CORE_DATA_DIR@"
|
CORE_DATA_DIR = "@CORE_DATA_DIR@"
|
||||||
CORE_LIB_DIR = "@CORE_LIB_DIR@"
|
|
||||||
|
|
||||||
VNODED_BIN = "@bindir@/vnoded"
|
|
||||||
VCMD_BIN = "@bindir@/vcmd"
|
|
||||||
BRCTL_BIN = "@brctl_path@/brctl"
|
|
||||||
SYSCTL_BIN = "@sysctl_path@/sysctl"
|
|
||||||
IP_BIN = "@ip_path@/ip"
|
|
||||||
TC_BIN = "@tc_path@/tc"
|
|
||||||
EBTABLES_BIN = "@ebtables_path@/ebtables"
|
|
||||||
QUAGGA_STATE_DIR = "@CORE_STATE_DIR@/run/quagga"
|
QUAGGA_STATE_DIR = "@CORE_STATE_DIR@/run/quagga"
|
||||||
MOUNT_BIN = "@mount_path@/mount"
|
|
||||||
UMOUNT_BIN = "@umount_path@/umount"
|
|
||||||
OVS_BIN = "@ovs_vs_path@/ovs-vsctl"
|
def which(command):
|
||||||
OVS_FLOW_BIN = "@ovs_of_path@/ovs-ofctl"
|
for path in os.environ["PATH"].split(os.pathsep):
|
||||||
|
command_path = os.path.join(path, command)
|
||||||
|
if os.path.isfile(command_path) and os.access(command_path, os.X_OK):
|
||||||
|
return command_path
|
||||||
|
|
||||||
|
|
||||||
|
VNODED_BIN = which("vnoded")
|
||||||
|
VCMD_BIN = which("vcmd")
|
||||||
|
BRCTL_BIN = which("brctl")
|
||||||
|
SYSCTL_BIN = which("sysctl")
|
||||||
|
IP_BIN = which("ip")
|
||||||
|
TC_BIN = which("tc")
|
||||||
|
EBTABLES_BIN = which("ebtables")
|
||||||
|
MOUNT_BIN = which("mount")
|
||||||
|
UMOUNT_BIN = which("umount")
|
||||||
|
OVS_BIN = which("ovs-vsctl")
|
||||||
|
OVS_FLOW_BIN = which("ovs-ofctl")
|
||||||
|
|
|
@ -360,8 +360,6 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
header = self.request.recv(coreapi.CoreMessage.header_len)
|
header = self.request.recv(coreapi.CoreMessage.header_len)
|
||||||
if len(header) > 0:
|
|
||||||
logger.debug("received message header: %s", utils.hex_dump(header))
|
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
raise IOError("error receiving header (%s)" % e)
|
raise IOError("error receiving header (%s)" % e)
|
||||||
|
|
||||||
|
@ -378,7 +376,6 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
|
||||||
data = ""
|
data = ""
|
||||||
while len(data) < message_len:
|
while len(data) < message_len:
|
||||||
data += self.request.recv(message_len - len(data))
|
data += self.request.recv(message_len - len(data))
|
||||||
logger.debug("received message data: %s" % utils.hex_dump(data))
|
|
||||||
if len(data) > message_len:
|
if len(data) > message_len:
|
||||||
error_message = "received message length does not match received data (%s != %s)" % (
|
error_message = "received message length does not match received data (%s != %s)" % (
|
||||||
len(data), message_len)
|
len(data), message_len)
|
||||||
|
@ -492,7 +489,7 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler):
|
||||||
# TODO: hack to associate this handler with this sessions broker for broadcasting
|
# TODO: hack to associate this handler with this sessions broker for broadcasting
|
||||||
# TODO: broker needs to be pulled out of session to the server/handler level
|
# TODO: broker needs to be pulled out of session to the server/handler level
|
||||||
if self.master:
|
if self.master:
|
||||||
logger.info("SESSION SET TO MASTER!")
|
logger.info("session set to master")
|
||||||
self.session.master = True
|
self.session.master = True
|
||||||
self.session.broker.session_clients.append(self)
|
self.session.broker.session_clients.append(self)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@ Defines server classes and request handlers for TCP and UDP.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import SocketServer
|
import SocketServer
|
||||||
import os
|
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
@ -72,14 +71,6 @@ class CoreServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
|
||||||
for session in self.sessions.values():
|
for session in self.sessions.values():
|
||||||
session.shutdown()
|
session.shutdown()
|
||||||
|
|
||||||
# if we are a daemon remove pid file
|
|
||||||
if self.config["daemonize"]:
|
|
||||||
pid_file = self.config["pidfile"]
|
|
||||||
try:
|
|
||||||
os.unlink(pid_file)
|
|
||||||
except OSError:
|
|
||||||
logger.exception("error daemon pid file: %s", pid_file)
|
|
||||||
|
|
||||||
# remove server from server list
|
# remove server from server list
|
||||||
CoreServer.remove_server(self)
|
CoreServer.remove_server(self)
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@ import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import fcntl
|
import fcntl
|
||||||
import resource
|
|
||||||
|
|
||||||
from core import CoreCommandError
|
from core import CoreCommandError
|
||||||
from core import logger
|
from core import logger
|
||||||
|
@ -340,95 +339,6 @@ def sysctl_devname(devname):
|
||||||
return devname.replace(".", "/")
|
return devname.replace(".", "/")
|
||||||
|
|
||||||
|
|
||||||
def daemonize(rootdir="/", umask=0, close_fds=False, dontclose=(),
|
|
||||||
stdin=os.devnull, stdout=os.devnull, stderr=os.devnull,
|
|
||||||
stdoutmode=0644, stderrmode=0644, pidfilename=None,
|
|
||||||
defaultmaxfd=1024):
|
|
||||||
"""
|
|
||||||
Run the background process as a daemon.
|
|
||||||
|
|
||||||
:param str rootdir: root directory for daemon
|
|
||||||
:param int umask: umask for daemon
|
|
||||||
:param bool close_fds: flag to close file descriptors
|
|
||||||
:param dontclose: dont close options
|
|
||||||
:param stdin: stdin for daemon
|
|
||||||
:param stdout: stdout for daemon
|
|
||||||
:param stderr: stderr for daemon
|
|
||||||
:param int stdoutmode: stdout mode
|
|
||||||
:param int stderrmode: stderr mode
|
|
||||||
:param str pidfilename: pid file name
|
|
||||||
:param int defaultmaxfd: default max file descriptors
|
|
||||||
:return: nothing
|
|
||||||
"""
|
|
||||||
if not hasattr(dontclose, "__contains__"):
|
|
||||||
if not isinstance(dontclose, int):
|
|
||||||
raise TypeError("dontclose must be an integer")
|
|
||||||
dontclose = (int(dontclose),)
|
|
||||||
else:
|
|
||||||
for fd in dontclose:
|
|
||||||
if not isinstance(fd, int):
|
|
||||||
raise TypeError("dontclose must contain only integers")
|
|
||||||
|
|
||||||
# redirect stdin
|
|
||||||
if stdin:
|
|
||||||
fd = os.open(stdin, os.O_RDONLY)
|
|
||||||
os.dup2(fd, 0)
|
|
||||||
os.close(fd)
|
|
||||||
|
|
||||||
# redirect stdout
|
|
||||||
if stdout:
|
|
||||||
fd = os.open(stdout, os.O_WRONLY | os.O_CREAT | os.O_APPEND,
|
|
||||||
stdoutmode)
|
|
||||||
os.dup2(fd, 1)
|
|
||||||
if stdout == stderr:
|
|
||||||
os.dup2(1, 2)
|
|
||||||
os.close(fd)
|
|
||||||
|
|
||||||
# redirect stderr
|
|
||||||
if stderr and (stderr != stdout):
|
|
||||||
fd = os.open(stderr, os.O_WRONLY | os.O_CREAT | os.O_APPEND,
|
|
||||||
stderrmode)
|
|
||||||
os.dup2(fd, 2)
|
|
||||||
os.close(fd)
|
|
||||||
|
|
||||||
if os.fork():
|
|
||||||
# parent exits
|
|
||||||
os._exit(0)
|
|
||||||
|
|
||||||
os.setsid()
|
|
||||||
pid = os.fork()
|
|
||||||
if pid:
|
|
||||||
if pidfilename:
|
|
||||||
try:
|
|
||||||
f = open(pidfilename, "w")
|
|
||||||
f.write("%s\n" % pid)
|
|
||||||
f.close()
|
|
||||||
except IOError:
|
|
||||||
logger.exception("error writing to file: %s", pidfilename)
|
|
||||||
# parent exits
|
|
||||||
os._exit(0)
|
|
||||||
|
|
||||||
if rootdir:
|
|
||||||
os.chdir(rootdir)
|
|
||||||
|
|
||||||
os.umask(umask)
|
|
||||||
if close_fds:
|
|
||||||
try:
|
|
||||||
maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
|
|
||||||
if maxfd == resource.RLIM_INFINITY:
|
|
||||||
raise ValueError
|
|
||||||
except:
|
|
||||||
maxfd = defaultmaxfd
|
|
||||||
|
|
||||||
for fd in xrange(3, maxfd):
|
|
||||||
if fd in dontclose:
|
|
||||||
continue
|
|
||||||
try:
|
|
||||||
os.close(fd)
|
|
||||||
except IOError:
|
|
||||||
logger.exception("error closing file descriptor")
|
|
||||||
|
|
||||||
|
|
||||||
def load_config(filename, d):
|
def load_config(filename, d):
|
||||||
"""
|
"""
|
||||||
Read key=value pairs from a file, into a dict. Skip comments; strip newline characters and spacing.
|
Read key=value pairs from a file, into a dict. Skip comments; strip newline characters and spacing.
|
||||||
|
|
|
@ -138,8 +138,9 @@ class SimpleLxcNode(PyCoreNode):
|
||||||
try:
|
try:
|
||||||
os.kill(self.pid, signal.SIGTERM)
|
os.kill(self.pid, signal.SIGTERM)
|
||||||
os.waitpid(self.pid, 0)
|
os.waitpid(self.pid, 0)
|
||||||
except OSError:
|
except OSError as e:
|
||||||
logger.exception("error killing process")
|
if e.errno != 10:
|
||||||
|
logger.exception("error killing process")
|
||||||
|
|
||||||
# remove node directory if present
|
# remove node directory if present
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
# Configuration file for CORE (core-gui, core-daemon)
|
# Configuration file for CORE (core-gui, core-daemon)
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
### GUI configuration options ###
|
### GUI configuration options ###
|
||||||
[core-gui]
|
[core-gui]
|
||||||
|
@ -8,14 +6,10 @@
|
||||||
|
|
||||||
### core-daemon configuration options ###
|
### core-daemon configuration options ###
|
||||||
[core-daemon]
|
[core-daemon]
|
||||||
pidfile = /var/run/core-daemon.pid
|
|
||||||
logfile = /var/log/core-daemon.log
|
|
||||||
xmlfilever = 1.0
|
xmlfilever = 1.0
|
||||||
# you may want to change the listenaddr below to 0.0.0.0
|
|
||||||
listenaddr = localhost
|
listenaddr = localhost
|
||||||
port = 4038
|
port = 4038
|
||||||
numthreads = 1
|
numthreads = 1
|
||||||
verbose = False
|
|
||||||
quagga_bin_search = "/usr/local/bin /usr/bin /usr/lib/quagga"
|
quagga_bin_search = "/usr/local/bin /usr/bin /usr/lib/quagga"
|
||||||
quagga_sbin_search = "/usr/local/sbin /usr/sbin /usr/lib/quagga"
|
quagga_sbin_search = "/usr/local/sbin /usr/sbin /usr/lib/quagga"
|
||||||
# uncomment the following line to load custom services from the specified dir
|
# uncomment the following line to load custom services from the specified dir
|
||||||
|
@ -57,7 +51,7 @@ emane_platform_port = 8101
|
||||||
emane_transform_port = 8201
|
emane_transform_port = 8201
|
||||||
emane_event_generate = True
|
emane_event_generate = True
|
||||||
emane_event_monitor = False
|
emane_event_monitor = False
|
||||||
#emane_models_dir = /home/username/.core/emane
|
#emane_models_dir = /home/username/.core/myemane
|
||||||
# EMANE log level range [0,4] default: 2
|
# EMANE log level range [0,4] default: 2
|
||||||
#emane_log_level = 2
|
#emane_log_level = 2
|
||||||
emane_realtime = True
|
emane_realtime = True
|
||||||
|
|
|
@ -8,9 +8,7 @@ message handlers are defined and some support for sending messages.
|
||||||
import ConfigParser
|
import ConfigParser
|
||||||
import atexit
|
import atexit
|
||||||
import optparse
|
import optparse
|
||||||
import os
|
|
||||||
import signal
|
import signal
|
||||||
import socket
|
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
@ -20,16 +18,10 @@ from core import coreserver
|
||||||
from core import enumerations
|
from core import enumerations
|
||||||
from core import logger
|
from core import logger
|
||||||
from core import services
|
from core import services
|
||||||
from core.api import coreapi
|
|
||||||
from core.enumerations import MessageFlags
|
|
||||||
from core.enumerations import RegisterTlvs
|
|
||||||
from core.misc import nodeutils
|
from core.misc import nodeutils
|
||||||
from core.misc.utils import close_onexec
|
from core.misc.utils import close_onexec
|
||||||
from core.misc.utils import daemonize
|
|
||||||
from core.service import ServiceManager
|
from core.service import ServiceManager
|
||||||
|
|
||||||
DEFAULT_MAXFD = 1024
|
|
||||||
|
|
||||||
|
|
||||||
def banner():
|
def banner():
|
||||||
"""
|
"""
|
||||||
|
@ -51,6 +43,7 @@ def cored(cfg=None):
|
||||||
port = int(cfg["port"])
|
port = int(cfg["port"])
|
||||||
if host == "" or host is None:
|
if host == "" or host is None:
|
||||||
host = "localhost"
|
host = "localhost"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
server = coreserver.CoreServer((host, port), corehandlers.CoreRequestHandler, cfg)
|
server = coreserver.CoreServer((host, port), corehandlers.CoreRequestHandler, cfg)
|
||||||
except:
|
except:
|
||||||
|
@ -62,7 +55,7 @@ def cored(cfg=None):
|
||||||
server.serve_forever()
|
server.serve_forever()
|
||||||
|
|
||||||
|
|
||||||
# TODO: should sessions and the main core daemon both catch at exist to shutdown independently?
|
# TODO: should sessions and the main core daemon both catch exit to shutdown independently?
|
||||||
def cleanup():
|
def cleanup():
|
||||||
"""
|
"""
|
||||||
Runs server shutdown and cleanup when catching an exit signal.
|
Runs server shutdown and cleanup when catching an exit signal.
|
||||||
|
@ -74,9 +67,6 @@ def cleanup():
|
||||||
server.shutdown()
|
server.shutdown()
|
||||||
|
|
||||||
|
|
||||||
atexit.register(cleanup)
|
|
||||||
|
|
||||||
|
|
||||||
def sighandler(signum, stackframe):
|
def sighandler(signum, stackframe):
|
||||||
"""
|
"""
|
||||||
Signal handler when different signals are sent.
|
Signal handler when different signals are sent.
|
||||||
|
@ -94,43 +84,7 @@ signal.signal(signal.SIGINT, sighandler)
|
||||||
signal.signal(signal.SIGTERM, sighandler)
|
signal.signal(signal.SIGTERM, sighandler)
|
||||||
signal.signal(signal.SIGUSR1, sighandler)
|
signal.signal(signal.SIGUSR1, sighandler)
|
||||||
signal.signal(signal.SIGUSR2, sighandler)
|
signal.signal(signal.SIGUSR2, sighandler)
|
||||||
|
atexit.register(cleanup)
|
||||||
|
|
||||||
def logrotate(stdout, stderr, stdoutmode=0644, stderrmode=0644):
|
|
||||||
"""
|
|
||||||
Log rotation method.
|
|
||||||
|
|
||||||
:param stdout: stdout
|
|
||||||
:param stderr: stderr
|
|
||||||
:param int stdoutmode: stdout mode
|
|
||||||
:param int stderrmode: stderr mode
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
|
|
||||||
def reopen(fileno, filename, mode):
|
|
||||||
err = 0
|
|
||||||
fd = -1
|
|
||||||
try:
|
|
||||||
fd = os.open(filename,
|
|
||||||
os.O_WRONLY | os.O_CREAT | os.O_APPEND, mode)
|
|
||||||
os.dup2(fd, fileno)
|
|
||||||
except OSError as e:
|
|
||||||
err = e.errno
|
|
||||||
finally:
|
|
||||||
if fd >= 0:
|
|
||||||
os.close(fd)
|
|
||||||
return err
|
|
||||||
|
|
||||||
if stdout:
|
|
||||||
err = reopen(1, stdout, stdoutmode)
|
|
||||||
if stderr:
|
|
||||||
if stderr == stdout and not err:
|
|
||||||
try:
|
|
||||||
os.dup2(1, 2)
|
|
||||||
except OSError as e:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
reopen(2, stderr, stderrmode)
|
|
||||||
|
|
||||||
|
|
||||||
def get_merged_config(filename):
|
def get_merged_config(filename):
|
||||||
|
@ -142,50 +96,23 @@ def get_merged_config(filename):
|
||||||
:rtype: dict
|
:rtype: dict
|
||||||
"""
|
"""
|
||||||
# these are the defaults used in the config file
|
# these are the defaults used in the config file
|
||||||
defaults = {"port": "%d" % enumerations.CORE_API_PORT,
|
defaults = {
|
||||||
"listenaddr": "localhost",
|
"port": "%d" % enumerations.CORE_API_PORT,
|
||||||
"pidfile": "%s/run/core-daemon.pid" % constants.CORE_STATE_DIR,
|
"listenaddr": "localhost",
|
||||||
"logfile": "%s/log/core-daemon.log" % constants.CORE_STATE_DIR,
|
"xmlfilever": "1.0",
|
||||||
"xmlfilever": "1.0",
|
"numthreads": "1",
|
||||||
"numthreads": "1",
|
}
|
||||||
"verbose": "False",
|
|
||||||
"daemonize": "False",
|
|
||||||
"debug": "False",
|
|
||||||
"execfile": None,
|
|
||||||
}
|
|
||||||
|
|
||||||
usagestr = "usage: %prog [-h] [options] [args]\n\n" + \
|
usagestr = "usage: %prog [-h] [options] [args]\n\n" + \
|
||||||
"CORE daemon v.%s instantiates Linux network namespace " \
|
"CORE daemon v.%s instantiates Linux network namespace " \
|
||||||
"nodes." % constants.COREDPY_VERSION
|
"nodes." % constants.COREDPY_VERSION
|
||||||
parser = optparse.OptionParser(usage=usagestr)
|
parser = optparse.OptionParser(usage=usagestr)
|
||||||
parser.add_option("-f", "--configfile", dest="configfile",
|
parser.add_option("-f", "--configfile", dest="configfile", type="string",
|
||||||
type="string",
|
help="read config from specified file; default = %s" % filename)
|
||||||
help="read config from specified file; default = %s" %
|
|
||||||
filename)
|
|
||||||
parser.add_option("-d", "--daemonize", dest="daemonize",
|
|
||||||
action="store_true",
|
|
||||||
help="run in background as daemon; default=%s" % \
|
|
||||||
defaults["daemonize"])
|
|
||||||
parser.add_option("-e", "--execute", dest="execfile", type="string",
|
|
||||||
help="execute a Python/XML-based session")
|
|
||||||
parser.add_option("-l", "--logfile", dest="logfile", type="string",
|
|
||||||
help="log output to specified file; default = %s" %
|
|
||||||
defaults["logfile"])
|
|
||||||
parser.add_option("-p", "--port", dest="port", type=int,
|
parser.add_option("-p", "--port", dest="port", type=int,
|
||||||
help="port number to listen on; default = %s" % \
|
help="port number to listen on; default = %s" % defaults["port"])
|
||||||
defaults["port"])
|
|
||||||
parser.add_option("-i", "--pidfile", dest="pidfile",
|
|
||||||
help="filename to write pid to; default = %s" % \
|
|
||||||
defaults["pidfile"])
|
|
||||||
parser.add_option("-t", "--numthreads", dest="numthreads", type=int,
|
parser.add_option("-t", "--numthreads", dest="numthreads", type=int,
|
||||||
help="number of server threads; default = %s" % \
|
help="number of server threads; default = %s" % defaults["numthreads"])
|
||||||
defaults["numthreads"])
|
|
||||||
parser.add_option("-v", "--verbose", dest="verbose", action="store_true",
|
|
||||||
help="enable verbose logging; default = %s" % \
|
|
||||||
defaults["verbose"])
|
|
||||||
parser.add_option("-g", "--debug", dest="debug", action="store_true",
|
|
||||||
help="enable debug logging; default = %s" % \
|
|
||||||
defaults["debug"])
|
|
||||||
|
|
||||||
# parse command line options
|
# parse command line options
|
||||||
options, args = parser.parse_args()
|
options, args = parser.parse_args()
|
||||||
|
@ -200,19 +127,6 @@ def get_merged_config(filename):
|
||||||
section = "core-daemon"
|
section = "core-daemon"
|
||||||
if not cfg.has_section(section):
|
if not cfg.has_section(section):
|
||||||
cfg.add_section(section)
|
cfg.add_section(section)
|
||||||
# gracefully support legacy configs (cored.py/cored now core-daemon)
|
|
||||||
if cfg.has_section("cored.py"):
|
|
||||||
for name, val in cfg.items("cored.py"):
|
|
||||||
if name == "pidfile" or name == "logfile":
|
|
||||||
bn = os.path.basename(val).replace("coredpy", "core-daemon")
|
|
||||||
val = os.path.join(os.path.dirname(val), bn)
|
|
||||||
cfg.set(section, name, val)
|
|
||||||
if cfg.has_section("cored"):
|
|
||||||
for name, val in cfg.items("cored"):
|
|
||||||
if name == "pidfile" or name == "logfile":
|
|
||||||
bn = os.path.basename(val).replace("cored", "core-daemon")
|
|
||||||
val = os.path.join(os.path.dirname(val), bn)
|
|
||||||
cfg.set(section, name, val)
|
|
||||||
|
|
||||||
# merge command line with config file
|
# merge command line with config file
|
||||||
for opt in options.__dict__:
|
for opt in options.__dict__:
|
||||||
|
@ -223,24 +137,6 @@ def get_merged_config(filename):
|
||||||
return dict(cfg.items(section)), args
|
return dict(cfg.items(section)), args
|
||||||
|
|
||||||
|
|
||||||
def exec_file(cfg):
|
|
||||||
"""
|
|
||||||
Send a Register Message to execute a new session based on XML or Python script file.
|
|
||||||
|
|
||||||
:param dict cfg: configuration settings
|
|
||||||
:return: 0
|
|
||||||
"""
|
|
||||||
filename = cfg["execfile"]
|
|
||||||
logger.info("Telling daemon to execute file: %s...", filename)
|
|
||||||
tlvdata = coreapi.CoreRegisterTlv.pack(RegisterTlvs.EXECUTE_SERVER.value, filename)
|
|
||||||
msg = coreapi.CoreRegMessage.pack(MessageFlags.ADD.value, tlvdata)
|
|
||||||
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
||||||
# TODO: connect address option
|
|
||||||
sock.connect(("localhost", int(cfg["port"])))
|
|
||||||
sock.sendall(msg)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""
|
"""
|
||||||
Main program startup.
|
Main program startup.
|
||||||
|
@ -260,19 +156,8 @@ def main():
|
||||||
service_path = service_path.strip()
|
service_path = service_path.strip()
|
||||||
ServiceManager.add_services(service_path)
|
ServiceManager.add_services(service_path)
|
||||||
|
|
||||||
if cfg["daemonize"] == "True":
|
|
||||||
daemonize(rootdir=None, umask=0, close_fds=False,
|
|
||||||
stdin=os.devnull,
|
|
||||||
stdout=cfg["logfile"], stderr=cfg["logfile"],
|
|
||||||
pidfilename=cfg["pidfile"],
|
|
||||||
defaultmaxfd=DEFAULT_MAXFD)
|
|
||||||
signal.signal(signal.SIGUSR1, lambda signum, stackframe:
|
|
||||||
logrotate(stdout=cfg["logfile"], stderr=cfg["logfile"]))
|
|
||||||
|
|
||||||
banner()
|
banner()
|
||||||
if cfg["execfile"]:
|
|
||||||
cfg["execfile"] = os.path.abspath(cfg["execfile"])
|
|
||||||
sys.exit(exec_file(cfg))
|
|
||||||
try:
|
try:
|
||||||
cored(cfg)
|
cored(cfg)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
|
|
|
@ -9,35 +9,22 @@
|
||||||
|
|
||||||
CLEANFILES = core-daemon
|
CLEANFILES = core-daemon
|
||||||
|
|
||||||
DISTCLEANFILES = Makefile.in core-daemon.service
|
DISTCLEANFILES = Makefile.in core-daemon.service core-daemon
|
||||||
|
|
||||||
EXTRA_DIST = core-daemon-init.d \
|
EXTRA_DIST = core-daemon.in core-daemon.service.in
|
||||||
core-daemon.service.in \
|
|
||||||
core-daemon-rc.d \
|
|
||||||
core-daemon-init.d-SUSE
|
|
||||||
|
|
||||||
SUBDIRS = perf
|
SUBDIRS = perf
|
||||||
|
|
||||||
# install startup scripts based on --with-startup=option configure option
|
# install startup scripts based on --with-startup=option configure option
|
||||||
# init.d (default), systemd, SUSE
|
# init.d (default), systemd
|
||||||
if WANT_INITD
|
if WANT_INITD
|
||||||
startupdir = /etc/init.d
|
startupdir = /etc/init.d
|
||||||
startup_SCRIPTS = core-daemon
|
startup_SCRIPTS = core-daemon
|
||||||
|
|
||||||
core-daemon: core-daemon-init.d
|
|
||||||
cp $< $@
|
|
||||||
endif
|
endif
|
||||||
if WANT_SYSTEMD
|
if WANT_SYSTEMD
|
||||||
startupdir = /etc/systemd/system
|
startupdir = /etc/systemd/system
|
||||||
startup_SCRIPTS = core-daemon.service
|
startup_SCRIPTS = core-daemon.service
|
||||||
endif
|
endif
|
||||||
if WANT_SUSE
|
|
||||||
startupdir = /etc/init.d
|
|
||||||
startup_SCRIPTS = core-daemon
|
|
||||||
|
|
||||||
core-daemon: core-daemon-init.d-SUSE
|
|
||||||
cp $< $@
|
|
||||||
endif
|
|
||||||
|
|
||||||
# remove extra scripts and their directories if they are empty
|
# remove extra scripts and their directories if they are empty
|
||||||
uninstall-hook:
|
uninstall-hook:
|
||||||
|
|
|
@ -1,144 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
### BEGIN INIT INFO
|
|
||||||
# Provides: core-daemon
|
|
||||||
# Required-Start: $network $remote_fs
|
|
||||||
# Required-Stop: $network $remote_fs
|
|
||||||
# Default-Start: 2 3 4 5
|
|
||||||
# Default-Stop: 0 1 6
|
|
||||||
# Short-Description: Start the core-daemon CORE daemon at boot time
|
|
||||||
# Description: Starts and stops the core-daemon CORE daemon used to
|
|
||||||
# provide network emulation services for the CORE GUI
|
|
||||||
# or scripts.
|
|
||||||
### END INIT INFO
|
|
||||||
#
|
|
||||||
# chkconfig: 35 90 03
|
|
||||||
# description: Starts and stops the CORE daemon \
|
|
||||||
# used to provide network emulation services.
|
|
||||||
#
|
|
||||||
# pidfile: /var/run/core-daemon.pid
|
|
||||||
# config: /usr/local/etc/core/
|
|
||||||
|
|
||||||
DEB=no
|
|
||||||
# Source function library.
|
|
||||||
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
|
|
||||||
elif [ -f /lib/lsb/init-functions ] ; then
|
|
||||||
. /lib/lsb/init-functions
|
|
||||||
DEB=yes
|
|
||||||
else
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# search for core-daemon which may or may not be installed
|
|
||||||
cored=
|
|
||||||
for p in /usr/local/sbin \
|
|
||||||
/usr/sbin \
|
|
||||||
/sbin \
|
|
||||||
/usr/local/bin \
|
|
||||||
/usr/bin \
|
|
||||||
/bin
|
|
||||||
do
|
|
||||||
if [ -e $p/core-daemon ] ; then
|
|
||||||
cored=$p/core-daemon
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# this function comes from /etc/profile
|
|
||||||
pathmunge () {
|
|
||||||
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
|
|
||||||
if [ "$2" = "after" ] ; then
|
|
||||||
PATH=$PATH:$1
|
|
||||||
else
|
|
||||||
PATH=$1:$PATH
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# these lines add to the PATH variable used by CORE and its containers
|
|
||||||
# you can add your own pathmunge statements to change the container's PATH
|
|
||||||
pathmunge "/usr/local/sbin"
|
|
||||||
pathmunge "/usr/local/bin"
|
|
||||||
|
|
||||||
RETVAL=0
|
|
||||||
PIDFILE=/var/run/core-daemon.pid
|
|
||||||
|
|
||||||
# the /etc/init.d/functions (RedHat) differs from
|
|
||||||
# /usr/lib/init-functions (Debian)
|
|
||||||
if [ $DEB = yes ]; then
|
|
||||||
daemon="start-stop-daemon --start -p ${PIDFILE} --exec /usr/bin/python --"
|
|
||||||
#daemon=start_daemon
|
|
||||||
killproc="start-stop-daemon --stop --quiet --oknodo --retry 10"
|
|
||||||
status=status_of_proc
|
|
||||||
msg () {
|
|
||||||
log_daemon_msg "$@"
|
|
||||||
}
|
|
||||||
endmsg () {
|
|
||||||
log_end_msg "$@"
|
|
||||||
}
|
|
||||||
else
|
|
||||||
daemon="daemon /usr/bin/python"
|
|
||||||
killproc="killproc -d 10"
|
|
||||||
status=status
|
|
||||||
msg () {
|
|
||||||
echo -n $"$@"
|
|
||||||
}
|
|
||||||
endmsg () {
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
start() {
|
|
||||||
msg "Starting core-daemon"
|
|
||||||
$daemon $cored -d
|
|
||||||
RETVAL=$?
|
|
||||||
endmsg $RETVAL
|
|
||||||
return $RETVAL
|
|
||||||
}
|
|
||||||
|
|
||||||
stop() {
|
|
||||||
msg "Shutting down core-daemon"
|
|
||||||
$killproc -p ${PIDFILE} $cored
|
|
||||||
RETVAL=$?
|
|
||||||
rm -f ${PIDFILE}
|
|
||||||
endmsg $RETVAL
|
|
||||||
return $RETVAL
|
|
||||||
}
|
|
||||||
|
|
||||||
restart() {
|
|
||||||
stop
|
|
||||||
start
|
|
||||||
}
|
|
||||||
|
|
||||||
corestatus() {
|
|
||||||
$status -p ${PIDFILE} core-daemon core-daemon
|
|
||||||
return $?
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
start)
|
|
||||||
start
|
|
||||||
;;
|
|
||||||
stop)
|
|
||||||
stop
|
|
||||||
;;
|
|
||||||
restart)
|
|
||||||
restart
|
|
||||||
;;
|
|
||||||
force-reload)
|
|
||||||
restart
|
|
||||||
;;
|
|
||||||
status)
|
|
||||||
corestatus
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
msg "Usage: $0 {start|stop|restart|status}"
|
|
||||||
endmsg
|
|
||||||
exit 2
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit $?
|
|
|
@ -1,264 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Template SUSE system startup script for example service/daemon core
|
|
||||||
# Copyright (C) 1995--2005 Kurt Garloff, SUSE / Novell Inc.
|
|
||||||
#
|
|
||||||
# This library is free software; you can redistribute it and/or modify it
|
|
||||||
# under the terms of the GNU Lesser General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2.1 of the License, or (at
|
|
||||||
# your option) any later version.
|
|
||||||
#
|
|
||||||
# This library is distributed in the hope that it will be useful, but
|
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
# Lesser General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU Lesser General Public
|
|
||||||
# License along with this library; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,
|
|
||||||
# USA.
|
|
||||||
#
|
|
||||||
# /etc/init.d/FOO
|
|
||||||
# and its symbolic link
|
|
||||||
# /(usr/)sbin/rcFOO
|
|
||||||
#
|
|
||||||
# Template system startup script for some example service/daemon FOO
|
|
||||||
#
|
|
||||||
# LSB compatible service control script; see http://www.linuxbase.org/spec/
|
|
||||||
#
|
|
||||||
# Note: This template uses functions rc_XXX defined in /etc/rc.status on
|
|
||||||
# UnitedLinux/SUSE/Novell based Linux distributions. If you want to base your
|
|
||||||
# script on this template and ensure that it works on non UL based LSB
|
|
||||||
# compliant Linux distributions, you either have to provide the rc.status
|
|
||||||
# functions from UL or change the script to work without them.
|
|
||||||
# See skeleton.compat for a template that works with other distros as well.
|
|
||||||
#
|
|
||||||
### BEGIN INIT INFO
|
|
||||||
# Provides: core-daemon
|
|
||||||
# Required-Start: $network $remote_fs
|
|
||||||
# Required-Stop: $network $remote_fs
|
|
||||||
# Default-Start: 3 5
|
|
||||||
# Default-Stop: 0 1 2 6
|
|
||||||
# Short-Description: core-daemon
|
|
||||||
# Description: Start core-daemon
|
|
||||||
# continued on second line by '#<TAB>'
|
|
||||||
# should contain enough info for the runlevel editor
|
|
||||||
# to give admin some idea what this service does and
|
|
||||||
# what it's needed for ...
|
|
||||||
# (The Short-Description should already be a good hint.)
|
|
||||||
### END INIT INFO
|
|
||||||
#
|
|
||||||
# Any extensions to the keywords given above should be preceeded by
|
|
||||||
# X-VendorTag- (X-UnitedLinux- X-SuSE- for us) according to LSB.
|
|
||||||
#
|
|
||||||
# Notes on Required-Start/Should-Start:
|
|
||||||
# * There are two different issues that are solved by Required-Start
|
|
||||||
# and Should-Start
|
|
||||||
# (a) Hard dependencies: This is used by the runlevel editor to determine
|
|
||||||
# which services absolutely need to be started to make the start of
|
|
||||||
# this service make sense. Example: nfsserver should have
|
|
||||||
# Required-Start: $portmap
|
|
||||||
# Also, required services are started before the dependent ones.
|
|
||||||
# The runlevel editor will warn about such missing hard dependencies
|
|
||||||
# and suggest enabling. During system startup, you may expect an error,
|
|
||||||
# if the dependency is not fulfilled.
|
|
||||||
# (b) Specifying the init script ordering, not real (hard) dependencies.
|
|
||||||
# This is needed by insserv to determine which service should be
|
|
||||||
# started first (and at a later stage what services can be started
|
|
||||||
# in parallel). The tag Should-Start: is used for this.
|
|
||||||
# It tells, that if a service is available, it should be started
|
|
||||||
# before. If not, never mind.
|
|
||||||
# * When specifying hard dependencies or ordering requirements, you can
|
|
||||||
# use names of services (contents of their Provides: section)
|
|
||||||
# or pseudo names starting with a $. The following ones are available
|
|
||||||
# according to LSB (1.1):
|
|
||||||
# $local_fs all local file systems are mounted
|
|
||||||
# (most services should need this!)
|
|
||||||
# $remote_fs all remote file systems are mounted
|
|
||||||
# (note that /usr may be remote, so
|
|
||||||
# many services should Require this!)
|
|
||||||
# $syslog system logging facility up
|
|
||||||
# $network low level networking (eth card, ...)
|
|
||||||
# $named hostname resolution available
|
|
||||||
# $netdaemons all network daemons are running
|
|
||||||
# The $netdaemons pseudo service has been removed in LSB 1.2.
|
|
||||||
# For now, we still offer it for backward compatibility.
|
|
||||||
# These are new (LSB 1.2):
|
|
||||||
# $time the system time has been set correctly
|
|
||||||
# $portmap SunRPC portmapping service available
|
|
||||||
# UnitedLinux extensions:
|
|
||||||
# $ALL indicates that a script should be inserted
|
|
||||||
# at the end
|
|
||||||
# * The services specified in the stop tags
|
|
||||||
# (Required-Stop/Should-Stop)
|
|
||||||
# specify which services need to be still running when this service
|
|
||||||
# is shut down. Often the entries there are just copies or a subset
|
|
||||||
# from the respective start tag.
|
|
||||||
# * Should-Start/Stop are now part of LSB as of 2.0,
|
|
||||||
# formerly SUSE/Unitedlinux used X-UnitedLinux-Should-Start/-Stop.
|
|
||||||
# insserv does support both variants.
|
|
||||||
# * X-UnitedLinux-Default-Enabled: yes/no is used at installation time
|
|
||||||
# (%fillup_and_insserv macro in %post of many RPMs) to specify whether
|
|
||||||
# a startup script should default to be enabled after installation.
|
|
||||||
# It's not used by insserv.
|
|
||||||
#
|
|
||||||
# Note on runlevels:
|
|
||||||
# 0 - halt/poweroff 6 - reboot
|
|
||||||
# 1 - single user 2 - multiuser without network exported
|
|
||||||
# 3 - multiuser w/ network (text mode) 5 - multiuser w/ network and X11 (xdm)
|
|
||||||
#
|
|
||||||
# Note on script names:
|
|
||||||
# http://www.linuxbase.org/spec/refspecs/LSB_1.3.0/gLSB/gLSB/scrptnames.html
|
|
||||||
# A registry has been set up to manage the init script namespace.
|
|
||||||
# http://www.lanana.org/
|
|
||||||
# Please use the names already registered or register one or use a
|
|
||||||
# vendor prefix.
|
|
||||||
|
|
||||||
|
|
||||||
# Check for missing binaries (stale symlinks should not happen)
|
|
||||||
# Note: Special treatment of stop for LSB conformance
|
|
||||||
CORE_BIN=/usr/local/bin/core-daemon
|
|
||||||
test -x $CORE_BIN || { echo "$CORE_BIN not installed";
|
|
||||||
if [ "$1" = "stop" ]; then exit 0;
|
|
||||||
else exit 5; fi; }
|
|
||||||
|
|
||||||
# Check for existence of needed config file and read it
|
|
||||||
CORE_CONFIG=/etc/core
|
|
||||||
test -r $CORE_CONFIG || { echo "$CORE_CONFIG not existing";
|
|
||||||
if [ "$1" = "stop" ]; then exit 0;
|
|
||||||
else exit 6; fi; }
|
|
||||||
|
|
||||||
# Source LSB init functions
|
|
||||||
# providing start_daemon, killproc, pidofproc,
|
|
||||||
# log_success_msg, log_failure_msg and log_warning_msg.
|
|
||||||
# This is currently not used by UnitedLinux based distributions and
|
|
||||||
# not needed for init scripts for UnitedLinux only. If it is used,
|
|
||||||
# the functions from rc.status should not be sourced or used.
|
|
||||||
#. /lib/lsb/init-functions
|
|
||||||
|
|
||||||
# Shell functions sourced from /etc/rc.status:
|
|
||||||
# rc_check check and set local and overall rc status
|
|
||||||
# rc_status check and set local and overall rc status
|
|
||||||
# rc_status -v be verbose in local rc status and clear it afterwards
|
|
||||||
# rc_status -v -r ditto and clear both the local and overall rc status
|
|
||||||
# rc_status -s display "skipped" and exit with status 3
|
|
||||||
# rc_status -u display "unused" and exit with status 3
|
|
||||||
# rc_failed set local and overall rc status to failed
|
|
||||||
# rc_failed <num> set local and overall rc status to <num>
|
|
||||||
# rc_reset clear both the local and overall rc status
|
|
||||||
# rc_exit exit appropriate to overall rc status
|
|
||||||
# rc_active checks whether a service is activated by symlinks
|
|
||||||
. /etc/rc.status
|
|
||||||
|
|
||||||
# Reset status of this service
|
|
||||||
rc_reset
|
|
||||||
|
|
||||||
# Return values acc. to LSB for all commands but status:
|
|
||||||
# 0 - success
|
|
||||||
# 1 - generic or unspecified error
|
|
||||||
# 2 - invalid or excess argument(s)
|
|
||||||
# 3 - unimplemented feature (e.g. "reload")
|
|
||||||
# 4 - user had insufficient privileges
|
|
||||||
# 5 - program is not installed
|
|
||||||
# 6 - program is not configured
|
|
||||||
# 7 - program is not running
|
|
||||||
# 8--199 - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
|
|
||||||
#
|
|
||||||
# Note that starting an already running service, stopping
|
|
||||||
# or restarting a not-running service as well as the restart
|
|
||||||
# with force-reload (in case signaling is not supported) are
|
|
||||||
# considered a success.
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
start)
|
|
||||||
echo -n "Starting CORE "
|
|
||||||
## Start daemon with startproc(8). If this fails
|
|
||||||
## the return value is set appropriately by startproc.
|
|
||||||
/sbin/startproc $CORE_BIN -d
|
|
||||||
|
|
||||||
# Remember status and be verbose
|
|
||||||
rc_status -v
|
|
||||||
;;
|
|
||||||
stop)
|
|
||||||
echo -n "Shutting down CORE "
|
|
||||||
## Stop daemon with killproc(8) and if this fails
|
|
||||||
## killproc sets the return value according to LSB.
|
|
||||||
|
|
||||||
if [ -r /var/run/core-daemon.pid ] ; then
|
|
||||||
/bin/kill -TERM `cat /var/run/core-daemon.pid`
|
|
||||||
/bin/rm -f /var/run/core-daemon.pid
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remember status and be verbose
|
|
||||||
rc_status -v
|
|
||||||
;;
|
|
||||||
try-restart|condrestart)
|
|
||||||
## Do a restart only if the service was active before.
|
|
||||||
## Note: try-restart is now part of LSB (as of 1.9).
|
|
||||||
## RH has a similar command named condrestart.
|
|
||||||
if test "$1" = "condrestart"; then
|
|
||||||
echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
|
|
||||||
fi
|
|
||||||
$0 status
|
|
||||||
if test $? = 0; then
|
|
||||||
$0 restart
|
|
||||||
else
|
|
||||||
rc_reset # Not running is not a failure.
|
|
||||||
fi
|
|
||||||
# Remember status and be quiet
|
|
||||||
rc_status
|
|
||||||
;;
|
|
||||||
restart)
|
|
||||||
## Stop the service and regardless of whether it was
|
|
||||||
## running or not, start it again.
|
|
||||||
$0 stop
|
|
||||||
$0 start
|
|
||||||
|
|
||||||
# Remember status and be quiet
|
|
||||||
rc_status
|
|
||||||
;;
|
|
||||||
force-reload)
|
|
||||||
## Signal the daemon to reload its config. Most daemons
|
|
||||||
## do this on signal 1 (SIGHUP).
|
|
||||||
## If it does not support it, restart the service if it
|
|
||||||
## is running.
|
|
||||||
|
|
||||||
echo -n "Reload service CORE "
|
|
||||||
$0 try-restart
|
|
||||||
rc_status
|
|
||||||
;;
|
|
||||||
|
|
||||||
reload)
|
|
||||||
## Like force-reload, but if daemon does not support
|
|
||||||
## signaling, do nothing (!)
|
|
||||||
|
|
||||||
## It does not support reload:
|
|
||||||
rc_failed 3
|
|
||||||
rc_status -v
|
|
||||||
;;
|
|
||||||
|
|
||||||
status)
|
|
||||||
echo -n "Checking for service CORE "
|
|
||||||
## Check status with checkproc(8), if process is running
|
|
||||||
## checkproc will return with exit status 0.
|
|
||||||
|
|
||||||
# Return value is slightly different for the status command:
|
|
||||||
# 0 - service up and running
|
|
||||||
# 1 - service dead, but /var/run/ pid file exists
|
|
||||||
# 2 - service dead, but /var/lock/ lock file exists
|
|
||||||
# 3 - service not running (unused)
|
|
||||||
# 4 - service status unknown :-(
|
|
||||||
# 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
|
|
||||||
|
|
||||||
# NOTE: checkproc returns LSB compliant status values.
|
|
||||||
/sbin/checkproc -p /var/run/core-daemon.pid python
|
|
||||||
# NOTE: rc_status knows that we called this init script with
|
|
||||||
# "status" option and adapts its messages accordingly.
|
|
||||||
rc_status -v
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload}"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
rc_exit
|
|
|
@ -1,50 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
|
|
||||||
# PROVIDE: core
|
|
||||||
# REQUIRE: NETWORKING
|
|
||||||
|
|
||||||
# To enable CORE services on startup, add the following line to /etc/rc.conf:
|
|
||||||
# core_enable="YES"
|
|
||||||
#
|
|
||||||
|
|
||||||
. /etc/rc.subr
|
|
||||||
|
|
||||||
name="core"
|
|
||||||
rcvar=`set_rcvar`
|
|
||||||
|
|
||||||
stop_postcmd=stop_postcmd
|
|
||||||
|
|
||||||
stop_postcmd()
|
|
||||||
{
|
|
||||||
rm -f $pidfile
|
|
||||||
}
|
|
||||||
|
|
||||||
# defaults
|
|
||||||
load_rc_config $name
|
|
||||||
: ${core_enable="NO"}
|
|
||||||
: ${core_flags="-d"}
|
|
||||||
: ${core_daemons="core-daemon"}
|
|
||||||
|
|
||||||
core_cmd=$1
|
|
||||||
|
|
||||||
case "${core_cmd}" in
|
|
||||||
start)
|
|
||||||
;;
|
|
||||||
stop|restart)
|
|
||||||
core_daemons=$(reverse_list ${core_daemons})
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
for daemon in ${core_daemons}; do
|
|
||||||
command=/usr/local/sbin/${daemon}
|
|
||||||
pidname=`echo ${daemon} | sed 's/\.//g'`
|
|
||||||
pidfile=/var/run/${pidname}.pid
|
|
||||||
command_interpreter=python
|
|
||||||
if [ "${daemon}" = "core-daemon" ]; then
|
|
||||||
command_interpreter=python
|
|
||||||
fi
|
|
||||||
run_rc_command "$1"
|
|
||||||
_rc_restart_done=false
|
|
||||||
done
|
|
||||||
|
|
112
scripts/core-daemon.in
Normal file
112
scripts/core-daemon.in
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
#!/bin/sh
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: core-daemon
|
||||||
|
# Required-Start: $network $remote_fs
|
||||||
|
# Required-Stop: $network $remote_fs
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# Short-Description: Start the core-daemon CORE daemon at boot time
|
||||||
|
# Description: Starts and stops the core-daemon CORE daemon used to
|
||||||
|
# provide network emulation services for the CORE GUI
|
||||||
|
# or scripts.
|
||||||
|
### END INIT INFO
|
||||||
|
#
|
||||||
|
# chkconfig: 35 90 03
|
||||||
|
# description: Starts and stops the CORE daemon \
|
||||||
|
# used to provide network emulation services.
|
||||||
|
#
|
||||||
|
# config: /etc/core/
|
||||||
|
|
||||||
|
NAME=`basename $0`
|
||||||
|
PIDFILE="@CORE_STATE_DIR@/run/$NAME.pid"
|
||||||
|
LOG="@CORE_STATE_DIR@/log/$NAME.log"
|
||||||
|
CMD="@PYTHON@ @bindir@/$NAME"
|
||||||
|
|
||||||
|
get_pid() {
|
||||||
|
cat "$PIDFILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
is_alive() {
|
||||||
|
[ -f "$PIDFILE" ] && ps -p `get_pid` > /dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
corestart() {
|
||||||
|
if is_alive; then
|
||||||
|
echo "$NAME already started"
|
||||||
|
else
|
||||||
|
echo "starting $NAME"
|
||||||
|
sudo $CMD 2>&1 >> "$LOG" &
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $! > "$PIDFILE"
|
||||||
|
if ! is_alive; then
|
||||||
|
echo "unable to start $NAME, see $LOG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
corestop() {
|
||||||
|
if is_alive; then
|
||||||
|
echo -n "stopping $NAME.."
|
||||||
|
kill `get_pid`
|
||||||
|
for i in 1 2 3 4 5; do
|
||||||
|
sleep 1
|
||||||
|
if ! is_alive; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo -n "."
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
|
||||||
|
if is_alive; then
|
||||||
|
echo "not stopped; may still be shutting down"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "stopped"
|
||||||
|
if [ -f "$PIDFILE" ]; then
|
||||||
|
rm -f "$PIDFILE"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "$NAME not running"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
corerestart() {
|
||||||
|
corestop
|
||||||
|
corestart
|
||||||
|
}
|
||||||
|
|
||||||
|
corestatus() {
|
||||||
|
if is_alive; then
|
||||||
|
echo "$NAME is running"
|
||||||
|
else
|
||||||
|
echo "$NAME is stopped"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
corestart
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
corestop
|
||||||
|
;;
|
||||||
|
restart)
|
||||||
|
corerestart
|
||||||
|
;;
|
||||||
|
force-reload)
|
||||||
|
corerestart
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
corestatus
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {start|stop|restart|status}"
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit $?
|
||||||
|
|
|
@ -3,9 +3,8 @@ Description=Common Open Research Emulator Service
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=forking
|
Type=simple
|
||||||
PIDFile=/var/run/core-daemon.pid
|
ExecStart=@PYTHON@ @bindir@/core-daemon
|
||||||
ExecStart=@PYTHON@ @bindir@/core-daemon -d
|
|
||||||
TasksMax=infinity
|
TasksMax=infinity
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
|
|
Loading…
Add table
Reference in a new issue