Example #1
0
    def getConnectionDetails(self, system, level, access = "read", site = None, user = None):

        if user == None:
            try: user = pwd.getpwuid(os.getuid())[0]
            except KeyError: pass
            except NameError: pass;

        if site == None:
            site = execcontext.getSite()
            if site == "nyc":
                site = execcontext.getSiteAndCompany()

        databaseDescription = "%s:%s:%s:%s:%s" % (system,level,access,site,user)
        log.info("FIND %s" % databaseDescription )

        siteAndLevelFilter = lambda sc: sc and site == sc[0][0].lower() and level in sc[0][1]
        exactAccessFilter = lambda sc: access in sc[0][2]
        writeAccessFallbackFilter = lambda sc: "write" in sc[0][2]
      
        siteAndLevelConnections = filter(siteAndLevelFilter, self.connections.get(system, []))    
        matchingConnections = filter(exactAccessFilter, siteAndLevelConnections )
        
        if len(matchingConnections) == 0 and access == "read":
             matchingConnections = filter(writeAccessFallbackFilter, siteAndLevelConnections )
        
        if len(matchingConnections) > 1:
            raise dbError("More than one connection found for %s" % databaseDescription)
        if len(matchingConnections) < 1:
            raise dbError("Could not find database %s" % databaseDescription)        
        
        (vendor, server, schema, user, password, pwfile, host, port) = matchingConnections[0][1]
        
        #
        # Override password file if specified in config
        #
        if not pwfile and self.__pwfile:
            pwfile = self.__pwfile

        if not password and pwfile:
            password = GetPW( configFile = pwfile ).get( server, user )

        return (vendor, server, user, password, schema, host, port)    
Example #2
0
    def parseConnectionElement(self, e):
        ''' Parses an xml element specifying a connection. Returns three elements:
        * system name
        * tuple containing (site, access, level)
        * tuple containing (db type, server, schema, user, password, host, port)

        XML must be of the format:

        <!-- London prod -->
        <connection provider="sybase">
            <access   value="write"/>
            <site     value="London"/>
            <system   value="insight-credit"/>
            <level    value="prod"/>
            <host     value="db1.nyc.kbcfp.com"/>
            <port     value="1400"/>
            <server   value="GELBASE"/>
            <database value="production"/>
            <user     value="data_user"/>
        </connection>
        '''
        if e.localName != "connection" or e.hasAttribute("provider") is False:
            raise dbError("Cannot parse XML element named '%s'" % e.localName)

        nodeDict = {}
        nodeDict["provider"] = e.getAttribute("provider")

        for child in e.childNodes:
            if child.nodeType == child.ELEMENT_NODE and child.hasAttribute("value"):
                nodeDict[child.nodeName] = child.getAttribute("value")

        return ( self.extractValFromDict(nodeDict, True, "system"),
                 (
                   self.extractValFromDict(nodeDict, True,  "site"),
                   self.extractValFromDict(nodeDict, True,  "access"),
                   self.extractValFromDict(nodeDict, True,  "level"),
                 ),
                 (
                   self.extractValFromDict(nodeDict, True,  "provider"),
                   self.extractValFromDict(nodeDict, True,  "server"),
                   self.extractValFromDict(nodeDict, False, "database"),
                   self.extractValFromDict(nodeDict, True,  "user"),
                   self.extractValFromDict(nodeDict, False, "password"),
                   self.extractValFromDict(nodeDict, False, "passwordFile"),
                   self.extractValFromDict(nodeDict, False, "host"),
                   self.extractValFromDict(nodeDict, False, "port")
                 )
               )
Example #3
0
 def extractValFromDict(self, d, mandatory, key):
     try:
         return d[key]
     except KeyError:
         if mandatory:
             raise dbError("connection %s does not contain %s property" % (d.get("system", "unknown"), key))