1
0
mirror of https://github.com/DigitalDevices/octonet.git synced 2023-10-10 13:36:52 +02:00

up and download new JSON channel and transponder lists

Also some improvement on boundary handling on old uploader
This commit is contained in:
mvoelkel 2016-01-25 16:15:59 +01:00
parent 63458efe13
commit 1344193a82
4 changed files with 257 additions and 26 deletions

View File

@ -118,7 +118,7 @@ function Legacy2JSON()
return data return data
end end
function CreateJSON(host) function CreateJSON()
local data = nil local data = nil
local file = io.open("/config/ChannelList.json") local file = io.open("/config/ChannelList.json")
if file then if file then
@ -130,9 +130,26 @@ function CreateJSON(host)
return data return data
end end
function TransponderList(user)
local data = nil
local file
if user then
file = io.open("/config/TransponderList.json","r")
end
if not file then
file = io.open("/var/channels/TransponderList.json","r")
end
if file then
data = file:read("*a")
file:close()
end
return data
end
function LoadSourceList() function LoadSourceList()
local db = require("DataBase") local db = require("DataBase")
local SourceList = {} local SourceList = {}
local f,c
for _,f in ipairs(db.SourceList) do for _,f in ipairs(db.SourceList) do
f.ChannelList = {} f.ChannelList = {}
@ -160,7 +177,15 @@ if method == "GET" then
elseif string.match(query,"select=json") then elseif string.match(query,"select=json") then
filename = "ChannelList.json" filename = "ChannelList.json"
contenttype = "application/json; charset=utf-8" contenttype = "application/json; charset=utf-8"
data = CreateJSON(host) data = CreateJSON()
elseif string.match(query,"select=stl") then
filename = "TransponderList.json"
contenttype = "application/json; charset=utf-8"
data = TransponderList(false)
elseif string.match(query,"select=tl") then
filename = "TransponderList.json"
contenttype = "application/json; charset=utf-8"
data = TransponderList(true)
end end
if data then if data then

View File

@ -1,4 +1,4 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <!DOCTYPE HTML>
<html> <html>
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
@ -107,7 +107,9 @@ function DisableButtons(disabled)
document.getElementById("ScanButton").disabled = disabled; document.getElementById("ScanButton").disabled = disabled;
document.getElementById("StatusButton").disabled = disabled; document.getElementById("StatusButton").disabled = disabled;
document.getElementById("DeleteButton").disabled = disabled; document.getElementById("DeleteButton").disabled = disabled;
document.getElementById("DeleteAllButton").disabled = disabled;
document.getElementById("RestoreButton").disabled = disabled; document.getElementById("RestoreButton").disabled = disabled;
document.getElementById("UploadButton").disabled = disabled;
} }
@ -169,6 +171,16 @@ function ScanStatus(response)
else else
document.getElementById("scantext").firstChild.nodeValue = "Previous channel list restored"; document.getElementById("scantext").firstChild.nodeValue = "Previous channel list restored";
} }
else if( s.status == "error" )
{
document.getElementById("scancount").firstChild.nodeValue = "Error";
document.getElementById("scantext").firstChild.nodeValue = s.msg;
}
else if( s.status == "updated" )
{
document.getElementById("scancount").firstChild.nodeValue = "\u00A0";
document.getElementById("scantext").firstChild.nodeValue = s.msg + " updated";
}
else if( s.status == "retry" ) else if( s.status == "retry" )
{ {
done = false; done = false;
@ -236,11 +248,12 @@ function PollStatus()
GetStatus(); GetStatus();
} }
function DeleteScan() function DeleteScan(all)
{ {
DisableButtons(true); DisableButtons(true);
ScanReq.open("POST", "/channelscan.lua", true);
ScanReq.setRequestHeader("Content-type","application/x-www-form-urlencoded"); ScanReq.setRequestHeader("Content-type","application/x-www-form-urlencoded");
ScanReq.send("select=delete"); ScanReq.send("select=delete" + (all ? "&all=true" : ""));
} }
function RestoreScan() function RestoreScan()
@ -251,15 +264,32 @@ function RestoreScan()
ScanReq.send("select=restore"); ScanReq.send("select=restore");
} }
function Uploader(event)
{
event.preventDefault();
document.getElementById("scancount").firstChild.nodeValue = "\u00A0";
document.getElementById("scantext").firstChild.nodeValue = "\u00A0";
var fileSelect = document.getElementById("UploadList");
if( fileSelect.files.length > 0 )
{
var formData = new FormData();
formData.append('filename', fileSelect.files[0], fileSelect.files[0].name)
DisableButtons(true);
ScanReq.open("POST", "/channelscan.lua", true);
ScanReq.send(formData);
}
}
</script> </script>
</head> </head>
<body onload="OnLoad()"> <body onload="OnLoad()">
<table class="maintable" align="center"> <table class="maintable">
<colgroup> <colgroup>
<col width="182px"/> <col style="width: 182px"/>
<col width="728px"/> <col style="width: 728px"/>
</colgroup> </colgroup>
<tr><td class="maintd" colspan="2"> <tr><td class="maintd" colspan="2">
<a href="http://www.digitaldevices.de"><img src="/BannerDD.jpg" alt="DD" width="910" height="130" /></a> <a href="http://www.digitaldevices.de"><img src="/BannerDD.jpg" alt="DD" width="910" height="130" /></a>
@ -270,7 +300,7 @@ function RestoreScan()
<td class="content"> <td class="content">
<div> <div>
<!-- Begin Content --> <!-- Begin Content -->
<table cellpadding="2px" align="center"> <table cellpadding="2px" class="center-div">
<tr id="trCable" style="display:none"> <tr id="trCable" style="display:none">
<td>Cable</td> <td>Cable</td>
<td style="text-align:right"> <td style="text-align:right">
@ -342,10 +372,34 @@ function RestoreScan()
</form> </form>
</td> </td>
</tr> </tr>
<tr>
<td colspan="2" style="text-align:right">
<form action="" method="post" enctype="multipart/form-data" onsubmit="Uploader(event)">
<input id="UploadList" type="file" name="filename" value="*.json" size="30" accept=".json">
<input id="UploadButton" type="submit" value="Upload">
</form>
</td>
</tr>
</table> </table>
<hr/>
<div style="text-align: center">
<h4>Downloads</h4>
Channel List:
&nbsp;<a href="/channellist.lua?select=json">JSON</a>
&nbsp;<a href="/channellist.lua?select=m3u">M3U</a>
<br/>
Transponder List:
&nbsp;<a href="/channellist.lua?select=tl">Current</a>
&nbsp;<a href="/channellist.lua?select=stl">Default</a>
<br/>
<form action="">
<input id="DeleteAllButton" type="Button" value="Delete All" onclick="DeleteScan(true)" >
</form>
</div>
<hr/> <hr/>
<table cellpadding="2px" align="center"> <h4 style="text-align: center">Old Format Lists</h4>
<table cellpadding="2px" class="center-div">
<tr> <tr>
<td>System Channel Database</td> <td>System Channel Database</td>
<td> <td>

