2017-08-17 83 views
0

我正在編寫一個python腳本,它將連接到HP C7000機箱上的Onboard Admin,列出所有刀片服務器並根據名稱確定Bay ID,然後使用它來列出內部交換機端口ID。Python將任意輸出轉換爲表或列表

登錄後,執行腳本的第二部分(顯示實際的端口映射)。響應緩衝區將包含這個長字符串。

b'show server port map 1\r\n    Mezz\r\nMezz Mezz Device Port  Interconnect Interconnect\r\nSlot Device Port Status   Bay  Bay Port  Device ID\r\n---- ------ ------ ---------- ------------ ------------ ----------------\r\n\r\n------------------------------- Blade 001 -------------------------------\r\n\r\n 1 QLogic QMH2562 8Gb FC HBA for HP BladeSystem c-Class\r\n   Port 1 OK   Bay 3  Port 1  50:01:43:80:21:db:8c:54\r\n   Port 2 OK   Bay 4  Port 1  50:01:43:80:21:db:8c:56\r\n\r\n 2 Not Present\r\n\r\n 3 Not Present\r\n\r\n  FlexFabric Embedded Ethernet\r\n Ethernet (NIC 1) LOM:1-a OK  Bay 1  Port 9  00:9C:02:AA:8C:58\r\niSCSI HBA (iSCSI 1) LOM:1-b OK Bay 1  Port 9  00:9C:02:AA:8C:59\r\n FCoE HBA LOM:1-b OK   Bay 1  Port 9  10:00:00:9C:02:AA:8C:59\r\n Ethernet (NIC 2) LOM:2-a OK  Bay 2  Port 9  00:9C:02:AA:8C:5C\r\niSCSI HBA (iSCSI 2) LOM:2-b OK Bay 2  Port 9  00:9C:02:AA:8C:5D\r\n FCoE HBA LOM:2-b OK   Bay 2  Port 9  10:00:00:9C:02:AA:8C:5D\r\n Ethernet (NIC 5) LOM:3-a OK  Bay 1  Port 1  00:9C:02:AA:8C:60\r\niSCSI HBA (iSCSI 3) LOM:3-b OK Bay 1  Port 1  00:9C:02:AA:8C:61\r\n FCoE HBA LOM:3-b OK   Bay 1  Port 1  10:00:00:9C:02:AA:8C:61\r\n Ethernet (NIC 6) LOM:4-a OK  Bay 2  Port 1  00:9C:02:AA:8C:64\r\niSCSI HBA (iSCSI 4) LOM:4-b OK Bay 2  Port 1  00:9C:02:AA:8C:65\r\n FCoE HBA LOM:4-b OK   Bay 2  Port 1  10:00:00:9C:02:AA:8C:65\r\n[[email protected] ~]$ ' 

與.decode格式化這個(「UTF-8」)給了我更多的人類可讀輸出 enter image description here

有趣的是,我與MAC地址線,因爲它們包含灣ID和端口ID。簡而言之,我想將輸出分解爲單獨的行,根據包含MAC地址的過濾器進行過濾,並提取有趣的信息(Bay ID和Port ID)。爲了使事情變得更難輸出可能略有不同的格式是這樣的:

enter image description here

什麼是接近這種方式嗎?

+0

沒有試過grepping? 'grep -E'mac1 | man2 | macN' – geckos

+0

我相信這可以在* nix環境下工作,但我想留在這個python腳本中,我想用這個輸出來執行另一組操作,例如,在每個刀片交換機的這些端口中設置VLAN。 – Maros

回答

0

這聽起來很簡單,如果你用正則表達式來做,因爲只有你感興趣的行實際上包含了所有的屬性(bay id,port id和mac)。

設想以下測試(它實際上被寫成一個襯墊,但讓我們展開它更容易閱讀):

import re 
r=re.compile(r"\sPort\s+(\d+)\s+Bay\s+(\d+)\s+(([0-9A-F]{2}:){5,}..)") 
for line in lines: 
    m = r.match(line) 
    if not m: continue 
    print("We have bay %s slot %s mac %s"%(m.group(1), m.group(2), m.group(3)) 
+0

我想用表達式這種方法,但我感覺我需要重新包裝從緩衝該響應,如果沒有它它把每個字符的行: 中號 Ë Ž Ž \ ř \ Ñ 中號 Ë ž ž 中號 Ë ž ž d Ë v 我 Ç Ë P Ø [R 牛逼 – Maros

+0

你的意思重新包裝什麼?如果輸出是字節,則需要將其編碼爲字符串,並用新行分割。然後,你可以應用上面的循環a做任何你想要的結果... – geckos