summaryrefslogtreecommitdiffstats
path: root/cobbler/cobblerd.py
diff options
context:
space:
mode:
authorMichael DeHaan <mdehaan@mdehaan.rdu.redhat.com>2007-04-19 15:24:08 -0400
committerMichael DeHaan <mdehaan@mdehaan.rdu.redhat.com>2007-04-19 15:24:08 -0400
commit8a46265453503a5dfe04bf10d3019368fb032cf5 (patch)
tree1f965e2948079ae60d3b56c6edaef8d6b59d9119 /cobbler/cobblerd.py
parentc9da67b5170b473895ce83feba2aa328cf5ec9f8 (diff)
downloadthird_party-cobbler-8a46265453503a5dfe04bf10d3019368fb032cf5.tar.gz
third_party-cobbler-8a46265453503a5dfe04bf10d3019368fb032cf5.tar.xz
third_party-cobbler-8a46265453503a5dfe04bf10d3019368fb032cf5.zip
Changes cobbler_syslogd to cobblerd, and this new daemon now offers koan
info over XMLRPC, allowing koan to stop needing to grok YAML. Older versions of koan will remain compatible over standard http://.
Diffstat (limited to 'cobbler/cobblerd.py')
-rw-r--r--cobbler/cobblerd.py142
1 files changed, 142 insertions, 0 deletions
diff --git a/cobbler/cobblerd.py b/cobbler/cobblerd.py
new file mode 100644
index 0000000..801f7f3
--- /dev/null
+++ b/cobbler/cobblerd.py
@@ -0,0 +1,142 @@
+# cobbler daemon for logging remote syslog traffic during kickstart
+#
+# Copyright 2007, Red Hat, Inc
+# Michael DeHaan <mdehaan@redhat.com>
+#
+# This software may be freely redistributed under the terms of the GNU
+# general public license.
+#
+# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+import socket
+import time
+import os
+import SimpleXMLRPCServer
+import yaml # Howell Clark version
+
+import api as cobbler_api
+
+def main():
+
+ bootapi = cobbler_api.BootAPI()
+ settings = bootapi.settings()
+ syslog_port = settings.syslog_port
+ xmlrpc_port = settings.xmlrpc_port
+
+ pid = os.fork()
+
+ if pid == 0:
+ do_xmlrpc(bootapi, settings, xmlrpc_port)
+ else:
+ do_syslog(bootapi, settings, syslog_port)
+
+def do_xmlrpc(bootapi, settings, port):
+
+ xinterface = CobblerXMLRPCInterface(bootapi)
+ server = CobblerXMLRPCServer(('', port))
+ server.register_instance(xinterface)
+ server.serve_forever()
+
+def do_syslog(bootapi, settings, port):
+
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ s.bind(("0.0.0.0", port))
+
+ buf = 1024
+
+ while 1:
+ data, addr = s.recvfrom(buf)
+ (ip, port) = addr
+ if not data:
+ break
+ else:
+ logfile = open("/var/log/cobbler/syslog/%s" % ip, "a+")
+ t = time.localtime()
+ # write numeric time
+ seconds = str(time.mktime(t))
+ logfile.write(seconds)
+ logfile.write("\t")
+ # write string time
+ timestr = str(time.asctime(t))
+ logfile.write(timestr)
+ logfile.write("\t")
+ # write the IP address of the client
+ logfile.write(ip)
+ logfile.write("\t")
+ # write the data
+ logfile.write(data)
+ logfile.write("\n")
+ logfile.close()
+
+class CobblerXMLRPCInterface:
+
+ def __init__(self,api):
+ self.api = api
+
+ def __sorter(self,a,b):
+ return cmp(a["name"],b["name"])
+
+ def __get_all(self,collection):
+ data = collection.to_datastruct()
+ data.sort(self.__sorter)
+ return data
+
+ def get_distros(self):
+ return self.__get_all(self.api.distros())
+
+ def get_profiles(self):
+ return self.__get_all(self.api.profiles())
+
+ def get_systems(self):
+ return self.__get_all(self.api.systems())
+
+ def __get_specific(self,collection,name):
+ item = collection.find(name)
+ if item is None:
+ return {}
+ return item.to_datastruct()
+
+ def get_distro(self,name):
+ return self.__get_specific(self.api.distros(),name)
+
+ def get_profile(self,name):
+ return self.__get_specific(self.api.profiles(),name)
+
+ def get_system(self,name):
+ return self.__get_specific(self.api.systems(),name)
+
+ def get_repo(self,name):
+ return self.__get_specific(self.api.repos(),name)
+
+ def __get_for_koan(self,dir,name):
+ path = os.path.join("/var/www/cobbler/", dir, name)
+ if not os.path.exists(path):
+ return {}
+ fd = open(path)
+ data = fd.read()
+ datastruct = yaml.load(data).next()
+ fd.close()
+ return datastruct
+
+ def get_distro_for_koan(self,name):
+ return self.__get_for_koan("distros",name)
+
+ def get_profile_for_koan(self,name):
+ return self.__get_for_koan("profiles",name)
+
+ def get_system_for_koan(self,name):
+ return self.__get_for_koan("systems",name)
+
+class CobblerXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer):
+
+ def __init__(self, args):
+ self.allow_reuse_address = True
+ SimpleXMLRPCServer.SimpleXMLRPCServer.__init__(self,args)
+
+
+if __name__ == "__main__":
+
+ main()
+