¿Cuál es la mejor forma de realizar tareas del sistema desde Ruby on Rails?

Estoy construyendo una pequeña aplicación web de administración de sistemas (piense en Web-Min, pero en RoR) y necesito poder acceder a los parámetros del sistema desde mi código de Ruby. Por ejemplo, quiero permitir que el usuario cambie el nombre de host, la zona horaria o la configuración de red del servidor.

Mis pensamientos actuales son tener un script setuid por separado (Perl, Ruby, ??) para que pueda llamarlo desde mi código RoR y realizará las acciones. Eso es bastante engorroso y no muy elegante. Soy un novato ruby y me gustaría saber si hay una mejor manera de lograr este tipo de cosas.

¡Gracias!

0

4 Respuestas

Hubo una serie de episodios de RailsCasts que abarcaban tareas de fondo.

Lo más apropiado para su problema es quizás "Rake in Background" , que podría ser un buen punto de partida? Como su nombre indica, cubre las tareas de desencadenamiento de ruby on Rails.

La solución más obvia para cambiar las configuraciones del sistema sería tener un daemon ejecutándose como root, que acepta algunas entradas (muy limitadas y estrictamente sanitizadas), como un nuevo nombre de host o la nueva dirección IP para el servidor. La otra episodios "Starling and Workling" y " Custom Daemon " puede ayudar con esto también.

Una solución más limpia sería usar sudo . Hay dos formas (similares) de hacer esto que puedo pensar:

Permita que sudo acceda a ciertos comandos (como hostname , ifconfig ) al usuario que ejecutará las tareas de rake. Esto puede tener grandes problemas de seguridad. Mi ejemplo favorito de esto es permitir el acceso de sudo a vim, que parece inocuo, hasta que ejecute sudo vim , luego ! Bash y de repente tenga acceso de raíz completa a una máquina a través del editor de texto ...

Por otro lado (eso es más fácil de hacer de forma segura): tenga una tarea de rake (o algunas secuencias de comandos separadas) que realice las tareas necesarias (por ejemplo, cambiar el nombre de host). Digamos, /usr/bin/myapp_systemtasks propiedad de root: root , luego permitamos que sudo acceda a ese script. Asegúrese de tener mucho cuidado de desinfectar la entrada que acepta la secuencia de comandos (para evitar cosas como el escape de shell).

Entonces, hay formas de hacerlo, pero al final del día está haciendo una interfaz web para las configuraciones a nivel de sistema, lo cual es muy difícil de hacer de forma segura. Sea lo que sea que decida hacer, asegúrese de que esté bien probado ( por ti y otros)

0
agregado

Una persona sugirió usar algo como result =% x [uptime] y me indicó esto publicación de blog muy útil . Creo que esto es factible al combinar algún tipo de secuencia de comandos envoltorio que se llama con sudo y tiene los permisos apropiados en sudoers.

0
agregado

He realizado tareas similares con Starling , que en realidad es solo un servidor de cola. Es muy fácil de usar y puede ejecutar los subprocesos de trabajo con un usuario diferente fácilmente.

Una ventaja de Starling es que registra la cola, por lo que si hay problemas, puede volver a crear la cola.

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

Entonces su trabajador simplemente puede dequear cualquier tarea:

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

Puede usar BackgrounDRb . Su propósito es descargar tareas de las aplicaciones de rieles, y puede ejecutar el servidor con un usuario diferente.

0
agregado
Esta es una gran información, pero no estoy seguro de que resuelva mi problema. Estas tareas no se ejecutan por mucho tiempo y realmente no necesitan estar en segundo plano. También ejecutar un servidor por separado para manejar el cambio de nombre del host es un poco exagerado.
agregado el autor Richard Hurt, fuente
Incluso siendo excesivo, es la forma más fácil de generar trabajos para otro usuario dentro de una aplicación de rieles. No es el propósito principal del complemento, pero hará el trabajo de forma limpia y agradable.
agregado el autor changelog, fuente