Thread Beratung: Vergleichen von Textdateien (20 answers)
Opened by Gast at 2005-05-17 18:23

pKai
 2005-05-17 19:52
#54992 #54992
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Ohne die von strat genannten Feinheiten, und nur eine Datei mit fehlenden nach "Spezifikation" erzeugend (Ich gebe auch keine objClass aus, da dies zwar im Beipiel impliziert, im Text aber nicht gefordert ist; Code für objClass-Ausgabe ist auskommentiert):
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use strict;
use warnings;

use Carp qw(croak);

use Net::LDAP::LDIF;

my ($fads, $fadam, $fout) = @ARGV;
my $Ads = read2hash($fads, 'sAMAccountName'); # strukturiert einlesen, siehe unten
my $Adam = read2hash($fadam, 'cn'); # Da dn kein Attribute ist -> cn


# Wenn nun der sAMAccountName eines User-Objektes(in dem Fall "muetz")
# aus der ADS im ADAM File nicht zu finden ist,

my @missing = grep { !defined $Adam->{lc $_} } keys %{$Ads};

my $targetOU = 'OU=BEREICH1,DC=wurstfabrik,DC=DE';

my $out = Net::LDAP::LDIF->new ($fout, 'w', 'die');

foreach my $misskey (@missing) {
my $ads = $Ads->{$misskey}; # Net::LDAP::Entry-Objekt
my $neu = Net::LDAP::Entry->new();
$neu->dn ("CN=$misskey,$targetOU");
#$neu->add (objClass => [qw/top person organizationalPerson user/]);
foreach my $att (qw/sn givenName company mail/) { # Zu übernehmende Attribute
my $val = $ads->get_value($att);
$neu->add ($att, $val) if length $val;
}
$out->write_entry ($neu);
}
$out->done();

sub read2hash {
my $file = shift; # Eingabe: Dateiname
my $keyname = shift; # Schlüssel für Referenzierung: 'sAMAccountName' oder 'cn'
my %hash; # Ausgabe: (Ref auf) Hash
my $n = 0;
my $ldif = Net::LDAP::LDIF->new ($file, 'r', 'die');
while(not $ldif->eof ()) {
my $entry = $ldif->read_entry ();
$n++;
if ($ldif->error ()) {
print STDERR "Error msg: ", $ldif->error (), "\n";
print STDERR "Error lines:\n", $ldif->error_lines (), "\n";
die "\n";
} else {
my $key = $entry->get_value ($keyname);
croak "Schluessel ($keyname) nicht vorhanden in Satz $n" unless $key;
$hash{lc $key} = $entry; # Net::LDAP:Entry-Objekt unter dem

# (klein geschriebenen ) Schlüssel speichern
}
}
return wantarray ? %hash : \%hash;
}

Aufruf mit ADS-Datei als erstem Parameter,
ADAM-Datei als zweitem und
Ausgabedatei (wird überschrieben) als drittem.

Ausgabedatei sieht dann nach Aufruf mit obigen ADS- und ADAM-Daten wie folgt aus:
Code: (dl )
1
2
3
4
5
dn: CN=muetz,OU=BEREICH1,DC=wurstfabrik,DC=DE
sn: Muetz
givenname: Holger
company: wurstfabrik
mail: [EMAIL=Holger.Muetz@wurstfabrik.DE]Holger.Muetz@wurstfabrik.DE[/EMAIL]
I sense a soul in search of answers.

View full thread Beratung: Vergleichen von Textdateien