X-Git-Url: https://git.rvb.name/weathermon.git/blobdiff_plain/c58ad4fb6f2c4c350a6aae01b100ebb4564ad8e9..428b776c5748cdfe60245fba4336c01b4f62064b:/bin/weathermon?ds=inline diff --git a/bin/weathermon b/bin/weathermon index d16f871..2c5419c 100755 --- a/bin/weathermon +++ b/bin/weathermon @@ -1,6 +1,7 @@ #!/usr/bin/lua local json = require("json") +local signal = require("posix.signal") require "wm_util" @@ -88,6 +89,14 @@ function printLog(str) end end +function unlock_db(file) + + print("Unlocking DB "..file) + os.execute("sqlite3 -readonly \""..file.."\" \".backup /tmp/weathermon.db\"") + os.execute("mv /tmp/weathermon.db \""..file.."\"") + +end + function submitValue(type,id,param,val) val = tonumber(val) @@ -100,22 +109,38 @@ function submitValue(type,id,param,val) url = url:gsub("//","//"..web_user..":"..web_pass.."@",1) end - local result,code = http.request ({ - url=url, create=function() - local req_sock = socket.tcp() - req_sock:settimeout(web_timeout) - return req_sock - end}) + local result,code = http.request (url) - if code ~= 200 and backlog_con then + if code ~= 200 and backlogdb then printLog("writing record to backlog...") + local backlog_con = assert(env:connect(backlogdb)) + backlog_con:execute('BEGIN TRANSACTION') backlog_con:execute(string.format("INSERT INTO queue(time_stamp,sensor_id,sensor,param,value) VALUES (datetime('now','localtime'),'%s','%s','%s',%f)",id,type,param,val)) + local n,err = backlog_con:execute('COMMIT TRANSACTION') + backlog_con:close() + + if err == "LuaSQL: database is locked" then + unlock_db(backlogdb); + end + end end if logdb then + print(logdb) + local log_con = assert(env:connect(logdb)) + log_con:execute('BEGIN TRANSACTION') log_con:execute(string.format("INSERT INTO log(time_stamp,sensor_id,sensor,param,value) VALUES (datetime('now','localtime'),'%s','%s','%s',%f)",id,type,param,val)) + local n,err = log_con:execute('COMMIT TRANSACTION') + log_con:close() + + print(n,err) + + if err == "LuaSQL: database is locked" then + unlock_db(logdb); + end + end end @@ -161,9 +186,6 @@ function processJson(str) end if not (sensor_type==nil or sensor_id==nil or sensor_type=='' or sensor_id=='') then - if next(sensor)==nil then - sensor["command"]="alarm" - end local record = {} for k,v in pairs(sensor) do storeRecord(sensor_id,sensor_type,k,v) @@ -186,7 +208,10 @@ function processJson(str) return '{'..name..'}' end end) - mqtt_client:publish(mqtt_path,v) + if not mqtt_client:socket() then + mqtt_client:reconnect() + end + mqtt_client:publish(mqtt_path,v,0,false) mqtt_client:loop() end end @@ -249,7 +274,10 @@ function processLine(str) return '{'..name..'}' end end) - mqtt_client:publish(mqtt_path,v) + if not mqtt_client:socket() then + mqtt_client:reconnect() + end + mqtt_client:publish(mqtt_path,v,0,false) mqtt_client:loop() end end @@ -290,7 +318,10 @@ function processLine(str) return '{'..name..'}' end end) - mqtt_client:publish(mqtt_path,msg_body) + if not mqtt_client:socket() then + mqtt_client:reconnect() + end + mqtt_client:publish(mqtt_path,msg_body,0,false) mqtt_client:loop() end if alarm_exec then @@ -309,6 +340,19 @@ end getConfig(arg[1]) +signal.signal(signal.SIGTERM, function(signum) + + printLog("Terminating...") + local pids = get_children() + for k,v in pairs(pids) do + printLog("Terminating subprocess "..tostring(v).."...") + signal.kill(v,signal.SIGTERM) + end + printLog("Exiting...") + os.exit(0) + +end) + if backlogdb or logdb then local dbdriver = require "luasql.sqlite3" env = assert(dbdriver.sqlite3()) @@ -318,22 +362,24 @@ if backlogdb then if not file_exists(backlogdb) then touch(backlogdb) end - backlog_con = assert(env:connect(backlogdb)) + local backlog_con = assert(env:connect(backlogdb)) backlog_con:execute("CREATE TABLE queue(time_stamp datetime,sensor_id varchar(16),sensor varchar(16),param varchar(16),value float)") + backlog_con:close() end if logdb then if not file_exists(logdb) then touch(logdb) end - log_con = assert(env:connect(logdb)) + local log_con = assert(env:connect(logdb)) log_con:execute("CREATE TABLE log(time_stamp datetime,sensor_id varchar(16),sensor varchar(16),param varchar(16),value float)") log_con:execute("CREATE INDEX log_idx ON log(sensor_id,sensor,param,time_stamp)") + log_con:close() end if web_url then http = require("socket.http") - socket = require("socket") + http.TIMEOUT = web_timeout end if mqtt_host then @@ -370,7 +416,7 @@ while 1 do break end - pcall(function () +-- pcall(function () printLog("Received: "..line) if startswith(line,'{') then @@ -393,6 +439,6 @@ while 1 do io.close(f) end) end - end) +-- end) end