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:
parent
63458efe13
commit
1344193a82
@ -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
|
||||||
|
@ -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:
|
||||||
|
<a href="/channellist.lua?select=json">JSON</a>
|
||||||
|
<a href="/channellist.lua?select=m3u">M3U</a>
|
||||||
|
<br/>
|
||||||
|
Transponder List:
|
||||||
|
<a href="/channellist.lua?select=tl">Current</a>
|
||||||
|
<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>
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
data = data:sub(1,i-1)
|
||||||
|
else
|
||||||
|
data = nil
|
||||||
|
end
|
||||||
|
|
||||||
local file = io.open("/tmp/"..filename,"w")
|
if data then
|
||||||
if file then
|
local file = io.open("/tmp/"..filename,"w")
|
||||||
|
if file then
|
||||||
file:write(data)
|
file:write(data)
|
||||||
file:close()
|
file:close()
|
||||||
end
|
end
|
||||||
|
|
||||||
if string.match(filename,"%.tar%.gz$") then
|
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 -");
|
os.execute("rm -rf /config/channels;mkdir /config/channels;cd /config/channels;gunzip -c /tmp/"..filename.."|tar -xf -");
|
||||||
elseif string.match(filename,"%.zip$") then
|
elseif string.match(filename,"%.zip$") then
|
||||||
os.execute("rm -rf /config/channels;mkdir /config/channels;cd /config/channels;unzip -q /tmp/"..filename);
|
os.execute("rm -rf /config/channels;mkdir /config/channels;cd /config/channels;unzip -q /tmp/"..filename);
|
||||||
end
|
end
|
||||||
|
|
||||||
os.remove("/tmp/"..filename)
|
os.remove("/tmp/"..filename)
|
||||||
|
end
|
||||||
|
|
||||||
-- TODO validate
|
-- TODO validate
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user