--[[ cfg.lua by blastbeat - this script manages the configuration files ]]-- ----------------------------------// DECLARATION //-- --// lua functions //-- local type = use "type" local pairs = use "pairs" local ipairs = use "ipairs" local assert = use "assert" local tostring = use "tostring" --// lua lib methods //-- local os_date = use "os".date --// core scripts //-- local out local util = use "util" local const = use "const" local types = use "types" --// core methods //-- local out_error local util_savetable = util.savetable local util_loadtable = util.loadtable local util_savearray = util.savearray local types_utf8 = types.utf8 local types_table = types.get "table" local types_number = types.get "number" local types_boolean = types.get "boolean" local types_adcstr local CONFIG_PATH = const.CONFIG_PATH --// functions //-- local set local get local init local checkcfg local reload local loadusers local saveusers local loadlanguage local registerevent local checklanguage local loadcfgprofile --// tables //-- local _event local _settings local _defaultsettings --// simple data types //-- local _ local _cfgfile local _cfgbackup ----------------------------------// DEFINITION //-- _settings = { } _event = { reload = { } } _cfgfile = CONFIG_PATH .. "cfg.tbl" _cfgbackup = CONFIG_PATH .. "cfg.tbl.backup" _defaultsettings = { hub_bot = { "HubBot", function( value ) if not types_adcstr( value, nil, true ) or #value == 0 then return false end return true end }, hub_bot_desc = { "", function( value ) return types_utf8( value, nil, true ) end }, debug = { true, function( value ) return types_boolean( value, nil, true ) end }, log_errors = { true, function( value ) return types_boolean( value, nil, true ) end }, log_scripts = { true, function( value ) return types_boolean( value, nil, true ) end }, log_events = { true, function( value ) return types_boolean( value, nil, true ) end }, max_users = { 100, function( value ) return types_number( value, nil, true ) end }, reg_only = { false, function( value ) return types_boolean( value, nil, true ) end }, tcp_ports = { { 6110, 4660 }, function( value ) if not types_table( value ) then return false else for i, k in pairs( value ) do if not types_number( k, nil, true ) then return false end end end return true end }, ssl_ports = { { 5000, 6000 }, function( value ) if not types_table( value ) then return false else for i, k in pairs( value ) do if not types_number( k, nil, true ) then return false end end end return true end }, user_path = { CONFIG_PATH, function( value ) return types_utf8( value, nil, true ) end }, log_path = { "././log/", function( value ) return types_utf8( value, nil, true ) end }, hub_name = { "LUADCH Test Hub", function( value ) return types_utf8( value, nil, true ) end }, hub_description = { "...", function( value ) return types_utf8( value, nil, true ) end }, hub_pass = { false, function( value ) return types_boolean( value, nil, true ) or types_adcstr( value, nil, true ) end }, max_bad_password = { 5, function( value ) return types_number( value, nil, true ) end }, bad_pass_timeout = { 300, function( value ) return types_number( value, nil, true ) end }, nick_change = { false, function( value ) return types_boolean( value, nil, true ) end }, no_cid_taken = { true, function( value ) return types_boolean( value, nil, true ) end }, ranks = { { "Bot", "Reg", "Op", "Admin", "Owner", }, function( value ) if not types_table( value ) then return false else for i, k in ipairs( value ) do if not types_utf8( k, nil, true ) then return false end end end return true end }, bot_rank = { 1, function( value ) return types_number( value, nil, true ) end }, reg_rank = { 2, function( value ) return types_number( value, nil, true ) end }, op_rank = { 4, function( value ) return types_number( value, nil, true ) end }, admin_rank = { 8, function( value ) return types_number( value, nil, true ) end }, owner_rank = { 16, function( value ) return types_number( value, nil, true ) end }, levels = { { [ 0 ] = "UNREG", [ 10 ] = "GUEST", [ 20 ] = "REG", [ 30 ] = "VIP", [ 40 ] = "SVIP", [ 60 ] = "OPERATOR", [ 80 ] = "ADMIN", [ 100 ] = "HUBOWNER", }, function( value ) if not types_table( value ) then return false else for i, k in pairs( value ) do if not ( types_utf8( k, nil, true ) and types_number( i, nil, true ) ) then return false end end end return true end }, reg_level = { 20, function( value ) return types_number( value, nil, true ) end }, key_level = { 40, function( value ) return types_number( value, nil, true ) end }, bot_level = { 60, function( value ) return types_number( value, nil, true ) end }, scripts = { { -- array of scripts which will be executed from hub --"hub_keeping_alive.lua", "hub_cmd_manager.lua", "hub_inf_manager.lua", "usr_hubs.lua", "usr_slots.lua", "usr_share.lua", "hub_user_ranks.lua", "bot_opchat.lua", "cmd_ban.lua", "cmd_unban.lua", "cmd_reg.lua", "cmd_delreg.lua", "cmd_mass.lua", "cmd_reload.lua", "cmd_restart.lua", "cmd_shutdown.lua", "cmd_help.lua", "cmd_userinfo.lua", "cmd_accinfo.lua", "cmd_regme.lua", "cmd_setpas.lua", "cmd_errors.lua", "cmd_upgrade.lua", "etc_report.lua", "etc_motd.lua", "etc_hubcommands.lua", "etc_unknown_command.lua", }, function( value ) if not types_table( value ) then return false else for i, k in ipairs( value ) do if not types_utf8( k, nil, true ) then return false end end end return true end }, script_path = { "././scripts/", function( value ) return types_utf8( value, nil, true ) end }, ssl_params = { { mode = "server", key = "certs/serverkey.pem", certificate = "certs/servercert.pem", cafile = "certs/ca.pem", protocol = "tlsv1", }, function( ) return true end }, use_ssl = { false, function( value ) return types_boolean( value, nil, true ) end }, no_global_scripting = { true, function( value ) return types_boolean( value, nil, true ) end }, language = { "en", function( value ) return types_utf8( value, nil, true ) end }, core_lang_path = { "lang/", function( value ) return types_utf8( value, nil, true ) end }, scripts_lang_path = { "././scripts/lang/", function( value ) return types_utf8( value, nil, true ) end }, scripts_cfg_profile = { "default", function( value ) return types_utf8( value, nil, true ) end }, scripts_cfg_path = { "././scripts/cfg/", function( value ) return types_utf8( value, nil, true ) end }, --// PING //-- use_ping = { true, function( value ) return types_boolean( value, nil, true ) end }, hub_hostaddress = { "", function( value ) return types_utf8( value, nil, true ) end }, hub_network = { "", function( value ) return types_utf8( value, nil, true ) end }, hub_website = { "", function( value ) return types_utf8( value, nil, true ) end }, hub_owner = { "", function( value ) return types_utf8( value, nil, true ) end }, min_slots = { 2, function( value ) return types_number( value, nil, true ) end }, max_slots = { 10, function( value ) return types_number( value, nil, true ) end }, min_share = { 1 * 1024 * 1024, function( value ) return types_number( value, nil, true ) end }, max_share = { 100 * 1024 * 1024 * 1024 * 1024, function( value ) return types_number( value, nil, true ) end }, max_user_hubs = { 33, function( value ) return types_number( value, nil, true ) end }, max_reg_hubs = { 33, function( value ) return types_number( value, nil, true ) end }, max_op_hubs = { 33, function( value ) return types_number( value, nil, true ) end }, } checkcfg = function( ) for key, value in pairs( _settings ) do local dst = _defaultsettings[ key ] if not ( dst and dst[ 2 ]( value ) ) then out_error( "cfg.lua: corrupt cfg.tbl: invalid key/value: ", key, "/", value, "; using default cfg" ) _settings = { } break end end end checklanguage = function( lang ) --[[for i, k in pairs( lang ) do if not ( types_utf8( k, nil, true ) and types_utf8( i, nil, true ) ) then out_error( "cfg.lua: error while loading hub language: invalid key/value: ", i, "/", k, "; using default" ) return { } end end]] return lang end set = function( target, newvalue ) local dst = _defaultsettings[ target ] if dst and dst[ 2 ]( newvalue ) then _settings[ target ] = newvalue local _, err = util_savetable( _settings, "settings", _cfgbackup .. "." .. os_date( "[%d.%m.%y.%H.%M.%S]" ) ) _ = err and out_error( "cfg.lua: error while backup hub settings: ", err ) local _, err = util_savetable( _settings, "settings", _cfgfile ) _ = err and out_error( "cfg.lua: error while saving hub settings: ", err ) return err else out_error( "cfg.lua: invalid access to settings: invalid target/newvalue: ", target, "/", newvalue, "; using old value" ) return "invalid target or newvalue" end end get = function( target ) if _settings[ target ] == nil then return _defaultsettings[ target ][ 1 ] end return _settings[ target ] end loadusers = function( ) local users, err = util_loadtable( get "user_path" .. "user.tbl" ) _ = err and out_error( "cfg.lua: error while loading users: ", err ) return ( users or { } ), err end saveusers = function( regusers ) local _, err = util_savearray( regusers, get( "user_path" ) .. "user.tbl.BACKUP." .. os_date( "[%d.%m.%y.%H.%M.%S]" ) ) _ = err and out_error( "cfg.lua: error while backup user db: ", err ) local _, err = util_savearray( regusers, get( "user_path" ) .. "user.tbl" ) _ = err and out_error( "cfg.lua: error while saving user db: ", err ) end loadlanguage = function( language, name ) language = tostring( language or get "language" ) -- default language local path if not name then path = get "core_lang_path" .. language .. ".tbl" else path = get "scripts_lang_path" .. tostring( name ) .. ".lang." .. language end local ret, err = util_loadtable( path ) _ = err and out_error( "cfg.lua: error while loading language: ", err ) return checklanguage( ret or { } ), err end loadcfgprofile = function( profile, name ) profile = tostring( profile or get "scripts_cfg_profile" ) -- default profile ret, err = util_loadtable( get "scripts_cfg_path" .. tostring( name ) .. ".cfg." .. profile ) _ = err and out_error( "cfg.lua: error while loading cfg profile: ", err ) return ret, err end registerevent = function( what, listener ) assert( type( listener ) == "function" ) _event[ what ] = _event[ what ] or { } local tbl = _event[ what ] _event[ what ][ #tbl + 1 ] = listener end reload = function( ) local err _settings, err = util_loadtable( _cfgfile ) _settings = _settings or { } _ = err and out_error( "cfg.lua: error while reloading hub settings: ", err, "; using default cfg" ) checkcfg( ) for i, func in ipairs( _event.reload ) do func( ) end return _settings, err end init = function( ) types_adcstr = types.get "adcstr" out = use "out" out_error = out.error local err _settings, err = util_loadtable( _cfgfile ) _settings = _settings or { } _ = err and out_error( "cfg.lua: error while loading hub settings: ", err, "; using default cfg" ) checkcfg( ) end ----------------------------------// BEGIN //-- ----------------------------------// PUBLIC INTERFACE //-- return { init = init, set = set, get = get, reload = reload, loadusers = loadusers, saveusers = saveusers, loadlanguage = loadlanguage, registerevent = registerevent, loadcfgprofile = loadcfgprofile, }