View difference between Paste ID: Pp6c4V2u and 0CP20EXL
SHOW: | | - or go back to the newest paste.
1-
local component = require("component")
1+
local component = require("component")
2-
local fs = require("filesystem")
2+
local fs = require("filesystem")
3-
local event = require("event")
3+
local event = require("event")
4-
local term = require("term")
4+
local term = require("term")
5-
local data = component.data
5+
local data = component.data
6-
local modem = component.modem
6+
local modem = component.modem
7-
modem.open(340)
7+
modem.open(340)
8-
local ok, config = pcall(dofile, "/usr/etc/osu_config.lua")
8+
local ok, config = pcall(dofile, "/usr/etc/osu_config.lua")
9-
if not ok or not type(config) == "table" then
9+
if not ok or not type(config) == "table" then
10-
  print("Error, failed to load config because '"..config.."'. Exiting!")
10+
  print("Error, failed to load config because '" .. config .. "'. Exiting!")
11-
  os.exit()
11+
  os.exit()
12
end
13-
local args = require'shell'.parse(...)
13+
local args = require 'shell'.parse(...)
14-
local function containsValue(table, element)
14+
local function containsValue(table, element)
15-
  for _, value in pairs(table) do
15+
  for _, value in pairs(table) do
16-
    if value == element then
16+
    if value == element then
17-
      return true
17+
      return true
18-
    end
18+
    end
19-
  end
19+
  end
20-
  return false
20+
  return false
21
end
22-
function containsKey(table, element)
22+
function containsKey(table, element)
23-
  for key, _ in pairs(table) do
23+
  for key, _ in pairs(table) do
24-
    if key == element then
24+
    if key == element then
25-
      return true
25+
      return true
26-
    end
26+
    end
27-
  end
27+
  end
28-
  return false
28+
  return false
29
end
30-
local function onReceive(_, _, _, port, _, program, module, command, password, text, args1, args2, args3)
30+
local function onReceive(_, _, _, port, _, program, module, command, password, text, args1, args2, args3)
31-
  if port == 340 then
31+
  if port == 340 then
32-
    if program == "OSU" then
32+
    if program == "OSU" then
33-
      password = data.decrypt(password, config.modules.network.encryption.key, config.modules.network.encryption.iv)
33+
      password = data.decrypt(password, config.modules.network.encryption.key, config.modules.network.encryption.iv)
34-
      text = data.decrypt(text, config.modules.network.encryption.key, config.modules.network.encryption.iv)
34+
      text = data.decrypt(text, config.modules.network.encryption.key, config.modules.network.encryption.iv)
35-
      if password == config.modules.network.password then
35+
      if password == config.modules.network.password then
36-
        if module == "DOOR" then
36+
        if module == "DOOR" then
37-
          if command == "UNLOCKALL" then
37+
          if command == "UNLOCKALL" then
38-
            if text == config.modules.door.override then
38+
            if text == config.modules.door.override then
39-
              for addr in component.list("os_doorcontroller") do
39+
              for addr in component.list("os_doorcontroller") do
40-
                component.invoke(addr, "open")
40+
                component.invoke(addr, "open")
41-
              end
41+
              end
42-
            else
42+
            else
