#!/usr/bin/python

from inqbus.ocf.generic.parameter import OCFString
from inqbus.ocf.agents import pidbaseagent
from subprocess import Popen
from inqbus.ocf.generic import exits

import os

class ZarafaAgent(pidbaseagent.PIDBaseAgent):
    def config(self):
        super(ZarafaAgent, self).config()

        self.params["binary"] = OCFString(
                            longdesc="Path to the zarafa-%s executable" % self.basename,
                            shortdesc="binary",
                            validate=pidbaseagent.PIDBaseAgent.validate_executable,
                            default='/usr/bin/zarafa-%s' % self.basename)
        self.params["config"] = OCFString(
                            longdesc="Path to the config file",
                            shortdesc="config file",
                            validate=pidbaseagent.PIDBaseAgent.validate_file,
                            default='/etc/zarafa/%s.cfg' % self.basename)
        self.params["pid"] = OCFString(
                            longdesc="Path to the pid file",
                            shortdesc="pid file",
                            default='/var/run/zarafa-%s.pid' % self.basename)
                        

    def get_pid_file(self):
        return self.params.pid.value

    def get_executable(self):
        return self.params.binary.value

    def start_process(self):
        """
        Start the executable.
        """
        # Construct the comanndline vector
        args = [ self.params.binary.value, '-c', self.params.config.value ]
        if hasattr(self, 'startargs'):
            args += self.startargs
            
        # intitialize the process
        proc = Popen(args)
        # check if we can communicate with the process
        res = proc.communicate()
        # If we cannot reach the process ..
        if proc.returncode != 0 :
            #  .. we are not able to start it.
            raise exits.OCF_NOT_RUNNING("start: canot start the process %s" % args)
        
        
class Server(ZarafaAgent):
    name = 'Zarafa server'
    version = '1.0'
    longdesc = 'Zarafa MAPI storage server'
    shortdesc = 'zarafa-server'

    basename = 'server'    

class DAgent(ZarafaAgent):
    name = 'Zarafa LTMP server'
    version = '1.0'
    longdesc = 'Zarafa LMTP server'
    shortdesc = 'zarafa-dagent'

    basename = 'dagent'    
    
    startargs = [ '-d' ]

class Spooler(ZarafaAgent):
    name = 'Zarafa SMTP spooler'
    version = '1.0'
    longdesc = 'Zarafa SMTP spooler'
    shortdesc = 'zarafa-spooler'
    
    basename = 'spooler'

class Gateway(ZarafaAgent):
    name = 'Zarafa IMAP/POP3 gateway'
    version = '1.0'
    longdesc = 'Zarafa IMAP/POP3 gateway'
    shortdesc = 'zarafa-gateway'
    
    basename = 'gateway'
    
class ICal(ZarafaAgent):
    name = 'Zarafa iCal/CalDAV gateway'
    version = '1.0'
    longdesc = 'Zarafa iCal/CalDAV gateway'
    shortdesc = 'zarafa-ical'
    
    basename = 'ical'
    
class Monitor(ZarafaAgent):
    name = 'Zarafa Monitor'
    version = '1.0'
    longdesc = 'Zarafa Monitor'
    shortdesc = 'zarafa-monitor'
    
    basename = 'monitor'
    
class Search(ZarafaAgent):
    name = 'Zarafa search indexer'
    version = '1.0'
    longdesc = 'Zarafa search indexer'
    shortdesc = 'zarafa-search'
    
    basename = 'search'

class License(ZarafaAgent):
    name = 'Zarafa license server'
    version = '1.0'
    longdesc = 'Zarafa license server'
    shortdesc = 'zarafa-licensed'
    
    basename = 'licensed'

def main():
    import sys
    agents = { 
        'zarafa-server' : Server, 
        'zarafa-dagent' : DAgent, 
        'zarafa-spooler' : Spooler,
        'zarafa-gateway' : Gateway,
        'zarafa-ical' : ICal,
        'zarafa-monitor' : Monitor,
        'zarafa-search' : Search,
        'zarafa-licensed' : License
    }
    
    basename = os.path.basename(sys.argv[0])
    if not agents.has_key(basename):
        print 'This script does not support the specified agent'
        sys.exit(7)
        
    agents[basename]().run(sys.argv)

if __name__ == "__main__" : main()
