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
|
||||
end
|
||||
|
||||
function CreateJSON(host)
|
||||
function CreateJSON()
|
||||
local data = nil
|
||||
local file = io.open("/config/ChannelList.json")
|
||||
if file then
|
||||
@ -130,9 +130,26 @@ function CreateJSON(host)
|
||||
return data
|
||||
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()
|
||||
local db = require("DataBase")
|
||||
local SourceList = {}
|
||||
local f,c
|
||||
|
||||
for _,f in ipairs(db.SourceList) do
|
||||
f.ChannelList = {}
|
||||
@ -160,7 +177,15 @@ if method == "GET" then
|
||||
elseif string.match(query,"select=json") then
|
||||
filename = "ChannelList.json"
|
||||
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
|
||||
|
||||
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>
|
||||
<head>
|
||||
<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("StatusButton").disabled = disabled;
|
||||
document.getElementById("DeleteButton").disabled = disabled;
|
||||
document.getElementById("DeleteAllButton").disabled = disabled;
|
||||
document.getElementById("RestoreButton").disabled = disabled;
|
||||
document.getElementById("UploadButton").disabled = disabled;
|
||||
}
|
||||
|
||||
|
||||
@ -169,6 +171,16 @@ function ScanStatus(response)
|
||||
else
|
||||
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" )
|
||||
{
|
||||
done = false;
|
||||
@ -236,11 +248,12 @@ function PollStatus()
|
||||
GetStatus();
|
||||
}
|
||||
|
||||
function DeleteScan()
|
||||
function DeleteScan(all)
|
||||
{
|
||||
DisableButtons(true);
|
||||
ScanReq.open("POST", "/channelscan.lua", true);
|
||||
ScanReq.setRequestHeader("Content-type","application/x-www-form-urlencoded");
|
||||
ScanReq.send("select=delete");
|
||||
ScanReq.send("select=delete" + (all ? "&all=true" : ""));
|
||||
}
|
||||
|
||||
function RestoreScan()
|
||||
@ -251,15 +264,32 @@ function RestoreScan()
|
||||
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>
|
||||
|
||||
</head>
|
||||
<body onload="OnLoad()">
|
||||
|
||||
<table class="maintable" align="center">
|
||||
<table class="maintable">
|
||||
<colgroup>
|
||||
<col width="182px"/>
|
||||
<col width="728px"/>
|
||||
<col style="width: 182px"/>
|
||||
<col style="width: 728px"/>
|
||||
</colgroup>
|
||||
<tr><td class="maintd" colspan="2">
|
||||
<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">
|
||||
<div>
|
||||
<!-- Begin Content -->
|
||||
<table cellpadding="2px" align="center">
|
||||
<table cellpadding="2px" class="center-div">
|
||||
<tr id="trCable" style="display:none">
|
||||
<td>Cable</td>
|
||||
<td style="text-align:right">
|
||||
@ -342,10 +372,34 @@ function RestoreScan()
|
||||
</form>
|
||||
</td>
|
||||
</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>
|
||||
<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/>
|
||||
<table cellpadding="2px" align="center">
|
||||
<h4 style="text-align: center">Old Format Lists</h4>
|
||||
<table cellpadding="2px" class="center-div">
|
||||
<tr>
|
||||
<td>System Channel Database</td>
|
||||
<td>
|
||||
|
@ -34,6 +34,11 @@ function SendError(err,desc)
|
||||
end
|
||||
end
|
||||
|
||||
function perr(s)
|
||||
io.stderr:write(tostring(s).."\n")
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
local newdecoder = require("lunajson.decoder")
|
||||
local newencoder = require("lunajson.encoder")
|
||||
@ -55,6 +60,75 @@ local function LoadTransponderList()
|
||||
return tl
|
||||
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 q,v
|
||||
local params = ""
|
||||
@ -139,7 +213,7 @@ local function Status()
|
||||
return data
|
||||
end
|
||||
|
||||
local function Delete()
|
||||
local function Delete(params)
|
||||
local data = nil
|
||||
local rc = os.execute("mkdir /tmp/doscan.lock")
|
||||
if rc ~= 0 then
|
||||
@ -147,6 +221,9 @@ local function Delete()
|
||||
else
|
||||
data = '{"status":"deleted"}'
|
||||
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 -rf /tmp/doscan.lock");
|
||||
end
|
||||
@ -171,6 +248,70 @@ local function Restore()
|
||||
return data
|
||||
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 contenttype = "application/json; charset=utf-8"
|
||||
local data = nil
|
||||
@ -184,6 +325,8 @@ elseif method == "POST" and clength and ctype then
|
||||
local query = io.read(tonumber(clength))
|
||||
query = string.gsub(query,"\r","")
|
||||
cmd,params = GetCMD(query)
|
||||
elseif ctype:match("multipart/form%-data") then
|
||||
cmd = "upload"
|
||||
end
|
||||
else
|
||||
SendError("500","What")
|
||||
@ -197,9 +340,11 @@ elseif cmd == "scan" then
|
||||
elseif cmd == "status" then
|
||||
data = Status()
|
||||
elseif cmd == "delete" then
|
||||
data = Delete()
|
||||
data = Delete(params)
|
||||
elseif cmd == "restore" then
|
||||
data = Restore()
|
||||
elseif cmd == "upload" then
|
||||
data = Upload()
|
||||
end
|
||||
|
||||
if data then
|
||||
|
@ -48,7 +48,7 @@ if not string.match(ctype,"multipart/form%-data") then
|
||||
return
|
||||
end
|
||||
|
||||
local boundary = string.match(ctype,"boundary=(.*)")
|
||||
local boundary = string.match(ctype,"boundary=(.*)")
|
||||
if not boundary then
|
||||
SendError("404","???")
|
||||
return
|
||||
@ -66,25 +66,32 @@ while true do
|
||||
end
|
||||
|
||||
data = io.stdin:read("*a")
|
||||
data = string.sub(data,1,#data - #boundary - 4)
|
||||
|
||||
local file = io.open("/tmp/"..filename,"w")
|
||||
if file then
|
||||
file:write(data)
|
||||
file:close()
|
||||
local i = data:find("--"..boundary,1,true)
|
||||
if i then
|
||||
data = data:sub(1,i-1)
|
||||
else
|
||||
data = nil
|
||||
end
|
||||
|
||||
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
|
||||
if data then
|
||||
local file = io.open("/tmp/"..filename,"w")
|
||||
if file then
|
||||
file:write(data)
|
||||
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
|
||||
|
||||
http_print(proto.." 303")
|
||||
http_print("Location: http://"..host.."/reboot.html")
|
||||
http_print()
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user