Compare commits

...

33 Commits

Author SHA1 Message Date
9e633867da :3 2024-08-26 00:16:13 +03:00
79c5654247 :3 2024-08-26 00:13:01 +03:00
6b864b43be :3 2024-08-26 00:09:32 +03:00
5fa92ae0c4 :3 2024-08-26 00:08:40 +03:00
4ccc4b07da :3 2024-08-26 00:07:19 +03:00
b0c5b756b1 :3 2024-08-26 00:05:54 +03:00
a3ca65a458 :3 2024-08-26 00:04:22 +03:00
d07a35f360 :3 2024-08-26 00:03:08 +03:00
b88ca058fa :3 2024-08-25 23:58:57 +03:00
df5e544347 :3 2024-08-25 23:56:01 +03:00
7c78db3620 :3 2024-08-25 23:53:40 +03:00
7ed9f76f15 :3 2024-08-25 23:47:51 +03:00
2a8932a19f :3 2024-08-25 23:36:03 +03:00
28ceac8643 :3 2024-08-25 22:00:12 +03:00
68422b9343 Merge branch 'main' of https://git.mcorangehq.xyz/xomf/keypadOS 2024-08-24 12:59:41 -04:00
dcc0a3e687 :3 2024-08-24 12:59:30 -04:00
9b48f2adcb update rom 2024-08-20 22:19:45 -04:00
9d8398565b how did we get here? 2024-08-21 02:17:19 +00:00
7292f271fb nvm XD 2024-08-18 12:12:48 -04:00
0e6fa358a7 testing color 2024-08-18 12:12:00 -04:00
20495931d0 :3 2024-08-18 12:09:22 -04:00
1e170263fd purple :3 2024-08-18 11:59:14 -04:00
7ce154ed44 more error resistance 2024-08-18 11:50:07 -04:00
4c2197919a ;-; 2024-08-18 15:09:33 +03:00
5eb4a9edb7 :3 2024-08-18 15:03:36 +03:00
87fb39b9bd change default code, implement true hashes 2024-08-18 15:02:01 +03:00
a2546cb9ba Merge commits 2024-08-18 14:48:03 +03:00
348e764adf :3333333 extra config stuff 2024-08-18 14:37:59 +03:00
bacd5ac1aa final update of the night if nothing breaks, changed pin to reflect new zero button (very important feature) 2024-08-17 23:57:04 -04:00
2bec12c8df increased auto update delay, ntfy integration, additionally, testing whether or not the updates work before installing it on existing keypads. 2024-08-17 23:47:04 -04:00
d6f168e9eb need mcorange git actions 2024-08-17 23:36:23 -04:00
739e731bc4 i think i fixed it :O 2024-08-17 23:35:55 -04:00
0c15f13efb im sleepy 2024-08-17 23:33:47 -04:00
7 changed files with 152 additions and 3200 deletions

3033
basalt.lua

File diff suppressed because one or more lines are too long

View File

