0

我正在尝试创建一个检查控件,该控件在 /boot/grub/grub.conf 中以内核开头的每一行(并忽略空格)进行搜索,然后检查每一行以查看它是否在该行的某处有“nousb”。如果找不到 nousb,我希望它返回失败。

我的问题是,如果不止一行以内核开头,我无法找到一种从 grep 获取/描述多个标准输出的方法。这是我可以使用 .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 要求,但第一个匹配它正在寻找的内容。

4

3 回答 3

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

检查运行内核

或者,如果您只关心运行内核的结果,您可以使用类似于以下内容的方式检查该值:

# 1. read the remote's /proc/cmdline however you like, then
# 2. evaluate your match.
expect(command_line_contents).to match /\bnousb\b/
于 2016-09-20T19:45:43.933 回答
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
于 2016-09-20T19:15:47.170 回答
-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 }为真/假,取决于是否nousb显示
  • 检查所有内核是否都有这一nousb行。

上面的代码知道grub.cfg可能包含同一内核的许多行。希望能帮助到你。

于 2016-09-20T19:27:01.123 回答