variable template get_template for examples dirs python django django-views root ping

python - template - Django y procesos de raíz



import django template (3)

En mi proyecto Django, necesito poder verificar si un host en la LAN está activo usando un ping ICMP. Encontré esta pregunta SO que responde cómo hacer ping a algo en Python y esta pregunta SO que enlaza a recursos que explican cómo usar el archivo sodoers.

El ajuste

Un modelo de Device almacena una dirección IP para un host en la LAN, y luego de agregar una nueva instancia de Device a la BD (a través de una vista personalizada, no del administrador) preveo verificar si el dispositivo responde a un ping usando una llamada AJAX a una API que expone la capacidad.

El problema

Sin embargo, (a partir de la carpeta docstring de una biblioteca sugerida en la primera pregunta SO) "Tenga en cuenta que los mensajes ICMP solo pueden enviarse desde procesos que se ejecutan como root".

No quiero ejecutar Django como el usuario raíz, ya que es una mala práctica. Sin embargo, esta parte del proceso (envío y ping ICMP) debe ejecutarse como raíz. Si con una vista Django deseo enviar un paquete ping para probar la vida de un host, entonces se requiere que Django se ejecute como root ya que ese es el proceso que invocaría el ping.

Soluciones

Estas son las soluciones en las que puedo pensar, y mi pregunta es si hay alguna forma mejor de ejecutar solo partes selectas de un proyecto de Django como root , además de estas:

  1. Ejecute Django como root (¡por favor no!)
  2. Ponga una "solicitud de ping" en una cola que otros procesos, ejecutados como raíz, puedan verificar y completar periódicamente. Tal vez algo como el apio .

¿No hay una manera más simple?

Quiero algo como una biblioteca "Django run as root", ¿es esto posible?


¡Absolutamente de ninguna manera, no ejecutes el código de Django como root!

Me gustaría ejecutar un daemon como root (escrito en Python, por qué no) y luego IPC entre la instancia de Django y su daemon. Siempre que esté seguro de validar el contenido y manejarlo adecuadamente (por ejemplo, usar subprocess.call con una matriz, etc.) y solo pasar datos (no comandos para ejecutar), debería estar bien.

Aquí hay un ejemplo de cliente y servidor, usando web.py

Servidor: http://gist.github.com/788639 Cliente: http://gist.github.com/788658

Necesitarás instalar webpy.org pero vale la pena tenerlo de todos modos. Si puede cablear la IP (o nombre de host) en el servidor y eliminar el argumento, mucho mejor.


¿Cuál es tu sistema operativo aquí? Es posible que pueda escribir un pequeño programa que haga lo que le da dado un parámetro, y pegarlo en el archivo sudoers, y darle permiso a su usuario de django para ejecutarlo como root.

/ etc / sudoers


No sé en qué tipo de sistema estás, pero en cualquier casilla que he encontrado, no es necesario que sea root para ejecutar el programa de ping línea de comandos (tiene el bit de suid establecido, por lo que se convierte en root según sea necesario). Entonces podrías invocar eso. Es un poco más sobrecarga, pero probablemente insignificante en comparación con la latencia de red.