Использование XSD / DTD для разбора / построения различных текстовых файлов конфигурации - PullRequest
0 голосов
/ 17 декабря 2018

TL; DR - есть ли библиотека, которая может преобразовать любой универсальный текстовый файл конфигурации в объект Python, а также взять этот объект Python и преобразовать его в универсальный текстовый файл конфигурации, причем все используют DTD / XSD в качестве шаблоновtool?

Грубый дизайн потока:

DTD ----------+
              |
config file --+ -- DOM/SAX Parser --> Python object
              |
Scheme -------+


DTD ----------+
              |
Python object --> XSLT-like transformation --> named.conf
              |
Scheme -------+

Я представляю какую-то библиотеку XSD / DTD, которая может анализировать и создавать текстовые файлы конфигурации, используя объект Python (tuple / list / set) в качестве хранилища данных.

Наличие объекта Python позволяет писать надлежащие, но сложные инструменты аудита безопасности для различных текстовых файлов конфигурации.

Некоторые текстовые файлы конфигурации:

  • INI
  • Python configParse
  • ISC BIND named.conf
  • ISC DHCP dhcpd.conf / dhclient.conf
  • WebСервер: Apache2, NGINX, lighttpd
  • Unix: хосты, fstab, grub, resolv.conf, NSD
  • Брандмауэр: iptables, shorewall
  • Веб-прокси: squid
  • Почта MTU / MTA: Postfix/ Sendmail / Exim

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

Некоторый пример, который я приготовилXSD для named.conf:

<xs:attributeGroup name="zone" minOccurs=0 maxOccurs="unbounded">
  <xs:choice>
    <xs:attribute name="allow-notify" minOccurs="0" maxOccurs="1">
    <xs:attribute name="allow-query" minOccurs="0" maxOccurs="1">
    <xs:attribute name="allow-query-on" minOccurs="0" maxOccurs="1">
    <xs:attribute name="allow-recursion" minOccurs="0" maxOccurs="1">
    <xs:attribute name="allow-recursion-on" minOccurs="0" maxOccurs="1">
    <xs:attribute name="allow-transfer" minOccurs="0" maxOccurs="1">
    <xs:attribute name="allow-update" minOccurs="0" maxOccurs="1">
    <xs:attribute name="allow-update-forwarding" minOccurs="0" maxOccurs="1">
    <xs:attribute name="forwarders" minOccurs="0" maxOccurs="1">
    <xs:attribute name="server-addresses" minOccurs="0" maxOccurs="1">
    <xs:attribute name="server-names" minOccurs="0" maxOccurs="1">
    <xs:attribute name="update-policy" minOccurs="0" maxOccurs="1">
  </xs:choice>
</xs:attributeGroup name="zone">


<xs:attributeGroup name="clause_zone_or_view">
  <xs:complexType name="zone_or_view">
    <xs:choice>  # I thought no standalone zone is permitted if 1 or more views
      <xs:attribute name="zone" minOccurs="0" maxOccurs="unbounded">
      <xs:attribute name="view" minOccurs="0" maxOccurs="unbounded">
    </xs:choice>
  <xs:complexType name="zone_or_view">
</xs:attributeGroup name="clause_zone_or_view">


<!-- BIND named.conf -->
<xs:complexType>
  <xs:choice>
    <xs:attribute name="clause_ACL" minOccurs="0" maxOccurs="unbounded">
    <xs:attribute name="clause_options" minOccurs="1" maxOccurs="1">
    <xs:attribute name="clause_statistics_channel" minOccurs="1" maxOccurs="1">
    <xs:attribute name="clause_logging" minOccurs="1" maxOccurs="1">
    <xs:attribute name="clause_masters" minOccurs="1" maxOccurs="unbounded">
    <xs:attribute name="clause_view_or_zone" minOccurs="1" maxOccurs="1">
    <xs:attribute name="clause_key" minOccurs="0" maxOccurs="unbounded">
    <xs:attribute name="clause_controls" minOccurs="1" maxOccurs="1">
    <xs:attribute name="clause_trusted_keys" minOccurs="0" maxOccurs="unbounded">
  </xs:choice>
</xs:complexType>

Реальный вопрос в том, с чего начать Google и с каких ключевых слов?

...