20170217_jeffrey - silenceuncrio/diary GitHub Wiki

0900

先 review 昨天的 trace

1005

剛剛和 aaron 討論 CLI 架構的時候

他分享 http://asciiflow.com/

就是可以很直覺得利用 ASCII 畫出像下面的圖一樣

+---------+    +---------+
|         |    |         |
| block A +----> block B |
|         |    |         |
+---------+    +---------+

之後在 source code 裡想表達流程的話是非常方便的工具

1100

試著利用 asciiflow 來表達昨天關於 init 的 trace

+------------+                   +---------------------------------------------------+
|            |                   |                                                   |
| rc.local   |                   | libicos.so                                        |
|            |                   |                                                   |
+---+--------+                   |   +-----------------+            +-----+          |
    |                            |   |                 |            |     |          |
    |bootinit                    |   | moduleInitAry[] +------------> ... |          |
    |                            |   |                 |    Init    |     |          |
+---v--------+                   |   |                 |            +-----+          |
|            |                   |   |                 |                             |
| icosconfig +------------------->   |                 |            +-------------+  |
|            |  ICOS_Bootinit()  |   |                 |            |             |  |
+------------+                   |   |                 |            | webModule   |  |
                                 |   |                 +------------>             |  |
                                 |   |                 |    Init    |   InitWeb() |  |
                                 |   |                 |            |             |  |
                                 |   |                 |            +-------------+  |
                                 |   |                 |                             |
                                 |   |                 |            +-----+          |
                                 |   |                 |            |     |          |
                                 |   |                 +------------> ... |          |
                                 |   |                 |    Init    |     |          |
                                 |   +-----------------+            +-----+          |
                                 |                                                   |
                                 |                                                   |
                                 +---------------------------------------------------+

1300

協助 efm bridge 幫忙 upgrade 成 ACE 的版本

參考 20170215_jeffrey#1345

eric 找了兩片 efmbridge 給我

keep 一下那些 PCB 號碼已經做完了

使用的 firmware 是 D:\EfmBridge\ReleaseNew\branches\CID000_ACE\5640000.110.20151109-R948.bin

PCB - 22FHW38M0024 - ok

另一片上了電 console 沒反應

退回給 eric

1310

繼續昨天的 trace

來看 webModule 的 InitWeb() 被叫起來後做了什麼

webcfg.c

static int InitWebIptables(sWebConfig  *pCfg)
{
    if(ATTVAL_MODE_OFF==pCfg->mode)
    {
        return ICOS_FAILURE;
    }
    IPTF_JOIN_AND_NEW(IPT_UC_MGMT_IN ,"MGMT_WWW",NULL);
    IP6TF_JOIN_AND_NEW(IP6T_UC_MGMT_IN,"MGMT_WWW",NULL);
    return ICOS_SUCCESS;
}

static int LoadDefault(sWebConfig *pCfg) { IDBG("\n");
    memset(pCfg, 0, sizeof(*pCfg));
    pCfg->mode          = ATTVAL_MODE_ON;
    pCfg->httpdPort     = 80;
    pCfg->httpsPort     = 443;
    pCfg->refreshPeriod = 2;

    /* base on ZyXEL's web */
    pCfg->serverWebPort = 80;
    pCfg->WWWAccessInterface = 0; // {"value":0, "text": "ALL"}
    pCfg->btnwww2 = 0; // {"value":0, "text": "All"}
    strcpy(pCfg->serverWebClientIP, "0.0.0.0");

    return ICOS_SUCCESS;
}

static int InitWeb(char *pCfgStr) {
    struct stat  st;
    sWebConfig *pCfg = (sWebConfig *)(&gUnionConfig.webCfg);

    if (stat(WEB_ETC_DIR, &st)<0) mkdir(WEB_ETC_DIR, 0755);
    if (stat(WEB_TMP_DIR, &st)<0) mkdir(WEB_TMP_DIR, 0755);

    LoadDefault(pCfg);
    SysParsorTextFile(WEB_ETC_CFG_FILE, WebCallBack, pCfg,sizeof(*pCfg));
    InitWebIptables(pCfg); //Keep web only,John20161107
    if (ApplyWebSetting(OPFLAG_APPLY_WEB_WWW, 0, pCfg,sizeof(*pCfg) ) == ICOS_FAILURE)
        return ICOS_FAILURE;

    return ICOS_SUCCESS;
}

1330

ariel 表示他的 web upgrade 卡在 12% 就不會動了

雖然從 /tmp/ 下的 log 可以看到 upgrade 是已經完成了

不過 web 的 javascript 在 12% 之後就不再去問 firmware upgrade 的狀態了

ariel 表示前幾天是好的

是忽然出現這個狀況的

1335

eric 再補一片 efmbridge 給我

PCB - 22FHU38M0003 - 改 MCSV - ok

EfmBridge 特別的帳密為

User: iwu@fbt&ND
Password: wut@uty&2210

1345

繼續 trace

