Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12046[/thread]

Konfigurationsdateien abgleichen



<< >> 3 Einträge, 1 Seite
MFL
 2008-06-19 11:33
#111253 #111253
User since
2008-01-28
2 Artikel
BenutzerIn
[default_avatar]
Hallo Zusammen!

Ich habe folgendes Problem:
Ich habe eine Konfigurationsdatei von einem Router, bei der sich gewisse Teile nicht verändern dürfen.
Mit Hilfe eines Perl-Scripts wollte ich prüfen, ob diese Teile in einer aktuellen Konfiguration wirklich nicht verändert sind.

Meine Idee war, dass ich mir eine bereinigte Konfiguration nehme, in der nur die Zeilen stehen, die auch vorhanden sein müssen. Ich gleiche dann jede Zeile einer neuen (kompletten) Konfioguration mit jeder Zeile der bereinigten Konfiguration ab.
Wenn sich zwei Zeilen gleichen, wird diese identische Zeile in ein Tempfile geschrieben.
Dementsprechend sollte sich im tempfile nach dem Durchlauf der selbe Inhalt wie in der bereinigten Konfiguration befinden, vorausgesetzt die neue Konfiguration beinhaltet alle nötigen Zeilen.


Um zu verdeutlichen, wie das funktionieren soll, hier ein Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
##############
# new_conf

albert
peter
johann
rolf
karin
steffen

##############
# bereinigt

albert
peter
karin

##############
# tempfile

albert (in beiden vorhanden)
peter (in beiden vorhanden)
karin (in beiden vorhanden)


Um dies zu überprüfen führe ich einen diff aus. Leider ergibt sich das Problem, dass gewisse Teile doppelt im tempfile stehen. Somit gleichen sich tempfile und bereinigte Konfiguration nicht, obwohl die zu prüfende Konfiguration in Ordnung ist.

Das tempfile sieht dann so aus:

Code: (dl )
1
2
3
4
5
6
7
8
###############
# tempfile

albert
peter
peter
karin
karin


Ich habe keine Ahnung, was ich dagegen tun kann, weiß hier jemand abhilfe?

Im Anschluss noch mein Code:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/perl

open(GOODFILE,"<good.txt");
@GOOD_LINES = <GOODFILE>;
close(GOODFILE);

open(CHECKFILE,"<check.txt");
@CHECKLINES = <CHECKFILE>;
close(CHECKFILE);

chomp(@GOOD_LINES);
chomp(@CHECKLINES);

foreach $GOODLINE (@GOOD_LINES) {

foreach $CHECKLINE (@CHECKLINES) {

if ( $GOODLINE eq $CHECKLINE ) {
open (TEMPFILE, '>>temp.txt');
print TEMPFILE $GOODLINE."\n";
close (TEMPFILE);
}
}
}
system("/usr/bin/diff /good.txt /temp.txt > /dev/null");

if ( $? == 0 ) {
print "Config OK!"."\n";
}
else {
print "Config nicht OK!"."\n";
}



Dank und Gruß
Marcus


edit pq: code-tags hinzugefügt
pq
 2008-06-19 15:43
#111265 #111265
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bitte beim nächsten mal code-tags verwenden
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
murphy
 2008-06-19 17:31
#111271 #111271
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Wenn die Dateien klein genug sind, um leicht in den Speicher zu passen, würde ich das ja ganz anders lösen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;

my @good = do {
  open my $good, '<', $ARGV[0] // 'good.txt' or die "open(<good>): $!\n";
  <$good>;
};
chomp @good;

my %check = do {
  open my $check, '<', $ARGV[1] // 'check.txt' or die "open(<check>): $!\n";
  map { chomp; $_ => 1; } <$check>;
};

foreach (@good) {
  if (!$check{$_}) {
    print "Configuration lacks $_\n";
    exit 1;
  }
}

print "Configuration is ok\n";
exit 0;
When C++ is your hammer, every problem looks like your thumb.
<< >> 3 Einträge, 1 Seite



View all threads created 2008-06-19 11:33.