20190611_jeffrey - silenceuncrio/diary GitHub Wiki

0920

緊急事件

M300 寬溫

開機出現下面的訊息

### module <zebra> init
vty_read_config: failed to open configuration file /etc/quagga/zebra.conf: Permission denied
can't open configuration file [/etc/quagga/zebra.conf]
### module <smtp> init
### module <ospf> init 
...

先 build 一版寬溫的來看看

0950

利用 mfgtool 燒錄

開機看看

我的並不會

我的 icos zebra module log 如下

root@Hardened Cellular Router:~# cat /home/log/zebra.log
1560218050[20190611 1:54:10] [_init:227][caller:1213.1316]in
1560218050[20190611 1:54:10] [_init:240]copy configuration from factory to etc
1560218050[20190611 1:54:10] [_getSetting:180][caller:1213.1316]in
1560218050[20190611 1:54:10] [_callBack:135]attID:1, pAttValue:on
1560218050[20190611 1:54:10] [_callBack:136]res:0
1560218050[20190611 1:54:10] [_callBack:135]attID:2, pAttValue:Router
1560218050[20190611 1:54:10] [_callBack:136]res:0
1560218050[20190611 1:54:10] [_callBack:135]attID:3, pAttValue:zebra
1560218050[20190611 1:54:10] [_callBack:136]res:0
1560218050[20190611 1:54:10] [_apply:200][caller:1213.1316]in
1560218050[20190611 1:54:10] [_locSaveConfigTxt:93][pid:1316]in
1560218050[20190611 1:54:10] [_prepare_config:54]_prepare_config
root@Hardened Cellular Router:~#

拿反映問題的 ariel 的板子來看看

ariel 的 log 如下

root@M301-TXGW:~# cat /home/log/zebra.log
1560164865[20190610 11:7:45] [_init:227][caller:1235.1336]in
1560164865[20190610 11:7:45] [_getSetting:180][caller:1235.1336]in
1560164865[20190610 11:7:45] [_callBack:135]attID:1, pAttValue:on
1560164865[20190610 11:7:45] [_callBack:136]res:0
1560164865[20190610 11:7:45] [_callBack:135]attID:2, pAttValue:Router
1560164865[20190610 11:7:45] [_callBack:136]res:0
1560164865[20190610 11:7:45] [_callBack:135]attID:3, pAttValue:zebra
1560164865[20190610 11:7:45] [_callBack:136]res:0
1560164865[20190610 11:7:45] [_apply:200][caller:1235.1336]in
1560164865[20190610 11:7:45] [_locSaveConfigTxt:93][pid:1336]in
1560164865[20190610 11:7:45] [_prepare_config:54]_prepare_config
1560218808[20190611 2:6:48] [_init:227][caller:252.355]in
1560218808[20190611 2:6:48] [_getSetting:180][caller:252.355]in
1560218808[20190611 2:6:48] [_callBack:135]attID:1, pAttValue:on
1560218808[20190611 2:6:48] [_callBack:136]res:0
1560218808[20190611 2:6:48] [_callBack:135]attID:2, pAttValue:Router
1560218808[20190611 2:6:48] [_callBack:136]res:0
1560218808[20190611 2:6:48] [_callBack:135]attID:3, pAttValue:zebra
1560218808[20190611 2:6:48] [_callBack:136]res:0
1560218808[20190611 2:6:48] [_apply:200][caller:252.355]in
1560218808[20190611 2:6:48] [_locSaveConfigTxt:93][pid:355]in
1560218809[20190611 2:6:49] [_prepare_config:54]_prepare_config
root@M301-TXGW:~#

看一下 /etc/quagga/zebra.conf 所在目錄的相關權限資訊

先看 ariel 的

