Переход на короткоживущие соединения с sqlite - на MT7688 возникают блокировки.
[weathermon.git] / bin / weathermon
index 804ba255a87eef42963134328191f2b52502aea5..d2b53746f65ace65e7a4610bc42b0515633768f1 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/lua
 
 local json = require("json")
 #!/usr/bin/lua
 
 local json = require("json")
+local signal = require("posix.signal")
 
 require "wm_util"
 
 
 require "wm_util"
 
@@ -100,22 +101,25 @@ function submitValue(type,id,param,val)
       url = url:gsub("//","//"..web_user..":"..web_pass.."@",1)
     end
 
       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...")
       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))
       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))
+      backlog_con:execute('COMMIT')
+      backlog_con:close()
     end
 
   end
   
   if logdb then
     end
 
   end
   
   if logdb then
+    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))
     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))
+    log_con:execute('COMMIT')
+    log_con:close()
   end
 
 end
   end
 
 end
@@ -161,9 +165,6 @@ function processJson(str)
   end
 
   if not (sensor_type==nil or sensor_id==nil or sensor_type=='' or sensor_id=='') then
   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)
     local record = {}
     for k,v in pairs(sensor) do
       storeRecord(sensor_id,sensor_type,k,v)
@@ -189,7 +190,7 @@ function processJson(str)
         if not mqtt_client:socket() then
           mqtt_client:reconnect()
         end  
         if not mqtt_client:socket() then
           mqtt_client:reconnect()
         end  
-        mqtt_client:publish(mqtt_path,v)
+        mqtt_client:publish(mqtt_path,v,0,false)
         mqtt_client:loop()
       end  
     end
         mqtt_client:loop()
       end  
     end
@@ -252,7 +253,10 @@ function processLine(str)
                 return '{'..name..'}'
               end      
             end)
                 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
           mqtt_client:loop()
         end  
       end
@@ -293,7 +297,10 @@ function processLine(str)
               return '{'..name..'}'
             end      
           end)
               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
         mqtt_client:loop()
       end
       if alarm_exec then
@@ -312,6 +319,19 @@ end
 
 getConfig(arg[1])
 
 
 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())
 if backlogdb or logdb then
   local dbdriver = require "luasql.sqlite3"
   env = assert(dbdriver.sqlite3())
@@ -321,22 +341,24 @@ if backlogdb then
   if not file_exists(backlogdb) then
     touch(backlogdb)
   end  
   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: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  
 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: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")
 end
 
 if web_url then
   http = require("socket.http")
-  socket = require("socket")
+  http.TIMEOUT = web_timeout
 end
 
 if mqtt_host then
 end
 
 if mqtt_host then