2015-04-09 3 views
3

Я использую DSC-модуль msutter для марионетки. При чтении через исходный код, я сталкиваюсь код, как это (в dsc_configuration_provider.rb):Где определена функция рубинов «powershell»?

def create 
    Puppet.debug "\n" + ps_script_content('set') 
    output = powershell(ps_script_content('set')) 
    Puppet.debug output 
    end 

Что файл определяет Powershell функцию или метод? Это рубин встроенный? Марионеточное здание? Унаследовано от класса? Я знаю, что он используется для отправки текста в powershell в качестве команды и сбора результатов, но мне нужно увидеть исходный код, чтобы понять, как улучшить его протоколирование ошибок для моих целей, потому что некоторые ошибки командной строки проглатываются, и никаких предупреждений нет печатается в журнале Puppet.

Эти строки в файле dsc_provider_helpers.rb могут быть актуальны:

provider.commands :powershell => 
    if File.exists?("#{ENV['SYSTEMROOT']}\\sysnative\\WindowsPowershell\\v1.0\\powershell.exe") 
     "#{ENV['SYSTEMROOT']}\\sysnative\\WindowsPowershell\\v1.0\\powershell.exe" 
    elsif File.exists?("#{ENV['SYSTEMROOT']}\\system32\\WindowsPowershell\\v1.0\\powershell.exe") 
     "#{ENV['SYSTEMROOT']}\\system32\\WindowsPowershell\\v1.0\\powershell.exe" 
    else 
     'powershell.exe' 
    end 

Конечно, это определяет, где исполняемый Powershell находится, но не дает никаких указаний, как это называется и как происходит его возвращаемое значение. Объединяются ли stdout и stderr? Я дал текстовый вывод или просто код ошибки? и т. д.

+1

'provider.commands: = PowerShell>«somepath «Я заставляю думать, что здесь есть какая-то маска' method_missing'. – Linuxios

+0

Спасибо за предложение этой линии запроса. Забыл о method_missing. –

+0

Несомненно. Многие любительские библиотеки Ruby используют такую ​​магию. – Linuxios

ответ

3

Это основная логика кукол. Когда поставщик имеет команду, как

commands :powershell => some binary

То есть зацепили как функция powershell(*args).

Вы можете увидеть его с другими поставщиками, как Chocolatey:

commands :chocolatey => chocolatey_command 

    def self.chocolatey_command 
    if Puppet::Util::Platform.windows? 
     # must determine how to get to params in ruby 
     #default_location = $chocolatey::params::install_location || ENV['ALLUSERSPROFILE'] + '\chocolatey' 
     chocopath = ENV['ChocolateyInstall'] || 
      ('C:\Chocolatey' if File.directory?('C:\Chocolatey')) || 
      ('C:\ProgramData\chocolatey' if File.directory?('C:\ProgramData\chocolatey')) || 
      "#{ENV['ALLUSERSPROFILE']}\chocolatey" 

     chocopath += '\bin\choco.exe' 
    else 
     chocopath = 'choco.exe' 
    end 

    chocopath 
    end 

Тогда в других местах можно просто вызвать chocolatey как функция с args:

chocolatey(*args) 
Смежные вопросы