#!/usr/bin/env python
"""
#+
# NAME:
#	skyd
# PURPOSE:
#	Used to set up the indexing script skyd_wait.py as a
#	daemon process.
#	skyd.py should not be called directly, but
#	should be controlled with the bash script skyd.
# MODIFICATION HISTORY:
#-
"""
import sys, os
###########################################################################
HOST=((os.environ['HOSTNAME']).split('.'))[0]
ROOT=os.environ['SKYD']
LOGFILE = os.path.join(ROOT,'log','skyd_'+HOST+'.log')
PIDFILE = os.path.join(ROOT,'run','skyd_'+HOST+'.pid')

CFFILE  = os.path.join(ROOT,'cf','skyd_'+HOST+'.cf')

import skyd_wait
USERPROG = skyd_wait.skyd_wait
###########################################################################

#based on Jrgen Hermanns http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012

class Log:
    """file like for writes with auto flush after each write
    to ensure that everything is logged, even during an
    unexpected exit."""
    def __init__(self, f):
        self.f = f
    def write(self, s):
        self.f.write(s)
        self.f.flush()

def main():
    #change to data directory if needed
    #os.chdir("/root/data")
    #redirect outputs to a logfile
    sys.stdout = sys.stderr = Log(open(LOGFILE, 'a+'))
    #ensure the that the daemon runs a normal user
    #os.setegid(100)	#(103)		#set group first "pydaemon"
    #os.seteuid(500)	#(103)		#set user "pydaemon"
    USERPROG(CFFILE)			#start the user program here:
    return

if __name__ == "__main__":
    # do the UNIX double-fork magic, see Stevens' "Advanced
    # Programming in the UNIX Environment" for details (ISBN 0201563177)
    try:
        pid = os.fork()
        if pid > 0:			# exit first parent
            sys.exit(0)
    except OSError, e:
        print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
        sys.exit(1)

    # decouple from parent environment
    os.chdir("/")   #don't prevent unmounting....
    os.setsid()
    os.umask(0)

    # do second fork
    try:
        pid = os.fork()
        if pid > 0:
            # exit from second parent, print eventual PID before
            #print "Daemon PID %d" % pid
            open(PIDFILE,'w').write("%d"%pid)
            sys.exit(0)
    except OSError, e:
        print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
        sys.exit(1)

    main()		# start the daemon main loop
