2008-11-04 4 views
5

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

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

Спасибо!

ответ

3

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

+0

Это большая информации, но я не уверен, что это решает мою проблему. Эти задачи недолговечны, и их действительно не нужно задавать. Кроме того, запуск отдельного сервера для обработки переименования хоста немного переборщит. – 2008-11-04 12:07:28

0

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

3

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

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

Наиболее очевидным решением для изменения системных настроек было бы иметь демона с правами root, который принимает несколько (очень ограниченных и строго дезинфицированных) входов, таких как новое имя хоста или новый IP-адрес для сервера Другие эпизоды "Starling and Workling" и "Custom Daemon" могут помочь с этим.

Более чистым решением было бы использовать sudo. Есть два (похожих) способа сделать это, о которых я могу думать:

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

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

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

0

Я выполнил аналогичные задачи с 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 
Смежные вопросы