20170222_jeffrey - silenceuncrio/diary GitHub Wiki

0925

review

0930

今天先從 M300 的 /home/log/web.log 來觀察 webModule 的初始化行為

root@Mobile Router:~# cat /home/log/web.log
1487726094[20170222 1:14:54] [notify_web:871]IN(E82|S44|D44)
1487726094[20170222 1:14:54] [notify_web:880]module init
1487726099[20170222 1:14:59] [notify_web:871]IN(E62|S00|D00)
1487726099[20170222 1:14:59] [notify_web:905]boot init done
1487726099[20170222 1:14:59] [web_dump:609]===init config===
1487726099[20170222 1:14:59] [web_dump:619][COM]conn_mgr=1,mod_init_done:1.
1487726099[20170222 1:14:59] [web_dump:640][CFG]mode=httpd,httpd_port=80,https_port=443,refreshperiod=2,sport=80,intf=all,secure=all,clienip=0.0.0.0
1487726099[20170222 1:14:59] [web_dump:648][DMN0]active=1,pid=-1,status=0,flag=0x0,DID0
1487726099[20170222 1:14:59] [web_dump:648][DMN1]active=1,pid=-1,status=0,flag=0x0,DID1
1487726099[20170222 1:14:59] [web_dump:653][RTI]wan4_ifname=,wan6_ifname=.
1487726099[20170222 1:14:59] [daemon_restart:756][DID0] remain IP server retry for 6 times.
1487726099[20170222 1:14:59] [create_daemon_conf:664]IN
1487726099[20170222 1:14:59] [create_daemon_conf:675]cmd_buf=>dir=/
1487726099[20170222 1:14:59] [create_daemon_conf:680]cmd_buf=>cgipat=cgi-bin/**
1487726099[20170222 1:14:59] [create_daemon_conf:685]cmd_buf=>chroot
1487726099[20170222 1:14:59] [create_daemon_conf:690]cmd_buf=>user=root
1487726099[20170222 1:14:59] [create_daemon_conf:695]cmd_buf=>max_age=0
1487726099[20170222 1:14:59] [create_daemon_conf:700]cmd_buf=>debug
1487726099[20170222 1:14:59] [daemon_restart:781][DMN]Lanch=>/usr/sbin/iweb  -p 80 -d /www
1487726099[20170222 1:14:59] [daemon_restart:756][DID1] remain IP server retry for 6 times.
1487726099[20170222 1:14:59] [web_dump:609]===cfg not allowed===
1487726099[20170222 1:14:59] [web_dump:640][CFG]mode=httpd,httpd_port=80,https_port=443,refreshperiod=2,sport=80,intf=all,secure=all,clienip=0.0.0.0
1487726099[20170222 1:14:59] [web_dump:648][DMN0]active=1,pid=759,status=1,flag=0x0,DID0
1487726099[20170222 1:14:59] [web_dump:648][DMN1]active=1,pid=-1,status=0,flag=0x1,DID1
1487726099[20170222 1:14:59] [web_dump:609]===After daemon restart===
1487726099[20170222 1:14:59] [web_dump:619][COM]conn_mgr=1,mod_init_done:1.
1487726099[20170222 1:14:59] [web_dump:640][CFG]mode=httpd,httpd_port=80,https_port=443,refreshperiod=2,sport=80,intf=all,secure=all,clienip=0.0.0.0
1487726099[20170222 1:14:59] [web_dump:648][DMN0]active=1,pid=759,status=1,flag=0x0,DID0
1487726099[20170222 1:14:59] [web_dump:648][DMN1]active=1,pid=-1,status=0,flag=0x0,DID1
1487726099[20170222 1:14:59] [web_dump:653][RTI]wan4_ifname=,wan6_ifname=.
1487726100[20170222 1:15:0] [notify_web:871]IN(E50|S59|D00)
1487726102[20170222 1:15:2] [msgcb_web:1155]IN(DID0,pid 759)
<--
Icos_user_root.session_ttl: 300 sec
Icos_user_root.user: root
Icos_user_root.pass: $1$$2Dg0uARUa9gcTJ9I5/iKb/
Starting iweb on port 80, serving /www
-->
1487726102[20170222 1:15:2] [notify_web:871]IN(E02|S56|D00)
1487726102[20170222 1:15:2] [notify_web:871]IN(E01|S56|D00)
1487726145[20170222 1:15:45] [notify_web:871]IN(E43|S35|D00)
1487726153[20170222 1:15:53] [msgcb_web:1155]IN(DID0,pid 759)
<--
wasLogin_handler
-->
1487726153[20170222 1:15:53] [msgcb_web:1155]IN(DID0,pid 759)
<--
sid: -460018129
wasLogin: false
-->
1487726164[20170222 1:16:4] [msgcb_web:1155]IN(DID0,pid 759)
<--
wasLogin_handler
sid: -460018129
wasLogin: false
-->
1487726173[20170222 1:16:13] [msgcb_web:1155]IN(DID0,pid 759)
<--
wasLogin_handler
-->
1487726173[20170222 1:16:13] [msgcb_web:1155]IN(DID0,pid 759)
<--
sid: -460018129
wasLogin: false
-->
1487726178[20170222 1:16:18] [msgcb_web:1155]IN(DID0,pid 759)
<--
auth_handler: /cgi-bin/firmware.cgi
sid: -460018129
auth_handler: /app/feature/firmware.html
sid: -460018129
-->
1487726183[20170222 1:16:23] [msgcb_web:1155]IN(DID0,pid 759)
<--
wasLogin_handler
-->
1487726183[20170222 1:16:23] [msgcb_web:1155]IN(DID0,pid 759)
<--
sid: -460018129
wasLogin: false
-->
1487726187[20170222 1:16:27] [msgcb_web:1155]IN(DID0,pid 759)
<--
login_handler
user: root; pass:2wsx#EDC
-->
1487726187[20170222 1:16:27] [msgcb_web:1155]IN(DID0,pid 759)
<--
root logged in, sid 7b90c0ecb0e172b8
-->
1487726188[20170222 1:16:28] [msgcb_web:1155]IN(DID0,pid 759)
<--
auth_handler: /app/feature/firmware.html
sid: -1327402312
root logged in, sid 7b90c0ecb0e172b8
-->
1487726188[20170222 1:16:28] [msgcb_web:1155]IN(DID0,pid 759)
<--
auth_handler: /cgi-bin/firmware.cgi
sid: -1327402312
root logged in, sid 7b90c0ecb0e172b8
-->
root@Mobile Router:~#

上面的紀錄是 M300 剛開機

然後我開了 web

點了一個需要 login 的 page 作了成功的 login

0940

1487726094[20170222 1:14:54] [notify_web:871]IN(E82|S44|D44)
1487726094[20170222 1:14:54] [notify_web:880]module init

webModule.notify() 是這樣走的

static int notify_web(PRO_EVENT *pevent)
{
    sWebConfig    *cfg=&gWebCtrl.cfg;
    RT_INFO_T     *rt_info=&gWebCtrl.rt_info;

    WEB_INFO("IN(E%02d|S%02d|D%02d)\n",pevent->event_id,pevent->src_id,pevent->dst_id);

    switch(pevent->event_id)
    {
        case ICOS_UCAST_MODULE_APPLY:
            if(pevent->msg_len==sizeof(sWebConfig))
            {
                if(0==gWebCtrl.mod_init_done)
                {
                    WEB_INFO("module init\n");
                    web_init((sWebConfig *)pevent->msg);
                    gWebCtrl.mod_init_done=1;
                }
                else
                {
                    ...
                }
            }
            break;
        ...
    }

    if(gWebCtrl.mod_init_done)
    {
        ...
    }

    return ICOS_SUCCESS;
}

注意到 gWebCtrl.mod_init_done=1;

這會影響後續的流程

0945

1487726099[20170222 1:14:59] [notify_web:871]IN(E62|S00|D00)
1487726099[20170222 1:14:59] [notify_web:905]boot init done
1487726099[20170222 1:14:59] [web_dump:609]===init config===
1487726099[20170222 1:14:59] [web_dump:619][COM]conn_mgr=1,mod_init_done:1.
1487726099[20170222 1:14:59] [web_dump:640][CFG]mode=httpd,httpd_port=80,https_port=443,refreshperiod=2,sport=80,intf=all,secure=all,clienip=0.0.0.0
1487726099[20170222 1:14:59] [web_dump:648][DMN0]active=1,pid=-1,status=0,flag=0x0,DID0
1487726099[20170222 1:14:59] [web_dump:648][DMN1]active=1,pid=-1,status=0,flag=0x0,DID1
1487726099[20170222 1:14:59] [web_dump:653][RTI]wan4_ifname=,wan6_ifname=.

webModule.notify() 是這樣走的

static int notify_web(PRO_EVENT *pevent)
{
    int i;
    sWebConfig    *cfg=&gWebCtrl.cfg;
    RT_INFO_T     *rt_info=&gWebCtrl.rt_info;

    WEB_INFO("IN(E%02d|S%02d|D%02d)\n",pevent->event_id,pevent->src_id,pevent->dst_id);

    switch(pevent->event_id)
    {
        ...
        case ICOS_BOOTINIT_DONE:
                WEB_INFO("boot init done\n");
                web_dump(DUMP_ALL,"init config");
                for(i=0;MAX_DAEMON_NUM>i;i++)
                {
                    gWebCtrl.dmn_ctrl[i].flag=FLAG_DMN_RESTART;
                }
            break;
        ...
    }

    if(gWebCtrl.mod_init_done)
    {
        int has_restart=0;
        int has_fw4_restart=0;
        int has_fw6_restart=0;
        for(i=0;MAX_DAEMON_NUM>i;i++)
        {
            if(gWebCtrl.dmn_ctrl[i].flag)
            {
                int iface_sel=WEB_ATTVAL_ACCESS_INTERFACE_DISABLE==cfg->WWWAccessInterface?IPT_IFACE_DIS:
                              WEB_ATTVAL_ACCESS_INTERFACE_LAN==cfg->WWWAccessInterface?IPT_IFACE_LAN:
                              WEB_ATTVAL_ACCESS_INTERFACE_WAN==cfg->WWWAccessInterface?IPT_IFACE_WAN:
                              WEB_ATTVAL_ACCESS_INTERFACE_ALL==cfg->WWWAccessInterface?IPT_IFACE_ALL:IPT_IFACE_DIS; //Default disable

                if((FLAG_DMN_RESTART|FLAG_FW4_RESTART)&gWebCtrl.dmn_ctrl[i].flag)
                {
                    ...
                }
                if((FLAG_DMN_RESTART|FLAG_FW6_RESTART)&gWebCtrl.dmn_ctrl[i].flag)
                {
                    ...
                }
                if(FLAG_DMN_RESTART & gWebCtrl.dmn_ctrl[i].flag)
                {
                    ...
                }
                gWebCtrl.dmn_ctrl[i].flag&=~(FLAG_FW4_RESTART|FLAG_FW6_RESTART|FLAG_DMN_RESTART);
            }
        }
        if(has_restart)
        {
            web_dump(DUMP_ALL,"After daemon restart");
        }
    }

    return ICOS_SUCCESS;
}

1305

繼續看 log 之前先看當 FLAG_DMN_RESTART & gWebCtrl.dmn_ctrl[i].flag 成立時做了甚麼

        for(i=0;MAX_DAEMON_NUM>i;i++)
        {
            if(gWebCtrl.dmn_ctrl[i].flag)
            {
                ...
                if(FLAG_DMN_RESTART & gWebCtrl.dmn_ctrl[i].flag)
                {
                    gWebCtrl.dmn_ctrl[i].retry_cnt=MAX_DAEMON_RETRY_NUM;
                    if(DAEMON_STATUS_OFF!=gWebCtrl.dmn_ctrl[i].status)
                    {
                        WEB_DBG("Daemon is running,add one retry count...\n");
                        gWebCtrl.dmn_ctrl[i].retry_cnt+=1;
                    }
                    daemon_restart(&gWebCtrl.dmn_ctrl[i]);
                    has_restart++;

                }
                gWebCtrl.dmn_ctrl[i].flag&=~(FLAG_FW4_RESTART|FLAG_FW6_RESTART|FLAG_DMN_RESTART);
            }
        }

這樣了流程會走兩次

走第一次時的 log

1487726099[20170222 1:14:59] [daemon_restart:756][DID0] remain IP server retry for 6 times.
1487726099[20170222 1:14:59] [create_daemon_conf:664]IN
1487726099[20170222 1:14:59] [create_daemon_conf:675]cmd_buf=>dir=/
1487726099[20170222 1:14:59] [create_daemon_conf:680]cmd_buf=>cgipat=cgi-bin/**
1487726099[20170222 1:14:59] [create_daemon_conf:685]cmd_buf=>chroot
1487726099[20170222 1:14:59] [create_daemon_conf:690]cmd_buf=>user=root
1487726099[20170222 1:14:59] [create_daemon_conf:695]cmd_buf=>max_age=0
1487726099[20170222 1:14:59] [create_daemon_conf:700]cmd_buf=>debug
1487726099[20170222 1:14:59] [daemon_restart:781][DMN]Lanch=>/usr/sbin/iweb  -p 80 -d /www

流程如下

static int create_daemon_conf(DAEMON_CTRL_T *dmn_ctrl)
{
    ...
    WEB_INFO("IN\n");
    ...
}

static int is_request_start(DAEMON_CTRL_T *dmn_ctrl)
{
    if(ICOS_FAILURE==create_daemon_conf(dmn_ctrl))
    {
        ...
    }
}

static void daemon_restart(DAEMON_CTRL_T *dmn_ctrl)
{
    WEB_INFO("[DID%d] remain IP server retry for %d times.\n",dmn_ctrl->did,dmn_ctrl->retry_cnt);
    if(ICOS_SUCCESS==is_request_start(dmn_ctrl))
    {
        WEB_DBG("[DMN]Lanch=>%s %s\n",WEB_DAEMON_BIN_FILE,argv);
    }
}

走第二次時的 log

1487726099[20170222 1:14:59] [daemon_restart:756][DID1] remain IP server retry for 6 times.
1487726099[20170222 1:14:59] [web_dump:609]===cfg not allowed===
1487726099[20170222 1:14:59] [web_dump:640][CFG]mode=httpd,httpd_port=80,https_port=443,refreshperiod=2,sport=80,intf=all,secure=all,clienip=0.0.0.0
1487726099[20170222 1:14:59] [web_dump:648][DMN0]active=1,pid=759,status=1,flag=0x0,DID0
1487726099[20170222 1:14:59] [web_dump:648][DMN1]active=1,pid=-1,status=0,flag=0x1,DID1

走第二次時的流程如下

static int is_request_start(DAEMON_CTRL_T *dmn_ctrl)
{
    if(!((DID_HTTPD==dmn_ctrl->did && (ATTVAL_WEBMODE_HTTPD==cfg->mode || ATTVAL_WEBMODE_BOTH==cfg->mode)) ||
         (DID_HTTPS==dmn_ctrl->did && (ATTVAL_WEBMODE_HTTPS==cfg->mode || ATTVAL_WEBMODE_BOTH==cfg->mode))))
    {
        web_dump(DUMP_CFG|DUMP_DMN,"cfg not allowed");
        return ICOS_FAILURE;
    }
}

static void daemon_restart(DAEMON_CTRL_T *dmn_ctrl)
{
    WEB_INFO("[DID%d] remain IP server retry for %d times.\n",dmn_ctrl->did,dmn_ctrl->retry_cnt);

    if(ICOS_SUCCESS==is_request_start(dmn_ctrl))
    {
        ...
    }
}

1325

再來的 log 如下

1487726099[20170222 1:14:59] [web_dump:609]===After daemon restart===
1487726099[20170222 1:14:59] [web_dump:619][COM]conn_mgr=1,mod_init_done:1.
1487726099[20170222 1:14:59] [web_dump:640][CFG]mode=httpd,httpd_port=80,https_port=443,refreshperiod=2,sport=80,intf=all,secure=all,clienip=0.0.0.0
1487726099[20170222 1:14:59] [web_dump:648][DMN0]active=1,pid=759,status=1,flag=0x0,DID0
1487726099[20170222 1:14:59] [web_dump:648][DMN1]active=1,pid=-1,status=0,flag=0x0,DID1
1487726099[20170222 1:14:59] [web_dump:653][RTI]wan4_ifname=,wan6_ifname=.

流程如下

static int notify_web(PRO_EVENT *pevent)
{
    ...
    if(gWebCtrl.mod_init_done)
    {
        for(i=0;MAX_DAEMON_NUM>i;i++)
        {
            ...
        }
        if(has_restart)
        {
            web_dump(DUMP_ALL,"After daemon restart");
        }
    }
    ...
}

1330

再來的 log

1487726100[20170222 1:15:0] [notify_web:871]IN(E50|S59|D00)
  • event_id - 50 - ICOS_LAN_IP_UPDATE
  • src_id - 59 - MODULE_LANST
  • dst_id - 00 - broadcast

webModule 並沒有針對 ICOS_LAN_IP_UPDATE 這個 broadcast event 進行任何處理

1335

再來

1487726102[20170222 1:15:2] [msgcb_web:1155]IN(DID0,pid 759)
<--
Icos_user_root.session_ttl: 300 sec
Icos_user_root.user: root
Icos_user_root.pass: $1$$2Dg0uARUa9gcTJ9I5/iKb/
Starting iweb on port 80, serving /www
-->

這是因為 webModulw.msgcb_web() 被觸發了

static int msgcb_web(char *msg, pid_t pid, int rc)
{
    int i;
    DAEMON_CTRL_T *dmn_ctrl=NULL;

    for(i=0;MAX_DAEMON_NUM>i;i++)
    {
        if(pid==gWebCtrl.dmn_ctrl[i].pid)
        {
            WEB_INFO("IN(DID%d,pid %d)\n",gWebCtrl.dmn_ctrl[i].did,gWebCtrl.dmn_ctrl[i].pid);
            dmn_ctrl=&gWebCtrl.dmn_ctrl[i];
            break;
        }
    }
    if(NULL==dmn_ctrl)
    {
        return ICOS_SUCCESS;
    }

    if(msg)
    {
        #if 1 //debug
        WEB_DAEMON("<--\n");
        WEB_DAEMON("%s",msg);
        WEB_DAEMON("-->\n");
        #endif
        //daemon_event(dmn_ctrl,msg);
    }
    return ICOS_SUCCESS;
}

這是 ariel 跟 john 帶進來 icos 的新機制

來源就不去追了

1435

arile 請我跟 shin 聯絡一下看是怎麼樣來 demo 一下 M300 怎麼把軟體 燒錄 到 nand flash 去的流程

1440

直接走一趟... 不過 shin 不在

1510

目前 M300 的案子對外的 release 放在 P:\2_Projects\3_Wireless\M300_M301\firmware

也可說是放在 \\mis-serv\2_Projects\3_Wireless\M300_M301\firmware

目前有兩個 release

  • 20170106
    • m300_v1.0_20170106070251.tar
    • M300-ReleaseNotes.v1.0.txt
  • 20170112
    • m300_v1.1_012C000000129880.tar
    • M30x-ReleaseNotes.xxx.txt

先為了 m300_v1.1_012C000000129880.tar 準備個配套的 mfgtool 燒錄包 m300_v1.1_mfgtools.rar

到時候就直接解開這包然後搭配 M300 的板子作 demo 即可

1535

換來 trace 一下 sshModule

裡頭應該有建立 key 的相關流程可以參考

https 的啟動流程應該可以模仿才對

sshModule 定義如下

sIcosModule sshModule={
    .szName = "ssh",
    .Init = InitSsh,
    .Exit = ExitSsh,
    .Apply = ApplySshSetting,
    .GetSetting = GetSshSetting,
    .SetSetting = SetSshSetting,
    .VerifySetting = VerifySshSetting,
    .Factory = facotry_default_ssh_setting,
    .NotifyHandler = notify_ssh,
    .proc_msg_cb = msgcb_ssh,
    .proc_term_cb = termcb_ssh,
};

直接從 log 來追流程

root@Mobile Router:~# cat /home/log/ssh.log
1487748846[20170222 7:34:6] [LoadDefault:158]loaded from fac done.
1487748846[20170222 7:34:6] [notify_ssh:795]IN(E82|S33|D33)
1487748846[20170222 7:34:6] [notify_ssh:804]module init
1487748846[20170222 7:34:6] [ssh_init:587]Key file generated done.
1487748852[20170222 7:34:12] [notify_ssh:795]IN(E62|S00|D00)
1487748852[20170222 7:34:12] [notify_ssh:829]boot init done
1487748852[20170222 7:34:12] [ssh_dump:434][COM]conn_mgr=1,mod_init_done:1.
1487748852[20170222 7:34:12] [ssh_dump:453][CFG]mode=on,port=22,iface_sel=lan,scenario=dual,cli4_mode=all,ipv4_addr=0.0.0.0,cli6_mode=all,ipv6_addr=
1487748852[20170222 7:34:12] [ssh_dump:458][DMN]active=1,pid=-1,status=0,flag=0x0,is_keyfile_ready=1.
1487748852[20170222 7:34:12] [ssh_dump:462][RTI]wan4_ifname=,wan6_ifname=.
1487748852[20170222 7:34:12] [daemon_restart:530]IN
1487748852[20170222 7:34:12] [gen_key_files:471]IN
1487748852[20170222 7:34:12] [gen_key_files:490]OUT
1487748852[20170222 7:34:12] [daemon_restart:558][DMN]Lanch=>/usr/sbin/dropbear -F -v -r /etc/icos/ssh/dropbear_rsa_host_key -r /etc/icos/ssh/dropbear_dss_host_key -r /etc/icos/ssh/dropbear_ecdsa_host_key -p 22
1487748852[20170222 7:34:12] [ssh_dump:434][COM]conn_mgr=1,mod_init_done:1.
1487748852[20170222 7:34:12] [ssh_dump:453][CFG]mode=on,port=22,iface_sel=lan,scenario=dual,cli4_mode=all,ipv4_addr=0.0.0.0,cli6_mode=all,ipv6_addr=
1487748852[20170222 7:34:12] [ssh_dump:458][DMN]active=1,pid=748,status=1,flag=0x1,is_keyfile_ready=1.
1487748852[20170222 7:34:12] [ssh_dump:462][RTI]wan4_ifname=,wan6_ifname=.
1487748854[20170222 7:34:14] [notify_ssh:795]IN(E50|S59|D00)
1487748854[20170222 7:34:14] [notify_ssh:795]IN(E53|S50|D00)
1487748854[20170222 7:34:14] [notify_ssh:795]IN(E02|S56|D00)
1487748854[20170222 7:34:14] [notify_ssh:795]IN(E01|S56|D00)
1487748855[20170222 7:34:15] [notify_ssh:795]IN(E43|S35|D00)

1355

按步就班

1487748846[20170222 7:34:6] [LoadDefault:158]loaded from fac done.

流程如下

static int LoadDefault(sSshConfig *pCfg) 
{
    if(0==SysParsorTextFile(SSH_FACTORY_FILE, SshCallBack,pCfg,sizeof(*pCfg)))
    {
        SSH_INFO("loaded from fac done.\n");
        return ICOS_SUCCESS;
    }
}

static int InitSsh(char *pCfgStr) {
    sSshConfig *pCfg = (sSshConfig *)(&gUnionConfig.sshCfg);

    LoadDefault(pCfg);
    SysParsorTextFile(SSH_ETC_CFG_FILE, SshCallBack, pCfg,sizeof(*pCfg));
    return ApplySshSetting(0, 0, pCfg, sizeof(*pCfg) );
}

1405

1487748846[20170222 7:34:6] [notify_ssh:795]IN(E82|S33|D33)
1487748846[20170222 7:34:6] [notify_ssh:804]module init
1487748846[20170222 7:34:6] [ssh_init:587]Key file generated done.
  • event_id - 82 - ICOS_UCAST_MODULE_APPLY
  • src_id - 33 - MODULE_SSH
  • dst_id - 33 - MODULE_SSH

流程

static int ssh_init(sSshConfig *cfgp)
{
    int keyfile_rsa=(0==access(SSH_DAEMON_KEY_FILE_RSA,F_OK));
    int keyfile_dss=(0==access(SSH_DAEMON_KEY_FILE_DSS,F_OK));
    int keyfile_ecdsa=(0==access(SSH_DAEMON_KEY_FILE_ECDSA,F_OK));
    
    gSshCtrl.dmn_ctrl.is_keyfile_ready=0;   
    if( keyfile_rsa && keyfile_dss && keyfile_ecdsa )
    {
        SSH_INFO("Key file generated done.\n");
        gSshCtrl.dmn_ctrl.is_keyfile_ready=1;
    }
    
    return ICOS_SUCCESS;
}

static int notify_ssh(PRO_EVENT *pevent)
{
    SSH_INFO("IN(E%02d|S%02d|D%02d)\n",pevent->event_id,pevent->src_id,pevent->dst_id);

    switch(pevent->event_id)
    {
        case ICOS_UCAST_MODULE_APPLY:
            if(pevent->msg_len==sizeof(sSshConfig))
            {
                if(0==gSshCtrl.mod_init_done)
                {
                    SSH_INFO("module init\n");
                    ssh_init((sSshConfig *)pevent->msg);
                    gSshCtrl.mod_init_done=1;
                }
            }
            break;
        ...
    }
    ...
}

注意到相關的 key 都已經存在了

  • SSH_DAEMON_KEY_FILE_RSA
  • SSH_DAEMON_KEY_FILE_DSS
  • SSH_DAEMON_KEY_FILE_ECDSA

1645

再來的 log

1487748852[20170222 7:34:12] [notify_ssh:795]IN(E62|S00|D00)
1487748852[20170222 7:34:12] [notify_ssh:829]boot init done
1487748852[20170222 7:34:12] [ssh_dump:434][COM]conn_mgr=1,mod_init_done:1.
1487748852[20170222 7:34:12] [ssh_dump:453][CFG]mode=on,port=22,iface_sel=lan,scenario=dual,cli4_mode=all,ipv4_addr=0.0.0.0,cli6_mode=all,ipv6_addr=
1487748852[20170222 7:34:12] [ssh_dump:458][DMN]active=1,pid=-1,status=0,flag=0x0,is_keyfile_ready=1.
1487748852[20170222 7:34:12] [ssh_dump:462][RTI]wan4_ifname=,wan6_ifname=.
1487748852[20170222 7:34:12] [daemon_restart:530]IN
1487748852[20170222 7:34:12] [gen_key_files:471]IN
1487748852[20170222 7:34:12] [gen_key_files:490]OUT
1487748852[20170222 7:34:12] [daemon_restart:558][DMN]Lanch=>/usr/sbin/dropbear -F -v -r /etc/icos/ssh/dropbear_rsa_host_key -r /etc/icos/ssh/dropbear_dss_host_key -r /etc/icos/ssh/dropbear_ecdsa_host_key -p 22
1487748852[20170222 7:34:12] [ssh_dump:434][COM]conn_mgr=1,mod_init_done:1.
1487748852[20170222 7:34:12] [ssh_dump:453][CFG]mode=on,port=22,iface_sel=lan,scenario=dual,cli4_mode=all,ipv4_addr=0.0.0.0,cli6_mode=all,ipv6_addr=
1487748852[20170222 7:34:12] [ssh_dump:458][DMN]active=1,pid=748,status=1,flag=0x1,is_keyfile_ready=1.
1487748852[20170222 7:34:12] [ssh_dump:462][RTI]wan4_ifname=,wan6_ifname=.

流程有點多

static void gen_key_files(void)
{
    int pid;
    char cmd[256];
    
    SSH_INFO("IN\n");
    if(-1==access(SSH_DAEMON_KEY_FILE_RSA,F_OK))
    {
        ...
    }
    if(-1==access(SSH_DAEMON_KEY_FILE_DSS,F_OK))
    {
        ...
    }
    if(-1==access(SSH_DAEMON_KEY_FILE_ECDSA,F_OK))
    {
        ...
    }
    SSH_INFO("OUT\n");
}

static void daemon_restart(void)
{
    sSshConfig    *cfg=&gSshCtrl.cfg;
    DAEMON_CTRL_T *dmn_ctrl=&gSshCtrl.dmn_ctrl;
    
    SSH_INFO("IN\n");
    //Daemon shutdown
    if(DAEMON_STATUS_OFF!=dmn_ctrl->status)
    {
        if(DAEMON_STATUS_RUNNING==dmn_ctrl->status && 
           BAD_PID!=dmn_ctrl->pid)
        {
            SSH_INFO("[DMN] killed (%d).\n",dmn_ctrl->pid);
            ICOS_kill(dmn_ctrl->pid);
        }
        dmn_ctrl->status=DAEMON_STATUS_WAIT_EXIT;
        SSH_INFO("[DMN] Wait exit(%d).\n",dmn_ctrl->pid);
        return;
    }
    
    gen_key_files();
    
    dmn_ctrl->pid=BAD_PID;
    dmn_ctrl->status=DAEMON_STATUS_OFF;
    //Daemon start
    if(ICOS_SUCCESS==is_request_start())
    {
        char argv[256]= {0};
        //-v: log(huge data)
        //-F: foregroud
        //-r: key file
        //-p: server port
        snprintf(argv,sizeof(argv),"-F -v -r %s -r %s -r %s -p %d",SSH_DAEMON_KEY_FILE_RSA,SSH_DAEMON_KEY_FILE_DSS,SSH_DAEMON_KEY_FILE_ECDSA,cfg->server_port);
        SSH_DBG("[DMN]Lanch=>%s %s\n",SSH_DAEMON_BIN_FILE,argv);
        dmn_ctrl->pid=ICOS_ProcLaunch(MODULE_SSH,SSH_DAEMON_BIN_FILE,argv,NULL);
        dmn_ctrl->status=DAEMON_STATUS_RUNNING;
        ICOS_slog(MODULE_SSH,LOG_INFO,"SSH server started.");
    }
}


static int notify_ssh(PRO_EVENT *pevent)
{
    SSH_INFO("IN(E%02d|S%02d|D%02d)\n",pevent->event_id,pevent->src_id,pevent->dst_id);

    switch(pevent->event_id)
    {
        ...
        case ICOS_BOOTINIT_DONE:
                SSH_INFO("boot init done\n");
                ssh_dump(DUMP_ALL);
                dmn_ctrl->flag|=FLAG_DMN_RESTART;
            break;
        ...
    }
    
    if(gSshCtrl.mod_init_done)
    {
        if(dmn_ctrl->flag)
        {
            ...                          
            if((FLAG_DMN_RESTART|FLAG_FW4_RESTART)&dmn_ctrl->flag)
            {
                ...
            }
            if((FLAG_DMN_RESTART|FLAG_FW6_RESTART)&dmn_ctrl->flag)
            {
                ...
            }
            if(FLAG_DMN_RESTART & dmn_ctrl->flag)
            {
                daemon_restart();
            }
            ssh_dump(DUMP_ALL);
            dmn_ctrl->flag=0;
        }
    }
    
    return ICOS_SUCCESS;
}

1625

再來都是沒去處裡的 broadcast message

1487748854[20170222 7:34:14] [notify_ssh:795]IN(E50|S59|D00)
  • event_id - 50 - ICOS_LAN_IP_UPDATE
  • src_id - 59 - MODULE_LANST
  • dst_id - 0 - broadcast
1487748854[20170222 7:34:14] [notify_ssh:795]IN(E53|S50|D00)
  • event_id - 53 - ICOS_LAN6_IP_UPDATE
  • src_id - 50 - MODULE_IPV6LAN
  • dst_id - 0 - broadcast
1487748854[20170222 7:34:14] [notify_ssh:795]IN(E02|S56|D00)
  • event_id - 02 - ICOS_CHG_CONN_TYPE
  • src_id - 56 - MODULE_CONNMGR
  • dst_id - 0 - broadcast
1487748854[20170222 7:34:14] [notify_ssh:795]IN(E01|S56|D00)
  • event_id - 01 - ICOS_CHG_WPROTO
  • src_id - 56 - MODULE_CONNMGR
  • dst_id - 0 - broadcast
1487748855[20170222 7:34:15] [notify_ssh:795]IN(E43|S35|D00)
  • event_id - 43 - ICOS_ETH_LINK_UP
  • src_id - 35 - MODULE_SWITCH
  • dst_id - 0 - broadcast