Перейти к содержимому

HeroBrine1st

Пользователи
  • Публикации

    134
  • Зарегистрирован

  • Посещение

  • Победитель дней

    21

Сообщения, опубликованные пользователем HeroBrine1st


  1.  

     

    zn.send(address: string, message: string[, timeout: boolean/string]): boolean Отправить сообщение какому-либо узлу. Аргументы address — адрес модема конечного узла. message — сообщение для отправки. timeout — таймаут ожидания подтверждения отправки, в секундах. false отключает подтверждение совсем. Возврат true — подтверждение не запрошено или получено. false — таймаут ожидания подтверждения.   zn.broadcast(message: string): boolean Послать сообщение для всех узлов сети. Аргументы message — сообщение для отправки. Возврат true.

     

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


  2. swg2you, я смотрю, ты как и некоторые здесь, любитель переопределять системные функции. Предлагаю тебе и другим желающим реализовать совместно проект FTP. Для доступа к дисковому пространству удаленного компьютера по вайфаю или ОпенНет.

    Это должна быть резидентная программа, которая подменяет функции библиотеки filesystem таким образом, что обращение к папке, расположенной на другом компьютере, выглядит как работа с локальным диском.

    легче создать proxy диска компьютера, который сам будет обращаться к другому компу и получать с него данные, а потом возвращать. потом через fs.mount смонтировать, или работать напрямую через прокси


  3. Да, но ты писал её для какой-то своей программы? Для чего использовал?

     

    Для того, чтобы использовать в мультибуте, надо чтобы библиотека загружалась до операционной системы, я так понимаю. Но она зависит от библиотек filesystem, component и computer. То есть должна грузиться после OpenOS.

     

    Защитит ли эта библиотека смонтированную в R/O папку от постороннего вмешательства? Когда папку пытаются изменить не через выданный библиотекой прокси, а извне?

    она загружается после загрузки package. к тому же MultiROM на андроид так же запускается после ядра. 

     

    P.S. либа filesystem работает через прокси систем, и если ею изменить что-либо в R/O прокси, то выпадет ошибка. при этом proxy не исчезнет


  4. А что дает монтирование папки с уже примонтированной файловой системы?

     

    А можно какие-нибудь примеры того, как эта либа может пригодиться в повседневной жизни?  :)

    (Я не говорю, что она не нужна. Мне действительно интересно.)

    монтирование отдельных файловых систем в R/O, так же будет возможно сделать multiboot с одного raid. применений множество, надо их лишь найти.


  5. Поскольку в нашем 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 папки.

     

    Если вы укажете не то значение, либо укажете путь не к папке, а к файлу, вылетит ошибка (специально сделал с защитой от дурака)

     

    Нельзя монтировать папки с других файловых систем, иначе вы будете работать не с той папкой, с которой хотели.  Обходится монтированием нужной системы в корень с последующей монтировкой папки, а затем все возращаете назад.


  6. При запуске скачивает файл, добавляет его в таблицу типа {"я еще так думаю"} (да, текст в таблице - уже не пример, а сама таблица - да)

    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")
    

     

     

     

    Код ошибки на скриншоте.


    дублируются еще эти темы, блин...

    post-19680-0-52067000-1475252211_thumb.png

    post-19680-0-58075100-1475252294_thumb.png

×
×
  • Создать...