Как я могу поймать значения в измененном файле конфигурации

Я поймал значение в файле конфигурации следующим образом:

file = io.open("testch", "r") -- testch is config file in same directory
file:read("*l")

file:seek("cur", 17)
version = file:read("*l")
_, _, version = string.find(version, "(%d+.%d+)'")

file:seek("cur", 19)
serialnum = file:read("*l")
_, _, serialnum = string.find(serialnum, "(%d+)'")

file:seek("cur", 15)
power = file:read("*l")
_, _, power = string.find(power, "(%d+)'")

io.close(file)

/* below code is config file in the same directory with upper one */
config test
       option version '1.0'
       option serialnum '1234567890'
       option power '30'

Однако, когда я нажимаю кнопку "Сохранить и применить" в Luci для изменения значения в файле конфигурации, измененный массив переходит к следующему.

Это моя проблема. Когда порядок массивов файла конфигурации изменяется, мое решение не может быть применено в этом случае. (Мое решение может быть применено в фиксированном случае.)

Есть ли решение, которое может применяться к каждому случаю (с изменением массива в конфигурационном файле)?

1 ответ

Мое личное предпочтение было бы использовать Lua в качестве языка конфигурации. Это очень просто сделать при использовании Lua; он позволяет вам использовать полный язык Тьюринга и пользовательские библиотеки для расширенной настройки; и полностью избегает проблем, которые у вас есть.

Просто переформатируйте ваш конфигурационный файл, чтобы он действовал как Lua, и используйте loadfile() загрузить файл конфигурации в виде чанка и выполнить, если проблем нет. Переменная s в приведенном ниже коде находится среда, в которой будет выполняться файл конфигурации Lua. Предоставление ему пустой таблицы означает, что вы ничего не передаете для использования скриптом конфигурации (без библиотеки таблиц, pairs() функция и т. д.). Вы можете передать в свою собственную таблицу окружения (ENV), но это считается невероятно небезопасным, поскольку скрипт конфигурации может перезаписать вашу среду, вызывая сбои новыми и трудно отслеживаемыми способами, или позволить злоумышленнику запустить вредоносный код. Лучше всего заново создать среду конфигурации в соответствии с потребностями сценария конфигурации. И не забудьте продезинфицировать ваши данные! Не верьте пользователю, чтобы он не был идиотом или злом.

config:

version = '1.0'
serialnum = '1234567890'
power = '30'

load.lua:

local s = {}
assert(loadfile("config", "t", s))()

print(s.version)
print(s.serialnum)
print(s.power)
Другие вопросы по тегам