Транзакционная работа с БД для избежания блокировок.
[weathermon.git] / lib / wm_util.lua
1 #!/usr/bin/lua
2
3 local socket = require "socket"
4 local lfs = require "lfs"
5 local uci = require "uci"
6 local posix = require "posix"
7
8 function startswith(String,Start)
9    if String then
10      return string.sub(String,1,string.len(Start))==Start
11    else
12      return False
13    end    
14 end
15
16 function trim(s)
17    return (s:gsub("^%s*(.-)%s*$", "%1"))
18 end
19
20 function url_decode(str)
21   if not str then return nil end
22   str = string.gsub (str, "+", " ")
23   str = string.gsub (str, "%%(%x%x)", function(h) return
24     string.char(tonumber(h,16)) end)
25   str = string.gsub (str, "\r\n", "\n")
26   return str
27 end
28
29 function url_encode(str)
30   if (str) then
31     str = string.gsub (str, "\n", "\r\n")
32     str = string.gsub (str, "([^%w %-%_%.%~])",
33         function (c) return string.format ("%%%02X", string.byte(c)) end)
34     str = string.gsub (str, " ", "+")
35   end
36   return str    
37 end
38
39 function capture(cmd, raw)
40   local f = assert(io.popen(cmd, 'r'))
41   local s = assert(f:read('*a'))
42   f:close()
43   if raw then return s end
44   s = string.gsub(s, '^%s+', '')
45   s = string.gsub(s, '%s+$', '')
46   s = string.gsub(s, '[\n\r]+', ' ')
47   return s
48 end
49
50 function mqtt_encode(str)
51   if (str) then
52     str = string.gsub (str, "\n", "")
53     str = string.gsub (str, "/", "-")
54   end
55   return str    
56 end
57
58 function touch(name)
59   local file = io.open(name, 'a')
60   file:close()
61 end
62
63 function write_file(name,data)
64   pcall(function ()
65     local f = io.open(name,"w")
66     io.output(f)
67     io.write(data)
68     io.close(f)
69   end)
70 end
71
72 function file_exists(name)
73    local f=io.open(name,"r")
74    if f~=nil then io.close(f) return true else return false end
75 end
76
77 function get_file_content(name)
78   local f = io.open(name,"r")
79   if f ~= nil then 
80     local content = trim(f:read("*all"))
81     io.close(f) 
82     return content
83   else 
84     return false 
85   end
86 end
87
88 function sleep(sec)
89   socket.sleep(sec)
90 end
91
92 function split(s, delimiter)
93     local result = {};
94     for match in (s..delimiter):gmatch("(.-)"..delimiter) do
95         result[#result+1] = match
96     end
97     return result;
98 end
99
100 function list_dir(name)
101     local result = {}
102     for name in lfs.dir(name) do
103         if not startswith(name,".") then
104           result[#result+1] = name
105         end  
106     end
107     return result
108 end
109
110 function get_devid(config)
111
112   local web_devid = uci.get(config,"web","devid")
113   
114   if web_devid then
115     return web_devid
116   end  
117     
118   web_iface = uci.get(config,"web","iface")
119   
120   if not web_iface then
121     web_iface = list_dir('/sys/class/net/')[1]
122   end
123  
124   io.input("/sys/class/net/"..web_iface.."/address")
125
126   local web_devid = io.read("*line")
127   return web_devid:gsub(":",""):upper()
128
129 end
130
131 function get_children()
132
133   local pid = posix.getpid()
134   local pidlist = list_dir('/proc')
135   local pids = {}
136
137   for k,v in pairs(pidlist) do
138
139     pcall( function ()
140       local stats = get_file_content('/proc/'..v..'/stat')
141       local ppid = tonumber(split(stats,' ')[4])
142       if pid == ppid then
143         pids[#pids+1] = tonumber(v)
144       end 
145     end)
146
147   end
148
149   return pids
150
151 end