From d8bb2c9c4ed991ed643eb0b44769e74b37289cec Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Mon, 2 Jul 2007 17:04:49 -0400 Subject: Add logging for cobblerd + logrotate script. Bumped revision to 0.5.1. --- CHANGELOG | 3 +++ MANIFEST.in | 1 + cobbler.spec | 15 ++++++++++----- cobbler/cobblerd.py | 26 +++++++++++++++++++------- cobbler/utils.py | 13 +++++++++++++ config/cobblerd_rotate | 9 +++++++++ scripts/cobblerd | 19 ++++++++++++++++++- setup.py | 4 +++- 8 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 config/cobblerd_rotate diff --git a/CHANGELOG b/CHANGELOG index 91e629f..bc2b4f5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,9 @@ Cobbler CHANGELOG (all entries mdehaan@redhat.com unless noted otherwise) +* Mon Jul 02 2007 - 0.5.1 +- Added logging for cobblerd -- /var/log/cobbler/cobblerd.log + * Wed Jun 24 2007 - 0.5.0 - Remove hardcode of /var/www/cobbler in cobblerd - Improve various warning warning messages diff --git a/MANIFEST.in b/MANIFEST.in index eda9acd..3b5ba7f 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,6 +4,7 @@ include loaders/menu.c32 include config/cobbler.conf include config/rsync.exclude include config/cobblerd +include config/logrotate recursive-include templates *.template recursive-include kickstarts *.ks include docs/cobbler.1.gz diff --git a/cobbler.spec b/cobbler.spec index afaec91..b25bf5e 100644 --- a/cobbler.spec +++ b/cobbler.spec @@ -29,15 +29,15 @@ Url: http://cobbler.et.redhat.com %description -Cobbler is a command line tool for configuration of network -boot and update servers. It is also available as a Python -library. Cobbler supports PXE, provisioning virtualized images, +Cobbler is a network boot and update server. +It can also be used as a Python library. +Cobbler supports PXE, provisioning virtualized images, and reinstalling machines that are already running (over SSH). The last two modes require a helper tool called 'koan' that integrates with cobbler. Cobbler's advanced features include -importing distributions from rsync mirrors, kickstart templating, +importing distributions from DVDs and rsync mirrors, kickstart templating, integrated yum mirroring, kickstart monitoring, and auto-managing -dhcpd.conf. +DHCP configurations for ISC dhcpd and dnsmasq. %prep %setup -q @@ -134,6 +134,11 @@ test "x$RPM_BUILD_ROOT" != "x" && rm -rf $RPM_BUILD_ROOT %changelog +* Mon Jul 02 2007 Michael DeHaan - 0.5.1-1 +- Upstream changes (see CHANGELOG) +- Modified description +- Added logrotate script + * Wed Jun 27 2007 Michael DeHaan - 0.5.0-1 - Upstream changes (see CHANGELOG) - Added dnsmasq.template diff --git a/cobbler/cobblerd.py b/cobbler/cobblerd.py index b26aae1..0699632 100644 --- a/cobbler/cobblerd.py +++ b/cobbler/cobblerd.py @@ -10,6 +10,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +import sys import socket import time import os @@ -21,8 +22,10 @@ import utils from rhpl.translate import _, N_, textdomain, utf8 import xmlrpclib - def main(): + core(logger=None) + +def core(logger=None): bootapi = cobbler_api.BootAPI() settings = bootapi.settings() @@ -32,21 +35,29 @@ def main(): pid = os.fork() if pid == 0: - do_xmlrpc(bootapi, settings, xmlrpc_port) + do_xmlrpc(bootapi, settings, xmlrpc_port, logger) + else: + do_syslog(bootapi, settings, syslog_port, logger) + +def log(logger,msg): + if logger is not None: + logger.info(msg) else: - do_syslog(bootapi, settings, syslog_port) + print >>sys.stderr, msg -def do_xmlrpc(bootapi, settings, port): +def do_xmlrpc(bootapi, settings, port, logger): - xinterface = CobblerXMLRPCInterface(bootapi) + xinterface = CobblerXMLRPCInterface(bootapi,logger) server = CobblerXMLRPCServer(('', port)) + log(logger, "XMLRPC running on %s" % port) server.register_instance(xinterface) server.serve_forever() -def do_syslog(bootapi, settings, port): +def do_syslog(bootapi, settings, port, logger): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(("0.0.0.0", port)) + log(logger, "syslog running on %s" % port) buf = 1024 @@ -79,8 +90,9 @@ def do_syslog(bootapi, settings, port): class CobblerXMLRPCInterface: - def __init__(self,api): + def __init__(self,api,logger): self.api = api + self.logger = logger def __sorter(self,a,b): return cmp(a["name"],b["name"]) diff --git a/cobbler/utils.py b/cobbler/utils.py index 5a83047..acc748b 100644 --- a/cobbler/utils.py +++ b/cobbler/utils.py @@ -12,6 +12,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. """ +import sys import os import re import socket @@ -20,6 +21,7 @@ import sub_process import shutil import string import traceback +import logging from rhpl.translate import _, N_, textdomain, utf8 import api # factor out @@ -27,6 +29,17 @@ import api # factor out _re_kernel = re.compile(r'vmlinuz(.*)') _re_initrd = re.compile(r'initrd(.*).img') + +def log_exc(logger): + """ + Log an exception. + """ + (t, v, tb) = sys.exc_info() + logger.info("Exception occured: %s" % t ) + logger.info("Exception value: %s" % v) + logger.info("Exception Info:\n%s" % string.join(traceback.format_list(traceback.extract_tb(tb)))) + + def trace_me(): x = traceback.extract_stack() bar = string.join(traceback.format_list(x)) diff --git a/config/cobblerd_rotate b/config/cobblerd_rotate new file mode 100644 index 0000000..4340bf3 --- /dev/null +++ b/config/cobblerd_rotate @@ -0,0 +1,9 @@ +/var/log/cobbler/cobblerd.log { + rotate 4 + weekly + postrotate + if [ -f /var/lock/subsys/cobblerd ]; then + /etc/init.d/cobblerd restart + fi + endscript +} diff --git a/scripts/cobblerd b/scripts/cobblerd index 409f738..b6bf8a5 100755 --- a/scripts/cobblerd +++ b/scripts/cobblerd @@ -17,11 +17,23 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. import sys import os import cobbler.cobblerd as app +import logging +import cobbler.utils as utils + +logger = logging.getLogger("cobbler.cobblerd") +logger.setLevel(logging.DEBUG) +ch = logging.FileHandler("/var/log/cobbler/cobblerd.log") +ch.setLevel(logging.DEBUG) +formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") +ch.setFormatter(formatter) +logger.addHandler(ch) if __name__ == "__main__": ############################################# + # daemonizing code: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012 + logger.debug("started") try: pid = os.fork() if pid > 0: @@ -29,6 +41,7 @@ if __name__ == "__main__": sys.exit(0) except OSError, e: print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) + utils.log_exc(logger) sys.exit(1) # decouple from parent environment @@ -44,9 +57,13 @@ if __name__ == "__main__": sys.exit(0) except OSError, e: print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) + utils.log_exc(logger) sys.exit(1) ################# - app.main() + try: + app.core(logger=logger) + except: + utils.log_exc(logger) diff --git a/setup.py b/setup.py index 31706bd..064105c 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ import sys from distutils.core import setup, Extension import string -VERSION = "0.5.0" +VERSION = "0.5.1" SHORT_DESC = "Boot and update server configurator" LONG_DESC = """ Cobbler is a command line tool for configuration of boot/provisioning, and update servers which is also accessible as a Python library. Cobbler supports PXE, provisioning virtualized images, and reinstalling machines that are already up and running (over SSH). The last two modes require a helper tool called 'koan' that integrates with cobbler. Cobbler's advanced features include importing distributions from rsync mirrors, kickstart templating, integrated yum mirroring (and linking repository setup with kickstarts), plus managing dhcpd.conf. @@ -34,6 +34,7 @@ if __name__ == "__main__": vw_links = "/var/www/cobbler/links" tftp_cfg = "/tftpboot/pxelinux.cfg" tftp_images = "/tftpboot/images" + rotpath = "/etc/logrotate.d" setup( name="cobbler", version = VERSION, @@ -47,6 +48,7 @@ if __name__ == "__main__": ], scripts = ["scripts/cobbler", "scripts/cobblerd"], data_files = [ + (rotpath, ['config/cobblerd_rotate']), (wwwconf, ['config/cobbler.conf']), (cobpath, ['loaders/elilo-3.6-ia64.efi']), (cobpath, ['loaders/menu.c32']), -- cgit