fig: failed to open configuration file /etc/quagga/zebra.conf: Permission denied
can't open configuration file [/etc/quagga/zebra.conf]
root@M301-TXGW:~# ls -l /etc/quagga/
-rw-r-----    1 www      postdrop         0 Jun 10 11:03 bgpd.conf
-rw-r-----    1 root     root           566 Jun 10 11:03 bgpd.conf.sample
-rw-r-----    1 www      postdrop         0 Jun 10 11:03 isisd.conf
-rw-r-----    1 root     root           789 Jun 10 11:03 isisd.conf.sample
-rw-r-----    1 www      postdrop         0 Jun 10 11:03 ospf6d.conf
-rw-r-----    1 root     root          1110 Jun 10 11:03 ospf6d.conf.sample
-rw-r-----    1 www      postdrop         0 Jun 10 11:03 ospfd.conf
-rw-r-----    1 root     root           182 Jun 10 11:03 ospfd.conf.sample
-rw-r-----    1 www      postdrop         0 Jun 10 11:03 ripd.conf
-rw-r-----    1 root     root           406 Jun 10 11:03 ripd.conf.sample
-rw-r-----    1 www      postdrop         0 Jun 10 11:03 ripngd.conf
-rw-r-----    1 root     root           390 Jun 10 11:03 ripngd.conf.sample
-rw-r-----    1 www      postdrop         0 Jun 10 11:03 vtysh.conf
-rw-r-----    1 root     root           128 Jun 10 11:03 vtysh.conf.sample
-rw-r-----    1 www      postdrop        31 Jun 11 02:06 zebra.conf
-rw-r-----    1 root     root           369 Jun 10 11:03 zebra.conf.sample
root@M301-TXGW:~# 

我的

root@Hardened Cellular Router:~# ls /etc/quagga/ -al
drwxr-x---    2 quagga   quaggavt      1024 Jan  1  1970 .
drwxr-xr-x   45 root     root          3072 Jun 11 02:00 ..
-rw-r-----    1 quagga   quagga           0 Jun 11 01:47 bgpd.conf
-rw-r-----    1 root     root           566 Jun 11 01:47 bgpd.conf.sample
-rw-r-----    1 quagga   quagga           0 Jun 11 01:47 isisd.conf
-rw-r-----    1 root     root           789 Jun 11 01:47 isisd.conf.sample
-rw-r-----    1 quagga   quagga           0 Jun 11 01:47 ospf6d.conf
-rw-r-----    1 root     root          1110 Jun 11 01:47 ospf6d.conf.sample
-rw-r-----    1 quagga   quagga           0 Jun 11 01:47 ospfd.conf
-rw-r-----    1 root     root           182 Jun 11 01:47 ospfd.conf.sample
-rw-r-----    1 quagga   quagga           0 Jun 11 01:47 ripd.conf
-rw-r-----    1 root     root           406 Jun 11 01:47 ripd.conf.sample
-rw-r-----    1 quagga   quagga           0 Jun 11 01:47 ripngd.conf
-rw-r-----    1 root     root           390 Jun 11 01:47 ripngd.conf.sample
-rw-r-----    1 quagga   quagga           0 Jun 11 01:47 vtysh.conf
-rw-r-----    1 root     root           128 Jun 11 01:47 vtysh.conf.sample
-rw-r-----    1 quagga   quagga          31 Jun 11 02:00 zebra.conf
-rw-r-----    1 root     root           369 Jun 11 01:47 zebra.conf.sample
root@Hardened Cellular Router:~#

感覺是 quagga 升級造成的問題

尤其是從舊版的 quagga 就是 M300 V2.00 之前的版本

透過 web upgrade 成新版 quagga 也就是 M300 V2.00

那麼就會出現 ariel 所反應的問題

因為新舊版 quagga 其一開始的 rootfs 的 /etc/quagga/ 目錄下各 file 權限有所差異

最保險的做法就是不要跟 quagga 預設的 configuration 目錄扯上關係

因為我們 firmware upgrade 之後並不會對 rootfs 下的 /etc/quagga 做任何影響

所以才會有今天的這個現象

1130

目前 branch release/v2.00 修改如下

diff --git a/proscend/prosrc/icos/icoslib/bgp/bgp.c b/proscend/prosrc/icos/icoslib/bgp/bgp.c
index 2af028e..e55a87e 100644
--- a/proscend/prosrc/icos/icoslib/bgp/bgp.c
+++ b/proscend/prosrc/icos/icoslib/bgp/bgp.c
@@ -37,9 +37,11 @@


 #define BGP_DAEMON_PATH         "/usr/sbin/bgpd"
-#define BGP_DAEMON              "ospfd"
-#define BGP_ARGV                "-d -u root -f %s"
-#define BGP_CONFIGURATION_FILE  "/etc/quagga/bgpd.conf"
+#define BGP_DAEMON              "bgpd"
+#define BGP_ARGV                "-d -u root -g quaggavty -f %s"
+#define BGP_CONFIGURATION_FILE  BGP_TMP_DIR"/bgpd.conf"
+#define BGP_CMD_ON              "bgpd -d -u root -g quaggavty -f "BGP_CONFIGURATION_FILE
+#define BGP_CMD_OFF             "killall bgpd 1>/dev/null 2>&1"
 #define BGP_DEBUG_LOG           "/tmp/bgpd.log"


