chapter 07-03

還原預設值 (內部)

此章節說明當資料現在值檔案損毀導致資料錯誤時, 如何使用 [還原預設值 (外部)] 模式做處理.


如果需要將設備重新開機做處理的話, 就需要使用此模式, 系統會執行外部批次檔或程式實行.


使用方式

使用 [還原預設值 (外部)] 模式時系統的處理步驟 :
01.  載入資料現在值檔案, 檢查資料有無錯誤.
a.  如果是 能夠檢測到並且可以標記的錯誤 [詳細], 將該筆資料貼上對應的錯誤狀態.
b.  如果是 能夠檢測到但是無法標記的錯誤 [詳細], 只會顯示有錯誤, 不會貼上對應的錯誤狀態.
02.  檢查每筆資料的狀態是否被貼上錯誤, 如果是, 開始還原預設值處理.
a.  刪除資料現在值檔案
b.  執行特定函式處理執行外部批次檔或程式.
c.  系統結束執行.
d.  設備重新開機後啟動 mcm_daemon, 會載入資料預設值檔案.

需要在 [b] 的函式內加入要執行的外部批次檔或程式.


處理函式

處理函式要放在 mint_cm/mcm_daemon/mcm_module 內, 新增一個 C 檔案, 內容為 :
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_debug.h"
#include "../mcm_action_handle_define.h"

struct mcm_action_module_t MCM_ACTION_CUSTOM_MODULE_BOOT_PROFILE_LIST_NAME[] =
{
    {""}
};

struct mcm_action_module_t MCM_ACTION_CUSTOM_MODULE_BOOT_OTHER_LIST_NAME[] =
{
    {""}
};

int MCM_ACTION_CUSTOM_RESET_DEFAULT_NAME(
    void)
{
    return MCM_RCODE_PASS;
}


此章節只需要用到 MCM_ACTION_CUSTOM_RESET_DEFAULT_NAME{}

在函式內處理執行外部批次檔或程式的動作.
範例 :
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_debug.h"
#include "../mcm_action_handle_define.h"

struct mcm_action_module_t MCM_ACTION_CUSTOM_MODULE_BOOT_PROFILE_LIST_NAME[] =
{
    {""}
};

struct mcm_action_module_t MCM_ACTION_CUSTOM_MODULE_BOOT_OTHER_LIST_NAME[] =
{
    {""}
};

int MCM_ACTION_CUSTOM_RESET_DEFAULT_NAME(
    void)
{
    int fret = MCM_RCODE_MODULE_INTERNAL_ERROR;
    char *script_path = "reset_default.sh", cmd_buf[32];
    FILE *file_fp;


    // 建立外部 shell script, 使用外部 shell script 處理.
    if((file_fp = fopen(script_path, "w")) == NULL)
    {
        MCM_EMSG("call fopen(%s) fail [%s]", script_path, strerror(errno));
        goto FREE_01;
    }

    fprintf(file_fp, "#!/bin/sh\n");

    // 等待一段時間, 等目前的程式關閉.
    fprintf(file_fp, "sleep 3\n");

    // 重新執行.
    fprintf(file_fp,
            "./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 1 "
            "-p /var/run/mcm_daemon.pid &\n");

    fprintf(file_fp, "rm -f $0\n");

    fclose(file_fp);
    chmod(script_path, 0777);

    // 執行 shell script.
    snprintf(cmd_buf, sizeof(cmd_buf), "./%s &", script_path);
    if(system(cmd_buf) == -1)
    {
        MCM_EMSG("call system(%s) fail", cmd_buf);
        goto FREE_01;
    }

    fret =  MCM_RCODE_PASS;
FREE_01:
    return fret;
}


執行完 MCM_ACTION_CUSTOM_RESET_DEFAULT_NAME{} 後, mcm_daemon 會結束執行.


範例程式的使用

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


02.  下面關於 make 的操作沒有特別註明的話都是在 mint_cm 目錄.


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


04.  執行 mcm_daemon 並加入 -e 1 參數就可以看到結果.
注意當程式檢查到錯誤並執行處理後, mcm_store_profile_current.txt 會重新產生並且內容是正確的的.


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


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