#!/usr/bin/python2.5 """ Copyright (C) 2008 Norman Messtorff This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ from SimpleXMLRPCServer import SimpleXMLRPCServer from Database import Database class TransportServer(Database): """Provides transport methodes - the Server side""" def __init__(self): # Database stuff Database.__init__(self) self.connect() # RPC Stuff self.srv = SimpleXMLRPCServer( (self.config["server"]["listen_ip"], int(self.config["server"]["listen_port"])) , logRequests=False) self.srv.register_function(self.register) self.srv.register_function(self.unregister) self.srv.register_function(self.transmit) self.srv.register_function(self.transmit_init) self.srv.register_function(self.transmit_exec) self.srv.register_function(self.transmit_append) self.srv.register_function(self.last_update) self.srv.register_function(self.mark_inactive) self.srv.register_function(self.mgmt_nodeinfo_brief) self.debug(4, "Class TransportServer initialized") def __del__(self): self.srv.server_close() def __create_node(self, hostname): """Insert a new node to our management""" if self.get_nodeid(hostname): self.debug(3, "node already existing: %s[%s]" % (hostname, self.get_nodeid(hostname))) return False else: self.insert("nodes", ("hostname", "password"), (hostname, self.random_chars()), commit=True) node_credentials=self.select("nodes", "nodeid, password", 'hostname="%s"' % hostname ) if node_credentials: return node_credentials self.debug(3, "Added new node: "+hostname+"["+str(node_credentials[0][0])+"]") else: return False def __delete_node(self, hostname): """Remove a node from our management""" # TODO: untested code! nodeid=self.get_nodeid(hostname) if nodeid: self.delete("nodes", "nodeid=%s" % nodeid, commit=True) self.delete("packages", "nodeid=%s" % nodeid, commit=True) self.debug(3, "Deleted node: %s[%s]" % (hostname, nodeid)) return nodeid else: self.debug("Could not delete node: %s" % hostname) return False def run(self): """Running our services""" self.debug(3, "TransportServer listening on " + str( (self.config["server"]["listen_ip"], self.config["server"]["listen_port"]) )) self.srv.serve_forever() return 0 def register(self, nodeid, hostname, password): """Register existing nodes to DebMan""" # node with default configuration requesting nodeid and password if nodeid == "0" and password == "0": self.debug(3, "node requesting new credentials, hostname: "+hostname) node_credentials = self.__create_node(hostname) if node_credentials: self.hostname = hostname self.nodeid = node_credentials[0][0] self.sessionid = self.update_session(node_credentials[0][0]) return node_credentials[0] else: self.debug(1, "Could not create new credentials!") return False else: # Check the credentials # TODO: uhm... maybe putting all credential related stuff into Database. node_credentials = self.select("nodes", "hostname, password", "nodeid=%s" % nodeid) if node_credentials: if hostname == node_credentials[0][0] and password == node_credentials[0][1]: self.hostname = node_credentials[0][0] self.nodeid = nodeid self.sessionid = self.update_session(nodeid) self.debug(3, "New node registered: "+hostname+"["+nodeid+"]") return True else: self.debug(1, "Wrong credentials! Aborting.") return False def unregister(self, hostname): """Unregister the node""" if hostname == self.hostname: self.hostname = None self.nodeid = None self.delete_session(self.sessionid) self.sessionid = None self.debug(3, "node unregistered: "+hostname) return True else: self.debug(3, "Invalid hostname on unregister(): "+hostname) return False def transmit_init(self): return self.valuebuffer_init() def transmit_exec(self, distname, distver, component, arch): # TODO: bug, wrong compid == 0 !!! sourceids = self.get_all_sourceids(distname, distver, component, arch) values = [ ] for package in self.valuebuffer(): # TODO: bug, pkgid == 0!!! pkgid = self.get_pkgid(1, package[0], package[1], package[2]) if pkgid: values.append( (pkgid, package[3]) ) else: print package pkgid = "" self.insert_node_pkgs(1, values) return 0 def transmit_append(self, pkg): """pkgname, installsize, version""" # we have to skip package informations without "version". This happens only, if the package was installed and is now purged/removed if pkg[2] != "none": # set the version field the right way... if pkg[1] == "none": pkg[1] = "0" self.valuebuffer_append(pkg) return 0 def transmit(self, packageinfo): """Transmit package informations""" if self.get_sessionid(self.nodeid): self.insert_pkg(self.nodeid, packageinfo) return True else: self.debug(1, "No active session!") return False def set_updated(self, nodeid): # TODO: unused code if self.get_sessionid(nodeid): return self.update("nodes", "last_upd", 'DATETIME("NOW")', "nodeid=%s" % nodeid) else: self.debug(1, "No active session!") return False def last_update(self): """Return the date and IP-Address of last transmission""" return 0 def mark_inactive(self): """Mark current node as inactive""" return 0 def submit_metadata(self, arch="", debian_version="", running_kernel="", location="", contact_name="", contact_email="", contact_phone=""): """Save some useful informations about current node (location, contact, hardware etc.)""" # TODO: arch/debian version/last update of node return 0 def mgmt_nodeinfo_brief(self): """Send a brief overview of all nodes ret=[nodeid,hostname,packages]""" ret = [ ] for node in self.select("nodes", "nodeid, hostname"): ret.append([node[0], node[1], self.count("packages", "package", "nodeid=%s" % node[0])]) return ret