luci-base: Add function for shell single-quote parameter escaping 561/head
authorDaniel Dickinson <openwrt@daniel.thecshore.com>
Wed, 2 Dec 2015 04:47:42 +0000 (23:47 -0500)
committerDaniel Dickinson <openwrt@daniel.thecshore.com>
Wed, 2 Dec 2015 07:19:02 +0000 (02:19 -0500)
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

index 787bc66..5bf0beb 100644 (file)
@@ -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