#!/usr/bin/perl -w # by Aleksander Adamowski # śro kwi 27 19:55:55 CEST 2005: initial version # Tue May 24 18:49:00 CEST 2005: multi ADD # # update_ldap.pl SET pole='wartosc' WHERE '(FILTR_LDAP)' # update_ldap.pl ADD pole='wartosc'[,pole2='wartosc2',...] WHERE '(FILTR_LDAP)' # update_ldap.pl REPLACE pole='wartosc' WITH pole='nowa_wartosc' WHERE '(FILTR_LDAP)' use Net::LDAP; use strict; if (scalar(@ARGV) < 4 || ($ARGV[2] ne 'WHERE' && $ARGV[2] ne 'WITH')) { print <new($uri) or die "$@"; my $mesg = $ldap_source->bind( $manager_dn, password => $rootpw); if ($mesg->code != 0) { print "LDAP Error! ".$mesg->error."\n"; die "Error:>\n".$mesg->error."\n"; } else { print "Zalogowano do serwera LDAP $uri jako $manager_dn. Bazowy DN to $base_dn.\n\nSzukanie kont...\n"; } my $oper = $ARGV[0]; my $filter = undef; if ($oper eq 'REPLACE') { $filter = $ARGV[5]; } else { $filter = $ARGV[3]; } if (!defined($filter)) { die "nieprawidlowy filtr!\n" }; my $result = $ldap_source->search(filter => $filter, base => $base_dn); my @entries = $result->entries; my $count = scalar(@entries); if ($count <= 0) { die "Znaleziono $count obiektow.\n"; } print "Liczba zmienianych obiektow: $count\n\n"; print "Czy kontunuowac? Dla potwierdzenia wpisz 'ok': "; chomp(my $chosen = ); print "\n"; if ($chosen ne 'ok') { die "Nie wpisano 'ok', operacja odwolana.\n"; } print "\n"; if ($oper eq 'SET') { # Ustawiamy atrybut na pojedyncza wartosc: if ($ARGV[1] =~ /^([a-zA-Z0-9]+)\=(.*)$/) { my $attr = $1; my $value = $2; print "Ustawiam <$attr> na <$value> w $count obiektach:\n"; my $entry; foreach $entry (@entries) { print $entry->dn; $entry->replace($attr => $value); $mesg = $entry->update($ldap_source); if ($mesg->code != 0) { print "LDAP Error! ".$mesg->error; } print "\n"; } } else { die "Niepoprawna skladnia:\n".$ARGV[1]."\n"; } } elsif ($oper eq 'ADD') { # Dodajemy wartosc do atrybutow: my @adders; if ($ARGV[1] =~ /,/) { # wiele zlecen dodania rozdzielonych przecinkami: @adders = split /,/, $ARGV[1]; } else { @adders = ($ARGV[1]); } my $entry; print "Dodaje wartosci do ".scalar(@entries)." obiektow\n"; foreach $entry (@entries) { print $entry->dn.":\n"; foreach my $adder (@adders) { if ($adder =~ /^([a-zA-Z0-9]+)\=([^,]*)$/) { my $attr = $1; my $value = $2; print " dodaje do <$attr> wartosc <$value>\n"; $entry->add($attr => $value); } else { die "Niepoprawna skladnia:\n".$adder."\n"; } } $mesg = $entry->update($ldap_source); if ($mesg->code != 0) { print " LDAP Error! ".$mesg->error."\n"; } else { print " OK\n"; } } } elsif ($oper eq 'REPLACE') { # Zamieniamy w polu wystapienie danej wartosci inna wartoscia: if ($ARGV[1] =~ /^([a-zA-Z0-9]+)\=(.*)$/) { my $attr = $1; my $oldvalue = $2; if ($ARGV[3] =~ /^([a-zA-Z0-9]+)\=(.*)$/) { my $newattr = $1; my $newvalue = $2; if ($attr ne $newattr) { die "$attr oraz $newattr nie sa zgodne!\n"; } print "Zmieniam dla atrybutu <$attr> wartosc <$oldvalue> (o ile istnieje) na <$newvalue> w $count obiektach:\n"; my $entry; my $replacement_count = 0; foreach $entry (@entries) { #$entry->add($attr => $value); my @values = $entry->get_value($attr); my @values_out = (); my $found = 0; foreach my $value (@values) { if ($value eq $oldvalue) { #print " znaleziono $oldvalue, podmiana na $newvalue; "; push @values_out, $newvalue; $found = 1; } else { push @values_out, $value; } } if ($found) { print $entry->dn; $entry->replace($attr => \@values_out); print ': zaktualizowano do: '.join(', ', $entry->get_value($attr)); $replacement_count++; $mesg = $entry->update($ldap_source); if ($mesg->code != 0) { print "LDAP Error! ".$mesg->error; } print "\n"; } } print "Podsumowanie: zaktualizowano $replacement_count wartosci.\n"; } else { die "Niepoprawna skladnia celu:\n".$ARGV[3]."\n"; } } else { die "Niepoprawna skladnia zrodla:\n".$ARGV[1]."\n"; } } else { print "nieznana operacja: $oper\n"; } print "\n"; }