From 256fd408ec6c2f0dde8e2d3b8701d92d84509e2c Mon Sep 17 00:00:00 2001 From: plugd Date: Fri, 2 Aug 2024 15:27:10 +0200 Subject: [PATCH] Control.dat creating and archiving. --- obbs | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 141 insertions(+), 3 deletions(-) diff --git a/obbs b/obbs index f5b7191..32b6c0b 100755 --- a/obbs +++ b/obbs @@ -1,5 +1,7 @@ #!/usr/bin/env lua +local posix = require "posix" + local usage = [[Usage: obbs [-c config_file] COMMAND [arguments ...] Here COMMAND is one of: @@ -17,15 +19,74 @@ local function load_config () print("done.") end +--- Utility functions --- + +local function print_table (t, lev) + lev = lev or 0 + local ind = string.rep("\t", lev) + + for k,v in pairs(t) do + if type(v)=="table" then + print(ind ..k .. "= {") + print_table(v, lev+1) + print(ind .. "}") + else + print(ind .. k .. "=" .. tostring(v)) + end + end +end + + +local fs = {} + +function fs.exists(filename) + return io.open(filename, "r") +end + +function fs.mkdir(dirname) + posix.mkdir(dirname) +end + +function fs.rmdir(dirname) + posix.rmdir(dirname) +end + +function fs.copy(filename, destfilename) + src = assert(io.open(filename,"r")) + dest = assert(io.open(destfilename,"w")) + + dest:write(src:read("*all")) + dest:close() + src:close() +end + +function fs.touch(filename) + fh = assert(io.open(filename,"w")) + fh:close() +end + +function fs.mktempdir() + return posix.mkdtemp("/tmp/obbs-XXXXXX") +end + + +--- Commands --- + local cmd = {} +-- Send default configuration to stdout function cmd.newcfg () print [[ ---- OBBS Configuration File +-- OBBS Configuration File obbs.name = "My OBBS Name" +obbs.bbsid = "MYOBBSID" -- max 8 char obbs.sysop = "Sysop Name" +-- obbs.hello_file = "hello" +-- obbs.news_file = "news" +-- obbs.goodbye_file = "goodbye" + obbs.conferences = { "Announcements", "General", @@ -34,14 +95,91 @@ obbs.conferences = { ]] end +-- Initialise conference directory structure function cmd.init () load_config() - for k,v in pairs(obbs) do - print(k .. "=" .. tostring(v)) + if fs.exists("conferences") or + fs.exists("incoming") or + fs.exists("outgoing") then + print("One or more OBBS directories already exist. Aborting.") + return end + + fs.mkdir("conferences") + for i,v in ipairs(obbs.conferences) do + fs.mkdir("conferences/" .. v) + end + + fs.mkdir("incoming") + fs.mkdir("outgoing") end +-- Pack +function cmd.pack () + load_config() + + if not arg[1] then + print "Usage: obbs pack USER" + return + end + + local user_name = arg[1] + + local dir = fs.mktempdir() + + -- CONTROL.DAT + + local cf = assert(io.open(dir .. "/CONTROL.DAT", "w")) + cf:write(obbs.name .. "\r\n") + cf:write("\r\n") -- BBS location + cf:write("\r\n") -- BBS phone number + cf:write(obbs.sysop .. "\r\n") + cf:write("," .. obbs.bbsid .. "\r\n") + cf:write(os.date("%d-%m-%Y,%X") .. "\r\n") -- packet creation time + cf:write(user_name .. "\r\n") + cf:write("\r\n") + cf:write(0 .. "\r\n") + cf:write(0 .. "\r\n") -- TODO: Number of messages in packet + cf:write(#obbs.conferences-1 .. "\r\n") -- Index of final conference + for i,v in ipairs(obbs.conferences) do + cf:write(i-1 .. "\r\n") + cf:write(v .. "\r\n") + end + + cf:write("HELLO\r\n") + cf:write("NEWS\r\n") + cf:write("GOODBYE\r\n") + cf:close() + + -- Copy BBS welcome, news and goodbye files + + if obbs.hello and fs.exists(obbs.hello) then + fs.copy(obbs.hello, dir .. "/HELLO") + else + fs.touch(dir .. "/HELLO") + end + + if obbs.news and fs.exists(obbs.news) then + fs.copy(obbs.news, dir .. "/NEWS") + else + fs.touch(dir .. "/NEWS") + end + + if obbs.news and fs.exists(obbs.goodbye) then + fs.copy(obbs.goodbye, dir .. "/GOODBYE") + else + fs.touch(dir .. "/GOODBYE") + end + + -- Pack messages + + -- Create archive in outgoing + + os.execute("zip -rj outgoing/" .. obbs.bbsid .. ".qwk " .. dir) + + fs.rmdir(dir) +end -- Main -- 2.20.1