static int InitWeb(char *pCfgStr) {
    struct stat  st;
    sWebConfig *pCfg = (sWebConfig *)(&gUnionConfig.webCfg);

    if (stat(WEB_ETC_DIR, &st)<0) mkdir(WEB_ETC_DIR, 0755);
    if (stat(WEB_TMP_DIR, &st)<0) mkdir(WEB_TMP_DIR, 0755);

    LoadDefault(pCfg);
    SysParsorTextFile(WEB_ETC_CFG_FILE, WebCallBack, pCfg,sizeof(*pCfg));
    InitWebIptables(pCfg); //Keep web only,John20161107
    if (ApplyWebSetting(OPFLAG_APPLY_WEB_WWW, 0, pCfg,sizeof(*pCfg) ) == ICOS_FAILURE)
        return ICOS_FAILURE;

    return ICOS_SUCCESS;
}

InitWeb() 做完 LoadDefault() 之後緊接著作 SysParsorTextFile()

LoadDefault() 會讓 pCfg keep 住一份初始的 web 設定值

SysParsorTextFile() 會去讀 WEB_ETC_CFG_FILE - 文字形式的 web 設定值
如果該 file 存在的話
便呼叫我們準備給它的 WebCallBack 來 parser WEB_ETC_CFG_FILE
不管 pCfg 剛剛已經 keep 住一份初始的 web 設定值
閉著眼睛就把它蓋掉

1450

從 arile 那把會發生問題的 M300 拿來追一下問題

問題是 web upgrade 卡在 12% 就不會動了

答案是 web browser 因為 cache 沒去跟 m300 要新的 firmware.js

1545

繼續 trace

webcfg.c

static int InitWebIptables(sWebConfig  *pCfg)
{
    if(ATTVAL_MODE_OFF==pCfg->mode)
    {
        return ICOS_FAILURE;
    }
    IPTF_JOIN_AND_NEW(IPT_UC_MGMT_IN ,"MGMT_WWW",NULL);
    IP6TF_JOIN_AND_NEW(IP6T_UC_MGMT_IN,"MGMT_WWW",NULL);
    return ICOS_SUCCESS;
}

```c
static int InitWeb(char *pCfgStr) {
    ...
    InitWebIptables(pCfg); //Keep web only,John20161107
    ...
}

InitWeb() 拿到 web 設定值 後會呼叫 InitWebIptables(pCfg) 作事

IPTF_JOIN_AND_NEW(IPT_UC_MGMT_IN ,"MGMT_WWW",NULL);
IP6TF_JOIN_AND_NEW(IP6T_UC_MGMT_IN,"MGMT_WWW",NULL);

1615

m300 firmare upgrade 的 page 有很小的機會會 init fail 導致畫面出現亂碼

那是因為當 firmware.cgi 呼叫 jweb.out.json.fail("something happen") 時所導致

firmware.c

static void _progress()
{
    system("FirmwareProgress.sh");
    json_object *progress = json_object_from_file(PROGRESS);
    if (progress)
    {
        jweb.out.json.data("progress", progress);
    }
    else
    {
        jweb.out.json.fail("something happen");
    }
}

雖然不明白為何 json_object_from_file(PROGRESS) 會 回傳 null

但目前的 firmware.js 並沒有因應的方法

firmware.js

function firmwareController($scope, $timeout, $location, icos, Upload, progress) {
    var vm = this;

    vm.progress = progress;
    ...
    if (vm.progress.state == "busy") {
        var busy_sec = (Date.parse(vm.progress.curr_time) - Date.parse(vm.progress.init_time))/1000
        if (busy_sec + 12 < 99) {
            vm.progress_valuenow = busy_sec + 12;
        } else {
            vm.progress_valuenow = 99;
        }
        vm.progress_summary = vm.progress.status;
        vm.timeout_2sec();
    }

}

所以才導致畫面 init fail

image

目前先修正 firmware.js 讓它有個應變方式並打印個 log

firmware.js

function firmwareController($route, $scope, $timeout, $location, icos, Upload, progress) {
    var vm = this;

    vm.progress = progress;

    // sometimes fail because cgi invoke `json_object_from_file` get null pointer
    if (vm.progress.fail) {
        console.log("vm.progress.fail... reload again");
        $timeout(function() {
            $route.reload();
        }, 1000);
    }

    if (vm.progress.state == "busy") {
        var busy_sec = (Date.parse(vm.progress.curr_time) - Date.parse(vm.progress.init_time))/1000
        if (busy_sec + 12 < 99) {
            vm.progress_valuenow = busy_sec + 12;
        } else {
            vm.progress_valuenow = 99;
        }
        vm.progress_summary = vm.progress.status;
        vm.timeout_2sec();
    }

}

先測一下

不急著 commit

1700

M300 要找個方式讓 web browser 不會去 cache

就是避免 web browser cache 到舊的 firmware.js

1725

ariel 希望我以 BGP 這個 task 為優先

所以我需要先估個 schedule