@@ -561,13 +563,13 @@ static int _apply(int flag, int index, void* pStruct, int structSize)
     {
         IPTF_I("%s -p tcp --dport %d -j ACCEPT", BGP_IPT_INPUT_CHAIN, 179);

-        system("killall bgpd 1>/dev/null 2>&1");
+        system(BGP_CMD_OFF);
         _make_configuration_file(setting);
-        system("bgpd -d");
+        system(BGP_CMD_ON);
     }
     else
     {
-        system("killall bgpd 1>/dev/null 2>&1");
+        system(BGP_CMD_OFF);
     }


diff --git a/proscend/prosrc/icos/icoslib/ospf_2g/ospf_2g.c b/proscend/prosrc/icos/icoslib/ospf_2g/ospf_2g.c
index 7abf97b..1761a11 100644
--- a/proscend/prosrc/icos/icoslib/ospf_2g/ospf_2g.c
+++ b/proscend/prosrc/icos/icoslib/ospf_2g/ospf_2g.c
@@ -38,8 +38,10 @@

 #define OSPF_2G_DAEMON_PATH         "/usr/sbin/ospfd"
 #define OSPF_2G_DAEMON              "ospfd"
-#define OSPF_2G_ARGV                "-d -u root -f %s"
-#define OSPF_2G_CONFIGURATION_FILE  "/etc/quagga/ospfd.conf"
+#define OSPF_2G_ARGV                "-d -u root -g quaggavty -f %s"
+#define OSPF_2G_CONFIGURATION_FILE  OSPF_2G_TMP_DIR"/ospfd.conf"
+#define OSPF_2G_CMD_ON              "ospfd -d -u root -g quaggavty -f "OSPF_2G_CONFIGURATION_FILE
+#define OSPF_2G_CMD_OFF             "killall ospfd 1>/dev/null 2>&1"
 #define OSPF_2G_DEBUG_LOG           "/tmp/ospfd.log"


@@ -570,13 +572,13 @@ static int _apply(int flag, int index, void* pStruct, int structSize)
     {
         IPTF_I("%s -p ospf -j ACCEPT", OSPF_2G_IPT_INPUT_CHAIN);

-        system("killall ospfd 1>/dev/null 2>&1");
+        system(OSPF_2G_CMD_OFF);
         _make_configuration_file(setting);
-        system("ospfd -d");
+        system(OSPF_2G_CMD_ON);
     }
     else
     {
-        system("killall ospfd 1>/dev/null 2>&1");
+        system(OSPF_2G_CMD_OFF);
     }


diff --git a/proscend/prosrc/icos/icoslib/rip_2g/rip_2g.c b/proscend/prosrc/icos/icoslib/rip_2g/rip_2g.c
index ec27d9d..0aa66e3 100644
--- a/proscend/prosrc/icos/icoslib/rip_2g/rip_2g.c
+++ b/proscend/prosrc/icos/icoslib/rip_2g/rip_2g.c
@@ -32,8 +32,10 @@

 #define RIP_2G_DAEMON_PATH          "/usr/sbin/ripd"
 #define RIP_2G_DAEMON               "ripd"
-#define RIP_2G_ARGV                 "-d -u root -f %s"
-#define RIP_2G_CONFIGURATION_FILE   "/etc/quagga/ripd.conf"
+#define RIP_2G_ARGV                 "-d -u root -g quaggavty -f %s"
+#define RIP_2G_CONFIGURATION_FILE   RIP_2G_TMP_DIR"/ripd.conf"
+#define RIP_2G_CMD_ON               "ripd -d -u root -g quaggavty -f "RIP_2G_CONFIGURATION_FILE
+#define RIP_2G_CMD_OFF              "killall ripd 1>/dev/null 2>&1"
 #define RIP_2G_DEBUG_LOG            "/tmp/ripd.log"


@@ -466,13 +468,13 @@ static int _apply(int flag, int index, void* pStruct, int structSize)
     {
         IPTF_I("%s -p udp --dport %d -j ACCEPT", RIP_2G_IPT_INPUT_CHAIN, 520);

-        system("killall ripd 1>/dev/null 2>&1");
+        system(RIP_2G_CMD_OFF);
         _make_configuration_file(setting);
-        system("ripd -d");
+        system(RIP_2G_CMD_ON);
     }
     else
     {
-        system("killall ripd 1>/dev/null 2>&1");
+        system(RIP_2G_CMD_OFF);
     }


diff --git a/proscend/prosrc/icos/icoslib/zebra/zebra.c b/proscend/prosrc/icos/icoslib/zebra/zebra.c
index 245b2cb..0165d1e 100644
--- a/proscend/prosrc/icos/icoslib/zebra/zebra.c
+++ b/proscend/prosrc/icos/icoslib/zebra/zebra.c
@@ -20,9 +20,11 @@


 #define ZEBRA_DAEMON_PATH   "/usr/sbin/zebra"
-#define ZEBRA_DAEMON         "zebra"
-#define ZEBRA_ARGV           "-d -u root -f %s"
-#define ZEBRA_CONF_FILE      "/etc/quagga/zebra.conf"
+#define ZEBRA_DAEMON        "zebra"
+#define ZEBRA_ARGV          "-d -u root -g quaggavty -f %s"
+#define ZEBRA_CONF_FILE     ZEBRA_TMP_DIR"/zebra.conf"
+#define ZEBRA_CMD_ON        "zebra -d -u root -g quaggavty -f "ZEBRA_CONF_FILE
+#define ZEBRA_CMD_OFF       "killall zebra 1>/dev/null 2>&1"
 #define ZEBRA_CONF_FORMAT \
     "hostname %s\n" \
     "password %s\n"
@@ -208,13 +210,13 @@ static int _apply(int flag, int index, void* pStruct, int structSize)

     if (ATTVAL_MODE_ON == config->mode)
     {
-        system("killall zebra 1>/dev/null 2>&1");
+        system(ZEBRA_CMD_OFF);
         _prepare_config(config);
-        system("zebra -d");
+        system(ZEBRA_CMD_ON);
     }
     else
     {
-        system("killall zebra 1>/dev/null 2>&1");
+        system(ZEBRA_CMD_OFF);
     }

     return ICOS_SUCCESS;

關鍵點就在於明確指定 quagga 相關 daemon run 時的 user 及 group

root@Hardened Cellular Router:~# zebra -h
Usage : zebra [OPTION...]

Daemon which manages kernel routing table management and redistribution between different routing protocols.

-b, --batch        Runs in batch mode
-d, --daemon       Runs in daemon mode
-f, --config_file  Set configuration file name
-F, --fpm_format   Set fpm format to 'netlink' or 'protobuf'
-i, --pid_file     Set process identifier file name
-z, --socket       Set path of zebra socket
-k, --keep_kernel  Don't delete old routes which installed by zebra.
-C, --dryrun       Check configuration for validity and exit
-A, --vty_addr     Set vty's bind address
-P, --vty_port     Set vty's port number
-r, --retain       When program terminates, retain added route by zebra.
-u, --user         User to run as
-g, --group       Group to run as
-s, --nl-bufsize   Set netlink receive buffer size
-v, --version      Print program version
-h, --help         Display this help and exit

Report bugs to https://bugzilla.quagga.net
root@Hardened Cellular Router:~#

由以下可知

#define ZEBRA_CMD_ON        "zebra -d -u root -g quaggavty -f "ZEBRA_CONF_FILE
  • user = root
  • group = quaggavty

這樣就不會有問題了

不慣是從舊版的作 upgrade 或是直接用 mfgtool 燒錄 v2.00

1325

測試 PASS

可以上 code 了

commit 61f01f6f75250dfb04ab7f12bc22e7951a5e8000
Refs: [release/v2.00], {origin/release/v2.00}
Author: jeffrey <[email protected]>
Date:   Tue Jun 11 13:26:00 2019 +0800

    solve the problem about the icos module zebra init fail as following:
    ```
    vty_read_config: failed to open configuration file /etc/quagga/zebra.conf: Permission denied
    can't open configuration file [/etc/quagga/zebra.conf]
    ```

    this problem cause by the firmware upgrade from
    the image with quagga 0.99.24
    upgrade to
    the image with quagga 1.2.4

    because the default configuration files of these 2 quagga version have different file owner at `/etc/quagga`

    current solution is move the quagga related daemon configuration
    from `/etc/quagga/...` to 'tmp/icos/...'

 proscend/prosrc/icos/icoslib/bgp/bgp.c         | 14 ++++++++------
 proscend/prosrc/icos/icoslib/ospf_2g/ospf_2g.c | 12 +++++++-----
 proscend/prosrc/icos/icoslib/rip_2g/rip_2g.c   | 12 +++++++-----
 proscend/prosrc/icos/icoslib/zebra/zebra.c     | 14 ++++++++------
 4 files changed, 30 insertions(+), 22 deletions(-)

