diff --git a/build_debian.sh b/build_debian.sh
index 128da78aa5f..5c8a85c39d4 100755
--- a/build_debian.sh
+++ b/build_debian.sh
@@ -243,7 +243,9 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in
tcptraceroute \
mtr-tiny \
locales \
- dmidecode
+ dmidecode \
+ ftp \
+ tftp-hpa
#Adds a locale to a debian system in non-interactive mode
sudo sed -i '/^#.* en_US.* /s/^#//' $FILESYSTEM_ROOT/etc/locale.gen && \
diff --git a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/AS13-32H/port_config.ini b/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/AS13-32H/port_config.ini
index 5c6ca5db0a7..217409482c1 100644
--- a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/AS13-32H/port_config.ini
+++ b/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/AS13-32H/port_config.ini
@@ -1,33 +1,33 @@
-# name lanes alias index
-Ethernet1 1,2,3,4 QSFP1 1
-Ethernet2 5,6,7,8 QSFP2 2
-Ethernet3 9,10,11,12 QSFP3 3
-Ethernet4 13,14,15,16 QSFP4 4
-Ethernet5 17,18,19,20 QSFP5 5
-Ethernet6 21,22,23,24 QSFP6 6
-Ethernet7 25,26,27,28 QSFP7 7
-Ethernet8 29,30,31,32 QSFP8 8
-Ethernet9 33,34,35,36 QSFP9 9
-Ethernet10 37,38,39,40 QSFP10 10
-Ethernet11 41,42,43,44 QSFP11 11
-Ethernet12 45,46,47,48 QSFP12 12
-Ethernet13 49,50,51,52 QSFP13 13
-Ethernet14 53,54,55,56 QSFP14 14
-Ethernet15 57,58,59,60 QSFP15 15
-Ethernet16 61,62,63,64 QSFP16 16
-Ethernet17 65,66,67,68 QSFP17 17
-Ethernet18 69,70,71,72 QSFP18 18
-Ethernet19 73,74,75,76 QSFP19 19
-Ethernet20 77,78,79,80 QSFP20 20
-Ethernet21 81,82,83,84 QSFP21 21
-Ethernet22 85,86,87,88 QSFP22 22
-Ethernet23 89,90,91,92 QSFP23 23
-Ethernet24 93,94,95,96 QSFP24 24
-Ethernet25 97,98,99,100 QSFP25 25
-Ethernet26 101,102,103,104 QSFP26 26
-Ethernet27 105,106,107,108 QSFP27 27
-Ethernet28 109,110,111,112 QSFP28 28
-Ethernet29 113,114,115,116 QSFP29 29
-Ethernet30 117,118,119,120 QSFP30 30
-Ethernet31 121,122,123,124 QSFP31 31
-Ethernet32 125,126,127,128 QSFP32 32
+# name lanes alias fec index
+Ethernet1 1,2,3,4 QSFP1 rs 1
+Ethernet2 5,6,7,8 QSFP2 rs 2
+Ethernet3 9,10,11,12 QSFP3 rs 3
+Ethernet4 13,14,15,16 QSFP4 rs 4
+Ethernet5 17,18,19,20 QSFP5 rs 5
+Ethernet6 21,22,23,24 QSFP6 rs 6
+Ethernet7 25,26,27,28 QSFP7 rs 7
+Ethernet8 29,30,31,32 QSFP8 rs 8
+Ethernet9 33,34,35,36 QSFP9 rs 9
+Ethernet10 37,38,39,40 QSFP10 rs 10
+Ethernet11 41,42,43,44 QSFP11 rs 11
+Ethernet12 45,46,47,48 QSFP12 rs 12
+Ethernet13 49,50,51,52 QSFP13 rs 13
+Ethernet14 53,54,55,56 QSFP14 rs 14
+Ethernet15 57,58,59,60 QSFP15 rs 15
+Ethernet16 61,62,63,64 QSFP16 rs 16
+Ethernet17 65,66,67,68 QSFP17 rs 17
+Ethernet18 69,70,71,72 QSFP18 rs 18
+Ethernet19 73,74,75,76 QSFP19 rs 19
+Ethernet20 77,78,79,80 QSFP20 rs 20
+Ethernet21 81,82,83,84 QSFP21 rs 21
+Ethernet22 85,86,87,88 QSFP22 rs 22
+Ethernet23 89,90,91,92 QSFP23 rs 23
+Ethernet24 93,94,95,96 QSFP24 rs 24
+Ethernet25 97,98,99,100 QSFP25 rs 25
+Ethernet26 101,102,103,104 QSFP26 rs 26
+Ethernet27 105,106,107,108 QSFP27 rs 27
+Ethernet28 109,110,111,112 QSFP28 rs 28
+Ethernet29 113,114,115,116 QSFP29 rs 29
+Ethernet30 117,118,119,120 QSFP30 rs 30
+Ethernet31 121,122,123,124 QSFP31 rs 31
+Ethernet32 125,126,127,128 QSFP32 rs 32
diff --git a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/custom_led.bin b/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/custom.bin
similarity index 100%
rename from device/alibaba/x86_64-alibaba_as13-32h-cl-r0/custom_led.bin
rename to device/alibaba/x86_64-alibaba_as13-32h-cl-r0/custom.bin
diff --git a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/led_proc_init.soc b/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/led_proc_init.soc
index 28cd4b9bc9f..3f945362e0b 100644
--- a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/led_proc_init.soc
+++ b/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/led_proc_init.soc
@@ -4,6 +4,15 @@
#linkscan 250000; port xe,ce linkscan=on
#Load LED
-#led auto on; led start
-
-
+sleep 10
+vlan clear
+sleep 5
+vlan add 1 pbm=ce,cpu ubm=ce,cpu
+sleep 5
+vlan remove 1 pbm=ce24,ce25,ce26,ce27,ce28,ce29,ce30,ce31
+sleep 5
+led auto on; led start
+sleep 5
+port all en=1
+port xe0,xe1 an=1
+vlan create 250 pbm=xe0,xe1 ubm=xe0,xe1
diff --git a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/linkscan_led_fw.bin b/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/linkscan_fw.bin
similarity index 100%
rename from device/alibaba/x86_64-alibaba_as13-32h-cl-r0/linkscan_led_fw.bin
rename to device/alibaba/x86_64-alibaba_as13-32h-cl-r0/linkscan_fw.bin
diff --git a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/opennsl-postinit.cfg b/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/opennsl-postinit.cfg
deleted file mode 100644
index 7008c14c0ff..00000000000
--- a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/opennsl-postinit.cfg
+++ /dev/null
@@ -1,3 +0,0 @@
-linkscan 250000; port xe,ce linkscan=on
-sleep 1
-led auto on; led start
diff --git a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/plugins/sfputil.py b/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/plugins/sfputil.py
index 9608c5717f0..af42b8e0332 100755
--- a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/plugins/sfputil.py
+++ b/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/plugins/sfputil.py
@@ -70,6 +70,11 @@ def __init__(self):
x + self.EEPROM_OFFSET)
SfpUtilBase.__init__(self)
+ def _do_write_file(self, file_handle, offset, value):
+ file_handle.seek(offset)
+ file_handle.write(hex(value))
+ file_handle.close()
+
def get_presence(self, port_num):
# Check for invalid port_num
@@ -203,3 +208,39 @@ def tx_disable(self, port_num, disable):
return False
return True
+
+ def reset_all(self):
+ result = True
+ port_sysfs_path = []
+ for port in range(self.port_start, self.port_end+1):
+ if port not in self.qsfp_ports:
+ continue
+
+ presence = self.get_presence(port)
+ if not presence:
+ continue
+
+ try:
+ port_name = self.get_port_name(port)
+ sysfs_path = "/".join([self.PORT_INFO_PATH,
+ port_name, "qsfp_reset"])
+ reg_file = open(sysfs_path, "w")
+ port_sysfs_path.append(sysfs_path)
+ except IOError as e:
+ result = False
+ continue
+
+ self._do_write_file(reg_file, 0, 0)
+
+ time.sleep(1)
+
+ for sysfs_path in port_sysfs_path:
+ try:
+ reg_file = open(sysfs_path, "w")
+ except IOError as e:
+ result = False
+ continue
+
+ self._do_write_file(reg_file, 0, 1)
+
+ return result
diff --git a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/td3-as13-32h.config.bcm b/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/td3-as13-32h.config.bcm
index 82b47b51fc1..ff00414a929 100644
--- a/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/td3-as13-32h.config.bcm
+++ b/device/alibaba/x86_64-alibaba_as13-32h-cl-r0/td3-as13-32h.config.bcm
@@ -18,7 +18,7 @@ serdes_lane_config_dfe=on
serdes_if_type_ce=14
pbmp_gport_stack.0=0x0000000000000000000000000000000000000000000000000000000000000000
#pbmp_xport_xe=0x48878787f8787808dfe1e0203e1e1e022
-pbmp_xport_xe=0x88888888888888882222222222222222
+pbmp_xport_xe=0x4888888888888888c2222222222222222
#ptp_ts_pll_fref=50000000
#ptp_bs_fref_0=50000000
diff --git a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/AS13-48F8H/port_config.ini b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/AS13-48F8H/port_config.ini
index 9e4fd2d930c..ba4a8f30beb 100644
--- a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/AS13-48F8H/port_config.ini
+++ b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/AS13-48F8H/port_config.ini
@@ -1,57 +1,57 @@
-# name lanes alias index
-Ethernet1 49 SFP1 1
-Ethernet2 50 SFP2 2
-Ethernet3 51 SFP3 3
-Ethernet4 52 SFP4 4
-Ethernet5 13 SFP5 5
-Ethernet6 14 SFP6 6
-Ethernet7 15 SFP7 7
-Ethernet8 16 SFP8 8
-Ethernet9 21 SFP9 9
-Ethernet10 22 SFP10 10
-Ethernet11 23 SFP11 11
-Ethernet12 24 SFP12 12
-Ethernet13 29 SFP13 13
-Ethernet14 30 SFP14 14
-Ethernet15 31 SFP15 15
-Ethernet16 32 SFP16 16
-Ethernet17 33 SFP17 17
-Ethernet18 34 SFP18 18
-Ethernet19 35 SFP19 19
-Ethernet20 36 SFP20 20
-Ethernet21 41 SFP21 21
-Ethernet22 42 SFP22 22
-Ethernet23 43 SFP23 23
-Ethernet24 44 SFP24 24
-Ethernet25 1 SFP25 25
-Ethernet26 2 SFP26 26
-Ethernet27 3 SFP27 27
-Ethernet28 4 SFP28 28
-Ethernet29 5 SFP29 29
-Ethernet30 6 SFP30 30
-Ethernet31 7 SFP31 31
-Ethernet32 8 SFP32 32
-Ethernet33 85 SFP33 33
-Ethernet34 86 SFP34 34
-Ethernet35 87 SFP35 35
-Ethernet36 88 SFP36 36
-Ethernet37 93 SFP37 37
-Ethernet38 94 SFP38 38
-Ethernet39 95 SFP39 39
-Ethernet40 96 SFP40 40
-Ethernet41 97 SFP41 41
-Ethernet42 98 SFP42 42
-Ethernet43 99 SFP43 43
-Ethernet44 100 SFP44 44
-Ethernet45 105 SFP45 45
-Ethernet46 106 SFP46 46
-Ethernet47 107 SFP47 47
-Ethernet48 108 SFP48 48
-Ethernet49 57,58,59,60 QSFP1 49
-Ethernet50 61,62,63,64 QSFP2 50
-Ethernet51 121,122,123,124 QSFP3 51
-Ethernet52 113,114,115,116 QSFP4 52
-Ethernet53 125,126,127,128 QSFP5 53
-Ethernet54 65,66,67,68 QSFP6 54
-Ethernet55 77,78,79,80 QSFP7 55
-Ethernet56 69,70,71,72 QSFP8 56
+# name lanes alias fec index
+Ethernet1 49 SFP1 rs 1
+Ethernet2 50 SFP2 rs 2
+Ethernet3 51 SFP3 rs 3
+Ethernet4 52 SFP4 rs 4
+Ethernet5 13 SFP5 rs 5
+Ethernet6 14 SFP6 rs 6
+Ethernet7 15 SFP7 rs 7
+Ethernet8 16 SFP8 rs 8
+Ethernet9 21 SFP9 rs 9
+Ethernet10 22 SFP10 rs 10
+Ethernet11 23 SFP11 rs 11
+Ethernet12 24 SFP12 rs 12
+Ethernet13 29 SFP13 rs 13
+Ethernet14 30 SFP14 rs 14
+Ethernet15 31 SFP15 rs 15
+Ethernet16 32 SFP16 rs 16
+Ethernet17 33 SFP17 rs 17
+Ethernet18 34 SFP18 rs 18
+Ethernet19 35 SFP19 rs 19
+Ethernet20 36 SFP20 rs 20
+Ethernet21 41 SFP21 rs 21
+Ethernet22 42 SFP22 rs 22
+Ethernet23 43 SFP23 rs 23
+Ethernet24 44 SFP24 rs 24
+Ethernet25 1 SFP25 rs 25
+Ethernet26 2 SFP26 rs 26
+Ethernet27 3 SFP27 rs 27
+Ethernet28 4 SFP28 rs 28
+Ethernet29 5 SFP29 rs 29
+Ethernet30 6 SFP30 rs 30
+Ethernet31 7 SFP31 rs 31
+Ethernet32 8 SFP32 rs 32
+Ethernet33 85 SFP33 rs 33
+Ethernet34 86 SFP34 rs 34
+Ethernet35 87 SFP35 rs 35
+Ethernet36 88 SFP36 rs 36
+Ethernet37 93 SFP37 rs 37
+Ethernet38 94 SFP38 rs 38
+Ethernet39 95 SFP39 rs 39
+Ethernet40 96 SFP40 rs 40
+Ethernet41 97 SFP41 rs 41
+Ethernet42 98 SFP42 rs 42
+Ethernet43 99 SFP43 rs 43
+Ethernet44 100 SFP44 rs 44
+Ethernet45 105 SFP45 rs 45
+Ethernet46 106 SFP46 rs 46
+Ethernet47 107 SFP47 rs 47
+Ethernet48 108 SFP48 rs 48
+Ethernet49 57,58,59,60 QSFP1 rs 49
+Ethernet50 61,62,63,64 QSFP2 rs 50
+Ethernet51 121,122,123,124 QSFP3 rs 51
+Ethernet52 113,114,115,116 QSFP4 rs 52
+Ethernet53 125,126,127,128 QSFP5 rs 53
+Ethernet54 65,66,67,68 QSFP6 rs 54
+Ethernet55 77,78,79,80 QSFP7 rs 55
+Ethernet56 69,70,71,72 QSFP8 rs 56
diff --git a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/custom_led.bin b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/custom.bin
similarity index 100%
rename from device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/custom_led.bin
rename to device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/custom.bin
diff --git a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/led_proc_init.soc b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/led_proc_init.soc
index 28cd4b9bc9f..1d40062efea 100644
--- a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/led_proc_init.soc
+++ b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/led_proc_init.soc
@@ -4,6 +4,13 @@
#linkscan 250000; port xe,ce linkscan=on
#Load LED
-#led auto on; led start
-
-
+#sleep 10
+#vlan clear
+#sleep 5
+#vlan add 1 pbm=xe,cpu ubm=xe,cpu
+sleep 5
+led auto on; led start
+sleep 5
+port xe48,xe49,ce en=1
+port xe48,xe49 an=1
+vlan create 250 pbm=xe48,xe49 ubm=xe48,xe49
diff --git a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/linkscan_led_fw.bin b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/linkscan_fw.bin
similarity index 100%
rename from device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/linkscan_led_fw.bin
rename to device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/linkscan_fw.bin
diff --git a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/minigraph.xml b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/minigraph.xml
index 527255843b7..e8cda030050 100644
--- a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/minigraph.xml
+++ b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/minigraph.xml
@@ -641,290 +641,20 @@
sonic
-
-
-
-
- SFP1
- 10.0.0.0/31
-
-
-
- SFP2
- 10.0.0.2/31
-
-
-
- SFP3
- 10.0.0.4/31
-
-
-
- SFP4
- 10.0.0.6/31
-
-
-
- SFP5
- 10.0.0.8/31
-
-
-
- SFP6
- 10.0.0.10/31
-
-
-
- SFP7
- 10.0.0.12/31
-
-
-
- SFP8
- 10.0.0.14/31
-
-
-
- SFP9
- 10.0.0.16/31
-
-
-
- SFP10
- 10.0.0.18/31
-
-
-
- SFP11
- 10.0.0.20/31
-
-
-
- SFP12
- 10.0.0.22/31
-
-
-
- SFP13
- 10.0.0.24/31
-
-
-
- SFP14
- 10.0.0.26/31
-
-
-
- SFP15
- 10.0.0.28/31
-
-
-
- SFP16
- 10.0.0.30/31
-
-
-
- SFP17
- 10.0.0.32/31
-
-
-
- SFP18
- 10.0.0.34/31
-
-
-
- SFP19
- 10.0.0.36/31
-
-
-
- SFP20
- 10.0.0.38/31
-
-
-
- SFP21
- 10.0.0.40/31
-
-
-
- SFP22
- 10.0.0.42/31
-
-
-
- SFP23
- 10.0.0.44/31
-
-
-
- SFP24
- 10.0.0.46/31
-
-
-
- SFP25
- 10.0.0.48/31
-
-
-
- SFP26
- 10.0.0.50/31
-
-
-
- SFP27
- 10.0.0.52/31
-
-
-
- SFP28
- 10.0.0.54/31
-
-
-
- SFP29
- 10.0.0.56/31
-
-
-
- SFP30
- 10.0.0.58/31
-
-
-
- SFP31
- 10.0.0.60/31
-
-
-
- SFP32
- 10.0.0.62/31
-
-
-
- SFP33
- 10.0.0.64/31
-
-
-
- SFP34
- 10.0.0.66/31
-
-
-
- SFP35
- 10.0.0.68/31
-
-
-
- SFP36
- 10.0.0.70/31
-
-
-
- SFP37
- 10.0.0.72/31
-
-
-
- SFP38
- 10.0.0.74/31
-
-
-
- SFP39
- 10.0.0.76/31
-
-
-
- SFP40
- 10.0.0.78/31
-
-
-
- SFP41
- 10.0.0.80/31
-
-
-
- SFP42
- 10.0.0.82/31
-
-
-
- SFP43
- 10.0.0.84/31
-
-
-
- SFP44
- 10.0.0.86/31
-
-
-
- SFP45
- 10.0.0.88/31
-
-
-
- SFP46
- 10.0.0.90/31
-
-
-
- SFP47
- 10.0.0.92/31
-
-
-
- SFP48
- 10.0.0.94/31
-
-
-
- QSFP1
- 10.0.0.96/31
-
-
-
- QSFP2
- 10.0.0.98/31
-
-
-
- QSFP3
- 10.0.0.100/31
-
-
-
- QSFP4
- 10.0.0.102/31
-
-
-
- QSFP5
- 10.0.0.104/31
-
-
-
- QSFP6
- 10.0.0.106/31
-
-
-
- QSFP7
- 10.0.0.108/31
-
-
-
- QSFP8
- 10.0.0.110/31
-
-
-
+
+
+ Vlan100
+ SFP1;SFP2;SFP3;SFP4;SFP5;SFP6;SFP7;SFP8;SFP9;SFP10;SFP11;SFP12;SFP13;SFP14;SFP15;SFP16;SFP17;SFP18;SFP19;SFP20;SFP21;SFP22;SFP23;SFP24;SFP25;SFP26;SFP27;SFP28;SFP29;SFP30;SFP31;SFP32;SFP33;SFP34;SFP35;SFP36;SFP37;SFP38;SFP39;SFP40;SFP41;SFP42;SFP43;SFP44;SFP45;SFP46;SFP47;SFP48
+ True
+
+
+
+ 100
+ 100
+
+
+
+
@@ -939,6 +669,747 @@
+
+
+ true
+
+
+ DeviceInterface
+
+ true
+ true
+ 1
+ SFP1
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 2
+ SFP2
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 3
+ SFP3
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 4
+ SFP4
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 5
+ SFP5
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 6
+ SFP6
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 7
+ SFP7
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 8
+ SFP8
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 9
+ SFP9
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 10
+ SFP10
+
+ false
+ 0
+ 0
+ 25000
+
+
+
+ DeviceInterface
+
+ true
+ true
+ 11
+ SFP11
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 12
+ SFP12
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 13
+ SFP13
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 14
+ SFP14
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 15
+ SFP15
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 16
+ SFP16
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 17
+ SFP17
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 18
+ SFP18
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 19
+ SFP19
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 20
+ SFP20
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 21
+ SFP21
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 22
+ SFP22
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 23
+ SFP23
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 24
+ SFP24
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 25
+ SFP25
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 26
+ SFP26
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 27
+ SFP27
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 28
+ SFP28
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 29
+ SFP29
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 30
+ SFP30
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 31
+ SFP31
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 32
+ SFP32
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 33
+ SFP33
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 34
+ SFP34
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 35
+ SFP35
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 36
+ SFP36
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 37
+ SFP37
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 38
+ SFP38
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 39
+ SFP39
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 40
+ SFP40
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 41
+ SFP41
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 42
+ SFP42
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 43
+ SFP43
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 44
+ SFP44
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 45
+ SFP45
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 46
+ SFP46
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 47
+ SFP47
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 48
+ SFP48
+
+ false
+ 0
+ 0
+ 25000
+
+
+ DeviceInterface
+
+ true
+ true
+ 49
+ QSFP1
+
+ false
+ 0
+ 0
+ 100000
+
+
+ DeviceInterface
+
+ true
+ true
+ 50
+ QSFP2
+
+ false
+ 0
+ 0
+ 100000
+
+
+ DeviceInterface
+
+ true
+ true
+ 51
+ QSFP3
+
+ false
+ 0
+ 0
+ 100000
+
+
+ DeviceInterface
+
+ true
+ true
+ 52
+ QSFP4
+
+ false
+ 0
+ 0
+ 100000
+
+
+ DeviceInterface
+
+ true
+ true
+ 53
+ QSFP5
+
+ false
+ 0
+ 0
+ 100000
+
+
+ DeviceInterface
+
+ true
+ true
+ 54
+ QSFP6
+
+ false
+ 0
+ 0
+ 100000
+
+
+ DeviceInterface
+
+ true
+ true
+ 55
+ QSFP7
+
+ false
+ 0
+ 0
+ 100000
+
+
+ DeviceInterface
+
+ true
+ true
+ 56
+ QSFP8
+
+ false
+ 0
+ 0
+ 100000
+
+
+ true
+ 0
+ AS13-48F8H
+
+
+
+
diff --git a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/opennsl-postinit.cfg b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/opennsl-postinit.cfg
deleted file mode 100644
index 7008c14c0ff..00000000000
--- a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/opennsl-postinit.cfg
+++ /dev/null
@@ -1,3 +0,0 @@
-linkscan 250000; port xe,ce linkscan=on
-sleep 1
-led auto on; led start
diff --git a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/plugins/sfputil.py b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/plugins/sfputil.py
index e969911a97a..f7e53b35c94 100755
--- a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/plugins/sfputil.py
+++ b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/plugins/sfputil.py
@@ -70,6 +70,11 @@ def __init__(self):
x + self.EEPROM_OFFSET)
SfpUtilBase.__init__(self)
+ def _do_write_file(self, file_handle, offset, value):
+ file_handle.seek(offset)
+ file_handle.write(hex(value))
+ file_handle.close()
+
def get_presence(self, port_num):
# Check for invalid port_num
@@ -203,3 +208,39 @@ def tx_disable(self, port_num, disable):
return False
return True
+
+ def reset_all(self):
+ result = True
+ port_sysfs_path = []
+ for port in range(self.port_start, self.port_end+1):
+ if port not in self.qsfp_ports:
+ continue
+
+ presence = self.get_presence(port)
+ if not presence:
+ continue
+
+ try:
+ port_name = self.get_port_name(port)
+ sysfs_path = "/".join([self.PORT_INFO_PATH,
+ port_name, "qsfp_reset"])
+ reg_file = open(sysfs_path, "w")
+ port_sysfs_path.append(sysfs_path)
+ except IOError as e:
+ result = False
+ continue
+
+ self._do_write_file(reg_file, 0, 0)
+
+ time.sleep(1)
+
+ for sysfs_path in port_sysfs_path:
+ try:
+ reg_file = open(sysfs_path, "w")
+ except IOError as e:
+ result = False
+ continue
+
+ self._do_write_file(reg_file, 0, 1)
+
+ return result
diff --git a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/td3-as13-48f8h.config.bcm b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/td3-as13-48f8h.config.bcm
index a49674bb82e..7d8db0ca3f5 100644
--- a/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/td3-as13-48f8h.config.bcm
+++ b/device/alibaba/x86_64-alibaba_as13-48f8h-cl-r0/td3-as13-48f8h.config.bcm
@@ -19,7 +19,7 @@ serdes_if_type_xe=13
serdes_if_type_ce=14
pbmp_gport_stack.0=0x0000000000000000000000000000000000000000000000000000000000000000
#pbmp_xport_xe=0x48878787f8787808dfe1e0203e1e1e022
-pbmp_xport_xe=0x8808787f87808088221e1e1fe1e1e1fe
+pbmp_xport_xe=0x48808787f8780808c221e1e1fe1e1e1fe
portmap_1.0=1:25
@@ -78,6 +78,8 @@ portmap_110.0=108:25
portmap_115.0=113:100
portmap_123.0=121:100
portmap_127.0=125:100
+portmap_66.0=129:10:m
+portmap_130.0=128:10:m
phy_chain_tx_lane_map_physical{1.0}=0x0123
phy_chain_rx_lane_map_physical{1.0}=0x1032
diff --git a/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/custom_led.bin b/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/custom.bin
similarity index 100%
rename from device/alibaba/x86_64-alibaba_as23-128h-cl-r0/custom_led.bin
rename to device/alibaba/x86_64-alibaba_as23-128h-cl-r0/custom.bin
diff --git a/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/led_proc_init.soc b/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/led_proc_init.soc
index 28cd4b9bc9f..cfb257b0a0e 100644
--- a/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/led_proc_init.soc
+++ b/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/led_proc_init.soc
@@ -4,6 +4,10 @@
#linkscan 250000; port xe,ce linkscan=on
#Load LED
-#led auto on; led start
-
-
+sleep 20
+vlan clear
+sleep 5
+led auto on; led start
+port xe0,xe1 en=1
+port xe0,xe1 an=1
+vlan create 250 pbm=xe0,xe1 ubm=xe0,xe1
diff --git a/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/linkscan_led_fw.bin b/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/linkscan_fw.bin
similarity index 100%
rename from device/alibaba/x86_64-alibaba_as23-128h-cl-r0/linkscan_led_fw.bin
rename to device/alibaba/x86_64-alibaba_as23-128h-cl-r0/linkscan_fw.bin
diff --git a/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/opennsl-postinit.cfg b/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/opennsl-postinit.cfg
deleted file mode 100644
index 7008c14c0ff..00000000000
--- a/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/opennsl-postinit.cfg
+++ /dev/null
@@ -1,3 +0,0 @@
-linkscan 250000; port xe,ce linkscan=on
-sleep 1
-led auto on; led start
diff --git a/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/plugins/sfputil.py b/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/plugins/sfputil.py
index 2831a75af54..b721bbaee7e 100755
--- a/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/plugins/sfputil.py
+++ b/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/plugins/sfputil.py
@@ -70,6 +70,11 @@ def __init__(self):
x + self.EEPROM_OFFSET)
SfpUtilBase.__init__(self)
+ def _do_write_file(self, file_handle, offset, value):
+ file_handle.seek(offset)
+ file_handle.write(hex(value))
+ file_handle.close()
+
def get_presence(self, port_num):
# Check for invalid port_num
@@ -203,3 +208,40 @@ def tx_disable(self, port_num, disable):
return False
return True
+
+ def reset_all(self):
+ result = True
+ port_sysfs_path = []
+ for port in range(self.port_start, self.port_end+1):
+ if port not in self.qsfp_ports:
+ continue
+
+ presence = self.get_presence(port)
+ if not presence:
+ continue
+
+ try:
+ port_name = self.get_port_name(port)
+ sysfs_path = "/".join([self.PORT_INFO_PATH,
+ port_name, "qsfp_reset"])
+ print(sysfs_path)
+ reg_file = open(sysfs_path, "w")
+ port_sysfs_path.append(sysfs_path)
+ except IOError as e:
+ result = False
+ continue
+
+ self._do_write_file(reg_file, 0, 0)
+
+ time.sleep(1)
+
+ for sysfs_path in port_sysfs_path:
+ try:
+ reg_file = open(sysfs_path, "w")
+ except IOError as e:
+ result = False
+ continue
+
+ self._do_write_file(reg_file, 0, 1)
+
+ return result
diff --git a/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/th3-as23-128h.config.bcm b/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/th3-as23-128h.config.bcm
index 354e0f2fad0..a47d27958fd 100644
--- a/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/th3-as23-128h.config.bcm
+++ b/device/alibaba/x86_64-alibaba_as23-128h-cl-r0/th3-as23-128h.config.bcm
@@ -1,4 +1,4 @@
-pbmp_xport_xe.0=0x0ffff0ffff0ffff0ffff0ffff0ffff0ffff1fffe
+pbmp_xport_xe.0=0x0ffff0ffff4ffff0ffff0ffff0ffff4ffff1fffe
ccm_dma_enable=0
ccmdma_intr_enable=0
ctr_evict_enable=0
@@ -14,6 +14,11 @@ serdes_tx_taps_ce=pam4:0:140:0:0:0:0
init_all_modules=0
mdio_output_delay=64
+portmap_38=257:10
+portmap_118=258:10
+dport_map_port_38=129
+dport_map_port_118=130
+
#BC1
portmap_5=9:100:2
portmap_6=11:100:2
diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2
index 0eeba7bad96..23ec81d65ac 100644
--- a/files/build_templates/sonic_debian_extension.j2
+++ b/files/build_templates/sonic_debian_extension.j2
@@ -144,6 +144,28 @@ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable ntp-config.service
sudo cp $IMAGE_CONFIGS/ntp/ntp-config.sh $FILESYSTEM_ROOT/usr/bin/
sudo cp $IMAGE_CONFIGS/ntp/ntp.conf.j2 $FILESYSTEM_ROOT_USR_SHARE_SONIC_TEMPLATES/
+# Copy POAP configuration files and templates
+sudo cp $IMAGE_CONFIGS/poap/poap_autoinstall_diag $FILESYSTEM_ROOT/usr/bin/
+sudo chmod a+x $FILESYSTEM_ROOT/usr/bin/poap_autoinstall_diag
+sudo cp $IMAGE_CONFIGS/poap/poap.ok $FILESYSTEM_ROOT/etc/sonic
+sudo cp $IMAGE_CONFIGS/poap/poap.service $FILESYSTEM_ROOT/etc/systemd/system/
+sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable poap.service
+
+# Copy diag_app configuration files and templates
+sudo cp $IMAGE_CONFIGS/diag_app/Ali_Diag_V2.0.4.deb $FILESYSTEM_ROOT/home/
+
+# Copy port_led configuration files and templates
+sudo cp $IMAGE_CONFIGS/port_led/port-led $FILESYSTEM_ROOT/usr/bin/
+sudo chmod a+x $FILESYSTEM_ROOT/usr/bin/port-led
+sudo cp $IMAGE_CONFIGS/port_led/port-alarm-led.py $FILESYSTEM_ROOT/usr/local/bin/
+sudo chmod a+x $FILESYSTEM_ROOT/usr/local/bin/port-alarm-led.py
+sudo cp $IMAGE_CONFIGS/port_led/sonic_sfp.tar.gz $FILESYSTEM_ROOT/home/
+sudo cp $IMAGE_CONFIGS/port_led/port-alarm-led.service $FILESYSTEM_ROOT/etc/systemd/system/
+sudo tar zxvf $FILESYSTEM_ROOT/home/sonic_sfp.tar.gz -C $FILESYSTEM_ROOT/usr/local/lib/python2.7/dist-packages/
+sudo LANG=C chroot $FILESYSTEM_ROOT systemctl daemon-reload
+sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable port-alarm-led.service
+sudo LANG=C chroot $FILESYSTEM_ROOT systemctl start port-alarm-led.service
+
# Copy warmboot-finalizer files
sudo LANG=C cp $IMAGE_CONFIGS/warmboot-finalizer/finalize-warmboot.sh $FILESYSTEM_ROOT/usr/local/bin/finalize-warmboot.sh
sudo LANG=C cp $IMAGE_CONFIGS/warmboot-finalizer/warmboot-finalizer.service $FILESYSTEM_ROOT/etc/systemd/system/
diff --git a/files/image_config/diag_app/Ali_Diag_V2.0.4.deb b/files/image_config/diag_app/Ali_Diag_V2.0.4.deb
new file mode 100644
index 00000000000..2b88b03c416
Binary files /dev/null and b/files/image_config/diag_app/Ali_Diag_V2.0.4.deb differ
diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2
index e2ee58e9c32..525cd66f4fe 100644
--- a/files/image_config/interfaces/interfaces.j2
+++ b/files/image_config/interfaces/interfaces.j2
@@ -44,7 +44,7 @@ iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static
{# TODO: COPP policy type rules #}
{% endfor %}
{% else %}
-iface eth0 inet dhcp
+iface eth0 inet manual
{% endif %}
#
{% endblock mgmt_interface %}
diff --git a/files/image_config/logrotate/logrotate.d/rsyslog b/files/image_config/logrotate/logrotate.d/rsyslog
index 6788762d768..3334b542c2b 100644
--- a/files/image_config/logrotate/logrotate.d/rsyslog
+++ b/files/image_config/logrotate/logrotate.d/rsyslog
@@ -34,8 +34,6 @@
/var/log/telemetry.log
/var/log/quagga/bgpd.log
/var/log/quagga/zebra.log
-/var/log/swss/sairedis.rec
-/var/log/swss/swss.rec
{
size 1M
rotate 5000
@@ -95,3 +93,66 @@
fi
endscript
}
+
+
+/var/log/swss/sairedis.rec
+/var/log/swss/swss.rec
+{
+ size 20M
+ rotate 20
+ missingok
+ notifempty
+ compress
+ delaycompress
+ nosharedscripts
+ prerotate
+ # Adjust NUM_LOGS_TO_ROTATE to reflect number of log files that trigger this block specified above
+ NUM_LOGS_TO_ROTATE=8
+
+ # Adjust LOG_FILE_ROTATE_SIZE_KB to reflect the "size" parameter specified above, in kB
+ LOG_FILE_ROTATE_SIZE_KB=1024
+
+ # Reserve space for btmp, wtmp, dpkg.log, monit.log, etc., as well as logs that
+ # should be disabled, just in case they get created and rotated
+ RESERVED_SPACE_KB=4096
+
+ VAR_LOG_SIZE_KB=$(df -k /var/log | sed -n 2p | awk '{ print $2 }')
+
+ # Limit usable space to 90% of the partition minus the reserved space for other logs
+ USABLE_SPACE_KB=$(( (VAR_LOG_SIZE_KB * 90 / 100) - RESERVED_SPACE_KB))
+
+ # Set our threshold so as to maintain enough space to write all logs from empty to full
+ # Most likely, some logs will have non-zero size when this is called, so this errs on the side
+ # of caution, giving us a bit of a cushion if a log grows quickly and passes its rotation size
+ THRESHOLD_KB=$((USABLE_SPACE_KB - (NUM_LOGS_TO_ROTATE * LOG_FILE_ROTATE_SIZE_KB * 2)))
+
+ while true; do
+ USED_KB=$(du -s /var/log | awk '{ print $1; }')
+
+ if [ $USED_KB -lt $THRESHOLD_KB ]; then
+ break
+ else
+ OLDEST_ARCHIVE_FILE=$(find /var/log -type f -printf '%T+ %p\n' | grep -E '.+\.[0-9]+(\.gz)?$' | sort | head -n 1 | awk '{ print $2; }')
+
+ if [ -z "$OLDEST_ARCHIVE_FILE" ]; then
+ logger -p syslog.err -t "logrotate" "No archive file to delete -- potential for filling up /var/log partition!"
+ break
+ fi
+
+ logger -p syslog.info -t "logrotate" "Deleting archive file $OLDEST_ARCHIVE_FILE to free up space"
+ rm -rf "$OLDEST_ARCHIVE_FILE"
+ fi
+ done
+ endscript
+ postrotate
+ if [ $(echo $1 | grep -c "/var/log/swss/") -gt 0 ]; then
+ pgrep -x orchagent | xargs /bin/kill -HUP 2>/dev/null || true
+ else
+ # Calling kill directly instead of 'service rsyslog rotate >/dev/null' due
+ # to bug in init-system-helpers. Bug has apparently been fixed in v1.47.
+ # However, Debian Jessie is still using v1.22.
+ # See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=672218
+ kill -HUP $(cat /var/run/rsyslogd.pid)
+ fi
+ endscript
+}
diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local
index 3596eb18419..c96fcc07cb2 100755
--- a/files/image_config/platform/rc.local
+++ b/files/image_config/platform/rc.local
@@ -88,8 +88,33 @@ update_mgmt_interface_macaddr() {
sed -i "/eth0/ s/ATTR{address}==\"$old_mac\"/ATTR{address}==\"$new_mac\"/g" /etc/udev/rules.d/70-persistent-net.rules
}
+diag_install() {
+ echo "Diag install start ..."
+ sleep 200
+ dpkg -i /home/Ali_Diag_V2.0.4.deb
+}
+
+boot_action() {
+ #cleanos
+ CLEAN_OS_FILE="/etc/sonic/cleanos"
+ if [ -f $CLEAN_OS_FILE ]; then
+ echo "clean up os"
+ sonic_installer cleanup -y
+ rm -f $CLEAN_OS_FILE
+ fi
+
+ decode-syseeprom --init
+
+ #diag install
+ if [ ! -d /usr/local/CPU_Diag ];then
+ echo "Diag install"
+ diag_install > /var/log/diagInstallLog &
+ fi
+}
+
firsttime_exit() {
rm -rf $FIRST_BOOT_FILE
+ boot_action
exit 0
}
@@ -354,4 +379,5 @@ if [ -f $FIRST_BOOT_FILE ]; then
firsttime_exit
fi
+boot_action
exit 0
diff --git a/files/image_config/poap/poap.ok b/files/image_config/poap/poap.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/files/image_config/poap/poap.service b/files/image_config/poap/poap.service
new file mode 100644
index 00000000000..639eca04aa4
--- /dev/null
+++ b/files/image_config/poap/poap.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=poap service
+Requires=database.service
+After=database.service
+
+[Service]
+User=root
+ExecStart=/usr/bin/poap_autoinstall_diag
+Restart=on-failure
+RestartSec=2s
+
+[Install]
+WantedBy=multi-user.target
diff --git a/files/image_config/poap/poap_autoinstall_diag b/files/image_config/poap/poap_autoinstall_diag
new file mode 100644
index 00000000000..63185689cf6
Binary files /dev/null and b/files/image_config/poap/poap_autoinstall_diag differ
diff --git a/files/image_config/port_led/port-alarm-led.py b/files/image_config/port_led/port-alarm-led.py
new file mode 100644
index 00000000000..6fbcef975ed
--- /dev/null
+++ b/files/image_config/port_led/port-alarm-led.py
@@ -0,0 +1,589 @@
+#!/usr/bin/python
+import threading
+import commands
+import click
+import time
+import argparse
+import logging
+import logging . handlers
+from tabulate import tabulate
+o0OO00 = "PORT_ALARM_LED"
+oo = o0OO00
+i1iII1IiiIiI1 = "/var/log/%s.log" % o0OO00 . lower ( )
+iIiiiI1IiI1I1 = 30
+o0OoOoOO00 = 3
+o0OOO = None
+iIiiiI = {
+ "100G_SR4_QSFP28" : - 5.3 ,
+ "100G_PSM4_QSFP28" : - 7.6 ,
+ "100G_CWDM4_QSFP28" : - 6.5 ,
+ "100G_LR4_QSFP28" : - 9 ,
+ "100G_ER4_QSFP28" : - 17 ,
+ "25G_AOC_SFP28" : - 5.3 ,
+ "25G_SR_SFP28" : - 5.3
+ }
+o0oO0 = 3
+oo00 = 4
+o00 = 6
+Oo0oO0ooo = 7
+def i1iIIII ( docker , wait_seconds ) :
+ I1 = 360 / 3
+ O0OoOoo00o = 'docker ps | grep %s' % docker
+ try :
+ while I1 > 0 :
+ OoOooOOOO = commands . getoutput ( O0OoOoo00o )
+ i11iiII = OoOooOOOO . splitlines ( )
+ for I1iiiiI1iII in i11iiII :
+ IiIi11i = I1iiiiI1iII . strip ( ) . split ( )
+ if len ( IiIi11i ) == 10 or len ( IiIi11i ) == 11 :
+ if IiIi11i [ 8 ] == 'seconds' or IiIi11i [ 8 ] == 'second' :
+ if int ( IiIi11i [ 7 ] ) > wait_seconds :
+ return True
+ elif IiIi11i [ 8 ] == 'minutes' :
+ if int ( IiIi11i [ 7 ] * 60 ) > wait_seconds :
+ return True
+ elif IiIi11i [ 8 ] . startswith ( 'hour' ) or IiIi11i [ 9 ] . startswith ( 'hour' ) :
+ return True
+ elif IiIi11i [ 8 ] . startswith ( 'day' ) or IiIi11i [ 8 ] . startswith ( 'week' ) or IiIi11i [ 8 ] . startswith ( 'month' ) :
+ return True
+ else :
+ return False
+ I1 -= 3
+ time . sleep ( 3 )
+ except Exception :
+ iii11iII ( "wait for docker %s startup failed" % docker )
+ return False
+ return False
+class oOo ( object ) :
+ def __init__ ( self , module_name , log_file_name ) :
+ self . log = logging . getLogger ( module_name )
+ self . log . setLevel ( logging . DEBUG )
+ ooOoOoo0O = 4 * 1024 * 1024
+ OooO0 = 1
+ ooO0o0Oo = logging . handlers . RotatingFileHandler ( log_file_name ,
+ maxBytes = ooOoOoo0O ,
+ backupCount = OooO0 )
+ ooO0o0Oo . setLevel ( logging . DEBUG )
+ o0o0oOOOo0oo = logging . Formatter (
+ "%(asctime)s - %(name)s - %(levelname)s - %(message)s" )
+ ooO0o0Oo . setFormatter ( o0o0oOOOo0oo )
+ self . log . addHandler ( ooO0o0Oo )
+ self . log_fn_map = { Oo0oO0ooo : self . log . debug ,
+ o00 : self . log . info ,
+ oo00 : self . log . warning ,
+ o0oO0 : self . log . error }
+ def sys_log ( self , log_level , info ) :
+ if log_level in self . log_fn_map :
+ self . log_fn_map [ log_level ] ( info )
+def oO ( info ) :
+ o0OOO . sys_log ( Oo0oO0ooo , info )
+def O0ooOooooO ( info ) :
+ o0OOO . sys_log ( o00 , info )
+def oo0 ( info ) :
+ o0OOO . sys_log ( oo00 , info )
+def iii11iII ( info ) :
+ o0OOO . sys_log ( o0oO0 , info )
+class o0OOoo0OO0OOO ( object ) :
+ def __init__ ( self , mgr ) :
+ self . sfp_presence = { }
+ self . mgr = mgr
+ def sfp_update ( self ) :
+ O0OoOoo00o = "sudo sfputil show presence"
+ oo0OooOOo0 , OoOooOOOO = commands . getstatusoutput ( O0OoOoo00o )
+ if oo0OooOOo0 != 0 :
+ iii11iII ( "cmd: %s failed" % O0OoOoo00o )
+ return
+ i11iiII = OoOooOOOO . splitlines ( )
+ for I1iiiiI1iII in i11iiII :
+ if I1iiiiI1iII . startswith ( "Ethernet" ) :
+ IiII1I11i1I1I = I1iiiiI1iII . split ( )
+ if I1iiiiI1iII . find ( "Not present" ) != - 1 :
+ oO0Oo = "no"
+ elif I1iiiiI1iII . find ( "Present" ) != - 1 :
+ oO0Oo = "yes"
+ else :
+ continue
+ O0o0 = IiII1I11i1I1I [ 0 ]
+ if O0o0 in self . sfp_presence :
+ if oO0Oo != self . sfp_presence [ O0o0 ] :
+ self . syncup ( O0o0 , oO0Oo )
+ else :
+ self . syncup ( O0o0 , oO0Oo )
+ def sfp_poll ( self ) :
+ oO0OOoO0 = { }
+ O0OoOoo00o = "sudo sfputil show presence"
+ oo0OooOOo0 , OoOooOOOO = commands . getstatusoutput ( O0OoOoo00o )
+ if oo0OooOOo0 != 0 :
+ return None
+ i11iiII = OoOooOOOO . splitlines ( )
+ for I1iiiiI1iII in i11iiII :
+ if I1iiiiI1iII . startswith ( "Ethernet" ) :
+ IiII1I11i1I1I = I1iiiiI1iII . split ( )
+ if I1iiiiI1iII . find ( "Not present" ) != - 1 :
+ oO0Oo = "no"
+ elif I1iiiiI1iII . find ( "Present" ) != - 1 :
+ oO0Oo = "yes"
+ else :
+ continue
+ O0o0 = IiII1I11i1I1I [ 0 ]
+ oO0OOoO0 [ O0o0 ] = oO0Oo
+ iI1ii1Ii = len ( oO0OOoO0 )
+ oooo000 = [ 32 , 56 , 128 ]
+ if iI1ii1Ii not in oooo000 :
+ return None
+ return oO0OOoO0
+ def syncup ( self , port , presence ) :
+ iii11iII ( "sync up: port %s presence %s" % ( port , presence ) )
+ self . sfp_presence [ port ] = presence
+ self . mgr . handle_sfp_presence ( port , presence )
+ def run ( self ) :
+ while True :
+ self . sfp_update ( )
+ time . sleep ( o0OoOoOO00 )
+class i1I11i1I ( object ) :
+ def __init__ ( self , on_count , on_check_interval , off_period ) :
+ self . on_count = on_count
+ self . on_check_interval = on_check_interval
+ self . off_period = off_period
+ self . dom_sync_task_running = False
+ self . dom_sync_task = None
+ self . sfp_detector = None
+ self . alarm_status = { }
+ self . admin_status = { }
+ self . sfp_present = { }
+ self . port_rx_power_low = { }
+ self . power_normal_count = { }
+ self . reasons = { }
+ self . dom_table = { }
+ self . port_indice = { }
+ def initialize ( self ) :
+ self . sfp_detector = o0OOoo0OO0OOO ( self )
+ if self . sfp_detector is None :
+ iii11iII ( "Failed to create SFP detector." )
+ return False
+ return self . init_all_ports_status ( )
+ def init_all_ports_status ( self ) :
+ if not self . update_ports_admin_status ( ) :
+ iii11iII ( "Failed to update ports admin status." )
+ return False
+ i11i1I1 = self . admin_status . keys ( )
+ ii1I = "default"
+ for O0o0 in i11i1I1 :
+ Oo0ooOo0o = self . set_port_alarm_led ( O0o0 , "off" , ii1I )
+ if not Oo0ooOo0o :
+ self . alarm_status [ O0o0 ] = "on"
+ self . power_normal_count [ O0o0 ] = self . off_period
+ try :
+ o0OO0oOO0O0 = self . sfp_detector . sfp_poll ( )
+ if not o0OO0oOO0O0 :
+ iii11iII ( "Failed to get sfp initial status" )
+ return False
+ for O0o0 in i11i1I1 :
+ self . handle_sfp_presence ( O0o0 , o0OO0oOO0O0 [ O0o0 ] )
+ except Exception as iIi1IIIi1 :
+ iii11iII ( "Failed: sfp detector poll failed, %s" % str ( iIi1IIIi1 ) )
+ return False
+ oO ( "init all ports status done." )
+ return True
+ def update_ports_admin_status ( self ) :
+ O0OoOoo00o = "show interfaces status"
+ oo0OooOOo0 , OoOooOOOO = commands . getstatusoutput ( O0OoOoo00o )
+ if oo0OooOOo0 != 0 :
+ iii11iII ( "Failed to exec: %s" % O0OoOoo00o )
+ return False
+ i11iiII = OoOooOOOO . splitlines ( )
+ if len ( i11iiII ) < 32 + 2 :
+ iii11iII ( "Failed: %s outputs length too short." % O0OoOoo00o )
+ return False
+ OOOOoOoo0O0O0 = - 1
+ if not i11iiII [ 0 ] . strip ( ) . startswith ( "Interface" ) :
+ if not i11iiII [ 1 ] . strip ( ) . startswith ( "Interface" ) :
+ iii11iII ( "Failed: (%s) outputs format invalid" % O0OoOoo00o )
+ return False
+ OOOOoOoo0O0O0 = 1
+ else :
+ OOOOoOoo0O0O0 = 0
+ IiII1I11i1I1I = i11iiII [ OOOOoOoo0O0O0 ] . split ( )
+ IIiIi1iI = - 1
+ for i1IiiiI1iI in range ( len ( IiII1I11i1I1I ) ) :
+ if IiII1I11i1I1I [ i1IiiiI1iI ] == "Admin" :
+ IIiIi1iI = i1IiiiI1iI
+ break
+ if IIiIi1iI == - 1 :
+ iii11iII ( "Failed: %s invalid, Admin not found" % O0OoOoo00o )
+ return False
+ iii = 0
+ for I1iiiiI1iII in i11iiII :
+ if I1iiiiI1iII . strip ( ) . startswith ( "Ethernet" ) :
+ IiII1I11i1I1I = I1iiiiI1iII . split ( )
+ if len ( IiII1I11i1I1I ) < IIiIi1iI :
+ iii11iII ( "Failed: line(%s) format invalid" % I1iiiiI1iII )
+ return False
+ self . admin_status [ IiII1I11i1I1I [ 0 ] ] = IiII1I11i1I1I [ IIiIi1iI ]
+ self . port_indice [ IiII1I11i1I1I [ 0 ] ] = iii
+ iii += 1
+ oooo000 = [ 32 , 56 , 128 ]
+ if iii not in oooo000 :
+ iii11iII ( "Failed: total updated ports %d not expected" % iii )
+ return False
+ return True
+ def set_port_alarm_led ( self , port , admin_status , reason ) :
+ iii11iII ( "Set port %s alarm_led %s, reason %s" % ( port , admin_status , reason ) )
+ II111iiiI1Ii = "Ethernet"
+ o0O0OOO0Ooo = port . find ( II111iiiI1Ii )
+ if o0O0OOO0Ooo == - 1 :
+ iii11iII ( "Failed to set port %s alarm to %s" % ( port , admin_status ) )
+ return False
+ try :
+ i1 = int ( port [ o0O0OOO0Ooo + len ( II111iiiI1Ii ) : ] )
+ except Exception as iIi1IIIi1 :
+ iii11iII ( "Failed to get port from name %s: %s" % ( port , str ( iIi1IIIi1 ) ) )
+ return False
+ O0OoOoo00o = "sudo port-led %s %d" % ( admin_status , i1 )
+ oo0OooOOo0 , I1IiiI = commands . getstatusoutput ( O0OoOoo00o )
+ if oo0OooOOo0 != 0 :
+ iii11iII ( "Failed to set port %s alarm to %s, %s"
+ % ( port , admin_status , I1IiiI ) )
+ return False
+ self . alarm_status [ port ] = admin_status
+ self . reasons [ port ] = reason
+ return True
+ def show_port_alarm_led_status ( self ) :
+ oO00OOoO00 = [ "Port" , "Status" , "Reason" ]
+ IiI111111IIII = [ ]
+ i11i1I1 = self . alarm_status . keys ( )
+ for O0o0 in i11i1I1 :
+ IiI111111IIII . append ( [ O0o0 , self . alarm_status [ O0o0 ] ,
+ self . reasons [ O0o0 ] ] )
+ if len ( IiI111111IIII ) :
+ click . echo ( tabulate ( IiI111111IIII , oO00OOoO00 , tablefmt = 'simple' ) )
+ def dump_port_alarm_led ( self ) :
+ O0OoOoo00o = "sudo port-led show"
+ OoOooOOOO = commands . getoutput ( O0OoOoo00o )
+ O0ooOooooO ( OoOooOOOO )
+ def handle_alarm_led ( self , port_name ) :
+ IIi1 = self . port_rx_power_low . get ( port_name )
+ if IIi1 :
+ if self . alarm_status [ port_name ] == "off" :
+ if self . sfp_present [ port_name ] :
+ oO ( "rx low, alarm off, set port %s alarm led on"
+ % port_name )
+ ii1I = "rx power low, sfp present"
+ self . set_port_alarm_led ( port_name , "on" , ii1I )
+ else :
+ if self . alarm_status [ port_name ] == "on" :
+ if self . power_normal_count [ port_name ] >= self . off_period :
+ ii1I = "rx power normal"
+ self . set_port_alarm_led ( port_name , "off" , ii1I )
+ def handle_sfp_presence ( self , port , presence ) :
+ self . sfp_present [ port ] = presence
+ if presence == "yes" :
+ self . handle_alarm_led ( port )
+ else :
+ if self . alarm_status [ port ] == "on" :
+ oO ( "port %s plugged out, alarm on, set it off" % port )
+ ii1I = "sfp not present"
+ self . set_port_alarm_led ( port , "off" , ii1I )
+ if port in self . port_rx_power_low :
+ self . port_rx_power_low [ port ] = False
+ self . power_normal_count [ port ] = self . off_period
+ def handle_rx_power_low ( self , port ) :
+ self . handle_alarm_led ( port )
+ def start_dom_sync_task ( self ) :
+ self . dom_sync_task_running = True
+ self . dom_sync_task = threading . Thread ( target = self . dom_sync_proc )
+ if self . dom_sync_task is None :
+ iii11iII ( "Failed to create dom sync task." )
+ self . dom_sync_task_running = False
+ return False
+ self . dom_sync_task . setDaemon ( True )
+ self . dom_sync_task . start ( )
+ oO ( "dom sync task started" )
+ return True
+ def update_dom_table ( self ) :
+ O0OoOoo00o = "sfputil show eeprom -d"
+ oo0OooOOo0 , OoOooOOOO = commands . getstatusoutput ( O0OoOoo00o )
+ if oo0OooOOo0 != 0 :
+ iii11iII ( "Failed to exec %s" % O0OoOoo00o )
+ return
+ i11iiII = OoOooOOOO . splitlines ( )
+ oOoooo0O0Oo = False
+ o00ooO = { }
+ OO0OO0O00oO0 = [ ]
+ oOI1Ii1I1 = ""
+ for I1iiiiI1iII in i11iiII :
+ if I1iiiiI1iII . startswith ( "Ethernet" ) :
+ oOI1Ii1I1 = I1iiiiI1iII . split ( ) [ 0 ] [ : - 1 ]
+ if I1iiiiI1iII . find ( "not detected" ) != - 1 :
+ if oOI1Ii1I1 in self . dom_table :
+ self . dom_table . pop ( oOI1Ii1I1 )
+ continue
+ oOoooo0O0Oo = True
+ oOI1Ii1I1 = I1iiiiI1iII . split ( ) [ 0 ] [ : - 1 ]
+ continue
+ elif oOoooo0O0Oo :
+ if I1iiiiI1iII == "" :
+ oOoooo0O0Oo = False
+ o00ooO [ oOI1Ii1I1 ] = OO0OO0O00oO0
+ OO0OO0O00oO0 = [ ]
+ continue
+ OO0OO0O00oO0 . append ( I1iiiiI1iII )
+ for O0o0 in o00ooO . keys ( ) :
+ IiI1i = o00ooO [ O0o0 ]
+ o0O = None
+ o00iI = None
+ O0O0Oooo0o = None
+ oOOoo00O00o = None
+ O0O00Oo = None
+ oooooo0O000o = None
+ OoO = { }
+ for ooO0O0O0ooOOO in IiI1i :
+ if ooO0O0O0ooOOO . find ( "TypeOfTransceiver" ) != - 1 :
+ o0O = ooO0O0O0ooOOO . split ( ) [ 1 ]
+ elif ooO0O0O0ooOOO . find ( "RXPower:" ) != - 1 :
+ o00iI = ooO0O0O0ooOOO . split ( ) [ 1 ]
+ elif ooO0O0O0ooOOO . find ( "RX1Power:" ) != - 1 :
+ O0O0Oooo0o = ooO0O0O0ooOOO . split ( ) [ 1 ]
+ elif ooO0O0O0ooOOO . find ( "RX2Power:" ) != - 1 :
+ oOOoo00O00o = ooO0O0O0ooOOO . split ( ) [ 1 ]
+ elif ooO0O0O0ooOOO . find ( "RX3Power:" ) != - 1 :
+ O0O00Oo = ooO0O0O0ooOOO . split ( ) [ 1 ]
+ elif ooO0O0O0ooOOO . find ( "RX4Power:" ) != - 1 :
+ oooooo0O000o = ooO0O0O0ooOOO . split ( ) [ 1 ]
+ OoO [ "TypeOfTransceiver" ] = o0O
+ if o00iI :
+ oOOo0O00o = "MonitorData"
+ iIiIi11 = { "RXPower" : o00iI }
+ OoO [ oOOo0O00o ] = iIiIi11
+ elif O0O0Oooo0o :
+ oOOo0O00o = "ChannelMonitorValues"
+ iIiIi11 = { "RX1Power" : O0O0Oooo0o ,
+ "RX2Power" : oOOoo00O00o ,
+ "RX3Power" : O0O00Oo ,
+ "RX4Power" : oooooo0O000o }
+ OoO [ oOOo0O00o ] = iIiIi11
+ else :
+ if o0O and o0O . find ( "DAC" ) == - 1 :
+ iii11iII ( "Type not recognized: %s" % o0O )
+ continue
+ self . dom_table [ O0o0 ] = OoO
+ def dom_sync_proc ( self ) :
+ OOoO = 0
+ while self . dom_sync_task_running is True :
+ self . update_dom_table ( )
+ OO0O000 = { }
+ iiIiI1i1 = self . dom_table
+ i11i1I1 = iiIiI1i1 . keys ( )
+ OOoO = ( OOoO + 1 ) % 10
+ if OOoO == 0 :
+ oO ( "[DOM sync] ports are:" )
+ oO ( i11i1I1 )
+ for O0o0 in i11i1I1 :
+ if "TypeOfTransceiver" not in iiIiI1i1 [ O0o0 ] :
+ self . port_rx_power_low [ O0o0 ] = False
+ self . power_normal_count [ O0o0 ] += 1
+ oO ( "Port %s TypeOfTransceiver unknown" % O0o0 )
+ continue
+ o0O = iiIiI1i1 [ O0o0 ] [ "TypeOfTransceiver" ]
+ if o0O is None :
+ self . port_rx_power_low [ O0o0 ] = False
+ self . power_normal_count [ O0o0 ] += 1
+ oO ( "Port %s TransceiverType is None" % O0o0 )
+ continue
+ if o0O in iIiiiI :
+ ooooo0O0000oo = iIiiiI [ o0O ]
+ else :
+ self . port_rx_power_low [ O0o0 ] = False
+ self . power_normal_count [ O0o0 ] += 1
+ continue
+ if "ChannelMonitorValues" in iiIiI1i1 [ O0o0 ] :
+ OoOOo0OOoO = iiIiI1i1 [ O0o0 ] [ "ChannelMonitorValues" ]
+ ooO0O00Oo0o = False
+ OOO = 0
+ for oo0o0OO0 in range ( 1 , 5 ) :
+ oooO = "RX%dPower" % oo0o0OO0
+ if oooO in OoOOo0OOoO :
+ o00iI = OoOOo0OOoO [ oooO ]
+ if o00iI == "-40.0000dBm" or o00iI == "-infdBm" :
+ OOO += 1
+ else :
+ try :
+ o0O0OOO0Ooo = o00iI . find ( "dBm" )
+ if o0O0OOO0Ooo == - 1 :
+ oO ( "port %s, %s: can not find dBm"
+ % ( O0o0 , o00iI ) )
+ continue
+ o00iI = o00iI [ : o0O0OOO0Ooo ]
+ o00iI = float ( o00iI )
+ if o00iI < ooooo0O0000oo :
+ ooO0O00Oo0o = True
+ except ValueError as iiii1 :
+ oO ( "port %s channel %d rx power %s "
+ "not valid, reason %s"
+ % ( O0o0 , oo0o0OO0 , o00iI , str ( iiii1 ) ) )
+ continue
+ if OOO >= 2 :
+ ooO0O00Oo0o = False
+ if ooO0O00Oo0o :
+ OO0O000 [ O0o0 ] = { "low_thd" : ooooo0O0000oo ,
+ "channel" : 4 }
+ else :
+ self . port_rx_power_low [ O0o0 ] = ooO0O00Oo0o
+ self . power_normal_count [ O0o0 ] += 1
+ self . handle_rx_power_low ( O0o0 )
+ elif "MonitorData" in iiIiI1i1 [ O0o0 ] :
+ ooO0O00Oo0o = False
+ IIiiIiiI = iiIiI1i1 [ O0o0 ] [ "MonitorData" ]
+ if "RXPower" in IIiiIiiI :
+ o00iI = IIiiIiiI [ "RXPower" ]
+ if o00iI != "-40.0000dBm" and o00iI != "-infdBm" :
+ try :
+ o0O0OOO0Ooo = o00iI . find ( "dBm" )
+ if o0O0OOO0Ooo == - 1 :
+ continue
+ o00iI = o00iI [ : o0O0OOO0Ooo ]
+ o00iI = float ( o00iI )
+ if o00iI < ooooo0O0000oo :
+ ooO0O00Oo0o = True
+ except ValueError as iIi1IIIi1 :
+ oO ( "Port %s rx power %s not valid: %s"
+ % ( O0o0 , o00iI , str ( iIi1IIIi1 ) ) )
+ continue
+ if ooO0O00Oo0o :
+ OO0O000 [ O0o0 ] = { "low_thd" : ooooo0O0000oo ,
+ "channel" : 1 }
+ else :
+ self . port_rx_power_low [ O0o0 ] = ooO0O00Oo0o
+ self . power_normal_count [ O0o0 ] += 1
+ self . handle_rx_power_low ( O0o0 )
+ else :
+ continue
+ iiii111II = [ ]
+ I11iIiI1I1i11 = [ ]
+ OOoooO00o0oo0 = OO0O000 . keys ( )
+ IiIi1I1 = 0
+ while IiIi1I1 < self . on_count :
+ for O0o0 in OOoooO00o0oo0 :
+ ooO0O00Oo0o = self . confirm_power_low (
+ O0o0 , OO0O000 [ O0o0 ] [ "low_thd" ] ,
+ OO0O000 [ O0o0 ] [ "channel" ] )
+ if ooO0O00Oo0o :
+ if O0o0 not in iiii111II :
+ iiii111II . append ( O0o0 )
+ self . power_normal_count [ O0o0 ] = 0
+ else :
+ if O0o0 not in I11iIiI1I1i11 :
+ I11iIiI1I1i11 . append ( O0o0 )
+ self . power_normal_count [ O0o0 ] += 1
+ time . sleep ( self . on_check_interval )
+ IiIi1I1 += 1
+ for oOOoo0000O0o0 in OOoooO00o0oo0 :
+ if oOOoo0000O0o0 not in I11iIiI1I1i11 :
+ self . port_rx_power_low [ oOOoo0000O0o0 ] = True
+ self . power_normal_count [ oOOoo0000O0o0 ] = 0
+ else :
+ self . port_rx_power_low [ oOOoo0000O0o0 ] = False
+ self . power_normal_count [ oOOoo0000O0o0 ] += 1
+ self . handle_alarm_led ( oOOoo0000O0o0 )
+ time . sleep ( iIiiiI1IiI1I1 )
+ def confirm_power_low ( self , port , low_thd , channel ) :
+ O00oOOooo = channel
+ OOO = 0
+ IIi1 = False
+ if channel == 1 :
+ iI1iIii11Ii = [ "RXPower" ]
+ else :
+ iI1iIii11Ii = [ "RX%dPower" % IIi1i1I11Iii for IIi1i1I11Iii in range ( 1 , channel + 1 ) ]
+ for oooO in iI1iIii11Ii :
+ O0OoOoo00o = 'sudo sfputil show eeprom -d -p %s|grep "%s:"' % ( port , oooO )
+ oo0OooOOo0 , OoOooOOOO = commands . getstatusoutput ( O0OoOoo00o )
+ if oo0OooOOo0 != 0 :
+ if oo0OooOOo0 != 256 :
+ oO ( "command %s return %d" % ( O0OoOoo00o , oo0OooOOo0 ) )
+ return False
+ try :
+ i11iiII = OoOooOOOO . splitlines ( )
+ I1iiiiI1iII = i11iiII [ 0 ] . strip ( )
+ II111iiiI1Ii = "%s: " % oooO
+ o0O0OOO0Ooo = I1iiiiI1iII . find ( II111iiiI1Ii )
+ if o0O0OOO0Ooo == - 1 :
+ oO ( "%s doesn't contain %s" % ( I1iiiiI1iII , oooO ) )
+ continue
+ ooOo00 = I1iiiiI1iII [ o0O0OOO0Ooo + len ( II111iiiI1Ii ) : ]
+ if ooOo00 == "-40.0000dBm" or ooOo00 == "-infdBm" :
+ OOO += 1
+ continue
+ o0O0OOO0Ooo = ooOo00 . find ( "dBm" )
+ if o0O0OOO0Ooo == - 1 :
+ oO ( "%s doesn't contain dBm" % ooOo00 )
+ continue
+ o0oO000oo = ooOo00 [ : o0O0OOO0Ooo ]
+ o00iI = float ( o0oO000oo )
+ if o00iI < low_thd :
+ IIi1 = True
+ except Exception as iIi1IIIi1 :
+ iii11iII ( "Failed to get rx power of port %s: reason %s"
+ % ( port , str ( iIi1IIIi1 ) ) )
+ continue
+ if O00oOOooo == 1 :
+ return IIi1
+ if OOO >= 2 :
+ return False
+ return IIi1
+ def run ( self ) :
+ self . sfp_detector . run ( )
+ self . update_ports_admin_status ( )
+def iIIII ( ) :
+ iIIIiiI1i1i = argparse . ArgumentParser (
+ description = '' , version = '1.0.0' ,
+ formatter_class = argparse . RawTextHelpFormatter )
+ iIIIiiI1i1i . add_argument ( '-c' , '--oncount' , type = int ,
+ help = 'confirm count of power low before turn on alarm' ,
+ default = 2 )
+ iIIIiiI1i1i . add_argument ( '-i' , '--oncheckinterval' , type = int ,
+ help = 'interval between confirm check of power low '
+ 'before turning on alarm' ,
+ default = 5 )
+ iIIIiiI1i1i . add_argument ( '-p' , '--offperiod' , type = int ,
+ help = 'consecutive period of power normal before '
+ 'turn off alarm' ,
+ default = 5 )
+ ii1I1i1iiiI = iIIIiiI1i1i . parse_args ( )
+ return ii1I1i1iiiI
+def I1i11i ( ) :
+ global o0OOO
+ o0OOO = oOo ( o0OO00 , i1iII1IiiIiI1 )
+ ii1I1i1iiiI = iIIII ( )
+ if not i1iIIII ( "syncd" , 10 ) :
+ iii11iII ( "Failed: syncd not started." )
+ exit ( - 1 )
+ try :
+ O0O0Ooo = i1I11i1I ( ii1I1i1iiiI . oncount , ii1I1i1iiiI . oncheckinterval ,
+ ii1I1i1iiiI . offperiod )
+ except Exception as iIi1IIIi1 :
+ iii11iII ( "Failed: cannot instantiates PortAlarmLedMgr, %s." % str ( iIi1IIIi1 ) )
+ exit ( - 2 )
+ try :
+ if not O0O0Ooo . initialize ( ) :
+ iii11iII ( "Failed to initialize PortAlarmLedMgr" )
+ exit ( - 3 )
+ except Exception as iIi1IIIi1 :
+ iii11iII ( "Failed to initialize PortAlarmLedMgr, reason %s." % str ( iIi1IIIi1 ) )
+ exit ( - 4 )
+ try :
+ if not O0O0Ooo . start_dom_sync_task ( ) :
+ iii11iII ( "Failed to start dom sync task" )
+ exit ( - 5 )
+ except Exception as iIi1IIIi1 :
+ iii11iII ( "Failed to start dom sync task, reason %s." % str ( iIi1IIIi1 ) )
+ exit ( - 6 )
+ try :
+ O0O0Ooo . run ( )
+ except Exception as iIi1IIIi1 :
+ iii11iII ( "Failed to run PortAlarmLedMgr, reason is %s" % ( str ( iIi1IIIi1 ) ) )
+ exit ( - 7 )
+ oO ( "done, about to exit" )
+ exit ( 0 )
+if __name__ == '__main__' :
+ I1i11i ( )
+# dd678faae9ac167bc83abf78e5cb2f3f0688d3a3
diff --git a/files/image_config/port_led/port-alarm-led.service b/files/image_config/port_led/port-alarm-led.service
new file mode 100644
index 00000000000..ed45ea1b28c
--- /dev/null
+++ b/files/image_config/port_led/port-alarm-led.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=port alarm led service
+Requires=database.service
+After=database.service
+
+[Service]
+User=root
+ExecStart=/usr/local/bin/port-alarm-led.py
+Restart=on-failure
+RestartSec=30s
+
+[Install]
+WantedBy=multi-user.target
diff --git a/files/image_config/port_led/port-led b/files/image_config/port_led/port-led
new file mode 100644
index 00000000000..b55c11787a0
--- /dev/null
+++ b/files/image_config/port_led/port-led
@@ -0,0 +1,190 @@
+#!/usr/bin/python
+import click
+import subprocess
+import commands
+fport2ports_cl128 = [
+ 1 , 2 , 3 , 4 , 96 , 95 , 94 , 93 , 5 , 6 , 7 , 8 , 92 , 91 , 90 , 89 ,
+ 9 , 10 , 11 , 12 , 88 , 87 , 86 , 85 , 13 , 14 , 15 , 16 , 84 , 83 , 82 , 81 ,
+ 17 , 18 , 19 , 20 , 80 , 79 , 78 , 77 , 21 , 22 , 23 , 24 , 76 , 75 , 74 , 73 ,
+ 25 , 26 , 27 , 28 , 72 , 71 , 70 , 69 , 29 , 30 , 31 , 32 , 68 , 67 , 66 , 65 ,
+ 33 , 34 , 35 , 36 , 128 , 127 , 126 , 125 , 37 , 38 , 39 , 40 , 124 , 123 , 122 , 121 ,
+ 41 , 42 , 43 , 44 , 120 , 119 , 118 , 117 , 45 , 46 , 47 , 48 , 116 , 115 , 114 , 113 ,
+ 49 , 50 , 51 , 52 , 112 , 111 , 110 , 109 , 53 , 54 , 55 , 56 , 108 , 107 , 106 , 105 ,
+ 57 , 58 , 59 , 60 , 104 , 103 , 102 , 101 , 61 , 62 , 63 , 64 , 100 , 99 , 98 , 97
+ ]
+g_platform = ""
+g_hwsku = ""
+SONIC_CFGGEN_PATH = '/usr/local/bin/sonic-cfggen'
+HWSKU_KEY = 'DEVICE_METADATA.localhost.hwsku'
+PLATFORM_KEY = 'DEVICE_METADATA.localhost.platform'
+def find_platform_and_hwsku ( ) :
+ global g_platform
+ global g_hwsku
+ try :
+ ooO0oo0oO0 = subprocess . Popen ( [ SONIC_CFGGEN_PATH , '-H' , '-v' , PLATFORM_KEY ] ,
+ stdout = subprocess . PIPE ,
+ shell = False ,
+ stderr = subprocess . STDOUT )
+ oo00 = ooO0oo0oO0 . communicate ( ) [ 0 ]
+ ooO0oo0oO0 . wait ( )
+ o00 = oo00 . rstrip ( '\n' )
+ ooO0oo0oO0 = subprocess . Popen ( [ SONIC_CFGGEN_PATH , '-d' , '-v' , HWSKU_KEY ] ,
+ stdout = subprocess . PIPE ,
+ shell = False ,
+ stderr = subprocess . STDOUT )
+ oo00 = ooO0oo0oO0 . communicate ( ) [ 0 ]
+ ooO0oo0oO0 . wait ( )
+ OOoO = oo00 . rstrip ( '\n' )
+ except OSError , OOo :
+ raise OSError ( "Cannot detect platform: %s" % str ( OOo ) )
+ g_platform = o00
+ g_hwsku = OOoO
+ return True
+def set_port_led ( fport , enable ) :
+ return set_port_led_cl ( fport , enable )
+def get_port_led ( fport ) :
+ return get_port_led_cl ( fport )
+def show_all_port_led ( ) :
+ if g_hwsku == "AS13-32H" :
+ I111IiIi = 32
+ elif g_hwsku == "AS13-48F8H" :
+ I111IiIi = 56
+ elif g_hwsku == "AS23-128H" :
+ I111IiIi = 128
+ else :
+ return
+ for oooOOOOO in range ( 1 , I111IiIi + 1 ) :
+ i1iiIII111ii = get_port_led ( oooOOOOO )
+ click . echo ( "Port Ethernet%d alarm led is %s" % ( oooOOOOO , i1iiIII111ii ) )
+def get_port_addr_cl ( port ) :
+ oo0Ooo0 = 2
+ I1I11I1I1I = 20
+ OooO0OO = 50
+ if g_hwsku == "AS13-32H" :
+ iii11iII = 32
+ i1I111I = 48
+ elif g_hwsku == "AS13-48F8H" :
+ iii11iII = 56
+ i1I111I = 72
+ elif g_hwsku == "AS23-128H" :
+ iii11iII = 128
+ oo0Ooo0 = 4
+ i1I111I = 144
+ if port > ( iii11iII / 2 ) :
+ i1I111I = 145
+ I1I11I1I1I = 0x30
+ OooO0OO = 0x50
+ else :
+ return ( "" , "" )
+ OoOo = iii11iII / oo0Ooo0
+ IiIiIi = ( port - 1 ) / OoOo
+ II = 30
+ IiiiI1II1I1 = II + ( IiIiIi % 2 )
+ oo = I1I11I1I1I + ( ( port - 1 ) % OoOo )
+ Ii11iI1i = OooO0OO + ( ( port - 1 ) % OoOo )
+ if g_hwsku == "AS23-128H" :
+ Oo00OOOOO = "%d 0x%d 0x%x" % ( i1I111I , IiiiI1II1I1 , oo )
+ O0O = "%d 0x%d 0x%x" % ( i1I111I , IiiiI1II1I1 , Ii11iI1i )
+ else :
+ Oo00OOOOO = "%d 0x%d 0x%d" % ( i1I111I , IiiiI1II1I1 , oo )
+ O0O = "%d 0x%d 0x%d" % ( i1I111I , IiiiI1II1I1 , Ii11iI1i )
+ return ( Oo00OOOOO , O0O )
+def set_port_led_cl ( fport , enable ) :
+ if fport < 1 or fport > 128 :
+ return
+ if g_hwsku == "AS23-128H" :
+ oooOOOOO = fport2ports_cl128 [ fport - 1 ]
+ else :
+ oooOOOOO = fport
+ IiiI11Iiiii , ii1I1i1I = get_port_addr_cl ( oooOOOOO )
+ if IiiI11Iiiii == "" or ii1I1i1I == "" :
+ return
+ if enable == "on" :
+ iiiIi1i1I = 1
+ elif enable == "off" :
+ iiiIi1i1I = 0
+ else :
+ return
+ OOO00 = "i2cset -f -y %s %d" % ( IiiI11Iiiii , iiiIi1i1I )
+ iIii11I , OOO0OOO00oo = commands . getstatusoutput ( OOO00 )
+ if iIii11I != 0 :
+ click . echo ( "Set port %d LED test mode failed\n%s" % ( fport , OOO0OOO00oo ) )
+ return
+ if enable == "on" :
+ OOO00 = "i2cset -f -y %s %d" % ( ii1I1i1I , iiiIi1i1I )
+ iIii11I , OOO0OOO00oo = commands . getstatusoutput ( OOO00 )
+ if iIii11I != 0 :
+ click . echo ( "Set port %d LED color failed\n%s" % ( fport , OOO0OOO00oo ) )
+ return
+def get_port_led_cl ( fport ) :
+ i1iiIII111ii = "unknown"
+ if fport < 1 or fport > 128 :
+ return i1iiIII111ii
+ if g_hwsku == "AS23-128H" :
+ oooOOOOO = fport2ports_cl128 [ fport - 1 ]
+ else :
+ oooOOOOO = fport
+ IiiI11Iiiii , ii1I1i1I = get_port_addr_cl ( oooOOOOO )
+ if IiiI11Iiiii == "" or ii1I1i1I == "" :
+ return i1iiIII111ii
+ OOO00 = "i2cget -f -y %s " % IiiI11Iiiii
+ iiiIi1i1I = 0
+ try :
+ iIii11I , OOO0OOO00oo = commands . getstatusoutput ( OOO00 )
+ if iIii11I != 0 :
+ click . echo ( "Get port %d LED test mode failed" % fport )
+ return i1iiIII111ii
+ iiiIi1i1I = int ( OOO0OOO00oo . splitlines ( ) [ 0 ] , 16 )
+ i1iiIII111ii = "on" if ( iiiIi1i1I == 1 ) else "off"
+ except Exception , OOo :
+ click . echo ( "Failed to get port %d test mode state %s" % ( fport , str ( OOo ) ) )
+ return i1iiIII111ii
+ return i1iiIII111ii
+def play_all ( enable ) :
+ if g_hwsku == "AS13-32H" :
+ I111IiIi = 32
+ elif g_hwsku == "AS13-48F8H" :
+ I111IiIi = 56
+ elif g_hwsku == "AS23-128H" :
+ I111IiIi = 128
+ else :
+ return
+ for oooOOOOO in range ( 1 , I111IiIi + 1 ) :
+ set_port_led ( oooOOOOO , enable )
+@ click . group ( )
+def port_led ( ) :
+ i1I11i1iI = find_platform_and_hwsku ( )
+ if not i1I11i1iI :
+ click . echo ( "Failed to get platform and hwsku" )
+ return
+@ click . command ( )
+@ click . argument ( 'port' , type = click . IntRange ( 1 , 128 ) , required = True )
+def on ( port ) :
+ set_port_led ( port , "on" )
+@ click . command ( )
+@ click . argument ( 'port' , type = click . IntRange ( 1 , 128 ) , required = True )
+def off ( port ) :
+ set_port_led ( port , "off" )
+@ click . command ( )
+def onall ( ) :
+ play_all ( "on" )
+@ click . command ( )
+def offall ( ) :
+ play_all ( "off" )
+@ click . command ( )
+@ click . argument ( 'port' , type = click . IntRange ( 1 , 128 ) , required = True )
+def status ( port ) :
+ i1iiIII111ii = get_port_led ( port )
+ click . echo ( "port Ethernet%d led is %s" % ( port , i1iiIII111ii ) )
+@ click . command ( )
+def show ( ) :
+ show_all_port_led ( )
+port_led . add_command ( on )
+port_led . add_command ( off )
+port_led . add_command ( onall )
+port_led . add_command ( offall )
+port_led . add_command ( status )
+port_led . add_command ( show )
+if __name__ == '__main__' :
+ port_led ( )
+# dd678faae9ac167bc83abf78e5cb2f3f0688d3a3
diff --git a/files/image_config/port_led/sonic_sfp.tar.gz b/files/image_config/port_led/sonic_sfp.tar.gz
new file mode 100644
index 00000000000..2bfddd51be2
Binary files /dev/null and b/files/image_config/port_led/sonic_sfp.tar.gz differ
diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph
index 686108727b2..17079f057ef 100755
--- a/files/image_config/updategraph/updategraph
+++ b/files/image_config/updategraph/updategraph
@@ -53,6 +53,9 @@ check_system_warm_boot
copy_list="minigraph.xml snmp.yml acl.json config_db.json frr"
if [ -f /tmp/pending_config_migration ]; then
copy_config_files_and_directories $copy_list
+ PLATFORM=`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`
+ cp /usr/share/sonic/device/$PLATFORM/minigraph.xml /etc/sonic/minigraph.xml
+ sonic-cfggen -H -m /etc/sonic/minigraph.xml -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json
if [ x"${WARM_BOOT}" == x"true" ]; then
echo "Warm reboot detected..."
elif [ "$enabled" = "true" ]; then
@@ -74,7 +77,9 @@ if [ -f /tmp/pending_config_initialization ]; then
if [ "$enabled" != "true" ]; then
PLATFORM=`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`
PRESET=(`head -n 1 /usr/share/sonic/device/$PLATFORM/default_sku`)
- sonic-cfggen -H -k ${PRESET[0]} --preset ${PRESET[1]} > /etc/sonic/config_db.json
+ #sonic-cfggen -H -k ${PRESET[0]} --preset ${PRESET[1]} > /etc/sonic/config_db.json
+ cp /usr/share/sonic/device/$PLATFORM/minigraph.xml /etc/sonic/minigraph.xml
+ sonic-cfggen -H -m /etc/sonic/minigraph.xml -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json
redis-cli -n $CONFIG_DB_INDEX FLUSHDB
sonic-cfggen -j /etc/sonic/config_db.json --write-to-db
redis-cli -n $CONFIG_DB_INDEX SET "CONFIG_DB_INITIALIZED" "1"
diff --git a/onie-image.conf b/onie-image.conf
index 1d7c6f1e8aa..23bba35a02e 100644
--- a/onie-image.conf
+++ b/onie-image.conf
@@ -4,7 +4,7 @@
## Partition size in MB
## The default size is 32GB
-: ${ONIE_IMAGE_PART_SIZE:=32768}
+: ${ONIE_IMAGE_PART_SIZE:=262144}
## Target hardware information
: ${TARGET_PLATFORM:=x86_64}
diff --git a/platform/broadcom/sonic-platform-modules-cel b/platform/broadcom/sonic-platform-modules-cel
index e05ca73b18a..b319df9c68b 160000
--- a/platform/broadcom/sonic-platform-modules-cel
+++ b/platform/broadcom/sonic-platform-modules-cel
@@ -1 +1 @@
-Subproject commit e05ca73b18a56fed8e08de9362e0fe760f72424a
+Subproject commit b319df9c68b29686d072f25c6931bba75b176540
diff --git a/rules/config b/rules/config
index 674280a3ca2..8dab2f69e02 100644
--- a/rules/config
+++ b/rules/config
@@ -28,7 +28,7 @@ SONIC_CONFIG_MAKE_JOBS = $(shell nproc)
DEFAULT_USERNAME = admin
# DEFAULT_PASSWORD - default password for installer build
-DEFAULT_PASSWORD = YourPaSsWoRd
+DEFAULT_PASSWORD = admin
# ENABLE_DHCP_GRAPH_SERVICE - specify the source of minigraph to generate configuration file.
# If set to y SONiC will get the minigraph from graph service. Graph service URL need to be