--- /dev/null
+#!/usr/bin/lua
+local cbi = require "luci.cbi"
+local i18n = require "luci.i18n"
+local util = require "luci.util"
+
+if not arg[1] then
+ util.perror("Usage %s path/to/cbi/model.lua [i18nfilename]" % arg[0])
+ os.exit(1)
+end
+
+i18n.load("default", "en")
+i18n.load("admin-core", "en")
+i18n.load("wifi", "en")
+
+if arg[2] then
+ i18n.load(arg[2], "en")
+end
+
+local map = cbi.load(arg[1])[1]
+assert(map)
+
+print ("package "..map.config)
+print ("\nconfig package")
+
+if #map.title > 0 then
+ print (" option title '%s'" % util.striptags(map.title))
+end
+
+if #map.description > 0 then
+ print (" option description '%s'" % util.striptags(map.description))
+end
+
+for i, sec in pairs(map.children) do if util.instanceof(sec, cbi.TypedSection) then
+ print ("\nconfig section")
+ print (" option name '%s'" % sec.sectiontype)
+ print (" option package '%s'" % map.config)
+
+ if #sec.title > 0 then
+ print (" option title '%s'" % util.striptags(sec.title))
+ end
+
+ if #sec.description > 0 then
+ print (" option description '%s'" % util.striptags(sec.description))
+ end
+
+ if not sec.addremove then
+ print (" option unique true")
+ print (" option required true")
+ end
+
+ if not sec.anonymous then
+ print (" option named true")
+ end
+
+ if sec.dynamic then
+ print (" option dynamic true")
+ end
+
+ for j, opt in ipairs(sec.children) do
+ if opt.option:sub(1,1) ~= "_" or util.instanceof(opt, cbi.Value) then
+ print ("\nconfig variable")
+ print (" option name '%s'" % opt.option)
+ print (" option section '%s.%s'" % {map.config, sec.sectiontype})
+ if #opt.title > 0 then
+ print (" option title '%s'" % util.striptags(opt.title))
+ end
+
+ if #opt.description > 0 then
+ print (" option description '%s'" % util.striptags(opt.description))
+ end
+
+ if not opt.rmempty and not opt.optional then
+ print (" option required true")
+ end
+
+ if util.instanceof(opt, cbi.Flag) then
+ print (" option type boolean")
+ elseif util.instanceof(opt, cbi.DynamicList) then
+ print (" option type list")
+ elseif util.instanceof(opt, cbi.ListValue) then
+ print (" option type enum")
+ util.perror("*** Warning: Please verify '%s.%s.%s' ***" %
+ {map.config, sec.sectiontype, opt.option} )
+ end
+
+ for i, dep in ipairs(opt.deps) do
+ if not dep.add or dep.add == "" then
+ local depstring
+ for k, v in pairs(dep.deps) do
+ depstring = (depstring and depstring .. "," or "") .. "%s=%s" % {k, v}
+ end
+ print (" list depends '%s'" % depstring)
+ else
+ util.perror("*** Warning: Unable to decode dependency '%s' in '%s.%s.%s[%s]' ***" %
+ {util.serialize_data(dep.deps), map.config, sec.sectiontype, opt.option, dep.add})
+ end
+ end
+
+ if util.instanceof(opt, cbi.ListValue) then
+ for k, key in ipairs(opt.keylist) do
+ print ("\nconfig enum")
+ print (" option variable '%s.%s.%s'" % {map.config, sec.sectiontype, opt.option})
+ print (" option value '%s'" % key)
+ if opt.vallist[k] and opt.vallist[k] ~= opt.keylist[k] then
+ print (" option title '%s'" % util.striptags(opt.vallist[k]))
+ end
+ end
+ end
+ end
+ end
+end end
\ No newline at end of file