uci: Ошибка разбора (раздел другого типа перезаписывает предшествующий раздел с тем же именем) на строке 12, байт 23

Вопрос или проблема

У меня есть “ошибка парсинга” в моих конфигурационных файлах 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, то это вызовет аналогичную ошибку.

Как найти источник ошибки

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

  1. Использование команды uci export:
    Эта команда позволит вам экспортировать конфигурацию в консоль, которая будет содержать строку с ошибкой. Тем не менее, как вы уже заметили, эта команда не всегда указывает, из какого файла эта ошибка. Для фильтрации сообщений об ошибках, вы можете использовать:

    uci export 2>&1 | grep 'uci:'

    Данная команда укажет только сообщения об ошибках, но не покажет, из какого файла они происходят.

  2. Использование 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 предлагает эффективные решения для быстрого выявления источника ошибки. Как только вы найдете ошибочную строку, вы сможете легко её исправить, устранив конфликт между секциями.

Если у вас будут дополнительные вопросы или вам нужна помощь в дальнейшем устранении ошибок конфигурации, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...