The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Чтение и редактирование XML файла, !*! universite, 12-Янв-19, 13:09  [смотреть все]
Имеется конфиг файл xml-config.xml в формате XML:

<?xml version="1.0" encoding="UTF-8"?>
<zonelist>
        <domain name="domain01.com" admin="dns@domainadmin.com" ttl="1D" refresh="8H" retry="2H" expire="1W" negttl="60M">
                <record type="NS" value="ns1.domain01.com." />
                <record type="NS" value="ns2.domain01.com." />
                <record type="A" value="123.255.255.123" ttl="600" />
                <record type="A" domain="subdomain01" ttl="4H" value="123.255.255.255" />
                <record type="CNAME" domain="www" value="domain01.com." />
                <record type="MX" priority="10" value="mail1.server.com." />
                <record type="MX" priority="20" value="mail2.server.com." />
                <record type="MX" priority="30" value="mail3.server.com." />
                <record type="SPF" value="123.255.255.123,_spf.google.com" />
                <record type="TXT" value="This is a text record" />
        </domain>
        <domain name="domain02.net" admin="dns@domainadmin.com" ttl="1D" refresh="8H" retry="2H" expire="1W" negttl="60M">
                <record type="NS" value="ns1.domain02.net." />
                <record type="NS" value="ns2.domain02.net." />
                <record type="A" value="123.255.255.125" ttl="600" />
                <record type="A" domain="subdomain05" ttl="4H" value="123.255.255.255" />
                <record type="CNAME" domain="www" value="domain02.net." />
                <record type="MX" priority="10" value="mail1.server.com." />
                <record type="MX" priority="20" value="mail2.server.com." />
                <record type="MX" priority="30" value="mail3.server.com." />
                <record type="SPF" value="123.255.255.125,_spf.google.com" />
                <record type="TXT" value="This is a text record" />
        </domain>
</zonelist>

Нужно:
1) считать type="A" для домена domain02.net
2) ножно изменить IP для поддомена subdomain01.domain01.com


По пункту 1) остановился на:


echo 'cat zonelist/domain/record' | \
xmllint --shell  xml-config.xml | grep 'type="A"'

По пункту 2) кроме как sed не приходить в голову.

P.S. где бы еще про xmllint почитать примеры?
а то регэкспы вида:


echo 'cat zonelist/@*[name()="domain01.com" or name()="File"]' | \
    xmllint --shell  xml-config.xml
