From 622cfc673ab2e97001ed394f8cd6d0425d8f3378 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sun, 12 Apr 2015 20:20:01 +0200 Subject: [PATCH] luci-mod-admin-full: simply fstab configuration Simplify fstab setup by offering hints for uuid/label and device node options. Fix rootfs handling logic by removing obsolete references to the "is_rootfs" option and offering "/" and "/overlay" choices for the mountpoint instead. Signed-off-by: Jo-Philipp Wich --- .../luasrc/controller/admin/system.lua | 2 +- .../luasrc/model/cbi/admin_system/fstab.lua | 79 ++++++++++--- .../model/cbi/admin_system/fstab/mount.lua | 104 +++++++++++++----- 3 files changed, 137 insertions(+), 48 deletions(-) diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua index 52e347d07..1b38c6783 100644 --- a/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua +++ b/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua @@ -21,7 +21,7 @@ function index() entry({"admin", "system", "startup"}, form("admin_system/startup"), _("Startup"), 45) entry({"admin", "system", "crontab"}, form("admin_system/crontab"), _("Scheduled Tasks"), 46) - if fs.access("/etc/config/fstab") then + if fs.access("/sbin/block") then entry({"admin", "system", "fstab"}, cbi("admin_system/fstab"), _("Mount Points"), 50) entry({"admin", "system", "fstab", "mount"}, cbi("admin_system/fstab/mount"), nil).leaf = true entry({"admin", "system", "fstab", "swap"}, cbi("admin_system/fstab/swap"), nil).leaf = true diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua index 06e1e0798..4c806dbc4 100644 --- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua +++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua @@ -5,18 +5,33 @@ require("luci.tools.webadmin") local fs = require "nixio.fs" local util = require "nixio.util" +local tp = require "luci.template.parser" -local devices = {} -util.consume((fs.glob("/dev/sd*")), devices) -util.consume((fs.glob("/dev/hd*")), devices) -util.consume((fs.glob("/dev/scd*")), devices) -util.consume((fs.glob("/dev/mmc*")), devices) +local block = io.popen("block info", "r") +local ln, dev, devices = nil, nil, {} -local size = {} -for i, dev in ipairs(devices) do - local s = tonumber((fs.readfile("/sys/class/block/%s/size" % dev:sub(6)))) - size[dev] = s and math.floor(s / 2048) -end +repeat + ln = block:read("*l") + dev = ln and ln:match("^/dev/(.-):") + + if dev then + local e, s, key, val = { } + + for key, val in ln:gmatch([[(%w+)="(.-)"]]) do + e[key:lower()] = val + devices[val] = e + end + + s = tonumber((fs.readfile("/sys/class/block/%s/size" % dev))) + + e.dev = "/dev/%s" % dev + e.size = s and math.floor(s / 2048) + + devices[e.dev] = e + end +until not ln + +block:close() m = Map("fstab", translate("Mount Points")) @@ -66,17 +81,33 @@ end mount:option(Flag, "enabled", translate("Enabled")).rmempty = false dev = mount:option(DummyValue, "device", translate("Device")) +dev.rawhtml = true dev.cfgvalue = function(self, section) - local v + local v, e v = m.uci:get("fstab", section, "uuid") - if v then return "UUID: %s" % v end + e = v and devices[v:lower()] + if v and e then + return "UUID: %s (%s, %d MB)" %{ tp.pcdata(v), e.dev, e.size } + elseif v then + return "UUID: %s (%s)" %{ tp.pcdata(v), translate("not present") } + end v = m.uci:get("fstab", section, "label") - if v then return "Label: %s" % v end + e = v and devices[v] + if v and e then + return "Label: %s (%s, %d MB)" %{ tp.pcdata(v), e.dev, e.size } + elseif v then + return "Label: %s (%s)" %{ tp.pcdata(v), translate("not present") } + end v = Value.cfgvalue(self, section) or "?" - return size[v] and "%s (%s MB)" % {v, size[v]} or v + e = v and devices[v] + if v and e then + return "%s (%d MB)" %{ tp.pcdata(v), e.size } + elseif v then + return "%s (%s)" %{ tp.pcdata(v), translate("not present") } + end end mp = mount:option(DummyValue, "target", translate("Mount Point")) @@ -90,7 +121,15 @@ end fs = mount:option(DummyValue, "fstype", translate("Filesystem")) fs.cfgvalue = function(self, section) - return Value.cfgvalue(self, section) or "?" + local v, e + + v = m.uci:get("fstab", section, "uuid") + v = v and v:lower() or m.uci:get("fstab", section, "label") + v = v or m.uci:get("fstab", section, "device") + + e = v and devices[v] + + return e and e.type or m.uci:get("fstab", section, "fstype") or "?" end op = mount:option(DummyValue, "options", translate("Options")) @@ -100,8 +139,14 @@ end rf = mount:option(DummyValue, "is_rootfs", translate("Root")) rf.cfgvalue = function(self, section) - return Value.cfgvalue(self, section) == "1" - and translate("yes") or translate("no") + local target = m.uci:get("fstab", section, "target") + if target == "/" then + return translate("yes") + elseif target == "/overlay" then + return translate("overlay") + else + return translate("no") + end end ck = mount:option(DummyValue, "enabled_fsck", translate("Check")) diff --git a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua index 394469007..54beb63b4 100644 --- a/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua +++ b/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua @@ -4,20 +4,32 @@ local fs = require "nixio.fs" local util = require "nixio.util" -local has_extroot = fs.access("/sbin/block") local has_fscheck = fs.access("/usr/sbin/e2fsck") -local devices = {} -util.consume((fs.glob("/dev/sd*")), devices) -util.consume((fs.glob("/dev/hd*")), devices) -util.consume((fs.glob("/dev/scd*")), devices) -util.consume((fs.glob("/dev/mmc*")), devices) +local block = io.popen("block info", "r") +local ln, dev, devices = nil, nil, {} -local size = {} -for i, dev in ipairs(devices) do - local s = tonumber((fs.readfile("/sys/class/block/%s/size" % dev:sub(6)))) - size[dev] = s and math.floor(s / 2048) -end +repeat + ln = block:read("*l") + dev = ln and ln:match("^/dev/(.-):") + + if dev then + local e, s, key, val = { } + + for key, val in ln:gmatch([[(%w+)="(.-)"]]) do + e[key:lower()] = val + end + + s = tonumber((fs.readfile("/sys/class/block/%s/size" % dev))) + + e.dev = "/dev/%s" % dev + e.size = s and math.floor(s / 2048) + + devices[#devices+1] = e + end +until not ln + +block:close() m = Map("fstab", translate("Mount Points - Mount Entry")) @@ -41,29 +53,71 @@ mount:tab("advanced", translate("Advanced Settings")) mount:taboption("general", Flag, "enabled", translate("Enable this mount")).rmempty = false -o = mount:taboption("general", Value, "device", translate("Device"), - translate("The device file of the memory or partition (e.g. /dev/sda1)")) +o = mount:taboption("general", Value, "uuid", translate("UUID"), + translate("If specified, mount the device by its UUID instead of a fixed device node")) for i, d in ipairs(devices) do - o:value(d, size[d] and "%s (%s MB)" % {d, size[d]}) + if d.uuid then + o:value(d.uuid, "%s (%s, %d MB)" %{ d.uuid, d.dev, d.size }) + end end -o = mount:taboption("advanced", Value, "uuid", translate("UUID"), - translate("If specified, mount the device by its UUID instead of a fixed device node")) +o:value("", translate("-- match by label --")) + -o = mount:taboption("advanced", Value, "label", translate("Label"), +o = mount:taboption("general", Value, "label", translate("Label"), translate("If specified, mount the device by the partition label instead of a fixed device node")) +o:depends("uuid", "") + +for i, d in ipairs(devices) do + if d.label then + o:value(d.label, "%s (%s, %d MB)" %{ d.label, d.dev, d.size }) + end +end + +o:value("", translate("-- match by device --")) + + +o = mount:taboption("general", Value, "device", translate("Device"), + translate("The device file of the memory or partition (e.g. /dev/sda1)")) + +o:depends({ uuid = "", label = "" }) + +for i, d in ipairs(devices) do + o:value(d.dev, "%s (%d MB)" %{ d.dev, d.size }) +end + o = mount:taboption("general", Value, "target", translate("Mount point"), translate("Specifies the directory the device is attached to")) -o:depends("is_rootfs", "") +o:value("/", translate("Use as root filesystem (/)")) +o:value("/overlay", translate("Use as external overlay (/overlay)")) + + +o = mount:taboption("general", DummyValue, "__notice", translate("Root preparation")) +o:depends("target", "/") +o.rawhtml = true +o.default = [[ +

%s

mkdir -p /tmp/introot
+mkdir -p /tmp/extroot
+mount --bind / /tmp/introot
+mount /dev/sda1 /tmp/extroot
+tar -C /tmp/intproot -cvf - . | tar -C /tmp/extroot -xf -
+umount /tmp/introot
+umount /tmp/extroot
+]] %{ + translate("Make sure to clone the root filesystem using something like the commands below:"), + +} -o = mount:taboption("general", Value, "fstype", translate("Filesystem"), +o = mount:taboption("advanced", Value, "fstype", translate("Filesystem"), translate("The filesystem that was used to format the memory (e.g. ext3)")) +o:value("", "auto") + local fs for fs in io.lines("/proc/filesystems") do fs = fs:match("%S+") @@ -79,18 +133,8 @@ o = mount:taboption("advanced", Value, "options", translate("Mount options"), o.placeholder = "defaults" -if has_extroot then - o = mount:taboption("general", Flag, "is_rootfs", translate("Use as root filesystem"), - translate("Configures this mount as overlay storage for block-extroot")) - - o:depends("fstype", "jffs") - o:depends("fstype", "ext2") - o:depends("fstype", "ext3") - o:depends("fstype", "ext4") -end - if has_fscheck then - o = mount:taboption("general", Flag, "enabled_fsck", translate("Run filesystem check"), + o = mount:taboption("advanced", Flag, "enabled_fsck", translate("Run filesystem check"), translate("Run a filesystem check before mounting the device")) end -- 2.25.1