PsychOSPackages/partman/service/partman.lua

60 lines
1.4 KiB
Lua

local diskpart = require "diskpart"
local vcomponent = require "vcomponent"
local partman = {
dtypes={
drive=true,
["tape_drive"]=true
}
}
local hooks = {}
function hooks.component_added(_,a,t)
if not partman.dtypes[t] then return end
for k,v in ipairs(diskpart.getPartitions(a)) do
if v[4] > 0 then
syslog(string.format("Registering vcomponent for partition %s/%i",a,k))
vcomponent.register(string.format("%s/%i",a,k), "partition", diskpart.proxyPartition(a, k))
local w,l = pcall(require,string.format("fs.%s",v[2]))
if w and l and l.mount then
syslog(string.format("Trying to mount %s/%i as %s", a, k, v[2]))
local w, f = pcall(l.mount, string.format("%s/%i",a,k))
if w then
vcomponent.register(string.format("%s/%i/%s",a,k,v[2]), f.type or "filesystem", f)
end
end
end
end
end
function hooks.component_removed(_,a,t)
if not partman.dtypes[t] then return end
for ca,t in component.list() do
if (t == "partition" or t == "filesystem") and ca:sub(1,a:len()) == a then
vcomponent.unregister(ca)
end
end
end
function partman.start()
return os.spawn(function()
for a,t in component.list("drive") do
hooks.component_added(nil, a, t)
end
while true do
local tE = {coroutine.yield()}
if tE[1] and hooks[tE[1]] then
hooks[tE[1]](table.unpack(tE))
end
end
end, "partman")
end
function partman.stop()
for a,t in component.list("drive") do
hooks.component_removed(nil, a, t)
end
end
return partman