не удалось установить значение augeas с пробелом


У меня проблема с augeas, когда я устанавливаю значение (augeas-0.10.0 используется с puppet-2.7.11) с пробелами, например.


...
changes => "set *[self::directive='FastCgiExternalServer']/arg '/usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization'", ...

После сохранения я получил это сообщение об ошибке:


/augeas/files/etc/apache2/mods-available/fastcgi.conf/error = "put_failed"
/augeas/files/etc/apache2/mods-available/fastcgi.conf/error/path = "/files/etc/apache2/mods-available/fastcgi.conf/IfModule/directive"
/augeas/files/etc/apache2/mods-available/fastcgi.conf/error/lens = "/usr/share/augeas/lenses/dist/httpd.aug:76.18-77.49:"
/augeas/files/etc/apache2/mods-available/fastcgi.conf/error/message = "Failed to match \n    ({ /arg/ = /([^\001-\004\t\n \"']|\\\\\"|\\\\')+|\"([^\001-\004\n\"\\]|\\\\[^\001-\004\n])\"|'([^\001-\004\n'\\]|\\\\[^\001-\004\n])'/ }({ /arg/ = /([^\001-\004\t\n \"']|\\\\\"|\\\\')+|\"([^\001-\004\n\"\\]|\\\\[^\001-\004\n])\"|'([^\001-\004\n'\\]|\\\\[^\001-\004\n])'/ })*)?\n  with tree\n    { \"arg\" = \"/usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization\" }"
Я пробовал разные способы избежать этого значения, но каждая попытка не удалась с одной и той же ошибкой. Что я делаю неправильно? Спасибо за любые полезные ответы!


person kamil.w    schedule 25.08.2013    source источник


Ответы (2)


У вас есть две проблемы:

  • ваши изменения потенциально создают узел arg без родительского узла directive, что недопустимо с линзой Httpd.lns;
  • вам нужно принудительно заключить значение в кавычки, потому что оно содержит пробелы.

Итак (используя augtool):

# Make sure the directive exists
set directive[. = 'FastCgiExternalServer'] FastCgiExternalServer
# Set the argument
set directive[. = 'FastCgiExternalServer']/arg '"/usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization"'

должно работать лучше.

person raphink    schedule 25.08.2013
comment
Да, но это значение /usr/lib/cgi-bin... будет заключено в двойные кавычки в fastcgi.conf, что является неправильным форматом, апач после перезагрузки выйдет из строя. У меня была надежда, что есть способ вставить его без кавычек без каких-либо хаков... - person kamil.w; 25.08.2013
comment
Если у вас не должно быть никаких кавычек, то каждая из частей должна быть отдельным arg узлом. Если вы считаете, что это неправильно, вы можете сообщить об ошибке в линзе Httpd.lns. - person raphink; 25.08.2013
comment
Да, я думаю, что это ошибка. Вы имеете в виду файл httpd.aug в каталоге объектива в вашем репозитории? - person kamil.w; 25.08.2013
comment
Объектив Httpd.lns описан в файле httpd.aug (который содержит модуль Httpd). Вы можете сообщить непосредственно о линзе Httpd.lns, описав свой вариант использования. - person raphink; 25.08.2013

«Аргумент» на самом деле является списком. Каждый аргумент должен быть пронумерован:

defvar conf /files/etc/apache2/sites-available/foo
clear $conf/VirtualHost
set $conf/VirtualHost/arg "172.16.0.1:80"
set $conf/VirtualHost/directive "FastCgiExternalServer"
set $conf/VirtualHost/*[self::directive='FastCgiExternalServer']/arg[0] "/usr/lib/cgi-bin/php5-fcgi"
set $conf/VirtualHost/*[self::directive='FastCgiExternalServer']/arg[1] "-socket"
set $conf/VirtualHost/*[self::directive='FastCgiExternalServer']/arg[2] "/var/run/php5-fpm.sock"
set $conf/VirtualHost/*[self::directive='FastCgiExternalServer']/arg[3] "-pass-header"
set $conf/VirtualHost/*[self::directive='FastCgiExternalServer']/arg[4] "Authorization"

Он создает следующий файл:

<VirtualHost 172.16.0.1:80>
FastCgiExternalServer -socket /var/run/php5-fpm.sock -pass-header Authorization
</VirtualHost>
person fgiraldeau    schedule 29.10.2014