OpenWrt UCIコマンドの使い方
この記事では、UCIコンフィグレーションファイルを操作するためのUCIコマンドの使い方について紹介します。
主な内容はOpenWrt公式ドキュメントでも紹介されていますので、その補足としてお読みください。
ここでは、まずUCIコンフィグレーションファイルの構造を説明してから各UCIコマンドの詳細な使い方を紹介します。
なお、UCIコンフィグレーションファイルを管理するUCIシステムの全体的な理解については 第3回 OpenWrt開発入門 UCIコマンドによるネットワーク・Wi-Fi設定 ― UCIシステムの仕組みを参照して下さい。
それでは、行きます。
目次
- UCIコンフィグレーションファイルの構造理解
- パラメーター表記
- 名前付きセクションと匿名セクション
- 実はあまり違いがない名前付きと匿名セクション
- UCIコマンド一覧
- showコマンド
- setコマンド
- deleteコマンド
- commitコマンド
- addコマンド
- revertコマンド
- getコマンド
- add_listコマンド
- del_listコマンド
- renameコマンド
- reorderコマンド
- exportコマンド
- importコマンド
- changesコマンド
- batchコマンド
- 関連記事
UCIコンフィグレーションファイルの構造理解
UCIコンフィグレーションファイルには、以下の3つの構成要素が存在します。
- UCIコンフィグレーションファイル<config>
- セクション<section>
- オプションとリスト<option/list>
それぞれの構成要素が持つ役割について説明します。
- UCIコンフィグレーションファイル<Config>
- UCIコンフィグレーションファイルは、通常は /etc/config ディレクトリに格納されるファイルです。 これらのファイルは、ネットワークやWi-Fi、SSHなどの関連する設定をまとめて管理するために使用されます。 UCI構文形式の "package <file-name>" に由来して、シェルスクリプトやプログラム上ではこれらのファイルをパッケージと呼ぶことがあります。
- セクション<section>
-
セクションは、UCIコンフィグレーションファイルに内包されるデータグループです。
例えば、ネットワークのLAN設定などのように、関連する設定の大きなまとまりであるUCIコンフィグレーションファイルが持つ、 より細かいまとまりをセクションとして管理します。 - セクションには、タイプ情報が含まれており、アプリケーションはこれを利用して、 そのセクションが何に対する設定グループであるかを認識します。たとえば、networkコンフィグレーションファイルのlanセクション (network.lan)のタイプはinterfaceであり、このパラメーターを読み取るnetifdは、このlanセクションをNICに関する設定だと認識します。 ただし、実際にLAN側のNICに関する設定なのかは、lanセクション内の情報次第です。
- オプションとリスト<option/list>
-
オプションとリストはセクションに内包されるパラメーターそのものです。
オプションは単一データ、リストは複数のデータを指します。 -
オプション、リストで管理される値は文字列です。
そのため、シングルクォーテーションで囲まれて表現されます。 - なお、UCIコンフィグレーションファイルを読み込むOpenWrtアプリケーションは、 これらのデータが持つ特定文字列('0','1','false','true'など)を論理値として解釈する場合があります。 このことはシェルスクリプト、Luaスクリプト用UCI操作関数のconfig_get_boolや get_boolを見ることでも分かります。
- オプションとリストはそれぞれ以下のような特徴を持ちます。
-
オプション
- ・セクション内に設定する単一のデータ
- ・一意の名前を持ち、他のオプションと区別される
- (例: ネットワークのLAN設定におけるIPアドレスやネットマスク
-
リスト
- ・セクション内に設定する複数のデータ
- ・同じ名前を複数持つことができ、各要素はインデックスで識別される
- (例: ネットワークのNTPサーバーリスト
パラメーター表記
UCIコンフィグレーションファイルでは、2つのパラメータ表記方法としてHuman-friendly表記とProgrammable表記があります。
- Human-friendly表記
- 人間が読みやすいようにインデントやタブによって整えられた表記法です。 FLASH領域(/etc/config)内のUCIコンフィグレーションファイルはすべてHuman-friendly形式で表現されます。 そのため、通常はcatコマンドを使用して、Human-friendly形式のパラメータを見ることができます。
root@OpenWrt:~# cat /etc/config/dropbear config dropbear option PasswordAuth 'on' option RootPasswordAuth 'on' option Port '22'
- Programmable表記
- プログラム上で扱いやすいように各構成要素をドット区切りで表現した表記法です。 これにより、プログラム内の実行コード上でUCIコマンドの引数として指定することができます。 ステージング領域(/tmp/.uci)内のUCIコンフィグレーションファイルはすべてProgrammable形式で表現されます。 また、uci showコマンドの表示結果もProgrammable形式で表示されます。
root@OpenWrt:~# uci show dropbear dropbear.@dropbear[0]=dropbear dropbear.@dropbear[0].PasswordAuth='on' dropbear.@dropbear[0].RootPasswordAuth='on' dropbear.@dropbear[0].Port='22'
名前付きセクションと匿名セクション
前々節で紹介したセクションには、名前付きセクションと匿名セクションの2つが存在します。
- 名前付きセクション
-
その名の通り、名前を付けられたセクションです。
ネットワークのUCIコンフィグレーションファイル(network)を例に出せば、lanセクションやloopbackセクションが名前付きセクションです。 - catコマンドによるHuman-friendly表記では、セクション定義にはセクション名とタイプ名が表示されます。
- uci showコマンドによるProgrammable表記では、<config>.<section>=<section-type>で表示されます。
Human-friendly表記 root@OpenWrt:~# cat /etc/config/network config interface 'loopback' <--セクション名はloopbackです option device 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' .....省略 config interface 'lan' <--セクション名はlanです option proto 'static' option netmask '255.255.255.0' option ip6assign '60' option device 'wlan0' option ipaddr '192.168.2.1' .....省略
Programmable表記 root@OpenWrt:~# uci show network.loopback network.loopback=interface <--セクション名はloopbackです network.loopback.device='lo' network.loopback.proto='static' network.loopback.ipaddr='127.0.0.1' network.loopback.netmask='255.0.0.0' root@OpenWrt:~# uci show network.lan network.lan=interface <--セクション名はlanです network.lan.proto='static' network.lan.netmask='255.255.255.0' network.lan.ip6assign='60' network.lan.device='wlan0' network.lan.ipaddr='192.168.2.1'
- 匿名セクション
-
無名のセクションです。
Human-friendry形式では匿名セクションは表示されませんが、Programmable形式で表示させた場合は仮の名前「@+タイプ名+インデックス」が付けられます。 また、匿名セクションを「@+タイプ名+インデックス」で指定してshowコマンドを実行すると「cfg+uid」形式で表示されます。 - catコマンドによるHuman-friendly表記では、匿名セクションは何も表示されません。
-
uci showコマンドによるProgrammable表記では、匿名セクションは便宜上の名前である「@+タイプ名+インデックス」で表示されます。
- さらに「@+タイプ名+インデックス」で匿名セクションを指定して表示させると「cfg+uid」形式で匿名セクションが表示されます。 uidはUCIシステムがセクション情報を管理するためのユニークなID番号です。匿名セクションの本当の名前と言っても良いかもしれません。
- このようにセクションには名前付きと匿名の2種類が存在します。しかし正直な話、これらの違いはアプリケーションにとってはどうでも良いことです(※)。 大半のOpenWrtアプリケーションやその中の機能にとって大事なのは、特定の名前を持ったセクションではなく、 そのセクションが一体どんな種類の情報を持っているかです。そして、その情報の種類を示すのがタイプ情報になります。
- ネットワーク・WiFi制御用アプリケーションのnetifdを例にすれば、LANのネットワークインタフェース設定を読み込むためには Lanセクション(network.lan)が必要なのではなく、名前は何でもいいけどタイプ情報がinterfaceのセクションが必要だということです。 (通常のOpenWrtのデフォルト設定では、LAN設定用にnetwork.lanが用意されていますので、このことを意識することはありません。)
- タイプ情報がinterfaceであるセクションのオプションを読み込んだ結果、それがLAN設定として本当に正しいので目的とするLANインタフェースが適用 されるわけです。つまり、名前付きセクションとは人間が読みやすいように配慮して名前を与えられたセクションです。そのセクションを実際に管理するアプリケーション 側では、特定のセクションの名前を認識するケースはほとんど(もしくは全く)ありません。
- 注意:デフォルトではdhcpやfirewallコンフィグの各オプションで、networkコンフィグのlanセクション(network.lan)を 制御対象のネットワーク設定とするように名指しをしてますので、名前を変えるとパケットを通さなくなったりします。逆にオプションでターゲットとなるセクション名を指定しない限り、アプリケーション が特定のセクション名を認識することは(ほぼ)ないということを意味します。
- このように、セクションの名前に縛られないことで、アプリケーションは同じ対象に関する複数の設定を管理できます。 大半のOpenWrtアプリケーションは同じ対象に関する設定を持ったセクションの読み込み順番により、適用する対象設定を決定します。 セクションの配置はreorderコマンドで変更可能です。
- ※セクション名を認識するアプリケーションやその中の一部機能もありますが、設定に対する柔軟性は高くありません。
Human-friendly表記
root@OpenWrt:~# cat /etc/config/network
.....省略 config device <--匿名セクションは何も表示されません option name 'br-lan' option type 'bridge' list ports 'eth0' .....省略
Programmable表記その1 root@OpenWrt:~# uci show network .....省略 network.@device[0]=device <--匿名セクションは「@+タイプ名+インデックス」の仮の名前を与えられます network.@device[0].name='br-lan' network.@device[0].type='bridge' network.@device[0].ports='eth0' .....省略
Programmable表記その2 root@OpenWrt:~# uci show network.@device[0] .....省略 network.cfg030f15=device <--「@+タイプ名+インデックス」の代わりに「cfg+uid」形式で表示されます network.cfg030f15.name='br-lan' network.cfg030f15.type='bridge' network.cfg030f15.ports='eth0' .....省略
実はあまり違いがない名前付きと匿名セクション
上記の説明を裏付ける関数の1つとして、Luaスクリプト用UCI関数のget_first関数があります。
UCIコマンド一覧
ここまでの説明で、UCIコマンドの引数の指定方法が分ってきます。
以下はUCIコマンドのヘルプ画面に表示される説明を並べたものです。
個別のコマンドの詳細については、次節を確認してください。
UCIコマンド | 引数フォーマット | 用途 |
---|---|---|
show | [<config>[.<section>[.<option>]]] | コンフィグ、セクション、タイプ、オプションの値を表示します。 |
get | <config>.<section>[.<option>]=<value> | 指定セクションのタイプ情報、オプション値を取得します。 |
set | <config>.<section>[.<option>]=<value> | 指定した設定ファイル、セクション、オプションの値を変更します。 |
add_list | <config>.<section>.<option>=<string> | セクションのリストを追加します。 |
add | <config> <section-type> | 新しい匿名セクションを追加します。 |
delete | <config>.<section>[.<option>] | 指定した設定ファイル、セクション、オプションを削除します。 |
del_list | <config>.<section>.<option>=<string> | セクションのリストを削除します。 |
commit | [<config>] | 変更を反映させるために使用します。 |
revert | <config>[.<section>[.<option>]] | 変更を破棄して元に戻すために使用します。 |
changes | [<config>] | 変更点を表示します。 |
rename | <config>.<section>[.<option>]=<name> | 設定ファイル、セクション、オプションの名前を変更します。 |
reorder | <config>.<section>=<position> | セクションの順序を変更します。 |
export | [<config>] | 指定された設定ファイルをファイルにエクスポートします。 |
import | [<config>] | 指定されたファイルから設定をインポートします。 |
batch | 複数のUCIコマンドをバッチ処理します。 |
showコマンド
showコマンドは、指定UCIコンフィグレーションファイルのパラメーターをProgrammable表記で標準出力します。
このコマンドは、指定のUCIコンフィグレーションファイルに対応するステージング領域 (/tmp/.uci) とFLASH領域 (/etc/config) のマージ結果を表示します。 つまり、このコマンドの出力は、実際にOpenWrtが使用する設定値です。
- USAGE 1 全てのUCIコンフィグレーションファイルのパラメーターを標準出力する
- 引数を指定しないで実行すると、全てのUCIコンフィグレーションファイルのパラメーターを標準出力します。
uci show
root@OpenWrt:~# uci show dhcp.odhcpd.maindhcp='0' dhcp.odhcpd.leasefile='/tmp/hosts/odhcpd' dhcp.odhcpd.leasetrigger='/usr/sbin/odhcpd-update' dhcp.odhcpd.loglevel='4' dropbear.@dropbear[0]=dropbear dropbear.@dropbear[0].PasswordAuth='on' dropbear.@dropbear[0].RootPasswordAuth='on' dropbear.@dropbear[0].Port='22' firewall.@defaults[0]=defaults firewall.@defaults[0].syn_flood='1' firewall.@defaults[0].input='ACCEPT' firewall.@defaults[0].output='ACCEPT' .....省略
- USAGE 2 指定UCIコンフィグレーションファイルのパラメーターを標準出力する
- UCIコンフィグレーションファイル(例:network)を指定して実行すると、その対象が持つパラメーターを標準出力します。
- ※このとき、匿名セクションの表示はタイプ名にプレフィックス(接頭辞)「@」、サフィックス(接尾辞)にインデックス(添え字)を付けた仮の名前になります。 上の例では@device[0]が匿名セクションです。
uci show <config>
root@OpenWrt:~# uci show network network.loopback=interface network.loopback.device='lo' network.loopback.proto='static' network.loopback.ipaddr='127.0.0.1' network.loopback.netmask='255.0.0.0' network.globals=globals network.globals.ula_prefix='fdd6:3a80:bcd9::/48' network.@device[0]=device network.@device[0].name='br-lan' network.@device[0].type='bridge' network.@device[0].ports='eth0' .....省略
- USAGE 3 指定セクションのパラメーターを標準出力する
- UCIコンフィグレーションファイルとそのセクションを指定(今回の場合ではnetwork.lan)して実行すると、そのセクション内のパラメーターを標準出力します。
- また、匿名セクションを指定して実行すると「@+タイプ名+インデックス」の仮のセクション名の部分が「cfg+uid」形式 で表示されます。
uci show <config>.<section>
root@OpenWrt:~# uci show network.lan network.lan=interface network.lan.proto='static' network.lan.netmask='255.255.255.0' network.lan.ip6assign='60' network.lan.ipaddr='192.168.4.1' network.lan.device='wlan0'
root@OpenWrt:~# uci show network.@device[0] network.cfg030f15=device network.cfg030f15.name='br-lan' network.cfg030f15.type='bridge' network.cfg030f15.ports='eth0'
- USAGE 4 指定パラメーターを標準出力する
- パラメーターを特定するための全ての情報(UCIコンフィグレーションファイル・セクション・オプション or リスト)を指定して実行すると、 そのパラメーターを標準出力します。
- また、匿名セクションが管理するパラメーターを指定して実行すると「@+タイプ名+インデックス」の仮のセクション名の部分が(cfg+uid)形式 で表示されます。
uci show <section>.<section>.<option>
root@OpenWrt:~# uci show network.lan.proto network.lan.proto='static'
root@OpenWrt:~# uci show network.@device[0].name network.cfg030f15.name='br-lan'
setコマンド
setコマンドは、指定されたセクションやパラメーターを変更または追加し、その結果をステージング領域である/tmp/.uciに保存します。
一般的に、その後にcommitコマンドを実行することで、ステージング領域(/tmp/.uci/)の内容がFLASH領域(/etc/config/)の対応する UCIコンフィグレーションファイルにコピー(マージ)されます。
ただし、ステージング領域はRAM上に配置されているため、rebootやpoweroffによって電源断が発生すると格納されたデータは消去されます。
- USAGE 1 名前付きセクションを追加する
- 次の例では、UCIコンフィグレーションファイルcoffeeを作成してbeansタイプのarabicaとrobustaセクションを追加しています。 追加したこれらセクションの内容はステージング領域に保存されます。
- 通常、このようにして作成したセクションに対し、さらにsetコマンドを使用してパラメーターを追加していきます(USAGE2)。
uci set <config>.<section>=<section-type>
root@OpenWrt:~# touch /etc/config/coffee root@OpenWrt:~# uci set coffee.arabica=beans root@OpenWrt:~# uci set coffee.robusta=beans root@OpenWrt:~# cat /tmp/.uci/coffee coffee.arabica='beans' coffee.robusta='beans'
- USAGE 2 パラメーターを変更・追加する
- 実行すると、既存パラメーターであれば変更、新規パラメーターであれば追加となります。 この結果はステージング領域に保存されます。
uci set <config>.<section>.<option>=<value>
USAGE1の内容 root@OpenWrt:~# touch /etc/config/coffee root@OpenWrt:~# uci set coffee.arabica=beans root@OpenWrt:~# uci set coffee.robusta=beans ↓↓↓ここからが本題 root@OpenWrt:~# uci set coffee.arabica.scent='very good' root@OpenWrt:~# uci set coffee.arabica.taste=excellent root@OpenWrt:~# uci set coffee.robusta.scent=good root@OpenWrt:~# uci set coffee.robusta.taste=good root@OpenWrt:~# cat /tmp/.uci/coffee coffee.arabica='beans' coffee.robusta='beans' coffee.arabica.scent='very good' coffee.arabica.taste='excellent' coffee.robusta.scent='good' coffee.robusta.taste='good'
deleteコマンド
指定セクションやパラメーターを削除して、その結果をステージング領域である/tmp/.uciに保存します。
通常、続けてcommitコマンドを実行することでステージング領域(/tmp/.uci)の削除内容がFLASH領域(/etc/config) の対応するUCIコンフィグレーションファイルにコピー(マージ)されます。
※ステージング領域はRAM上に配置されるため、rebootやpoweroffによって電源断が発生すると格納データは消去されます。
- USAGE 1 指定セクションを削除する
- 実行すると、指定セクションの削除が変更内容としてステージング領域に保存されます。 このときステージング領域では、マイナス付きで指定セクションが記録されていることが確認できます。
uci delete <config>.<section>
テスト用UCIコンフィグレーションファイルの作成 root@OpenWrt:~# touch /etc/config/coffee root@OpenWrt:~# uci set coffee.arabica=beans root@OpenWrt:~# uci set coffee.robusta=beans root@OpenWrt:~# uci commit ↓↓↓ここからが本題 root@OpenWrt:~# uci delete coffee.arabica root@OpenWrt:~# cat /tmp/.uci/coffee -coffee.arabica
- USAGE 2 指定パラメーターを削除する
- 実行すると、指定パラメーターの削除が変更内容としてステージング領域に保存されます。 このときステージング領域では、マイナス付きで指定パラメーターが記録されていることが確認できます。
uci delete <config>.<section>.<option>
テスト用UCIコンフィグレーションファイルの作成 root@OpenWrt:~# touch /etc/config/coffee root@OpenWrt:~# uci set coffee.arabica=beans root@OpenWrt:~# uci set coffee.robusta=beans root@OpenWrt:~# uci set coffee.arabica.scent='very good' root@OpenWrt:~# uci set coffee.arabica.taste=excellent root@OpenWrt:~# uci set coffee.robusta.scent=good root@OpenWrt:~# uci set coffee.robusta.taste=good root@OpenWrt:~# uci commit coffee ↓↓↓ここからが本題 root@OpenWrt:~# uci delete coffee.robusta.scent root@OpenWrt:~# cat /tmp/.uci/coffee -coffee.robusta.scent
commitコマンド
setコマンドやdeleteコマンド、addコマンドなどによってステージング領域(/tmp/.uci)に保存されたパラメーター変更内容を FLASH領域(/etc/config)の対応するUCIコンフィグレーションファイルにコピー(マージ)します。
正常にcommitコマンドが実行されると、ステージング領域(/tmp/.uci)内の該当UCIコンフィグレーションファイルとそのパラメーターは消去されます。
通常、commitコマンド実行後は対象のUCIコンフィグレーションファイルを環境変数として使用するアプリケーション に対し、「/etc/init.d/network [reload or restart]」などを実行することで設定値を適用します。
- USAGE 1 ステージング領域の全ての変更内容をFLASH領域にコピー(マージ)する
-
引数を指定しないで実行すると、/tmp/.uciにステージングされている全てのパラメーター変更内容がFLASH領域(/etc/config)にコピーされます。
テスト用UCIコンフィグレーションファイルcoffeeの作成 root@OpenWrt:~# touch /etc/config/coffee root@OpenWrt:~# uci set coffee.arabica=beans root@OpenWrt:~# uci set coffee.robusta=beans root@OpenWrt:~# uci set coffee.arabica.scent='very good' root@OpenWrt:~# uci set coffee.arabica.taste=excellent root@OpenWrt:~# uci set coffee.robusta.scent=good root@OpenWrt:~# uci set coffee.robusta.taste=good 続けて、テスト用UCIコンフィグレーションファイルteaの作成 root@OpenWrt:~# touch /etc/config/tea root@OpenWrt:~# uci set tea.darjeeling=leaf root@OpenWrt:~# uci set tea.uva=leaf root@OpenWrt:~# uci set tea.darjeeling.scent='very good' root@OpenWrt:~# uci set tea.darjeeling.taste=excellent root@OpenWrt:~# uci set tea.uva.scent=excellent root@OpenWrt:~# uci set tea.uva.taste=excellent root@OpenWrt:~# cat /tmp/.uci/coffee <--上の操作で、ステージング領域に追加内容が入ってます coffee.arabica='beans' coffee.robusta='beans' coffee.arabica.scent='very good' coffee.arabica.taste='excellent' coffee.robusta.scent='good' coffee.robusta.taste='good' root@OpenWrt:~# cat /tmp/.uci/tea <--上の操作で、ステージング領域に追加内容が入ってます tea.darjeeling='leaf' tea.uva='leaf' tea.darjeeling.scent='very good' tea.darjeeling.taste='excellent' tea.uva.scent='excellent' tea.uva.taste='excellent' root@OpenWrt:~# cat /etc/config/coffee <--この時点では何も入っていないので表示されません root@OpenWrt:~# cat /etc/config/tea root@OpenWrt:~# uci commit <--ステージング領域からFLASH領域へマージ(コミット) root@OpenWrt:~# cat /etc/config/coffee <--コミットされたので、追加内容が入ってます config beans 'arabica' option scent 'very good' option taste 'excellent' config beans 'robusta' option scent 'good' option taste 'good' root@OpenWrt:~# cat /etc/config/tea <--コミットされたので、追加内容が入ってます config leaf 'darjeeling option scent 'very good' option taste 'excellent' config leaf 'uva' option scent 'excellent' option taste 'excellent'
uci commit
- USAGE 2 ステージング領域の指定変更内容をFLASH領域にコピー(マージ)する
- ステージング領域に存在する指定UCIコンフィグレーションファイルの変更内容を対応するFLASH領域にコピー(マージ)します。
uci commit <config>
テスト用UCIコンフィグレーションファイルcoffeeの作成 root@OpenWrt:~# touch /etc/config/coffee root@OpenWrt:~# uci set coffee.arabica=beans root@OpenWrt:~# uci set coffee.robusta=beans root@OpenWrt:~# uci set coffee.arabica.scent='very good' root@OpenWrt:~# uci set coffee.arabica.taste=excellent root@OpenWrt:~# uci set coffee.robusta.scent=good root@OpenWrt:~# uci set coffee.robusta.taste=good 続けて、テスト用UCIコンフィグレーションファイルteaの作成 root@OpenWrt:~# touch /etc/config/tea root@OpenWrt:~# uci set tea.darjeeling=leaf root@OpenWrt:~# uci set tea.uva=leaf root@OpenWrt:~# uci set tea.darjeeling.scent='very good' root@OpenWrt:~# uci set tea.darjeeling.taste=excellent root@OpenWrt:~# uci set tea.uva.scent=excellent root@OpenWrt:~# uci set tea.uva.taste=excellent root@OpenWrt:~# cat /tmp/.uci/coffee <--上の操作で、ステージング領域に追加内容が入ってます coffee.arabica='beans' coffee.robusta='beans' coffee.arabica.scent='very good' coffee.arabica.taste='excellent' coffee.robusta.scent='good' coffee.robusta.taste='good' root@OpenWrt:~# cat /tmp/.uci/tea <--上の操作で、ステージング領域に追加内容が入ってます tea.darjeeling='leaf' tea.uva='leaf' tea.darjeeling.scent='very good' tea.darjeeling.taste='excellent' tea.uva.scent='excellent' tea.uva.taste='excellent' root@OpenWrt:~# cat /etc/config/coffee <--この時点では何も入っていないので表示されません root@OpenWrt:~# cat /etc/config/tea root@OpenWrt:~# uci commit coffee <--coffeeに対して、ステージング領域からFLASH領域へマージ(コミット) root@OpenWrt:~# cat /etc/config/coffee <--コミットされたので、追加内容が入ってます config beans 'arabica' option scent 'very good' option taste 'excellent' config beans 'robusta' option scent 'good' option taste 'good' root@OpenWrt:~# cat /etc/config/tea <--コミットされてないので、何も入ってません root@OpenWrt:~#
revertコマンド
setコマンドやdeleteコマンド、addコマンドによってステージング領域(/tmp/.uci)に保存されたパラメーター変更内容を消去します。
- USAGE 1 指定UCIコンフィグレーションファイルの変更内容を消去する
- UCIコンフィグレーションファイルを指定して実行すると、対応するステージング領域の内容を消去します。
uci revert <config>
テスト用UCIコンフィグレーションファイルの作成 root@OpenWrt:~# touch /etc/config/robot root@OpenWrt:~# uci set robot.GM=MobileSuit root@OpenWrt:~# uci set robot.GM.affiliation=EFSF root@OpenWrt:~# uci set robot.GM.height='18.0[m] (by wikipedia)' root@OpenWrt:~# uci set robot.GM.weight='41.2[t] (by wikipedia)' root@OpenWrt:~# uci set robot.GM.weapon='spray gun' root@OpenWrt:~# uci commit ↓↓↓ここからが本題 root@OpenWrt:~# uci delete robot.GM.weapon root@OpenWrt:~# cat /tmp/.uci/robot -robot.GM.weapon root@OpenWrt:~# uci revert robot root@OpenWrt:~# cat /tmp/.uci/robot root@OpenWrt:~#
- USAGE 2 指定セクションの変更内容を消去する
- UCIコンフィグレーションファイルとそのセクションを指定して実行すると、対応するステージング領域のセクション の変更内容を消去します。
uci revert <config>.<section>
テスト用UCIコンフィグレーションファイルの作成 root@OpenWrt:~# touch /etc/config/robot root@OpenWrt:~# uci set robot.GM=MobileSuit root@OpenWrt:~# uci set robot.GM.affiliation=EFSF root@OpenWrt:~# uci set robot.GM.height='18.0[m] (by wikipedia)' root@OpenWrt:~# uci set robot.GM.weight='41.2[t] (by wikipedia)' root@OpenWrt:~# uci set robot.GM.weapon='spray gun' root@OpenWrt:~# uci set robot.ZAKU=MobileSuit root@OpenWrt:~# uci set robot.ZAKU.affiliation=ZEON root@OpenWrt:~# uci set robot.ZAKU.height='17.5[m] (by wikipedia)' root@OpenWrt:~# uci set robot.ZAKU.weight='75.2[t] (by wikipedia)' root@OpenWrt:~# uci set robot.ZAKU.weapon='zaku machinegun' root@OpenWrt:~# uci commit ↓↓↓ここからが本題 root@OpenWrt:~# uci delete robot.GM.weapon root@OpenWrt:~# uci delete robot.ZAKU.weapon root@OpenWrt:~# cat /tmp/.uci/robot -robot.GM.weapon -robot.ZAKU.weapon root@OpenWrt:~# uci revert robot.ZAKU root@OpenWrt:~# cat /tmp/.uci/robot -robot.GM.weapon
- USAGE 3 指定パラメーターの変更内容を消去する
- パラメーターを特定するための全ての情報(UCIコンフィグレーションファイル・セクション・オプション or リスト)を指定して実行すると、対応するステージング領域の指定パラメーター の変更内容を消去します。
uci revert <config>.<section>.<option>
テスト用UCIコンフィグレーションファイルの作成 root@OpenWrt:~# touch /etc/config/robot root@OpenWrt:~# uci set robot.ZAKU=MobileSuit root@OpenWrt:~# uci set robot.ZAKU.affiliation=ZEON root@OpenWrt:~# uci set robot.ZAKU.height='17.5[m] (by wikipedia)' root@OpenWrt:~# uci set robot.ZAKU.weight='75.2[t] (by wikipedia)' root@OpenWrt:~# uci set robot.ZAKU.weapon='zaku machinegun' ↓↓↓ここからが本題 root@OpenWrt:~# uci show robot robot.ZAKU='MobileSuit' robot.ZAKU.affiliation='ZEON' robot.ZAKU.height='17.5[m] (by wikipedia)' robot.ZAKU.weight='75.2[t] (by wikipedia)' robot.ZAKU.weapon='zaku machinegun' root@OpenWrt:~# uci revert robot.ZAKU.affiliation root@OpenWrt:~# uci revert robot.ZAKU.weight root@OpenWrt:~# cat /tmp/.uci/robot robot.ZAKU='MobileSuit' robot.ZAKU.height='17.5[m] (by wikipedia)' robot.ZAKU.weapon='zaku machinegun'
getコマンド
指定セクションのタイプ情報やパラメーター(option)の値を取得します。
通常、getコマンドはスクリプトやプログラム内で使用します。
- USAGE1 指定セクションのタイプ情報を取得する
-
特定のコンフィグのセクションを指定して実行すると、そのタイプ情報を取得します。
通常、シェルやプログラムの変数に取得値を格納させるため、次のようにエラー出力を無効にする
サイレントモードオプション
-q
をつけて実行します。
uci get <config>.<section>
root@OpenWrt:~# getdata=$(uci -q get network.lan) root@OpenWrt:~# echo $getdata interface
- USAGE2 指定パラメーターの値を取得する
-
特定のパラメーターを指定して実行すると、その値を取得します。
通常、シェルやプログラムの変数に取得値を格納させるため、次のようにエラー出力を無効にする
サイレントモードオプション
-q
をつけて実行します。
uci get <config>.<section>.<option>
root@OpenWrt:~# getdata=$(uci -q get network.lan.ipaddr) root@OpenWrt:~# echo $getdata 192.168.2.1
addコマンド
指定したタイプ情報で匿名セクションを任意のUCIコンフィグレーションファイルに追加します。 追加内容はステージング領域(/tmp/.uci)に保存されます。
通常、続いてcommitコマンドを実行することでステージング領域の追加内容をFLASH領域(/etc/config)にコピーします。
※ステージング領域はRAM上に配置されるため、rebootやpoweroffによって電源断が発生すると格納データは消去されます。
- USAGE 匿名セクションを追加する
-
任意のUCIコンフィグレーションファイルに指定タイプの匿名セクションを作成・追加します。
正常に実行されると、UCIシステム側で自動生成された名前「cfg+uid」が表示されます。
uci add <config> <section-type>
root@OpenWrt:~# touch /etc/config/test root@OpenWrt:~# uci add test utakamo cfg066b17 root@OpenWrt:~# cat /tmp/.uci/test +test.cfg066b17='utakamo' root@OpenWrt:~# uci commit root@OpenWrt:~# uci show test test.@utakamo[0]=utakamo
add_listコマンド
任意のセクションにリストデータを作成して追加します。
リストデータの追加内容はステージング領域(/tmp/.uci)に保存されます。
通常、続けてcommitコマンドを実行することでステージング領域(/tmp/.uci/)の追加内容がFLASH領域(/etc/config/) の対応するUCIコンフィグレーションファイルにコピー(マージ)されます。
※ステージング領域はRAM上に配置されるため、rebootやpoweroffによって電源断が発生すると格納データは消去されます。
- USAGE セクションにリストを追加する
- リストに対してパラメーターを指定して実行すると、そのリストのデータとして指定パラメーターが 登録されます(このとき、対象リストが存在しない場合は作成されます)。次は、testの匿名セクションにtestlistという名前のリストを追加し、データを次々に登録している例です。
uci add_list <config>.<section>.<option>=<string>
root@OpenWrt:~# touch /etc/config/test root@OpenWrt:~# uci add test utakamo cfg066b17 root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=1 root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=2 root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=3 root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=4 root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=5 root@OpenWrt:~# cat /tmp/.uci/test +test.cfg066b17='utakamo' |test.cfg066b17.testlist='1' |test.cfg066b17.testlist='2' |test.cfg066b17.testlist='3' |test.cfg066b17.testlist='4' |test.cfg066b17.testlist='5'
del_listコマンド
任意のセクションのリストデータを削除します。
リストデータの削除内容はステージング領域(/tmp/.uci)に保存されます。
通常、続けてcommitコマンドを実行することでステージング領域(/tmp/.uci/)の削除内容がFLASH領域(/etc/config/) の対応するUCIコンフィグレーションファイルにコピー(マージ)されます。
※ステージング領域はRAM上に配置されるため、rebootやpoweroffによって電源断が発生すると格納データは消去されます。
- USAGE 任意セクションのリストデータを削除する
- 既存リストの任意データを削除します。次は、testの匿名セクションに対してtestlistという名前の リストから、値が2のリストデータを削除する例です。
uci del_list <config>.<section>.<option>=<string>
テスト用UCIコンフィグレーションファイルの作成 root@OpenWrt:~# touch /etc/config/test root@OpenWrt:~# uci add test utakamo cfg066b17 root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=1 root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=2 root@OpenWrt:~# uci add_list test.@utakamo[0].testlist=3 root@OpenWrt:~# uci commit test ↓↓↓ここからが本題 root@OpenWrt:~# uci del_list test.@utakamo[0].testlist=2 root@OpenWrt:~# cat /tmp/.uci/test ~test.cfg066b17.testlist='2'
renameコマンド
- USAGE 1 セクションの名前を変更する
- 既存UCIコンフィグレーションファイルのセクション名を変更します。
uci rename <config>.<section>=<name>
テスト用UCIコンフィグレーションファイルの作成 root@OpenWrt:~# touch /etc/config/test root@OpenWrt:~# uci add test blog cfg01a6c9 root@OpenWrt:~# uci show test test.@blog[0]=blog root@OpenWrt:~# uci set test.@blog[0].data1=GoodMorning root@OpenWrt:~# uci set test.@blog[0].data2=Hello root@OpenWrt:~# uci set test.@blog[0].data3=GoodNight root@OpenWrt:~# uci commit ↓↓↓ここからが本題 root@OpenWrt:~# uci show test test.@blog[0]=blog test.@blog[0].data1='GoodMorning' test.@blog[0].data2='Hello' test.@blog[0].data3='GoodNight' root@OpenWrt:~# uci rename test.@blog[0]=utakamo <--セクションをutakamoに変更 root@OpenWrt:~# cat /tmp/.uci/test @test.cfg01a6c9='utakamo' root@OpenWrt:~# uci commit root@OpenWrt:~# uci show test test.utakamo=blog test.utakamo.data1='GoodMorning' test.utakamo.data2='Hello' test.utakamo.data3='GoodNight'
- USAGE 2 オプションの名前を変更する
- 既存UCIコンフィグレーションファイルのオプション名を変更します。
uci rename <config>.<section>.<option>=<name>
テスト用UCIコンフィグレーションファイルの作成 root@OpenWrt:~# touch /etc/config/test root@OpenWrt:~# cat /etc/config/test root@OpenWrt:~# uci add test utakamo cfg016b17 root@OpenWrt:~# uci set test.@utakamo[0].data=hello root@OpenWrt:~# cat /tmp/.uci/test +test.cfg016b17='utakamo' test.cfg016b17.data='hello' root@OpenWrt:~# uci commit ↓↓↓ここからが本題 root@OpenWrt:~# uci show test test.@utakamo[0]=utakamo test.@utakamo[0].data='hello' root@OpenWrt:~# uci rename test.@utakamo[0].data=value <--オプション名をvalueに変更 root@OpenWrt:~# cat /tmp/.uci/test @test.cfg016b17.data='value' root@OpenWrt:~# uci commit root@OpenWrt:~# uci show test test.@utakamo[0]=utakamo test.@utakamo[0].value='hello'
reorderコマンド
- USAGE UCIコンフィグレーションファイル内のセクション配置を変更する
- UCIシステムはコンフィグレーションファイルを読み込んだときに、セクションの出現順序に応じてシステム内部でインデックスを付与します(posと呼ばれています)。
- 例として、UCIコンフィグレーションファイルのtestに3つのセクションが存在するとき、UCIシステム上では先頭から順に0、1、2のインデックスが付与されます。
-
reorderコマンドは、このインデックスを利用して任意のセクション配置を変更します。
次は上記のtestファイルに対して、sectionBを先頭に配置変更する例です。 - reorderコマンドによる配置変更は一見意味がないように感じます。しかし、設定情報を示すセクションデータの増減に対応したOpenWrtアプリケーション にとっては適用対象のデータを選び出す操作として非常に重要です。つまり、数ある設定情報の中から適用対象を決定するために、ほとんどのOpenWrtアプリケーションは セクションの読み込み順番を判断材料にしています。そのアプリケーションがUCIコンフィグレーションファイルをロードしたとき、最初または最後 に読み込んだセクションを最終的な対象データとして決定します。先頭または末尾のセクションを優先するかはアプリケーションの設計によって異なります。複数の設定を管理できる 仕組みについてはこちらをお読みください。
uci reorder <config>.<section>=<position-index>
Programmable表記 root@OpenWrt:~# uci show test test.sectionA=typeA <--pos:0 test.sectionA.value1='1' test.sectionA.value2='2' test.sectionA.value3='3' test.sectionB=typeB <--pos:1 test.sectionB.value1='4' test.sectionB.value2='5' test.sectionB.value3='6' test.sectionC=typeC <--pos:2 test.sectionC.value1='7' test.sectionC.value2='8' test.sectionC.value3='9' Human-Friendly表記 root@OpenWrt:~# cat /etc/config/test config typeA 'sectionA' <--pos:0 option value1 '1' option value2 '2' option value3 '3' config typeB 'sectionB' <--pos:1 option value1 '4' option value2 '5' option value3 '6' config typeC 'sectionC' <--pos:2 option value1 '7' option value2 '8' option value3 '9'
root@OpenWrt:~# uci reorder test.sectionB=0 root@OpenWrt:~# uci changes test test.sectionB='0' <--タイプが変更されたわけではなく、配置場所を示す数字が=付きで表現されます root@OpenWrt:~# uci commit test Programmable表記 root@OpenWrt:~# uci show test test.sectionB=typeB <--pos:0 test.sectionB.value1='4' test.sectionB.value2='5' test.sectionB.value3='6' test.sectionA=typeA <--pos:1 test.sectionA.value1='1' test.sectionA.value2='2' test.sectionA.value3='3' test.sectionC=typeC <--pos:2 test.sectionC.value1='7' test.sectionC.value2='8' test.sectionC.value3='9' Human-Friendly表記 root@OpenWrt:~# cat /etc/config/test config typeB 'sectionB' <--pos:0 option value1 '4' option value2 '5' option value3 '6' config typeA 'sectionA' <--pos:1 option value1 '1' option value2 '2' option value3 '3' config typeC 'sectionC' <--pos:2 option value1 '7' option value2 '8' option value3 '9'
exportコマンド
- USAGE 1 全てのUCIコンフィグレーションファイルの内容をUCI構文で標準出力する
- /etc/config内の全てのUCIコンフィグレーションファイルをUCI構文で標準出力します。 このとき、UCIコンフィグレーションファイルの名前はpackage <name>で表されます。もっと言えばたったそれだけです。
-
通常、リダイレクトでファイル出力するのが一般的かと思います。
この操作はUCIコンフィグレーションファイルのフルバックアップに相当します。 バックアップファイルはimportコマンドでインポートできます。
uci export
root@OpenWrt:~# uci export package dropbear config dropbear option PasswordAuth 'on' option RootPasswordAuth 'on' option Port '22' package duckdump config duckdump 'target' option nic 'wlan0' package firewall config defaults option syn_flood '1' option input 'ACCEPT' option output 'ACCEPT' option forward 'REJECT' ...省略
root@OpenWrt:~# uci export > full_backup
- USAGE 2 指定UCIコンフィグレーションファイルの内容を標準出力する
- 指定したUCIコンフィグレーションファイルの内容をUCI構文で標準出力します。 このとき、UCIコンフィグレーションファイルの名前はpackage <file-name>で表されます。もっと言えばたったそれだけです
-
通常、リダイレクトでファイル出力するのが一般的かと思います。
この操作は指定UCIコンフィグレーションファイルのバックアップに相当します。 このバックアップファイルはimportコマンドでインポートできます。
uci export <config>
root@OpenWrt:~# uci export dropbear package dropbear config dropbear option PasswordAuth 'on' option RootPasswordAuth 'on' option Port '22'
root@OpenWrt:~# uci export dropbear > dropbear_backup
[TIPS]: UCI構文
exportコマンドによって出力されるUCI設定情報はUCI構文形式です。
Human-Friendly表記形式に加え、UCIコンフィグレーションファイル名をpackage <file-name>の形式で記載しているだけです。
root@OpenWrt:~# uci export sample
package sample <---UCIコンフィグレーションファイル名を指します
config type 'section'
option value1 '1'
option value2 '2'
option value3 '3'
importコマンド
UCI設定を対象ファイルにインポートします。
- USAGE 1 標準入力によるUCI構文の設定情報を対象ファイルにインポートする
- 標準入力によるUCI構文の設定情報を任意のUCIコンフィグレーションファイル<config>にコピーします。 このとき、UCIコンフィグレーションファイル<config>が持っていた既存の内容は全て上書きされ、代わりにインポートした設定情報が記録されます。
- ※UCI構文はuci exportによって出力されるUCIコンフィグレーションファイルの記述形式を指します。
uci import <config>
root@OpenWrt:~# touch /etc/config/test
root@OpenWrt:~# uci import test
package test
config typeA 'section'
option value1 '1'
option value2 '2'
option value3 '3'
「CTRL + D」でEOF
root@OpenWrt:~# uci show test
test.section=typeA
test.section.value1='1'
test.section.value2='2'
test.section.value3='3'
- USAGE 2 UCI構文の設定情報を対象ファイルにインポートする
- UCI構文の設定情報が記載されたファイル<file>を-fオプションで指定し、その内容を任意のUCIコンフィグレーションファイル<config>にコピーします。 このとき、UCIコンフィグレーションファイルが持っていた既存の内容は全て上書きされ、代わりにインポートした設定情報が記録されます。
- ※UCI構文はuci exportによって出力されるUCIコンフィグレーションファイルの記述形式を指します。
uci -f <file> import <config>
テスト用UCIコンフィグレーションファイルの作成 root@OpenWrt:cd /etc/config root@OpenWrt:/etc/config# touch test root@OpenWrt:/etc/config# uci set test.blog=utakamo root@OpenWrt:/etc/config# uci set test.blog.data1=hello root@OpenWrt:/etc/config# uci set test.blog.data2=byebye root@OpenWrt:/etc/config# uci commit root@OpenWrt:/etc/config# uci show test test.blog=utakamo test.blog.data1='hello' test.blog.data2='byebye' ↓↓↓ここからが本題 root@OpenWrt:/etc/config# uci export dropbear > dropbear_backup <--dropbearをエクスポート root@OpenWrt:/etc/config# uci -f dropbear_backup import test <--ここでインポート root@OpenWrt:/etc/config# uci show test test.@dropbear[0]=dropbear test.@dropbear[0].PasswordAuth='on' test.@dropbear[0].RootPasswordAuth='on' test.@dropbear[0].Port='22'
- USAGE 3 UCI構文の設定情報を対象UCIコンフィグレーションファイルにマージインポートする
- UCI構文の設定情報が記載されたファイル<file>を-fで指定し、-mオプションによって、その内容を任意のUCIコンフィグレーションファイル<config>に マージインポートします。
- ※UCI構文はuci exportによって出力されるUCIコンフィグレーションファイルの記述形式を指します。
-
なお、マージ内容はステージング領域に一旦保存されます。
続いてuci commitを実行することで、その内容がFLASH領域にコピーされます。
uci -f <file> -m import <config>
テスト用UCIコンフィグレーションファイルの作成 root@OpenWrt:~# cd /etc/config root@OpenWrt:/etc/config# touch test root@OpenWrt:/etc/config# uci add test utakamo cfg016b17 root@OpenWrt:/etc/config# uci set test.@utakamo[0].data=1 root@OpenWrt:/etc/config# uci show test test.@utakamo[0]=utakamo test.@utakamo[0].data='1' ↓↓↓ここからが本題 root@OpenWrt:/etc/config# uci export dropbear > dropbear_backup <--dropbearをエクスポート root@OpenWrt:/etc/config# uci -f dropbear_backup -m import test <--ここでマージインポート root@OpenWrt:/etc/config# uci changes test test.cfg024dd4='dropbear'0' test.cfg024dd4.PasswordAuth='on' test.cfg024dd4.RootPasswordAuth='on' test.cfg024dd4.Port='22'.5' root@OpenWrt:/etc/config# uci commit root@OpenWrt:/etc/config# uci show test test.@utakamo[0]=utakamo test.@utakamo[0].data='1' test.@dropbear[0]=dropbear test.@dropbear[0].PasswordAuth='on' test.@dropbear[0].RootPasswordAuth='on' test.@dropbear[0].Port='22'
changesコマンド
- USAGE 1 ステージング領域に保存された全ての変更内容を標準出力する
- ステージング領域(/tmp/.uci)に保存された全てのUCIコンフィグレーションファイルの変更内容を標準出力します。 現在、これは[cat /tmp/.uci/*]と等価の処理結果です。
uci changes
root@OpenWrt:~# touch /etc/config/test1 root@OpenWrt:~# uci set test1.blog=utakamo root@OpenWrt:~# uci set test1.blog.data=hello root@OpenWrt:~# touch /etc/config/test2 root@OpenWrt:~# uci set test2.blog=utakamo root@OpenWrt:~# uci set test2.blog.data=goodbye root@OpenWrt:~# uci changes test1.blog='utakamo' test1.blog.data='hello' test2.blog='utakamo' test2.blog.data='goodbye'
- USAGE 2 ステージング領域の指定UCIコンフィグレーションファイルの変更内容を標準出力する
- 指定したUCIコンフィグレーションファイルに対応するステージング領域(/tmp/.uci)が保存する変更内容を標準出力します。 現在、これは[cat /tmp/.uci/~]と等価の処理結果です。
uci changes <config>
root@OpenWrt:~# touch /etc/config/test1 root@OpenWrt:~# uci set test1.blog=utakamo root@OpenWrt:~# uci set test1.blog.data=hello root@OpenWrt:~# touch /etc/config/test2 root@OpenWrt:~# uci set test2.blog=utakamo root@OpenWrt:~# uci set test2.blog.data=goodbye root@OpenWrt:~# uci changes test1 test1.blog='utakamo' test1.blog.data='hello'
batchコマンド
- USAGE UCIコマンドのバッチ処理を実行する
-
uciコマンドをまとめて実行します。
次はテスト用UCIコンフィグレーションファイル(/etc/config/test)を作成して、 その中にセクションとオプションをバッチ処理で作成する例です。 -
バッチ処理対象のコマンドの前に
uci
を付ける必要はありません。 -
もちろん、既存のUCIコンフィグレーションファイルに対してもバッチ処理が可能です。
次は既存のUCIコンフィグレーションファイル(network)に対してバッチ処理をする例です。 -
さらに、uci batchコマンドに与える引数のヒアドキュメント内ではシェル変数が使用できます。
次はシェル変数を基にバッチ処理をする例です。 - 複数のUCIパラメータを一括で変更したい場合は、batchコマンドを使った方が効率が良いと思います。
uci batch << EOI <uci command> <uci command> <uci command> <uci command> .... EOI
root@Openwrt:~# touch /etc/config/test root@OpenWrt:~# uci batch << EOI > set test.blog=utakamo > set test.blog.data1=hello > set test.blog.data2='Is my blog easy and readable?' > set test.blog.data3=goodbye > EOI root@OpenWrt:~# uci changes test test.blog='utakamo' test.blog.data1='hello' test.blog.data2='Is my blog easy and readable?' test.blog.data3='goodbye'
root@OpenWrt:~# uci batch << EOI > set network.test=utakamo > set network.test.data1=hello > set network.test.data2='Is my blog easy and readable?' > set network.test.data3=goodbye > EOI root@OpenWrt:~# uci changes network network.test='utakamo' network.test.data1='hello' network.test.data2='Is my blog easy and readable?' network.test.data3='goodbye'
root@Openwrt:~# touch /etc/config/test ↓↓↓シェル変数を宣言 root@OpenWrt:~# config=test root@OpenWrt:~# type=utakamo root@OpenWrt:~# section=blog ↓↓↓シェル変数を基にバッチ処理 root@OpenWrt:~# uci batch << EOI > set $config.$section=$type > set $config.$section.data1=hello > set $config.$section.data2='Is my blog easy and readable?' > set $config.$section.data3=goodbye > EOI root@OpenWrt:~# uci changes test test.blog='utakamo' test.blog.data1='hello' test.blog.data2='Is my blog easy and readable?' test.blog.data3='goodbye'
関連記事
- OpenWrt UCIコマンドの使い方
- OpenWrt サンプルプログラム掲載! UCIコマンド用C言語ライブラリ - libuci
- OpenWrt シェルスクリプト専用UCI関数の使い方
- OpenWrt Luaスクリプト専用UCI関数の使い方
- OpenWrt UBUSコマンドの使い方
- OpenWrt サンプルプログラム掲載! UBUS用C言語ライブラリ-libubus(object・method登録実装)
- OpenWrt サンプルプログラム掲載! UBUS用C言語ライブラリ-libubus(listenコマンド実装)
- OpenWrt サンプルプログラム掲載! UBUS用C言語ライブラリ-libubus(sendコマンド実装)
参考文献
- The UCI System: https://openwrt.org/docs/guide-user/base-system/uci
- Sources/uci/uci.h: https://lxr.openwrt.org/source/uci/uci.h