Benutzer-Werkzeuge

Webseiten-Werkzeuge


event-action-python-aos-r8

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
event-action-python-aos-r8 [2020/09/09 12:53] – [Ein einfaches Beispiel als Codegerüst: chassis_trap.py] bennyevent-action-python-aos-r8 [2024/06/09 10:29] (aktuell) – Externe Bearbeitung 127.0.0.1
Zeile 308: Zeile 308:
 ===== Fortgeschritten ===== ===== Fortgeschritten =====
  
-==== OmniSwitch-Konfiguration via scp exportieren ====+==== Anwendungsfall: OmniSwitch-Konfiguration via scp auf Server exportieren ====
  
-key-pair erzeugen +Damit der OmniSwitch nach erfolgreichem "write memory flash-synchro" per scp auf einen externen Server exportiert, müssen ein paar Voraussetzungen erfüllt sein.
-- known_hosts +
-- identity_file mit zugriffsrechten+
  
 +  - Ein SSH private/public Key für den OmniSwitch muss hinterlegt sein (dabei ist der private-key auf dem OmniSwitch und der public-key auf dem Server in ~/.ssh/authorized_keys)
 +  - Bei einer Automatisierung ist eine "yes/no"-Abfrage wie für den SSH-Host-Fingerprint für known_hosts eine Herausforderung die es zu lösen gilt
 +  - Damit die Verbindung per SSH/SCP erfolgreich ist, muss das identity_file mit korrekten Zugriffsrechten hinterlegt werden
 +  - Das Skript auf dem Switch hinterlegen
 +  - Mit "event-action" die CLI-Aktion "write memory flash-synchro" mit dem Skript verknüpfen
 +  - Den Vorgang testen
  
 +=== 1. SSH private/public Key erzeugen ===
 +<code>
 +ssh-keygen -t rsa -b 2048 -C "omniswitch@home"
 +</code>
 +Der resultierende id_rsa.pub-Key muss für den Benutzer in ~/.ssh/authorized_keys hinterlegt werden. Der id_rsa (private-key) muss auf den Switch (die Switches) kopiert und dort mit **chmod 600 /path/to/id_rsa** mit den korrekten Zugriffsrechten versehen werden.
 +
 +=== 2. Automatisierung von SSH-Host-Fingerprint yes/no ===
 +
 +Der Zusatz **-o StrictHostKeyChecking=no** sollte nur verwendet werden, wenn man mit der Konsequenz einer potentiellen MITM-Attacke leben kann. Bitte beachten dass das Skript fehlschlagen wird, wenn sich der SSH-Host-Fingerprint ändert. Das könnte man zwar auch wegkonfigurieren, aber ich halte es für keine gute Idee.
 +
 +<code>
 +Switch-> scp -i /path/to/omniswitch_private_ssh_key -o StrictHostKeyChecking=no /flash/working/vcboot.cfg <username>@<server>:/path/to/configbackup/filename.cfg
 +</code>
 +
 +=== 3. Korrekte Zugriffsrechte für ssh_private_key ===
 +
 +<code>
 +Switch-> chmod 600 /path/to/omniswitch_private_ssh_key
 +</code>
 +
 +=== 4. Skript für Export ===
 +Vorausgesetzt die Tipps aus diesem Artikel wurden angewendet, kann nun mit diesem Skript die Konfiguration extern abgelegt werden. Das folgende Skript hier abspeichern: **/flash/python/chassis_trap.py** 
 +
 +<file python chassis_trap.py>
 +#!/usr/bin/env python3
 +
 +import sys
 +import os
 +import getopt
 +import json
 +import subprocess
 +
 +# Based upon work done by Patricio Martelo and Benny Eggerstedt in 2015
 +# Some corrections and enhancements done by Benny in 2020
 +
 +# Variables to set by customer
 +ssh_priv_key = "/flash/python/omniswitch_private_ssh_key"
 +config_to_backup = "/flash/working/vcboot.cfg"
 +scp_target_user = "benny"
 +scp_host = "shiva.home" # could also be an IP address
 +scp_path = "/home/benny/configs/" # full path or relative to ~ of the user, include the "/" at the end!
 +
 +# Get system name
 +system_name = os.uname()[1].replace(" ", "_")
 +
 +# Uncomment during early stage of development
 +#print(sys.argv)
 +
 +# Load the data that is being sent to us
 +# -t holds the traptype
 +# -d holds the trapdata
 +try:
 +    opts, args = getopt.getopt(sys.argv[1:], "t:d:")
 +except getopt.GetoptError as err:
 +    print(err)
 +    print("{0}".format(sys.argv))
 +    sys.exit(2)
 +traptype = "(none)"
 +trapdata = "{}"
 +
 +# Go through the data in opts and allocate it properly
 +# traptype gets the value from -t
 +# trapdata gets the value from -d
 +for o, a in opts:
 +    if o == "-t":
 +        traptype = a
 +    elif o == "-d":
 +        trapdata = a
 +
 +#print("traptype: {0}".format(traptype))
 +#print("trapdata: {0}".format(trapdata))
 +
 +#print(json.loads(trapdata))
 +
 +trapdetail = json.loads(trapdata)
 +
 +#print(trapdetail)
 +
 +if trapdetail["chassisTrapsAlertNumber"] == 5:
 +    # This type of trap is sent when write memory flash-synchro finished
 +    #print("detected write memory flash synchro")
 +    # When the "write memory flash-synchro" was successful, export the configuration
 +    if "success" in trapdetail["chassisTrapsAlertDescr"]:
 +        system_date = subprocess.check_output(["system", "date"]).decode("ascii").strip().replace("/", "_")
 +        system_time = subprocess.check_output(["system", "time"]).decode("ascii").strip().replace(":", "_")
 +        timestamp = system_date + "_" + system_time 
 +        os.system("scp -v -i {0} -o StrictHostKeyChecking=no {1} {2}@{3}:{4}{5}_{6}.cfg".format(ssh_priv_key, config_to_backup, scp_target_user, scp_host, scp_path, system_name, timestamp))
 +        print("Process finished!")
 +</file>
 +
 +**5. Mit "event-action" den Trap mit dem Skript verknüpfen:**
 +<code>
 +Switch-> event-action trap chassisTrapsAlert script /flash/python/chassis_trap.py
 +</code>
 +
 +**6. Testen:**
 +<code>
 +Switch-> write memory flash-synchro
 +</code>
 +
 +**Ausgabe auf der Switch-Konsole:**
 +<code>
 +{'sysUpTime': 85955617, 'physicalIndex': 65, 'chassisTrapsObjectType': 5, 'chassisTrapsObjectNumber': 65, 'chassisTrapsAlertNumber': 4, 'chassisTrapsAlertDescr': 'CERTIFY w/FLASH SYNCHRO process started'}
 +
 +Wed Sep  9 18:16:07 : ChassisSupervisor MipMgr INFO message:
 ++++ Copy running to certified succeeded
 +{'sysUpTime': 85961949, 'physicalIndex': 65, 'chassisTrapsObjectType': 5, 'chassisTrapsObjectNumber': 65, 'chassisTrapsAlertNumber': 5, 'chassisTrapsAlertDescr': 'CERTIFY process completed successfully'}
 +Please wait...
 +Executing: program /bin/tps/ssh host shiva.home, user benny, command scp -v -t /home/benny/configs/Switch_09_09_2020_18_16_07.cfg
 +Sending file modes: C0644 4312 vcboot.cfg
 +Sink: C0644 4312 vcboot.cfg
 +Process finished!
 +</code>
 ===== Fehleranalyse ===== ===== Fehleranalyse =====
  
Zeile 335: Zeile 452:
 Der Zusatz -o StrictHostKeyChecking=no führt dazu dass man die Identität des Servers nicht bestätigen muss. Die Identität des Servers wird aber trotzdem in ~/.ssh/known_hosts abgelegt und wenn der Fingerprint sich ändert wird das Skript fehlschlagen. Der Zusatz -o StrictHostKeyChecking=no führt dazu dass man die Identität des Servers nicht bestätigen muss. Die Identität des Servers wird aber trotzdem in ~/.ssh/known_hosts abgelegt und wenn der Fingerprint sich ändert wird das Skript fehlschlagen.
 <code> <code>
-scp -i /flash/python/omniswitch_private_ssh_key -o StrictHostKeyChecking=no /flash/working/vcboot.cfg <username>@<server>:/path/to/configbackup/filename.cfg+scp -i /path/to/omniswitch_private_ssh_key -o StrictHostKeyChecking=no /flash/working/vcboot.cfg <username>@<server>:/path/to/configbackup/filename.cfg
 </code> </code>
  
event-action-python-aos-r8.1599655986.txt.gz · Zuletzt geändert: 2024/06/09 10:29 (Externe Bearbeitung)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki