summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG1
-rw-r--r--cobbler/remote.py43
-rw-r--r--cobbler/webui/CobblerWeb.py29
-rw-r--r--cobbler/webui/master.py16
-rw-r--r--setup.py1
-rw-r--r--webui_templates/ksfile_edit.tmpl39
-rw-r--r--webui_templates/ksfile_list.tmpl3
-rw-r--r--webui_templates/ksfile_new.tmpl48
-rw-r--r--webui_templates/master.tmpl1
9 files changed, 159 insertions, 22 deletions
diff --git a/CHANGELOG b/CHANGELOG
index ce085f1..ed91270 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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>
diff --git a/setup.py b/setup.py
index eb969d1..91eabed 100644
--- a/setup.py
+++ b/setup.py
@@ -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>