wifidog OpenWrt luci页面

OpenWrt luci添加上传下载及网络摄像头功能。花了几天时间给OpenWrt弄了个上传下载及网络摄像头功能。对lua及luci不熟,时间花的有点多。此软件包是纯luci应用,可以安装在任意平台,网络摄像头要依赖mjpg-streamer。效果图如下:![1.png][1]![2.jpg][2]主要源码如下:controller/updownload.lua文件:    --[[    Other module    Description: File upload / download, web camera    Author: yuleniwo  [email protected]  QQ:529698939    ]]--        module("luci.controller.other", package.seeall)        function index()    local page = entry({"admin", "system", "other"}, alias("admin", "system", "other", "updownload"), _("Other"), 89)    entry({"admin", "system", "other", "updownload"}, form("updownload"), _("Upload / Download"))    if nixio.fs.access("/etc/config/mjpg-streamer") then    entry({"admin", "system", "other", "webcam"}, call("Webcam"), _("Web Camera"))    end    page.i18n = "other"    page.dependent = true    end        local translate = luci.i18n.translate    local http = luci.http        function Webcam()    local iframe = ''    local html, msg, status    local act = http.formvalue("act")    if act then    if act == "start" then    luci.sys.call("/etc/init.d/mjpg-streamer start")    elseif act == "stop" then    luci.sys.call("/etc/init.d/mjpg-streamer stop")    luci.sys.call("sleep 1")    end    end    local v = nixio.fs.glob("/dev/video[0-9]")()    if v then    if luci.sys.call("pidof mjpg_streamer > /dev/null") == 0 then    local uci, user, pwd, ip, port    uci = require "luci.model.uci".cursor()    user = uci:get("mjpg-streamer", "core", "username")    pwd = uci:get("mjpg-streamer", "core", "password")    ip = uci:get("network", "lan", "ipaddr")    port = uci:get("mjpg-streamer", "core", "port")    html = string.format(iframe, user, pwd, ip, port)    status = true    else    status = false    msg = translate("Service 'mjpg_streamer' not started.")    end    else    msg = translate("Video device not found.")    end    luci.template.render("webcam", {html = html, msg = msg, status = status})    endmodel/cbi/updownload.lua文件:    local fs = require "luci.fs"    local http = luci.http        ful = SimpleForm("upload", translate("Upload"), nil)    ful.reset = false    ful.submit = false        sul = ful:section(SimpleSection, "", translate("Upload file to '/tmp/upload/'"))    fu = sul:option(FileUpload, "")    fu.template = "cbi/other_upload"    um = sul:option(DummyValue, "", nil)    um.template = "cbi/other_dvalue"        fdl = SimpleForm("download", translate("Download"), nil)    fdl.reset = false    fdl.submit = false    sdl = fdl:section(SimpleSection, "", translate("Download file"))    fd = sdl:option(FileUpload, "")    fd.template = "cbi/other_download"    dm = sdl:option(DummyValue, "", nil)    dm.template = "cbi/other_dvalue"        function Download()    local sPath, sFile, fd, block    sPath = http.formvalue("dlfile")    sFile = nixio.fs.basename(sPath)    if luci.fs.isdirectory(sPath) then    fd = io.popen('tar -C "%s" -cz .' % {sPath}, "r")    sFile = sFile .. ".tar.gz"    else    fd = nixio.open(sPath, "r")    end    if not fd then    dm.value = translate("Couldn't open file: ") .. sPath    return    end    dm.value = nil    http.header('Content-Disposition', 'attachment; filename="%s"' % {sFile})    http.prepare_content("application/octet-stream")    while true do    block = fd:read(nixio.const.buffersize)    if (not block) or (#block ==0) then    break    else    http.write(block)    end    end    fd:close()    http.close()    end        local dir, fd    dir = "/tmp/upload/"    nixio.fs.mkdir(dir)    http.setfilehandler(    function(meta, chunk, eof)    if not fd then    if not meta then return end    fd = nixio.open(dir .. meta.file, "w")    if not fd then    um.value = translate("Create upload file error.")    return    end    end    if chunk and fd then    fd:write(chunk)    end    if eof and fd then    fd:close()    fd = nil    um.value = translate("File saved to") .. ' "/tmp/upload/' .. meta.file .. '"'    end    end    )        if luci.http.formvalue("upload") then    local f = luci.http.formvalue("ulfile")    if #f <= 0 then    um.value = translate("No specify upload file.")    end    elseif luci.http.formvalue("download") then    Download()    end        local inits, attr = {}    for i, f in ipairs(fs.glob("/tmp/upload/*")) do    attr = fs.stat(f)    if attr then    inits[i] = {}    inits[i].name = fs.basename(f)    inits[i].mtime = os.date("%Y-%m-%d %H:%M:%S", attr.mtime)    inits[i].modestr = attr.modestr    inits[i].size = tostring(attr.size)    inits[i].remove = 0    inits[i].install = false    end    end        form = SimpleForm("filelist", translate("Upload file list"), nil)    form.reset = false    form.submit = false        tb = form:section(Table, inits)    nm = tb:option(DummyValue, "name", translate("File name"))    mt = tb:option(DummyValue, "mtime", translate("Modify time"))    ms = tb:option(DummyValue, "modestr", translate("Mode string"))    sz = tb:option(DummyValue, "size", translate("Size"))    btnrm = tb:option(Button, "remove", translate("Remove"))    btnrm.render = function(self, section, scope)    self.inputstyle = "remove"    Button.render(self, section, scope)    end        btnrm.write = function(self, section)    local v = luci.fs.unlink("/tmp/upload/" .. luci.fs.basename(inits[section].name))    if v then table.remove(inits, section) end    return v    end        function IsIpkFile(name)    name = name or ""    local ext = string.lower(string.sub(name, -4, -1))    return ext == ".ipk"    end        btnis = tb:option(Button, "install", translate("Install"))    btnis.template = "cbi/other_button"    btnis.render = function(self, section, scope)    if not inits[section] then return false end    if IsIpkFile(inits[section].name) then    scope.display = ""    else    scope.display = "none"    end    self.inputstyle = "apply"    Button.render(self, section, scope)    end        btnis.write = function(self, section)    local r = luci.sys.exec(string.format('opkg --force-depends install "/tmp/upload/%s"', inits[section].name))    form.description = string.format('%s', r)    end        return ful, fdl, formview/cbi/other_button.htm文件:    <%+cbi/valueheader%>        <% if self:cfgvalue(section) ~= false then %>" style="display: <%= display %>" type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> />        <% else %>            -        <% end %>    <%+cbi/valuefooter%>view/cbi/other_dvalue.htm文件:    <%+cbi/valueheader%><%

local val = self:cfgvalue(section) or self.default or ""

write(pcdata(val))

%><%+cbi/valuefooter%>view/cbi/other_upload.htm文件:    <%+cbi/valueheader%><%:Upload file:%><%+cbi/valuefooter%>view/cbi/other_download.htm文件:    <%+cbi/valueheader%><%:Download file:%><%+cbi/valuefooter%>view/webcam.htm文件:    <%+header%>

style="display:none"<% end %>><%=msg%>

style="display:none"<% end %>>

<% if html then write(html) end %>

<%+footer%>为了使添加的软件包能在openwrt源码make menuconfig时识别出来,需要在./feeds/luci/contrib/package/luci/Makefile增加如下语句:    $(eval $(call application,other,luci my other application))软件包下载地址:[luci-app-other_0.12.ipk][3]完整源码下载地址:[luci-other_src.tar.gz][4]  [1]: http://www.wifidog.pro/usr/uploads/2015/01/1996877787.png  [2]: http://www.wifidog.pro/usr/uploads/2015/01/548487962.jpg  [3]: http://pan.baidu.com/s/1ntwp1ep  [4]: http://pan.baidu.com/s/1ntwp1ep

本文由http://www.wifidog.pro/2015/01/04/wifidog-luci.html 整理编辑,转载请注明出处

你可能感兴趣的:(wifidog OpenWrt luci页面)