мне не понятны

  • Чтение и редактирование XML файла, !*! Аноним, 15:19 , 12-Янв-19 (1)
    Такие вещи надо делать на нормальных скриптовых языках.

  • Чтение и редактирование XML файла, !*! михалыч, 18:01 , 12-Янв-19 (2)
    xmllint --xpath '/zonelist/domain[@name="domain02.net"]/record[@type="A" and @ttl="600"]' xml-config.xml

    P.S. так а чем sed не устраивает?
    grep subdomain01 xml-config.xml | sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/1.1.1.1/'

    • Чтение и редактирование XML файла, !*! universite, 19:18 , 12-Янв-19 (4)
      > xmllint --xpath '/zonelist/domain[@name="domain02.net"]/record[@type="A" and @ttl="600"]'
      > xml-config.xml

      Это работает.

      > P.S. так а чем sed не устраивает?

      Хотелась бы найти утилиту-фреймворк, чтоб не только читать XML, а и без проблем писать(изменять) значения. Тот же xmlstarlet не понимает несколько значений (record):


      # xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"]' -v 0 xml-config.xml
      ...
          <record type="A" value="123.255.255.123" ttl="600">0</record>
      ...


      > grep subdomain01 xml-config.xml | sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/1.1.1.1/'


      sed -n '/<domain name="domain01.com"/,/<\/domain/p' xml-config.xml | sed '/domain="subdomain01"/s/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/1.1.1.1/'

      А вот тут нюанс, если поддомен subdomain01 будет у нескольких доменов, то получу несколько (чужих) IP.
      Поэтому, надо через xmllint  сузить область обработки до нужного домена, а потом изменять через sed...
      Еще когда поддомен будет не subdomain01, а 2.2.2.2 (общий вид 2.2.2.2.domain01.com), тогда sed сделает замену только один раз и не в том месте...

      • Чтение и редактирование XML файла, !*! universite, 19:22 , 12-Янв-19 (5) –1
      • Чтение и редактирование XML файла, !*! михалыч, 06:21 , 13-Янв-19 (6)
        > А вот тут нюанс, если поддомен subdomain01 будет у нескольких доменов, то

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

        > получу несколько (чужих) IP.

        а вот это не надо, чужое - не трожь!

        > Поэтому, надо через xmllint  сузить область обработки до нужного домена, а

        ну так в чём же дело? сужаем?
        сужаем!
        xmllint --xpath '/zonelist/domain[@name="domain01.com"]/record[@domain="subdomain01"]' xml-config.xml

        > потом изменять через sed...

        пожалуйста!

        xmllint --xpath '/zonelist/domain[@name="domain01.com"]/record[@domain="subdomain01"]' xml-config.xml | sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/1.1.1.1/'

        > Еще когда поддомен будет не subdomain01, а 2.2.2.2 (общий вид 2.2.2.2.domain01.com), тогда
        > sed сделает замену только один раз и не в том месте...

        А! Нннадо ещё сужать!
        (цепляем кавычки "")

        xmllint --xpath '/zonelist/domain[@name="domain01.com"]/record[@domain="subdomain01"]' xml-config.xml | sed 's/"\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"/"1.1.1.1"/'

        да, есть ещё xml_grep xml_merge xml_split

        ну, что ещё?

        • Чтение и редактирование XML файла, !*! universite, 12:43 , 13-Янв-19 (9)

          >> Еще когда поддомен будет не subdomain01, а 2.2.2.2 (общий вид 2.2.2.2.domain01.com), тогда
          >> sed сделает замену только один раз и не в том месте...
          > А! Нннадо ещё сужать!
          > (цепляем кавычки "")

          у поддоменов тоже кавычки


          domain="subdomain05"
          domain="2.2.2.2"

          > xmllint --xpath '/zonelist/domain[@name="domain01.com"]/record[@domain="subdomain01"]'
          > xml-config.xml | sed 's/"\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"/"1.1.1.1"/'
          > да, есть ещё xml_grep xml_merge xml_split

          Это в каких именно пакетах? :)


          > ну, что ещё?

          Т.е. полноценного фреймворка на все случаи c XML нет?

      • Чтение и редактирование XML файла, !*! михалыч, 08:17 , 13-Янв-19 (7)
        > Хотелась бы найти утилиту-фреймворк, чтоб не только читать XML, а и без
        > проблем писать(изменять) значения. Тот же xmlstarlet не понимает несколько значений (record):

        эээ, "маладой челове-е-ек!", не пытайтесь нас обмануть!

        ничего искать не надо, всё уже изобретено, прекрасно понимает и работает

        садимся на велик и поехали?
        да, едем!

        (лирическое отступление)
        подозреваю, что у ТС ОС BSD и, каюсь, у меня не было xmlstarlet (xml), пришлось установить

        короче, я сделал за тебя домашку

        hint:
        чтобы менять нужно указывать что хотм менять, программа не телепат

        так работает
        xml ed -u '/zonelist/domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123" and @ttl="600"]/@value' -v 0 xml-config.xml

        и так тоже работает
        xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"]/@value' -v 0 xml-config.xml

        а так нет
        xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"]/' -v 0 xml-config.xml

        а так и вовсе неправильно
        xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"]' -v 0 xml-config.xml

        подставляет в конце "0</record>" - то что и вовсе не требуется

        ну и с заменой в субдомене аналогично

        рабочие примеры
        xml ed -u '/zonelist/domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.255"]/@value' -v 0 xml-config.xml

        xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.255"]/@value' -v 0 xml-config.xml

        дарю
        http://xmlstar.sourceforge.net/doc/UG/ch04s03.html

        такие дела..

        • Чтение и редактирование XML файла, !*! universite, 12:50 , 13-Янв-19 (10)
          >> Хотелась бы найти утилиту-фреймворк, чтоб не только читать XML, а и без
          >> проблем писать(изменять) значения. Тот же xmlstarlet не понимает несколько значений (record):
          > эээ, "маладой челове-е-ек!", не пытайтесь нас обмануть!
          > ничего искать не надо, всё уже изобретено, прекрасно понимает и работает

          shell,sed,awk есть в системе и этого достаточно.
          Но хочется на другом уровне абстракции.

          > (лирическое отступление)
          > xmlstarlet (xml), пришлось установить

          Это я уже упоминал.


          > короче, я сделал за тебя домашку

          Не, скорее, разжевал бредовую документацию по работе с переменными.
          И это не домашка, а учеба в написании законченного решения. Хз, удасться ли вообще продать хоть одну лицензию :)

          > hint:
          > чтобы менять нужно указывать что хотм менять, программа не телепат

          это понятно.

          > так работает
          > xml ed -u '/zonelist/domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"
          > and @ttl="600"]/@value' -v 0 xml-config.xml
          > и так тоже работает
          > xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"]/@value'
          > -v 0 xml-config.xml

          Да, понял, рабочее решение.


          > рабочие примеры
          > xml ed -u '/zonelist/domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.255"]/@value'
          > -v 0 xml-config.xml
          > xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.255"]/@value'
          > -v 0 xml-config.xml

          Записал.

          > дарю
          > http://xmlstar.sourceforge.net/doc/UG/ch04s03.html

          ну, сравни для начала исходный XML.
          У меня массив загнан в аттрибут record.
          А в примерах жестко аттрибут-значение.

          • Чтение и редактирование XML файла, !*! михалыч, 16:44 , 13-Янв-19 (15)
            > Не, скорее, разжевал бредовую документацию по работе с переменными.

            да ничего я не жевал, я этого "зверя" впервые вижу

            > И это не домашка, а учеба в написании законченного решения.

            но это не точно ))

            > Хз, удасться ли вообще продать хоть одну лицензию :)

            а почему нет?
            да всё получится, дорогу осилит идущий

            > ну, сравни для начала исходный XML.
            > У меня массив загнан в аттрибут record.
            > А в примерах жестко аттрибут-значение.

            это не важно, всё равно
            можно менять / переименовывать значения атрибутов, элементов

      • Чтение и редактирование XML файла, !*! михалыч, 09:58 , 13-Янв-19 (8)
        хотел добавить и обновить своё сообщение, но упёрся в
        "Редактирование разрешено только в течении 60 минут после изначальной публикации."

        маловато будет! МАЛОВАТО!!

        ну, тогда просто сделаем ADD_NEW_POST (вместо update old post)

        вот такую штучку ещё возможно использовать
        xml sel -t -v '//domain[@name="domain02.net"]/record[@type="A" and @ttl="600"]/@value' xml-config.xml

        и конкретно получаем 123.255.255.125

        вместо такого
        xml sel -t -c '//domain[@name="domain02.net"]/record[@type="A" and @ttl="600"]' xml-config.xml
        ну и вывод соответственно <record type="A" value="123.255.255.125" ttl="600"/>

        а вдруг пригодится?!

        • Чтение и редактирование XML файла, !*! universite, 12:56 , 13-Янв-19 (11)
          > ну, тогда просто сделаем ADD_NEW_POST (вместо update old post)
          > вот такую штучку ещё возможно использовать
          > xml sel -t -v '//domain[@name="domain02.net"]/record[@type="A" and @ttl="600"]/@value'
          > xml-config.xml
          > и конкретно получаем 123.255.255.125

          Пример понятен, но мало эффективен.
          Допустим есть функция change_IP_subdomain().
          На входе знаем subdomain.$domain и новый IP.
          Нужно сначала получить ttl для subdomain.$domain

          Upd.

          # xml sel -t -v '//domain[@name="domain01.com"]/record[@type="A" and @domain="subdomain01"]/@ttl' -n xml-config.xml
          4H

          Вот теперь рабочий рецепт :)

          P.S. Хотя, надо тестить. В данном случае значение TTL не важно, но в некоторых записях record могут быть другие важные вторичные переменные...

          • Чтение и редактирование XML файла, !*! михалыч, 16:24 , 13-Янв-19 (13)
            > Вот теперь рабочий рецепт :)

            конечно рабочий и как раз таки эффективен

            можем получить то, что нас интересует

            xml sel -t -v '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.255"]/@domain' xml-config.xml
            получим subdomain01

            xml sel -t -v '//domain[@name="domain01.com"]/record[@type="A" and @domain="subdomain01"]/@value' xml-config.xml
            получим 123.255.255.255

            проверяем значения, сравниваем (если нужно) и меняем, опять таки если нужно

            > P.S. Хотя, надо тестить. В данном случае значение TTL не важно, но
            > в некоторых записях record могут быть другие важные вторичные переменные...

            я не знаю, может быть.. ))

  • Чтение и редактирование XML файла, !*! universite, 13:09 , 13-Янв-19 (12)
    Еще вопрос, как работать, если встретятся case-sensative переменные?
    Например, TTL и ttl
    Есть ли у xmllint или xmlstarlet (xml) какие-то дополнительные ключичики, типа grep -i ... ?
  • Чтение и редактирование XML файла, !*! universite, 18:12 , 13-Янв-19 (17)

    > По пункту 2) кроме как sed не приходить в голову.
    > P.S. где бы еще про xmllint почитать примеры?
    > а то регэкспы вида:

    Про регэкспы опять актуально.


        Example:
        <?xml version="1.0"?>
        <XPath xmlns:n0="http://a.example.com" xmlns:n1="http://b.example">
        (//. | //@* | //namespace::*)[ancestor-or-self::n1:elem1]
        </XPath>

  • Чтение и редактирование XML файла, !*! Pahanivo, 15:54 , 14-Янв-19 (19)
    Афтар, а не проще изначально зоны хранить в plain test, а потом парсить регекспами?
    Не понимаю подобных извратов :)



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру