weidner/computer/software/shell/

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:

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:

  1. Die Einträge wiederholen sich für jede Eigenschaft, die mit add ... $system spezifiziert wird.

  2. 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
Tags: