chapter 02-02

資料預設值的建立

此章節說明如何建立資料的預設值.


為了讓程式啟動後就有預設的資料, 必須建立資料的預設值.


下面使用範例說明如何建立, 使用的資料種類參考 #02-01#, 資料模型如下 :
<?xml version="1.0"?>

<base version="1.0">
<device type="gs" max="1" save="1">
  <ekey type="ek">0</ekey>
  <descript type="s:256">Network-Device</descript>
  <serial_number type="b:10">0022E5A1CC9F</serial_number>

  <system type="gs" max="1" save="1">
    <ekey type="ek">0</ekey>
    <date type="s:12">2015/01/01</date>
    <ip_addr type="s:46">192.168.1.1</ip_addr>
    <uptime type="iull">0</uptime>
    <loading type="fd">0</loading>
  </system>

  <vap type="gd" max="16" save="1">
    <ekey type="ek">0</ekey>
    <ssid type="s:64"></ssid>
    <channel type="iui">0</channel>

    <extra type="gs" max="1" save="1">
      <ekey type="ek">0</ekey>
      <hidden type="isc">0</hidden>
      <tx_power type="iss">0</tx_power>
    </extra>

    <station type="gd" max="32" save="1">
      <ekey type="ek">0</ekey>
      <mac_addr type="s:18">00:00:00:00:00:00</mac_addr>
      <rule type="rk">0</rule>
    </station>
  </vap>

  <limit type="gd" max="64" save="1">
    <ekey type="ek">0</ekey>
    <name type="s:32"></name>
    <priority type="isi">-1</priority>
  </limit>

  <client type="gd" max="128" save="0">
    <ekey type="ek">0</ekey>
    <mac_addr type="s:18"></mac_addr>
    <location_x type="fld">0</location_x>
    <location_y type="fld">0</location_y>
  </client>
</device>
</base>



步驟一 : 加入資料模型版本.
格式 :
$version $(version)

實際 :
$version 1.0


這裡的 $version 就是資料模型中 <base></base> 內的設定.


步驟二 : 加入資料設定.
格式 :
$(entry-path) $(member-list)


$(entry-path)
由樹根到目標之間的 entry 資訊所組成的路徑.
格式 :
$(entry-info-1).$(entry-info-2). - - - .$(entry-info-N)

$(entry-info)
由 group 名稱和 key 資訊所組成的一小段路徑.
格式 :
gs 類型 : $(group-name)
gd 類型 : $(group-name).#$(entry-key)
$(group-name) group 的名稱
# entry key 的前綴符號
$(entry-key) entry 的 key 值, 1 ~ 4294967295 (MCM_DTYPE_EK_TD)

實際 :
device

device.system

device.vap.#8
表示 vap 中 key 為 8 的 entry
device.vap.#15
表示 vap 中 key 為 15 的 entry

device.vap.#8.extra
表示 vap 中 key 為 8 的 entry 的 extra
device.vap.#15.extra
表示 vap 中 key 為 15 的 entry 的 extra

device.vap.#8.station.#20
表示 vap 中 key 為 8 的 entry 的 key 為 20 的 station
device.vap.#15.station.#30
表示 vap 中 key 為 15 的 entry 的 key 為 30 的 station
device.limit.#1
表示 limit 中 key 為 1 的 entry
device.limit.#3
表示 limit 中 key 為 3 的 entry

device.client.#109
表示 client 中 key 為 109 的 entry
device.client.#120
表示 client 中 key 為 120 的 entry


$(member-list)
由 member (不包含 ek 類型) 所組成的段落.
格式 :
$(member-info-1) $(member-info-2) - - - $(member-info-N)

$(member-info)
由 member 的名稱和值所組成的資料區塊.
格式 :
$(name):$(value)

$(name) member 的名稱
$(value) member 的值, [詳細]

實際 :
[device] :
descript:Wireless%20Device serial_number:0022E5A1CC9F

[system] :
date:2015/06/07 ip_addr:192.168.10.254 uptime:0 loading:0

[vap] :
ssid:open-1 channel:10

[extra] :
hidden:1 tx_power:8

[station] :
mac_addr:00:11:22:33:44:55 rule:3

[limit] :
name:normal priorital:10

[client] :
mac_addr:mac_addr:00:11:22:33:44:55 location_x:123.987 location_y:-74.058


$(entry-path), $(member-list) 組合 :
device descript:Wireless%20Device serial_number:0022E5A1CC9F

device.system date:2015/06/07 ip_addr:192.168.10.254 uptime:0 loading:0

device.vap.#8 ssid:open-1 channel:10
device.vap.#15 ssid:radius-2 channel:44

device.vap.#8.extra hidden:1 tx_power:8
device.vap.#15.extra hidden:0 tx_power:10

device.vap.#8.station.#20 mac_addr:00:11:22:33:44:55 rule:3
device.vap.#15.station.#30 mac_addr:00:aa:bb:cc:dd:ee rule:5

device.limit.#3 name:normal priority:10
device.limit.#5 name:height priority:15

device.client.#109 mac_addr:00:11:22:33:44:55 location_x:123.7812 location_y:-74.058
device.client.#120 mac_addr:00:aa:bb:cc:dd:ee location_x:-0.9 location_y:0.25



最後輸出 :
$version 1.0

device descript:Wireless%20Device serial_number:0022E5A1CC9F

device.system date:2015/06/07 ip_addr:192.168.10.254 uptime:0 loading:0

device.vap.#8 ssid:open-1 channel:10
device.vap.#15 ssid:radius-2 channel:44

device.vap.#8.extra hidden:1 tx_power:8
device.vap.#15.extra hidden:0 tx_power:10

device.vap.#8.station.#20 mac_addr:00:11:22:33:44:55 rule:3
device.vap.#15.station.#30 mac_addr:00:aa:bb:cc:dd:ee rule:5

device.limit.#3 name:normal priority:10
device.limit.#5 name:height priority:15

device.client.#109 mac_addr:00:11:22:33:44:55 location_x:123.7812 location_y:-74.058
device.client.#120 mac_addr:00:aa:bb:cc:dd:ee location_x:-0.9 location_y:0.25



註解的使用

在文字的最前面加上 [;] 表示此行是註解.
範例 :
; 這行是註解



注意事項

01.  編譯資料模型會自動產生 mcm_store_profile.txt, 裡面會有簡單的基本設定資料.


02.  編譯資料模型後如果 mcm_build 目錄不存在 mcm_store_profile_default.txt, 會自動從 mcm_store_profile.txt 複製一份過去, 要注意只有在 mcm_store_profile_default.txt 不存在時才會自動複製, 如果存在後有修改資料模型的話, 需要手動處理更動的部分.


03.  在資料模型中 $(save) 值為 0 的 group 不可以加上預設值 (上面的範例 [client] 只是示範, 實際使用不可加).


04.  entry 的數目不可超過資料模型中所設的 $(max) 值.


05.  沒有任何 member (排除 ek 類型) 的 group, 不可以加上預設值.


06.  加上預設值後, 從樹根到目標 group 之間的 group 除非沒有 member, 否則都必須加上預設值.

範例, 資料模型如下, 假設每個 group 內都有 member :
<GroupA type="gs" max="1" save="1">
  <GroupB type="gd" max="10" save="1">
    <GroupC type="gd" max="10" save="1">
      <GroupD type="gd" max="10" save="1">
      </GroupD>
    </GroupC>
  </GroupB>
</GroupA>

設定 :
在 GroupD 加上預設值
GroupA.GroupB.#3.GroupC.#5.GroupD.#7

則 GroupA, GroupB, GroupC 都要加上預設值
GroupA
GroupA.GroupB.#3
GroupA.GroupB.#3.GroupC.#5


07.  對於 gs 類型的 group, 除非沒有任何 member, 否則下列情況下必須加上預設值 :
parent-group 類型 說明
不存在 樹根, 必須要加上預設值
gs 必須要加上預設值
gd 如果有 entry 存在, 則必須要加上預設值

範例, 資料模型如下 :
<device type="gs" max="1" save="1">
  <ekey type="ek">0</ekey>

  <system type="gs" max="1" save="1">
    <ekey type="ek">0</ekey>
    <date type="s:12"></date>
  </system>

  <vap type="gd" max="8" save="1">
    <ekey type="ek">0</ekey>
    <ssid type="s:64"></ssid>

    <extra type="gs" max="1" save="1">
      <ekey type="ek">0</ekey>
      <hidden type="s:8"></hidden>
    </extra>
  </vap>
</device>

設定 :
device :
樹根, 但是沒有 member, 所以不需要加上預設值

system :
device 是 gs 類型, 所以需要加上預設值

extra :
vap 是 gd 類型,
假設有一筆資料 device.vap.#4, 則必須加上預設值 device.vap.#4.extra


資料預設值設定的錯誤訊息

當程式讀取資料預設值檔案時, 會檢查是否有錯誤, 發現錯誤後會顯示錯誤訊息並停止執行.

錯誤訊息格式 :
store profile error [$(error_file)], line $(error_line), code $(error_code) :
$(descript)

範例 :
mcm_config_handle.c(3644):
store profile error [default], line 4, code INVALID_MEMBER_02 :
invalid member, unknown member [test]
mcm_config_handle.c(4232): call mcm_load_store_anysis_member() fail
mcm_config_handle.c(4320): call mcm_load_store_process() fail
mcm_daemon.c(0328): call mcm_config_load_store() fail

