#!/usr/bin/env python

# $Id: ogo_resource.py 6 2004-08-19 15:10:17Z znek $

# resExample.py - how to work with SKYRiX resources via XML-RPC
# this program needs the patchted xmlrpclib.py available at
# http://developer.skyrix.com/02_skyrix/xmlrpc/xmlrpclib.py

import getpass, string, sys, xmlrpclib
from types import *

class ResourceTool:

    def __init__(self):
        """ initialization """
        self.__server  = None
        self.__newRes = {}

    def getUserInput(self, _description, _pwdInput=0):
        """ get information from the user """
        if not _pwdInput:
            # get normal input
            response = raw_input("%-20s" % _description)
        else:
            # get password input
            response = getpass.getpass("%-20s" % _description)

        return response

    def getDaemonInfo(self):
        """ get xml-rpc daemon information, setup daemon connection """
        self.__url = self.getUserInput('XML-RPC Daemon URL:',0)
        self.__login = self.getUserInput('Username:',0)
        self.__pwd = self.getUserInput('Password:',1)

        try:
            # try to init xml-rpc server proxy with the given information
            # (you need the patched xmlrpclib.py for this)
            self.__server = xmlrpclib.ServerProxy(self.__url,
                                                  login=self.__login,
                                                  password=self.__pwd)
        except TypeError,e:
            # seems you are using a xmlrpclib.py without basic authentication
            # support - see the error message how to get the right one
            sys.stderr.write("ERROR: You are probably using the wrong version"
                             "of xmlrpclib\nGet the right version at:\n")
            sys.stderr.write("http://developer.skyrix.com/02_skyrix/xmlrpc/"
                             "xmlrpclib.py\n")
            return 2
        except IOError,e:
            # these errors are caused by specifying a wrong XML-RPC protocol
            # (XML-RPC only supports HTTP)
            sys.stderr.write("ERROR: %s\n" % e)
            return 3

        return 0
        
    def collectResourceInfo(self):
        """ collect all information we need """
        print "=========================================================="
        print "--Adding new resource-------------------------------------"

        # request user input
        self.__newRes['name'] = self.getUserInput('Name:',0)
        self.__newRes['email'] = self.getUserInput('Email:',0)
        self.__newRes['category'] = self.getUserInput('Category:',0)
        self.__newRes['emailSubject'] = self.getUserInput('Email Subject:',0)

    def addResourceToSystem(self):
        """ add the resource to SKYRiX via XML-RPC """
        try:
            # add resource to SKYRiX
            result = self.__server.resource.insert(self.__newRes)
        except:
            sys.stderr.write("An XML-RPC error occured\n")
            return 2

        # resource.insert returns the inserted resource as dictionary if it was
        # successful, otherwise a boolean False is returned
        if type(result) is StringType:
            print "==> created resource with ID %s" % result
            return 0
        else:
            sys.stderr.write("Failed to create resource\n")
            return 1

    def showResourceInfo(self):
        """ show infos about all resources """
        result = None

        try:
            # add resource to SKYRiX
            result = self.__server.resource.fetch("name like '*'")
        except:
            sys.stderr.write("An XML-RPC error occured\n")
            return 2

        print "=========================================================="

        # print resource information in a table
        if result != []: 
            print "Name         | Category   | EMail            | Subject"
            print "----------------------------------------------------------"
            for r in result:
                print "%-12s | %-10s | %-15s | %-10s" % (r['name'],
                                                         r['category'],
                                                         r['email'],
                                                         r['emailSubject'])
        else:
            print "No resources found"

        print "=========================================================="

    def deleteResource(self):
        """ delete resource with given name """
        print "=========================================================="
        print "--Deleting resource-------------------------------------"

        # get name of resource to delete
        resName = self.getUserInput('Name:',0)

        result = None

        try:
            # try to get the resource by its name
            result = self.__server.resource.getByName(resName)
        except:
            sys.stderr.write("An XML-RPC error occured\n")
            return 2

        # check if a resource was found
        if result != []:
            delete = None
            try:
                # try to delete this resource by its id
                delete = self.__server.resource.delete(result[0]['id'])
            except:
                sys.stderr.write("An XML-RPC error occured\n")
                return 2

            # check if deletion was successful
            if delete != None:
                print "==> deleted resource with ID %s" % result[0]['id']
            else:
                print "==> deleting resource failed"

        print "=========================================================="

    def printOptions(self):
        """ print available options """
        print "-- Options -----------------------------------------------"
        print "a - add a resource"
        print "d - delete resource"
        print "s - show resources"
        print "q - quit"
        print "----------------------------------------------------------"
        pass
        
    def run(self):
        """ run """
        result = self.getDaemonInfo()
        if result != 0: return result

        option = 'n'

        while option != 'q':
            if option == 's':
                self.showResourceInfo()
            elif option == 'd':
                self.deleteResource()
            elif option == 'a':
                self.collectResourceInfo()
                ok = self.getUserInput("Create resource? [Y/n]:",0)
                if not ok:
                    ok = "y"

                if string.lower(ok) == "y": 
                    result = self.addResourceToSystem()
                    if result != 0: return result

            self.printOptions()
            option = self.getUserInput("Make your choice [S/a/d/q]:",0)
            if not option: option = "s"

        return 0

if __name__ == "__main__":
  tool = ResourceTool()

  try:
      returnCode = tool.run()
  except KeyboardInterrupt:
      sys.stderr.write("Program cancelled by user\n")
      returnCode = 2

  sys.exit(returnCode)
