Джанго и корневые процессы - PullRequest
5 голосов
/ 20 января 2011

В моем проекте Django мне нужно иметь возможность проверить, является ли хост в локальной сети up , используя пинг ICMP.Я нашел этот SO вопрос , который отвечает, как пинговать что-то в Python, и этот SO вопрос , который ссылается на ресурсы, объясняющие, как использовать файл sodoers.

Параметр *Модель 1009 * A Device хранит IP-адрес для хоста в локальной сети, и после добавления нового экземпляра Device в БД (с помощью пользовательского представления, а не администратора) я предусматриваю проверку, чтобы убедиться, чтоустройство отвечает на эхо-запрос, используя AJAX-вызов API, который предоставляет такую ​​возможность. Проблема

Однако (из строки документации библиотеки, предложенной в первом вопросе SO) «Обратите внимание, чтоСообщения ICMP могут отправляться только от процессов, выполняющихся от имени пользователя root. "

Я не хочу запускать Django от имени пользователя root, поскольку это плохая практика.Однако эта часть процесса (отправка и ICMP-пинг) должна выполняться от имени пользователя root.Если в представлении Django я хочу отправить пакет ping для проверки работоспособности хоста, то сам Django должен быть запущен от имени пользователя root, поскольку этот процесс будет вызывать ping.

Solutions

Это решения, которые я могу придумать, и мой вопрос в том, есть ли более эффективные способы выполнения только отдельных частей проекта Django с правами root , отличные от этих:

  1. Запустите Django от имени пользователя root (пожалуйста, нет!)
  2. Поместите «запрос ping» в очередь, которую другие процессы - запускаются от имени root - могут периодически проверять и выполнять.Может быть, что-то вроде сельдерей .

Разве нет более простого способа?

Я хочу что-то вроде библиотеки "Django run as root", это возможно?

Ответы [ 3 ]

7 голосов
/ 20 января 2011

Абсолютно нет, не запускайте код Django от имени root!

Я бы запустил демон от имени root (написано на Python, почему бы и нет), а затем IPC между экземпляром Django и вашим демоном. Если вы уверены, что проверили содержимое и правильно обработали его (например, использовали subprocess.call с массивом и т. Д.) И передавали только данные (а не команды для выполнения), все будет в порядке.

Вот пример клиента и сервера, использующих web.py

Сервер: http://gist.github.com/788639 Клиент: http://gist.github.com/788658

Вам нужно будет установить webpy.org, но в любом случае его стоит иметь. Если вы можете жестко подключить IP (или имя хоста) к серверу и удалить аргумент, тем лучше.

2 голосов
/ 20 января 2011

Какая у вас ОС здесь? Возможно, вы сможете написать небольшую программу, которая будет делать то, что вы хотите, с заданным параметром, и вставить это в файл sudoers, и дать вашему пользователю django разрешение на запуск его от имени root.

/ и т.д. / sudoers

1 голос
/ 20 января 2011

Я не знаю, на какой системе вы работаете, но в любом окне, с которым я сталкивался, не обязательно иметь права root для запуска программы командной строки ping (для нее установлен бит suid , так что он становится root по мере необходимости). Так что вы можете просто призвать это. Это немного больше накладных расходов, но, вероятно, незначительно по сравнению с задержкой в ​​сети.

...