HeroBrine1st
-
Публикации
134 -
Зарегистрирован
-
Посещение
-
Победитель дней
21
Сообщения, опубликованные пользователем HeroBrine1st
-
-
swg2you, я смотрю, ты как и некоторые здесь, любитель переопределять системные функции. Предлагаю тебе и другим желающим реализовать совместно проект FTP. Для доступа к дисковому пространству удаленного компьютера по вайфаю или ОпенНет.
Это должна быть резидентная программа, которая подменяет функции библиотеки filesystem таким образом, что обращение к папке, расположенной на другом компьютере, выглядит как работа с локальным диском.
легче создать proxy диска компьютера, который сам будет обращаться к другому компу и получать с него данные, а потом возвращать. потом через fs.mount смонтировать, или работать напрямую через прокси
-
Эм, по-моему либа filesystem из openos так умеет
разве? Скинь метод
-
Да, но ты писал её для какой-то своей программы? Для чего использовал?
Для того, чтобы использовать в мультибуте, надо чтобы библиотека загружалась до операционной системы, я так понимаю. Но она зависит от библиотек filesystem, component и computer. То есть должна грузиться после OpenOS.
Защитит ли эта библиотека смонтированную в R/O папку от постороннего вмешательства? Когда папку пытаются изменить не через выданный библиотекой прокси, а извне?
она загружается после загрузки package. к тому же MultiROM на андроид так же запускается после ядра.
P.S. либа filesystem работает через прокси систем, и если ею изменить что-либо в R/O прокси, то выпадет ошибка. при этом proxy не исчезнет
-
А что дает монтирование папки с уже примонтированной файловой системы?
А можно какие-нибудь примеры того, как эта либа может пригодиться в повседневной жизни?

