Einfache Bash Completion für RANCID
Ein Grund dafür, dass ich sehr gern mit der Kommandozeile arbeite, ist die automatische kontext-sensitive Vervollständigung der angefangenen Befehlszeilen.
Die Bash - als Shell, die ich am meisten verwende - bringt dafür bereits in der Grundausstattung einige nützliche Vervollständigungen mit. Und mit dem in vielen Linux-Distributionen verfügbaren Paket bash-completion wird das Eingeben der Kommandozeile für viele weitere Befehle einfacher.
Etliche Programme bringen eigene Vervollständigungen mit, die auf die Eigenheiten des jeweiligen Programms eingehen.
Für RANCID ist mir bisher keine Auto-Vervollständigung bekannt, darum habe ich mich - insbesondere nach dem Lesen dieses Artikels auf iridakos.com - dazu entschlossen, selbst ein Skript dafür zu schreiben.
Normalerweise wird RANCID regelmäßig von Cron gestartet und nicht interaktiv verwendet.
Es gibt jedoch zwei Fälle, bei denen ich RANCID auf der Kommandozeile verwende:
Das Programm
plogin
, um auf die Konsole des Netzgerätes zu kommen, wenn ich dort etwas untersuchen will.der Befehl
rancid-run -r ...
, um gezielt die Konfiguration eines Gerätes zu sichern, nachdem ich etwas geändert habe. Mit der zusätzlichen Option-c "mein Text"
kann ich den Grund der Änderung im VCS hinterlegen.
Beide Befehle arbeiten unabhängig vom Typ des Gerätes, ich kann sie also mit allen von RANCID erfassten Geräten verwenden. Dazu benötige ich eine Liste dieser Geräte.
Der kanonische Weg,
diese Liste zu bekommen,
ist ein Einlesen der Variable LIST_OF_GROUPS
aus der Datei rancid.conf,
Öffnen der Datei router.db in zugehörigen Verzeichnissen
und Einlesen des ersten Feldes jeder Zeile.
Damit bekomme ich dann gleich noch den Typ des Gerätes,
falls ich das für die Befehle clogin
, hlogin
, jlogin
etc. verwenden will.
Alles in allem aber ein ziemlicher Aufwand,
es geht auch einfacher.
Die Datei ~/.cloginrc,
die sowohl plogin
als auch die von rancid
aufgerufenen Skripts verwenden,
enthält die Credentials für alle Netzgeräte,
und natürlich auch deren Namen.
Ich kann die Namen also auch aus einer einzelnen Datei auslesen.
Der Name des Gerätes steht bei den Befehlen,
die in .cloginrc mit add
beginnen,
an der 3. Stelle.
Mit awk '/^add/ {print $3}' < ~/.cloginrc
bekomme ich
diese Liste mit zwei Schönheitsfehlern:
Die Einträge wiederholen sich für jede Eigenschaft, die mit
add ... $system
spezifiziert wird.Eigenschaften, die als Defaultwerte mit
*
spezifiziert werden, erzeugen einen Stern in der Liste.
Für beides gibt es Abhilfe.
Den *
eliminiere ich mit grep -vE '^[*]$'
und die Duplikate mit sort -u
Damit habe ich die Liste der von RANCID erfassten Geräte, nun muss ich mich nur noch um die Autovervollständigung kümmern. Der Befehl lautet für die Bash ganz einfach
complete -W $liste $cmd
Darin ist $liste
die Liste der möglichen Vervollständigungen
und $cmd
der Befehl, der vervollständigt werden soll.
Ich schreibe also ein Skript ~/.bash_completion.d/rancid.sh
# bash completion for plogin
#
# vim: set sw=2 ts=2 tw=80 ai et si:
function rancid_host_list() {
awk '/add\s+password/ {print $3}' < ~/.cloginrc | grep -vE '^[*]$'
}
complete -W "$(rancid_host_list)" plogin
complete -W "$(rancid_host_list)" rancid-run
Dieses Skript lese ich in der ~/.bashrc ein:
. ~/.bash_completion.d/rancid.sh
Und wieder gibt es etwas mehr zu tun für die Tabulator-Taste, die die Auto-Vervollständigung auslöst.
Wer nun Lust auf mehr bekommen hat, dem empfehle ich den Abschnitt Programmable Completion des Bash-Handbuchs.
Posted 2020-03-23