我的openwrt学习笔记(三十四):Openwrt之uci 在ubuntu中的测试

来源:互联网 发布:网络推广平台找推网 编辑:程序博客网 时间:2024/05/16 15:17

我的openwrt学习笔记(三十四):Openwrt之uci 在ubuntu中的测试

UCI是Unified Configuration Interface的缩写,翻译成中文就是统一配置接口,用途就是为OpenWrt提供一个集中控制的接口。OpenWrt实现的这个工具,能够让你的不管是Lua还是PHP程序,或者SHELL程序或C程序,只要执行命令传输参数就能达到修改系统参数的目的.

Uci 在ubuntu下的使用.

 

UCI的配置文件被分割成/etc/config下的多个独立的文件,各个文件按名字含义对应系统的不同的功能配置。你可以通过文本编译器或者uci实用程序去修改这些配置文件,同时uci还提供了C语言/脚本/Lua等语言的应用程序接口,WEB配置页面例如Luci就是利用了uci所提供的API而实现对UCI配置文件的修改的。

不管你是采用文本编辑器还是通过命令行的方式修改了UCI配置文件,相应的服务或应用程序不会自动更新状态,这时你都必须调用一次/etc/init.d (re)start才能使刚刚对UCI配置文件的修改生效。许多兼容UCI的程序采用这样的方法来应用更新:在init.d脚本执行流中去修改自己程序的配置文件。具体说来,init.d脚本先去修改自己程序的原配置文件中的信息(如/etc/samba/smb.conf),之后重启一次应用程序,应用程序就会去读自己的配置文件(刚刚被init.d更新过的)再启动,这样应用程序的状态就更新了。仅仅重启应用程序,而不执行init.d脚本的话,/etc/config下的UCI配置文件是不会应用于应用程序的,新配置也就不生效了。

 

linux@ubuntu:~/linux_c/uci$ ls -l

total 56

drwxr-xr-x 5 linux linux  4096 Jul 21 09:31 uci-2014-04-11.1

-rw-rw-r-- 1 linux linux 50065 Sep 14 19:25 uci-2014-04-11.1.tar.gz

linux@ubuntu:~/linux_c/uci$ cd uci-2014-04-11.1/

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ ls -l

total 196

-rw-r--r-- 1 linux linux  4864 Jul 21 09:31 blob.c

-rw-r--r-- 1 linux linux 14589 Jul 21 09:31 cli.c

-rw-r--r-- 1 linux linux  1013 Jul 21 09:31 CMakeLists.txt

-rw-r--r-- 1 linux linux 10991 Jul 21 09:31 delta.c

-rw-r--r-- 1 linux linux 19524 Jul 21 09:31 file.c

-rw-r--r-- 1 linux linux  5290 Jul 21 09:31 libuci.c

-rw-r--r-- 1 linux linux 16379 Jul 21 09:31 list.c

-rw-r--r-- 1 linux linux 17600 Jul 21 09:31 list.h

drwxr-xr-x 2 linux linux  4096 Jul 21 09:31 lua

-rw-r--r-- 1 linux linux  2587 Jul 21 09:31 parse.c

drwxr-xr-x 2 linux linux  4096 Jul 21 09:31 sh

drwxr-xr-x 6 linux linux  4096 Jul 21 09:31 test

-rw-r--r-- 1 linux linux  1299 Jul 21 09:31 uci_blob.h

-rw-r--r-- 1 linux linux    59 Jul 21 09:31 uci_config.h.in

-rw-r--r-- 1 linux linux 17605 Jul 21 09:31 uci.h

-rw-r--r-- 1 linux linux  7220 Jul 21 09:31 uci_internal.h

-rw-r--r-- 1 linux linux 19146 Jul 21 09:31 ucimap.c

-rw-r--r-- 1 linux linux  9118 Jul 21 09:31 ucimap.h

-rw-r--r-- 1 linux linux  5109 Jul 21 09:31 util.c

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ cmake .

