2008-11-04 6 views
5

Ich baue eine kleine Systemadministration Webanwendung (denke Web-Min, aber in RoR) und ich muss auf Systemparameter von meinem Ruby-Code zugreifen können. Zum Beispiel möchte ich dem Benutzer erlauben, den Hostnamen, die Zeitzone oder die Netzwerkkonfiguration des Servers zu ändern.Was ist der beste Weg, um Systemaufgaben von Ruby on Rails auszuführen?

Meine aktuellen Gedanken sind, ein separates Setuid-Skript (Perl, Ruby, ??) zu haben, so dass ich es aus meinem RoR-Code aufrufen kann und es die Aktionen ausführen wird. Das ist ziemlich umständlich und nicht sehr elegant. Ich bin ein Ruby-Neuling und würde gerne wissen, ob es einen besseren Weg gibt, um diese Art von Sache zu erreichen.

Danke!

Antwort

3

Sie können BackgrounDRb verwenden. Sein Zweck besteht darin, Aufgaben von Rails-Apps zu entfernen, und Sie können den Server unter einem anderen Benutzer ausführen.

+0

Das ist ein großen Informationen, aber ich bin nicht sicher, ob es mein Problem löst. Diese Aufgaben sind nicht langwierig und müssen nicht unbedingt im Hintergrund ausgeführt werden. Auch ein separater Server, nur um den Host umzubenennen, ist ein wenig übertrieben. –

+0

Auch wenn es übertrieben ist, ist es die einfachste Möglichkeit, Jobs innerhalb einer Rails-Anwendung einem anderen Benutzer zu spawnen. Es ist nicht der Hauptzweck des Plugins, aber es wird den Job sauber und schön machen. – changelog

0

Eine Person vorgeschlagen, etwas wie result = %x[uptime] zu verwenden und wies mich auf diese very helpful blog post. Ich denke, das ist machbar, indem man ein Wrapperscript kombiniert, das mit sudo aufgerufen wird und die entsprechenden Berechtigungen in sudoers hat.

3

Es gab eine Reihe von RailsCasts Episoden, die Hintergrundaufgaben abdeckten.

Am passendsten zu Ihrem Problem ist vielleicht "Rake in Background", was könnte ein guter Ausgangspunkt sein? Wie der Name schon sagt, deckt es auslösende Rake-Aufgaben von Ruby on Rails ab.

Die offensichtlichste Lösung für das Ändern von Systemeinstellungen wäre ein Daemon, der als root ausgeführt wird und einige (sehr begrenzte und streng bereinigte) Eingaben akzeptiert, wie einen neuen Hostnamen oder die neue IP-Adresse für den Server .. Die anderen Episoden "Starling and Workling" und "Custom Daemon" können auch dabei helfen.

Eine sauberere Lösung wäre sudo zu verwenden. Es gibt zwei (ähnliche) Möglichkeiten, dies zu tun, die ich mir vorstellen kann:

Erlaube Sudo Zugriff auf bestimmte Befehle (wie hostname, ifconfig) an den Benutzer, der die Rake-Aufgaben ausführen wird. Dies kann zu großen Sicherheitsproblemen führen. Mein Lieblingsbeispiel dafür ist sudo Zugang zu vim ermöglicht, die harmlos scheint, bis Sie sudo vim laufen, dann !bash und plötzlich haben Sie vollen Root-Zugriff auf einen Computer mit einem Texteditor ..

Die andere Art und Weise (das einfacher ist, um sicher zu gehen) - eine Rake-Aufgabe (oder ein paar separate Skripte) haben, die die erforderlichen Aufgaben ausführt (zB den Hostnamen ändern). Say, /usr/bin/myapp_systemtasks gehört zu root:root, dann erlauben sudo Zugriff auf das Skript. Stellen Sie sicher, dass Sie sehr vorsichtig sind, um die Eingabe, die das Skript akzeptiert, zu bereinigen (um Dinge wie Shell-Escaping zu verhindern).

Also, es gibt Möglichkeiten, es zu tun, aber am Ende des Tages machen Sie eine Web-Schnittstelle zu System-Level-Konfigurationen, die sehr schwierig ist, sicher zu tun .. Was auch immer Sie sich entscheiden zu tun, stellen Sie sicher es ist gut getestet (von Ihnen und anderen)

0

Ich habe ähnliche Aufgaben mit Starling gemacht, die wirklich nur ein Warteschlangenserver ist. Es ist sehr einfach zu verwenden und Sie können die Worker-Threads problemlos unter einem anderen Benutzer ausführen.

Ein Vorteil von Starling ist, dass es die Warteschlange erfasst, so dass es bei Problemen die Warteschlange neu erstellen kann.

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

Dann können Sie Ihre Arbeiter aus der Warteschlange entfernt einfach alle Aufgaben:

require 'starling' 
loop do 
    starling.get('my_queue') # this will block until something gets added to the queue 
    # do stuff 
end 
Verwandte Themen