From 4c4ff0ed5fe7c07729bf17043746bd02efe0815e Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Wed, 30 Oct 2013 16:05:49 +0100 Subject: [PATCH 01/12] Reimplemented functionality for handling Kernel modules loaded on boot - /etc/sysconfig/kernel:MODULES_LOADED_ON_BOOT has been moved to /etc/modules-load.d/*.conf files - See also bnc#838185 --- library/system/Makefile.am | 2 +- library/system/src/modules/Kernel.rb | 155 +++++++++++------- .../modules.d/MODULES_LOADED_ON_BOOT.conf | 10 ++ .../test/data/modules.d/user-added-1.conf | 7 + .../test/data/modules.d/user-added-2.conf | 1 + library/system/test/kernel_test.rb | 92 +++++++++++ 6 files changed, 210 insertions(+), 57 deletions(-) create mode 100644 library/system/test/data/modules.d/MODULES_LOADED_ON_BOOT.conf create mode 100644 library/system/test/data/modules.d/user-added-1.conf create mode 100644 library/system/test/data/modules.d/user-added-2.conf create mode 100755 library/system/test/kernel_test.rb diff --git a/library/system/Makefile.am b/library/system/Makefile.am index 4765550da..c4f6ba868 100644 --- a/library/system/Makefile.am +++ b/library/system/Makefile.am @@ -1,3 +1,3 @@ # Makefile.am for yast2/library/system -SUBDIRS = doc src testsuite +SUBDIRS = doc src testsuite test diff --git a/library/system/src/modules/Kernel.rb b/library/system/src/modules/Kernel.rb index 6b3a1470c..95045393a 100644 --- a/library/system/src/modules/Kernel.rb +++ b/library/system/src/modules/Kernel.rb @@ -50,6 +50,12 @@ def main textdomain "base" + @modules_scr = path(".kernel_modules_to_load") + + @modules_dir = "/etc/modules-load.d/" + + @modules_conf_file = "yast.conf" + # kernel packages and binary @kernel_probed = false @@ -80,13 +86,8 @@ def main # modules loaded on boot - # List of changes in /etc/sysconfig/kernel:MODULES_LOADED_ON_BOOT - # Needs to be stored as a list of changes due to the fact that some RPMs - # change the variable during installation - # list member is a map with keys "operation" (value "add" or "detete") and - # "name" (name of the module) - @kernel_modules_to_load = [] - + # Kernel modules configured to be loaded on boot + @modules_to_load = nil # kernel was reinstalled @@ -547,74 +548,112 @@ def ComputePackages # functions related to kernel's modules loaded on boot + def register_new_modules_agent(file_name) + full_path = File.join(@modules_dir, file_name) + + SCR::RegisterAgent( + @modules_scr, + term( + :ag_anyagent, + term( + :Description, + + term( + :File, + full_path + ), + + # Comments + "#\n", + + # Read-only? + false, + + term( + :List, + term(:String, "^\n"), + "\n" + ) + ) + ) + ) + end + + def read_modules_to_load + @modules_to_load = {@modules_conf_file => []} + + SCR::Read(path(".target.dir"), @modules_dir).each do |file_name| + unless register_new_modules_agent(file_name) + Builtins.y2error("Cannot register new SCR agent for #{file_path} file") + next + end + @modules_to_load[file_name] = SCR::Read(@modules_scr) + SCR.UnregisterAgent(@modules_scr) + end + + @modules_to_load + end + + def reset_modules_to_load + @modules_to_load = nil + end + + # Returns list of kernel modules to be loaded on boot + def modules_to_load + read_modules_to_load if @modules_to_load.nil? + + @modules_to_load + end + + # Returns whether the given kernel module is included in list of modules + # to be loaded on boot + def module_to_be_loaded?(kernel_module) + modules_to_load.map{|key, val| val}.flatten.include?(kernel_module) + end + # Add a kernel module to the list of modules to load after boot # @param string module name - # add the module name to sysconfig variable def AddModuleToLoad(name) + modules_to_load Builtins.y2milestone("Adding module to be loaded at boot: %1", name) - @kernel_modules_to_load = Builtins.add( - @kernel_modules_to_load, - { "operation" => "add", "name" => name } - ) - nil + unless module_to_be_loaded?(name) + @modules_to_load[@modules_conf_file] << name + end end # Remove a kernel module from the list of modules to load after boot # @param [String] name string the name of the module def RemoveModuleToLoad(name) - Builtins.y2milestone("Removing module to be loaded at boot: %1", name) - @kernel_modules_to_load = Builtins.add( - @kernel_modules_to_load, - { "operation" => "remove", "name" => name } - ) + modules_to_load - nil + return unless module_to_be_loaded?(name) + + Builtins.y2milestone("Removing module to be loaded at boot: %1", name) + @modules_to_load.each do |key, val| + val.delete_if { |kernel_module| kernel_module == name } + @modules_to_load[key] = val + end end # SaveModuleToLoad () - # save the sysconfig variable to the file + # save the sysconfig variable to /etc/modules-load.d/*.conf configuration files # @return [Boolean] true on success def SaveModulesToLoad - # if nothing changed, just return success - return true if Builtins.size(@kernel_modules_to_load) == 0 - - # first read current status - modules_to_load_str = Convert.to_string( - SCR.Read(path(".sysconfig.kernel.MODULES_LOADED_ON_BOOT")) - ) - modules_to_load_str = "" if modules_to_load_str == nil - modules_to_load = Builtins.splitstring(modules_to_load_str, " ") - modules_to_load = Builtins.filter(modules_to_load) { |s| s != "" } - Builtins.y2milestone( - "Read modules to be loaded at boot: %1", - modules_to_load - ) - - # apply operations on the list - Builtins.foreach(@kernel_modules_to_load) do |op_desc| - op = Ops.get(op_desc, "operation", "") - name = Ops.get(op_desc, "name", "") - if op == "remove" - modules_to_load = Builtins.filter(modules_to_load) { |m| m != name } - elsif op == "add" - if !Builtins.contains(modules_to_load, name) - modules_to_load = Builtins.add(modules_to_load, name) - end + modules_to_load + success = true + + @modules_to_load.each do |file, modules| + unless register_new_modules_agent(file) + Builtins.y2error("Cannot register new SCR agent for #{file_path} file") + success = false + next end + SCR::Write(@modules_scr, modules) + SCR.UnregisterAgent(@modules_scr) end - # and sabe the list - Builtins.y2milestone( - "Saving modules to be loaded at boot: %1", - modules_to_load - ) - modules_to_load_str = Builtins.mergestring(modules_to_load, " ") - SCR.Write( - path(".sysconfig.kernel.MODULES_LOADED_ON_BOOT"), - modules_to_load_str - ) - SCR.Write(path(".sysconfig.kernel"), nil) + success end # kernel was reinstalled stuff @@ -660,6 +699,10 @@ def InformAboutKernelChange publish :function => :SetInformAboutKernelChange, :type => "void (boolean)" publish :function => :GetInformAboutKernelChange, :type => "boolean ()" publish :function => :InformAboutKernelChange, :type => "boolean ()" + publish :variable => :modules_dir, :type => "string" + publish :variable => :modules_conf_file, :type => "string" + publish :function => :reset_modules_to_load, :type => "void ()" + publish :function => :modules_to_load, :type => "map ()" end Kernel = KernelClass.new diff --git a/library/system/test/data/modules.d/MODULES_LOADED_ON_BOOT.conf b/library/system/test/data/modules.d/MODULES_LOADED_ON_BOOT.conf new file mode 100644 index 000000000..eb21ea55a --- /dev/null +++ b/library/system/test/data/modules.d/MODULES_LOADED_ON_BOOT.conf @@ -0,0 +1,10 @@ +# +# These kernel modules will be loaded on boot +# One module per line +# + +# Some comment +module-a + +# Another comment +module-b diff --git a/library/system/test/data/modules.d/user-added-1.conf b/library/system/test/data/modules.d/user-added-1.conf new file mode 100644 index 000000000..ccdc40197 --- /dev/null +++ b/library/system/test/data/modules.d/user-added-1.conf @@ -0,0 +1,7 @@ +user-module-1 +user-module-2 + +# User comment +# on several +# lines +user-module-3 diff --git a/library/system/test/data/modules.d/user-added-2.conf b/library/system/test/data/modules.d/user-added-2.conf new file mode 100644 index 000000000..cbc65c10f --- /dev/null +++ b/library/system/test/data/modules.d/user-added-2.conf @@ -0,0 +1 @@ +user-module-4 diff --git a/library/system/test/kernel_test.rb b/library/system/test/kernel_test.rb new file mode 100755 index 000000000..00d4a3856 --- /dev/null +++ b/library/system/test/kernel_test.rb @@ -0,0 +1,92 @@ +#! /usr/bin/env rspec + +ENV["Y2DIR"] = File.expand_path("../../src", __FILE__) + +require "yast" +require "tmpdir" + +include Yast + +Yast.import "Kernel" + +DEFAULT_DATA_DIR = File.join(File.expand_path(File.dirname(__FILE__)), "data/modules.d") + +describe "Kernel" do + before (:each) do + @default_modules = { + Yast::Kernel.modules_conf_file => [], + "MODULES_LOADED_ON_BOOT.conf"=>["module-a", "module-b"], + "user-added-1.conf" => ["user-module-1", "user-module-2", "user-module-3"], + "user-added-2.conf"=>["user-module-4"], + } + Yast::Kernel.modules_dir = DEFAULT_DATA_DIR + Yast::Kernel.reset_modules_to_load + end + + describe "#modules_to_load" do + it "returns hash of modules to load" do + expect(Yast::Kernel.modules_to_load).to eq(@default_modules) + end + end + + describe "#module_to_be_loaded?" do + it "ensures that modules are listed within modules to be loaded on boot" do + ["module-a", "module-b", "user-module-1", "user-module-2", "user-module-3", "user-module-4"].each do |kernel_module| + expect(Yast::Kernel.module_to_be_loaded?(kernel_module)).to be_true + end + end + + it "checks that other modules are not listed within modules to be loaded on boot" do + ["module-c", "user-module-5"].each do |kernel_module| + expect(Yast::Kernel.module_to_be_loaded?(kernel_module)).to be_false + end + end + end + + describe "#AddModuleToLoad" do + it "adds new module to be loaded on boot" do + new_module = "new-kernel-module" + expect(Yast::Kernel.module_to_be_loaded?(new_module)).to be_false + Yast::Kernel.AddModuleToLoad new_module + expect(Yast::Kernel.module_to_be_loaded?(new_module)).to be_true + end + end + + describe "#RemoveModuleToLoad" do + it "removes module from list of modules to be loaded on boot" do + module_to_remove = "user-module-2" + expect(Yast::Kernel.module_to_be_loaded?(module_to_remove)).to be_true + Yast::Kernel.RemoveModuleToLoad module_to_remove + expect(Yast::Kernel.module_to_be_loaded?(module_to_remove)).to be_false + end + end + + describe "#SaveModulesToLoad" do + it "stores all modules to be loaded to configuration files" do + Dir.mktmpdir do |tmpdir| + FileUtils.cp_r(DEFAULT_DATA_DIR + "/.", tmpdir) + + Yast::Kernel.modules_dir = tmpdir + Yast::Kernel.reset_modules_to_load + + # Tests on the default data + ["module-a", "module-b", "user-module-1", "user-module-2", "user-module-3", "user-module-4"].each do |kernel_module| + expect(Yast::Kernel.module_to_be_loaded?(kernel_module)).to be_true + end + + # Modifying data + Yast::Kernel.AddModuleToLoad "new-kernel-module" + Yast::Kernel.RemoveModuleToLoad "user-module-2" + + expect(Yast::Kernel.SaveModulesToLoad).to be_true + + # Tests on the stored modified data + Yast::Kernel.reset_modules_to_load + ["module-a", "module-b", "user-module-1", "user-module-3", "user-module-4", "new-kernel-module"].each do |kernel_module| + expect(Yast::Kernel.module_to_be_loaded?(kernel_module)).to be_true + end + end + end + end + +end From ed172c62b4430965d69eb98850be3721a8cfc151 Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Wed, 30 Oct 2013 16:11:58 +0100 Subject: [PATCH 02/12] Other than *.conf files are ignored --- library/system/src/modules/Kernel.rb | 1 + library/system/test/data/modules.d/not_a_conf_file | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 library/system/test/data/modules.d/not_a_conf_file diff --git a/library/system/src/modules/Kernel.rb b/library/system/src/modules/Kernel.rb index 95045393a..ab807822a 100644 --- a/library/system/src/modules/Kernel.rb +++ b/library/system/src/modules/Kernel.rb @@ -583,6 +583,7 @@ def read_modules_to_load @modules_to_load = {@modules_conf_file => []} SCR::Read(path(".target.dir"), @modules_dir).each do |file_name| + next unless file_name =~ /^.+\.conf$/ unless register_new_modules_agent(file_name) Builtins.y2error("Cannot register new SCR agent for #{file_path} file") next diff --git a/library/system/test/data/modules.d/not_a_conf_file b/library/system/test/data/modules.d/not_a_conf_file new file mode 100644 index 000000000..8b6e0c83c --- /dev/null +++ b/library/system/test/data/modules.d/not_a_conf_file @@ -0,0 +1,4 @@ +Whatever is here +must not be loaded +as a kernel +module From a9ac201b3781fe095d208dffb7b44a1e47569754 Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Wed, 30 Oct 2013 16:13:09 +0100 Subject: [PATCH 03/12] Added missing Makefile --- library/system/test/Makefile.am | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 library/system/test/Makefile.am diff --git a/library/system/test/Makefile.am b/library/system/test/Makefile.am new file mode 100644 index 000000000..1f90e68c4 --- /dev/null +++ b/library/system/test/Makefile.am @@ -0,0 +1,7 @@ +TESTS = \ + kernel_test.rb + +TEST_EXTENSIONS = .rb +RB_LOG_COMPILER = rspec +VERBOSE = 1 +EXTRA_DIST = $(TESTS) From 0cde835598644f2f67b1824d91e463f126094a1b Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Thu, 31 Oct 2013 10:45:46 +0100 Subject: [PATCH 04/12] CONSTANT-ized to cleanup the API - some variables were accessible via API just for testing but constants can be also stubbed --- library/system/src/modules/Kernel.rb | 44 +++++++++++++++------------- library/system/test/kernel_test.rb | 6 ++-- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/library/system/src/modules/Kernel.rb b/library/system/src/modules/Kernel.rb index ab807822a..caa770abf 100644 --- a/library/system/src/modules/Kernel.rb +++ b/library/system/src/modules/Kernel.rb @@ -38,6 +38,16 @@ module Yast class KernelClass < Module + + # default configuration file for Kernel modules loaded on boot + MODULES_CONF_FILE = "yast.conf" + + # directory where configuration for Kernel modules loaded on boot is stored + MODULES_DIR = "/etc/modules-load.d/" + + # SCR path for reading/writing Kernel modules + MODULES_SCR = path(".kernel_modules_to_load") + def main Yast.import "Pkg" @@ -50,12 +60,6 @@ def main textdomain "base" - @modules_scr = path(".kernel_modules_to_load") - - @modules_dir = "/etc/modules-load.d/" - - @modules_conf_file = "yast.conf" - # kernel packages and binary @kernel_probed = false @@ -549,10 +553,10 @@ def ComputePackages # functions related to kernel's modules loaded on boot def register_new_modules_agent(file_name) - full_path = File.join(@modules_dir, file_name) + full_path = File.join(MODULES_DIR, file_name) SCR::RegisterAgent( - @modules_scr, + MODULES_SCR, term( :ag_anyagent, term( @@ -580,16 +584,16 @@ def register_new_modules_agent(file_name) end def read_modules_to_load - @modules_to_load = {@modules_conf_file => []} + @modules_to_load = {MODULES_CONF_FILE => []} - SCR::Read(path(".target.dir"), @modules_dir).each do |file_name| + SCR::Read(path(".target.dir"), MODULES_DIR).each do |file_name| next unless file_name =~ /^.+\.conf$/ unless register_new_modules_agent(file_name) Builtins.y2error("Cannot register new SCR agent for #{file_path} file") next end - @modules_to_load[file_name] = SCR::Read(@modules_scr) - SCR.UnregisterAgent(@modules_scr) + @modules_to_load[file_name] = SCR::Read(MODULES_SCR) + SCR.UnregisterAgent(MODULES_SCR) end @modules_to_load @@ -619,7 +623,7 @@ def AddModuleToLoad(name) Builtins.y2milestone("Adding module to be loaded at boot: %1", name) unless module_to_be_loaded?(name) - @modules_to_load[@modules_conf_file] << name + @modules_to_load[MODULES_CONF_FILE] << name end end @@ -650,8 +654,8 @@ def SaveModulesToLoad success = false next end - SCR::Write(@modules_scr, modules) - SCR.UnregisterAgent(@modules_scr) + SCR::Write(MODULES_SCR, modules) + SCR.UnregisterAgent(MODULES_SCR) end success @@ -694,14 +698,14 @@ def InformAboutKernelChange publish :function => :GetFinalKernel, :type => "string ()" publish :function => :ComputePackagesForBase, :type => "list (string, boolean)" publish :function => :ComputePackages, :type => "list ()" - publish :function => :AddModuleToLoad, :type => "void (string)" - publish :function => :RemoveModuleToLoad, :type => "void (string)" - publish :function => :SaveModulesToLoad, :type => "boolean ()" publish :function => :SetInformAboutKernelChange, :type => "void (boolean)" publish :function => :GetInformAboutKernelChange, :type => "boolean ()" publish :function => :InformAboutKernelChange, :type => "boolean ()" - publish :variable => :modules_dir, :type => "string" - publish :variable => :modules_conf_file, :type => "string" + + # Handling for Kernel modules loaded on boot + publish :function => :AddModuleToLoad, :type => "void (string)" + publish :function => :RemoveModuleToLoad, :type => "void (string)" + publish :function => :SaveModulesToLoad, :type => "boolean ()" publish :function => :reset_modules_to_load, :type => "void ()" publish :function => :modules_to_load, :type => "map ()" end diff --git a/library/system/test/kernel_test.rb b/library/system/test/kernel_test.rb index 00d4a3856..96bae2118 100755 --- a/library/system/test/kernel_test.rb +++ b/library/system/test/kernel_test.rb @@ -13,13 +13,13 @@ describe "Kernel" do before (:each) do + stub_const("Yast::KernelClass::MODULES_DIR", DEFAULT_DATA_DIR) @default_modules = { - Yast::Kernel.modules_conf_file => [], + Yast::KernelClass::MODULES_CONF_FILE => [], "MODULES_LOADED_ON_BOOT.conf"=>["module-a", "module-b"], "user-added-1.conf" => ["user-module-1", "user-module-2", "user-module-3"], "user-added-2.conf"=>["user-module-4"], } - Yast::Kernel.modules_dir = DEFAULT_DATA_DIR Yast::Kernel.reset_modules_to_load end @@ -66,7 +66,7 @@ Dir.mktmpdir do |tmpdir| FileUtils.cp_r(DEFAULT_DATA_DIR + "/.", tmpdir) - Yast::Kernel.modules_dir = tmpdir + stub_const("Yast::KernelClass::MODULES_DIR", tmpdir) Yast::Kernel.reset_modules_to_load # Tests on the default data From e38ccaefc317988806444300729078644c5eceab Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Thu, 31 Oct 2013 11:09:57 +0100 Subject: [PATCH 05/12] Updated according to comments --- library/system/src/modules/Kernel.rb | 84 ++++++++++++++++------------ 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/library/system/src/modules/Kernel.rb b/library/system/src/modules/Kernel.rb index caa770abf..0e04cf048 100644 --- a/library/system/src/modules/Kernel.rb +++ b/library/system/src/modules/Kernel.rb @@ -552,46 +552,19 @@ def ComputePackages # functions related to kernel's modules loaded on boot - def register_new_modules_agent(file_name) - full_path = File.join(MODULES_DIR, file_name) - - SCR::RegisterAgent( - MODULES_SCR, - term( - :ag_anyagent, - term( - :Description, - - term( - :File, - full_path - ), - - # Comments - "#\n", - # Read-only? - false, - - term( - :List, - term(:String, "^\n"), - "\n" - ) - ) - ) - ) - end def read_modules_to_load @modules_to_load = {MODULES_CONF_FILE => []} SCR::Read(path(".target.dir"), MODULES_DIR).each do |file_name| next unless file_name =~ /^.+\.conf$/ - unless register_new_modules_agent(file_name) + + if !register_modules_agent(file_name) Builtins.y2error("Cannot register new SCR agent for #{file_path} file") next end + @modules_to_load[file_name] = SCR::Read(MODULES_SCR) SCR.UnregisterAgent(MODULES_SCR) end @@ -603,7 +576,11 @@ def reset_modules_to_load @modules_to_load = nil end - # Returns list of kernel modules to be loaded on boot + # Returns hash of kernel modules to be loaded on boot + # - key is the config file + # - value is list of modules in that particular file + # + # @return [Hash] of modules def modules_to_load read_modules_to_load if @modules_to_load.nil? @@ -612,8 +589,11 @@ def modules_to_load # Returns whether the given kernel module is included in list of modules # to be loaded on boot + # + # @param [String] kernel module + # @return [Boolean] whether the given module is in the list def module_to_be_loaded?(kernel_module) - modules_to_load.map{|key, val| val}.flatten.include?(kernel_module) + modules_to_load.values.any? {|m| m.include?(kernel_module)} end # Add a kernel module to the list of modules to load after boot @@ -632,12 +612,11 @@ def AddModuleToLoad(name) def RemoveModuleToLoad(name) modules_to_load - return unless module_to_be_loaded?(name) + return true unless module_to_be_loaded?(name) Builtins.y2milestone("Removing module to be loaded at boot: %1", name) @modules_to_load.each do |key, val| - val.delete_if { |kernel_module| kernel_module == name } - @modules_to_load[key] = val + val.delete(name) end end @@ -649,7 +628,7 @@ def SaveModulesToLoad success = true @modules_to_load.each do |file, modules| - unless register_new_modules_agent(file) + unless register_modules_agent(file) Builtins.y2error("Cannot register new SCR agent for #{file_path} file") success = false next @@ -684,6 +663,39 @@ def InformAboutKernelChange @inform_about_kernel_change end + private + + def register_modules_agent(file_name) + full_path = File.join(MODULES_DIR, file_name) + + SCR::RegisterAgent( + MODULES_SCR, + term( + :ag_anyagent, + term( + :Description, + + term( + :File, + full_path + ), + + # Comments + "#\n", + + # Read-only? + false, + + term( + :List, + term(:String, "^\n"), + "\n" + ) + ) + ) + ) + end + publish :function => :AddCmdLine, :type => "void (string, string)" publish :function => :GetVgaType, :type => "string ()" publish :function => :SetVgaType, :type => "void (string)" From bd1a6a276bf3a77d7fd480acd5e9959acc93eec9 Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Thu, 31 Oct 2013 12:27:19 +0100 Subject: [PATCH 06/12] Enhanced tests --- library/system/test/kernel_test.rb | 36 +++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/library/system/test/kernel_test.rb b/library/system/test/kernel_test.rb index 96bae2118..c6a23c2ea 100755 --- a/library/system/test/kernel_test.rb +++ b/library/system/test/kernel_test.rb @@ -30,13 +30,11 @@ end describe "#module_to_be_loaded?" do - it "ensures that modules are listed within modules to be loaded on boot" do + it "tests whether module is loaded on boot" do ["module-a", "module-b", "user-module-1", "user-module-2", "user-module-3", "user-module-4"].each do |kernel_module| expect(Yast::Kernel.module_to_be_loaded?(kernel_module)).to be_true end - end - it "checks that other modules are not listed within modules to be loaded on boot" do ["module-c", "user-module-5"].each do |kernel_module| expect(Yast::Kernel.module_to_be_loaded?(kernel_module)).to be_false end @@ -50,6 +48,13 @@ Yast::Kernel.AddModuleToLoad new_module expect(Yast::Kernel.module_to_be_loaded?(new_module)).to be_true end + + it "adds module only once" do + new_module = "new-kernel-module" + Yast::Kernel.AddModuleToLoad new_module + Yast::Kernel.AddModuleToLoad new_module + expect(Yast::Kernel.modules_to_load.values.flatten.select{|m| m == new_module}.size).to eq(1) + end end describe "#RemoveModuleToLoad" do @@ -59,6 +64,13 @@ Yast::Kernel.RemoveModuleToLoad module_to_remove expect(Yast::Kernel.module_to_be_loaded?(module_to_remove)).to be_false end + + it "does not remove module which is not in list" do + module_to_remove = "not-in-list" + expect(Yast::Kernel.module_to_be_loaded?(module_to_remove)).to be_false + Yast::Kernel.RemoveModuleToLoad module_to_remove + expect(Yast::Kernel.module_to_be_loaded?(module_to_remove)).to be_false + end end describe "#SaveModulesToLoad" do @@ -74,17 +86,29 @@ expect(Yast::Kernel.module_to_be_loaded?(kernel_module)).to be_true end + new_module = "new-kernel-module" + remove_module = "user-module-2" + # Modifying data - Yast::Kernel.AddModuleToLoad "new-kernel-module" - Yast::Kernel.RemoveModuleToLoad "user-module-2" + Yast::Kernel.AddModuleToLoad new_module + Yast::Kernel.RemoveModuleToLoad remove_module expect(Yast::Kernel.SaveModulesToLoad).to be_true # Tests on the stored modified data Yast::Kernel.reset_modules_to_load - ["module-a", "module-b", "user-module-1", "user-module-3", "user-module-4", "new-kernel-module"].each do |kernel_module| + ["module-a", "module-b", "user-module-1", "user-module-3", "user-module-4", new_module].each do |kernel_module| expect(Yast::Kernel.module_to_be_loaded?(kernel_module)).to be_true end + + expect(Yast::Kernel.module_to_be_loaded?(remove_module)).to be_false + + # Tests directly on the system + number_of_nkm = `grep --count --no-filename #{new_module} #{tmpdir}/*` + expect(number_of_nkm.split.map{|i| i.to_i}.inject(:+)).to eq(1) + + number_of_rkm = `grep --count --no-filename #{remove_module} #{tmpdir}/*` + expect(number_of_rkm.split.map{|i| i.to_i}.inject(:+)).to eq(0) end end end From bd36fb910d4fc422876ac67a069f9b0ecc29a9e4 Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Thu, 31 Oct 2013 12:54:05 +0100 Subject: [PATCH 07/12] Do not rewrite config file if configuration is not changed --- library/system/src/modules/Kernel.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/library/system/src/modules/Kernel.rb b/library/system/src/modules/Kernel.rb index 0e04cf048..622c58429 100644 --- a/library/system/src/modules/Kernel.rb +++ b/library/system/src/modules/Kernel.rb @@ -92,6 +92,7 @@ def main # Kernel modules configured to be loaded on boot @modules_to_load = nil + @modules_to_load_old = nil # kernel was reinstalled @@ -569,6 +570,7 @@ def read_modules_to_load SCR.UnregisterAgent(MODULES_SCR) end + @modules_to_load_old = deep_copy(@modules_to_load) @modules_to_load end @@ -628,11 +630,15 @@ def SaveModulesToLoad success = true @modules_to_load.each do |file, modules| - unless register_modules_agent(file) + # The content hasn't changed + next if (modules.sort == @modules_to_load_old[file].sort) + + if !register_modules_agent(file) Builtins.y2error("Cannot register new SCR agent for #{file_path} file") success = false next end + SCR::Write(MODULES_SCR, modules) SCR.UnregisterAgent(MODULES_SCR) end From 56a128f397deaf6c668d723ba1b96eb7c3d23149 Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Thu, 31 Oct 2013 13:08:26 +0100 Subject: [PATCH 08/12] API Cleanup - Another method worth making private --- library/system/src/modules/Kernel.rb | 47 ++++++++++++++++------------ 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/library/system/src/modules/Kernel.rb b/library/system/src/modules/Kernel.rb index 622c58429..ad3fb2922 100644 --- a/library/system/src/modules/Kernel.rb +++ b/library/system/src/modules/Kernel.rb @@ -555,25 +555,7 @@ def ComputePackages - def read_modules_to_load - @modules_to_load = {MODULES_CONF_FILE => []} - - SCR::Read(path(".target.dir"), MODULES_DIR).each do |file_name| - next unless file_name =~ /^.+\.conf$/ - - if !register_modules_agent(file_name) - Builtins.y2error("Cannot register new SCR agent for #{file_path} file") - next - end - - @modules_to_load[file_name] = SCR::Read(MODULES_SCR) - SCR.UnregisterAgent(MODULES_SCR) - end - - @modules_to_load_old = deep_copy(@modules_to_load) - @modules_to_load - end - + # Resets the internal cache def reset_modules_to_load @modules_to_load = nil end @@ -601,7 +583,6 @@ def module_to_be_loaded?(kernel_module) # Add a kernel module to the list of modules to load after boot # @param string module name def AddModuleToLoad(name) - modules_to_load Builtins.y2milestone("Adding module to be loaded at boot: %1", name) unless module_to_be_loaded?(name) @@ -671,6 +652,9 @@ def InformAboutKernelChange private + # Registers new SCR agent for a file given as parameter + # + # @param [String] file name in directory defined in MODULES_DIR def register_modules_agent(file_name) full_path = File.join(MODULES_DIR, file_name) @@ -702,6 +686,29 @@ def register_modules_agent(file_name) ) end + # Loads the current configuration of Kernel modules + # to be loaded on boot to the internal cache + # + # @return [Hash] with the configuration + def read_modules_to_load + @modules_to_load = {MODULES_CONF_FILE => []} + + SCR::Read(path(".target.dir"), MODULES_DIR).each do |file_name| + next unless file_name =~ /^.+\.conf$/ + + if !register_modules_agent(file_name) + Builtins.y2error("Cannot register new SCR agent for #{file_path} file") + next + end + + @modules_to_load[file_name] = SCR::Read(MODULES_SCR) + SCR.UnregisterAgent(MODULES_SCR) + end + + @modules_to_load_old = deep_copy(@modules_to_load) + @modules_to_load + end + publish :function => :AddCmdLine, :type => "void (string, string)" publish :function => :GetVgaType, :type => "string ()" publish :function => :SetVgaType, :type => "void (string)" From 2a38dde6bbc0f60e7563d0b2c897b00855b1a75c Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Thu, 31 Oct 2013 21:56:38 +0100 Subject: [PATCH 09/12] Added changes file entry + new version --- package/yast2.changes | 8 ++++++++ package/yast2.spec | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/package/yast2.changes b/package/yast2.changes index ca61e2f24..a0aed46d1 100644 --- a/package/yast2.changes +++ b/package/yast2.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Thu Oct 31 21:50:05 CET 2013 - locilka@suse.com + +- Configuration of Kernel modules loaded on boot has been moved + to /etc/modules-load.d/*.conf files. Adapted Kernel library + internal handling (bnc#838185). +- 3.1.2 + ------------------------------------------------------------------- Tue Oct 22 11:17:25 UTC 2013 - mfilka@suse.com diff --git a/package/yast2.spec b/package/yast2.spec index 45ba2600a..fb8ff9fb7 100644 --- a/package/yast2.spec +++ b/package/yast2.spec @@ -17,7 +17,7 @@ Name: yast2 -Version: 3.1.1 +Version: 3.1.2 Release: 0 BuildRoot: %{_tmppath}/%{name}-%{version}-build From 125b349630201e4e5453ac2c155f2023a6c10460 Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Thu, 31 Oct 2013 22:07:27 +0100 Subject: [PATCH 10/12] Added 'grep' into BuildRequires - Needed for Kernel test --- package/yast2.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/yast2.spec b/package/yast2.spec index fb8ff9fb7..c3d97a0f6 100644 --- a/package/yast2.spec +++ b/package/yast2.spec @@ -33,7 +33,7 @@ BuildRequires: yast2-devtools >= 3.0.6 BuildRequires: yast2-core >= 2.18.12 yast2-pkg-bindings >= 2.20.3 yast2-ycp-ui-bindings >= 2.18.4 # Needed for tests -BuildRequires: rubygem-rspec +BuildRequires: rubygem-rspec grep # for symlinking yardoc duplicates BuildRequires: fdupes From 22b0153cf751f3248c59646e739521f9153b8a19 Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Thu, 31 Oct 2013 22:30:00 +0100 Subject: [PATCH 11/12] Adapted old test for Kernel library - Testing of modules have been moved to RSpec-based test --- library/system/testsuite/tests/kernel.out | 7 ------- library/system/testsuite/tests/kernel.rb | 9 +-------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/library/system/testsuite/tests/kernel.out b/library/system/testsuite/tests/kernel.out index 2665b0a73..62d9a1689 100644 --- a/library/system/testsuite/tests/kernel.out +++ b/library/system/testsuite/tests/kernel.out @@ -1,11 +1,4 @@ Dump ---------------------------------------- -Dump Testing modules to load on boot behavior -Return nil -Return nil -Read .sysconfig.kernel.MODULES_LOADED_ON_BOOT "reiserfs xfs" -Write .sysconfig.kernel.MODULES_LOADED_ON_BOOT "xfs ext2" true -Write .sysconfig.kernel nil true -Return true Return nil Return Return ABC=213 DEF=324 diff --git a/library/system/testsuite/tests/kernel.rb b/library/system/testsuite/tests/kernel.rb index 9cc384d92..3bbccf2eb 100644 --- a/library/system/testsuite/tests/kernel.rb +++ b/library/system/testsuite/tests/kernel.rb @@ -78,14 +78,7 @@ def main # test behavior of modules loaded on boot DUMP("----------------------------------------") - DUMP("Testing modules to load on boot behavior") - TEST(lambda { Kernel.AddModuleToLoad("ext2") }, [@READ, @WRITE, @EXEC], 0) - TEST(lambda { Kernel.RemoveModuleToLoad("reiserfs") }, [ - @READ, - @WRITE, - @EXEC - ], 0) - TEST(lambda { Kernel.SaveModulesToLoad }, [@READ, @WRITE, @EXEC], 0) + TEST(lambda { Kernel.HidePasswords(nil) }, [@READ, @WRITE, @EXEC], 0) TEST(lambda { Kernel.HidePasswords("") }, [@READ, @WRITE, @EXEC], 0) From 205b3d5ce6e4b2affeb140588a7ef1e50b19aae4 Mon Sep 17 00:00:00 2001 From: Lukas Ocilka Date: Thu, 31 Oct 2013 22:35:57 +0100 Subject: [PATCH 12/12] A bit simplified test --- library/system/test/kernel_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/system/test/kernel_test.rb b/library/system/test/kernel_test.rb index c6a23c2ea..742621388 100755 --- a/library/system/test/kernel_test.rb +++ b/library/system/test/kernel_test.rb @@ -105,10 +105,10 @@ # Tests directly on the system number_of_nkm = `grep --count --no-filename #{new_module} #{tmpdir}/*` - expect(number_of_nkm.split.map{|i| i.to_i}.inject(:+)).to eq(1) + expect(number_of_nkm.split.map(&:to_i).inject(:+)).to eq(1) number_of_rkm = `grep --count --no-filename #{remove_module} #{tmpdir}/*` - expect(number_of_rkm.split.map{|i| i.to_i}.inject(:+)).to eq(0) + expect(number_of_rkm.split.map(&:to_i).inject(:+)).to eq(0) end end end