20170217_jeffrey - silenceuncrio/diary GitHub Wiki
0900
先 review 昨天的 trace
1005
剛剛和 aaron 討論 CLI 架構的時候
就是可以很直覺得利用 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 的版本
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
目前先修正 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