local component = require "component" local fs = require "fs" local shell = require "shell" local ed = require "ed" local doc = require "doc" local shutil = {} shutil.ed = ed.interactive shutil.vi = ed.visual shutil.buffers = ed.ifunc.buffers local function wrapUnits(n) local scale = {"K","M","G","T","P"} local count = 0 while n >= 1024 do count = count + 1 if not scale[count] then return "inf" end n = n / 1024 end return tostring(math.floor(n))..(scale[count] or "") end function shutil.import(lib) -- string -- boolean -- Imports the functions from library *lib* into the shell environment. local cE = os.getenv("INCLUDE") or shell.include local nE = {} for k,v in pairs(cE) do nE[#nE+1] = v end require(lib) nE[#nE+1] = lib os.setenv("INCLUDE",nE) return true end function shutil.unimport(lib) -- string -- boolean -- Removes the functions from *lib* from the shell environment. local cE = os.getenv("INCLUDE") or shell.include local nE = {} for k,v in pairs(cE) do if v ~= lib then nE[#nE+1] = v end end os.setenv("INCLUDE",nE) return true end function shutil.ls(...) -- string -- -- Prints contents of directories specified as *...*. local tA = {...} if not tA[1] then tA[1] = "." end for _,d in ipairs(tA) do if #tA > 1 then print(d..":") end for _,f in ipairs(fs.list(d)) do print(" "..f) end end end function shutil.cat(...) -- string -- -- Outputs the contents of files specified in *...* to the standard output. for _,fn in ipairs({...}) do local f = io.open(fn,"rb") io.write(f:read("*a")) f:close() end end function shutil.ps() -- Prints the processes running on the system. print("PID# Parent | Name") for k,v in pairs(os.tasks()) do local t = os.taskInfo(v) print(string.format("%4d %4d | %s",v,t.parent,t.name)) end end function shutil.df() -- Prints free disk space. local mt = fs.mounts() local ml = 0 for k,v in pairs(mt) do if v:len() > ml then ml = v:len() end end local fstr = "%-"..tostring(ml).."s %5s %5s" print("fs"..(" "):rep(ml-2).." size used") for k,v in pairs(mt) do local st, su = fs.spaceTotal("/"..v), fs.spaceUsed("/"..v) print(string.format(fstr,v,wrapUnits(st),wrapUnits(su))) end end function shutil.mount(addr,path) -- string string -- boolean string -- Mounts filesystem component with address *addr* to *path* in the filesystem. if not addr then local mt = fs.mounts() for k,v in pairs(mt) do v = "/"..table.concat(fs.segments(v),"/") print(tostring(fs.address(v)).." on "..tostring(v).." type "..fs.type(v)) end else local fscomp = component.list("filesystem") if not fscomp[addr] then for k,v in pairs(fscomp) do if k:find(addr) then print(tostring(addr).." not found, assuming you meant "..k) addr = k break end end end local proxy = component.proxy(addr) if not proxy then return false, "no such filesystem component" end print(fs.mount(path,proxy)) end end function shutil.free() -- Displays used and free memory. print("Total Used Free") print(string.format("%5s %5s %5s",wrapUnits(computer.totalMemory()),wrapUnits(computer.totalMemory()-computer.freeMemory()),wrapUnits(computer.freeMemory()))) end function shutil.which(name) local fpath for _,dir in ipairs(os.getenv("PATH")) do fpath = fpath or fs.exists(string.format("%s/%s.lua",dir,name)) and string.format("%s/%s.lua",dir,name) or fs.exists(string.format("%s/%s",dir,name)) and string.format("%s/%s",dir,name) end return fpath end shutil.cd = os.chdir shutil.mkdir = fs.makeDirectory shutil.cp = fs.copy shutil.rm = fs.remove return setmetatable({}, {__index = function(t,k) if shutil[k] then return shutil[k] end local path = shutil.which(k) if path then local fn, e = loadfile(path) if not fn then error(string.format("\n - %s",e)) end return function(...) local tA = {...} local pid = os.spawn(function() return fn(table.unpack(tA)) end,path) local ret = {require("event").pull("process_finished",pid)} if not ret[3] then error(string.format("\n - %s",ret[4])) end for i = 1, 3 do table.remove(ret,1) end return table.unpack(ret) end end end})