43-
              modem.broadcast(340, "OSU", "NETWORK", "RESPONSE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "INVALID_OVERRIDE_CODE")
43+
              modem.broadcast(340, "OSU", "NETWORK", "RESPONSE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "INVALID_OVERRIDE_CODE")
44-
            end
44+
            end
45-
          elseif command == "LOCKALL" then
45+
          elseif command == "LOCKALL" then
46-
            if text == config.modules.door.override then
46+
            if text == config.modules.door.override then
47-
              for addr in component.list("os_doorcontroller") do
47+
              for addr in component.list("os_doorcontroller") do
48-
                component.invoke(addr, "close")
48+
                component.invoke(addr, "close")
49-
              end
49+
              end
50-
            else
50+
            else
51-
              modem.broadcast(340, "OSU", "NETWORK", "RESPONSE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "INVALID_OVERRIDE_CODE")
51+
              modem.broadcast(340, "OSU", "NETWORK", "RESPONSE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "INVALID_OVERRIDE_CODE")
52-
            end
52+
            end
53-
          end
53+
          end
54-
        elseif module == "LOCKDOWN" then
54+
        elseif module == "LOCKDOWN" then
55-
          if command == "INIT" then
55+
          if command == "INIT" then
56-
            if text == config.modules.lockdown.password then
56+
            if text == config.modules.lockdown.password then
57-
              if component.isAvailable("os_doorcontroller") then
57+
              if component.isAvailable("os_doorcontroller") then
58-
                for addr in component.list("os_doorcontroller") do
58+
                for addr in component.list("os_doorcontroller") do
59-
                  component.invoke(addr, "close")
59+
                  component.invoke(addr, "close")
60-
                end
60+
                end
61-
              else
61+
              else
62-
                modem.broadcast(340, "OSU", "NETWORK", "RESPONSE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "INVALID_LOCKDOWN_CODE")
62+
                modem.broadcast(340, "OSU", "NETWORK", "RESPONSE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "INVALID_LOCKDOWN_CODE")
63-
              end
63+
              end
64-
              if component.isAvailable("os_alarm") then
64+
              if component.isAvailable("os_alarm") then
65-
                for addr in component.list("os_alarm") do
65+
                for addr in component.list("os_alarm") do
66-
                  component.invoke(addr, "activate")
66+
                  component.invoke(addr, "activate")
67-
                end
67+
                end
68-
              end
68+
              end
69-
              if component.isAvailable("os_rolldoorcontroller") then
69+
              if component.isAvailable("os_rolldoorcontroller") then
70-
                for addr in component.list("os_rolldoorcontroller") do
70+
                for addr in component.list("os_rolldoorcontroller") do
71-
                  component.invoke(addr, "close")
71+
                  component.invoke(addr, "close")
72-
                end
72+
                end
73-
              end
73+
              end
74-
            end
74+
            end
75-
          elseif command == "STOP" then
75+
          elseif command == "STOP" then
76-
            if text == config.modules.lockdown.password then
76+
            if text == config.modules.lockdown.password then
77-
              if component.isAvailable("os_alarm") then
77+
              if component.isAvailable("os_alarm") then
78-
                for addr in component.list("os_alarm") do
78+
                for addr in component.list("os_alarm") do
79-
                  component.invoke(addr, "deactivate")
79+
                  component.invoke(addr, "deactivate")
80-
                end
80+
                end
81-
              else
81+
              else
82-
                modem.broadcast(340, "OSU", "NETWORK", "RESPONSE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "INVALID_LOCKDOWN_CODE")
82+
                modem.broadcast(340, "OSU", "NETWORK", "RESPONSE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "INVALID_LOCKDOWN_CODE")
83-
              end
83+
              end
84-
            end
84+
            end
85-
          end
85+
          end
86-
        elseif module == "NETWORK" then
86+
        elseif module == "NETWORK" then
87-
          if command == "REBOOT_ALL" then
87+
          if command == "REBOOT_ALL" then
88-
            if text == config.reboot_password then
88+
            if text == config.reboot_password then
89-
              computer.shutdown(true)
89+
              computer.shutdown(true)
90-
            end
90+
            end
91-
          end
91+
          end
92-
        end
92+
        end
93-
      end
93+
      end
94-
    end
94+
    end
95-
  end
95+
  end
96
end
97-
local function unlockDoor(_, _, username, data, _, _, _)
97+
local function unlockDoor(_, _, username, data, _, _, _)
98-
  if data == config.modules.door.carddata then
98+
  if data == config.modules.door.carddata then
99-
    if not containsValue(config.modules.door.blacklist, username) then
99+
    if not containsValue(config.modules.door.blacklist, username) then
100-
      for addr,type in component.list("os_doorcontroller") do
100+
      for addr, type in component.list("os_doorcontroller") do
101-
        component.invoke(addr, "open")
101+
        component.invoke(addr, "open")
102-
      end
102+
      end
103-
    else
103+
    else
104-
      modem.broadcast(430, "OSU", "DOOR", "UNLOCK", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "Blacklisted user "..username.." tried to open the door attached to this computer, with correct card data!!")
104+
      modem.broadcast(430, "OSU", "DOOR", "UNLOCK", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "Blacklisted user " .. username .. " tried to open the door attached to this computer, with correct card data!!")
105-
      return
105+
      return
106-
    end
106+
    end
107-
  else
107+
  else
108-
    if containsValue(config.modules.door.blacklist, username) then
108+
    if containsValue(config.modules.door.blacklist, username) then
109-
      modem.broadcast(430, "OSU", "DOOR", "UNLOCK", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "Blacklisted user "..username.." tried to open the door attached to this computer, with incorrect card data "..data.."!")
109+
      modem.broadcast(430, "OSU", "DOOR", "UNLOCK", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "Blacklisted user " .. username .. " tried to open the door attached to this computer, with incorrect card data " .. data .. "!")
110-
      return
110+
      return
111-
    else
111+
    else
112-
      modem.broadcast(430, "OSU", "DOOR", "UNLOCK", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "User "..username.." tried to open the door attached to this computer, with incorrect card data "..data.."!")
112+
      modem.broadcast(430, "OSU", "DOOR", "UNLOCK", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "User " .. username .. " tried to open the door attached to this computer, with incorrect card data " .. data .. "!")
113-
      return
113+
      return
114-
    end
114+
    end
115-
  end
115+
  end
116-
  os.sleep(config.modules.door.unlocktime)
116+
  os.sleep(config.modules.door.unlocktime)
117-
  for addr,type in component.list("os_doorcontroller") do
117+
  for addr, type in component.list("os_doorcontroller") do
118-
   component.invoke(addr, "close")
118+
    component.invoke(addr, "close")
119-
  end
119+
  end
120
end
121-
local function activateAlarms(_, _, _, _, _, username)
121+
local function activateAlarms(_, _, _, _, _, username)
122-
  if not containsValue(config.modules.alert.whitelist, username) then
122+
  if not containsValue(config.modules.alert.whitelist, username) then
123-
    for addr,type in component.list("os_alarm") do
123+
    for addr, type in component.list("os_alarm") do
124-
      component.invoke(addr, "activate")
124+
      component.invoke(addr, "activate")
125-
    end
125+
    end
126-
  else
126+
  else
127-
    return
127+
    return
128-
  end
128+
  end
129
end
130-
if args[1] == "modules" then
130+
if args[1] == "modules" then
131-
  if args[2] == "cardwriter" then
131+
  if args[2] == "cardwriter" then
132-
    if args[3] == "write" then
132+
    if args[3] == "write" then
133-
      if args[4] == nil then
133+
      if args[4] == nil then
134-
        io.write("Data: ")
134+
        io.write("Data: ")
135-
        text = io.read()
135+
        text = io.read()
136-
      else
136+
      else
137-
        text = args[4]
137+
        text = args[4]
138-
      end
138+
      end
139-
      if args[5] == nil then
139+
      if args[5] == nil then
140-
        io.write("Name: ")
140+
        io.write("Name: ")
141-
        name = io.read()
141+
        name = io.read()
142-
      else
142+
      else
143-
        name = args[5]
143+
        name = args[5]
144-
      end
144+
      end
145-
      ok, why = pcall(component.os_cardwriter.write, text, name, true)
145+
      ok, why = pcall(component.os_cardwriter.write, text, name, true)
146-
      if not ok then
146+
      if not ok then
147-
        print("Error, operation failed. Reason: "..why)
147+
        print("Error, operation failed. Reason: " .. why)
148-
        return
148+
        return
149-
      end
149+
      end
150-
      modem.broadcast(430, "OSU", "CARDWRITER", "WRITE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "A user wrote card with data "..text.." and name "..name.." on the cardwriter conected to this computer!")
150+
      modem.broadcast(430, "OSU", "CARDWRITER", "WRITE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), "A user wrote card with data " .. text .. " and name " .. name .. " on the cardwriter conected to this computer!")
151-
    end
151+
    end
152-
  elseif args[2] == "door" then
152+
  elseif args[2] == "door" then
153-
    if not component.isAvailable("os_doorcontroller") then
153+
    if not component.isAvailable("os_doorcontroller") then
154-
      print("Error, door controller not available. Exiting.")
154+
      print("Error, door controller not available. Exiting.")
155-
      os.exit()
155+
      os.exit()
156-
    end
156+
    end
157-
    if args[3] == "override" then
157+
    if args[3] == "override" then
158-
      if args[4] == nil then
158+
      if args[4] == nil then
159-
        io.write("Password: ")
159+
        io.write("Password: ")
160-
        options = {}
160+
        options = {}
161-
        options.pwchar = " "
161+
        options.pwchar = " "
162-
        pass = term.read(options)
162+
        pass = term.read(options)
163-
      else
163+
      else
164-
        pass = args[4]
164+
        pass = args[4]
165-
      end
165+
      end
166-
      if pass == config.modules.door.override then
166+
      if pass == config.modules.door.override then
167-
        modem.broadcast(430, "OSU", "DOOR", "UNLOCKALL", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), data.encrypt(config.modules.door.override, config.modules.network.encryption.key, config.modules.network.encryption.iv))
167+
        modem.broadcast(430, "OSU", "DOOR", "UNLOCKALL", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), data.encrypt(config.modules.door.override, config.modules.network.encryption.key, config.modules.network.encryption.iv))
168-
        for addr in component.list("os_doorcontroller") do
168+
        for addr in component.list("os_doorcontroller") do
169-
          component.invoke(addr, "open")
169+
          component.invoke(addr, "open")
170-
        end
170+
        end
171-
      else
171+
      else
172-
        print("Incorrect password!")
172+
        print("Incorrect password!")
173-
      end
173+
      end
174-
    elseif args[3] == "override_lock" then
174+
    elseif args[3] == "override_lock" then
175-
      if args[4] == nil then
175+
      if args[4] == nil then
176-
        io.write("Password: ")
176+
        io.write("Password: ")
177-
        options = {}
177+
        options = {}
178-
        options.pwchar = " "
178+
        options.pwchar = " "
179-
        pass = term.read(options)
179+
        pass = term.read(options)
180-
      else
180+
      else
181-
        pass = args[4]
181+
        pass = args[4]
182-
      end
182+
      end
183-
      if pass == config.modules.door.override then
183+
      if pass == config.modules.door.override then
184-
        for addr,type in component.list("os_doorcontroller") do
184+
        for addr, type in component.list("os_doorcontroller") do
185-
          component.invoke(addr, "close")
185+
          component.invoke(addr, "close")
186-
        end
186+
        end
187-
      else
187+
      else
188-
        print("Incorrect password!")
188+
        print("Incorrect password!")
189-
      end
189+
      end
190-
    elseif args[3] == "start_magnetic" then
190+
    elseif args[3] == "start_magnetic" then
191-
      if not component.isAvailable("os_magreader") then
191+
      if not component.isAvailable("os_magreader") then
192-
        print("Error, magnetic card reader not available. Exiting.")
192+
        print("Error, magnetic card reader not available. Exiting.")
193-
        os.exit()
193+
        os.exit()
194-
      end
194+
      end
195-
      id_door, _, _, username, data, _, _, _ = event.listen("magData", unlockDoor)
195+
      id_door, _, _, username, data, _, _, _ = event.listen("magData", unlockDoor)
196-
    elseif args[3] == "stop" then
196+
    elseif args[3] == "stop" then
197-
      if id_door == nil then
197+
      if id_door == nil then
198-
        print("Error, not started.")
198+
        print("Error, not started.")
199-
        os.exit()
199+
        os.exit()
200-
      end
200+
      end
201-
      event.cancel(id_door)
201+
      event.cancel(id_door)
202-
    end
202+
    end
203-
  elseif args[2] == nil then
203+
  elseif args[2] == nil then
204-
    print("Usage: osu modules [MODULE] [COMMAND]")
204+
    print("Usage: osu modules [MODULE] [COMMAND]")
205-
  elseif args[2] == "alert" then
205+
  elseif args[2] == "alert" then
206-
    if args[3] == "start" then
206+
    if args[3] == "start" then
207-
      if not component.isAvailable("motion_sensor") then
207+
      if not component.isAvailable("motion_sensor") then
208-
        print("Error, motion sensor not available.")
208+
        print("Error, motion sensor not available.")
209-
        os.exit()
209+
        os.exit()
210-
      end
210+
      end
211-
      if not component.isAvailable("os_alarm") then
211+
      if not component.isAvailable("os_alarm") then
212-
        print("Error, alarm not available.")
212+
        print("Error, alarm not available.")
213-
        os.exit()
213+
        os.exit()
214-
      end
214+
      end
215-
      id_alert, _, _, _, _, _, username = event.listen("motion", activateAlarms)
215+
      id_alert, _, _, _, _, _, username = event.listen("motion", activateAlarms)
216-
    elseif args[3] == "stop" then
216+
    elseif args[3] == "stop" then
217-
      event.cancel(id_alert)
217+
      event.cancel(id_alert)
218-
      for addr in component.list("os_alarm") do
218+
      for addr in component.list("os_alarm") do
219-
        component.proxy(addr).deactivate()
219+
        component.proxy(addr).deactivate()
220-
      end
220+
      end
221-
    end
221+
    end
222-
  elseif args[2] == "network" then
222+
  elseif args[2] == "network" then
223-
    if args[3] == "start_client" then
223+
    if args[3] == "start_client" then
224-
      id_network, _, _, sender, port, _, program, module, command, password, data, args1, args2, args3 = event.listen("modem_message", onReceive)
224+
      id_network, _, _, sender, port, _, program, module, command, password, data, args1, args2, args3 = event.listen("modem_message", onReceive)
225-
    end
225+
    elseif args[3] == "stop_client" then
226-
    elseif args[3] == "stop_client" then
226+
      event.cancel(id_network)
227-
      event.cancel(id_network)
227+
    elseif args[3] == "send_message" then
228-
    elseif args[3] == "send_message" then
228+
      io.write("Message: ")
229-
      io.write("Message: ")
229+
      message = io.read()
230-
      message = io.read()
230+
      modem.broadcast(340, "OSU", "NETWORK", "SEND_MESSAGE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), message)
231-
      modem.broadcast(340, "OSU", "NETWORK", "SEND_MESSAGE", data.encrypt(config.modules.network.password, config.modules.network.encryption.key, config.modules.network.encryption.iv), message)
231+
    elseif args[3] == "display" then
232-
    elseif args[3] == "display" then
232+
      term.clear()
233-
      term.clear()
233+
      function printOutput()
234-
      function printOutput()
234+
        _, _, sender, port, _, program, module, command, password, data, args1, args2, args3 = event.pull("modem_message")
235-
        _, _, sender, port, _, program, module, command, password, data, args1, args2, args3 = event.pull("modem_message")
235+
        if port == 430 then
236-
        if port == 430 then
236+
          if program == "OSU" then
237-
          if program == "OSU" then
237+
            password = data.decrypt(password, config.modules.network.encryption.key, config.modules.network.encryption.iv)
238-
            password = data.decrypt(password, config.modules.network.encryption.key, config.modules.network.encryption.iv)
238+
            if password == config.modules.network.password then
239-
            if password == config.modules.network.password then
239+
              print("Received message from " .. sender .. "'s module '" .. module .. "'. Data: " .. data)
240-
              print("Received message from "..sender.."'s module '"..module.."'. Data: "..data)
240+
            end
241-
            end
241+
          end
242-
          end
242+
        end
243-
        end
243+
      end
244-
      end
244+
    else
245-
    else
245+
      print("Usage: osu modules network [COMMAND].")
246-
      print("Usage: osu modules network [COMMAND].")
246+
      print("Commands:")
247-
      print("Commands:")
247+
      print(" osu modules network start_client - listens for network messages from other clients / the main server")
248-
      print(" osu modules network start_client - listens for network messages from other clients / the main server")
248+
      print(" osu modules network stop_client - stops listening for messages")
249-
      print(" osu modules network stop_client - stops listening for messages")
249+
      print(" osu modules network send_message - sends a network message")
250-
      print(" osu modules network send_message - sends a network message")
250+
      print(" osu modules network display - displays all received OSU network messages")
251-
      print(" osu modules network display - displays all received OSU network messages")
251+
    end
252-
    end
252+
  else
253-
  else
253+
    print("Error, not a valid module.")
254-
    print("Error, not a valid module.")
254+
    print("Valid modules: ")
255-
    print("Valid modules: ")
255+
    for k, v in pairs(config.modules) do
256-
    for k,v in pairs(config.modules) do
256+
      print(k)
257-
      print(k)
257+
    end
258-
    end
258+
  end
259-
elseif args[1] == "components" then
259+
elseif args[1] == "components" then
260-
  if args[2] == "list" then
260+
  if args[2] == "list" then
261-
    for address,type in component.list() do
261+
    for address, type in component.list() do
262-
      if type:match("os_") == "os_" then
262+
      if type:match("os_") == "os_" then
263-
        print(type:match("^.+_(.+)$"))
263+
        print(type:match("^.+_(.+)$"))
264-
      end
264+
      end
265-
    end
265+
    end
266-
  else
266+
  else
267-
    print("Usage: osu components [COMMAND]")
267+
    print("Usage: osu components [COMMAND]")
268-
    print("Commands:")
268+
    print("Commands:")
269-
    print("  list - lists all connected OpenSecurity components")
269+
    print("  list - lists all connected OpenSecurity components")
270-
  end
270+
  end
271-
else
271+
else
272-
  print("Usage: osu [COMMAND]")
272+
  print("Usage: osu [COMMAND]")
273-
  print("Commands:")
273+
  print("Commands:")
274-
  print("  osu modules - module-related commands")
274+
  print("  osu modules - module-related commands")
275-
  print("  osu components - component-related commands")
275+
  print("  osu components - component-related commands")
276
end