treewide: filter shell arguments through shellquote() where applicable
[project/luci.git] / applications / luci-app-wol / luasrc / model / cbi / wol.lua
index ece9e49..43b87dd 100644 (file)
@@ -1,16 +1,9 @@
---[[
-LuCI - Lua Configuration Interface
-
-Copyright 2010 Jo-Philipp Wich <xm@subsignal.org>
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-]]--
+-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
+-- Licensed to the public under the Apache License 2.0.
 
+local utl = require "luci.util"
 local sys = require "luci.sys"
+local ipc = require "luci.ip"
 local fs  = require "nixio.fs"
 
 m = SimpleForm("wol", translate("Wake on LAN"),
@@ -57,10 +50,18 @@ sys.net.mac_hints(function(mac, name)
        host:value(mac, "%s (%s)" %{ mac, name })
 end)
 
+if has_ewk then
+       broadcast = s:option(Flag, "broadcast",
+               translate("Send to broadcast address"))
+       if has_wol then
+               broadcast:depends("binary", "/usr/bin/etherwake")
+       end
+end
 
 function host.write(self, s, val)
        local host = luci.http.formvalue("cbid.wol.1.mac")
-       if host and #host > 0 and host:match("^[a-fA-F0-9:]+$") then
+       local mac = ipc.checkmac(host)
+       if mac then
                local cmd
                local util = luci.http.formvalue("cbid.wol.1.binary") or (
                        has_ewk and "/usr/bin/etherwake" or "/usr/bin/wol"
@@ -68,15 +69,17 @@ function host.write(self, s, val)
 
                if util == "/usr/bin/etherwake" then
                        local iface = luci.http.formvalue("cbid.wol.1.iface")
-                       cmd = "%s -D%s %q" %{
-                               util, (iface ~= "" and " -i %q" % iface or ""), host
+                       local broadcast = luci.http.formvalue("cbid.wol.1.broadcast")
+                       cmd = "%s -D%s %s %q 2>&1" %{
+                               util, (iface ~= "" and " -i %s" % utl.shellquote(iface) or ""),
+                               (broadcast == "1" and " -b" or ""), mac
                        }
                else
-                       cmd = "%s -v %q" %{ util, host }
+                       cmd = "%s -v %q" %{ util, mac }
                end
 
                local msg = "<p><strong>%s</strong><br /><br /><code>%s<br /><br />" %{
-                       translate("Starting WoL utility:"), cmd
+                       translate("Starting WoL utility:"), utl.pcdata(cmd)
                }
 
                local p = io.popen(cmd .. " 2>&1")