View File

@ -34,6 +34,11 @@ function SendError(err,desc)
end end
end end
function perr(s)
io.stderr:write(tostring(s).."\n")
end
-- --
local newdecoder = require("lunajson.decoder") local newdecoder = require("lunajson.decoder")
local newencoder = require("lunajson.encoder") local newencoder = require("lunajson.encoder")
@ -55,6 +60,75 @@ local function LoadTransponderList()
return tl return tl
end end
local function CheckTransponderList(tl)
local i,Source
for i,Source in ipairs(tl.SourceList) do
if not Source.Title then
error("SourceList["..i.."].Title missing",0)
end
if not Source.Key then
error("SourceList["..i.."].Key missing",0)
end
if not Source.DVBType then
error("SourceList["..i.."].DVBType missing",0)
end
if not Source.TransponderList then
error("SourceList["..i.."].TransponderList missing",0)
end
local j,Transponder
for j,Transponder in ipairs(Source.TransponderList) do
if not Transponder.Request then
error("SourceList["..i.."].TransponderList["..j.."].Request missing",0)
end
end
end
if tl.CIMapList then
local CIMap
for i,CIMap in ipairs(tl.CIMapList) do
if not CIMap.Slot then
error("CIMapList["..i.."].Slot missing",0)
end
end
end
if tl.ChannelOverwriteList then
local ChannelOverwrite
for i,ChannelOverwrite in ipairs(tl.ChannelOverwriteList) do
if not ChannelOverwrite.ID then
error("ChannelOverwriteList["..i.."].ID missing",0)
end
end
end
if tl.GroupList then
local Group
for i,Group in ipairs(tl.GroupList) do
if not Group.Title then
error("GroupList["..i.."].Title missing",0)
end
end
end
return "TransponderList.json"
end
local function CheckChannelList(cl)
local i,Group
for i,Group in ipairs(cl.GroupList) do
if not Group.Title then
error("GroupList["..i.."].Title missing",0)
end
local j,Channel
for j,Channel in ipairs(Group.ChannelList) do
if not Channel.Title then
error("GroupList["..i.."].ChannelList["..j.."].Title missing",0)
end
if not Channel.Request then
error("GroupList["..i.."].ChannelList["..j.."].Request missing",0)
end
end
end
return "ChannelList.json"
end
local function GetCMD(s) local function GetCMD(s)
local q,v local q,v
local params = "" local params = ""
@ -139,7 +213,7 @@ local function Status()
return data return data
end end
local function Delete() local function Delete(params)
local data = nil local data = nil
local rc = os.execute("mkdir /tmp/doscan.lock") local rc = os.execute("mkdir /tmp/doscan.lock")
if rc ~= 0 then if rc ~= 0 then
@ -147,6 +221,9 @@ local function Delete()
else else
data = '{"status":"deleted"}' data = '{"status":"deleted"}'
os.execute("rm /config/ChannelList.json"); os.execute("rm /config/ChannelList.json");
if params == " all=true" then
os.execute("rm /config/TransponderList.json");
end
os.execute("rm /tmp/doscan.msg"); os.execute("rm /tmp/doscan.msg");
os.execute("rm -rf /tmp/doscan.lock"); os.execute("rm -rf /tmp/doscan.lock");
end end
@ -171,6 +248,70 @@ local function Restore()
return data return data
end end
local function Upload()
local data = nil
local rc = os.execute("mkdir /tmp/doscan.lock")
if rc ~= 0 then
data = '{"status":"busy"}'
else
local boundary = string.match(ctype,"boundary=(.*)")
if boundary then
while true do
local line = io.stdin:read()
line = string.gsub(line,"\r","")
if line == "" then break end
end
local filedata = io.stdin:read("*a")
local i = filedata:find("--"..boundary,1,true)
if i then
filedata = filedata:sub(1,i-1)
else
filedata = "{}"
end
local decode = newdecoder()
local rc,json = pcall(decode,filedata)
if rc then
rc = false
local msg = "invalid list"
if json.SourceList then
rc,msg = pcall(CheckTransponderList,json)
data = '{"status":"updated", "msg":"Transponder list"}'
elseif json.GroupList then
rc,msg = pcall(CheckChannelList,json)
end
if rc then
local f = io.open("/config/"..msg,"w+")
if f then
f:write(filedata)
f:close()
data = '{"status":"updated", "msg":"'..msg..'"}'
else
data = '{"status":"error", "msg":"'..msg..' not saved"}'
end
else
data = '{"status":"error", "msg":"'..msg..'"}'
end
else
local msg = "unknown error"
if json then
msg = json:match(".-: (.*)")
end
data = '{"status":"error", "msg":"'..msg..'"}'
end
else
data = '{"status":"error","msg":"malformed request"}'
end
os.execute("rm /tmp/doscan.msg");
os.execute("rm -rf /tmp/doscan.lock");
end
return data
end
local filename = nil local filename = nil
local contenttype = "application/json; charset=utf-8" local contenttype = "application/json; charset=utf-8"
local data = nil local data = nil
@ -184,6 +325,8 @@ elseif method == "POST" and clength and ctype then
local query = io.read(tonumber(clength)) local query = io.read(tonumber(clength))
query = string.gsub(query,"\r","") query = string.gsub(query,"\r","")
cmd,params = GetCMD(query) cmd,params = GetCMD(query)
elseif ctype:match("multipart/form%-data") then
cmd = "upload"
end end
else else
SendError("500","What") SendError("500","What")
@ -197,9 +340,11 @@ elseif cmd == "scan" then
elseif cmd == "status" then elseif cmd == "status" then
data = Status() data = Status()
elseif cmd == "delete" then elseif cmd == "delete" then
data = Delete() data = Delete(params)
elseif cmd == "restore" then elseif cmd == "restore" then
data = Restore() data = Restore()
elseif cmd == "upload" then
data = Upload()
end end
if data then if data then

