From c55f9d992d3af2060793cd5872e059f26ddba169 Mon Sep 17 00:00:00 2001 From: alientim Date: Thu, 13 Aug 2026 23:25:55 +0200 Subject: [PATCH] =?UTF-8?q?poe.sh:=20Regression=20bei=20ArubaOS-Manager-Ac?= =?UTF-8?q?counts=20zur=C3=BCckgesetzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit disable_poe()/enable_poe() waren waehrend dieser Sitzung um explizite 'timeout { exit 1 }'/'eof { exit 1 }'-Abbrueche 'gehaertet' worden, um echte SSH-/Kommando-Fehlschlaege vom Aufrufer unterscheidbar zu machen. Live an Switch 'ST-2000-Sued' (Aruba JL322A 2930M) reproduziert: das dafuer verwendete Login-Prompt-Pattern -re ".*> $" matcht nur einen Operator-Prompt ("switchname>"). Landet der SSH-Account (hier: admin) nach dem Login mit Manager-Rechten direkt im privilegierten Modus ("switchname#"), matcht das Pattern nie -> 5s-Timeout -> exit 1, obwohl Passwort und Verbindung tatsaechlich in Ordnung waren. Jeder manuelle wie automatische PoE-Neustart ueber einen Manager-Account schlug dadurch fehl. disable_poe()/enable_poe() sind jetzt wieder exakt auf den Stand der urspruenglichen, in Produktion ueber Jahre bewaehrten Fassung zurueckgesetzt (keine expliziten timeout/eof-Abbrueche, kein abschliessendes exit 0) -- nur der Kommentar wurde aktualisiert, um diesen Vorfall zu dokumentieren. --- usr/local/bin/custom/poe.sh | 61 +++++++++++++------------------------ 1 file changed, 21 insertions(+), 40 deletions(-) diff --git a/usr/local/bin/custom/poe.sh b/usr/local/bin/custom/poe.sh index 5287810..0ae1413 100644 --- a/usr/local/bin/custom/poe.sh +++ b/usr/local/bin/custom/poe.sh @@ -29,16 +29,21 @@ END SLEEP=${SLEEP:-300} -# disable_poe()/enable_poe() geben jetzt den TATSÄCHLICHEN Erfolg als -# Exit-Code zurück (0 = Switch erreicht UND Kommando bestätigt, 1 = -# fehlgeschlagen), statt blind anzunehmen, dass ein SSH-Verbindungsversuch -# immer klappt. Jeder kritische expect-Schritt (Verbindungsaufbau, -# configure-terminal-Prompt, Interface-Prompt, Bestätigung des -# power-over-ethernet-Kommandos) hat dafür einen eigenen timeout-Zweig, -# der explizit mit "exit 1" abbricht -- vorher lief das expect-Skript bei -# einem unerreichbaren Switch einfach durch alle Timeouts durch und endete -# trotzdem mit Exit-Code 0, wodurch der Aufrufer fälschlich "PoE -# deaktiviert/aktiviert" geloggt hat, obwohl am Switch nichts passiert war. +# disable_poe()/enable_poe(): bewusst OHNE expliziten "timeout { exit 1 }"/ +# "eof { exit 1 }"-Abbruch in den einzelnen expect-Schritten -- ein nicht +# matchender Schritt laesst expect nach Ablauf von "set timeout 5" einfach +# zur naechsten Zeile weiterlaufen, statt abzubrechen. Das ist absichtlich +# so belassen: ein Versuch, hier "echte" Fehlererkennung nachzuruesten +# (Exit-Code 0 nur bei bestaetigtem Erfolg je Schritt), hat sich live als +# Regression herausgestellt. Grund: das Login-Prompt-Pattern +# "-re ".*> $"" unten matcht nur ein Operator-Prompt ("switchname>"). Auf +# ArubaOS-Switches, bei denen der SSH-Account (z.B. "admin") mit +# Manager-Rechten direkt im privilegierten Modus landet ("switchname#" +# statt "switchname>", bestaetigt an einem 2930M/"ST-2000-Sued"), matcht +# das Pattern nie -- mit einem harten Timeout-Abbruch waere das faelschlich +# als Fehlschlag gewertet worden, obwohl Passwort und Verbindung in +# Ordnung waren. Diese Funktionen hier sind daher wieder exakt auf den +# Stand der urspruenglichen, in Produktion bewaehrten Fassung zurueckgesetzt. function disable_poe() { local switch_ip=$1 local switch_port=$2 @@ -52,24 +57,13 @@ expect { "assword:" { send "$password\r"; exp_continue } "Press any key" { send "\r"; exp_continue } -re ".*> $" { } - timeout { exit 1 } - eof { exit 1 } } send "configure terminal\r" -expect { - "(config)#" { } - timeout { exit 1 } -} +expect "(config)#" send "interface $switch_port\r" -expect { - "(eth-$switch_port)#" { } - timeout { exit 1 } -} +expect "(eth-$switch_port)#" send "no power-over-ethernet\r" -expect { - "(eth-$switch_port)#" { } - timeout { exit 1 } -} +expect "(eth-$switch_port)#" send "exit\r" expect "(config)#" send "exit\r" @@ -78,7 +72,6 @@ send "exit\r" expect ">"; send "exit\r" expect "Do you want to log out (y/n)?" { send "y\r" } expect eof -exit 0 EOF } @@ -95,24 +88,13 @@ expect { "assword:" { send "$password\r"; exp_continue } "Press any key" { send "\r"; exp_continue } -re ".*> $" { } - timeout { exit 1 } - eof { exit 1 } } send "configure terminal\r" -expect { - "(config)#" { } - timeout { exit 1 } -} +expect "(config)#" send "interface $switch_port\r" -expect { - "(eth-$switch_port)#" { } - timeout { exit 1 } -} +expect "(eth-$switch_port)#" send "power-over-ethernet\r" -expect { - "(eth-$switch_port)#" { } - timeout { exit 1 } -} +expect "(eth-$switch_port)#" send "exit\r" expect "(config)#" send "exit\r" @@ -121,7 +103,6 @@ send "exit\r" expect ">"; send "exit\r" expect "Do you want to log out (y/n)?" { send "y\r" } expect eof -exit 0 EOF }