Advertisement
IronicPickle

sync.lua

Feb 27th, 2020
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.45 KB | None | 0 0
  1. -- Args
  2. local args = { ... }
  3. local program = args[1] or ""
  4. local repoDir = args[2] or "/lua"
  5. local channel = tonumber(args[3]) or 99
  6.  
  7. -- Peripherals
  8. local modem = peripheral.find("modem")
  9.  
  10. -- Setup
  11. local blacklist = {"lua/state"}
  12.  
  13.  
  14. -- Main
  15. function start()
  16.     term.clear()
  17.     term.setCursorPos(1, 1)
  18.     print("\n# Network Sync Started")
  19.     print("\n# Sync Config:")
  20.     print("- Program: " .. program)
  21.     print("- Respository Directory: ".. repoDir)
  22.     print("- Channel: " .. channel)
  23.     print("\n# Sync Controls:")
  24.     print("- Up (Held) - Pushes local respository to server")
  25.     print("- Down - Pulls respository from server")
  26.     modem.open(channel)
  27.     if(not fs.isDir(repoDir)) then
  28.         print("\n---")
  29.         print("\n# Running First Time Setup")
  30.         print("- Creating", repoDir, "and performing pull")
  31.         if(not fs.exists("/startup.lua")) then
  32.             print("- Creating default /startup.lua")
  33.             local file = fs.open("/startup.lua", "w")
  34.             file.write(
  35.                 "shell.run('/lua/sync.lua \"/lua/programs/[PROGRAM_NAME] [ARGS]\"')"
  36.             )
  37.             file.close()
  38.         end
  39.         fs.makeDir(repoDir)
  40.         pull()
  41.         print("\n---")
  42.         print("\n# First Time Setup Complete")
  43.         print("- Exiting...\n")
  44.         return
  45.     end
  46.     while(true) do
  47.         parallel.waitForAny(await,
  48.             function()
  49.                 if(program == "") then
  50.                     print("\n# Sync Paused - Program Invalid")
  51.                     sleep(999999)
  52.                 end
  53.                 print("\n# Program Starting in...")
  54.                 for i = 3, 1, -1 do
  55.                     print("#", i)
  56.                     sleep(1)
  57.                 end
  58.                 shell.run(program)
  59.             end
  60.         )
  61.         print("\n# Program Exited")
  62.         sleep(1)
  63.     end
  64. end
  65.  
  66. function await()
  67.     while(true) do
  68.         local event, p1, p2, p3, p4, p5 = os.pullEvent()
  69.        
  70.         local isUpKeyHeld = (event == "key" and p1 == 200 and p2)
  71.         local isDownKey = (event == "key" and p1 == 208)
  72.        
  73.         local isModemMessage = (event == "modem_message")
  74.        
  75.         if(isUpKeyHeld) then
  76.             push()
  77.             break
  78.         elseif(isDownKey) then
  79.             pull()
  80.             break
  81.         elseif(isModemMessage) then
  82.             local body = p4
  83.             if(body.type == "syncGlobalPush") then
  84.                 print("\n# Global Push Recieved")
  85.                 updateRepo(body.files)
  86.                 break
  87.             elseif(body.type == "syncGlobalRestart") then
  88.                 print("\n---")
  89.                 print("\n# Global Restart Recieved")
  90.                 break
  91.             elseif(body.type == "syncGlobalHardRestart") then
  92.                 print("\n---")
  93.                 print("\n# Global Hard Restart Recieved")
  94.                 sleep(1)
  95.                 os.reboot()
  96.             elseif(body.type == "syncNetworkPoll") then
  97.                 modem.transmit(channel, channel,
  98.                     {
  99.                         type = "syncNetworkPollRes",
  100.                         deviceData = { program = program }
  101.                     }
  102.                 )
  103.             end
  104.         end
  105.     end
  106. end
  107.  
  108. function pull()
  109.     print("\n---")
  110.     print("\n# Performing Pull")
  111.     modem.transmit(channel, channel,
  112.         {
  113.             type = "syncPull"
  114.         }
  115.     )
  116.     while(true) do
  117.         local event, p1, p2, p3, p4, p5 = os.pullEvent()
  118.        
  119.         local isModemMessage = (event == "modem_message")
  120.        
  121.         if(isModemMessage) then
  122.             local body = p4
  123.             if(body.type == "syncPullRes") then
  124.                 print("- Pull Response Recieved")
  125.                 return updateRepo(body.files)
  126.             end
  127.         end
  128.     end
  129. end
  130.  
  131. function push()
  132.     print("\n---")
  133.     print("\n# Performing Push")
  134.     local files = serialiseFiles(repoDir)
  135.     modem.transmit(channel, channel,
  136.         {
  137.             type = "syncPush",
  138.             files = files
  139.         }
  140.     )
  141. end
  142.  
  143. function updateRepo(files)
  144.     clearRepo()
  145.     print("- Updating Local Repository")
  146.     for i, file in pairs(files) do
  147.         local openedFile = fs.open(file.path, "w")
  148.         openedFile.write(file.contents)
  149.         openedFile.close()
  150.     end
  151. end
  152.  
  153. function clearRepo()
  154.     print("- Clearing Repository")
  155.     local files = listAllFiles(repoDir)
  156.     for i, file in pairs(files) do
  157.         fs.delete(file.path)
  158.     end
  159. end
  160.  
  161. function serialiseFiles()
  162.     local files = listAllFiles(repoDir)
  163.     print("- Ignoring", #blacklist, "file(s)")
  164.     print("- Serialised", #files, "file(s)")
  165.     return files
  166. end
  167.  
  168. function listAllFiles(_path, _files)
  169.     local path = _path or ""
  170.     local files = _files or {}
  171.     for i, file in ipairs(fs.list(path)) do
  172.         local path = fs.combine(path, file)
  173.         if(fs.isDir(path)) then
  174.             listAllFiles(path, files)
  175.         else
  176.             local exclude = false
  177.             for i, name in pairs(blacklist) do
  178.                 if(string.match(path, name)) then exclude = true end
  179.             end
  180.             if(not exclude) then
  181.                 local openedFile = fs.open(path, "r")
  182.                 local contents = openedFile.readAll()
  183.                 openedFile.close()
  184.                 table.insert(files, {
  185.                     path = path,
  186.                     contents = contents
  187.                 })
  188.             end
  189.         end
  190.     end
  191.     return files
  192. end
  193.  
  194. start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement