Улучшение скрипта Python, который обновляет Apache DocumentRoot - PullRequest
0 голосов
/ 11 сентября 2009

Мне надоело проходить все шаги, которые нужно (для меня), чтобы изменить DocumentRoot в Apache. Я пытаюсь облегчить процесс с помощью следующего скрипта Python ...

#!/usr/bin/python

import sys, re

if len(sys.argv) == 2:
 f = open('/tmp/apachecdr', 'w')
 f.write(open('/etc/apache2/httpd.conf').read())

 f = open('/tmp/apachecdr', 'r')
 r = re.sub('DocumentRoot "(.*?)"', 
  'DocumentRoot "' + sys.argv[1] + '"', 
  f.read())
 f = open('/etc/apache2/httpd.conf', 'w')
 f.write(r)
else:
 print "Please supply the new DocumentRoot path."

Я сохранил это как / usr / bin / apachecdr, чтобы я мог просто открыть оболочку и "sudo apachecdr / new / documentroot / path" и затем перезапустить с помощью apachectl. Мой вопрос: как бы вы это написали?

Я впервые пишу о переполнении стека (и я новичок в Python), поэтому, пожалуйста, дайте мне знать, если это не достаточно конкретный вопрос.

Ответы [ 3 ]

0 голосов
/ 11 сентября 2009

В общем, программисты Python предпочитают явное, а не неявное (см. http://www.python.org/dev/peps/pep-0020/). Имея это в виду, вы можете переписать эту строку

f.write(open('/etc/apache2/httpd.conf').read())

Кому:

infile = open('/etc/apache2/httpd.conf').read()
f.write(infile)
infile.close()

Еще одно предложение - добавить проверку ошибок. Например, проверьте, существует ли файл /etc/apache2/httpd.conf.

Обычно можно использовать попытку / кроме открытой строки, но если вы хотите использовать объединенную команду чтения и записи, вы можете использовать os.stat для проверки.

Пример

import os
try:
  os.stat('/etc/apache2/httpd.conf) 
except OSError:
  print "/etc/apache2/httpd.conf does not exist"
  return #will exit the program
0 голосов
/ 12 сентября 2009

Спасибо вам обоим за ваши ответы. Нед, я надеялся, что ты скажешь что-то подобное. Причина, по которой я делал это просто потому, что я не знал лучше. Спасибо за предоставление вашего кода, это было именно то, что я искал.

Кстати, ошибка возникает из-за того, что «BACKUP» и «HTTPD_CONF» обращаются в строке 8. Другими словами, переключите «shutil.copyfile (BACKUP, HTTPD_CONF)» на «shutil.copyfile (HTTPD_CONF, BACKUP)» на строка 8 сценария Неда.

Еще раз спасибо, ребята! Это был отличный первый опыт размещения на этом сайте.

0 голосов
/ 11 сентября 2009

Вы делаете много файловой работы, но не слишком много пользы. Почему вы пишете / tmp / apachecdr, а затем сразу же читаете его снова? Если вы копируете httpd.conf в каталог tmp в качестве резервной копии, модуль shutil предоставляет функции для копирования файлов:

#!/usr/bin/python

import shutil, sys, re

HTTPD_CONF = '/etc/apache2/httpd.conf'
BACKUP = '/tmp/apachecdr'
if len(sys.argv) == 2:
 shutil.copyfile(BACKUP, HTTPD_CONF)
 conf = open(HTTPD_CONF).read()

 new_conf = re.sub('DocumentRoot "(.*?)"', 
  'DocumentRoot "' + sys.argv[1] + '"', 
  conf)
 open(HTTPD_CONF, 'w').write(new_conf)
else:
 print "Please supply the new DocumentRoot path."
...