(Я не говорю, что она не нужна. Мне действительно интересно.)
монтирование отдельных файловых систем в R/O, так же будет возможно сделать multiboot с одного raid. применений множество, надо их лишь найти.
-
Поскольку в нашем opencomputers нет виртуальных папок, я решил их написать. Но кроме этого я сделал возможность выбирать, с какими правами монтировать папку - Read/Only или Read/Write.
Поскольку я успешно потерял свой pastebin, я кидаю вам текстом код
local filesystem = require("filesystem") local fs = require("filesystem") local component = require("component") local computer = require("computer") local mount = {} function mount.mountFolder(otkyda,kyda,write) --я в курсе, костыли if not type(otkyda) == "string" then error("Bad argument #1 (String expected, got " .. type(otkyda) .. ")") end if not type(kyda) == "string" then error("Bad argument #2 (String expected, got " .. type(kyda) .. ")") end if not type(write) == "boolean" then error("Bad argument #3 (Boolean expected, got " .. type(write) .. ")") end if not filesystem.isDirectory(otkyda) then error("Bad path (Directory expected, got file)") end local rootFS = fs.get(otkyda) local proxy = {} proxy.convertPath = function(path) return fs.concat(otkyda,path) end proxy.address = "VirtualFS" .. tostring(math.random(0x000000,0xFFFFFF)) proxy.type = "filesystem" proxy.label = proxy.address proxy.spaceUsed = fs.get(otkyda).spaceUsed proxy.spaceTotal = fs.get(otkyda).spaceTotal proxy.makeDirectory = function(dir) if write then fs.get(otkyda).makeDirectory(proxy.convertPath(dir)) else error("Permission Denied") end end proxy.isReadOnly = function() return not write end proxy.rename = function(from,to) if write then fs.get(otkyda).rename(proxy.convertPath(from),proxy.convertPath(to)) else error("Permission Denied") end end proxy.remove = function(chto) if write then fs.get(otkyda).remove(proxy.convertPath(chto)) else error("Permission Denied") end end proxy.setLabel = function(label) if write then proxy.label = label end end proxy.size = function(path) return fs.get(otkyda).size(proxy.convertPath(path)) end proxy.getLabel = function() return proxy.label end proxy.exists = function(path) return rootFS.exists(proxy.convertPath(path)) end proxy.open = function(path,mode) if write then return rootFS.open(proxy.convertPath(path),mode) else if mode == "r" then return rootFS.open(proxy.convertPath(path),"r") else error("Permission Denied") end end end proxy.read = function(h, ...) return rootFS.read(h,...) end proxy.close = function(h) return rootFS.close(h) end proxy.write = function(h, ...) if write then return rootFS.write(h,...) else error("Permission Denied") end end proxy.seek = function(h, ...) return rootFS.seek(h, ...) end proxy.isDirectory = function(path) return rootFS.isDirectory(proxy.convertPath(path)) end proxy.list = function(path) return rootFS.list(proxy.convertPath(path)) end proxy.lastModified = function(path) return rootFS.lastModified(proxy.convertPath(path)) end fs.umount(kyda) fs.mount(proxy,kyda) return proxy end return mountМетод только один: mountFolder(otkyda: string,kyda: string,write: boolean): proxy
otkyda - откуда будем монтировать папку
kyda - куда будем монтировать папку
write - если true, то в папку можно записывать данные. Иначе - ошибка при записи/изменении Permission Denied
функция возращает proxy папки.
Если вы укажете не то значение, либо укажете путь не к папке, а к файлу, вылетит ошибка (специально сделал с защитой от дурака)
Нельзя монтировать папки с других файловых систем, иначе вы будете работать не с той папкой, с которой хотели. Обходится монтированием нужной системы в корень с последующей монтировкой папки, а затем все возращаете назад.
-
@Tororo, короче надо через string.gsub убрать все переносы и добавить в начале через пробел return, затем полученную строку пропустить через load и pcall. много времени прошло, я уже и забыл про эту тему)
-
При запуске скачивает файл, добавляет его в таблицу типа {"я еще так думаю"} (да, текст в таблице - уже не пример, а сама таблица - да)
https://github.com/HeroBrine1st/OpenComputers/blob/master/MCBios/applications.txt - сама таблица. т.к. загрузка идет как {функция}, то создавать единую таблицу, объединяющую все, в файле не нужно.
local EEPROMLabel = "EEPROM (MС BIOS)" local component = require("component") local computer = require("computer") local fs = require("filesystem") local internet = require("internet") local serialization = require("serialization") local shell = require("shell") local EEPROMCode local GitHubUrl = "https://raw.githubusercontent.com/" local function internetRequest(url) local success, response = pcall(component.internet.request, url) if success then local responseData = "" while true do local data, responseChunk = response.read() if data then responseData = responseData .. data else if responseChunk then return false, responseChunk else return true, responseData end end end else return false, reason end end local write = io.write local read = io.read local function getFromGitHub(url,filepath) local success, reason = internetRequest(url) if success then fs.makeDirectory(fs.path(filepath) or "") fs.remove(filepath) local file = io.open(filepath, "w") file:write(reason) file:close() return reason else error("error") end end local applications = {} write("Downloading file list... \n") applications = {getFromGitHub(GitHubUrl .. "HeroBrine1st/OpenComputers/master/MCBios/applications.txt", "/MCBios/applications.txt")} print(applications) print(#applications) local i for i = 1, #applications do write("Downloading \"" .. applications[i].name .. "\"\n") getFromGitHub(GitHubUrl .. applications[i].url, applications[i].name) end local f = io.open("/MCBios/EEPROMCode.lua","r") local success, reason = f:read(4096) f:close() if success then EEPROMCode = success else error(reason) end local computer = require("computer") local shell = require("shell") local options local eeprom write("Insert the EEPROM you would like to flash.\n") write("When ready to write, type `y` to confirm.\n") local result = read() if not result or result == "" or result:sub(1, 1):lower() == "y" then eeprom = component.getPrimary("eeprom") write("Beginning to flash EEPROM.\n") write("Flashing EEPROM " .. eeprom.address .. ".\n") write("Please do NOT power down or restart your computer during this operation!\n") local uptime = computer.uptime() write(eeprom.set(EEPROMCode .. "\n")) local time = computer.uptime() - uptime write("OKAY. Time: " .. time .. "\n") local uptimes = computer.uptime() write("Set label to '" .. EEPROMLabel .. "'\n") eeprom.setLabel(EEPROMLabel) local timess = computer.uptime() - uptimes write("OKAY. Time: " .. timess .. "\n") local uptimess = computer.uptime() write("Clear data \n") eeprom.setData("nil") local timesss = computer.uptime() - uptimess write("OKAY. Time: " .. timesss .. "\n") local times = computer.uptime() - uptime options = true write("Finished. Time: " .. times .. "\n") end if options then write("Reboot now? [Y/n] ") local result = read() if not result or result == "" or result:sub(1, 1):lower() == "y" then write("\nRebooting now!\n") computer.shutdown(true) end end write("Returning to shell.\n")Код ошибки на скриншоте.
дублируются еще эти темы, блин...

Неструктурированная децентрализованная сеть Zn
в Сетевые технологии
Опубликовано:
Нельзя отправить разом несколько значений, как в component.modem, так же любая программа, которая создана для component.modem, при бездумом переписывании modem на zn, перестает работать, и для ее работы надо использовать костыли через serialization.