summaryrefslogtreecommitdiffstats
path: root/weblog-model.lua
diff options
context:
space:
mode:
Diffstat (limited to 'weblog-model.lua')
-rw-r--r--weblog-model.lua111
1 files changed, 73 insertions, 38 deletions
diff --git a/weblog-model.lua b/weblog-model.lua
index ba4df26..d8d28ee 100644
--- a/weblog-model.lua
+++ b/weblog-model.lua
@@ -183,8 +183,7 @@ local importlogentry = function(entry, sourcename)
if entry then
local sql = string.format("INSERT INTO weblog VALUES ('%s', '%s', '%s', '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s')",
escape(sourcename), escape(entry.clientip), escape(entry.clientuserid, 64):lower(),
- escape(entry.logdatetime), escape(entry.URL), escape(entry.bytes), escape(entry.reason), escape(entry.score), escape(entry.shortreason), escape(entry.badyesno), escape(entry.deniedyesno), escape(entry.bypassyesno), escape(entry.wordloc), escape(entry.goodwordloc))
-
+ escape(entry.logdatetime), escape(entry.URL), escape(entry.bytes), escape(entry.reason), escape(entry.score or "0"), escape(entry.shortreason), escape(entry.badyesno or "0"), escape(entry.deniedyesno or "0"), escape(entry.bypassyesno or "0"), escape(entry.wordloc), escape(entry.goodwordloc))
local res = assert (con:execute(sql))
end
end
@@ -237,7 +236,7 @@ local addtowatchlist = function()
local watchdays = config.watchdays or 14
local sql = "insert into watchlist select clientuserid, " ..
"(max(logdatetime) + INTERVAL '"..watchdays.." days') as expiredatetime " ..
- "from weblog where bypassyesno > '0' group by clientuserid"
+ "from weblog where deniedyesno > '0' group by clientuserid"
local res1 = assert (con:execute(sql))
sql = "delete from watchlist where exists " ..
"(select * from watchlist w where w.clientuserid = watchlist.clientuserid " ..
@@ -425,6 +424,25 @@ local listpubweblogentries = function(...)
return listlogentries(...)
end
+local groupdeniedlogentries = function(starttime, endtime, groupby)
+ groupby = groupby or "clientuserid"
+ local entries = {}
+ -- retrieve a cursor
+ local sql = "SELECT "..groupby..", count(*) AS numblock, max(score) AS maxscore FROM pubweblog"
+ sql = sql .. generatewhereclause(nil, starttime, endtime) .. " AND deniedyesno > '0'"
+ sql = sql .. " GROUP BY "..groupby.. " ORDER BY numblock DESC"
+ cur = assert (con:execute(sql))
+ row = cur:fetch ({}, "a")
+ while row do
+ entries[#entries+1] = {numblock=row.numblock, maxscore=row.maxscore}
+ entries[#entries][groupby] = row[groupby]
+ row = cur:fetch (row, "a")
+ end
+ -- close everything
+ cur:close()
+ return entries
+end
+
local listusagestats = function()
local entries = {}
-- retrieve a cursor
@@ -504,13 +522,10 @@ end
-- LOG FILE FUNCTIONS
local function checkwords(logentry)
- local goodwordloc=""
- local badwordloc=""
+ local goodwordloc={}
+ local badwordloc={}
local wrdcnt=0
local isbad=0
- local isdenied=0
- local isbypass=0
- local ignoreme=false
--check for ignored records first
for i,thisline in ipairs(ignorewords) do
@@ -519,12 +534,12 @@ local function checkwords(logentry)
end
_,instcnt = string.lower(logentry.URL):gsub(thisline, " ")
if instcnt ~= 0 then
- ignoreme = true
+ logentry.ignoreme = true
break
end
end
- if ignoreme ~= true then
+ if not logentry.ignoreme then
--proceed with record analysis
for i,thisline in ipairs(badwords) do
if not thisline then
@@ -532,29 +547,23 @@ local function checkwords(logentry)
end
_,instcnt = string.lower(logentry.URL):gsub(thisline, " ")
- --if string.find(logentry.URL,thisline) ~= nil then
if instcnt ~= 0 then
-- logme("instcnt = "..instcnt)
isbad=1
wrdcnt= wrdcnt + instcnt
- if badwordloc ~= "" then
- badwordloc = badwordloc.."|"..thisline
- else
- badwordloc=thisline
- end
- end
-
- if string.find(logentry.URL,"*DENIED*") then
- -- logme("*Denied*")
- isdenied=1
- elseif string.find(logentry.URL,"GBYPASS") then
- -- logme("GBYPASS")
- isbypass=1
- elseif string.find(logentry.URL,"*OVERRIDE*") then
- -- logme("*OVERRIDE*")
- isbypass=1
+ badwordloc[#badwordloc+1] = thisline
end
end
+ if string.find(logentry.URL,"*DENIED*") then
+ -- logme("*Denied*")
+ logentry.deniedyesno=1
+ elseif string.find(logentry.URL,"GBYPASS") then
+ -- logme("GBYPASS")
+ logentry.bypassyesno=1
+ elseif string.find(logentry.URL,"*OVERRIDE*") then
+ -- logme("*OVERRIDE*")
+ logentry.bypassyesno=1
+ end
for i,goodline in ipairs(goodwords) do
if not goodline then
break
@@ -562,14 +571,12 @@ local function checkwords(logentry)
_,instcnt = string.lower(logentry.URL):gsub(goodline, " ")
--if string.find(logentry.URL,goodline) then
if instcnt ~= 0 then
- if wrdcnt ~= 0 then
+ if wrdcnt >= instcnt then
wrdcnt = wrdcnt - instcnt
- if goodwordloc ~= "" then
- goodwordloc = goodwordloc.."|"..goodline
- else
- goodwordloc = goodline
- end
+ else
+ wrdcnt = 0
end
+ goodwordloc[#goodwordloc+1] = goodline
end
end
end
@@ -580,10 +587,8 @@ local function checkwords(logentry)
logentry.score=wrdcnt
logentry.badyesno=isbad
- logentry.deniedyesno=isdenied
- logentry.bypassyesno=isbypass
- logentry.wordloc=badwordloc
- logentry.gwordloc=goodwordloc
+ logentry.wordloc=table.concat(badwordloc,"|")
+ logentry.gwordloc=table.concat(goodwordloc,"|")
end
local function parsesquidlog(line)
@@ -628,7 +633,8 @@ local function parsedglog(line)
reason=words[5],
method=words[6],
bytes=words[7],
- shortreason=words[9]}
+ shortreason=words[9],
+ deniedyesno=1}
checkwords(logentry)
@@ -1292,6 +1298,35 @@ function getusagestats()
return retval
end
+function getauditstats()
+ local result = {}
+ result.auditstart = cfe({ value=config.auditstart or "", label="Audit Start Time" })
+ result.auditend = cfe({ value=config.auditend or "", label="Audit End Time" })
+ result.groupby = cfe({ value=config.groupby or "clientuserid", label="Group By" })
+ result.stats = cfe({ type="list", value={}, label="Audit Block Statistics" })
+ local res, err = pcall(function()
+ if config.auditstart ~= "" and config.auditend ~= "" then
+ databaseconnect(DatabaseUser)
+ result.stats.value = groupdeniedlogentries(config.auditstart, config.auditend, result.groupby.value) or {}
+ databasedisconnect()
+ end
+ end)
+ return cfe({ type="group", value=result, errtxt=err, label="Weblog Audit Statistics" })
+end
+
+function completeaudit(timestamp)
+ local conf = getconfig()
+ conf.value.auditstart.value = conf.value.auditend.value
+ local now = os.time()
+ conf.value.auditend.value = timestamp or os.date("%Y-%m-%d %H:%M:%S", now - now%86400 - 86400)
+ conf = updateconfig(conf)
+ local retval = cfe({ value="Audit completed", label="Complete Audit Result" })
+ if conf.errtxt then
+ retval.value = ""
+ retval.errtxt = "Failed to complete audit\n"..conf.errtxt.."\n"..conf.value.auditend.errtxt
+ end
+ return retval
+end
function getconfig()
local result = {}