-- The C compiler identification is GNU

-- Check for working C compiler: /usr/bin/gcc

-- Check for working C compiler: /usr/bin/gcc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Configuring done

-- Generating done

-- Build files have been written to: /home/linux/linux_c/uci/uci-2014-04-11.1

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ make

Scanning dependencies of target uci

[ 11%] Building C object CMakeFiles/uci.dir/libuci.c.o

[ 22%] Building C object CMakeFiles/uci.dir/file.c.o

[ 33%] Building C object CMakeFiles/uci.dir/util.c.o

[ 44%] Building C object CMakeFiles/uci.dir/delta.c.o

[ 55%] Building C object CMakeFiles/uci.dir/parse.c.o

[ 66%] Building C object CMakeFiles/uci.dir/blob.c.o

Linking C shared library libuci.so

[ 66%] Built target uci

Scanning dependencies of target cli

[ 77%] Building C object CMakeFiles/cli.dir/cli.c.o

Linking C executable uci

[ 77%] Built target cli

Scanning dependencies of target ucimap

[ 88%] Building C object CMakeFiles/ucimap.dir/ucimap.c.o

Linking C static library libucimap.a

[ 88%] Built target ucimap

Scanning dependencies of target uci_lua

[100%] Building C object lua/CMakeFiles/uci_lua.dir/uci.c.o

Linking C shared module uci.so

[100%] Built target uci_lua

 

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ file uci

uci: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xd271be1dcdf6d41d5e6517da451263c291483673, not stripped

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ sudo make install

[sudo] password for linux:

[ 66%] Built target uci

[ 77%] Built target cli

[ 88%] Built target ucimap

[100%] Built target uci_lua

Install the project...

-- Install configuration: ""

-- Installing: /usr/local/include/uci.h

-- Installing: /usr/local/include/uci_config.h

-- Installing: /usr/local/include/uci_blob.h

-- Installing: /usr/local/include/ucimap.h

-- Installing: /usr/local/lib/libuci.so

-- Installing: /usr/local/bin/uci

-- Removed runtime path from "/usr/local/bin/uci"

-- Installing: /usr/local/lib/lua/5.1/uci.so

-- Removed runtime path from "/usr/local/lib/lua/5.1/uci.so"

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ which uci

/usr/local/bin/uci

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1$ uci -v

uci: error while loading shared libraries: libuci.so: cannot open shared object file: No such file or directory

 

linux@ubuntu:/usr/local/lib$ ldd /usr/local/bin/uci

         linux-gate.so.1 =>  (0xb779f000)

         libuci.so => not found

         libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e7000)

         /lib/ld-linux.so.2 (0xb77a0000)

