-- :Minify:-- local kernel = ... local P = kernel.vfs.P local PERM = kernel.vfs.PERM local RW_R_R = P.OWNER_R + P.OWNER_W + P.GROUP_R + P.WORLD_R local RWX_RX_RX = P.OWNER_R + P.OWNER_W + P.OWNER_X + P.GROUP_R + P.GROUP_X + P.WORLD_R + P.WORLD_X local RW_R__ = P.OWNER_R + P.OWNER_W + P.GROUP_R local RW____ = P.OWNER_R + P.OWNER_W local RWXRWXRWX = PERM.RWXRWXRWX local SUID_755 = PERM.SUID_755 local META_VERSION = 0x02 local rootDisk = kernel.disks["$"] local function makeEntry(name, etype, owner, group, perms, cmeta) cmeta = cmeta or "" local plo = perms % 256 local phi = math.floor(perms / 256) % 256 local olo = (owner or 0) % 256 local ohi = math.floor((owner or 0) / 256) % 256 local glo = (group or 0) % 256 local ghi = math.floor((group or 0) / 256) % 256 return string.char(#name) .. name .. string.char(etype, olo, ohi, glo, ghi, plo, phi) .. string.char(#cmeta) .. cmeta end local REG = 0x00 local function mergeMeta(dir, entries) local diskDir = dir if diskDir:sub(1,1) == "/" then diskDir = diskDir:sub(2) end local metaPath = (diskDir == "" and ".meta" or diskDir .. "/.meta") local existing = {} local rok, rf = pcall(function() return rootDisk:open(metaPath, "r") end) if rok and rf then local raw = rf.read(65535) if rf.close then rf.close() end existing = (kernel.vfs._parseMetafile and kernel.vfs._parseMetafile(raw)) or {} end for _, e in ipairs(entries) do local name = e[1] local etype = e[2] or REG local owner = e[3] or 0 local group = e[4] or 0 local perms = e[5] or RWX_RX_RX local cmeta = e[6] or "" existing[name] = { etype = etype, owner = owner, group = group, perms = perms, cmeta = cmeta, } end local data = string.char(META_VERSION) for name, m in pairs(existing) do data = data .. makeEntry( name, m.etype or REG, m.owner or 0, m.group or 0, m.perms or RWX_RX_RX, m.cmeta or "" ) end local ok, err = pcall(function() local f = rootDisk:open(metaPath, "w") f.write(data) f.close() end) if not ok then kernel.log("permissions: failed to write " .. metaPath .. ": " .. tostring(err), "WARN", 8) end end kernel.log("Seeding filesystem permissions...", "INFO") mergeMeta("/", { {"bin", REG, 0, 0, RWX_RX_RX}, {"boot", REG, 0, 0, RWX_RX_RX}, {"dev", REG, 0, 0, RWX_RX_RX}, {"etc", REG, 0, 0, RWX_RX_RX}, {"home", REG, 0, 0, RWX_RX_RX}, {"lib", REG, 0, 0, RWX_RX_RX}, {"root", REG, 0, 0, RW____ }, {"sbin", REG, 0, 0, RWX_RX_RX}, {"tmp", REG, 0, 0, RWXRWXRWX}, {"usr", REG, 0, 0, RWX_RX_RX}, {"var", REG, 0, 0, RWX_RX_RX}, }) mergeMeta("/boot", { {"kernel.lua", REG, 0, 0, RW_R_R }, {"boot.cfg", REG, 0, 0, RW_R_R }, {"safeboot.cfg", REG, 0, 0, RW_R_R }, {"fstab", REG, 0, 0, RW_R_R }, {"initfs", REG, 0, 0, RW_R_R }, {"cct", REG, 0, 0, RWX_RX_RX}, {"oc", REG, 0, 0, RWX_RX_RX}, }) mergeMeta("/boot/cct", { {"boot.lua", REG, 0, 0, RW_R_R}, {"initdisks", REG, 0, 0, RW_R_R}, {"eeprom", REG, 0, 0, RW_R_R}, }) mergeMeta("/boot/oc", { {"boot.lua", REG, 0, 0, RW_R_R}, {"initfs.lua",REG, 0, 0, RW_R_R}, {"eeprom", REG, 0, 0, RW_R_R}, }) mergeMeta("/sbin", { {"init.lua", REG, 0, 0, RWX_RX_RX}, }) mergeMeta("/bin", { {"cat", REG, 0, 0, RWX_RX_RX}, {"chattr", REG, 0, 0, RWX_RX_RX}, {"chgrp", REG, 0, 0, RWX_RX_RX}, {"chmod", REG, 0, 0, RWX_RX_RX}, {"chown", REG, 0, 0, RWX_RX_RX}, {"chroot", REG, 0, 0, RWX_RX_RX}, {"clear", REG, 0, 0, RWX_RX_RX}, {"echo", REG, 0, 0, RWX_RX_RX}, {"hfetch", REG, 0, 0, RWX_RX_RX}, {"help", REG, 0, 0, RWX_RX_RX}, {"hysh", REG, 0, 0, RWX_RX_RX}, {"hyshex", REG, 0, 0, RWX_RX_RX}, {"id", REG, 0, 0, RWX_RX_RX}, {"install", REG, 0, 0, RWX_RX_RX}, {"ln", REG, 0, 0, RWX_RX_RX}, {"login", REG, 0, 0, SUID_755 }, {"loimgcreate", REG, 0, 0, RWX_RX_RX}, {"looptest", REG, 0, 0, RWX_RX_RX}, {"losetup", REG, 0, 0, RWX_RX_RX}, {"ls", REG, 0, 0, RWX_RX_RX}, {"lsusers", REG, 0, 0, RWX_RX_RX}, {"lua", REG, 0, 0, RWX_RX_RX}, {"luaold", REG, 0, 0, RWX_RX_RX}, {"micro", REG, 0, 0, RWX_RX_RX}, {"mkdir", REG, 0, 0, RWX_RX_RX}, {"mount", REG, 0, 0, RWX_RX_RX}, {"passwd", REG, 0, 0, RWX_RX_RX}, {"ps", REG, 0, 0, RWX_RX_RX}, {"pwd", REG, 0, 0, RWX_RX_RX}, {"readlink", REG, 0, 0, RWX_RX_RX}, {"sed", REG, 0, 0, RWX_RX_RX}, {"socktest", REG, 0, 0, RWX_RX_RX}, {"spm", REG, 0, 0, RWX_RX_RX}, {"startup", REG, 0, 0, RWX_RX_RX}, {"su", REG, 0, 0, SUID_755 }, {"sudo", REG, 0, 0, SUID_755 }, {"sysdump", REG, 0, 0, RWX_RX_RX}, {"umount", REG, 0, 0, RWX_RX_RX}, {"useradd", REG, 0, 0, RWX_RX_RX}, {"userdel", REG, 0, 0, RWX_RX_RX}, {"usermod", REG, 0, 0, RWX_RX_RX}, {"whoami", REG, 0, 0, RWX_RX_RX}, {"yes", REG, 0, 0, RWX_RX_RX}, }) mergeMeta("/bin/startup", { {"test.lua", REG, 0, 0, RWX_RX_RX}, }) mergeMeta("/lib", { {"sys", REG, 0, 0, RWX_RX_RX}, {"modules", REG, 0, 0, RWX_RX_RX}, {"crypto", REG, 0, 0, RWX_RX_RX}, {"store", REG, 0, 0, RWX_RX_RX}, {"snip", REG, 0, 0, RW_R_R }, {"io", REG, 0, 0, RW_R_R }, {"bit32", REG, 0, 0, RW_R_R }, }) mergeMeta("/lib/sys", { {"fs", REG, 0, 0, RW_R_R}, {"hpv", REG, 0, 0, RW_R_R}, {"ipc", REG, 0, 0, RW_R_R}, {"term", REG, 0, 0, RW_R_R}, {"init", REG, 0, 0, RW_R_R}, }) mergeMeta("/lib/modules", { {"hyperion", REG, 0, 0, RWX_RX_RX}, }) mergeMeta("/lib/modules/hyperion", { {"01_stdlib.kmod", REG, 0, 0, RW_R_R}, {"10_vfs.kmod", REG, 0, 0, RW_R_R}, {"11_require.kmod", REG, 0, 0, RW_R_R}, {"12_devfs.kmod", REG, 0, 0, RW_R_R}, {"12_tmpfs.kmod", REG, 0, 0, RW_R_R}, {"13_loopdev.kmod", REG, 0, 0, RW_R_R}, {"14_keventd.kmod", REG, 0, 0, RW_R_R}, {"19_fstab.kmod", REG, 0, 0, RW_R_R}, {"20_signals.kmod", REG, 0, 0, RW_R_R}, {"20_socket.kmod", REG, 0, 0, RW_R_R}, {"26_tty.kmod", REG, 0, 0, RW_R_R}, {"30_userspace.kmod", REG, 0, 0, RW_R_R}, {"40_auth.kmod", REG, 0, 0, RW_R_R}, {"45_hypervisor.kmod", REG, 0, 0, RW_R_R}, {"47_dbg.kmod", REG, 0, 0, RW_R_R}, {"50_gpio.kmod", REG, 0, 0, RW_R_R}, {"70_stdlibadv.kmod", REG, 0, 0, RW_R_R}, {"90_init.kmod", REG, 0, 0, RW_R_R}, {"91_login.kmod", REG, 0, 0, RW_R_R}, {"92_permissions.kmod", REG, 0, 0, RW_R_R}, {"99_final.kmod", REG, 0, 0, RW_R_R}, }) mergeMeta("/etc", { {"passwd", REG, 0, 0, RW_R_R }, {"shadow", REG, 0, 0, RW____ }, {"pam.d", REG, 0, 0, RWX_RX_RX}, }) mergeMeta("/etc/pam.d", { {"secret", REG, 0, 0, RW____}, }) kernel.log("Filesystem permissions seeded.", "INFO")