順便 update release note

1350

M330 HYTEC web ui signal 圖示有問題

generic 正常

1430

感覺跟 M300 上次修正的現現有點像 - change a way to display review at setting wizard

改個寫法再試試看

diff --git a/proscend/prosrc/www/app/app.controller.js b/proscend/prosrc/www/app/app.controller.js
index 7d660a1..462721f 100644
--- a/proscend/prosrc/www/app/app.controller.js
+++ b/proscend/prosrc/www/app/app.controller.js
@@ -103,6 +103,7 @@ function appController($scope, $translate, $templateCache, $interval, $window, i
     vm.help = {};

     vm.get_signal_img = get_signal_img;
+    vm._get_signal_img = "app/images/signal-0.png";



@@ -130,6 +131,7 @@ function appController($scope, $translate, $templateCache, $interval, $window, i
             vm.top = result.data.top;

             vm.help.signal = vm.top.signal;
+            vm._get_signal_img = vm.get_signal_img(vm.help.signal);

             if (vm.top.lte_cur_proto_state == 2) {
                 vm.help.operator = vm.top.modem_operator_name;
diff --git a/proscend/prosrc/www/brand_ctcu/src/brand/top.html.src b/proscend/prosrc/www/brand_ctcu/src/brand/top.html.src
index 668f520..8bd0ddb 100644
--- a/proscend/prosrc/www/brand_ctcu/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_ctcu/src/brand/top.html.src
@@ -7,7 +7,7 @@
     </a>
   </div>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.share.signal)}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.help.operator}}</p>
   <p class="navbar-text">{{ 'IDENTIFICATION_SYSTEM_UPTIME' | translate }}: {{vm.help.sysUpTime_text}}</p>

 #ifndef PROSRC_NO_ETH_WAN
diff --git a/proscend/prosrc/www/brand_hytec/src/brand/top.html.src b/proscend/prosrc/www/brand_hytec/src/brand/top.html.src
index 57752ed..1e5a651 100644
--- a/proscend/prosrc/www/brand_hytec/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_hytec/src/brand/top.html.src
@@ -7,7 +7,7 @@
     </a>
   </div>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.share.signal)}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.help.operator}}</p>
   <p class="navbar-text">{{ 'IDENTIFICATION_SYSTEM_UPTIME' | translate }}: {{vm.help.sysUpTime_text}}</p>

 #ifndef PROSRC_NO_ETH_WAN
diff --git a/proscend/prosrc/www/brand_nobrand/src/brand/top.html.src b/proscend/prosrc/www/brand_nobrand/src/brand/top.html.src
index df983da..ed62d24 100644
--- a/proscend/prosrc/www/brand_nobrand/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_nobrand/src/brand/top.html.src
@@ -7,7 +7,7 @@
     </a>
   </div>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.help.signal)}}" height="20"> {{vm.help.rssi}} {{vm.help.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.help.operator}}</p>
   <p class="navbar-text">{{ 'IDENTIFICATION_SYSTEM_UPTIME' | translate }}: {{vm.help.sysUpTime_text}}</p>

 #ifndef PROSRC_NO_ETH_WAN
diff --git a/proscend/prosrc/www/brand_proscend/src/brand/top.html.src b/proscend/prosrc/www/brand_proscend/src/brand/top.html.src
index df983da..ed62d24 100644
--- a/proscend/prosrc/www/brand_proscend/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_proscend/src/brand/top.html.src
@@ -7,7 +7,7 @@
     </a>
   </div>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.help.signal)}}" height="20"> {{vm.help.rssi}} {{vm.help.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.help.operator}}</p>
   <p class="navbar-text">{{ 'IDENTIFICATION_SYSTEM_UPTIME' | translate }}: {{vm.help.sysUpTime_text}}</p>

 #ifndef PROSRC_NO_ETH_WAN