View File

@ -66,21 +66,28 @@ while true do
end end
data = io.stdin:read("*a") data = io.stdin:read("*a")
data = string.sub(data,1,#data - #boundary - 4) local i = data:find("--"..boundary,1,true)
if i then
local file = io.open("/tmp/"..filename,"w") data = data:sub(1,i-1)
if file then else
file:write(data) data = nil
file:close()
end end
if string.match(filename,"%.tar%.gz$") then if data then
os.execute("rm -rf /config/channels;mkdir /config/channels;cd /config/channels;gunzip -c /tmp/"..filename.."|tar -xf -"); local file = io.open("/tmp/"..filename,"w")
elseif string.match(filename,"%.zip$") then if file then
os.execute("rm -rf /config/channels;mkdir /config/channels;cd /config/channels;unzip -q /tmp/"..filename); file:write(data)
end file:close()
end
os.remove("/tmp/"..filename) if string.match(filename,"%.tar%.gz$") then
os.execute("rm -rf /config/channels;mkdir /config/channels;cd /config/channels;gunzip -c /tmp/"..filename.."|tar -xf -");
elseif string.match(filename,"%.zip$") then
os.execute("rm -rf /config/channels;mkdir /config/channels;cd /config/channels;unzip -q /tmp/"..filename);
end
os.remove("/tmp/"..filename)
end
-- TODO validate -- TODO validate