OpenWrt自定义luci页面来修改配置文件

2023-11-02

在使用OpenWrt路由器的过程中,经常需要根据需要改改配置文件然后重新启动服务什么的,一般的做法是SSH登录路由器后台,使用vi编辑器修改文件,然后使用/etc/init.d/xxxx restart 来重启服务,次数多了就会觉得很繁琐,光SSH输入密码就够麻烦的,所以不妨自己写一个luci界面在路由器web后台修改配置文件并完成重启这一系列操作。下面以Pdnsd为例进行介绍

首先看一下实现效果



要实现一个luci界面至少需要如下三个文件

A:  /etc/config/pdnsd
B : /usr/lib/lua/luci/controller/pdnsd.lua
C:  /usr/lib/lua/luci/model/cbi/pdnsd.lua


其中

A的作用是存储你在luci界面上的控件中填入的数值,比如用户名密码,是否可用,选择的选项等等,是一个uci配置文件,可以使用shell的uci命令进行读取

B的作用是通告OP系统你的自定义界面的显示位置,相邻排序,并指向C文件

C是最核心的文件,里面记录了你luci页面的控件布局,控件的显示内容,和控件触发事件的执行脚本

在创建每个文件之前,首先要了解一个概念,就是luci是MVC架构的,而且MVC的理念在luci上得到了最充分最明显的阐释,是理解MVC架构非常形象生动的例子,下面我就简单介绍一下luci的MVC架构。

首先请看下面的两个截图,这是两个不同OP的路由器安装同一个luci ipk安装包之后的界面,界面风格差别很大,不知道的还以为这是两个不同的软件。但其实不是,因为他们来源于同一个ipk安装包,不仅代码一模一样,里面控件的类型和数量也是一致的。而且执行效果也是一样的。


这上面左面应该是潘多拉固件或者DreamBox等等固件的截图,而右面是OP默认界面的原图,右面的加入了一些bootstrap样式。

那为什么同样的luci代码会产生如此风格迥异的界面,并且自动的适配路由器当前固件的风格呢,这就是luci使用lua脚本使用MVC架构的奥义了。同时我们也知道,luci的开发不是像网页一样使用html,css,js进行开发,而是使用lua脚本和uci接口,下面就来仔细介绍一下luci的简单开发过程。

首先我们创建上面必需的三个文件,做一个简单的界面


/etc/config/pdnsd

config arguments
由于这个文件是记录你配置好的参数的,由于我们现在并不需要记录什么参数,所以写个uci的开头就够,其中“arguments”是一个固定标志


/usr/lib/lua/luci/controller/pdnsd.lua

module("luci.controller.pdnsd", package.seeall)
function index()
        if not nixio.fs.access("/etc/config/pdnsd") then
                return
        end
        entry({"admin", "services", "pdnsd"}, cbi("pdnsd"), _("Pdnsd")).dependent = true
end
这个文件的含义是:首先检查有没有/etc/config/pdnsd文件,如果有就继续向下执行,没有就当什么都没有发生过

第一行中,固定格式是“luci.controller.我的项目名”,因为我们所有的lua文件和/etc/config下面的配置文件都是以pdnsd来进行命名的,所以应该填“luci.controller.pdnsd

倒数第二行是一个固定格式

entry(路径, 调用目标, _("显示名称"), 显示顺序)

