summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--CHANGELOG1
-rwxr-xr-xcobbler/cobbler.py1
-rw-r--r--cobbler/collection.py1
-rw-r--r--cobbler/item.py16
-rw-r--r--cobbler/item_distro.py103
-rw-r--r--cobbler/item_profile.py129
-rw-r--r--cobbler/item_system.py133
-rw-r--r--cobbler/modules/cli_distro.py11
-rw-r--r--cobbler/modules/cli_profile.py14
-rw-r--r--cobbler/modules/cli_system.py4
-rw-r--r--cobbler/utils.py8
-rw-r--r--kickstarts/legacy.ks1
-rw-r--r--kickstarts/sample.ks1
-rw-r--r--kickstarts/sample_end.ks1
-rw-r--r--setup.py1
-rw-r--r--snippets/post_install_kernel_options4
-rw-r--r--webui_templates/distro_edit.tmpl14
-rw-r--r--webui_templates/profile_edit.tmpl16
-rw-r--r--webui_templates/system_edit.tmpl16
20 files changed, 290 insertions, 186 deletions
diff --git a/AUTHORS b/AUTHORS
index ede68455..3bd48326 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -33,6 +33,7 @@ Patches and other contributions from:
Jim Meyering <jim@meyering.net>
Perry Myers <pmyers@redhat.com>
Jack Neely <jjneely@ncsu.edu>
+ Lassi Pölönen <lassi.polonen@helsinki.fi>
Ben Riggs <rigg0022@umn.edu>
Jeremy Rosengren <jeremy@rosengren.org>
Adam Rosenwald <thestrider@gmail.com>
diff --git a/CHANGELOG b/CHANGELOG
index b0610bbe..b779448e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -10,6 +10,7 @@ Cobbler CHANGELOG
- (BUGF) --help now works more intuitively on odd command line usage
- (BUGF) use pxesystem for systems, not pxeprofile
- (FEAT) make Cheetah formatting errors contain help text for users
+- (FEAT) --kopts-post can configure post-install kernel options
- ??? - 1.1.0
- devel branch
diff --git a/cobbler/cobbler.py b/cobbler/cobbler.py
index 54f75b65..eb0e20d6 100755
--- a/cobbler/cobbler.py
+++ b/cobbler/cobbler.py
@@ -72,7 +72,6 @@ def main():
"""
CLI entry point
"""
- exitcode = 0
try:
run_upgrade_checks()
rc = BootCLI().run(sys.argv)
diff --git a/cobbler/collection.py b/cobbler/collection.py
index 32e53106..50da6137 100644
--- a/cobbler/collection.py
+++ b/cobbler/collection.py
@@ -99,6 +99,7 @@ class Collection(serializable.Serializable):
SEARCH_REKEY = {
'kopts' : 'kernel_options',
+ 'kopts_post' : 'kernel_options_post',
'ksmeta' : 'ks_meta',
'inherit' : 'parent',
'ip' : 'ip_address',
diff --git a/cobbler/item.py b/cobbler/item.py
index 9ddfc953..76e029a3 100644
--- a/cobbler/item.py
+++ b/cobbler/item.py
@@ -149,6 +149,22 @@ class Item(serializable.Serializable):
self.kernel_options = value
return True
+ def set_kernel_options_post(self,options,inplace=False):
+ """
+ Post kernel options are a space delimited list,
+ like 'a=b c=d e=f g h i=j' or a hash.
+ """
+ (success, value) = utils.input_string_or_hash(options,None)
+ if not success:
+ raise CX(_("invalid post kernel options"))
+ else:
+ if inplace:
+ for key in value.keys():
+ self.kernel_options_post[key] = value[key]
+ else:
+ self.kernel_options_post = value
+ return True
+
def set_ksmeta(self,options,inplace=False):
"""
A comma delimited list of key value pairs, like 'a=b,c=d,e=f' or a hash.
diff --git a/cobbler/item_distro.py b/cobbler/item_distro.py
index 077dcba0..abdd85b3 100644
--- a/cobbler/item_distro.py
+++ b/cobbler/item_distro.py
@@ -39,16 +39,17 @@ class Distro(item.Item):
"""
Reset this object.
"""
- self.name = None
- self.owners = self.settings.default_ownership
- self.kernel = (None, '<<inherit>>')[is_subobject]
- self.initrd = (None, '<<inherit>>')[is_subobject]
- self.kernel_options = ({}, '<<inherit>>')[is_subobject]
- self.ks_meta = ({}, '<<inherit>>')[is_subobject]
- self.arch = ('i386', '<<inherit>>')[is_subobject]
- self.breed = ('redhat', '<<inherit>>')[is_subobject]
- self.source_repos = ([], '<<inherit>>')[is_subobject]
- self.depth = 0
+ self.name = None
+ self.owners = self.settings.default_ownership
+ self.kernel = (None, '<<inherit>>')[is_subobject]
+ self.initrd = (None, '<<inherit>>')[is_subobject]
+ self.kernel_options = ({}, '<<inherit>>')[is_subobject]
+ self.kernel_options_post = ({}, '<<inherit>>')[is_subobject]
+ self.ks_meta = ({}, '<<inherit>>')[is_subobject]
+ self.arch = ('i386', '<<inherit>>')[is_subobject]
+ self.breed = ('redhat', '<<inherit>>')[is_subobject]
+ self.source_repos = ([], '<<inherit>>')[is_subobject]
+ self.depth = 0
def make_clone(self):
ds = self.to_datastruct()
@@ -67,22 +68,25 @@ class Distro(item.Item):
"""
Modify this object to take on values in seed_data
"""
- self.parent = self.load_item(seed_data,'parent')
- self.name = self.load_item(seed_data,'name')
- self.owners = self.load_item(seed_data,'owners',self.settings.default_ownership)
- self.kernel = self.load_item(seed_data,'kernel')
- self.initrd = self.load_item(seed_data,'initrd')
- self.kernel_options = self.load_item(seed_data,'kernel_options')
- self.ks_meta = self.load_item(seed_data,'ks_meta')
- self.arch = self.load_item(seed_data,'arch','i386')
- self.breed = self.load_item(seed_data,'breed','redhat')
- self.source_repos = self.load_item(seed_data,'source_repos',[])
- self.depth = self.load_item(seed_data,'depth',0)
+ self.parent = self.load_item(seed_data,'parent')
+ self.name = self.load_item(seed_data,'name')
+ self.owners = self.load_item(seed_data,'owners',self.settings.default_ownership)
+ self.kernel = self.load_item(seed_data,'kernel')
+ self.initrd = self.load_item(seed_data,'initrd')
+ self.kernel_options = self.load_item(seed_data,'kernel_options')
+ self.kernel_options_post = self.load_item(seed_data,'kernel_options_post')
+ self.ks_meta = self.load_item(seed_data,'ks_meta')
+ self.arch = self.load_item(seed_data,'arch','i386')
+ self.breed = self.load_item(seed_data,'breed','redhat')
+ self.source_repos = self.load_item(seed_data,'source_repos',[])
+ self.depth = self.load_item(seed_data,'depth',0)
# backwards compatibility enforcement
self.set_arch(self.arch)
if self.kernel_options != "<<inherit>>" and type(self.kernel_options) != dict:
self.set_kernel_options(self.kernel_options)
+ if self.kernel_options_post != "<<inherit>>" and type(self.kernel_options_post) != dict:
+ self.set_kernel_options_post(self.kernel_options_post)
if self.ks_meta != "<<inherit>>" and type(self.ks_meta) != dict:
self.set_ksmeta(self.ks_meta)
@@ -168,17 +172,18 @@ class Distro(item.Item):
Return a serializable datastructure representation of this object.
"""
return {
- 'name' : self.name,
- 'kernel' : self.kernel,
- 'initrd' : self.initrd,
- 'kernel_options' : self.kernel_options,
- 'ks_meta' : self.ks_meta,
- 'arch' : self.arch,
- 'breed' : self.breed,
- 'source_repos' : self.source_repos,
- 'parent' : self.parent,
- 'depth' : self.depth,
- 'owners' : self.owners
+ 'name' : self.name,
+ 'kernel' : self.kernel,
+ 'initrd' : self.initrd,
+ 'kernel_options' : self.kernel_options,
+ 'kernel_options_post' : self.kernel_options_post,
+ 'ks_meta' : self.ks_meta,
+ 'arch' : self.arch,
+ 'breed' : self.breed,
+ 'source_repos' : self.source_repos,
+ 'parent' : self.parent,
+ 'depth' : self.depth,
+ 'owners' : self.owners
}
def printable(self):
@@ -187,26 +192,28 @@ class Distro(item.Item):
"""
kstr = utils.find_kernel(self.kernel)
istr = utils.find_initrd(self.initrd)
- buf = _("distro : %s\n") % self.name
- buf = buf + _("breed : %s\n") % self.breed
- buf = buf + _("architecture : %s\n") % self.arch
- buf = buf + _("initrd : %s\n") % istr
- buf = buf + _("kernel : %s\n") % kstr
- buf = buf + _("kernel options : %s\n") % self.kernel_options
- buf = buf + _("ks metadata : %s\n") % self.ks_meta
- buf = buf + _("owners : %s\n") % self.owners
+ buf = _("distro : %s\n") % self.name
+ buf = buf + _("breed : %s\n") % self.breed
+ buf = buf + _("architecture : %s\n") % self.arch
+ buf = buf + _("initrd : %s\n") % istr
+ buf = buf + _("kernel : %s\n") % kstr
+ buf = buf + _("kernel options : %s\n") % self.kernel_options
+ buf = buf + _("post kernel options : %s\n") % self.kernel_options_post
+ buf = buf + _("ks metadata : %s\n") % self.ks_meta
+ buf = buf + _("owners : %s\n") % self.owners
return buf
def remote_methods(self):
return {
- 'name' : self.set_name,
- 'kernel' : self.set_kernel,
- 'initrd' : self.set_initrd,
- 'kopts' : self.set_kernel_options,
- 'arch' : self.set_arch,
- 'ksmeta' : self.set_ksmeta,
- 'breed' : self.set_breed,
- 'owners' : self.set_owners
+ 'name' : self.set_name,
+ 'kernel' : self.set_kernel,
+ 'initrd' : self.set_initrd,
+ 'kopts' : self.set_kernel_options,
+ 'kopts_post' : self.set_kernel_options_post,
+ 'arch' : self.set_arch,
+ 'ksmeta' : self.set_ksmeta,
+ 'breed' : self.set_breed,
+ 'owners' : self.set_owners
}
diff --git a/cobbler/item_profile.py b/cobbler/item_profile.py
index 90c16e4c..3b7397e6 100644
--- a/cobbler/item_profile.py
+++ b/cobbler/item_profile.py
@@ -41,40 +41,42 @@ class Profile(item.Item):
"""
Reset this object.
"""
- self.name = None
- self.owners = self.settings.default_ownership
- self.distro = (None, '<<inherit>>')[is_subobject]
- self.kickstart = (self.settings.default_kickstart , '<<inherit>>')[is_subobject]
- self.kernel_options = ({}, '<<inherit>>')[is_subobject]
- self.ks_meta = ({}, '<<inherit>>')[is_subobject]
- self.virt_cpus = (1, '<<inherit>>')[is_subobject]
- self.virt_file_size = (self.settings.default_virt_file_size, '<<inherit>>')[is_subobject]
- self.virt_ram = (self.settings.default_virt_ram, '<<inherit>>')[is_subobject]
- self.repos = ([], '<<inherit>>')[is_subobject]
- self.depth = 1
- self.virt_type = (self.settings.default_virt_type, '<<inherit>>')[is_subobject]
- self.virt_path = ("", '<<inherit>>')[is_subobject]
- self.virt_bridge = (self.settings.default_virt_bridge, '<<inherit>>')[is_subobject]
- self.dhcp_tag = ("default", '<<inherit>>')[is_subobject]
- self.parent = ''
- self.server = "<<inherit>>"
+ self.name = None
+ self.owners = self.settings.default_ownership
+ self.distro = (None, '<<inherit>>')[is_subobject]
+ self.kickstart = (self.settings.default_kickstart , '<<inherit>>')[is_subobject]
+ self.kernel_options = ({}, '<<inherit>>')[is_subobject]
+ self.kernel_options_post = ({}, '<<inherit>>')[is_subobject]
+ self.ks_meta = ({}, '<<inherit>>')[is_subobject]
+ self.virt_cpus = (1, '<<inherit>>')[is_subobject]
+ self.virt_file_size = (self.settings.default_virt_file_size, '<<inherit>>')[is_subobject]
+ self.virt_ram = (self.settings.default_virt_ram, '<<inherit>>')[is_subobject]
+ self.repos = ([], '<<inherit>>')[is_subobject]
+ self.depth = 1
+ self.virt_type = (self.settings.default_virt_type, '<<inherit>>')[is_subobject]
+ self.virt_path = ("", '<<inherit>>')[is_subobject]
+ self.virt_bridge = (self.settings.default_virt_bridge, '<<inherit>>')[is_subobject]
+ self.dhcp_tag = ("default", '<<inherit>>')[is_subobject]
+ self.parent = ''
+ self.server = "<<inherit>>"
def from_datastruct(self,seed_data):
"""
Load this object's properties based on seed_data
"""
- self.parent = self.load_item(seed_data,'parent','')
- self.name = self.load_item(seed_data,'name')
- self.owners = self.load_item(seed_data,'owners',self.settings.default_ownership)
- self.distro = self.load_item(seed_data,'distro')
- self.kickstart = self.load_item(seed_data,'kickstart')
- self.kernel_options = self.load_item(seed_data,'kernel_options')
- self.ks_meta = self.load_item(seed_data,'ks_meta')
- self.repos = self.load_item(seed_data,'repos', [])
- self.depth = self.load_item(seed_data,'depth', 1)
- self.dhcp_tag = self.load_item(seed_data,'dhcp_tag', 'default')
- self.server = self.load_item(seed_data,'server', '<<inherit>>')
+ self.parent = self.load_item(seed_data,'parent','')
+ self.name = self.load_item(seed_data,'name')
+ self.owners = self.load_item(seed_data,'owners',self.settings.default_ownership)
+ self.distro = self.load_item(seed_data,'distro')
+ self.kickstart = self.load_item(seed_data,'kickstart')
+ self.kernel_options = self.load_item(seed_data,'kernel_options')
+ self.kernel_options_post = self.load_item(seed_data,'kernel_options_post')
+ self.ks_meta = self.load_item(seed_data,'ks_meta')
+ self.repos = self.load_item(seed_data,'repos', [])
+ self.depth = self.load_item(seed_data,'depth', 1)
+ self.dhcp_tag = self.load_item(seed_data,'dhcp_tag', 'default')
+ self.server = self.load_item(seed_data,'server', '<<inherit>>')
# backwards compatibility
if type(self.repos) != list:
@@ -95,6 +97,8 @@ class Profile(item.Item):
# backwards compatibility -- convert string entries to dicts for storage
if self.kernel_options != "<<inherit>>" and type(self.kernel_options) != dict:
self.set_kernel_options(self.kernel_options)
+ if self.kernel_options_post != "<<inherit>>" and type(self.kernel_options_post) != dict:
+ self.set_kernel_options_post(self.kernel_options_post)
if self.ks_meta != "<<inherit>>" and type(self.ks_meta) != dict:
self.set_ksmeta(self.ks_meta)
if self.repos != "<<inherit>>" and type(self.ks_meta) != list:
@@ -222,23 +226,24 @@ class Profile(item.Item):
Return hash representation for the serializer
"""
return {
- 'name' : self.name,
- 'owners' : self.owners,
- 'distro' : self.distro,
- 'kickstart' : self.kickstart,
- 'kernel_options' : self.kernel_options,
- 'virt_file_size' : self.virt_file_size,
- 'virt_ram' : self.virt_ram,
- 'virt_bridge' : self.virt_bridge,
- 'virt_cpus' : self.virt_cpus,
- 'ks_meta' : self.ks_meta,
- 'repos' : self.repos,
- 'parent' : self.parent,
- 'depth' : self.depth,
- 'virt_type' : self.virt_type,
- 'virt_path' : self.virt_path,
- 'dhcp_tag' : self.dhcp_tag,
- 'server' : self.server,
+ 'name' : self.name,
+ 'owners' : self.owners,
+ 'distro' : self.distro,
+ 'kickstart' : self.kickstart,
+ 'kernel_options' : self.kernel_options,
+ 'kernel_options_post' : self.kernel_options_post,
+ 'virt_file_size' : self.virt_file_size,
+ 'virt_ram' : self.virt_ram,
+ 'virt_bridge' : self.virt_bridge,
+ 'virt_cpus' : self.virt_cpus,
+ 'ks_meta' : self.ks_meta,
+ 'repos' : self.repos,
+ 'parent' : self.parent,
+ 'depth' : self.depth,
+ 'virt_type' : self.virt_type,
+ 'virt_path' : self.virt_path,
+ 'dhcp_tag' : self.dhcp_tag,
+ 'server' : self.server,
}
@@ -246,24 +251,25 @@ class Profile(item.Item):
"""
A human readable representaton
"""
- buf = _("profile : %s\n") % self.name
+ buf = _("profile : %s\n") % self.name
if self.distro == "<<inherit>>":
- buf = buf + _("parent : %s\n") % self.parent
+ buf = buf + _("parent : %s\n") % self.parent
else:
- buf = buf + _("distro : %s\n") % self.distro
- buf = buf + _("dhcp tag : %s\n") % self.dhcp_tag
- buf = buf + _("kernel options : %s\n") % self.kernel_options
- buf = buf + _("kickstart : %s\n") % self.kickstart
- buf = buf + _("ks metadata : %s\n") % self.ks_meta
- buf = buf + _("owners : %s\n") % self.owners
- buf = buf + _("repos : %s\n") % self.repos
- buf = buf + _("server : %s\n") % self.server
- buf = buf + _("virt bridge : %s\n") % self.virt_bridge
- buf = buf + _("virt cpus : %s\n") % self.virt_cpus
- buf = buf + _("virt file size : %s\n") % self.virt_file_size
- buf = buf + _("virt path : %s\n") % self.virt_path
- buf = buf + _("virt ram : %s\n") % self.virt_ram
- buf = buf + _("virt type : %s\n") % self.virt_type
+ buf = buf + _("distro : %s\n") % self.distro
+ buf = buf + _("dhcp tag : %s\n") % self.dhcp_tag
+ buf = buf + _("kernel options : %s\n") % self.kernel_options
+ buf = buf + _("post kernel options : %s\n") % self.kernel_options_post
+ buf = buf + _("kickstart : %s\n") % self.kickstart
+ buf = buf + _("ks metadata : %s\n") % self.ks_meta
+ buf = buf + _("owners : %s\n") % self.owners
+ buf = buf + _("repos : %s\n") % self.repos
+ buf = buf + _("server : %s\n") % self.server
+ buf = buf + _("virt bridge : %s\n") % self.virt_bridge
+ buf = buf + _("virt cpus : %s\n") % self.virt_cpus
+ buf = buf + _("virt file size : %s\n") % self.virt_file_size
+ buf = buf + _("virt path : %s\n") % self.virt_path
+ buf = buf + _("virt ram : %s\n") % self.virt_ram
+ buf = buf + _("virt type : %s\n") % self.virt_type
return buf
@@ -275,6 +281,7 @@ class Profile(item.Item):
'distro' : self.set_distro,
'kickstart' : self.set_kickstart,
'kopts' : self.set_kernel_options,
+ 'kopts_post' : self.set_kernel_options_post,
'virt-file-size' : self.set_virt_file_size,
'virt-ram' : self.set_virt_ram,
'ksmeta' : self.set_ksmeta,
diff --git a/cobbler/item_system.py b/cobbler/item_system.py
index a80fdbb5..4d540b76 100644
--- a/cobbler/item_system.py
+++ b/cobbler/item_system.py
@@ -37,25 +37,26 @@ class System(item.Item):
return cloned
def clear(self,is_subobject=False):
- self.name = None
- self.owners = self.settings.default_ownership
- self.profile = None
- self.image = None
- self.kernel_options = {}
- self.ks_meta = {}
- self.interfaces = {}
- self.netboot_enabled = True
- self.depth = 2
- self.kickstart = "<<inherit>>" # use value in profile
- self.server = "<<inherit>>" # "" (or settings)
- self.virt_path = "<<inherit>>" # ""
- self.virt_type = "<<inherit>>" # ""
- self.virt_cpus = "<<inherit>>" # ""
- self.virt_file_size = "<<inherit>>" # ""
- self.virt_ram = "<<inherit>>" # ""
- self.virt_type = "<<inherit>>" # ""
- self.virt_path = "<<inherit>>" # ""
- self.virt_bridge = "<<inherit>>" # ""
+ self.name = None
+ self.owners = self.settings.default_ownership
+ self.profile = None
+ self.image = None
+ self.kernel_options = {}
+ self.kernel_options_post = {}
+ self.ks_meta = {}
+ self.interfaces = {}
+ self.netboot_enabled = True
+ self.depth = 2
+ self.kickstart = "<<inherit>>" # use value in profile
+ self.server = "<<inherit>>" # "" (or settings)
+ self.virt_path = "<<inherit>>" # ""
+ self.virt_type = "<<inherit>>" # ""
+ self.virt_cpus = "<<inherit>>" # ""
+ self.virt_file_size = "<<inherit>>" # ""
+ self.virt_ram = "<<inherit>>" # ""
+ self.virt_type = "<<inherit>>" # ""
+ self.virt_path = "<<inherit>>" # ""
+ self.virt_bridge = "<<inherit>>" # ""
def delete_interface(self,name):
"""
@@ -94,17 +95,18 @@ class System(item.Item):
# and store (in-memory) in the new format.
# (the main complexity here is the migration to NIC data structures)
- self.parent = self.load_item(seed_data, 'parent')
- self.name = self.load_item(seed_data, 'name')
- self.owners = self.load_item(seed_data, 'owners', self.settings.default_ownership)
- self.profile = self.load_item(seed_data, 'profile')
- self.image = self.load_item(seed_data, 'image')
- self.kernel_options = self.load_item(seed_data, 'kernel_options', {})
- self.ks_meta = self.load_item(seed_data, 'ks_meta', {})
- self.depth = self.load_item(seed_data, 'depth', 2)
- self.kickstart = self.load_item(seed_data, 'kickstart', '<<inherit>>')
- self.netboot_enabled = self.load_item(seed_data, 'netboot_enabled', True)
- self.server = self.load_item(seed_data, 'server', '<<inherit>>')
+ self.parent = self.load_item(seed_data, 'parent')
+ self.name = self.load_item(seed_data, 'name')
+ self.owners = self.load_item(seed_data, 'owners', self.settings.default_ownership)
+ self.profile = self.load_item(seed_data, 'profile')
+ self.image = self.load_item(seed_data, 'image')
+ self.kernel_options = self.load_item(seed_data, 'kernel_options', {})
+ self.kernel_options_post = self.load_item(seed_data, 'kernel_options_post', {})
+ self.ks_meta = self.load_item(seed_data, 'ks_meta', {})
+ self.depth = self.load_item(seed_data, 'depth', 2)
+ self.kickstart = self.load_item(seed_data, 'kickstart', '<<inherit>>')
+ self.netboot_enabled = self.load_item(seed_data, 'netboot_enabled', True)
+ self.server = self.load_item(seed_data, 'server', '<<inherit>>')
# virt specific
self.virt_path = self.load_item(seed_data, 'virt_path', '<<inherit>>')
@@ -146,6 +148,8 @@ class System(item.Item):
if self.kernel_options != "<<inherit>>" and type(self.kernel_options) != dict:
self.set_kernel_options(self.kernel_options)
+ if self.kernel_options_post != "<<inherit>>" and type(self.kernel_options_post) != dict:
+ self.set_kernel_options_post(self.kernel_options_post)
if self.ks_meta != "<<inherit>>" and type(self.ks_meta) != dict:
self.set_ksmeta(self.ks_meta)
@@ -400,44 +404,46 @@ class System(item.Item):
def to_datastruct(self):
return {
- 'name' : self.name,
- 'kernel_options' : self.kernel_options,
- 'depth' : self.depth,
- 'interfaces' : self.interfaces,
- 'ks_meta' : self.ks_meta,
- 'kickstart' : self.kickstart,
- 'netboot_enabled' : self.netboot_enabled,
- 'owners' : self.owners,
- 'parent' : self.parent,
- 'profile' : self.profile,
- 'image' : self.image,
- 'server' : self.server,
- 'virt_cpus' : self.virt_cpus,
- 'virt_bridge' : self.virt_bridge,
- 'virt_file_size' : self.virt_file_size,
- 'virt_path' : self.virt_path,
- 'virt_ram' : self.virt_ram,
- 'virt_type' : self.virt_type
+ 'name' : self.name,
+ 'kernel_options' : self.kernel_options,
+ 'kernel_options_post' : self.kernel_options_post,
+ 'depth' : self.depth,
+ 'interfaces' : self.interfaces,
+ 'ks_meta' : self.ks_meta,
+ 'kickstart' : self.kickstart,
+ 'netboot_enabled' : self.netboot_enabled,
+ 'owners' : self.owners,
+ 'parent' : self.parent,
+ 'profile' : self.profile,
+ 'image' : self.image,
+ 'server' : self.server,
+ 'virt_cpus' : self.virt_cpus,
+ 'virt_bridge' : self.virt_bridge,
+ 'virt_file_size' : self.virt_file_size,
+ 'virt_path' : self.virt_path,
+ 'virt_ram' : self.virt_ram,
+ 'virt_type' : self.virt_type
}
def printable(self):
- buf = _("system : %s\n") % self.name
- buf = buf + _("profile : %s\n") % self.profile
- buf = buf + _("image : %s\n") % self.image
- buf = buf + _("kernel options : %s\n") % self.kernel_options
- buf = buf + _("kickstart : %s\n") % self.kickstart
- buf = buf + _("ks metadata : %s\n") % self.ks_meta
-
- buf = buf + _("netboot enabled? : %s\n") % self.netboot_enabled
- buf = buf + _("owners : %s\n") % self.owners
- buf = buf + _("server : %s\n") % self.server
+ buf = _("system : %s\n") % self.name
+ buf = buf + _("profile : %s\n") % self.profile
+ buf = buf + _("image : %s\n") % self.image
+ buf = buf + _("kernel options : %s\n") % self.kernel_options
+ buf = buf + _("kernel options post : %s\n") % self.kernel_options_post
+ buf = buf + _("kickstart : %s\n") % self.kickstart
+ buf = buf + _("ks metadata : %s\n") % self.ks_meta
+
+ buf = buf + _("netboot enabled? : %s\n") % self.netboot_enabled
+ buf = buf + _("owners : %s\n") % self.owners
+ buf = buf + _("server : %s\n") % self.server
- buf = buf + _("virt cpus : %s\n") % self.virt_cpus
- buf = buf + _("virt file size : %s\n") % self.virt_file_size
- buf = buf + _("virt path : %s\n") % self.virt_path
- buf = buf + _("virt ram : %s\n") % self.virt_ram
- buf = buf + _("virt type : %s\n") % self.virt_type
+ buf = buf + _("virt cpus : %s\n") % self.virt_cpus
+ buf = buf + _("virt file size : %s\n") % self.virt_file_size
+ buf = buf + _("virt path : %s\n") % self.virt_path
+ buf = buf + _("virt ram : %s\n") % self.virt_ram
+ buf = buf + _("virt type : %s\n") % self.virt_type
counter = 0
@@ -477,6 +483,7 @@ class System(item.Item):
'profile' : self.set_profile,
'image' : self.set_image,
'kopts' : self.set_kernel_options,
+ 'kopts_post' : self.set_kernel_options_post,
'ksmeta' : self.set_ksmeta,
'hostname' : self.set_hostname,
'kickstart' : self.set_kickstart,
diff --git a/cobbler/modules/cli_distro.py b/cobbler/modules/cli_distro.py
index f454824a..e541c6f7 100644
--- a/cobbler/modules/cli_distro.py
+++ b/cobbler/modules/cli_distro.py
@@ -51,10 +51,11 @@ class DistroFunction(commands.CobblerFunction):
if self.matches_args(args,["add"]):
p.add_option("--clobber", dest="clobber", help="allow add to overwrite existing objects", action="store_true")
if not self.matches_args(args,["dumpvars","remove","report","list"]):
- p.add_option("--initrd", dest="initrd", help="absolute path to initrd.img (REQUIRED)")
- p.add_option("--kernel", dest="kernel", help="absolute path to vmlinuz (REQUIRED)")
- p.add_option("--kopts", dest="kopts", help="ex: 'noipv6'")
- p.add_option("--ksmeta", dest="ksmeta", help="ex: 'blippy=7'")
+ p.add_option("--initrd", dest="initrd", help="absolute path to initrd.img (REQUIRED)")
+ p.add_option("--kernel", dest="kernel", help="absolute path to vmlinuz (REQUIRED)")
+ p.add_option("--kopts", dest="kopts", help="ex: 'noipv6'")
+ p.add_option("--kopts-post", dest="kopts_post", help="ex: 'clocksource=pit'")
+ p.add_option("--ksmeta", dest="ksmeta", help="ex: 'blippy=7'")
if not self.matches_args(args,["find"]):
p.add_option("--in-place", action="store_true", default=False, dest="inplace", help="edit items in kopts or ksmeta without clearing the other items")
@@ -93,6 +94,8 @@ class DistroFunction(commands.CobblerFunction):
obj.set_initrd(self.options.initrd)
if self.options.kopts:
obj.set_kernel_options(self.options.kopts,self.options.inplace)
+ if self.options.kopts_post:
+ obj.set_kernel_options_post(self.options.kopts_post,self.options.inplace)
if self.options.ksmeta:
obj.set_ksmeta(self.options.ksmeta,self.options.inplace)
if self.options.breed:
diff --git a/cobbler/modules/cli_profile.py b/cobbler/modules/cli_profile.py
index 88dfe8c4..35bae664 100644
--- a/cobbler/modules/cli_profile.py
+++ b/cobbler/modules/cli_profile.py
@@ -51,14 +51,15 @@ class ProfileFunction(commands.CobblerFunction):
if not self.matches_args(args,["dumpvars","remove","report","getks","list"]):
- p.add_option("--distro", dest="distro", help="ex: 'RHEL-5-i386' (REQUIRED)")
- p.add_option("--dhcp-tag", dest="dhcp_tag", help="for use in advanced DHCP configuration")
- p.add_option("--inherit", dest="inherit", help="inherit from this profile name, defaults to no")
+ p.add_option("--distro", dest="distro", help="ex: 'RHEL-5-i386' (REQUIRED)")
+ p.add_option("--dhcp-tag", dest="dhcp_tag", help="for use in advanced DHCP configuration")
+ p.add_option("--inherit", dest="inherit", help="inherit from this profile name, defaults to no")
p.add_option("--kickstart", dest="kickstart", help="absolute path to kickstart template (RECOMMENDED)")
- p.add_option("--ksmeta", dest="ksmeta", help="ex: 'blippy=7'")
- p.add_option("--kopts", dest="kopts", help="ex: 'noipv6'")
+ p.add_option("--ksmeta", dest="ksmeta", help="ex: 'blippy=7'")
+ p.add_option("--kopts", dest="kopts", help="ex: 'noipv6'")
+ p.add_option("--kopts-post", dest="kopts_post",help="ex: 'clocksource=pit'")
if not self.matches_args(args,["find"]):
- p.add_option("--in-place",action="store_true", dest="inplace", default=False, help="edit items in kopts or ksmeta without clearing the other items")
+ p.add_option("--in-place",action="store_true", dest="inplace", default=False, help="edit items in kopts, kopts_post or ksmeta without clearing the other items")
p.add_option("--name", dest="name", help="a name for the profile (REQUIRED)")
@@ -107,6 +108,7 @@ class ProfileFunction(commands.CobblerFunction):
if self.options.distro: obj.set_distro(self.options.distro)
if self.options.kickstart: obj.set_kickstart(self.options.kickstart)
if self.options.kopts: obj.set_kernel_options(self.options.kopts,self.options.inplace)
+ if self.options.kopts_post: obj.set_kernel_options_post(self.options.kopts_post,self.options.inplace)
if self.options.ksmeta: obj.set_ksmeta(self.options.ksmeta,self.options.inplace)
if self.options.virt_file_size: obj.set_virt_file_size(self.options.virt_file_size)
if self.options.virt_ram: obj.set_virt_ram(self.options.virt_ram)
diff --git a/cobbler/modules/cli_system.py b/cobbler/modules/cli_system.py
index b21f7975..63d42ea9 100644
--- a/cobbler/modules/cli_system.py
+++ b/cobbler/modules/cli_system.py
@@ -59,10 +59,11 @@ class SystemFunction(commands.CobblerFunction):
p.add_option("--ip", dest="ip", help="ex: 192.168.1.55, (RECOMMENDED)")
p.add_option("--kickstart", dest="kickstart", help="override profile kickstart template")
p.add_option("--kopts", dest="kopts", help="ex: 'noipv6'")
+ p.add_option("--kopts-post", dest="kopts_post", help="ex: 'clocksource=pit'")
p.add_option("--ksmeta", dest="ksmeta", help="ex: 'blippy=7'")
p.add_option("--mac", dest="mac", help="ex: 'AA:BB:CC:DD:EE:FF', (RECOMMENDED)")
if not self.matches_args(args, ["find"]):
- p.add_option("--in-place", action="store_true", default=False, dest="inplace", help="edit items in kopts or ksmeta without clearing the other items")
+ p.add_option("--in-place", action="store_true", default=False, dest="inplace", help="edit items in kopts, kopts_post or ksmeta without clearing the other items")
p.add_option("--name", dest="name", help="a name for the system (REQUIRED)")
@@ -113,6 +114,7 @@ class SystemFunction(commands.CobblerFunction):
if self.options.profile: obj.set_profile(self.options.profile)
if self.options.image: obj.set_image(self.options.image)
if self.options.kopts: obj.set_kernel_options(self.options.kopts,self.options.inplace)
+ if self.options.kopts_post: obj.set_kernel_options_post(self.options.kopts_post,self.options.inplace)
if self.options.ksmeta: obj.set_ksmeta(self.options.ksmeta,self.options.inplace)
if self.options.kickstart: obj.set_kickstart(self.options.kickstart)
if self.options.netboot_enabled: obj.set_netboot_enabled(self.options.netboot_enabled)
diff --git a/cobbler/utils.py b/cobbler/utils.py
index aafabe2f..eb2bf996 100644
--- a/cobbler/utils.py
+++ b/cobbler/utils.py
@@ -466,6 +466,11 @@ def blender(api_handle,remove_hashes, root_obj):
if len(kernel_txt) < 244:
results["kernel_options"]["kssendmac"] = None
+ # convert post kernel options to string
+ if results.has_key("kernel_options_post"):
+ results["kernel_options_post"] = hash_to_string(results["kernel_options_post"])
+
+
# make interfaces accessible without Cheetah-voodoo in the templates
# EXAMPLE: $ip == $ip0, $ip1, $ip2 and so on.
@@ -522,6 +527,8 @@ def flatten(data):
# this should not be done for everything
if data.has_key("kernel_options"):
data["kernel_options"] = hash_to_string(data["kernel_options"])
+ if data.has_key("kernel_options_post"):
+ data["kernel_options_post"] = hash_to_string(data["kernel_options_post"])
if data.has_key("yumopts"):
data["yumopts"] = hash_to_string(data["yumopts"])
if data.has_key("ks_meta"):
@@ -582,6 +589,7 @@ def __consolidate(node,results):
# of kernel options set in a distro later in a profile, etc.
hash_removals(results,"kernel_options")
+ hash_removals(results,"kernel_options_post")
hash_removals(results,"ks_meta")
def hash_removals(results,subkey):
diff --git a/kickstarts/legacy.ks b/kickstarts/legacy.ks
index b2fef8c1..818e53cd 100644
--- a/kickstarts/legacy.ks
+++ b/kickstarts/legacy.ks
@@ -46,5 +46,6 @@ SNIPPET::pre_partition_select
%post
$yum_config_stanza
+SNIPPET::post_install_kernel_options
$kickstart_done
diff --git a/kickstarts/sample.ks b/kickstarts/sample.ks
index bbb2fb8e..89c2ff1a 100644
--- a/kickstarts/sample.ks
+++ b/kickstarts/sample.ks
@@ -48,5 +48,6 @@ SNIPPET::pre_partition_select
%post
$yum_config_stanza
+SNIPPET::post_install_kernel_options
$kickstart_done
diff --git a/kickstarts/sample_end.ks b/kickstarts/sample_end.ks
index fb22f741..2e0d854d 100644
--- a/kickstarts/sample_end.ks
+++ b/kickstarts/sample_end.ks
@@ -54,5 +54,6 @@ $kickstart_start
%post
$yum_config_stanza
+SNIPPET::post_install_kernel_options
$kickstart_done
%end
diff --git a/setup.py b/setup.py
index bd3ae7a0..9d6a5a0c 100644
--- a/setup.py
+++ b/setup.py
@@ -119,6 +119,7 @@ if __name__ == "__main__":
(snippets, ['snippets/partition_select']),
(snippets, ['snippets/pre_partition_select']),
(snippets, ['snippets/main_partition_select']),
+ (snippets, ['snippets/post_install_kernel_options']),
# documentation
(manpath, ['docs/cobbler.1.gz']),
diff --git a/snippets/post_install_kernel_options b/snippets/post_install_kernel_options
new file mode 100644
index 00000000..15c8f5bf
--- /dev/null
+++ b/snippets/post_install_kernel_options
@@ -0,0 +1,4 @@
+#if $getVar('kernel_options_post','') != ''
+/sbin/grubby --update-kernel=`/sbin/grubby --default-kernel` --args="$kernel_options_post"
+#end if
+
diff --git a/webui_templates/distro_edit.tmpl b/webui_templates/distro_edit.tmpl
index be96e7a8..10ae09e3 100644
--- a/webui_templates/distro_edit.tmpl
+++ b/webui_templates/distro_edit.tmpl
@@ -146,6 +146,20 @@ function disablename(value)
<tr>
<td>
+ <label for="kopts_post">Post Kernel Options</label>
+ </td>
+ <td>
+ <input type="text" size="255" style="width: 400px;" name="kopts_post" id="kopts_post"
+ #if $distro
+ value="$distro.kernel_options_post"
+ #end if
+ />
+ <p class="context-tip">Example: clocksource=pit nosmp noapic nolapic</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
<label for="ksmeta">Kickstart Metadata</label>
</td>
<td>
diff --git a/webui_templates/profile_edit.tmpl b/webui_templates/profile_edit.tmpl
index d9d6f030..92338a0c 100644
--- a/webui_templates/profile_edit.tmpl
+++ b/webui_templates/profile_edit.tmpl
@@ -23,7 +23,7 @@ function disablename(value)
<!--
cobbler profile add -name=string -distro=string [-kickstart=url]
- [-kopts=string] [-ksmeta=string] [-virt-file-size=gigabytes]
+ [-kopts=string] [-kopts_post=string] [-ksmeta=string] [-virt-file-size=gigabytes]
[-virt-ram=megabytes] [-virt-type=string] [-virt-path=string]
-->
@@ -157,6 +157,20 @@ function disablename(value)
<tr>
<td>
+ <label for="kopts_post">Post Kernel Options</label>
+ </td>
+ <td>
+ <input type="text" size="255" style="width: 400px;" name="kopts_post" id="kopts_post"
+ #if $profile
+ value="$profile.kernel_options_post"
+ #end if
+ />
+ <p class="context-tip">Example: clocksource=pit nosmp noapic nolapic</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
<label for="ksmeta">Kickstart Metadata</label>
</td>
<td>
diff --git a/webui_templates/system_edit.tmpl b/webui_templates/system_edit.tmpl
index b9965208..72b1b81b 100644
--- a/webui_templates/system_edit.tmpl
+++ b/webui_templates/system_edit.tmpl
@@ -176,6 +176,20 @@ function page_onload() {
<tr id="id9005">
<td>
+ <label for="kopts_post">Post Kernel Options</label>
+ </td>
+ <td>
+ <input type="text" size="255" style="width: 400px;" name="kopts_post" id="kopts_post"
+ #if $system
+ value="$system.kernel_options_post"
+ #end if
+ />
+ <p class="context-tip">Example: clocksource=pit nosmp noapic nolapic</p>
+ </td>
+ </tr>
+
+ <tr id="id9006">
+ <td>
<label for="ksmeta">Kickstart Metadata</label>
</td>
<td>
@@ -188,7 +202,7 @@ function page_onload() {
</td>
</tr>
- <tr id="id9006">
+ <tr id="id9007">
<td>
<label for="netboot">Netboot Enabled</label>
</td>