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