先在 M330 確認沒問題後再 update 到 M300 上

1445

M330 沒問題 上 code

commit 13145eeaa594631a42634e672958d71b85854f90
Refs: [release/v0.03]
Author: jeffrey <[email protected]>
Date:   Tue Jun 11 14:42:36 2019 +0800

    change a way to display the signal image at top banner:
    - sometimes the 'signal' parameter at 'vm.get_signal_img(signal)' will be 'undefined'

    current solution is that do not use function call at view template

 proscend/prosrc/www/app/app.controller.js                 | 2 ++
 proscend/prosrc/www/brand_ctcu/src/brand/top.html.src     | 2 +-
 proscend/prosrc/www/brand_hytec/src/brand/top.html.src    | 2 +-
 proscend/prosrc/www/brand_nobrand/src/brand/top.html.src  | 2 +-
 proscend/prosrc/www/brand_proscend/src/brand/top.html.src | 2 +-
 5 files changed, 6 insertions(+), 4 deletions(-)

1455

M300 用一樣的方式掃台

diff --git a/proscend/prosrc/www/app/app.controller.js b/proscend/prosrc/www/app/app.controller.js
index 725b5e2..8e56785 100644
--- a/proscend/prosrc/www/app/app.controller.js
+++ b/proscend/prosrc/www/app/app.controller.js
@@ -108,6 +108,7 @@ function appController($scope, $http, $timeout, $translate, $location, $template
     vm.help.gnss_link_to_google_maps = 0;

     vm.get_signal_img = get_signal_img;
+    vm._get_signal_img = "app/images/signal-0.png";^M



@@ -183,6 +184,7 @@ function appController($scope, $http, $timeout, $translate, $location, $template
         // update from share service data
         vm.share.operator = share.data.operator;
         vm.share.signal =   share.data.signal;
+        vm._get_signal_img = vm.get_signal_img(vm.share.signal);^M

         vm.share.whoAmI = share.data.whoAmI;

diff --git a/proscend/prosrc/www/brand_advice/src/brand/top.html.src b/proscend/prosrc/www/brand_advice/src/brand/top.html.src
index 92383f6..4f643b3 100644
--- a/proscend/prosrc/www/brand_advice/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_advice/src/brand/top.html.src
@@ -7,7 +7,7 @@
     </a>
   </div>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.share.signal)}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
   <p class="navbar-text">{{ 'IDENTIFICATION_SYSTEM_UPTIME' | translate }}: {{vm.help.sysUpTime_text}}</p>

 #ifndef PROSRC_NO_ETH_WAN
diff --git a/proscend/prosrc/www/brand_ctcu/src/brand/top.html.src b/proscend/prosrc/www/brand_ctcu/src/brand/top.html.src
index 668f520..7aabf60 100644
--- a/proscend/prosrc/www/brand_ctcu/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_ctcu/src/brand/top.html.src
@@ -7,7 +7,7 @@
     </a>
   </div>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.share.signal)}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
   <p class="navbar-text">{{ 'IDENTIFICATION_SYSTEM_UPTIME' | translate }}: {{vm.help.sysUpTime_text}}</p>

 #ifndef PROSRC_NO_ETH_WAN
diff --git a/proscend/prosrc/www/brand_cxr/src/brand/top.html.src b/proscend/prosrc/www/brand_cxr/src/brand/top.html.src
index 3be3bb1..9442bb4 100644
--- a/proscend/prosrc/www/brand_cxr/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_cxr/src/brand/top.html.src
@@ -7,7 +7,7 @@
     </a>
   </div>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.share.signal)}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
   <p class="navbar-text">{{ 'IDENTIFICATION_SYSTEM_UPTIME' | translate }}: {{vm.help.sysUpTime_text}}</p>

 #ifndef PROSRC_NO_ETH_WAN
diff --git a/proscend/prosrc/www/brand_digicomm/src/brand/top.html.src b/proscend/prosrc/www/brand_digicomm/src/brand/top.html.src
index 6db1cce..25dd153 100644
--- a/proscend/prosrc/www/brand_digicomm/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_digicomm/src/brand/top.html.src
@@ -8,7 +8,7 @@
   </div>
   <p class="navbar-text">M300</p>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.share.signal)}}" height="20"> {{vm.share.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
   <p class="navbar-text">{{vm.help.date | date:'medium':"+0000"}}</p>

 #ifndef PROSRC_NO_ETH_WAN
