go-uci库使用示例及注意事项
1. 前言
之前介绍过openwrt的uci相关内容,这里就go uci库使用及注意事项做下简单总结,注意点可能会引起一些不易发觉的bug。
2. 示例
使用的go-uci库:https://github.com/digineo/go-uci
import "github.com/digineo/go-uci"
func main() {
//强制读取,否则由于内存中缓存的内容导致配置文件中内容在shell或者原生配置web中修改后这里读取的内容还是未修改前的
err = uci.LoadConfig("network", true)
if err != nil {
fmt.Println(err)
}
err = uci.Commit()
if err != nil {
fmt.Println(err)
}
// use the default tree (/etc/config)
if values, ok := uci.Get("system", "@system[0]", "hostname"); ok {
fmt.Println("hostanme", values)
//=> hostname [OpenWrt]
}
// use a custom tree
u := uci.NewTree("/path/to/config")
if values, ok := u.Get("network", "lan", "ifname"); ok {
fmt.Println("network.lan.ifname", values)
//=> network.lan.ifname [eth0.2]
}
if sectionExists := u.Set("network", "lan", "ipaddr", "192.168.7.1"); !sectionExists {
_ = u.AddSection("network", "lan", "interface")
_ = u.Set("network", "lan", "ipaddr", "192.168.7.1")
}
u.Commit() // or uci.Revert()
}
3. 注意点
默认的示例程序没有加载配置文件,但是当从shell或者openwrt的web界面上修改配置文件后程序无法察觉(程序不重新执行配置文件是加载一次一直存在内存中的,这导致外界更改文件后没有影响到加载到内存中的数据),这会导致从这些地方修改内容和程序中修改配置文件不统一,比如初始ip为192.168.1.1,而张三通过shell临时修改ip为192.168.1.3而忘记修改回去了,而李四通过一直运行的程序查看到的ip还是未修改前的ip,觉得没问题,实际上ip已经被修改为1.3了而不是李四认为的没问题的1.1的ip。