* luci/libs: uvl: first round of uci schemes
This commit is contained in:
parent
449d8e46e9
commit
d564e036b3
9 changed files with 479 additions and 4 deletions
144
libs/uvl/root/lib/uci/schema/default/ddns
Normal file
144
libs/uvl/root/lib/uci/schema/default/ddns
Normal file
|
@ -0,0 +1,144 @@
|
|||
package ddns
|
||||
|
||||
config section
|
||||
option name 'service'
|
||||
option title 'DynDNS service entry'
|
||||
option package 'ddns'
|
||||
option named true
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'enabled'
|
||||
option title 'Enable this service entry'
|
||||
option section 'ddns.service'
|
||||
option datatype 'boolean'
|
||||
|
||||
config variable
|
||||
option name 'service_name'
|
||||
option title 'Name of the DynDNS provider'
|
||||
option section 'ddns.service'
|
||||
option datatype 'string'
|
||||
|
||||
config variable
|
||||
option name 'domain'
|
||||
option title 'Own DynDNS domain'
|
||||
option section 'ddns.service'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'username'
|
||||
option title 'Account username'
|
||||
option section 'ddns.service'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'password'
|
||||
option title 'Account password'
|
||||
option section 'ddns.service'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'ip_source'
|
||||
option title 'Method to determine current IP address'
|
||||
option section 'ddns.service'
|
||||
option type 'enum'
|
||||
option required true
|
||||
|
||||
config enum
|
||||
option variable 'ddns.service.ip_source'
|
||||
option value 'network'
|
||||
option title 'Read ip address from /etc/config/network'
|
||||
|
||||
config enum
|
||||
option variable 'ddns.service.ip_source'
|
||||
option value 'interface'
|
||||
option title 'Determine ip address from given hardware interface'
|
||||
|
||||
config enum
|
||||
option variable 'ddns.service.ip_source'
|
||||
option value 'web'
|
||||
option title 'Determine own IP using a remote web page'
|
||||
|
||||
config variable
|
||||
option name 'ip_network'
|
||||
option title 'Configured network to use IP from'
|
||||
option section 'ddns.service'
|
||||
option depends 'ip_source=network'
|
||||
option valueof 'network.interface'
|
||||
|
||||
config variable
|
||||
option name 'ip_interface'
|
||||
option title 'Physical network interface to read IP from'
|
||||
option section 'ddns.service'
|
||||
option depends 'ip_source=interface'
|
||||
|
||||
config variable
|
||||
option name 'ip_url'
|
||||
option title 'Web page used to determine IP address'
|
||||
option section 'ddns.service'
|
||||
option depends 'ip_source=web'
|
||||
|
||||
config variable
|
||||
option name 'update_url'
|
||||
option title 'URL format to use for updating DNS information (for yet-unknown providers)'
|
||||
option section 'ddns.service'
|
||||
|
||||
config variable
|
||||
option name 'check_interval'
|
||||
option title 'Update check interval'
|
||||
option section 'ddns.service'
|
||||
option datatype 'integer'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'check_unit'
|
||||
option title 'Unit for update check interval'
|
||||
option section 'ddns.service'
|
||||
option type 'enum'
|
||||
option required true
|
||||
|
||||
config enum
|
||||
option variable 'ddns.service.check_unit'
|
||||
option value 'seconds'
|
||||
|
||||
config enum
|
||||
option variable 'ddns.service.check_unit'
|
||||
option value 'minutes'
|
||||
|
||||
config enum
|
||||
option variable 'ddns.service.check_unit'
|
||||
option value 'hours'
|
||||
|
||||
config enum
|
||||
option variable 'ddns.service.check_unit'
|
||||
option value 'days'
|
||||
|
||||
config variable
|
||||
option name 'force_interval'
|
||||
option title 'Forced update interval'
|
||||
option section 'ddns.service'
|
||||
option datatype 'integer'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'force_unit'
|
||||
option title 'Unit of forced update interval'
|
||||
option section 'ddns.service'
|
||||
option type 'enum'
|
||||
option required true
|
||||
|
||||
config enum
|
||||
option variable 'ddns.service.force_unit'
|
||||
option value 'seconds'
|
||||
|
||||
config enum
|
||||
option variable 'ddns.service.force_unit'
|
||||
option value 'minutes'
|
||||
|
||||
config enum
|
||||
option variable 'ddns.service.force_unit'
|
||||
option value 'hours'
|
||||
|
||||
config enum
|
||||
option variable 'ddns.service.force_unit'
|
||||
option value 'days'
|
21
libs/uvl/root/lib/uci/schema/default/dropbear
Normal file
21
libs/uvl/root/lib/uci/schema/default/dropbear
Normal file
|
@ -0,0 +1,21 @@
|
|||
package dropbear
|
||||
|
||||
config section
|
||||
option name 'dropbear'
|
||||
option title 'General SSH daemon settings'
|
||||
option package 'dropbear'
|
||||
option required true
|
||||
option unique true
|
||||
|
||||
config variable
|
||||
option name 'PasswordAuth'
|
||||
option title 'Permit password authentication'
|
||||
option section 'dropbear.dropbear'
|
||||
option datatype 'boolean'
|
||||
|
||||
config variable
|
||||
option name 'Port'
|
||||
option title 'Listening port'
|
||||
option section 'dropbear.dropbear'
|
||||
option datatype 'integer'
|
||||
option required true
|
88
libs/uvl/root/lib/uci/schema/default/firewall
Normal file
88
libs/uvl/root/lib/uci/schema/default/firewall
Normal file
|
@ -0,0 +1,88 @@
|
|||
package firewall
|
||||
|
||||
config section
|
||||
option name 'defaults'
|
||||
option title 'Global firewall defaults'
|
||||
option package 'firewall'
|
||||
option unique true
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'forward'
|
||||
option title 'Action for forwarded traffic'
|
||||
option section 'firewall.defaults'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'input'
|
||||
option title 'Action for incoming traffic'
|
||||
option section 'firewall.defaults'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'output'
|
||||
option title 'Action for outgoing traffic'
|
||||
option section 'firewall.defaults'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'syn_flood'
|
||||
option title 'Enable syn-flood protection'
|
||||
option section 'firewall.defaults'
|
||||
option datatype 'boolean'
|
||||
|
||||
|
||||
config section
|
||||
option name 'forwarding'
|
||||
option title 'Firewall traffic forwarding rules'
|
||||
option package 'firewall'
|
||||
|
||||
config variable
|
||||
option name 'src'
|
||||
option title 'Source zone'
|
||||
option section 'firewall.forwarding'
|
||||
option valueof 'firewall.zone.name'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'dest'
|
||||
option title 'Destination zone'
|
||||
option section 'firewall.forwarding'
|
||||
option valueof 'firewall.zone.name'
|
||||
option required true
|
||||
|
||||
|
||||
config section
|
||||
option name 'zone'
|
||||
option title 'Firewall zones'
|
||||
option package 'firewall'
|
||||
|
||||
config variable
|
||||
option name 'name'
|
||||
option title 'Name of this firewall zone'
|
||||
option section 'firewall.zone'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'forward'
|
||||
option title 'Zone specific action for forwarded traffic'
|
||||
option section 'firewall.zone'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'input'
|
||||
option title 'Zone specific action for incoming traffic'
|
||||
option section 'firewall.zone'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'output'
|
||||
option title 'Zone specific action for outgoing traffic'
|
||||
option section 'firewall.zone'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'masq'
|
||||
option title 'Enable masquerading for outgoing zone traffic'
|
||||
option section 'firewall.zone'
|
||||
option datatype 'boolean'
|
50
libs/uvl/root/lib/uci/schema/default/fstab
Normal file
50
libs/uvl/root/lib/uci/schema/default/fstab
Normal file
|
@ -0,0 +1,50 @@
|
|||
package fstab
|
||||
|
||||
config section
|
||||
option name 'mount'
|
||||
option title 'Filesystem entry'
|
||||
option package 'fstab'
|
||||
|
||||
config variable
|
||||
option name 'device'
|
||||
option title 'Device node'
|
||||
option section 'fstab.mount'
|
||||
|
||||
config variable
|
||||
option name 'enabled'
|
||||
option title 'Enable this mount point'
|
||||
option section 'fstab.mount'
|
||||
option datatype 'boolean'
|
||||
|
||||
config variable
|
||||
option name 'fstype'
|
||||
option title 'Filesystem type'
|
||||
option section 'fstab.mount'
|
||||
|
||||
config variable
|
||||
option name 'options'
|
||||
option title 'Mount options'
|
||||
option section 'fstab.mount'
|
||||
|
||||
config variable
|
||||
option name 'target'
|
||||
option title 'Mount point'
|
||||
option section 'fstab.mount'
|
||||
option datatype 'directory'
|
||||
|
||||
|
||||
config section
|
||||
option name 'swap'
|
||||
option title 'Swap entry'
|
||||
option package 'fstab'
|
||||
|
||||
config variable
|
||||
option name 'device'
|
||||
option title 'Swap file or Partition'
|
||||
option section 'fstab.swap'
|
||||
|
||||
config variable
|
||||
option name 'enabled'
|
||||
option title 'Enable this swap'
|
||||
option section 'fstab.swap'
|
||||
option datatype 'boolean'
|
22
libs/uvl/root/lib/uci/schema/default/httpd
Normal file
22
libs/uvl/root/lib/uci/schema/default/httpd
Normal file
|
@ -0,0 +1,22 @@
|
|||
package httpd
|
||||
|
||||
config section
|
||||
option name 'httpd'
|
||||
option title 'General httpd settings'
|
||||
option package 'httpd'
|
||||
option unique true
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'home'
|
||||
option title 'Docroot directory'
|
||||
option section 'httpd.httpd'
|
||||
option datatype 'directory'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'port'
|
||||
option title 'Listening port'
|
||||
option section 'httpd.httpd'
|
||||
option datatype 'integer'
|
||||
option required true
|
14
libs/uvl/root/lib/uci/schema/default/luci_splash
Normal file
14
libs/uvl/root/lib/uci/schema/default/luci_splash
Normal file
|
@ -0,0 +1,14 @@
|
|||
package luci_splash
|
||||
|
||||
config section
|
||||
option name 'core'
|
||||
option title 'Common DHCP splash settings'
|
||||
option package 'luci_splash'
|
||||
option unique true
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'leasetime'
|
||||
option title 'Lease time in hours'
|
||||
option section 'luci_splash.core'
|
||||
option datatype 'float'
|
21
libs/uvl/root/lib/uci/schema/default/system
Normal file
21
libs/uvl/root/lib/uci/schema/default/system
Normal file
|
@ -0,0 +1,21 @@
|
|||
package system
|
||||
|
||||
config section
|
||||
option name 'system'
|
||||
option title 'General system configuration'
|
||||
option package 'system'
|
||||
option unique true
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'hostname'
|
||||
option title 'Local hostname'
|
||||
option section 'system.system'
|
||||
option datatype 'hostname'
|
||||
option required true
|
||||
|
||||
config variable
|
||||
option name 'timezone'
|
||||
option title 'Option timezone'
|
||||
option section 'system.system'
|
||||
option required true
|
25
libs/uvl/root/lib/uci/schema/default/upnpd
Normal file
25
libs/uvl/root/lib/uci/schema/default/upnpd
Normal file
|
@ -0,0 +1,25 @@
|
|||
package upnpd
|
||||
|
||||
config section
|
||||
option name 'upnpd'
|
||||
option title 'Common upnpd settings'
|
||||
option package 'upnpd'
|
||||
option unique true
|
||||
|
||||
config variable
|
||||
option name 'download'
|
||||
option title 'Download bandwidth in kBit/s'
|
||||
option section 'upnpd.upnpd'
|
||||
option datatype 'integer'
|
||||
|
||||
config variable
|
||||
option name 'upload'
|
||||
option title 'Upload bandwidth in kBit/s'
|
||||
option section 'upnpd.upnpd'
|
||||
option datatype 'integer'
|
||||
|
||||
config variable
|
||||
option name 'log_output'
|
||||
option title 'Enable log messages'
|
||||
option section 'upnpd.upnpd'
|
||||
option datatype 'boolean'
|
|
@ -57,9 +57,90 @@ function getopt( arg, options )
|
|||
return tab, args
|
||||
end
|
||||
|
||||
function genspec(conf)
|
||||
require("luci.model.uci")
|
||||
require("luci.uvl.datatypes")
|
||||
|
||||
local uci = luci.model.uci.cursor()
|
||||
local ok, err = uci:load(conf)
|
||||
|
||||
if not ok then
|
||||
print("Can not load config:", err)
|
||||
os.exit(1)
|
||||
else
|
||||
local function _guess_datatype(v)
|
||||
if type(v) == "table" then v = v[1] end
|
||||
|
||||
for _, type in ipairs({
|
||||
"boolean", "integer", "float", "ip4addr", "ip6addr",
|
||||
"macaddr", "directory", "file"
|
||||
}) do
|
||||
if luci.uvl.datatypes[type](v) then
|
||||
return type
|
||||
end
|
||||
end
|
||||
return "string"
|
||||
end
|
||||
|
||||
|
||||
local co = uci:get_all(conf)
|
||||
local ct = { }
|
||||
local ca = { }
|
||||
local so = { }
|
||||
local to = { }
|
||||
|
||||
-- count section types
|
||||
for _, section in pairs(co) do
|
||||
ct[section['.type']] = ( ct[section['.type']] or 0 ) + 1
|
||||
ca[section['.type']] = section['.anonymous']
|
||||
so[section['.type']] = so[section['.type']] or { }
|
||||
to[section['.type']] = to[section['.type']] or { }
|
||||
|
||||
for option, value in pairs(section) do
|
||||
if option:sub(1,1) ~= "." then
|
||||
so[section['.type']][option] = _guess_datatype(value)
|
||||
to[section['.type']][option] = ( type(value) == "table" and "list" or "variable" )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- package name
|
||||
print( "package %s" % conf )
|
||||
|
||||
-- write section schemes
|
||||
for type, count in luci.util.kspairs(ct) do
|
||||
print( "\nconfig section" )
|
||||
print( "\toption name '%s'" % type )
|
||||
print( "\toption title 'Section %s'" % type )
|
||||
print( "\toption package '%s'"% conf )
|
||||
print( "\toption named %s" % ( ca[type] and 'false' or 'true' ) )
|
||||
print( "\toption unique %s" % ( ct[type] > 1 and 'false' or ( ca[type] and 'false' or 'true' ) ) )
|
||||
print( "\toption dynamic false" )
|
||||
print( "\toption required false" )
|
||||
|
||||
-- write option schemes
|
||||
for opt, val in luci.util.kspairs(so[type]) do
|
||||
print( "\nconfig variable" )
|
||||
print( "\toption name '%s'" % opt )
|
||||
print( "\toption title 'Option %s'" % opt )
|
||||
print( "\toption section '%s.%s'" %{ conf, type } )
|
||||
print( "\toption datatype '%s'" % so[type][opt] )
|
||||
|
||||
if to[type][opt] ~= "variable" then
|
||||
print( "\toption type '%s'" % to[type][opt] )
|
||||
end
|
||||
end
|
||||
|
||||
print("")
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local options, arguments = getopt( arg )
|
||||
|
||||
if #arguments == 0 or options.help then
|
||||
if #arguments ~= 2 or options.help then
|
||||
print([=[
|
||||
|
||||
uvl - UCI Validation Layer
|
||||
|
@ -70,7 +151,7 @@ Usage:
|
|||
uvl --help
|
||||
uvl [--silent] [--schemedir=DIR]
|
||||
[--no-strict-sections] [--no-strict-options] [--no-strict-validators]
|
||||
[--no-strict-lists] config[.section[.option]]
|
||||
[--no-strict-lists] {verify|genspec} config[.section[.option]]
|
||||
|
||||
Options:
|
||||
--help
|
||||
|
@ -93,9 +174,16 @@ Options:
|
|||
|
||||
--no-strict-lists
|
||||
Don't invalidate lists that are stored options.
|
||||
|
||||
Actions:
|
||||
verify
|
||||
Validate given configuration, section or option.
|
||||
|
||||
genspec
|
||||
Generate a scheme skeleton from given configuration.
|
||||
]=])
|
||||
os.exit(255)
|
||||
else
|
||||
elseif arguments[1] == "verify" then
|
||||
luci.uvl.STRICT_UNKNOWN_SECTIONS =
|
||||
( options['no-strict-sections'] and false or true )
|
||||
luci.uvl.STRICT_UNKNOWN_OPTIONS =
|
||||
|
@ -109,7 +197,7 @@ else
|
|||
type(options.schemedir) == "string" and options.schemedir or nil
|
||||
)
|
||||
|
||||
local cso = luci.util.split( arguments[1], "." )
|
||||
local cso = luci.util.split( arguments[2], "." )
|
||||
local ok, err = uvl:validate( unpack(cso) )
|
||||
|
||||
if ok then
|
||||
|
@ -126,4 +214,6 @@ else
|
|||
if not options.silent then print( err and err:string() or "Unknown error" ) end
|
||||
os.exit( 1 )
|
||||
end
|
||||
else
|
||||
genspec( arguments[2] )
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue