Как я могу поймать значения в измененном файле конфигурации
Я поймал значение в файле конфигурации следующим образом:
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)