@@ -3,63 +3,23 @@ local __DEFAULT_IMPORT = require
local require = function(path)
if __BUNDLER_FILES[path] then
return __BUNDLER_FILES[path]()
elseif __BUNDLER_FILES[path .. ".lua"] then
return __BUNDLER_FILES[path .. ".lua"]()
else
return __DEFAULT_IMPORT(path)
end
end
local KEYPADOS_UPDATE_HASH = "bKkYwsVcXKtXDBdkQPQTxFYR"
local __UPDATE_HASH = "5e1c10aba96c3f9ded6aecb030f2774577c005af"
rawset(__BUNDLER_FILES, "updater.lua", function ()
local utils = require("utils.lua")
local LAST_USED = os.time()
local config = require("config.lua")
local mod = {}
local function checkForUpdate()
local current_time = os.time()
local difference = math.abs(current_time - LAST_USED)
print("Checking for update... difference: " .. tostring(difference))
--its been considerable time since the keypad was interacted with
--therefore it's time to force an update down the users throat (microsoft moment)
if difference > .5 then
local update_code_request = http.get("https://git.mcorangehq.xyz/xomf/keypadOS/raw/branch/main/keypadOS.lua?x=" .. tostring(math.random(11111111, 99999999))) -- I HATE CACHE REEEEEEEEEEEEEEEEE
if update_code_request then
local update_code_text = update_code_request.readAll()
if update_code_text then
if string.find(update_code_text, "^local __BUNDLER_FILES = {}") then
-- Make backup
fs.copy("startup.lua", "backup.lua")
if not string.find(update_code_text, KEYPADOS_UPDATE_HASH) then
local file = fs.open("startup.lua", "w")
file.write(update_code_text)
file.close()
os.reboot()
else
print("Nothing changed, not updating.")
sleep(50) -- delete this later
LAST_USED = os.time()
return
end
else
print("Bad file download (core)")
end
else
print("Bad mem read (core)")
end
else
print("Bad download (core)")
end
end
end
function mod.UpdateChecker()
while true do
checkForUpdate()
sleep(1)
end
end
function mod.GetBasalt()
if fs.exists("basalt.lua") then
utils.MonPrint("Basalt found!")
else
utils.MonPrint("Downloading basalt...")
local basalt_code = http.get("https://raw.githubusercontent.com/Pyroxenium/Basalt/master/docs/versions/latest.lua").readAll()
local basalt_code = http.get(config.basalt_url).readAll()
utils.MonPrint("Installing basalt...")
local file = fs.open("basalt.lua", "w")
if not file then
@@ -74,35 +34,37 @@ rawset(__BUNDLER_FILES, "updater.lua", function ()
end
end
return mod
end) -- FILE END: updater.lua --
end)
rawset(__BUNDLER_FILES, "config.lua", function ()
return {
correctPin = "42169"
local config = {
correctPin = "42069",
release_url = "https://git.mcorangehq.xyz/xomf/keypadOS/raw/branch/main/keypadOS.lua",
basalt_url = "https://raw.githubusercontent.com/Pyroxenium/Basalt/master/docs/versions/latest.lua",
ntfy_url = "https://ntfy.sh/keypadOS_alerts",
config_path = "keypadOS.config.lua"
}
end) -- FILE END: config.lua --
local DEFAULT_CONFIG = "return {\n" ..
" group=\"default\",\n" ..
"}\n"
function config.ReadConfig()
if not fs.exists(config.config_path) then
local f = fs.open(config.config_path, "w")
f.write(DEFAULT_CONFIG)
f.close();
end
local cfg = require(config.config_path)
return cfg
end
return config
end)
rawset(__BUNDLER_FILES, "ui.lua", function ()
local utils = require("utils.lua")
local basalt = require("basalt")
local config = require("config.lua")
local updater = require("updater.lua")
--- @type Monitor
local monitor = utils.Cast(peripheral.find("monitor"))
--- @type drive
local drive = utils.Cast(peripheral.find("drive"))
local mod = {}
--- @class Ui
--- @field pin string
--- @field main any
--- @field pinLabel any
--- @field enterButton any
--- @field resetEverything function
--- @field unlockDoor function
--- @field addToPin function
--- @param ui Ui
local function resetEverything(ui)
sleep(2)
ui.pin = ""
@@ -110,7 +72,6 @@ rawset(__BUNDLER_FILES, "ui.lua", function ()
redstone.setOutput("front", false)
ui.enterButton:setBackground(colors.blue)
end
--- @param ui Ui
local function unlockDoor(ui)
if drive.isDiskPresent() then
if drive.getDiskLabel() == config.correctPin then
@@ -118,8 +79,8 @@ rawset(__BUNDLER_FILES, "ui.lua", function ()
drive:ejectDisk()
end
end
basalt.debug("test")
if ui.pin == config.correctPin then
blibs.notifier.notify("5", "Unlocked door :3 love u");
ui.enterButton:setBackground(colors.green)
ui.pinLabel:setText("Welcome")
redstone.setOutput("front", true)
@@ -138,7 +99,6 @@ rawset(__BUNDLER_FILES, "ui.lua", function ()
resetEverything(ui)
end)
end
--- @param ui Ui
local function addToPin(ui, i)
if #ui.pin >= 5 then
return
@@ -187,10 +147,12 @@ rawset(__BUNDLER_FILES, "ui.lua", function ()
end
end
local status, err = pcall(function ()
parallel.waitForAll(basalt.autoUpdate, updater.UpdateChecker)
parallel.waitForAll(basalt.autoUpdate)
end)
if not status and err ~= "Terminated" then
print("Error detected: " .. err)
log.error("Error detected: " .. err)
blibs.notifier.notify("5", err); --exposed ntfy url no spam me pls
sleep(5)
utils.MonReset(0.5)
fs.delete("basalt.lua")
fs.delete("startup.lua")
@@ -199,19 +161,12 @@ rawset(__BUNDLER_FILES, "ui.lua", function ()
end
end
return mod
end) -- FILE END: ui.lua --
end)
rawset(__BUNDLER_FILES, "utils.lua", function ()
local utils = {}
-- Type coersion for lsp
---@generic T
---@param object any
---@return T
function utils.Cast(object)
return object
end
--- @type Monitor
local MONITOR = utils.Cast(peripheral.find("monitor"))
local MONITOR_Y = 1
function utils.MonPrint(text)
@@ -224,25 +179,21 @@ rawset(__BUNDLER_FILES, "utils.lua", function ()
MONITOR.setTextScale(scale)
end
return utils;
end) -- FILE END: utils.lua --
end)
rawset(__BUNDLER_FILES, "main.lua", function ()
-- keycardOS "bootloader", has no access to basalt
-- intended for checking for updates, and automatically updating basalt if it is missing
local utils = require("utils.lua")
local updater = require("updater.lua")
local main = {}
KEYPADOS_VERSION = "3.0"
function main.Main()
local mod = {}
KEYPADOS_VERSION = "4.0"
function mod.main(blibs)
_G.log = blibs.log;
_G.blibs = blibs;
utils.MonReset(0.5)
updater.GetBasalt()
utils.MonPrint("keypadOS v" .. KEYPADOS_VERSION)
utils.MonReset(1)
require("ui.lua").InitUi()
end
return main
end) -- FILE END: main.lua --
require("main.lua").Main()
return mod;
end)
return require("main.lua")

View File

@@ -1,3 +1,28 @@
return {
correctPin = "42169"
local config = {
correctPin = "42069",
release_url = "https://git.mcorangehq.xyz/xomf/keypadOS/raw/branch/main/keypadOS.lua",
basalt_url = "https://raw.githubusercontent.com/Pyroxenium/Basalt/master/docs/versions/latest.lua",
ntfy_url = "https://ntfy.sh/keypadOS_alerts",
config_path = "keypadOS.config.lua"
}
local DEFAULT_CONFIG = "return {\n" ..
" group=\"default\",\n" ..
"}\n"
--- @class Config
--- @field group string
--- Read current configs, create if doesnt exist :3
---@return Config
function config.ReadConfig()
if not fs.exists(config.config_path) then
local f = fs.open(config.config_path, "w")
f.write(DEFAULT_CONFIG)
f.close();
end
local cfg = require(config.config_path)
return cfg
end
return config

View File

@@ -1,15 +1,37 @@
-- keycardOS "bootloader", has no access to basalt
-- intended for checking for updates, and automatically updating basalt if it is missing
local utils = require("utils.lua")
local updater = require("updater.lua")
local mod = {}
local main = {}
KEYPADOS_VERSION = "4.0"
--- @class BootloaderLibs
--- @field log Logger
--- @field updater Updater
--- @field notifier Notifier
--- @field json JsonParser
KEYPADOS_VERSION = "3.0"
--- @class Logger
--- @field error fun(...)
--- @field warn fun(...)
--- @field info fun(...)
--- @field debug fun(...)
function main.Main()
--- @class Updater
--- @field addEntry fun(path: string, branch: string, url: string)
--- @class JsonParser
--- @field decode fun(s: string): table
--- @field encode fun(s: table): string
--- @class Notifier
--- @field notify fun(priority: "1"|"2"|"3"|"4"|"5", body: string)
---@param blibs BootloaderLibs
function mod.main(blibs)
_G.log = blibs.log;
_G.blibs = blibs;
utils.MonReset(0.5)
updater.GetBasalt()
utils.MonPrint("keypadOS v" .. KEYPADOS_VERSION)
@@ -18,5 +40,5 @@ function main.Main()
end
return main
return mod;

View File

@@ -2,6 +2,7 @@ local utils = require("utils.lua")
local basalt = require("basalt")
local config = require("config.lua")
local updater = require("updater.lua")
--- @type Monitor
local monitor = utils.Cast(peripheral.find("monitor"))
--- @type drive
@@ -36,8 +37,8 @@ local function unlockDoor(ui)
end
end
basalt.debug("test")
if ui.pin == config.correctPin then
blibs.notifier.notify("5", "Unlocked door :3 love u");
ui.enterButton:setBackground(colors.green)
ui.pinLabel:setText("Welcome")
redstone.setOutput("front", true)
@@ -117,11 +118,13 @@ function mod.InitUi()
end
local status, err = pcall(function ()
parallel.waitForAll(basalt.autoUpdate, updater.UpdateChecker)
parallel.waitForAll(basalt.autoUpdate)
end)
if not status and err ~= "Terminated" then
print("Error detected: " .. err)
log.error("Error detected: " .. err)
blibs.notifier.notify("5", err); --exposed ntfy url no spam me pls
sleep(5)
utils.MonReset(0.5)
fs.delete("basalt.lua")
fs.delete("startup.lua")

View File

@@ -1,60 +1,15 @@
local utils = require("utils.lua")
local LAST_USED = os.time()
local config = require("config.lua")
local mod = {}
local function checkForUpdate()
local current_time = os.time()
local difference = math.abs(current_time - LAST_USED)
print("Checking for update... difference: " .. tostring(difference))
--its been considerable time since the keypad was interacted with
--therefore it's time to force an update down the users throat (microsoft moment)
if difference > .5 then
local update_code_request = http.get("https://git.mcorangehq.xyz/xomf/keypadOS/raw/branch/main/keypadOS.lua?x=" .. tostring(math.random(11111111, 99999999))) -- I HATE CACHE REEEEEEEEEEEEEEEEE
if update_code_request then
local update_code_text = update_code_request.readAll()
if update_code_text then
if string.find(update_code_text, "^local __BUNDLER_FILES = {}") then
-- Make backup
fs.copy("startup.lua", "backup.lua")
if not string.find(update_code_text, KEYPADOS_UPDATE_HASH) then
local file = fs.open("startup.lua", "w")
file.write(update_code_text)
file.close()
os.reboot()
else
print("Nothing changed, not updating.")
sleep(50) -- delete this later
LAST_USED = os.time()
return
end
else
print("Bad file download (core)")
end
else
print("Bad mem read (core)")
end
else
print("Bad download (core)")
end
end
end
function mod.UpdateChecker()
while true do
checkForUpdate()
sleep(1)
end
end
function mod.GetBasalt()
if fs.exists("basalt.lua") then
utils.MonPrint("Basalt found!")
else
utils.MonPrint("Downloading basalt...")
local basalt_code = http.get("https://raw.githubusercontent.com/Pyroxenium/Basalt/master/docs/versions/latest.lua").readAll()
local basalt_code = http.get(config.basalt_url).readAll()
utils.MonPrint("Installing basalt...")
local file = fs.open("basalt.lua", "w")

65
x.py
View File

@@ -1,7 +1,5 @@
#!/usr/bin/python
import string
import random
UPDATE_ID= ''.join(random.choices(string.ascii_letters, k=24))
import hashlib
OUTPUT="keypadOS.lua";
FILES= [
"updater.lua",
@@ -11,36 +9,67 @@ FILES= [
"main.lua",
]
MINIMISE=True
def read_file(p: str) -> str:
buf = "";
with open("src/"+p, "r", encoding="utf-8") as f:
buf += f"\nrawset(__BUNDLER_FILES, \"{p}\", function ()\n";
buf += f"rawset(__BUNDLER_FILES, \"{p}\", function ()\n";
for line in f.readlines():
if str.strip(line) != "":
buf += " " + line;
buf += f"\nend) -- FILE END: {p} --\n";
buf += "\nend)";
if not MINIMISE:
buf += f"-- FILE END: {p} --\n";
else:
buf += "\n";
return buf;
def minimise(buf: str) -> str:
newbuf = "";
for line in buf.splitlines():
if line.strip().startswith("--"):
continue;
if line.strip() == "":
continue
newbuf += line + "\n";
return newbuf;
def get_hash(buf: str) -> str:
hasher = hashlib.sha1();
hasher.update(bytes(buf, "utf-8"));
return hasher.hexdigest();
REQ_HEADER = """
local __BUNDLER_FILES = {}
local __DEFAULT_IMPORT = require
local require = function(path)
if __BUNDLER_FILES[path] then
return __BUNDLER_FILES[path]()
elseif __BUNDLER_FILES[path .. ".lua"] then
return __BUNDLER_FILES[path .. ".lua"]()
else
return __DEFAULT_IMPORT(path)
end
end
local __UPDATE_HASH = __BUNDLER_REPLACE_HASH__
"""
def main():
buf = ""
buf += "local __BUNDLER_FILES = {}\n";
buf += "local __DEFAULT_IMPORT = require\n";
buf += "local require = function(path)\n";
buf += " if __BUNDLER_FILES[path] then\n";
buf += " return __BUNDLER_FILES[path]()\n";
buf += " else\n";
buf += " return __DEFAULT_IMPORT(path)\n";
buf += " end\n";
buf += "end\n";
buf += f'local KEYPADOS_UPDATE_HASH = "{UPDATE_ID}"';
buf += REQ_HEADER;
for file in FILES:
print(f"=== FILE: {file}");
buf += read_file(file);
buf += "\nrequire(\"main.lua\").Main()\n";
buf += "return require(\"main.lua\")";
if MINIMISE:
buf = minimise(buf);
update_hash = get_hash(buf);
buf = buf.replace("__BUNDLER_REPLACE_HASH__", f"\"{update_hash}\"");
print(f"=== UPDATE HASH: {update_hash}")
with open(OUTPUT, "w", encoding="utf-8") as f:
f.write(buf);
print("DONE");