Имеется конфиг файл 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 файлами.
xmllint --xpath '/zonelist/domain[@name="domain02.net"]/record[@type="A" and @ttl="600"]' xml-config.xmlP.S. так а чем sed не устраивает?
grep subdomain01 xml-config.xml | sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/1.1.1.1/'
> 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 сделает замену только один раз и не в том месте...
дел.
> А вот тут нюанс, если поддомен 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
ну, что ещё?
>> Еще когда поддомен будет не 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, а и без
> проблем писать(изменять) значения. Тот же 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.xmlxml 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, а и без
>> проблем писать(изменять) значения. Тот же 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.
> У меня массив загнан в аттрибут record.
> А в примерах жестко аттрибут-значение.это не важно, всё равно
можно менять / переименовывать значения атрибутов, элементов
хотел добавить и обновить своё сообщение, но упёрся в
"Редактирование разрешено только в течении 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"/>а вдруг пригодится?!
> ну, тогда просто сделаем 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.$domainUpd.
Вот теперь рабочий рецепт :)
P.S. Хотя, надо тестить. В данном случае значение TTL не важно, но в некоторых записях record могут быть другие важные вторичные переменные...
> Вот теперь рабочий рецепт :)конечно рабочий и как раз таки эффективен
можем получить то, что нас интересует
xml sel -t -v '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.255"]/@domain' xml-config.xml
получим subdomain01xml 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 могут быть другие важные вторичные переменные...я не знаю, может быть.. ))
Еще вопрос, как работать, если встретятся case-sensative переменные?
Например, TTL и ttl
Есть ли у xmllint или xmlstarlet (xml) какие-то дополнительные ключичики, типа grep -i ... ?
> Еще вопрос, как работать, если встретятся case-sensative переменные?
> Например, TTL и ttlда всё нормально будет, TTL и ttl отличаются ))
> Есть ли у xmllint или xmlstarlet (xml) какие-то дополнительные ключичики, типа grep
> -i ... ?да, масса, надо начать отсюда
http://xmlstar.sourceforge.net/doc/UG/index.htmlпотом в каждом разделе, вначале
http://xmlstar.sourceforge.net/doc/UG/ch04.html
http://xmlstar.sourceforge.net/doc/UG/ch04s02.html
http://xmlstar.sourceforge.net/doc/UG/ch04s03.html
http://xmlstar.sourceforge.net/doc/UG/ch04s04.htmlесть много волшебных ключиков,
увлекательное чтиво на ночьну, а как тебе такое, илон маск?
>[оверквотинг удален]
>> -i ... ?
> да, масса, надо начать отсюда
> http://xmlstar.sourceforge.net/doc/UG/index.html
> потом в каждом разделе, вначале
> http://xmlstar.sourceforge.net/doc/UG/ch04.html
> http://xmlstar.sourceforge.net/doc/UG/ch04s02.html
> http://xmlstar.sourceforge.net/doc/UG/ch04s03.html
> http://xmlstar.sourceforge.net/doc/UG/ch04s04.html
> есть много волшебных ключиков,
> увлекательное чтиво на ночьЧувак, ты реально тролль.
1) Документация имеет важный параметр помимо полноты - понятность-читабельность.
2) Приведенные ссылки не отвечают на вопрос выше.
Пока вижу такое.
-s or --sort op xpath - sort in order (used after -m) where
op is X:Y:Z,
X is A - for order="ascending"
X is D - for order="descending"
Y is N - for data-type="numeric"
Y is T - for data-type="text"
Z is U - for case-order="upper-first"
Z is L - for case-order="lower-first"P.S. Часть претензий к проекту снимается, ибо в проекте нет кодеров и висит куча багов.
> ну, а как тебе такое, илон маск?
Он поставил на кон все, ждем, когда инвесторы его выкинут из проектов.
> 1) Документация имеет важный параметр помимо полноты - понятность-читабельность.где-то в глубине текста, у автора наступает дзен.
> По пункту 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>
>[оверквотинг удален]
>> 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>
>И что за проблема, в чём вопрос?
>[оверквотинг удален]
>>> а то регэкспы вида:
>> Про регэкспы опять актуально.
>>
>> Example:
>> <?xml version="1.0"?>
>> <XPath xmlns:n0="http://a.example.com" xmlns:n1="http://b.example">
>> (//. | //@* | //namespace::*)[ancestor-or-self::n1:elem1]
>> </XPath>
>>
> И что за проблема, в чём вопрос?Например, что это за регэкспы "//." и "//namespace::*"
// - это понятно, а что дальше?
> Про регэкспы опять актуально.
>
> Example:
> <?xml version="1.0"?>
> <XPath xmlns:n0="http://a.example.com" xmlns:n1="http://b.example">
> (//. | //@* | //namespace::*)[ancestor-or-self::n1:elem1]
> </XPath>
>XPath очень мощное средство для работы с XML
но разбираться в тонкостях - я пас
(конечно, если приспичит и нужда заставит, то придётся, а пока не буду)))вот, если есть время и желание изучать ==> https://ru.wikipedia.org/wiki/XPath
и там в конце есть, похоже, то что нужно - XPath в примерах ==> http://www.zvon.org/xxl/XPathTutorial/General_rus/examples.htmlдерзай ))
Афтар, а не проще изначально зоны хранить в plain test, а потом парсить регекспами?
Не понимаю подобных извратов :)
> Афтар, а не проще изначально зоны хранить в plain test, а потом
> парсить регекспами?
> Не понимаю подобных извратов :)Не проще. Парсить пробелы, табы, переносы строк - то еще удовольствие.
> Не проще. Парсить пробелы, табы, переносы строк - то еще удовольствие.В том же перле это все делается как два пальца об асфальт с плейном. От того мне и не понятно зачем нужно все упихать в XML - ибо имхо парсит XML регексами это настоящее извращение.
>> Не проще. Парсить пробелы, табы, переносы строк - то еще удовольствие.
> В том же перле это все делается как два пальца об асфальт
> с плейном. От того мне и не понятно зачем нужно все
> упихать в XML - ибо имхо парсит XML регексами это настоящее
> извращение.А почему Perl? Есть еще хайповые Rust и Go!
> А почему Perl? Есть еще хайповые Rust и Go!Потому что он как раз по это заточен. Чуть меньше чем полностью.