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  xzm2@qq.com  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 整理编辑,转载请注明出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容