diff options
Diffstat (limited to 'cobbler')
-rw-r--r-- | cobbler/cobblerd.py | 142 | ||||
-rw-r--r-- | cobbler/settings.py | 1 | ||||
-rw-r--r-- | cobbler/syslog_watcher.py | 52 |
3 files changed, 143 insertions, 52 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() + diff --git a/cobbler/settings.py b/cobbler/settings.py index c4f3b36..2aa421b 100644 --- a/cobbler/settings.py +++ b/cobbler/settings.py @@ -40,6 +40,7 @@ DEFAULTS = { "ia64" : "/var/lib/cobbler/elilo-3.6-ia64.efi" }, "syslog_port" : 25150, + "xmlrpc_port" : 25151, "minimize_syncs" : 1, "yum_core_mirror_from_server" : 0 } diff --git a/cobbler/syslog_watcher.py b/cobbler/syslog_watcher.py deleted file mode 100644 index fc00b85..0000000 --- a/cobbler/syslog_watcher.py +++ /dev/null @@ -1,52 +0,0 @@ -# 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 api as cobbler_api - -def main(): - - bootapi = cobbler_api.BootAPI() - settings = bootapi.settings() - port = settings.syslog_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() - |