網管每天要做的事情很多,有些日常固定執行的工作,如果能夠自動化排程執行,可以減輕可觀的工作量,讓網管攻城獅可以好好利用有限的精力,處理更重要的工作。

自動化排程執行,商業軟體跟免費開源套件,都有這樣的功能。

如果沒有預算,又不想花時間研究開源套件,

這裡分享一個小程式,可以備份CISCO switch設定,如果排程執行,就可以做到定時備份功能。

有2個檔案,1個是switch清單,1列放1個switch IP
backup-Switches.txt
-------------------
172.16.1.254
172.16.1.253

 

另1個是下載CISCO switch的小程式,說明詳見程式註解

#!.\venv\Scripts\python.exe
# -*- coding: utf-8 -*-
#
# for Python version 3.10.0
# Author:William Huang
# Date:2022/10/24
# program:dump-Switch-config.py
#

def main():
    import telnetlib
    from datetime import datetime

    # CISCO switch清單
    swList = open("backup-Switches.txt","r")
    # 記錄dump config失敗的switch
    failedList = open("Fail-to-created.txt","a+")

    for sw in swList:
        HOST = sw.strip()

        # 顯示處理中的switch
        print("Dumping " + HOST + "'s config...")

        # 登入switch的帳號
        user = <username>       # 帳號字串,請換成真正帳號

        # 登入switch的密碼
        password = <password>    #密碼字串,請換成真正密碼

        # switch prompt登入帳號
        loginPrompt=[b"Username: "]

        # switch prompt登入密碼
        pwdPrompt=[b"Password: "]

        # 判別user mode or enable mode
        pmp = [b"\>|\#"]

        # 存入config檔名格式:年月日-時分秒-switch-ip.conf
        configfile = open(datetime.today().strftime("%Y%m%d-%H%M%S-") + "switch-" + HOST + ".conf", "w")

        try:
            # 建立連到HOST的telnet連線
            tn = telnetlib.Telnet(HOST)

            # 等待輸入帳號的prompt
            tn.expect(loginPrompt)

            # 輸入帳號
            tn.write(user.encode('ascii') + b"\n")   # b"\n" == enter

            # 等待輸入密碼的prompt
            tn.expect(pwdPrompt)

            # 輸入密碼
            tn.write(password.encode('ascii') + b"\n")

            # 等待輸入指令的prompt,這裡是">"
            tn.expect(pmp)

            # 輸入enable指令
            tn.write("enable".encode('ascii') + b"\n")

            # 等待輸入密碼的prompt
            tn.expect(pwdPrompt)

            # 輸入密碼
            tn.write(password.encode('ascii') + b"\n")

            # 等待輸入指令的prompt,這裡是"#"
            tn.expect(pmp)

            # 輸入螢幕顯示不分頁指令
            tn.write(b"terminal length 0" + b"\n")

            # 等待輸入指令的prompt,這裡是"#"
            tn.expect(pmp)

            # 輸入show running-config指令
            tn.write(b"show running-config" + b"\n")

            # 等待指令結束回應"#"
            # 再讀取、儲存回應字串到dmpconfig
            dmpconfig = tn.read_until(b"#")    # 指令+前置處理字串+「running-config(用\r\n分行)」+後綴prompt

            # 結束enable mode
            tn.write(b"exit" + b"\n")

            # 讀取user mode prompt,這裡是">"
            tn.expect(pmp)

            # 結束user mode
            tn.write(b"exit" + b"\n")

            # 從dmpconfig字串,擷取running-config
            for _ in dmpconfig.split(b"\r\n")[4:-2]:  # 以\r\n分列,去掉頭尾非config列
                # 結果寫到configfile檔,格式見前述
                configfile.write(_.decode()+"\n")

        except (OSError,EOFError) as e:  # OSError、EOFError
            # 如果出現錯誤,寫入錯誤訊息到failedList檔
            failedList.write("Failed to create " + datetime.today().strftime("%Y%m%d-%H%M%S-") + HOST + ".conf!\n\r")

            # 如果出現錯誤,在螢幕顯示出錯的switch
            print("\nFailed to create " + datetime.today().strftime("%Y%m%d-%H%M%S-") + HOST + ".conf!")

            #  如果出現錯誤,在螢幕顯示完整錯誤訊息
            print(e)

            continue

        configfile.close()

    swList.close()
    failedList.close()


if __name__ == '__main__':
    main()

 

No comments

Leave your comment

In reply to Some User