Проверьте содержимое файла с помощью InSpec, если он существует

Я пишу тест Chef InSpec в ruby, чтобы проверить содержимое файлов на «umask 077». Проблема в том, что некоторые файлы в моем массиве, которые я проверяю, не существуют. Я пытаюсь исключить файлы nil и повторно отправить их, но, похоже, все равно пытается проверить все файлы. Есть предположения?

Вот мой код:

control 'auth-default-umask' do
  impact 0.5
  title 'Default umask'
  desc 'DISA RHEL6 STIG (V1R2)'

  %w(/etc/profile /etc/bashrc /etc/csh.login /etc/.login).each do |umask_file|
    filecheck = []
    unless umask_file == nil
      filecheck.push(umask_file)
      describe directory(filecheck) do
        its('content') { should match /umask 077/ }
      end
    end
  end
end

person Blooze    schedule 07.11.2016    source источник


Ответы (1)


Вы проверяете, является ли имя файла нулевым, чего никогда не бывает, поэтому, естественно, он запускается все это время. Вы пытаетесь исключить файл, если он не существует?

Кроме того, вы, вероятно, хотели описать каталог, а не список каталогов, поэтому обратите внимание, что я тоже изменил это.

Вот окончательный результат:

control 'auth-default-umask' do
  impact 0.5
  title 'Default umask'
  desc 'DISA RHEL6 STIG (V1R2)'

  %w(/etc/profile /etc/bashrc /etc/csh.login /etc/.login).each do |umask_file|
    filecheck = []
    if File.exists?(umask_file)  # check file existence
      filecheck.push(umask_file)
      describe directory(umask_file) do  # describe this directory
        its('content') { should match /umask 077/ }
      end
    end
  end
end

Что вы сделали правильно, так это создали массив имен файлов с помощью %w(), который просто берет каждое слово внутри него и создает массив строк (из введенных вами путей). Сами по себе они не имеют значения, но их можно использовать с классами, такими как File, чтобы они стали значимыми в контексте файловой системы.

File.exists?(filename) проверяет, существует ли файл. , Например.

Чтобы прочитать файл, вы можете использовать _5 _:

File.open(filename, 'r') do |file|
  until file.eof?
    line = file.gets
    # do something with line
  end
end
person casraf    schedule 07.11.2016
comment
Спасибо за быстрый ответ! Это работает, но я до сих пор не понимаю, почему. Изначально я хотел, чтобы эта переменная filecheck содержала все существующие файлы, а затем проверяла их, но, похоже, здесь этого не происходит. Что именно теперь делает filecheck с этим кодом? - person Blooze; 07.11.2016
comment
@Blooze Он содержит все существующие файлы. Функционально он сейчас не делает ничего полезного и может быть безопасно удален из кода. @Casraf Этот вопрос на самом деле не связан с Chef, и describe directory действительно должен быть describe file (хотя он, вероятно, все еще работает, как и с сопоставителями RSpec, file является предпочтительным использованием Serverspec для этого). - person Matt Schuchard; 07.11.2016
comment
@Blooze Я добавил ясности в ответ :) - person casraf; 08.11.2016