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)
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") ) )
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))