diff --git a/.gitignore b/.gitignore
index a8f17109..e5980009 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,4 @@ tmp.*
/.yardoc
/coverage
test/data/scr_root/var/lib/YaST2/file_checksums.ycp
+test/data/scr_root/etc/sysconfig/
diff --git a/src/lib/cfa/ntp_conf.rb b/src/lib/cfa/ntp_conf.rb
index 2a09a9de..53c11900 100755
--- a/src/lib/cfa/ntp_conf.rb
+++ b/src/lib/cfa/ntp_conf.rb
@@ -1,3 +1,4 @@
+require "yast/logger"
require "cfa/base_model"
require "cfa/augeas_parser"
require "cfa/matcher"
@@ -209,7 +210,9 @@ def reset_cache
def record_entries
return @record_entries if @record_entries
matcher = Matcher.new do |k, _v|
- RECORD_ENTRIES.include?(k.gsub("[]", ""))
+ # we want to get all content except comments, as now we can process
+ # even not yet known options with MiscRecord
+ k !~ /#comment/
end
@record_entries = @augeas_tree.select(matcher).map do |e|
Record.new_from_augeas(e)
@@ -228,6 +231,7 @@ def record_entries
# for its options in the AugeasElement. For each one,
# a Record subclass is created.
class Record
+ include ::Yast::Logger
# Creates the corresponding subclass object according
# to its AugeasElement key.
# @param [String] key
@@ -239,8 +243,22 @@ def self.new_from_augeas(augeas_entry)
# @param [string] key
def self.record_class(key)
entry_type = key.gsub("[]", "")
- record_class = "::CFA::NtpConf::#{entry_type.capitalize}Record"
- Kernel.const_get(record_class)
+ record_class = "#{entry_type.capitalize}Record"
+ if CFA::NtpConf.constants.include?(record_class.to_sym)
+ CFA::NtpConf.const_get(record_class.to_sym)
+ else
+ # it is not a predefined record type, so use a generic misc record
+ res = Class.new(MiscRecord)
+ # and specify there its augeas type
+ res.send(:define_method, :augeas_type) { entry_type + "[]" }
+ res
+ end
+ end
+
+ # default implementation just return constant AUGEAS_KEY, but can be
+ # redefined
+ def augeas_type
+ self.class.const_get("AUGEAS_KEY")
end
def initialize(augeas = nil)
@@ -320,7 +338,7 @@ def raw_options=(raw_options)
protected
def create_augeas
- { key: self.class.const_get("AUGEAS_KEY"), value: nil }
+ { key: augeas_type, value: nil }
end
def tree_value?
@@ -361,6 +379,16 @@ def options_matcher
end
end
+ # class to represent generic non-specific key
+ class MiscRecord < Record
+ def options
+ []
+ end
+
+ def options=(_value)
+ end
+ end
+
# class to represent a ntp command record entry. There is a
# subclass for server, peer, broadcast and broacastclient.
class CommandRecord < Record
diff --git a/test/fixtures/autoyast/autoinst.xml b/test/fixtures/autoyast/autoinst.xml
index 3c7c1901..e0246fa5 100644
--- a/test/fixtures/autoyast/autoinst.xml
+++ b/test/fixtures/autoyast/autoinst.xml
@@ -29,6 +29,12 @@
iburst
server
+
+ panic 0
+
+
+ tinker
+
diff --git a/test/ntp_client_test.rb b/test/ntp_client_test.rb
index 958f813f..fb5fed2c 100644
--- a/test/ntp_client_test.rb
+++ b/test/ntp_client_test.rb
@@ -1,5 +1,6 @@
require_relative "test_helper"
+require "yast2/target_file"
require "fileutils"
require "cfa/memory_file"
require "cfa/ntp_conf"
@@ -61,7 +62,7 @@
end
it "reads the list of peers" do
- expect(subject.ntp_records.size).to eq 4
+ expect(subject.ntp_records.size).to eq 5
end
it "reads the list of restricts" do
@@ -89,6 +90,12 @@
it "reads sync intervall" do
expect(subject.sync_interval).to eq 15
end
+
+ it "following write succeed" do
+ puts subject.ntp_records.inspect
+ expect(Yast::Report).to_not receive(:Error)
+ expect(subject.Write).to eq true
+ end
end
context "with an empty AutoYaST configuration" do
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 81c96afc..0fe30708 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -4,6 +4,8 @@
require "yast/rspec"
require "yaml"
+ENV["LC_ALL"] = "en_US.utf-8"
+
RSpec.configure do |config|
config.mock_with :rspec do |mocks|
# If you misremember a method name both in code and in tests,