У меня есть этот файл на моем ноутбуке /etc/dbus-1/system.d/org.freedesktop.thermald.conf
:
<?xml version="1.0"?> <!--*-nxml-*-->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<!--
This file is part of systemd.
systemd is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
-->
<busconfig>
<policy user="root">
<allow own="org.freedesktop.thermald"/>
<allow send_destination="org.freedesktop.thermald"/>
<allow receive_sender="org.freedesktop.thermald"/>
</policy>
<policy context="default">
<deny send_destination="org.freedesktop.thermald"/>
<allow receive_sender="org.freedesktop.thermald"/>
</policy>
</busconfig>
Я должен знать если:
<allow send_destination="org.freedesktop.thermald"/>
существует, но только если это не находится под root
и должен быть под default
.
Поиск файла должен только быть между:
<policy context="default">
и следующая строка, которая содержит:
</policy>
Я ищу самое изящное (и читаемый) способ сделать это без любой предвзятости к grep
, sed
, awk
или любая другая общая утилита.
Это - часть программы Python, отображающей расширяемый/разборный tkinter treeview DBus. Я захватываю ошибки разрешения на системной шине, которая не может анализироваться. Анализируйте и отклоните, уже успешно захватывают, но захватывают слишком много. Поскольку это - Python json
и xmltree
модули уже используются и встроенный Python list
и dict
функции доступны.
Установка xmllint
:
apt-get install libxml2-utils
Проверьте, существует ли Ваш путь XML в контексте default
:
xmllint --xpath "//busconfig/policy[@context='default']/allow[@send_destination='org.freedesktop.thermald']" /etc/dbus-1/system.d/org.freedesktop.thermald.conf >/dev/null 2>&1 && echo good || echo bad
Проверьте наоборот, если Ваш путь является несуществующим в другом контексте:
! xmllint --xpath "//busconfig/policy[@user='root']/allow[@send_destination='org.freedesktop.thermald']" /etc/dbus-1/system.d/org.freedesktop.thermald.conf >/dev/null 2>&1 && echo good || echo bad
Используя sed
, grep
и awk
(но не все вместе):
sed -n '/<policy context="default">/,/<\/policy>/p' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<allow send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"
или
awk '/<policy context="default">/,/<\/policy>/' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<allow send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"
Примеры:
Поиск allow send_destination
:
$ sed -n '/<policy context="default">/,/<\/policy>/p' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<allow send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"
Not Found
Поиск deny send_destination
:
$ sed -n '/<policy context="default">/,/<\/policy>/p' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<deny send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"
<deny send_destination="org.freedesktop.thermald"/>
awk
работы в значительной степени то же как sed
:
$ awk '/<policy context="default">/,/<\/policy>/' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<allow send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"
Not Found
и
$ awk '/<policy context="default">/,/<\/policy>/' /etc/dbus-1/system.d/org.freedesktop.thermald.conf | grep '<deny send_destination="org.freedesktop.thermald"\/>' || echo "Not Found"
<deny send_destination="org.freedesktop.thermald"/>