Вопрос или проблема
У меня есть “ошибка парсинга” в моих конфигурационных файлах uci.
Сообщение об ошибке указывает, где именно ошибка в файле. Но оно не говорит, какой файл содержит ошибку!
Как я могу найти ошибку?
Пример сообщения об ошибке
BusyBox v1.28.4 () встроенная оболочка (ash)
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| Б Е З П Р О Г Р А М М Н О Г О
-----------------------------------------------------
OpenWrt 18.06.2, r7676-cddd7b4c77
-----------------------------------------------------
root@mortar:~# opkg upgrade $(opkg list-upgradable | cut -d ' ' -f 1)
Настройка luci-lib-nixio.
Настройка luci-lib-jsonc.
Настройка luci-base.
Настройка luci-mod-admin-full.
uci: Ошибка парсинга (раздел другого типа перезаписывает предыдущий раздел с таким же именем) на строке 12, байт 23
Настройка luci-app-firewall.
Настройка luci-proto-ppp.
Настройка luci-proto-ipv6.
Настройка luci.
Настройка luci-ssl.
Настройка luci-app-upnp.
uci: Ошибка парсинга (раздел другого типа перезаписывает предыдущий раздел с таким же именем) на строке 12, байт 23
Наиболее надежный способ найти ошибку внутри файла uci
uci export
покажет любые сообщения об ошибках. Тем не менее, он также показывает всю конфигурацию, поэтому бывает трудно найти сообщения об ошибках.
uci export 2>&1 | grep 'uci:'
покажет сообщения об ошибках отдельно.
strace
может сообщить, какой файл uci
читала, когда нашла ошибку :-). Вот полная команда, которую я использовал:
# opkg install strace
# strace -e open uci export 2>&1 | grep -E 'uci:|open[(]' | grep -B1 'uci:'
open("/etc/config/network", O_RDONLY|O_LARGEFILE) = 3
uci: Ошибка парсинга (недопустимый символ в поле имени) на строке 73, байт 29
В этом примере ошибка находится в файле /etc/config/network
.
Предыдущий ответ (не надежен)
Ранее я пробовал использовать метод, показанный ниже.
Однако этот метод не может быть надежным. Проблема в том, что uci export
может выводить сообщения об ошибках до того, как покажет соответствующий конфигурационный файл.
Это связано с техническими причинами. (stderr и stdout используют разные буферы вывода, и в настоящее время не существует способа обойти это для uci
)
# cd /etc/config
# uci export 2>&1 | grep -C5 '^uci:'
option ports '5190'
option comment 'AOL, iChat, ICQ'
config default
option target 'Express'
uci: Ошибка парсинга (раздел другого типа перезаписывает предыдущий раздел с таким же именем) на строке 12, байт 23
option proto 'udp'
option pktsize '-500'
config reclassify
option target 'Priority'
# grep -r 'config reclassify' .
./qos:config reclassify
# mv qos ~
# uci export 2>&1 | grep -C5 '^uci:'
#
Ответ или решение
Разбор ошибки UCI: "Parse error (section of different type overwrites prior section with same name) at line 12, byte 23"
Отвечая на ваш вопрос о том, как найти ошибку в конфигурационных файлах UCI, возникает необходимость в понимании как происходят ошибки анализа и как с ними справляться. Ошибка, которую вы получили, гласит, что в определенном разделе конфигурации находится конфликт, вызванный двумя секциями одного и того же имени, но с различными типами.
Что означает ошибка
Ошибка "section of different type overwrites prior section with same name" означает, что в одном из ваших конфигурационных файлов UCI существует две секции с одним и тем же именем, но разного типа. Например, если у вас есть одна секция конфигурации типа config interface
и другая секция с тем же именем, но типа config device
, то это вызовет аналогичную ошибку.
Как найти источник ошибки
Для определения, в каком именно файле конфигурации происходит данная ошибка, вы можете воспользоваться следующими методами.
-
Использование команды
uci export
:
Эта команда позволит вам экспортировать конфигурацию в консоль, которая будет содержать строку с ошибкой. Тем не менее, как вы уже заметили, эта команда не всегда указывает, из какого файла эта ошибка. Для фильтрации сообщений об ошибках, вы можете использовать:uci export 2>&1 | grep 'uci:'
Данная команда укажет только сообщения об ошибках, но не покажет, из какого файла они происходят.
-
Использование
strace
:
Этот метод является более надежным. С помощьюstrace
вы сможете отследить, какой именно файл конфигурации читает команда UCI. Для этого выполните следующие команды:opkg install strace strace -e open uci export 2>&1 | grep -E 'uci:|open[()]' | grep -B1 'uci:'
Это даст вам список файлов, которые открываются во время выполнения команды
uci export
, а вывод ошибок будет предоставлен вместе с файлом, где ошибка была обнаружена. Таким образом, вы сможете быстро идентифицировать проблемный файл конфигурации.
Примеры применения
Например, если в результате выполнения команды strace
вы получили следующую строку:
open("/etc/config/network", O_RDONLY|O_LARGEFILE) = 3
uci: Parse error (section of different type overwrites prior section with same name) at line 12, byte 23
Это указывает на то, что ошибка находится в файле /etc/config/network
. Теперь вы можете открыть этот файл и проверить строки вокруг 12-ой из него, чтобы найти конфликтующие секции.
Заключение
Обработка ошибок анализа конфигураций UCI может вызвать трудности, особенно если неясно, в каком файле происходит ошибка. Использование команд uci export
и strace
предлагает эффективные решения для быстрого выявления источника ошибки. Как только вы найдете ошибочную строку, вы сможете легко её исправить, устранив конфликт между секциями.
Если у вас будут дополнительные вопросы или вам нужна помощь в дальнейшем устранении ошибок конфигурации, не стесняйтесь обращаться за помощью.