openwrt uci shell API-程序员宅基地

技术标签: linux  openwrt  

UCI shell API使用说明

uci shell接口定义在/lib/functions.sh文件中,参考openwrt官网[OpenWrt Wiki] Configuration in scripts

1.config_cb()、option_cb()和list_cd()函数

UCI每次解析section时都会调用callback;config_load完成后会生成对config_cb、option_cb和list_cb()的调用。如果在解析每个选项时需要保存一些数据进行操作,需要定义三个config_cb()、option_cb()和list_cb()函数。

使用举例:

●测试脚本

cat test.sh

#! /bin/sh

. /lib/functions.sh

    

config_cb() {

          local type="$1"

          local name="$2"

          echo "config_cb type= $type"

          echo "config_cb name= $name"

          # commands to be run for every section

}

option_cb() {

          local name="$1"

          local value="$2"

         echo "option_cb name=: $name"

         echo "option_cb value=: $value"

         # commands to be run for every option

}

list_cb() {

         local name="$1"

         local value="$2"

         echo "list_cb name=: $name"

         echo "list_cb value=: $value"

         # commands to be run for every list item

}

config_load network

    

●network脚本:

cat /etc/config/network

config interface 'loopback'

        option ifname 'lo'

        option proto 'static'

        option ipaddr '127.0.0.1'

        option netmask '255.0.0.0'

    

config globals 'globals'

        option ula_prefix 'auto'

config switch

        option name 'switch0'

config interface 'lan'

        option ifname 'eth0 eth1'

        option force_link '1'

        option type 'bridge'

        option proto 'static'

        option ipaddr '192.168.3.1'

        option netmask '255.255.255.0'

        option ip6assign '60'

        option multicast_querier '0'

        option igmp_snooping '0'

        option ieee1905managed '1'

config interface 'wan'

        option ifname 'eth2'

        option proto 'dhcp'

config interface 'wan6'

        option ifname 'eth2'

        option proto 'dhcpv6'

●测试结果:

./test.sh

config_cb type= interface

config_cb name= loopback

option_cb name=: ifname

option_cb value=: lo

option_cb name=: proto

option_cb value=: static

option_cb name=: ipaddr

option_cb value=: 127.0.0.1

option_cb name=: netmask

option_cb value=: 255.0.0.0

option_cb name=: up

option_cb value=: 1

option_cb name=: device

option_cb value=: lo

config_cb type= globals

config_cb name= globals

option_cb name=: ula_prefix

option_cb value=: auto

config_cb type= switch

config_cb name= cfg033777

option_cb name=: name

option_cb value=: switch0

config_cb type= interface

config_cb name= lan

option_cb name=: force_link

option_cb value=: 1

option_cb name=: type

option_cb value=: bridge

option_cb name=: proto

option_cb value=: static

option_cb name=: ipaddr

option_cb value=: 192.168.3.1

option_cb name=: netmask

option_cb value=: 255.255.255.0

option_cb name=: ip6assign

option_cb value=: 60

option_cb name=: multicast_querier

option_cb value=: 0

option_cb name=: igmp_snooping

option_cb value=: 0

option_cb name=: ieee1905managed

option_cb value=: 1

option_cb name=: up

option_cb value=: 1

option_cb name=: device

option_cb value=: eth0 eth1

option_cb name=: ifname

option_cb value=: br-lan

config_cb type= interface

config_cb name= wan

option_cb name=: ifname

option_cb value=: eth2

option_cb name=: proto

option_cb value=: dhcp

option_cb name=: up

option_cb value=: 1

option_cb name=: device

option_cb value=: eth2

config_cb type= interface

config_cb name= wan6

option_cb name=: ifname

option_cb value=: eth2

option_cb name=: proto

option_cb value=: dhcpv6

config_cb type=

config_cb name=

2.config_load函数:

在执行uci的shell接口的时候,都需要先执行config_load函数将package加载进环境中。

函数格式:config_load <package>

脚本源码:

config_load() {

        [ -n "$IPKG_INSTROOT" ] && return 0

        uci_load "$@"

}

3.config_foreach函数:

config_foreach基于回调解析的一种方法过程的迭代函数。

格式:config_foreach <callback_func> [<section type>] ]<customer_val>]