路径:{"admin", "services", "pdnsd"} 意思是登录用户可见,“服务”主菜单下,“名字叫pdnsd的配置文件”,如果你想要放到“系统”菜单下,就把“services”改成“system”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenWrt自定义luci页面来修改配置文件 的相关文章

  • 如何终止Lua脚本?

    如何终止 Lua 脚本 现在我在 exit 方面遇到问题 我不知道为什么 这更像是一个 Minecraft ComputerCraft 问题 因为它使用了包含的 API 这是我的代码 while true do if turtle dete
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • 如何从 Artifactory 存储库下载最新的工件?

    我需要来自存储库的最新工件 例如快照 人工工厂 http en wikipedia org wiki Software repository Repository managers 该工件需要通过脚本复制到服务器 Linux 我有什么选择
  • 在 iOS 模拟器中安装应用程序的脚本

    我正在尝试自动化构建应用程序 运行单元测试以及最终运行 UI 测试的过程 我正在通过命令行 xcodebuild sdk iphonesimulator6 0 在某个目录中构建应用程序 如何通过命令行 在 Library Applicati
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • Lua中有状态迭代器和无状态迭代器的区别

    Lua中无状态和有状态迭代器有什么区别 请详细解释一下 什么时候需要使用无状态 什么时候需要使用另一种 我需要例子来理解这个概念 首先让我们就一个定义达成一致 在 Lua 中 迭代器是function 类似对象 每次调用时都会返回序列中的下
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • 如何让 STDOUT 和 STDERR 都转到终端和日志文件?

    我有一个脚本 将由非技术用户交互式运行 该脚本将状态更新写入 STDOUT 以便用户可以确定脚本运行正常 我希望将Stdout和STDERR重定向到终端 以便用户可以看到脚本正在工作 并查看是否存在问题 我还希望将两个流都重定向到日志文件
  • 无法使用 Java ProcessBuilder 启动带参数的 shell 脚本

    我正在尝试使用 ProcessBuilder 执行带有命令行参数的 shell 脚本 该 shell 脚本又调用使用此参数的其他两个 shell 脚本 第一个 shell 脚本运行良好 但当第二个 shell 脚本启动时 它返回退出代码 1
  • 在 UNIX 中删除相同的文件

    我正在处理大量 30 000 个 大小约为 10MB 的文件 其中一些 我估计 2 实际上是重复的 我只需要为每个重复的对 或三元组 保留一个副本 您能建议我一种有效的方法吗 我正在unix上工作 您可以尝试使用此代码片段在删除之前先获取所
  • Bash 参数引号和 eval

    我编写了一个 bash 日志记录库 用我公司当前正在使用的一些复杂脚本来实现 在进行日志调用时 我一直致力于提供调用脚本的脚本文件名 BASH SOURCE 和行号 LINENO 但是 我不想依赖用户或实现脚本来将这两个变量作为参数传递 如
  • 如果未设置,则从控制台读取 Makefile 变量

    我正在更新一个从外部源访问某些资源的 Makefile 即存在以下形式的规则 External cvs up 对于不受限制的资源 它可以按预期工作 现在 出现了功能漂移 外部资源需要更复杂的登录 因此规则已更改为与此没有太大不同的内容 Ex
  • shell中如何求数组的长度?

    shell中如何求数组的长度 例如 arr 1 2 3 4 5 我想得到它的长度 在本例中是 5 a 1 2 3 4 echo a 4
  • sh read 命令会吃掉输入中的反斜杠吗?

    也许最容易用一个例子来解释 echo echo while read in do echo in done 看来read命令将输入 中的反斜杠解释为转义符并删除它们 我需要逐行处理文件而不更改其内容 并且我不知道如何停止在这里智能读取 有任
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • Grep 递归和计数

    需要在具有大量子目录的目录中搜索文件内的字符串 我在用着 grep c r string here 我怎样才能找到总数量 如何仅输出至少具有一个实例的文件 使用 Bash 的进程替换 这给出了我认为是您想要的输出 如果不是 请澄清问题 gr
  • 在 bash 中,如何除以两个变量并输出四舍五入到小数点后 5 位的答案? [复制]

    这个问题在这里已经有答案了 我将两个变量作为输入 将它们相除后 我希望将输出四舍五入到小数点后 5 位 我已经尝试过这种方法 gt sum 12 n 7 output scale 5 sum n bc echo output 我的代码没有显
  • 在 Shell 中提取匹配模式后的字符串

    如何提取 Shell 脚本中匹配模式后面的任何字符串 我知道 Perl 脚本中的此功能 但不知道 Shell 脚本中的功能 以下是示例 subject 01 这是一个示例主题 可能会有所不同 我必须提取 Subject 01 后面的任何字符
  • 将变量插入 sh 脚本命令[重复]

    这个问题在这里已经有答案了 bin sh f set proj dir OutputDir for projname in lib proj1 proj2 do mv scripts projname BYTECODE proj dir s
  • Bash 的源命令无法处理从互联网上卷曲的文件

    我正在尝试使用curl从互联网获取脚本文件 如下所示 source lt curl url echo done 我看到的是 完成 得到了回响before卷曲甚至开始下载文件 这是实际的命令和输出 bash 3 2 source lt cur

