diff options
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | CHANGELOG | 1 | ||||
-rwxr-xr-x | cobbler/cobbler.py | 1 | ||||
-rw-r--r-- | cobbler/collection.py | 1 | ||||
-rw-r--r-- | cobbler/item.py | 16 | ||||
-rw-r--r-- | cobbler/item_distro.py | 103 | ||||
-rw-r--r-- | cobbler/item_profile.py | 129 | ||||
-rw-r--r-- | cobbler/item_system.py | 133 | ||||
-rw-r--r-- | cobbler/modules/cli_distro.py | 11 | ||||
-rw-r--r-- | cobbler/modules/cli_profile.py | 14 | ||||
-rw-r--r-- | cobbler/modules/cli_system.py | 4 | ||||
-rw-r--r-- | cobbler/utils.py | 8 | ||||
-rw-r--r-- | kickstarts/legacy.ks | 1 | ||||
-rw-r--r-- | kickstarts/sample.ks | 1 | ||||
-rw-r--r-- | kickstarts/sample_end.ks | 1 | ||||
-rw-r--r-- | setup.py | 1 | ||||
-rw-r--r-- | snippets/post_install_kernel_options | 4 | ||||
-rw-r--r-- | webui_templates/distro_edit.tmpl | 14 | ||||
-rw-r--r-- | webui_templates/profile_edit.tmpl | 16 | ||||
-rw-r--r-- | webui_templates/system_edit.tmpl | 16 |
20 files changed, 290 insertions, 186 deletions
@@ -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> @@ -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 @@ -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> |