1.先在system中添加一个ipv6config
操作:先在/usr/lib/ lua/luci/controller/admin/system.lua 文件中的index页面中添加
- entry({"admin", "system", "ipv6config"}, cbi("admin_system/ipv6config"), "ipv6config", 30).dependent=false
system.lua页面全部代码
- --[[
- LuCI - Lua Configuration Interface
-
Copyright 2008 Steven Barth
-
Copyright 2008-2009 Jo-Philipp Wich
- 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
- $Id: system.lua 7785 2011-10-26 00:58:12Z jow $
- ]]--
- module("luci.controller.admin.system", package.seeall)
- function index()
- entry({"admin", "system"}, alias("admin", "system", "system"), _("System"), 30).index = true
- entry({"admin", "system", "system"}, cbi("admin_system/system"), _("System"), 1)
- entry({"admin", "system", "clock_status"}, call("action_clock_status"))
- entry({"admin", "system", "admin"}, cbi("admin_system/admin"), _("Administration"), 2)
- if nixio.fs.access("/bin/opkg") then
- entry({"admin", "system", "packages"}, call("action_packages"), _("Software"), 10)
- entry({"admin", "system", "packages", "ipkg"}, form("admin_system/ipkg"))
- end
- entry({"admin", "system", "startup"}, form("admin_system/startup"), _("Startup"), 45)
- entry({"admin", "system", "crontab"}, form("admin_system/crontab"), _("Scheduled Tasks"), 46)
- if nixio.fs.access("/etc/config/fstab") then
- entry({"admin", "system", "fstab"}, cbi("admin_system/fstab"), _("Mount Points"), 50)
- entry({"admin", "system", "fstab", "mount"}, cbi("admin_system/fstab/mount"), nil).leaf = true
- entry({"admin", "system", "fstab", "swap"}, cbi("admin_system/fstab/swap"), nil).leaf = true
- end
- if nixio.fs.access("/sys/class/leds") then
- entry({"admin", "system", "leds"}, cbi("admin_system/leds"), _("LED Configuration"), 60)
- end
- entry({"admin", "system", "ipv6config"}, cbi("admin_system/ipv6config"), "ipv6config", 30).dependent=false
- entry({"admin", "system", "flashops"}, call("action_flashops"), _("Backup / Flash Firmware"), 70)
- entry({"admin", "system", "flashops", "backupfiles"}, form("admin_system/backupfiles"))
- entry({"admin", "system", "reboot"}, call("action_reboot"), _("Reboot"), 90)
- end
- function action_clock_status()
- local set = tonumber(luci.http.formvalue("set"))
- if set ~= nil and set > 0 then
- local date = os.date("*t", set)
- if date then
- -- prevent session timeoutby updating mtime
- nixio.fs.utimes(luci.sauth.sessionpath .. "/" .. luci.dispatcher.context.authsession, set, set)
- luci.sys.call("date -s '%04d-%02d-%02d %02d:%02d:%02d'" %{
- date.year, date.month, date.day, date.hour, date.min, date.sec
- })
- end
- end
- luci.http.prepare_content("application/json")
- luci.http.write_json({ timestring = os.date("%c") })
- end
- function action_packages()
- local ipkg = require("luci.model.ipkg")
- local submit = luci.http.formvalue("submit")
- local changes = false
- local install = { }
- local remove = { }
- local stdout = { "" }
- local stderr = { "" }
- local out, err
- -- Display
- local display = luci.http.formvalue("display") or "installed"
- -- Letter
- local letter = string.byte(luci.http.formvalue("letter") or "A", 1)
- letter = (letter == 35 or (letter >= 65 and letter <= 90)) and letter or 65
- -- Search query
- local query = luci.http.formvalue("query")
- query = (query ~= '') and query or nil
- -- Packets to be installed
- local ninst = submit and luci.http.formvalue("install")
- local uinst = nil
- -- Install from URL
- local url = luci.http.formvalue("url")
- if url and url ~= '' and submit then
- uinst = url
- end
- -- Do install
- if ninst then
- install[ninst], out, err = ipkg.install(ninst)
- stdout[#stdout+1] = out
- stderr[#stderr+1] = err
- changes = true
- end
- if uinst then
- local pkg
- for pkg in luci.util.imatch(uinst) do
- install[uinst], out, err = ipkg.install(pkg)
- stdout[#stdout+1] = out
- stderr[#stderr+1] = err
- changes = true
- end
- end
- -- Remove packets
- local rem = submit and luci.http.formvalue("remove")
- if rem then
- remove[rem], out, err = ipkg.remove(rem)
- stdout[#stdout+1] = out
- stderr[#stderr+1] = err
- changes = true
- end
- -- Update all packets
- local update = luci.http.formvalue("update")
- if update then
- update, out, err = ipkg.update()
- stdout[#stdout+1] = out
- stderr[#stderr+1] = err
- end
- -- Upgrade all packets
- local upgrade = luci.http.formvalue("upgrade")
- if upgrade then
- upgrade, out, err = ipkg.upgrade()
- stdout[#stdout+1] = out
- stderr[#stderr+1] = err
- end
- -- List state
- local no_lists = true
- local old_lists = false
- local tmp = nixio.fs.dir("/var/opkg-lists/")
- if tmp then
- for tmp in tmp do
- no_lists = false
- tmp = nixio.fs.stat("/var/opkg-lists/"..tmp)
- if tmp and tmp.mtime < (os.time() - (24 * 60 * 60)) then
- old_lists = true
- break
- end
- end
- end
- luci.template.render("admin_system/packages", {
- display = display,
- letter = letter,
- query = query,
- install = install,
- remove = remove,
- update = update,
- upgrade = upgrade,
- no_lists = no_lists,
- old_lists = old_lists,
- stdout = table.concat(stdout, ""),
- stderr = table.concat(stderr, "")
- })
- -- Remove index cache
- if changes then
- nixio.fs.unlink("/tmp/luci-indexcache")
- end
- end
- function action_flashops()
- local sys = require "luci.sys"
- local fs = require "luci.fs"
- local upgrade_avail = nixio.fs.access("/lib/upgrade/platform.sh")
- local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0
- local restore_cmd = "tar -xzC/ >/dev/null 2>&1"
- local backup_cmd = "tar -czT %s 2>/dev/null"
- local image_tmp = "/tmp/firmware.img"
- local function image_supported()
- -- XXX: yay...
- return ( 0 == os.execute(
- ". /etc/functions.sh; " ..
- "include /lib/upgrade; " ..
- "platform_check_image %q >/dev/null"
- % image_tmp
- ) )
- end
- local function image_checksum()
- return (luci.sys.exec("md5sum %q" % image_tmp):match("^([^%s]+)"))
- end
- local function storage_size()
- local size = 0
- if nixio.fs.access("/proc/mtd") then
- for l in io.lines("/proc/mtd") do
- local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
- if n == "linux" or n == "firmware" then
- size = tonumber(s, 16)
- break
- end
- end
- elseif nixio.fs.access("/proc/partitions") then
- for l in io.lines("/proc/partitions") do
- local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
- if b and n and not n:match('[0-9]') then
- size = tonumber(b) * 1024
- break
- end
- end
- end
- return size
- end
- local fp
- luci.http.setfilehandler(
- function(meta, chunk, eof)
- if not fp then
- if meta and meta.name == "image" then
- fp = io.open(image_tmp, "w")
- else
- fp = io.popen(restore_cmd, "w")
- end
- end
- if chunk then
- fp:write(chunk)
- end
- if eof then
- fp:close()
- end
- end
- )
- if luci.http.formvalue("backup") then
- --
- -- Assemble file list, generate backup
- --
- local filelist = "/tmp/luci-backup-list.%d" % os.time()
- sys.call(
- "( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' /etc/sysupgrade.conf " ..
- "/lib/upgrade/keep.d/* 2>/dev/null) -type f 2>/dev/null; " ..
- "opkg list-changed-conffiles ) | sort -u > %s" % filelist
- )
- if fs.access(filelist) then
- local reader = ltn12_popen(backup_cmd:format(filelist))
- luci.http.header('Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' % {
- luci.sys.hostname(), os.date("%Y-%m-%d")})
- luci.http.prepare_content("application/x-targz")
- luci.ltn12.pump.all(reader, luci.http.write)
- fs.unlink(filelist)
- end
- elseif luci.http.formvalue("restore") then
- --
- -- Unpack received .tar.gz
- --
- local upload = luci.http.formvalue("archive")
- if upload and #upload > 0 then
- luci.template.render("admin_system/applyreboot")
- luci.sys.reboot()
- end
- elseif luci.http.formvalue("image") or luci.http.formvalue("step") then
- --
- -- Initiate firmware flash
- --
- local step = tonumber(luci.http.formvalue("step") or 1)
- if step == 1 then
- if image_supported() then
- luci.template.render("admin_system/upgrade", {
- checksum = image_checksum(),
- storage = storage_size(),
- size = nixio.fs.stat(image_tmp).size,
- keep = (not not luci.http.formvalue("keep"))
- })
- else
- nixio.fs.unlink(image_tmp)
- luci.template.render("admin_system/flashops", {
- reset_avail = reset_avail,
- upgrade_avail = upgrade_avail,
- image_invalid = true
- })
- end
- --
- -- Start sysupgrade flash
- --
- elseif step == 2 then
- local keep = (luci.http.formvalue("keep") == "1") and "" or "-n"
- luci.template.render("admin_system/applyreboot", {
- title = luci.i18n.translate("Flashing..."),
-
msg = luci.i18n.translate("The system is flashing now.
DO NOT POWER OFF THE DEVICE!
Wait a few minutes until you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."), - addr = (#keep > 0) and "192.168.1.1" or nil
- })
- fork_exec("killall dropbear uhttpd; sleep 1; /sbin/sysupgrade %s %q" %{ keep, image_tmp })
- end
- elseif reset_avail and luci.http.formvalue("reset") then
- --
- -- Reset system
- --
- luci.template.render("admin_system/applyreboot", {
- title = luci.i18n.translate("Erasing..."),
- msg = luci.i18n.translate("The system is erasing the configuration partition now and will reboot itself when finished."),
- addr = "192.168.1.1"
- })
- fork_exec("killall dropbear uhttpd; sleep 1; mtd -r erase rootfs_data")
- else
- --
- -- Overview
- --
- luci.template.render("admin_system/flashops", {
- reset_avail = reset_avail,
- upgrade_avail = upgrade_avail
- })
- end
- end
- function action_passwd()
- local p1 = luci.http.formvalue("pwd1")
- local p2 = luci.http.formvalue("pwd2")
- local stat = nil
- if p1 or p2 then
- if p1 == p2 then
- stat = luci.sys.user.setpasswd("root", p1)
- else
- stat = 10
- end
- end
- luci.template.render("admin_system/passwd", {stat=stat})
- end
- function action_reboot()
- local reboot = luci.http.formvalue("reboot")
- luci.template.render("admin_system/reboot", {reboot=reboot})
- if reboot then
- luci.sys.reboot()
- end
- end
- function fork_exec(command)
- local pid = nixio.fork()
- if pid > 0 then
- return
- elseif pid == 0 then
- -- change to root dir
- nixio.chdir("/")
- -- patch stdin, out, err to /dev/null
- local null = nixio.open("/dev/null", "w+")
- if null then
- nixio.dup(null, nixio.stderr)
- nixio.dup(null, nixio.stdout)
- nixio.dup(null, nixio.stdin)
- if null:fileno() > 2 then
- null:close()
- end
- end
- -- replace with target command
- nixio.exec("/bin/sh", "-c", command)
- end
- end
- function ltn12_popen(command)
- local fdi, fdo = nixio.pipe()
- local pid = nixio.fork()
- if pid > 0 then
- fdo:close()
- local close
- return function()
- local buffer = fdi:read(2048)
- local wpid, stat = nixio.waitpid(pid, "nohang")
- if not close and wpid and stat == "exited" then
- close = true
- end
- if buffer and #buffer > 0 then
- return buffer
- elseif close then
- fdi:close()
- return nil
- end
- end
- elseif pid == 0 then
- nixio.dup(fdo, nixio.stdout)
- fdi:close()
- fdo:close()
- nixio.exec("/bin/sh", "-c", command)
- end
- end
效果如下:
2. 编写model
操作:在先在/usr/lib/ lua/luci/model/cbi/admin_system文件中的添加ipv6config.lua 文件
文件全部代码
- require("luci.sys")
- require("luci.sys.zoneinfo")
- require("luci.tools.webadmin")
- require("luci.fs")
- require("luci.config")
- local m, s, o
- m = Map("ipv6config", translate("ipv6config"), translate("this is ipv6 pre config"))
- m:chain("luci")
- s = m:section(TypedSection, "ipv6config", translate("System ipv6"))
- s.anonymous = true
- s.addremove = false
- s:tab("general", translate("General Settings"))
- o = s:taboption("general", Value, "ipv6pre", translate("ipv6 pre config"))
- o.datatype = "ipv6config"
- function o.write(self, section, value)
- Value.write(self, section, value)
- end
- return m
效果:
3. 添加配置文件
操作:在/etc/config中添加ipv6config文件
代码:
- config 'ipv6config'
- option 'ipv6pre' '2011:86'
ps: 注意
config 中的ipv6config文件中的ipv6confg与ipv6pre与model中ipv6config.lua两个字段的对应