callback_func回调函数,section_type配置文件类型,若不设置该参数,则获取脚本所有的类型,customer_val变量可选,将脚本类型赋值到customer_val变量。

脚本源码:

config_foreach() {

        local ___function="$1"

        [ "$#" -ge 1 ] && shift

        local ___type="$1"

        [ "$#" -ge 1 ] && shift

        local section cfgtype

        [ -z "$CONFIG_SECTIONS" ] && return 0

        for section in ${CONFIG_SECTIONS}; do

                config_get cfgtype "$section" TYPE

                [ -n "$___type" -a "x$cfgtype" != "x$___type" ] && continue

                eval "$___function \"\$section\" \"\$@\""

        done

}

应用举例:

●脚本内容

cat /etc/config/network

config interface 'loopback'

        option ifname 'lo'

        option proto 'static'

        option ipaddr '127.0.0.1'

        option netmask '255.0.0.0'

config globals 'globals'

        option ula_prefix 'auto'

config switch

        option name 'switch0'

config interface 'lan'

        option ifname 'eth0 eth1'

        option force_link '1'

        option type 'bridge'

        option proto 'static'

        option ipaddr '192.168.3.1'

        option netmask '255.255.255.0'

        option ip6assign '60'

        option multicast_querier '0'

        option igmp_snooping '0'

        option ieee1905managed '1'

config interface 'wan'

        option ifname 'eth2'

        option proto 'dhcp'

config interface 'wan6'

        option ifname 'eth2'

        option proto 'dhcpv6'

●测试脚本:

#! /bin/sh

. /lib/functions.sh

handle_interface() {

          local config="$1"

         local custom="$2"

         echo "$custom $config"

         # run commands for every interface section

}

config_load network

config_foreach handle_interface interface interfacetype:

●执行结果:

interfacetype: loopback

interfacetype: lan

interfacetype: wan

interfacetype: wan6、

4.config_get函数:

格式:config_get <variable> <setction name> <option name> [<default>]

config_get从etction name中获取option name的vlaue保存到variable中,若option name的vlaue存在就返回value,若不存在就返回default。

应用举例1(以/etc/config/network为例说明):

●测试脚本1

#! /bin/sh

. /lib/functions.sh

config_load network

config_get ifacex 'loopback' ipaddr

echo "------- is $ifacex"

●执行结果:------- is 127.0.0.1

●测试脚本2

config_load network

config_get ifacex 'lan' type

echo "------- is $ifacex"

●执行结果------- is bridge

●测试脚本3

config_load wireless

config_get ifacex 'wifi1' type

echo "------- is $ifacex"

●执行结果:------- is qcawificfg80211

应用举例2(以/etc/config/system为例说明)

●测试脚本4

配置文件内容

cat /etc/config/system

config system

        option hostname OpenWrt

        option timezone UTC

        option log_size 64

config timeserver ntp

        list server     0.openwrt.pool.ntp.org

        list server     1.openwrt.pool.ntp.org

        list server     2.openwrt.pool.ntp.org

        list server     3.openwrt.pool.ntp.org

        option enabled 1

        option enable_server 0

脚本:

#! /bin/sh

. /lib/functions.sh

config_load system

config_get ifacex 'ntp' server

echo "------- is $ifacex"

结果:------- is 0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org 3.openwrt.pool.ntp.org

5.config_set函数:

config_set将value设置到对象中。

格式:config_set <section> <option> <value>

config_set更改的值仅保存在内存中。对config_get的后续调用将返回更新后的值,底层配置文件不会更改。如果要更改值,需要使用/etc/functions.sh自动包含的/lib/config/uci.sh中的uci_*函数。

6.config_list_foreach函数:

config_list_foreach与config_foreach类似都是以回调解析的一种方法过程迭代,主要用于list的section选项。

函数格式:config_list_foreach <section name> <list name> <handle_back>

应用举例(以/etc/config/system例说明):

●配置文件

cat /etc/config/system

config system

        option hostname OpenWrt

        option timezone UTC

        option log_size 64

config timeserver ntp

        list server     0.openwrt.pool.ntp.org

        list server     1.openwrt.pool.ntp.org

        list server     2.openwrt.pool.ntp.org

        list server     3.openwrt.pool.ntp.org

        option enabled 1

        option enable_server 0