随机推荐

  • 湖南麒麟面试 2014

    地点 华科8号楼415 问题 1 内核安全 2 缓冲区溢出是什么造成的 3 内存泄露是怎么造成的 内存出错 4 在一个局部函数内malloc malloc是在堆上还是在栈上 函数结束时内存发生什么变化 5 堆和栈的区别 6 什么情况下定义变
  • Java的垃圾回收机制

    一 点睛 当程序创建对象 数组等引用类型实体时 系统都会在堆内存中为之分配一块内存区 对象就保存在这块内存区中 当这块内存不再被任何引用变量引用时 这块内存就变成了垃圾 等待垃圾回收机制进行回收 垃圾回收机制的特点 垃圾回收机制只负责回收堆
  • VMware认证专家(VCP)详细介绍

    VMware认证专家 VCP 适合对象 系统管理员 系统工程师 IT架构师 VMware ESX ESXi vCenter Server 操作员 VMware认证专家 VCP 课程介绍 VMware vSphere安装 配置 管理 包括VM
  • hdoj-1069-Monkey and Banana【动态规划】

    Monkey and Banana Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 9489 Acc
  • 安装vmware tools不能复制粘贴解决方案

    根据网上大部分教程安装tools结果没办法使用 解决方案 先将之前安装的tools卸载干净 sudo apt get autoremove open vm tools 然后将虚拟机联网在网上去重新下载vmware tools sudo ap
  • selenium小项目实践

    1 斗鱼爬虫 爬取斗鱼直播平台的所有房间信息 https www douyu com directory all 1 1 思路分析 数据的位置 每个房间的数据都在id live list contentbox的ul中 实现翻页和控制程序结束
  • FileInputStream 读取文件内容

    public class Test public static void main String args throws IOException final String path D 1 txt 1 得到数据文件 File file ne
  • 用Java实现阶乘

    阶乘在高中时都学过 比如说5的阶乘用数学表示就是5 在写的通俗一点就是5 4 3 2 1 用一个数学公式表示就是n 1 2 3 n 阶乘也可以用代码实现 Java中有三中循环结构 先看for循环的 import java util Scan
  • Unity光照渲染设置

    先看效果图 下面是设置 1 将 Edit gt Player gt Other Settings Color Space这个调成Linear模式 有更好的阴影效果 2 光照Lighting的设置 Window gt Rendering gt
  • 论文阅读链接

    中文期刊 英文期刊 问题 中文期刊 机械工程学报 自动化学报 计算机学报 机器人 中国科学 系列 中国科学信息科学 中国科学技术科学 英文期刊 IEEE Xplore 出版 IEEE Transactions on Artificial I
  • Redis 查看value大小

    线上会经常遇到大key问题 这时候就需要通过 bigkeys来找出最大的key 但是往往和最大的key前缀相同的一类key都会比较大 所以打算一次性获取此类key中比较大的key 官方文档中查看获取value大小的时间成本较高 于是查看有关
  • docker镜像 ubuntu:22.04 21.04 apt-get update 报错 Problem executing scripts APT::Update::Post-Invoke ‘rm

    docker镜像 ubuntu 22 04 21 04 apt get update 报错 Problem executing scripts APT Update Post Invoke rm f var cache apt archiv
  • 因果推断学习笔记三——Uplift模型

    一 Uplift模型 因果推断在互联网界应用主要是基于Uplift model来预测额外收益提升ROI Uplift模型帮助商家计算人群营销敏感度 驱动收益模拟预算和投放策略制定 促成营销推广效率的最大化 同时如何衡量和预测营销干预带来的
  • 低功耗技术(一)动态功耗与静态功耗

    原创 AndyICer Andy的ICer之路 1月5日 低功耗技术 一 动态功耗与静态功耗 一 动态功耗 翻转功耗 Switching Power 翻转功耗是由充放电电容引起的动态功耗 其推导过程很简单 但是这个最终的结果却十分重要 sw
  • Jedis使用java连接Redis

    Maven创建 创建一个maven的项目 其中pom xml依赖为
  • 在Ubuntu中安装eclipse

    1 下载JDK和eclipse jdk下载网址 http www oracle com technetwork java javase downloads jdk8 downloads 2133151 html eclipse下载网址 ht
  • AD20铺铜操作及设置

    AD20铺铜方法 首先 建议铺铜前 先滴泪 提高信号完整性 1 铺铜 放置 gt 铺铜 2 铺铜时 先设置属性 如果以前设置过 不用重设 点键盘上的 Tab 键 调出 属性 界面 3 操作 沿着四个点 到第4点时 点鼠标左键 完成划区域 如
  • stm32同芯片但不同flash工程更换Device出现报错

    目录 1 问题描述 2 解决方案 1 问题描述 stm32同芯片但不同flash工程更换Device出现报错 2 解决方案 更换Device 我是从ZE换为C8 把这个从HD更换为MD 解决
  • Three.js - 透视相机(PerspectiveCamera)(三)

    简介 在three js中 摄像机的作用就是不断的拍摄我们创建好的场景 然后通过渲染器渲染到屏幕中 想通过不同的角度观看场景 就需要修改摄像机的位置来拍摄场景 本文详细介绍的是透视相机 PerspectiveCamera 它是用来模拟人眼所
  • OpenWrt自定义luci页面来修改配置文件

    在使用OpenWrt路由器的过程中 经常需要根据需要改改配置文件然后重新启动服务什么的 一般的做法是SSH登录路由器后台 使用vi编辑器修改文件 然后使用 etc init d xxxx restart 来重启服务 次数多了就会觉得很繁琐