linux@ubuntu:/usr/local/lib$ LD_DEBUG=libs uci -v

      5877:   find library=libuci.so [0]; searching

      5877:   search cache=/etc/ld.so.cache

      5877:   search path=/lib/i386-linux-gnu/tls/i686/sse2/cmov:/lib/i386-linux-gnu/tls/i686/sse2:/lib/i386-linux-gnu/tls/i686/cmov:/lib/i386-linux-gnu/tls/i686:/lib/i386-linux-gnu/tls/sse2/cmov:/lib/i386-linux-gnu/tls/sse2:/lib/i386-linux-gnu/tls/cmov:/lib/i386-linux-gnu/tls:/lib/i386-linux-gnu/i686/sse2/cmov:/lib/i386-linux-gnu/i686/sse2:/lib/i386-linux-gnu/i686/cmov:/lib/i386-linux-gnu/i686:/lib/i386-linux-gnu/sse2/cmov:/lib/i386-linux-gnu/sse2:/lib/i386-linux-gnu/cmov:/lib/i386-linux-gnu:/usr/lib/i386-linux-gnu/tls/i686/sse2/cmov:/usr/lib/i386-linux-gnu/tls/i686/sse2:/usr/lib/i386-linux-gnu/tls/i686/cmov:/usr/lib/i386-linux-gnu/tls/i686:/usr/lib/i386-linux-gnu/tls/sse2/cmov:/usr/lib/i386-linux-gnu/tls/sse2:/usr/lib/i386-linux-gnu/tls/cmov:/usr/lib/i386-linux-gnu/tls:/usr/lib/i386-linux-gnu/i686/sse2/cmov:/usr/lib/i386-linux-gnu/i686/sse2:/usr/lib/i386-linux-gnu/i686/cmov:/usr/lib/i386-linux-gnu/i686:/usr/lib/i386-linux-gnu/sse2/cmov:/usr/lib/i386-linux-gnu/sse2:/usr/lib/i386-linux-gnu/cmov:/usr/lib/i386-linux-gnu:/lib/tls/i686/sse2/cmov:/lib/tls/i686/sse2:/lib/tls/i686/cmov:/lib/tls/i686:/lib/tls/sse2/cmov:/lib/tls/sse2:/lib/tls/cmov:/lib/tls:/lib/i686/sse2/cmov:/lib/i686/sse2:/lib/i686/cmov:/lib/i686:/lib/sse2/cmov:/lib/sse2:/lib/cmov:/lib:/usr/lib/tls/i686/sse2/cmov:/usr/lib/tls/i686/sse2:/usr/lib/tls/i686/cmov:/usr/lib/tls/i686:/usr/lib/tls/sse2/cmov:/usr/lib/tls/sse2:/usr/lib/tls/cmov:/usr/lib/tls:/usr/lib/i686/sse2/cmov:/usr/lib/i686/sse2:/usr/lib/i686/cmov:/usr/lib/i686:/usr/lib/sse2/cmov:/usr/lib/sse2:/usr/lib/cmov:/usr/lib           (system search path)

      5877:     trying file=/lib/i386-linux-gnu/tls/i686/sse2/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/i686/sse2/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/i686/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/i686/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/sse2/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/sse2/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/tls/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/i686/sse2/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/i686/sse2/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/i686/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/i686/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/sse2/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/sse2/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/cmov/libuci.so

      5877:     trying file=/lib/i386-linux-gnu/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/i686/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/i686/sse2/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/i686/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/i686/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/sse2/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/tls/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/i686/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/i686/sse2/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/i686/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/i686/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/sse2/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/cmov/libuci.so

      5877:     trying file=/usr/lib/i386-linux-gnu/libuci.so

      5877:     trying file=/lib/tls/i686/sse2/cmov/libuci.so

      5877:     trying file=/lib/tls/i686/sse2/libuci.so

      5877:     trying file=/lib/tls/i686/cmov/libuci.so

      5877:     trying file=/lib/tls/i686/libuci.so

      5877:     trying file=/lib/tls/sse2/cmov/libuci.so

      5877:     trying file=/lib/tls/sse2/libuci.so

      5877:     trying file=/lib/tls/cmov/libuci.so

      5877:     trying file=/lib/tls/libuci.so

      5877:     trying file=/lib/i686/sse2/cmov/libuci.so

      5877:     trying file=/lib/i686/sse2/libuci.so

      5877:     trying file=/lib/i686/cmov/libuci.so

      5877:     trying file=/lib/i686/libuci.so

      5877:     trying file=/lib/sse2/cmov/libuci.so

      5877:     trying file=/lib/sse2/libuci.so

      5877:     trying file=/lib/cmov/libuci.so

      5877:     trying file=/lib/libuci.so

      5877:     trying file=/usr/lib/tls/i686/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/tls/i686/sse2/libuci.so

      5877:     trying file=/usr/lib/tls/i686/cmov/libuci.so

      5877:     trying file=/usr/lib/tls/i686/libuci.so

      5877:     trying file=/usr/lib/tls/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/tls/sse2/libuci.so

      5877:     trying file=/usr/lib/tls/cmov/libuci.so

      5877:     trying file=/usr/lib/tls/libuci.so

      5877:     trying file=/usr/lib/i686/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/i686/sse2/libuci.so

      5877:     trying file=/usr/lib/i686/cmov/libuci.so

      5877:     trying file=/usr/lib/i686/libuci.so

      5877:     trying file=/usr/lib/sse2/cmov/libuci.so

      5877:     trying file=/usr/lib/sse2/libuci.so

      5877:     trying file=/usr/lib/cmov/libuci.so

      5877:     trying file=/usr/lib/libuci.so

      5877:  

