summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2007-11-30 18:59:26 +0000
committerNarayan Desai <desai@mcs.anl.gov>2007-11-30 18:59:26 +0000
commit302759a996e82fb8761b3a789154a5108a41773f (patch)
tree92da53fe2476b5954b65e17194a847e7d46b2c83
parentf4142364bd97dd4f5d9070a2de10cd02ab93ab15 (diff)
downloadbcfg2-302759a996e82fb8761b3a789154a5108a41773f.tar.gz
bcfg2-302759a996e82fb8761b3a789154a5108a41773f.tar.bz2
bcfg2-302759a996e82fb8761b3a789154a5108a41773f.zip
Improve agent scripts and daemonization support [bugfix]
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@4013 ce84e21b-d406-0410-9b95-82705330c041
-rw-r--r--debian/buildsys/2.3/bcfg2.init18
-rw-r--r--debian/buildsys/common/bcfg2.init6
-rwxr-xr-xsrc/sbin/bcfg243
3 files changed, 63 insertions, 4 deletions
diff --git a/debian/buildsys/2.3/bcfg2.init b/debian/buildsys/2.3/bcfg2.init
index 9ef9f2b0f..0418efcd9 100644
--- a/debian/buildsys/2.3/bcfg2.init
+++ b/debian/buildsys/2.3/bcfg2.init
@@ -28,11 +28,13 @@ BCFG2_OPTIONS="-q"
# Disabled per default
BCFG2_ENABLED=0
BCFG2_INIT=0
+BCFG2_AGENT=0
# Include default startup configuration if exists
test -f "/etc/default/bcfg2" && . /etc/default/bcfg2
-[ "$BCFG2_ENABLED" -eq "0" -o "$BCFG2_INIT" -eq 0 ] && exit 0
+[ "$BCFG2_ENABLED" -eq 0 ] && exit 0
+[ "$BCFG2_AGENT" -eq 0 -a "$BCFG2_INIT" -eq 0 ] && exit 0
# Exit if bcfg2 doesn't exist and is not executable
test -x $BCFG2 || exit 5
@@ -40,7 +42,19 @@ test -x $BCFG2 || exit 5
case "$1" in
start)
echo -n "Running configuration management client: "
- ${BCFG2} ${BCFG2_OPTIONS} ${BCFG2_OPTIONS_INIT}
+
+ if [ "$BCFG2_AGENT" -eq 1 ]
+ then
+ ${BCFG2} -A -i /var/run/bcfg2-agent.pid ${BCFG2_OPTIONS} ${BCFG2_OPTIONS_AGENT}
+ STATUS=$?
+ fi
+
+ if [ "$BCFG2_INIT" -eq 1 ]
+ then
+ ${BCFG2} ${BCFG2_OPTIONS} ${BCFG2_OPTIONS_INIT}
+ STATUS=$?
+ fi
+
echo "bcfg2"
;;
status)
diff --git a/debian/buildsys/common/bcfg2.init b/debian/buildsys/common/bcfg2.init
index bf06f5dbb..330cf4fdd 100644
--- a/debian/buildsys/common/bcfg2.init
+++ b/debian/buildsys/common/bcfg2.init
@@ -53,9 +53,11 @@ case "$1" in
echo -n "Running configuration management client: "
if [ "$BCFG2_AGENT" -eq 1 ]
then
- start_daemon ${BCFG2} -A ${BCFG2_OPTIONS} ${BCFG2_OPTIONS_AGENT}
+ start_daemon ${BCFG2} -A -i /var/run/bcfg2-agent.pid ${BCFG2_OPTIONS} ${BCFG2_OPTIONS_AGENT}
STATUS=$?
- else
+ fi
+
+ if [ "$BCFG2_INIT" -eq 1 ]; then
${BCFG2} ${BCFG2_OPTIONS} ${BCFG2_OPTIONS_INIT}
STATUS=$?
fi
diff --git a/src/sbin/bcfg2 b/src/sbin/bcfg2
index 333048535..20bfc6a46 100755
--- a/src/sbin/bcfg2
+++ b/src/sbin/bcfg2
@@ -32,6 +32,45 @@ def cb_sigint_handler(signum, frame):
'''Exit upon CTRL-C'''
os._exit(1)
+def daemonize(filename):
+ '''Do the double fork/setsession dance'''
+ # Check if the pid is active
+ try:
+ pidfile = open(filename, "r")
+ oldpid = int(pidfile.readline())
+ # getpgid() will retun an IO error if all fails
+ os.getpgid(oldpid)
+ pidfile.close()
+
+ # If we got this far without exceptions, there is another instance
+ # running. Exit gracefully.
+ print "PID File (%s) exists and listed PID (%d) is active." % \
+ (filename, oldpid)
+ raise SystemExit, 1
+ except OSError:
+ pidfile.close()
+ except IOError:
+ # pid file doesn't
+ pass
+
+ # Fork once
+ if os.fork() != 0:
+ os._exit(0)
+ os.setsid() # Create new session
+ pid = os.fork()
+ if pid != 0:
+ pidfile = open(filename, "w")
+ pidfile.write("%i" % pid)
+ pidfile.close()
+ os._exit(0)
+ os.chdir("/")
+ os.umask(0)
+
+ null = open("/dev/null", "w+")
+
+ os.dup2(null.fileno(), sys.__stdin__.fileno())
+ os.dup2(null.fileno(), sys.__stdout__.fileno())
+ os.dup2(null.fileno(), sys.__stderr__.fileno())
class Client:
''' The main bcfg2 client class '''
@@ -91,6 +130,8 @@ class Client:
False, False, False, True),
'agent-port': (('-g', '<agent tcp port>', 'the port on which to bind for agent mode'),
False, ('communication', 'agent-port'), '6789', False),
+ 'agent-background': (('-i', '<pidfile name>', "Daemonize the agent"),
+ False, False, False, False),
'key': (('-K', '<client key file>', 'ssl cert + private key for agent mode xmlrpc server'),
False, ('communication', 'key'), False, False),
}
@@ -379,6 +420,8 @@ if __name__ == '__main__':
spid = os.getpid()
if client.setup["agent"]:
agent = Agent(client)
+ if client.setup["agent-background"]:
+ daemonize(client.setup["agent-background"])
while not agent.shut:
try:
agent.serve_forever()