$(error_file)
發生錯誤的檔案來源.
default 紀錄預設值的檔案 (mcm_store_profile_default.txt)
current 紀錄現在值的檔案 (mcm_store_profile_current.txt)

$(error_line)
在第幾行發生錯誤.

$(error_code)
錯誤代號.

$(descript)
錯誤原因的簡單描述.

錯誤代號表 :
代號 說明
INVALID_FORMAT_01 找不到分段符號 [ ] [詳細-A] [詳細-B]
INVALID_BASE_01 額外資料 [$version] 的設定有誤 [詳細]
INVALID_BASE_02 額外資料 [$version] 的設定發生重複
INVALID_BASE_03 找不到分段符號 [ ] [詳細-A] [詳細-B]
INVALID_BASE_04 未知的額外資料
INVALID_ENTRY-FORMAT_01 [$(entry-path)] 的設定有誤 [詳細]
INVALID_ENTRY-FORMAT_02
INVALID_ENTRY-FORMAT_03
INVALID_ENTRY-SAVE_01 此 group 的 [$(save)] 為 0, 不可加上預設值 [詳細]
INVALID_ENTRY-MAX_01 entry 數目超過 group 的 [$(max)] 上限 [詳細]
INVALID_ENTRY-MEMBER_01 此 group 沒有任何 member (不包含 [es] [ek] 類型), 不可加上預設值 [詳細]
INVALID_ENTRY-DUPLIC_01 entry 設定發生重複
INVALID_ENTRY-LOSE_01 有 entry 沒設定到 [詳細-A] [詳細-B]
INVALID_MEMBER_01 找不到分段符號 [:] [詳細]
INVALID_MEMBER_02 未知的 member
INVALID_MEMBER_03 member 設定發生重複
INVALID_MEMBER_04 有 member 沒設定到
INVALID_VALUE-INTEGER_01 member 的值 (整數類型) 無效 [詳細]
INVALID_VALUE-INTEGER_02
INVALID_VALUE-FLOAT_01 member 的值 (浮點數類型) 無效 [詳細]
INVALID_VALUE-FLOAT_02
INVALID_VALUE-STRING_01 member 的值 (字串類型) 無效 [詳細]
INVALID_VALUE-STRING_02
INVALID_VALUE-STRING_03
INVALID_VALUE-STRING_04
INVALID_VALUE-STRING_05
INVALID_VALUE-STRING_06
INVALID_VALUE-BYTES_01 member 的值 (字節流類型) 無效 [詳細]
INVALID_VALUE-BYTES_02
INVALID_VALUE-BYTES_03


資料現在值檔案

在 mcm_daemon 中關於紀錄資料的檔案有二個, 資料預設值檔案資料現在值檔案.

mcm_daemon 會把目前的資料紀錄在 資料現在值檔案 (Read-Write).

資料預設值檔案 則是紀錄初始化的資料的預設值 (Read-Only).

mcm_daemon 啟動後, 會優先讀取 資料現在值檔案, 不存在才讀取 資料預設值檔案.
(所以要做還原預設值的動作只要刪除資料現在值檔案在重新執行 mcm_daemon 即可)


範例程式的使用

01.  範例程式目錄在 mint_cm/usage/example/0202.


02.  下面關於 make 的操作都是在 mint_cm 目錄.


03.  第一次使用, 使用 make example_add KEY=0202 載入範例並編譯.


04.  mcm_daemon 執行方法, 進入 mint_cm/run 目錄, 指令 :
./mcm_daemon -t 0 -a @mintcm -l ./mcm_module.lib -m mcm_model_profile.txt -d mcm_store_profile_default.txt -c mcm_store_profile_current.txt -s 0 -e 0 -p /var/run/mcm_daemon.pid

因為 mcm_daemon 會優先讀取預設值檔案, 不存在才讀取現在值檔案, 所以每次修改預設值檔案做測試時, 要先移除現在值檔案. 預設值檔案錯誤的話, 會顯示錯誤訊息並停止執行. 預設值檔案正確的話, 不會停止執行並且產生一個現在值檔案, 檔案內的設定值會和預設值檔案內容一致.
使用 [Ctrl + C] 能夠中斷執行.


05.  測試完畢不使用後, 使用 make example_del KEY=0202 將範例移除.


06.  範例程式目錄下的檔案在做完 make example_add 後會複製到真正使用的位置, 要修改做測試的話要改在複製後的.
來源 profile/mcm_data_profile_0202.xml
目地 mint_cm/mcm_build/mcm_data_profile.xml
資料模型範例
有修改要使用 make all 重新編譯
來源 profile/mcm_store_profile_default_0202.txt
目地 mint_cm/mcm_build/mcm_store_profile_default.txt
資料預設值範例
使用 make all 後會再複製到 mint_cm/run