diff options
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | cobbler/remote.py | 43 | ||||
-rw-r--r-- | cobbler/webui/CobblerWeb.py | 29 | ||||
-rw-r--r-- | cobbler/webui/master.py | 16 | ||||
-rw-r--r-- | setup.py | 1 | ||||
-rw-r--r-- | webui_templates/ksfile_edit.tmpl | 39 | ||||
-rw-r--r-- | webui_templates/ksfile_list.tmpl | 3 | ||||
-rw-r--r-- | webui_templates/ksfile_new.tmpl | 48 | ||||
-rw-r--r-- | webui_templates/master.tmpl | 1 |
9 files changed, 159 insertions, 22 deletions
@@ -32,6 +32,7 @@ Cobbler CHANGELOG - legacy static file generation from /var/www/cobbler removed - implement "cobbler ___ dumpvars --name=X" feature to show template vars - validateks now works against all URLs as opposed to rendered local files +- now possible to create new kickstarts in webui, and delete unused ones - ??? - 0.8.3 - Make createrepo get run for local cobbler reposync invocations as needed diff --git a/cobbler/remote.py b/cobbler/remote.py index c25e700..a7e056b 100644 --- a/cobbler/remote.py +++ b/cobbler/remote.py @@ -24,6 +24,7 @@ import random import base64 import string import traceback +import glob import api as cobbler_api import utils @@ -158,6 +159,35 @@ class CobblerXMLRPCInterface: return self._fix_none(data) + def get_kickstart_templates(self,token): + """ + Returns all of the kickstarts that are in use by the system. + """ + self.log("get_kickstart_templates",token=token) + self.check_access(token, "get_kickstart_templates") + files = {} + for x in self.api.profiles(): + if x.kickstart is not None and x.kickstart != "" and x.kickstart != "<<inherit>>": + files[x.kickstart] = 1 + for x in self.api.systems(): + if x.kickstart is not None and x.kickstart != "" and x.kickstart != "<<inherit>>": + files[x.kickstart] = 1 + for x in glob.glob("/var/lib/cobbler/kickstarts/*"): + files[x] = 1 + + return files.keys() + + def is_kickstart_in_use(self,ks,token): + self.log("is_kickstart_in_use",token=token) + self.check_access(token, "is_kickstart_in_use") + for x in self.api.profiles(): + if x.kickstart is not None and x.kickstart == ks: + return True + for x in self.api.systems(): + if x.kickstart is not None and x.kickstart == ks: + return True + return False + def generate_kickstart(self,profile=None,system=None,REMOTE_ADDR=None,REMOTE_MAC=None): self.log("generate_kickstart") @@ -1042,9 +1072,16 @@ class CobblerReadWriteXMLRPCInterface(CobblerXMLRPCInterface): fileh.close() return data else: - fileh = open(kickstart_file,"w+") - fileh.write(new_data) - fileh.close() + if new_data == -1: + # delete requested + if not self.is_kickstart_in_use(kickstart_file,token): + os.remove(kickstart_file) + else: + raise CX(_("attempt to delete in-use file")) + else: + fileh = open(kickstart_file,"w+") + fileh.write(new_data) + fileh.close() return True diff --git a/cobbler/webui/CobblerWeb.py b/cobbler/webui/CobblerWeb.py index 628d776..2eeb1a3 100644 --- a/cobbler/webui/CobblerWeb.py +++ b/cobbler/webui/CobblerWeb.py @@ -712,6 +712,20 @@ class CobblerWeb(object): 'ksfiles': self.remote.get_kickstart_templates(self.token) } ) + def ksfile_new(self, name=None,**spam): + + + if not self.__xmlrpc_setup(): + return self.xmlrpc_auth_failure() + + can_edit = self.remote.check_access_no_fail(self.token,"add_kickstart",name) + return self.__render( 'ksfile_new.tmpl', { + 'editable' : can_edit, + 'ksdata': '' + } ) + + + def ksfile_edit(self, name=None,**spam): @@ -721,18 +735,26 @@ class CobblerWeb(object): can_edit = self.remote.check_access_no_fail(self.token,"modify_kickstart",name) return self.__render( 'ksfile_edit.tmpl', { 'name': name, + 'deleteable' : not self.remote.is_kickstart_in_use(name,self.token), 'editable' : can_edit, 'ksdata': self.remote.read_or_write_kickstart_template(name,True,"",self.token) } ) - def ksfile_save(self, name=None, ksdata=None, **args): + def ksfile_save(self, name=None, ksdata=None, delete1=None, delete2=None, isnew=None, **args): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() + + try: - self.remote.read_or_write_kickstart_template(name,False,ksdata,self.token) + if delete1 and delete2: + self.remote.read_or_write_kickstart_template(name,False,-1,self.token) + if isnew is not None: + name = "/var/lib/cobbler/kickstarts/" + name + if not delete1 and not delete2: + self.remote.read_or_write_kickstart_template(name,False,ksdata,self.token) except Exception, e: return self.error_page("An error occurred while trying to save kickstart file %s:<br/><br/>%s" % (name,str(e))) - return self.ksfile_edit(name=name) + return self.ksfile_list() # ------------------------------------------------------------------------ # # Miscellaneous @@ -813,6 +835,7 @@ class CobblerWeb(object): settings_view.exposed = True ksfile_edit.exposed = True + ksfile_new.exposed = True ksfile_save.exposed = True ksfile_list.exposed = True diff --git a/cobbler/webui/master.py b/cobbler/webui/master.py index 14f06b5..22391eb 100644 --- a/cobbler/webui/master.py +++ b/cobbler/webui/master.py @@ -33,10 +33,10 @@ VFN=valueForName currentTime=time.time __CHEETAH_version__ = '2.0.1' __CHEETAH_versionTuple__ = (2, 0, 1, 'final', 0) -__CHEETAH_genTime__ = 1208557454.7957201 -__CHEETAH_genTimestamp__ = 'Fri Apr 18 18:24:14 2008' +__CHEETAH_genTime__ = 1209057202.737108 +__CHEETAH_genTimestamp__ = 'Thu Apr 24 13:13:22 2008' __CHEETAH_src__ = 'webui_templates/master.tmpl' -__CHEETAH_srcLastModified__ = 'Fri Feb 15 14:47:43 2008' +__CHEETAH_srcLastModified__ = 'Thu Apr 24 12:59:37 2008' __CHEETAH_docstring__ = 'Autogenerated by CHEETAH: The Python-Powered Template Engine' if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple: @@ -69,7 +69,7 @@ class master(Template): - ## CHEETAH: generated from #block body at line 53, col 1. + ## CHEETAH: generated from #block body at line 54, col 1. trans = KWS.get("trans") if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)): trans = self.transaction # is None unless self.awake() was called @@ -196,11 +196,15 @@ class master(Template): <li><a href="''') _v = VFFSL(SL,"base_url",True) # '$base_url' on line 46, col 22 if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 46, col 22. + write('''?mode=ksfile_new" class="menu">Kickstart</a></li> + <li><a href="''') + _v = VFFSL(SL,"base_url",True) # '$base_url' on line 47, col 22 + if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 47, col 22. write('''?mode=repo_edit" class="menu">Repo</a></li> <li><hr/><br/></li> <li><a class="button sync" href="''') - _v = VFFSL(SL,"base_url",True) # '$base_url' on line 48, col 42 - if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 48, col 42. + _v = VFFSL(SL,"base_url",True) # '$base_url' on line 49, col 42 + if _v is not None: write(_filter(_v, rawExpr='$base_url')) # from line 49, col 42. write('''?mode=sync">Sync</a></li> </ul> </div> @@ -162,6 +162,7 @@ if __name__ == "__main__": # Web UI kickstart file editing (wwwtmpl, ['webui_templates/ksfile_edit.tmpl']), + (wwwtmpl, ['webui_templates/ksfile_new.tmpl']), (wwwtmpl, ['webui_templates/ksfile_list.tmpl']), # Web UI support files diff --git a/webui_templates/ksfile_edit.tmpl b/webui_templates/ksfile_edit.tmpl index 87c9f41..6303442 100644 --- a/webui_templates/ksfile_edit.tmpl +++ b/webui_templates/ksfile_edit.tmpl @@ -20,25 +20,46 @@ if you need to resolve this. <form method="post" action="$base_url?mode=ksfile_save"> <input type="hidden" name="name" value="$name"/> <fieldset id="cform"> - <legend>Edit Kickstart File</legend> + <legend>Edit Kickstart Template</legend> + + <table> + <tr><td colspan="2"> + <label for="ksdata">Editing: $name</label> + <td></tr> + + <tr><td colspan="2"> <pre><textarea rows="40" cols="120" name="ksdata" id="ksdata">$ksdata</textarea></pre> <br/> + </td></tr> + + + #if $deleteable + <tr><td> + <label>Delete</label> + </td> + <td> + <input type="checkbox" name="delete1" value="delete1">Yes + <input type="checkbox" name="delete2" value="delete2">Really + <p class="context-tip">Check both buttons and click save to delete this object</p> + </td></tr> + #else + <tr><td colspan="2"> + NOTE: This kickstart template is currently in-use. + </td></tr> + #end if + + <tr><td colspan="2"> #if $editable == True <input type="submit" name="submit" value="Save"/> <input type="reset" name="reset" value="Reset"/> + #end if + </td></tr> + </table> </fieldset> </form> -#if $editable == True -<br/> -<blockquote> -NOTE: Run a cobbler sync to after making changes here in order -for kickstart files to be regenerated. -</blockquote> -#end if - #end block body diff --git a/webui_templates/ksfile_list.tmpl b/webui_templates/ksfile_list.tmpl index dcfaa0a..6ae1a9c 100644 --- a/webui_templates/ksfile_list.tmpl +++ b/webui_templates/ksfile_list.tmpl @@ -3,7 +3,7 @@ #block body <table class="sortable"> <thead> - <caption>Cobbler Kickstart Files</caption> + <caption>Cobbler Kickstart Templates</caption> <tr> <th class="text">File</th> <th class="text">Edit/View</th> @@ -12,6 +12,7 @@ <tbody> #set $evenodd = 1 #for $ksfile in $ksfiles + <!-- $ksfile --> #if $evenodd % 2 == 0 #set $tr_class = "roweven" #else diff --git a/webui_templates/ksfile_new.tmpl b/webui_templates/ksfile_new.tmpl new file mode 100644 index 0000000..c68bbdd --- /dev/null +++ b/webui_templates/ksfile_new.tmpl @@ -0,0 +1,48 @@ +#extends cobbler.webui.master + +#block body + +#if $editable != True +<blockquote> +NOTE: You do not have permission to create new kickstart templates. +</blockquote> +</br> +#end if + +<form method="post" action="$base_url?mode=ksfile_save"> + <fieldset id="cform"> + <legend>Create New Kickstart Template</legend> + + <input type="hidden" name="isnew" value="1"/> + + <table> + <tr> + <td> + <label for="name">Filename</label> + </td> + <td> + <input type="text" size="128" style="width: 150px;" name="name" id="name" + <p class="context-tip">Example: foo.ks (to be saved in /var/lib/cobbler/kickstarts/)</p> + </td> + </tr> + + + <tr><td colspan="2"> + + <pre><textarea rows="40" cols="120" name="ksdata" id="ksdata">$ksdata</textarea></pre> + <br/> + + </td></tr> + + <tr><td colspan="2"> + #if $editable == True + <input type="submit" name="submit" value="Save"/> + <input type="reset" name="reset" value="Reset"/> + #end if + </td></tr> + </table> + + </fieldset> +</form> + +#end block body diff --git a/webui_templates/master.tmpl b/webui_templates/master.tmpl index 96fbe75..5e9438f 100644 --- a/webui_templates/master.tmpl +++ b/webui_templates/master.tmpl @@ -43,6 +43,7 @@ <li><a href="$base_url?mode=profile_edit" class="menu">Profile</a></li> <li><a href="$base_url?mode=subprofile_edit" class="menu">Subprofile</a></li> <li><a href="$base_url?mode=system_edit" class="menu">System</a></li> + <li><a href="$base_url?mode=ksfile_new" class="menu">Kickstart</a></li> <li><a href="$base_url?mode=repo_edit" class="menu">Repo</a></li> <li><hr/><br/></li> <li><a class="button sync" href="$base_url?mode=sync">Sync</a></li> |