●测试脚本:

#! /bin/sh

. /lib/functions.sh

handle_ntp() {

         local value="$1"

          echo "$value"

         # do something with $value

}

config_load system

config_list_foreach ntp server handle_ntp

●结果

0.openwrt.pool.ntp.org

1.openwrt.pool.ntp.org

2.openwrt.pool.ntp.org

3.openwrt.pool.ntp.org

7.config_get_bool函数:

与config_get功能类似。将返回值转换成bool类型

8.append函数:

格式:append <variable2> <variable1>

variable1的变量是从config_get获取的数据,append就是将variable1的数据保存到variable2变量中

●测试脚本:

从/etc/config/network中保存wifi1的channel、hwmode、htmode的值保存到axx.conf文件

#! /bin/sh

. /lib/functions.sh

config_load wireless

config_get ch 'wifi1' channel

echo "1.-----$ch"

append _buffer "channel $ch"

    

config_get hwmd 'wifi1' hwmode

echo "2.----$hwmd"

append _buffer "hwmode $hwmd"

    

config_get htmd 'wifi1' htmode

echo "3.----$htmd"

append _buffer "htmode $htmd"

echo "$_buffer" >> /tmp/axx.conf

●结果:

cat axx.conf

channel auto hwmode 11axg htmode HT40

9.list_contains

格式:list_contains <variable1> <variable2>

list_contains从左到右将变量variable2的内容从变量variable1的尾部删除。

●脚本源码:

list_contains() {

        local var="$1"

        local str="$2"

        local val

        eval "val=\" \${$var} \""

        [ "${val%% $str *}" != "$val" ]

}

●应用举例:

#! /bin/sh

test=ssssyyyyxxxxyyyy111

echo "${test%%yy*}"

结果:ssss

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/KunTu2015/article/details/137107463

智能推荐

通用存储过程分页(top max模式)版本(性能相对之前的not in版本极大提高) _top 搭配not in 性能-程序员宅基地