diff --git a/proscend/prosrc/www/brand_hytec/src/brand/top.html.src b/proscend/prosrc/www/brand_hytec/src/brand/top.html.src
index 57752ed..ace8a75 100644
--- a/proscend/prosrc/www/brand_hytec/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_hytec/src/brand/top.html.src
@@ -7,7 +7,7 @@
     </a>
   </div>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.share.signal)}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
   <p class="navbar-text">{{ 'IDENTIFICATION_SYSTEM_UPTIME' | translate }}: {{vm.help.sysUpTime_text}}</p>

 #ifndef PROSRC_NO_ETH_WAN
diff --git a/proscend/prosrc/www/brand_nobrand/src/brand/top.html.src b/proscend/prosrc/www/brand_nobrand/src/brand/top.html.src
index 4f5f18f..27ee234 100644
--- a/proscend/prosrc/www/brand_nobrand/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_nobrand/src/brand/top.html.src
@@ -7,7 +7,7 @@
     </a>
   </div>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.share.signal)}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
   <p class="navbar-text">{{ 'IDENTIFICATION_SYSTEM_UPTIME' | translate }}: {{vm.help.sysUpTime_text}}</p>

 #ifndef PROSRC_NO_ETH_WAN
diff --git a/proscend/prosrc/www/brand_planet/src/brand/top.html.src b/proscend/prosrc/www/brand_planet/src/brand/top.html.src
index 6efb868..597cacd 100644
--- a/proscend/prosrc/www/brand_planet/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_planet/src/brand/top.html.src
@@ -7,7 +7,7 @@
     </a>
   </div>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.share.signal)}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
   <p class="navbar-text">{{ 'IDENTIFICATION_SYSTEM_UPTIME' | translate }}: {{vm.help.sysUpTime_text}}</p>

 #ifndef PROSRC_NO_ETH_WAN
diff --git a/proscend/prosrc/www/brand_xentino/src/brand/top.html.src b/proscend/prosrc/www/brand_xentino/src/brand/top.html.src
index 2fa44f0..c0aa604 100644
--- a/proscend/prosrc/www/brand_xentino/src/brand/top.html.src
+++ b/proscend/prosrc/www/brand_xentino/src/brand/top.html.src
@@ -7,7 +7,7 @@
     </a>
   </div>
   <p class="navbar-text">
-    <img ng-src="{{vm.get_signal_img(vm.share.signal)}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
+    <img ng-src="{{vm._get_signal_img}}" height="20"> {{vm.help.rssi}} {{vm.share.operator}}</p>
   <p class="navbar-text">{{ 'IDENTIFICATION_SYSTEM_UPTIME' | translate }}: {{vm.help.sysUpTime_text}}</p>

 #ifndef PROSRC_NO_ETH_WAN

先測一下 generic 版本 - M300/0_GENERIC - PASS

再測個 M300/10_GPS_HYTEC

1720

M300/10_GPS_HYTEC - PASS

M300 也可以上 code

commit 804a0d15c0ba63d34493fb9c477a0acc296cdc6a
Refs: [release/v2.00], {origin/release/v2.00}
Author: jeffrey <[email protected]>
Date:   Tue Jun 11 17:20:22 2019 +0800

    change a way to display the signal image at top banner:
    - sometimes the 'signal' parameter at 'vm.get_signal_img(signal)' will be 'undefined'

    current solution is that do not use function call at view template

 proscend/prosrc/www/app/app.controller.js                 | 2 ++
 proscend/prosrc/www/brand_advice/src/brand/top.html.src   | 2 +-
 proscend/prosrc/www/brand_ctcu/src/brand/top.html.src     | 2 +-
 proscend/prosrc/www/brand_cxr/src/brand/top.html.src      | 2 +-
 proscend/prosrc/www/brand_digicomm/src/brand/top.html.src | 2 +-
 proscend/prosrc/www/brand_hytec/src/brand/top.html.src    | 2 +-
 proscend/prosrc/www/brand_nobrand/src/brand/top.html.src  | 2 +-
 proscend/prosrc/www/brand_planet/src/brand/top.html.src   | 2 +-
 proscend/prosrc/www/brand_xentino/src/brand/top.html.src  | 2 +-
 9 files changed, 10 insertions(+), 8 deletions(-)
⚠️ **GitHub.com Fallback** ⚠️