From b8c2d340f3bde4b3c1a5a7e3635ac0109d4ecddd Mon Sep 17 00:00:00 2001 From: Daniel Dickinson Date: Wed, 2 Dec 2015 00:17:52 -0500 Subject: [PATCH 1/5] luci-mod-admin-full: fstab: Add ability to unmount non-system mounts Add an unmount button for non-system mounts which will unmount the corresponding file system. --- .../luasrc/model/cbi/admin_system/fstab.lua | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) 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 d4e834daff..4edc811939 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 @@ -37,8 +37,32 @@ block:close() m = Map("fstab", translate("Mount Points")) local mounts = luci.sys.mounts() +local non_system_mounts = {} +for rawmount, val in pairs(mounts) do + repeat + val.umount = false + if (val.mountpoint == "/") then + break + elseif (val.mountpoint == "/overlay") then + break + elseif (val.mountpoint == "/rom") then + break + elseif (val.mountpoint == "/tmp") then + break + elseif (val.mountpoint == "/tmp/shm") then + break + elseif (val.mountpoint == "/tmp/upgrade") then + break + elseif (val.mountpoint == "/dev") then + break + end + val.umount = true + until true + non_system_mounts[rawmount] = val + end +end -v = m:section(Table, mounts, translate("Mounted file systems")) +v = m:section(Table, non_system_mounts, translate("Mounted file systems")) fs = v:option(DummyValue, "fs", translate("Filesystem")) @@ -61,7 +85,21 @@ function used.cfgvalue(self, section) ) .. ")" end +unmount = v:option(Button, "unmount", translate("Unmount")) +unmount.render = function(self, section, scope) + if non_system_mounts[section].umount then + self.title = translate("Unmount") + self.inputstyle = "remove" + Button.render(self, section, scope) + end +end +unmount.write = function(self, section) + if non_system_mounts[section].umount then + luci.sys.call("/bin/umount '%s'" % luci.util.shellstartsqescape(non_system_mounts[section].mountpoint)) + return luci.http.redirect(luci.dispatcher.build_url("admin/system", "fstab")) + end +end mount = m:section(TypedSection, "mount", translate("Mount Points"), translate("Mount Points define at which point a memory device will be attached to the filesystem")) mount.anonymous = true From 031cab418c4a7463da815158e2de31e47b588783 Mon Sep 17 00:00:00 2001 From: Daniel Dickinson Date: Wed, 2 Dec 2015 00:19:47 -0500 Subject: [PATCH 2/5] luci-mod-admin-full: Don't show jail bind mounts The user is unlikely to care about the plethora of jail bind mounts when using jails, so don't display them in this app. --- .../luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua | 1 + 1 file changed, 1 insertion(+) 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 4edc811939..dee86d9274 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 @@ -39,6 +39,7 @@ m = Map("fstab", translate("Mount Points")) local mounts = luci.sys.mounts() local non_system_mounts = {} for rawmount, val in pairs(mounts) do + if (string.find(val.mountpoint, "/tmp/.jail") == nil) then repeat val.umount = false if (val.mountpoint == "/") then From 89f74f77dab023393832a91551aca6e8a02030fb Mon Sep 17 00:00:00 2001 From: Daniel Dickinson Date: Wed, 2 Dec 2015 00:21:36 -0500 Subject: [PATCH 3/5] luci-mod-admin-full: fstab: Add ability to set global options like anonymous mounts Previously the global configuration options were missing the the LuCI configuration, however these options are useful, so make them available to the UI. --- .../luasrc/model/cbi/admin_system/fstab.lua | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) 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 dee86d9274..e6f207b2e8 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 @@ -35,6 +35,29 @@ block:close() m = Map("fstab", translate("Mount Points")) +s = m:section(TypedSection, "global", translate("Global Settings")) +s.addremove = false +s.anonymous = true + +o = s:option(Flag, "anon_swap", translate("Anonymous Swap"), translate("Mount swap not specifically configured")) +o.default = o.disabled +o.rmempty = false + +o = s:option(Flag, "anon_mount", translate("Anonymous Mount"), translate("Mount filesystems not specifically configured")) +o.default = o.disabled +o.rmempty = false + +o = s:option(Flag, "auto_swap", translate("Automount Swap"), translate("Automatically mount swap on hotplug")) +o.default = o.enabled +o.rmempty = false + +o = s:option(Flag, "auto_mount", translate("Automount Filesystem"), translate("Automatically mount filesystems on hotplug")) +o.default = o.enabled +o.rmempty = false + +o = s:option(Flag, "check_fs", translate("Check fileystems before mount"), translate("Automatically check filesystem for errors before mounting")) +o.default = o.disabled +o.rmempty = false local mounts = luci.sys.mounts() local non_system_mounts = {} From 1d5cab4ced656d71e1913470b8b06e051bd492d3 Mon Sep 17 00:00:00 2001 From: Daniel Dickinson Date: Wed, 2 Dec 2015 00:23:04 -0500 Subject: [PATCH 4/5] luci-mod-admin-full: fstab: Add ability to redo the detection of block devices Adds a button that does block detect and write the new configuration to /etc/config/fstab. --- .../luasrc/model/cbi/admin_system/fstab.lua | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 e6f207b2e8..fd466d5c26 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 @@ -33,12 +33,19 @@ until not ln block:close() - m = Map("fstab", translate("Mount Points")) s = m:section(TypedSection, "global", translate("Global Settings")) s.addremove = false s.anonymous = true +detect = s:option(Button, "block_detect", translate("Generate Config"), translate("Find all currently attached filesystems and swap and replace configuration with defaults based on what was detected")) +detect.inputstyle = "reload" + +detect.write = function(self, section) + luci.sys.call("block detect >/etc/config/fstab") + luci.http.redirect(luci.dispatcher.build_url("admin/system", "fstab")) +end + o = s:option(Flag, "anon_swap", translate("Anonymous Swap"), translate("Mount swap not specifically configured")) o.default = o.disabled o.rmempty = false From 829467b62748e8c4fb587636801fa03165f72e8a Mon Sep 17 00:00:00 2001 From: Daniel Dickinson Date: Tue, 1 Dec 2015 23:47:42 -0500 Subject: [PATCH 5/5] luci-base: Add function for shell single-quote parameter escaping When using os.execute or luci.sys.call the shell is called with the command line which means that standard shell interpretation of strings occurs. To allow to use these commands more easily we add functions for properly escaping single-quoted strings used on the command line --- modules/luci-base/luasrc/util.lua | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/modules/luci-base/luasrc/util.lua b/modules/luci-base/luasrc/util.lua index 787bc66f90..5bf0beb6c2 100644 --- a/modules/luci-base/luasrc/util.lua +++ b/modules/luci-base/luasrc/util.lua @@ -151,6 +151,28 @@ function striptags(value) return value and tparser.striptags(tostring(value)) end +-- for bash, ash and similar shells single-quoted strings are taken +-- literally except for single quotes (which terminate the string) +-- (and the exception noted below for dash (-) at the start of a +-- command line parameter). +function shellsqescape(value) + local res + res, _ = string.gsub(res, "'", "'\\''") + return res +end + +-- bash, ash and other similar shells interpret a dash (-) at the start +-- of a command-line parameters as an option indicator regardless of +-- whether it is inside a single-quoted string. It must be backlash +-- escaped to resolve this. This requires in some funky special-case +-- handling. It may actually be a property of the getopt function +-- rather than the shell proper. +function shellstartsqescape(value) + res, _ = string.gsub(value, "^\-", "\\-") + res, _ = string.gsub(res, "^-", "\-") + return shellsqescape(value) +end + -- containing the resulting substrings. The optional max parameter specifies -- the number of bytes to process, regardless of the actual length of the given -- string. The optional last parameter, regex, specifies whether the separator