Hi, the attached patch respects autoyast XML files and adds trigger scripts to it for: self.settings.pxe_just_once self.settings.run_install_triggers
https://github.com/ugansert/Cobbler -- ciao, Uwe Gansert Uwe Gansert SUSE LINUX Products GmbH, GF: Markus Rex, HRB 16746 (AG Nürnberg) Business: http://www.suse.de/~ug
From c698eeaef0e832c0caeea4ac8a8a085752ec1733 Mon Sep 17 00:00:00 2001 From: Uwe Gansert <[email protected]> Date: Wed, 9 Mar 2011 12:17:18 +0100 Subject: [PATCH] handle autoyast XML files --- cobbler/kickgen.py | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 100 insertions(+), 0 deletions(-) diff --git a/cobbler/kickgen.py b/cobbler/kickgen.py index 0b72690..aed48dc 100644 --- a/cobbler/kickgen.py +++ b/cobbler/kickgen.py @@ -41,6 +41,7 @@ import item_system from utils import _ +import xml.dom.minidom class KickGen: """ @@ -60,6 +61,98 @@ class KickGen: self.repos = config.repos() self.templar = templar.Templar(config) + def createAutoYaSTScript( self, document, script, name ): + newScript = document.createElement("script") + newScriptSource = document.createElement("source") + newScriptSourceText = document.createTextNode(script) + newScript.appendChild(newScriptSource) + + newScriptFile = document.createElement("filename") + newScriptFileText = document.createTextNode(name) + newScript.appendChild(newScriptFile) + + newScriptSource.appendChild(newScriptSourceText) + newScriptFile.appendChild(newScriptFileText) + return newScript + + def addAutoYaSTScript( self, document, type, source ): + scripts = document.getElementsByTagName("scripts") + if scripts.length == 0: + newScripts = document.createElement("scripts") + document.documentElement.appendChild( newScripts ) + scripts = document.getElementsByTagName("scripts") + added = 0 + for stype in scripts[0].childNodes: + if stype.nodeType == stype.ELEMENT_NODE and stype.tagName == type: + stype.appendChild( self.createAutoYaSTScript( document, source, type+"_cobbler" ) ) + added = 1 + if added == 0: + newChrootScripts = document.createElement( type ) + newChrootScripts.setAttribute( "config:type", "list" ) + newChrootScripts.appendChild( self.createAutoYaSTScript( document, source, type+"_cobbler" ) ) + scripts[0].appendChild( newChrootScripts ) + + def generate_autoyast(self, profile=None, system=None, raw_data=None): + self.api.logger.info("autoyast XML file found. Checkpoint: profile=%s system=%s" % (profile,system) ) + nopxe = "\nwget \"http://%s/cblr/svc/op/nopxe/system/%s\" -O /dev/null" + runpost = "\ncurl \"http://%s/cblr/svc/op/trig/mode/post/%s/%s\" > /dev/null" + runpre = "\nwget \"http://%s/cblr/svc/op/trig/mode/pre/%s/%s\" -O /dev/null" + + what = "profile" + blend_this = profile + if system: + what = "system" + blend_this = system + blended = utils.blender(self.api, False, blend_this) + srv = blended["http_server"] + + document = xml.dom.minidom.parseString(raw_data) + + # do we already have the #raw comment in the XML? (addComment = 0 means, don't add #raw comment) + addComment = 1 + for node in document.childNodes[1].childNodes: + if node.nodeType == ELEMENT_NODE and stype.tagName == "cobbler": + addComment = 0 + break + + # add some cobbler information to the XML file + # maybe that should be configureable + if addComment == 1: + #startComment = document.createComment("\ncobbler_system_name=$system_name\ncobbler_server=$server\n#raw\n") + #endComment = document.createComment("\n#end raw\n") + startComment = document.createComment("\ncobbler_system_name=$system_name\ncobbler_server=$server\n") + endComment = document.createComment("\n") + document.childNodes[1].insertBefore( startComment, document.childNodes[1].childNodes[1]) + document.childNodes[1].appendChild( endComment ) + cobblerElement = document.createElement("cobbler") + cobblerElementSystem = xml.dom.minidom.Element("system_name") + cobblerTextSystem = document.createTextNode("$system_name") + cobblerElementSystem.appendChild( cobblerTextSystem ) + + cobblerElementServer = document.createElement("server") + cobblerTextServer = document.createTextNode("$server") + cobblerElementServer.appendChild( cobblerTextServer ) + + cobblerElement.appendChild( cobblerElementServer ) + cobblerElement.appendChild( cobblerElementSystem ) + + document.childNodes[1].insertBefore( cobblerElement, document.childNodes[1].childNodes[1]) + + name = profile.name + if system is not None: + name = system.name + + if str(self.settings.pxe_just_once).upper() in [ "1", "Y", "YES", "TRUE" ]: + self.addAutoYaSTScript( document, "chroot-scripts", nopxe % (srv, name) ) + if self.settings.run_install_triggers: + # notify cobblerd when we start/finished the installation + self.addAutoYaSTScript( document, "pre-scripts", runpre % ( srv, what, name ) ) + self.addAutoYaSTScript( document, "init-scripts", runpost % ( srv, what, name ) ) + + return document.toxml() + + + def generate_repo_stanza(self, obj, is_profile=True): """ @@ -173,6 +266,13 @@ class KickGen: self.settings.template_remote_kickstarts) if raw_data is None: return "# kickstart is sourced externally: %s" % meta["kickstart"] + distro = profile.get_conceptual_parent() + if system is not None: + distro = system.get_conceptual_parent().get_conceptual_parent() + if distro.breed == "suse": + # AutoYaST profile + raw_data = self.generate_autoyast(profile,system,raw_data) + data = self.templar.render(raw_data, meta, None, obj) return data except FileNotFoundException: -- 1.7.3.4
_______________________________________________ cobbler-devel mailing list [email protected] https://fedorahosted.org/mailman/listinfo/cobbler-devel
