Как лучше всего выполнять системные задачи из Ruby on Rails? - PullRequest
5 голосов
/ 04 ноября 2008

Я создаю небольшое веб-приложение для системного администрирования (например, Web-Min, но в RoR), и мне нужно иметь возможность доступа к системным параметрам из моего кода Ruby. Например, я хочу разрешить пользователю изменять имя хоста, часовой пояс или конфигурацию сети сервера.

Мои нынешние мысли состоят в том, чтобы иметь отдельный скрипт setuid (Perl, Ruby, ??), чтобы я мог вызывать его из своего кода RoR, и он будет выполнять действия. Это довольно громоздко и не очень элегантно. Я новичок в Ruby и хотел бы знать, есть ли лучший способ сделать это.

Спасибо!

Ответы [ 4 ]

3 голосов
/ 04 ноября 2008

Была серия RailsCasts эпизодов, которые охватывали фоновые задачи.

Возможно, наиболее подходящей для вашей проблемы является "Грабли на заднем плане" , что может быть хорошей отправной точкой? Как следует из названия, оно охватывает запуск задач rake из Ruby on Rails.

Наиболее очевидным решением для изменения системных настроек было бы наличие демона, работающего от имени пользователя root, который принимает несколько (очень ограниченных и строго очищенных) входных данных, таких как новое имя хоста или новый IP-адрес для сервера. Другие эпизоды «Скворец и рабочий» и «Пользовательский демон» также могут помочь в этом.

Более чистое решение - использовать sudo. Есть два (похожих) способа сделать это:

Разрешить sudo доступ к определенным командам (например, hostname, ifconfig) пользователю, который будет запускать задачи rake. Это может иметь большие проблемы с безопасностью. Мой любимый пример - предоставление sudo доступа к vim, который кажется безобидным, пока вы не запустите sudo vim, затем !bash, и вдруг у вас будет полный root-доступ к машине через текстовый редактор.

Другой способ (который легче сделать безопасным) - иметь задачу rake (или несколько отдельных скриптов), которая выполняет требуемые задачи (например, изменение имени хоста). Скажем, /usr/bin/myapp_systemtasks принадлежит root:root, затем разрешите sudo доступ к этому сценарию. Убедитесь, что вы очень осторожны, чтобы очистить входные данные, которые принимает сценарий (для предотвращения экранирования оболочки).

Итак, есть способы сделать это, но в конце дня вы настраиваете веб-интерфейс для конфигураций системного уровня, что очень сложно сделать безопасно ... Что бы вы ни решили сделать, убедитесь, что это хорошо проверено (вами и другими)

3 голосов
/ 04 ноября 2008

Вы можете использовать BackgrounDRb . Его целью является выгрузка задач из приложений rails, и вы можете запустить сервер под другим пользователем.

0 голосов
/ 05 ноября 2008

Я выполнил аналогичные задачи с Starling , который на самом деле является просто сервером очередей. Он очень прост в использовании, и вы можете легко запускать рабочие потоки под другим пользователем.

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

require 'starling'
starling = Starling.new('127.0.0.1:22122')
starling.set('my_queue', 12345)

Тогда ваш работник может просто снять с очереди любые задачи:

require 'starling'
loop do
  starling.get('my_queue') # this will block until something gets added to the queue
  # do stuff
end
0 голосов
/ 04 ноября 2008

Один человек предложил использовать что-то вроде result = %x[uptime] и указал на этот очень полезный пост в блоге . Я думаю, что это выполнимо, комбинируя некоторый сценарий оболочки, который вызывается с sudo и имеет соответствующие разрешения в sudoers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...