This commit is contained in:
2024-10-14 00:08:40 +02:00
parent dbfba56f66
commit 1462d52e13
4572 changed files with 2658864 additions and 0 deletions

View File

@@ -0,0 +1,149 @@
#!/usr/bin/perl
my $config;
my $configs;
my $host;
my @hosts;
my $ssh_opt;
my $user;
my $pass;
my $remain;
my $count=1;
# Expect Befehl vom System ermitteln
my $expect=`which expect`;
chomp $expect;
# Datumsstring yyyymmdd_hhmmss
my $date=`date +"%Y%m%M_%H%M%S"`;
chomp $date;
# zu konfigurierende hosts aus configs.txt auslesen
open CONFIGS, "<configs.txt" or die "\n\ncannot open configs.txt\n\n";
foreach my $l (<CONFIGS>) {
# Kommentarzeilen überspringen
# Auskommentierte hosts überpringen
next if ($l =~ /^#/);
($host)=$l=~ /^(.*) >>>>$/;
# host in @hosts aufnehmen
push @hosts, $host if $host ne "";
}
close CONFIGS;
# komplette configs.txt einlesen
open CONFIGS, "<configs.txt" or die "\n\ncannot open configs.txt\n\n";
my @configs=<CONFIGS>;
close CONFIGS;
# komplette configs in eine variable für multiline matche
foreach (@configs) { next if /^#/; $configs=$configs . $_; }
# für alle zu konfigurierende hosts die konfig ermitteln
foreach $host (@hosts) {
# Logfilename erstellen
# log_yyyymmdd_hhmmss_Nummer.txt
# Nummer wird für jeden host hochgezählt, also neues logfile für jeden Konfigabschnitt
$logfile="log_".$date."_$count".".txt";
#$logfile="log";
$count++;
# Initialisierung
$ssh_opt=""; $user=""; $pass=""; $config=""; $remain="";
# Aus gesamtem Konfigfile den Teil für host selektieren (nach $config)
# Der Rest geht nach $remain
($config,$remain) = $configs =~ /$host >>>>\n(.*?)<<<<(.*)/s;
# Der Rest ist dann die neue gesamte Konfiguration
$configs=$remain;
# die parameter für verbindungen zum host aus devices.txt lesen
open DEVICES, "<devices.txt" or die "\n\ncannot open devices.txt\n\n";
foreach (<DEVICES>) {
# steht am Anfang der Zeile (Kommentarzeile) ein # wird übersprungen
next if /^#/;
chomp;
# Zeile holen in der Verbindungsparameter für host stehen
if (/^$host/) {
# Parameter splitten
($host,$ssh_opt,$user,$pass) = split /\|/;
$pwtxt="from config";
# Wenn als Passwort ENV:SSHPASS angegeben ist,
if ($pass eq "ENV:SSHPASS") {
# Inhalt der Umgebungsvariablen SSHPASS als PW nutzen
$pass = $ENV{'SSHPASS'};
$pwtxt="from ENV:SSHPASS";
}
# vorhandene ssh Parameter werden angenommen
# ist Zeichenkette leer: keine Paramter
my $o=1; $o=0 if $ssh_opt eq "";
# das expect skript dazu bauen
# host, dessen konfig und Schalter ob ssh Parameter verwendet werden
write_exp ($host, $config, $o);
}
}
close DEVICES;
# wenn keine Zeile in devices für host gefunden wurde oder es wurde
# kein User und/oder Passwort angegeben: Fehler und Tschüss
if ($user eq "" or $pass eq "") {
die "\n\nno user or password for host $host\n\n";
}
# Logfile erstellen wird expect weiter gefüllt
open LOG, ">$logfile";
printf LOG "!\n! Let's have a look at host $host\n!\n\n";
# alles soweit korrekt dann konfig durchführen
($o1,$o2)=split/ /, $ssh_opt;
print "Start expect with parameters\n\tscript run.exp\n\tlogfile $logfile\n\thost $host\n\tuser $user\n\tpassword *hidden* $pwtxt\n\nssh Options used\n\t-oStrictHostKeyChecking=no\n\t-oUserKnownHostsFile=/dev/null\n\t$o1\n\t$o2\n\n";
printf LOG "Start expect with parameters\n\tscript run.exp\n\tlogfile $logfile\n\thost $host\n\tuser $user\n\tpassword *hidden* $pwtxt\n\nssh Options used\n\t-oStrictHostKeyChecking=no\n\t-oUserKnownHostsFile=/dev/null\n\t$o1\n\t$o2\n\n";
close LOG;
`$expect run.exp $logfile $host $user $pass $ssh_opt`;
}
unlink "run.exp";
# Funktion zum erstellen der run.exp
sub write_exp {
my ($host,$config,$options)=@_;
open FILE, ">run.exp"; # Neue run.exp
printf FILE <<'EOFILE1'; # run.exp füllen
#!/usr/bin/expect -f
set timeout 20
log_file [lindex $argv 0]
set host [lindex $argv 1]
set user [lindex $argv 2]
set pass [lindex $argv 3]
set ssh1 [lindex $argv 4]
set ssh2 [lindex $argv 5]
set ssh3 [lindex $argv 6]
EOFILE1
close FILE; # Datei schließen
open FILE, ">>run.exp"; # an run.exp anhängen
# ssh optionen vorhanden, daher ssh Aufruf mit diesen Parametern in run.exp schreiben
if ($options == 1) { printf FILE 'spawn ssh $host -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -l $user $ssh1 $ssh2 $ssh3' . "\n"; }
# ssh optionen nicht vorhanden, daher ssh ohne Parameter in run.exp schreiben
if ($options == 0) { printf FILE 'spawn ssh $host -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -l $user' . "\n"; }
close FILE; # Datei schließen
my @conf=split /\n/, $config;
foreach (@conf) {
chomp;
s/\/\/.*//; # Kommentare entfernen
s/\s*$//g; # Leerzeichen am Zeilenende entfernen
($semi) = $_ =~ /(;*)$/; # Semikolons ausschneiden
my $count=length($semi); # Anzahl Semikolons
s/;*$//; # Semikolons entfernen
for ($i=1; $i<=$count; $i++) { # und durch Anzahl
$_=$_ .'\n'; # mal \n ersetzen; wichtig! ' verwenden
}
s/^s (.*)/send "$1\\n"/; # s durch send ersetzen und " hinzufügen
s/^e (.*)/expect "$1"/; # e durch expect ersetzen und " hinzufügen
$_=$_ . "\n"; # Zeilenumbruch anhängen; wichtig! " verwenden
}
open FILE, ">>run.exp"; # Expect Befehle in run.exp schreiben
foreach (@conf) { printf FILE $_; }
printf FILE "interact\n"; # Expect abschließen
close FILE; # run.exp schließen
}