Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- ============================================
- -- == Utilities
- -- ============================================
- local function fileReadAll(filePath)
- local hFile = fs.open(filePath, "r")
- if nil == hFile then
- return nill
- end
- local txt = hFile.readAll()
- hFile.close()
- return txt
- end
- local function fileOverwrite(filePath, text)
- local hFile = fs.open(filePath, "w")
- hFile.writeLine(text)
- hFile.close()
- end
- local function saveFile(filePath, data)
- fileOverwrite(filePath, textutils.serialize(data))
- end
- local function loadFile(filePath)
- local dat = fileReadAll(filePath)
- if nil == dat then
- return nil
- end
- return textutils.unserialize(dat)
- end
- local function deleteWhenExists(filePath)
- if fs.exists(filePath) then
- fs.delete(filePath)
- end
- end
- local function startsWith(subject, keyword)
- if nil == subject then
- return false
- end
- if nil == keyword then
- return false
- end
- if string.len(subject) < string.len(keyword) then
- return false
- end
- if string.sub(subject, 1, string.len(keyword)) == keyword then
- return true
- else
- return false
- end
- end
- -- ============================================
- -- == Configuration
- -- ============================================
- local APP_FILE_NAME = "/atupd"
- local THE_CHANNEL = 3951
- local MSG_SIGNATURE = "kssr3951's network system"
- local BASE_DIRECTORY = "/network"
- local STATUS_DIRECTORY = BASE_DIRECTORY .. "/status"
- -- ============================================
- -- == Application Common
- -- ============================================
- local MSGTYPE_SYS_UPDATE = "MSGTYPE_SYS_UPDATE"
- local function MsgSysUpdateNew()
- return {
- senderId,
- type = MSGTYPE_SYS_UPDATE,
- timestamp,
- appFileName,
- source
- }
- end
- local function serializeMessage(data)
- data.senderId = os.getComputerID()
- return MSG_SIGNATURE .. textutils.serialize(data)
- end
- local function unserializeMessage(data)
- if false == startsWith(data, MSG_SIGNATURE) then
- return nil
- else
- return textutils.unserialize(string.sub(data, string.len(MSG_SIGNATURE) + 1))
- end
- end
- -- ============================================
- -- == Application
- -- ============================================
- local SIDES = {"top", "bottom", "left", "right", "front", "back"}
- local modems = { }
- local function receiveSysUpdate(msg)
- local message = unserializeMessage(msg)
- if nil == message then
- return
- end
- if nil ~= message and MSGTYPE_SYS_UPDATE == message.type then
- print("sysUpdate")
- local timestamp = loadFile(STATUS_DIRECTORY .. "/systemUpdateDate")
- print("system update required. timestamp=[" .. message.timestamp .. "]")
- if nil ~= timestamp and timestamp == message.timestamp then
- print(" already latest. (no need to update.)")
- else
- print(" need to be updated.")
- saveFile(STATUS_DIRECTORY .. "/updateMessage", message)
- deleteWhenExists(message.appFileName)
- fileOverwrite(message.appFileName, message.source)
- fileOverwrite("/startup", "shell.run(\"" .. message.appFileName .. "\")")
- saveFile(STATUS_DIRECTORY .. "/updateNetSlave", true)
- os.reboot()
- end
- end
- end
- local function modemAction(modemSide, senderChannel, replyChannel, msg, senderDistance)
- -- print("== =========================================")
- -- print("I just received a message from: "..senderChannel)
- -- print("I should apparently reply on: "..replyChannel)
- -- print("The modem receiving this is located on the "..modemSide.." side")
- -- print("The message was: "..msg)
- -- print("The sender is: "..senderDistance.." blocks away from me.")
- -- print("== =========================================")
- if true then
- receiveSysUpdate(msg)
- end
- print("waiting.")
- end
- -- ============================================
- -- == main
- -- ============================================
- fs.makeDir(STATUS_DIRECTORY)
- local args = { ... }
- if true then
- local mdmCnt = 0
- for _, side in ipairs(SIDES) do
- if "modem" == peripheral.getType(side) then
- modems[side] = peripheral.wrap(side)
- modems[side].open(THE_CHANNEL)
- mdmCnt = mdmCnt + 1
- end
- end
- print("modemCount = " .. tostring(mdmCnt))
- end
- if 1 <= #args then
- -- ----------------------------------------
- -- net update (root)
- -- ----------------------------------------
- if "appUpdate" == args[1] then
- local message = MsgSysUpdateNew()
- message.timestamp = os.day() .. "-" .. os.time()
- message.appFileName = APP_FILE_NAME
- message.source = fileReadAll(APP_FILE_NAME)
- saveFile(STATUS_DIRECTORY .. "/systemUpdateDate", message.timestamp)
- for _, mdm in pairs(modems) do
- print("transmit begin")
- mdm.transmit(THE_CHANNEL, 10, serializeMessage(message))
- print(" transmit end")
- end
- end
- end
- if true then
- -- ----------------------------------------
- -- net update (not root)
- -- ----------------------------------------
- local tmp = loadFile(STATUS_DIRECTORY .. "/updateNetSlave")
- deleteWhenExists(STATUS_DIRECTORY .. "/updateNetSlave")
- if nil ~= tmp and true == tmp then
- local message = loadFile(STATUS_DIRECTORY .. "/updateMessage")
- for _, mdm in pairs(modems) do
- mdm.transmit(THE_CHANNEL, 10, serializeMessage(message))
- end
- saveFile(STATUS_DIRECTORY .. "/systemUpdateDate", message.timestamp)
- end
- end
- local timestamp = loadFile(STATUS_DIRECTORY .. "/systemUpdateDate")
- print("== =========================================")
- print("== kssr3951's network component.")
- print("== last update : " .. tostring(timestamp))
- print("== computer ID : " .. os.getComputerID())
- print("== =========================================")
- print("waiting.")
- while true do
- local event, r1, r2, r3, r4, r5 = os.pullEvent()
- if "modem_message" == event then
- print("modem_message!!")
- modemAction(r1, r2, r3, r4, r5)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement