1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
-- Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
-- Licensed under the Apache License, Version 2.0
module("luci.controller.privoxy", package.seeall)
local NX = require "nixio"
local NXFS = require "nixio.fs"
local HTTP = require "luci.http"
local UCI = require "luci.model.uci"
local UTIL = require "luci.util"
local SYS = require "luci.sys"
PRIVOXY_MIN = "3.0.22-0" -- minimum version of service required
function index()
entry( {"admin", "services", "privoxy"}, cbi("privoxy"), _("Privoxy WEB proxy"), 59)
entry( {"admin", "services", "privoxy", "logview"}, call("logread") ).leaf = true
entry( {"admin", "services", "privoxy", "startstop"}, call("startstop") ).leaf = true
entry( {"admin", "services", "privoxy", "status"}, call("get_pid") ).leaf = true
end
-- called by XHR.get from detail_logview.htm
function logread()
-- read application settings
local uci = UCI.cursor()
local logdir = uci:get("privoxy", "privoxy", "logdir") or "/var/log"
local logfile = uci:get("privoxy", "privoxy", "logfile") or "privoxy.log"
uci:unload("privoxy")
local lfile=logdir .. "/" .. logfile
local ldata=NXFS.readfile(lfile)
if not ldata or #ldata == 0 then
ldata="_nodata_"
end
HTTP.write(ldata)
end
-- called by XHR.get from detail_startstop.htm
function startstop()
local pid = get_pid(true)
if pid > 0 then
SYS.call("/etc/init.d/privoxy stop")
NX.nanosleep(1) -- sleep a second
if NX.kill(pid, 0) then -- still running
NX.kill(pid, 9) -- send SIGKILL
end
pid = 0
else
SYS.call("/etc/init.d/privoxy start")
NX.nanosleep(1) -- sleep a second
pid = tonumber(NXFS.readfile("/var/run/privoxy.pid") or 0 )
if pid > 0 and not NX.kill(pid, 0) then
pid = 0 -- process did not start
end
end
HTTP.write(tostring(pid)) -- HTTP needs string not number
end
-- called by XHR.poll from detail_startstop.htm
-- and from lua (with parameter "true")
function get_pid(from_lua)
local pid = tonumber(NXFS.readfile("/var/run/privoxy.pid") or 0 )
if pid > 0 and not NX.kill(pid, 0) then
pid = 0
end
if from_lua then
return pid
else
HTTP.write(tostring(pid)) -- HTTP needs string not number
end
end
-- compare versions using "<=" "<" ">" ">=" "=" "<<" ">>"
function ipkg_ver_compare(ver1, comp, ver2)
if not ver1 or not (#ver1 > 0)
or not ver2 or not (#ver2 > 0)
or not comp or not (#comp > 0) then return nil end
-- correct compare string
if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~="
elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<="
elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">="
elseif comp == "=" or comp == "==" then comp = "=="
elseif comp == "<<" then comp = "<"
elseif comp == ">>" then comp = ">"
else return nil end
local av1 = UTIL.split(ver1, "[%.%-]", nil, true)
local av2 = UTIL.split(ver2, "[%.%-]", nil, true)
for i = 1, math.max(table.getn(av1),table.getn(av2)), 1 do
local s1 = av1[i] or ""
local s2 = av2[i] or ""
local n1 = tonumber(s1)
local n2 = tonumber(s2)
-- one numeric and other empty string then set other to 0
if n1 and not n2 and (not s2 or #s2 == 0) then n2 = 0 end
if n2 and not n1 and (not s1 or #s1 == 0) then n1 = 0 end
local nc = (n1 and n2) -- numeric compare
if nc then
-- first "not equal" found return true
if comp == "~=" and (n1 ~= n2) then return true end
-- first "lower" found return true
if (comp == "<" or comp == "<=") and (n1 < n2) then return true end
-- first "greater" found return true
if (comp == ">" or comp == ">=") and (n1 > n2) then return true end
-- not equal then return false
if (n1 ~= n2) then return false end
else
if comp == "~=" and (s1 ~= s2) then return true end
if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
if (s1 ~= s2) then return false end
end
end
-- all equal then true
return true
end
-- read version information for given package if installed
function ipkg_ver_installed(pkg)
local version = nil
local control = io.open("/usr/lib/opkg/info/%s.control" % pkg, "r")
if control then
local ln
repeat
ln = control:read("*l")
if ln and ln:match("^Version: ") then
version = ln:gsub("^Version: ", "")
break
end
until not ln
control:close()
end
return version
end
-- replacement of build-in Flag.parse of cbi.lua
-- modified to mark section as changed if value changes
-- current parse did not do this, but it is done AbstaractValue.parse()
function flag_parse(self, section)
local fexists = self.map:formvalue(
luci.cbi.FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option)
if fexists then
local fvalue = self:formvalue(section) and self.enabled or self.disabled
local cvalue = self:cfgvalue(section)
if fvalue ~= self.default or (not self.optional and not self.rmempty) then
self:write(section, fvalue)
else
self:remove(section)
end
if (fvalue ~= cvalue) then self.section.changed = true end
else
self:remove(section)
self.section.changed = true
end
end
|