uci: error while loading shared libraries: libuci.so: cannot open shared object file: No such file or directory

 

 

linux@ubuntu:/usr/local/lib$ ln -s /usr/local/lib/libuci.so /usr/lib/libuci.so

ln: failed to create symbolic link `/usr/lib/libuci.so': Permission denied

linux@ubuntu:/usr/local/lib$ sudo ln -s /usr/local/lib/libuci.so /usr/lib/libuci.so

linux@ubuntu:/usr/local/lib$ ldd /usr/local/bin/uci

         linux-gate.so.1 =>  (0xb7776000)

         libuci.so => /usr/lib/libuci.so (0xb7757000)

         libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75b2000)

         libubox.so => /usr/lib/libubox.so (0xb75a7000)

         /lib/ld-linux.so.2 (0xb7777000)

         librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb759e000)

         libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb7583000)

 

OK ,test下

linux@ubuntu:/usr/local/lib$ uci --version

uci: invalid option -- '-'

Usage: uci [<options>] <command> [<arguments>]

 

Commands:

         batch

         export     [<config>]

         import     [<config>]

         changes    [<config>]

         commit     [<config>]

         add        <config> <section-type>

         add_list   <config>.<section>.<option>=<string>

         del_list   <config>.<section>.<option>=<string>

         show       [<config>[.<section>[.<option>]]]

         get        <config>.<section>[.<option>]

         set        <config>.<section>[.<option>]=<value>

         delete     <config>[.<section>[[.<option>][=<id>]]]

         rename     <config>.<section>[.<option>]=<name>

         revert     <config>[.<section>[.<option>]]

         reorder    <config>.<section>=<position>

 

Options:

         -c <path>  set the search path for config files (default: /etc/config)

         -d <str>   set the delimiter for list values in uci show

         -f <file>  use <file> as input instead of stdin

         -m         when importing, merge data into an existing package

         -n         name unnamed sections on export (default)

         -N         don't name unnamed sections

         -p <path>  add a search path for config change files

         -P <path>  add a search path for config change files and use as default

         -q         quiet mode (don't print error messages)

         -s         force strict mode (stop on parser errors, default)

         -S         disable strict mode

         -X         do not use extended syntax on 'show'

 

Uci使用

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ pwd

/home/linux/linux_c/uci/uci-2014-04-11.1/test/config

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ ls -l

total 4

-rw-r--r-- 1 linux linux 452 Jul 21 09:31 network

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ cat network

config 'alias' 'a'

         option 'interface' 'lan'

 

config 'alias' 'b'

         option 'interface' 'lan'

 

config 'interface' 'lan'

         option 'proto' 'static'

         option 'ifname' 'eth0'

         option 'test' '123'

         option 'enabled' 'off'

         option 'ipaddr' '2.3.4.5'

 

config 'interface' 'wan'

         option 'proto'   'dhcp'

         option 'ifname' 'eth1'

         option 'enabled' 'on'

         option 'aliases' 'c d'

        

config 'alias' 'c'

         option 'interface' 'wan'

 

config 'alias' 'd'

         option 'interface' 'wan'

 

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

network.a=alias

network.a.interface=lan

network.b=alias

network.b.interface=lan

network.lan=interface

network.lan.proto=static

network.lan.ifname=eth0

network.lan.test=123

network.lan.enabled=off

network.lan.ipaddr=2.3.4.5

network.wan=interface

network.wan.proto=dhcp

network.wan.ifname=eth1

network.wan.enabled=on

network.wan.aliases=c d

network.c=alias

network.c.interface=wan

network.d=alias

network.d.interface=wan

 

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show  network.b -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

network.b=alias

network.b.interface=lan

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show  network.lan -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

network.lan=interface

network.lan.proto=static

network.lan.ifname=eth0

network.lan.test=123

network.lan.enabled=off

network.lan.ipaddr=2.3.4.5

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci show  network.lan.test -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

network.lan.test=123

 

 

uci add操作

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci add  network test  -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

cfg0a6865

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci commit

uci: Entry not found

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ uci commit -c /home/linux/linux_c/uci/uci-2014-04-11.1/test/config

linux@ubuntu:~/linux_c/uci/uci-2014-04-11.1/test/config$ cat network

 

config alias 'a'

         option interface 'lan'

 

config alias 'b'

         option interface 'lan'

 

config interface 'lan'

         option proto 'static'

         option ifname 'eth0'

         option test '123'

         option enabled 'off'

         option ipaddr '2.3.4.5'

 

config interface 'wan'

         option proto 'dhcp'

         option ifname 'eth1'

         option enabled 'on'

         option aliases 'c d'

 

config alias 'c'

         option interface 'wan'

 

config alias 'd'

         option interface 'wan'

 

config wire 'test'

 

config test

 

config test

生效修改(任何写入类的语法,最终都要执行生效修改,否则所做修改只在缓存中,切记!)

 

 

创建UCI文件并测试

默认uci搜索目录是/etc/config

linux@ubuntu:/etc/config$ sudo mkdir -p /etc/config

linux@ubuntu:/etc/config$ sudo touch test

linux@ubuntu:/etc/config$ ls -l

total 0

-rw-r--r-- 1 root root 0 Sep 15 09:51 test

linux@ubuntu:/etc/config$ sudo chown linux:linux  test

linux@ubuntu:/etc/config$ ls -l

total 0

-rw-r--r-- 1 linux linux 0 Sep 15 09:51 test

linux@ubuntu:/etc/config$ chmod 777 test

linux@ubuntu:/etc/config$ vi test

linux@ubuntu:/etc/config$ uci show

test.abc=test

test.abc.test_var=value

test.abc.test_var2=value22

linux@ubuntu:/etc/config$ cat test

config 'test' 'abc'

        option 'test_var' 'value'

        option 'test_var2' 'value22'

参考

总结:

1. 和共享库相关的一些错误如何处理:

1> LD_DEBUG命令:

LD_DEBUG glibc中的 loader 为了方便自身调试而设置的一个环境变量。通过设置这个环境变量,可以方便的看到 loader 的加载过程。

 

UCI API的使用

C中调用UCI API

http://blog.chinaunix.net/uid-26675482-id-4633889.html

 

 

 

好了 ,lua 学习 , uci也学习了,接下来就是luci

 

Lua中使用UCI 例子:

Luci文件源代码:

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$cat test1.luci

#!/usr/bin/lua

--helloworld lua program

print("Hello World!")

 

 

require("uci")

 

-- Get asection type or an option

x =uci.cursor()

a =x:get("test", "abc", "test_var")

print(a)

-- Getthe configuration directory

b =x:get_confdir()

print(b)

 

-- Getall sections of a config or all values of a section

d =x:get_all("test", "abc")

print(d)

print(d["test_var"])

print(d["test_var2"])

 

uci 文件具体内容

linux@ubuntu:/etc/config$pwd

/etc/config

linux@ubuntu:/etc/config$cat test

config'test' 'abc'

        option 'test_var' 'value'

        option 'test_var2' 'value22'

 

 

执行测试输出结果:

linux@ubuntu:~/linux_c/lua/lua-5.1.5/luca_study$lua test1.luci

HelloWorld!

value

/etc/config

table:0x9190018

value

value22

 

 

Luci api

http://luci.subsignal.org/api/luci/

http://wiki.openwrt.org/doc/techref/uci#api


0 1
原创粉丝点击