обновить /etc/sysctl.conf с помощью Python ConfigParser

Я могу использовать библиотеку Python ConfigParser для чтения /etc/sysctl.conf, добавив раздел [dummy] и переопределив метод read() ConfigParser следующим образом:

class SysctlConfigParser(ConfigParser.ConfigParser):
    def read(self, fn):
        text = open(fn).read()
        contents = StringIO.StringIO("[dummy]\n" + text)
        self.readfp(contents, fn)

Теперь сложнее всего записать обратно обновления конфигурации, сделанные моей программой на Python, потому что, если бы я сейчас вызвал ConfigParser.write() напрямую, он также добавил бы обратно этот раздел [dummy]:

[dummy]
net.netfilter.nf_conntrack_max = 313
net.netfilter.nf_conntrack_expect_max = 640
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 5

Вот мои вопросы:

  1. Есть ли элегантный способ заставить ConfigParser не добавлять этот [фиктивный] раздел? Кажется странным, если бы мне пришлось снова открыть этот файл, чтобы удалить первую строку, содержащую этот фиктивный раздел.
  2. Может быть, ConfigParser - неподходящий инструмент для редактирования sysctl.conf? Если да, то есть ли другие библиотеки Python, которые позволили бы обновлять sysctl.conf удобным способом из Python?

person user389238    schedule 26.07.2015    source источник


Ответы (1)


ConfigParser предназначен для анализа файлов конфигурации в стиле INI. /etc/sysconf.conf - это не такой файл.

Вы можете использовать привязки Augeas для Python, если вам нужен синтаксический анализатор, который работает "из коробки":

import augeas

aug = augeas.Augeas()
aug.set('/files/etc/sysctl.conf/net.ipv4.ip_forwarding', '1')
aug.set('/files/etc/sysctl.conf/fs.inotify.max_user_watches', '8192')
aug.save()

Формат файла довольно тривиален (просто набор из <name> = <value> строк с необязательными комментариями).

person larsks    schedule 26.07.2015