我试图创建一个inspec控件,在/boot/grub/grub.conf中搜索以kernel开头(并忽略空格)的每一行,然后检查每一行以查看它是否有&#39 ; nousb'在某个地方。如果找不到nousb,我希望它返回失败。
我的问题是,如果有一行以内核启动,我无法找到一种从grep中获取/描述多个stdouts的方法。这是我可以用.each完成的事情吗?这是我的代码:
control 'os-disable-usb-pcmcia' do
impact 0.5
title 'Disable USB and PCMCIA Devices'
desc "ensure default kernel in grub has 'nousb' option"
output = command('egrep "^[[:space:]]*kernel" /boot/grub/grub.conf')
describe output do
its('stdout') { should match /^\s*kernel[^#]*nousb\b/ } # match nousb anywhere in the 'kernel' line
end
end
编辑以澄清。
说我的conf文件中有这些行
kernel 1 nousb
kernel 2
kernel 3
kernel 4
测试将考虑它通过,因为尽管多个内核行没有nousb要求,但最初的测试符合它所寻找的内容。
答案 0 :(得分:0)
使用file
资源和Ruby的RegExp匹配(正如您已经在做的那样)。
describe file('/boot/grub/grub.conf') do
its(:content) { is_expected.to match /whatever/ }
end
编辑以显示如何使用Ruby代码而不是花哨的正则表达式执行此操作:
describe file('/boot/grub/grub.conf') do
it do
# Get all the lines in the file.
lines = subject.content.split(/\n/)
# Check for any line that _doesn't_ match the regexp.
without_nousb = lines.any? {|line| line !~ /^.*?kernel.*?nousb.*?$/ }
# Make a test assertion.
expect(without_nousb).to be false
end
end
答案 1 :(得分:0)
您必须在块中编写一些代码来解析您的grub.conf文件,并确保每条记录都有nousb
命令 。您也可以尝试Augeas lens for grub为您验证grub.conf。例如:
describe 'validate kernel parameters' do
it 'should include a "nousb" parameter on each line' do
# 1. parse your file however you like, then
# 2. store result as a Boolean.
expect(result).to be_true
end
end
或者,如果您只关心正在运行的内核的结果,您可以check the value使用类似的内容:
# 1. read the remote's /proc/cmdline however you like, then
# 2. evaluate your match.
expect(command_line_contents).to match /\bnousb\b/
答案 2 :(得分:-1)
我终于得到了这个问题。由于您要检查所有内核:
output = command('egrep "^[[:space:]]*kernel" /boot/grub/grub.conf')
ok = output.split("\n")
.group_by { |line| line[/(?<=kernel )(\S*)/] }
.map { |kernel, lines| lines.any? { |line| line =~ /nousb/ } }
.all?
describe output do
# OK must be TRUE
end
我们在这里:
{ kernel ⇒ lines }
映射为true / false,具体取决于是否显示nousb
nousb
行。上面的代码知道grub.cfg
可能包含同一内核的多行。
希望它有所帮助。