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 <jow@openwrt.org>
This commit is contained in:
parent
5ef2946ede
commit
622cfc673a
3 changed files with 138 additions and 49 deletions
|
@ -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
|
||||
|
|
|
@ -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 (<em>%s</em>)" %{ 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 (<em>%s</em>)" %{ 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 (<em>%s</em>)" %{ 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"))
|
||||
|
|
|
@ -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, "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
|
||||
if d.uuid then
|
||||
o:value(d.uuid, "%s (%s, %d MB)" %{ d.uuid, d.dev, d.size })
|
||||
end
|
||||
end
|
||||
|
||||
o:value("", translate("-- match by 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 (<abbr title=\"for example\">e.g.</abbr> <code>/dev/sda1</code>)"))
|
||||
|
||||
o:depends({ uuid = "", label = "" })
|
||||
|
||||
for i, d in ipairs(devices) do
|
||||
o:value(d, size[d] and "%s (%s MB)" % {d, size[d]})
|
||||
o:value(d.dev, "%s (%d MB)" %{ d.dev, d.size })
|
||||
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 = mount:taboption("advanced", Value, "label", translate("Label"),
|
||||
translate("If specified, mount the device by the partition label instead of a fixed device node"))
|
||||
|
||||
|
||||
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", Value, "fstype", translate("Filesystem"),
|
||||
o = mount:taboption("general", DummyValue, "__notice", translate("Root preparation"))
|
||||
o:depends("target", "/")
|
||||
o.rawhtml = true
|
||||
o.default = [[
|
||||
<p>%s</p><pre>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</pre>
|
||||
]] %{
|
||||
translate("Make sure to clone the root filesystem using something like the commands below:"),
|
||||
|
||||
}
|
||||
|
||||
|
||||
o = mount:taboption("advanced", Value, "fstype", translate("Filesystem"),
|
||||
translate("The filesystem that was used to format the memory (<abbr title=\"for example\">e.g.</abbr> <samp><abbr title=\"Third Extended Filesystem\">ext3</abbr></samp>)"))
|
||||
|
||||
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
|
||||
|
||||
|
|
Loading…
Reference in a new issue