diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 66a58ea..5775168 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -4,21 +4,41 @@ require("/initenv").init_env() -local log = require("scada-common.log") -local ppm = require("scada-common.ppm") +local log = require("scada-common.log") +local ppm = require("scada-common.ppm") local util = require("scada-common.util") -local config = require("coordinator.config") +local config = require("coordinator.config") local coordinator = require("coordinator.coordinator") -local renderer = require("coordinator.renderer") +local renderer = require("coordinator.renderer") -local COORDINATOR_VERSION = "alpha-v0.1.3" +local COORDINATOR_VERSION = "alpha-v0.1.4" local print = util.print local println = util.println local print_ts = util.print_ts local println_ts = util.println_ts +---------------------------------------- +-- config validation +---------------------------------------- + +local cfv = util.new_validator() + +cfv.assert_port(config.SCADA_SV_PORT) +cfv.assert_port(config.SCADA_SV_LISTEN) +cfv.assert_port(config.SCADA_API_LISTEN) +cfv.assert_type_int(config.NUM_UNITS) +cfv.assert_type_str(config.LOG_PATH) +cfv.assert_type_int(config.LOG_MODE) +cfv.assert_type_bool(config.SECURE) +cfv.assert_type_str(config.PASSWORD) +assert(cfv.valid(), "bad config file: missing/invalid fields") + +---------------------------------------- +-- log init +---------------------------------------- + log.init(config.LOG_PATH, config.LOG_MODE) log.info("========================================") @@ -26,6 +46,10 @@ log.info("BOOTING coordinator.startup " .. COORDINATOR_VERSION) log.info("========================================") println(">> SCADA Coordinator " .. COORDINATOR_VERSION .. " <<") +---------------------------------------- +-- startup +---------------------------------------- + -- mount connected devices ppm.mount_all() diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index 616bd6c..73f4964 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -13,13 +13,31 @@ local config = require("reactor-plc.config") local plc = require("reactor-plc.plc") local threads = require("reactor-plc.threads") -local R_PLC_VERSION = "beta-v0.7.6" +local R_PLC_VERSION = "beta-v0.7.7" local print = util.print local println = util.println local print_ts = util.print_ts local println_ts = util.println_ts +---------------------------------------- +-- config validation +---------------------------------------- + +local cfv = util.new_validator() + +cfv.assert_type_bool(config.NETWORKED) +cfv.assert_type_int(config.REACTOR_ID) +cfv.assert_port(config.SERVER_PORT) +cfv.assert_port(config.LISTEN_PORT) +cfv.assert_type_str(config.LOG_PATH) +cfv.assert_type_int(config.LOG_MODE) +assert(cfv.valid(), "bad config file: missing/invalid fields") + +---------------------------------------- +-- log init +---------------------------------------- + log.init(config.LOG_PATH, config.LOG_MODE) log.info("========================================") @@ -27,6 +45,10 @@ log.info("BOOTING reactor-plc.startup " .. R_PLC_VERSION) log.info("========================================") println(">> Reactor PLC " .. R_PLC_VERSION .. " <<") +---------------------------------------- +-- startup +---------------------------------------- + -- mount connected devices ppm.mount_all() diff --git a/rtu/startup.lua b/rtu/startup.lua index 0348358..209fed6 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -25,7 +25,7 @@ local imatrix_rtu = require("rtu.dev.imatrix_rtu") local turbine_rtu = require("rtu.dev.turbine_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "beta-v0.7.7" +local RTU_VERSION = "beta-v0.7.8" local rtu_t = types.rtu_t @@ -34,6 +34,24 @@ local println = util.println local print_ts = util.print_ts local println_ts = util.println_ts +---------------------------------------- +-- config validation +---------------------------------------- + +local cfv = util.new_validator() + +cfv.assert_port(config.SERVER_PORT) +cfv.assert_port(config.LISTEN_PORT) +cfv.assert_type_str(config.LOG_PATH) +cfv.assert_type_int(config.LOG_MODE) +cfv.assert_type_table(config.RTU_DEVICES) +cfv.assert_type_table(config.RTU_REDSTONE) +assert(cfv.valid(), "bad config file: missing/invalid fields") + +---------------------------------------- +-- log init +---------------------------------------- + log.init(config.LOG_PATH, config.LOG_MODE) log.info("========================================") diff --git a/scada-common/util.lua b/scada-common/util.lua index bfba8d9..ba417ff 100644 --- a/scada-common/util.lua +++ b/scada-common/util.lua @@ -281,4 +281,34 @@ function util.new_clock(period) return public end +-- create a new type validator +-- +-- can execute sequential checks and check valid() to see if it is still valid +function util.new_validator() + local valid = true + + ---@class validator + local public = {} + + function public.assert_type_bool(value) valid = valid and type(value) == "boolean" end + function public.assert_type_num(value) valid = valid and type(value) == "number" end + function public.assert_type_int(value) valid = valid and type(value) == "number" and value == math.floor(value) end + function public.assert_type_str(value) valid = valid and type(value) == "string" end + function public.assert_type_table(value) valid = valid and type(value) == "table" end + + function public.assert_eq(check, expect) valid = valid and check == expect end + function public.assert_min(check, min) valid = valid and check >= min end + function public.assert_min_ex(check, min) valid = valid and check > min end + function public.assert_max(check, max) valid = valid and check <= max end + function public.assert_max_ex(check, max) valid = valid and check < max end + function public.assert_range(check, min, max) valid = valid and check >= min and check <= max end + function public.assert_range_ex(check, min, max) valid = valid and check > min and check < max end + + function public.assert_port(port) valid = valid and type(port) == "number" and port >= 0 and port <= 65535 end + + function public.valid() return valid end + + return public +end + return util diff --git a/supervisor/startup.lua b/supervisor/startup.lua index a123492..46ad6b4 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -13,13 +13,43 @@ local svsessions = require("supervisor.session.svsessions") local config = require("supervisor.config") local supervisor = require("supervisor.supervisor") -local SUPERVISOR_VERSION = "beta-v0.4.12" +local SUPERVISOR_VERSION = "beta-v0.4.13" local print = util.print local println = util.println local print_ts = util.print_ts local println_ts = util.println_ts +---------------------------------------- +-- config validation +---------------------------------------- + +local cfv = util.new_validator() + +cfv.assert_port(config.SCADA_DEV_LISTEN) +cfv.assert_port(config.SCADA_SV_LISTEN) +cfv.assert_type_int(config.NUM_REACTORS) +cfv.assert_type_table(config.REACTOR_COOLING) +cfv.assert_type_str(config.LOG_PATH) +cfv.assert_type_int(config.LOG_MODE) + +assert(cfv.valid(), "bad config file: missing/invalid fields") + +for i = 1, config.NUM_REACTORS do + cfv.assert_type_table(config.REACTOR_COOLING[i]) + assert(cfv.valid(), "missing cooling entry for reactor " .. i) + cfv.assert_type_int(config.REACTOR_COOLING[i].BOILERS) + cfv.assert_type_int(config.REACTOR_COOLING[i].TURBINES) + assert(cfv.valid(), "missing boilers/turbines for reactor " .. i) + cfv.assert_min(config.REACTOR_COOLING[i].BOILERS, 0) + cfv.assert_min(config.REACTOR_COOLING[i].TURBINES, 1) + assert(cfv.valid(), "bad number of boilers/turbines for reactor " .. i) +end + +---------------------------------------- +-- log init +---------------------------------------- + log.init(config.LOG_PATH, config.LOG_MODE) log.info("========================================") @@ -27,6 +57,10 @@ log.info("BOOTING supervisor.startup " .. SUPERVISOR_VERSION) log.info("========================================") println(">> SCADA Supervisor " .. SUPERVISOR_VERSION .. " <<") +---------------------------------------- +-- startup +---------------------------------------- + -- mount connected devices ppm.mount_all()