Files
FSE-Ticket.sys/installer_bi.lua
T
Henry_Du 07e4200c17 feat(web,backend,lua,installer): 新增Lua脚本版本管理功能及相关优化
- 升级售票机、检票机内置Lua脚本版本至v1.5.8
- 新增后端配置的lua_versions字段,统一管理售票机、检票机的Lua脚本版本
- 前端新增版本管理配置页面,支持版本号配置和一键补丁升级
- 为售票机、检票机添加远程版本检测功能,屏幕显示版本匹配状态标记
- 简化installer配置交互流程,优化站点代码输入方式
- 重构后端配置规范化处理逻辑,统一配置初始化与存储流程
- 优化售票机外设检测、支付检测逻辑,修复部分已知问题
2026-06-28 16:30:17 +08:00

148 lines
3.9 KiB
Lua

local URL_ERROR = "http://gitea.fse-media.group/Henry_Du/FSE-Ticket.sys/raw/branch/main/error.dfpwm"
local URL_PASS = "http://gitea.fse-media.group/Henry_Du/FSE-Ticket.sys/raw/branch/main/pass.dfpwm"
local URL_GATE = "http://gitea.fse-media.group/Henry_Du/FSE-Ticket.sys/raw/branch/main/gate.lua"
local URL_UPDATE_GATE = "http://gitea.fse-media.group/Henry_Du/FSE-Ticket.sys/raw/branch/main/update_gate.lua"
local CONFIG_PATH = "gate_config.json"
local function trim(s)
return (tostring(s or ""):gsub("^%s+", ""):gsub("%s+$", ""))
end
local function splitCsv(s)
local out = {}
s = trim(s)
if #s == 0 then return out end
for part in s:gmatch("[^,/%s]+") do
local v = trim(part)
if #v > 0 then table.insert(out, v) end
end
return out
end
local function writeFile(path, content, binary)
local mode = binary and "wb" or "w"
local f = fs.open(path, mode)
if not f then return false end
f.write(content)
f.close()
return true
end
local function prompt(label)
term.write(label)
return trim(read() or "")
end
local function httpGet(url)
if not http then return false, "HTTP API disabled" end
local okReq, err = pcall(function()
http.request({ url = url, method = "GET" })
end)
if not okReq then return false, tostring(err) end
while true do
local ev, p1, p2, p3 = os.pullEvent()
if ev == "http_success" and p1 == url then
local res = p2
if type(res) == "table" and type(res.readAll) == "function" then
local data = res.readAll()
res.close()
return true, data
end
return false, "invalid http response"
end
if ev == "http_failure" and p1 == url then
local err = p2
local res = p3
if type(p2) == "table" and type(p2.readAll) == "function" then
res = p2
err = p3
end
if type(res) == "table" and type(res.readAll) == "function" then
local data = res.readAll()
res.close()
return false, data
end
return false, tostring(err or "http_failure")
end
end
end
local function download(url, path, binary)
print("Downloading: " .. path)
local ok, data = httpGet(url)
if not ok then
print("Download failed: " .. tostring(data or ""))
return false
end
if not writeFile(path, data, binary) then
print("Write failed: " .. path)
return false
end
return true
end
local function normalizeMode(raw)
return (trim(raw):lower() == "exit") and "exit" or "entry"
end
term.clear()
term.setCursorPos(1, 1)
print("Bidirectional Ticket Gate Installer")
print("")
local stationCode = trim(prompt("Station code: "))
if #stationCode == 0 then
print("No station code provided.")
return
end
print("")
print("Set mode for each side (front/back).")
local frontRaw = prompt("Front mode (entry/exit): ")
local backRaw = prompt("Back mode (entry/exit): ")
local frontMode = normalizeMode(frontRaw)
local backMode = normalizeMode(backRaw)
local cfg = {
station_codes = { stationCode },
station_code = stationCode,
side_modes = {
front = frontMode,
back = backMode,
},
side_station_codes = {
front = stationCode,
back = stationCode,
}
}
local okCfg, cfgJson = pcall(textutils.serializeJSON, cfg)
if not okCfg then
print("Config serialize failed.")
return
end
if not writeFile(CONFIG_PATH, cfgJson, false) then
print("Failed to write config.")
return
end
if not download(URL_PASS, "pass.dfpwm", true) then return end
if not download(URL_ERROR, "error.dfpwm", true) then return end
local okGate, gateCode = httpGet(URL_GATE)
if not okGate then
print("Download failed: startup")
return
end
writeFile("startup.lua", gateCode, false)
writeFile("startup", gateCode, false)
if not download(URL_UPDATE_GATE, "update_gate.lua", false) then return end
print("")
print("Done.")
print("This gate now supports tickets and IC cards.")
print("Attach ticket_inspection_machine on FRONT and BACK.")
print("Reboot the computer to start the gate.")