文章浏览阅读1.3k次。 --/*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/--/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/--/*-----存储过程 分页处理 孙伟 2005-04-21修改 添加Distinct查询功能-------*/--/*-----存储过程 分页处理 孙伟 2005-05-18修改 多字段排序规则问题-_top 搭配not in 性能

vue新玩法VueUse-工具库@vueuse/core-程序员宅基地

文章浏览阅读1.5w次,点赞3次,收藏10次。VueUse官方链接一、什么是VueUseVueUse不是Vue.use !!!它是一个基于 Composition API 的实用函数集合,下面是具体的一些用法二、如何引入import { 具体方法 } from ‘@vueuse/core’三、下面来看看一些具体的用法1、useMouse:监听当前鼠标坐标的一个方法,他会实时的获取鼠标的当前的位置2、usePreferredDark:判断用户是否喜欢深色的方法,他会实时的判断用户是否喜欢深色的主题3、useLocalStorage:数据_vueuse/core

统计学5大基本概念,建议收藏!(文末送书)-程序员宅基地

文章浏览阅读736次。转自:爱数据LoveD大家好,我是小z,也可以叫我阿粥~今天给大家分享一波统计学重要概念,顺便前排提示文末送书~从高的角度来看,统计学是一种利用数学理论来进行数据分析的技术。象柱状图这种基本的可视化形式,会给你更加全面的信息。但是,通过统计学我们可以以更富有信息驱动力和针对性的方式对数据进行操作。所涉及的数学理论帮助我们形成数据的具体结论,而不仅仅是猜测。利用统计学,我们可以更深入、更细致地观察数..._统计学五大基本原理

Java多线程4:synchronized的使用场景和原理简介_synchronized常见使用场景 threadsyntest.new myrunnable3-程序员宅基地

文章浏览阅读2.4k次,点赞3次,收藏9次。一、synchronized使用1.1 synchronized介绍在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。synchronized可以修饰普通方法,静态方法和代码块。当synchronize..._synchronized常见使用场景 threadsyntest.new myrunnable3

Windows python用impyla连接远程Hive数据库_python impyla demo-程序员宅基地

文章浏览阅读260次。安装下述包:thirftpythirft-saslthirftpure-sasl(卸载sasl,若要用pyhive,sasl轮子安装路径Link)impyla# -*- coding:UTF-8 -*-from impala.dbapi import connect#下述host只是个demo,需填入真实ipconn = connect(host='11.22.33.44', port=21050, auth_mechanism='PLAIN',user='yourusername',pa_python impyla demo

php 编译 pdo_mysql_Linux正确编译pdo_mysql扩展-程序员宅基地

文章浏览阅读280次。错误编译pdo_mysqlphp扩展的操作流程,以及解决错误并成功完成编译pdo_mysql新编译的PHP环境运行项目时报错PHP Fatal error: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'原因是没有加载pdo_mysql扩展错误配置pdo_mysql及编译cd ext/pdo_mysqlphpize./configure --w..._/usr/local/php7.4.24/ext/pdo_mysql/php_pdo_mysql_int.h:29:11: fatal error: m

随便推点

解决:Qt项目构建成功,但是运行异常退出。_qt安装后构建可以,运行就一直提示程序异常-程序员宅基地

文章浏览阅读2k次。构建:从debug换成release:就可以正常运行了_qt安装后构建可以,运行就一直提示程序异常

李宏毅2021机器学习笔记(一)_李宏毅2021机器学习笔记 百度-程序员宅基地

文章浏览阅读601次。什么是机器学习?简单来说就是让机器帮我们找一个函数,即一个映射。如声音—>文字的语音识别函数自变量可以是向量,矩阵(图像识别),序列输出是数值、图片等课程讲什么?一、监督学习,给定图片人工的告诉机器其类型,训练模型,让机器拥有 f(图片)—>类型 这一函数二、训练模型之前进行Pre-train,让机器学习如何辨别图片这一基本功,因为人工输入图片类型过于繁琐。只需传入大量图片资料即可自动训练。如把图片翻转、变色,询问机器是不是可以..._李宏毅2021机器学习笔记 百度

stdmap c++两个map合并成一个map ,c++多个map的合并_c++ map合并-程序员宅基地

文章浏览阅读1.7k次。两个map合并成一个map,用insert()函数就可以了,看代码:#include <map>#include <iostream>int main(){ std::map<int, int> v1 = {{1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}}; std::map<int, int> v2 = { {3, 2}, {4, 2}, {5, 2}, {6, 2}, {7_c++ map合并

CLion:使用CLion新建一个C语言项目_clion创建c语言项目-程序员宅基地

文章浏览阅读1.3w次,点赞12次,收藏85次。步骤1、2、3、我喜欢一个文件夹下存放多个项目,所以删掉生成的CMakeList.txt、main.c和cmake-build-debug文件。新建一个List目录,并在该目录下新建CMakeList.txt4、创建一个C文件进行测试5、创建好后,提示在List文件夹下的CMakeList.txt添加:include_directories(.)add_executable(List-List01 List01.c) //List是文件夹名称,List01.c是具体文件名称_clion创建c语言项目

鸟哥的 linux 的私房菜 基础学习篇,鸟哥的 Linux 私房菜 -- 基础学习篇-程序员宅基地

文章浏览阅读5k次。再次强调:底下的几篇短文是学习 Linux 的基础文件,这些文件是基础中的基础,如果您能将其中的文件都看完,并且消化过,那么未来在管理 Linux 主机以及架设网站方面,就能够达到『事半功倍』的成效,请不要忽略这部份了!否则,再怎么讨论都是枉然的啦! ^_^第一部份:Linux 的规划与安装Linux 本身虽然具有相当强大的功能,不过,如果不能理解 Linux 的工作能力,那么 Linux 能做的..._鸟哥linux基础篇

材质面向摄像机_ue5 通过材质使面片始终朝向摄像机-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏10次。材质面向摄像机单贴图面向摄像机组合贴图面向摄像机单贴图面向摄像机主要是调用RotateAboutAxis这个材质函数输入旋转轴 001计算旋转角度去除camera的z轴影响算出物体到摄像机的向量归一化后算出夹角FVector::Rotation()函数的内部实现(局部)FRotator R; // Find yaw.R.Yaw = FMath::Atan2(Y,X) * (180.f / PI); // Find pitch.R.Pitch = FMath_ue5 通过材质使面片始终朝向摄像机

推荐文章

热门文章

相关标签