diff --git a/fon/fon.pl b/fon/fon.pl new file mode 100755 index 0000000..c7c1185 --- /dev/null +++ b/fon/fon.pl @@ -0,0 +1,230 @@ +#!/usr/bin/perl -w +use strict; +use Data::Dumper; +use MIME::Base64; +use Encode; +use utf8; + +binmode(STDOUT, ":utf8"); + +my %multichar; +my %escapechar; + +my $cache = 'ldap.dump'; +my $USECACHE = 0; + +my %L; +my %O; +my %M; + +my $SRCH = shift || '.'; + +get_ldap_addressbook( \%L ); + +for my $l ( sort { lc( $L{$a}->{sn} ) cmp lc( $L{$b}->{sn} ) } keys %L ) { + if ( match_entry( $SRCH, $L{$l} ) >= 0 ) { + push_entry( $L{$l} ); + } +} + +my @order = ( 'name', 'room', 'fone', 'mail' ); + +exit unless exists($O{name}); + +my $e = scalar( @{ $O{name} } ) - 1 ; + +for my $i ( 0 .. $e ) { + + for my $k (@order) { + printf "%-*s ",$M{$k}, $O{$k}[$i]; +# print substr( $O{$k}[$i] . ( '.' x $M{$k}) , 0, $M{$k} ) . ' '; + } + printf "\n"; + +} + +exit; + +sub match_entry { + my ( $SRCH, $e ) = @_; + my $srch = simplify($SRCH); + my @searchentries = ( 'sn', 'givenName', 'telephoneNumber', 'roomNumber', 'mail' ); + + my $LL = join( ' ', map { join( ' ', @{ $e->{$_} } ) } @searchentries ); + my $ll = simplify($LL); + + return index( $ll, $srch ); +} + +sub simplify { + my $S = shift; + my $s = s2a( lc $S ); + return $s; +} + +sub len { + return length(Encode::encode_utf8(shift)); +} + +sub push_entry { + my $e = shift; + my $t; + my $l; + $t = join( '/', @{ $e->{sn} } ) . ", " . join( '/', @{ $e->{givenName} } ); + $l = len($t); + push @{ $O{name} }, $t; + $l > ( $M{name} || 0 ) and $M{name} = $l; + + + $t = join( '/', map {s/\(.*?\)|Betriebsarztraum|\s+//g;$_} @{ $e->{roomNumber} } ); + $l = len($t); + push @{ $O{room} }, $t; + $l > ( $M{room} || 0 ) and $M{room} = $l; + + $t = join( '/', map {s/\(.*?\)|\s+//g;s/\+49/0/;$_} @{ $e->{telephoneNumber} } ); + $l = len($t); + push @{ $O{fone} }, $t; + $l > ( $M{fone} || 0 ) and $M{fone} = $l; + + $t = join( ', ', map {s/molgen\.mpg\.de//g;$_} @{ $e->{mail} } ); + $l = len($t); + push @{ $O{mail} }, $t; + $l > ( $M{mail} || 0 ) and $M{mail} = $l; +} + +sub exec_ldapsearch { + my (@args) = @_; # eg 'ldapsearch' + my $command = '/package/ldap/openldap/bin/ldapsearch'; + my @ARGS = ( '-x', '-H', 'ldap://ldap.molgen.mpg.de/', '-ZZ', '-o', 'ldif-wrap=no' ); + exec $command, @ARGS, @args; + die "exec failed: $!\n"; +} + +# +# ldapsearch -x -H ldap://ldap.molgen.mpg.de/ -ZZ -b "dc=addressbook,dc=apps,dc=molgen,dc=mpg,dc=de" +# + +sub get_ldap_addressbook { + my $L = shift; + my @LDAP; + if ( $USECACHE and -s $cache ) { + open C, '<', $cache or die "$!"; + push @LDAP, (); + close C; + } + else { + open C, '>', $cache or die "$!"; + + my $pid = open P, '-|'; + defined $pid or die "$!\n"; + $pid or exec_ldapsearch( '-b', 'dc=addressbook,dc=apps,dc=molgen,dc=mpg,dc=de' ); + binmode P, ':utf8'; + + while (

) { + print C $_; + push @LDAP, $_; + } + close P; + close C; + $? and die "get_ldap_addressbook() failed\n"; + } + my ($uid) = (''); + + my @addlist = ( 'sn', 'givenName', 'mail', 'roomNumber', 'collectionId', 'telephoneNumber' ); + for (@LDAP) { + chomp; + my $l = $_; + if ( $l =~ m{^# } and $uid ne '' ) { + map { + unless ( exists( $$L{$uid}->{$_} ) ) { + push @{ $$L{$uid}->{$_} }, '-'; + } + } @addlist; + $uid = ''; + } + map { + if ( my ( $op, $v ) = $l =~ m{^$_(::?)\s*(.+)} ) { + $op eq '::' and $v = decode('utf8',decode_base64($v)); + die "$uid -> $_\n" unless defined($v); + push @{ $$L{$uid}->{$_} }, $v; + } + } @addlist; + if ( $l =~ /^uid:\s+(.*)/ ) { + $uid = $1; + next; + } + } + return; +} + +sub s2a { + $_ = shift; + s/(\xc2|\xc3)(.)/$multichar{$1}{$2}||$1.$2/eg; + s/([^a-z0-9])/$escapechar{$1}||$1/eg; + return $_; +} + +BEGIN { + %multichar = ( + "\xc2" => { "\xb4" => "'", }, + "\xc3" => { + "\x9f" => 'ss', + "\xa4" => 'ae', + "\xa5" => 'a', + "\xa8" => 'e', + "\xa9" => 'e', + "\xb6" => 'oe', + "\xbc" => 'ue', + }, + ); + %escapechar = ( + "\x82" => 'e', + "\x86" => 'a', + "\x88" => 'e', + "\x8a" => 'e', + "\x87" => 'c', + "\x92" => '\'', # \0222 + "\x97" => 'u', + "\x9a" => 'Ue', + "\xb0" => 'o', + "\xe5" => 'a', + "\xf1" => 'n', + "\xf2" => 'o', + "\xf3" => 'o', + "\xf8" => 'o', + "\xf9" => 'u', + "\201" => 'ue', + "\202" => 'e', + "\205" => 'A', + "\204" => 'ae', + "\220" => 'E', + "\224" => 'oe', + "\241" => 'i', # ! inverted + "\242" => 'c', # ! c/ + "\244" => 'n', + "\264" => '\'', + "\304" => 'Ae', + "\311" => 'E', + "\312" => 'E', + "\323" => 'O', + "\326" => 'Oe', + "\334" => 'Ue', + "\337" => 'ss', + "\340" => 'a', + "\341" => 'ss', # + "\342" => 'a', + "\344" => 'ae', + "\347" => 'c', + "\350" => 'e', + "\351" => 'e', # + "\352" => 'e', + "\355" => 'i', + "\357" => 'i', + "\366" => 'oe', + "\372" => 'u', + "\373" => 'u', + "\374" => 'ue', + "\364" => 'o', + ); + +} diff --git a/install.sh b/install.sh index 110ca0d..34eb2de 100755 --- a/install.sh +++ b/install.sh @@ -169,7 +169,7 @@ install_exec uvpn/uvpn "$DESTDIR$usr_bindir/uv install_exec mxmount/mxmount "$DESTDIR$usr_bindir/mxmount" install_data mxmount/mxmount.service "$DESTDIR$systemdunitdir/mxmount.service" install_exec hostconfig/hostconfig "$DESTDIR$usr_sbindir/hostconfig" -install_exec fon/fon.sh "$DESTDIR$usr_bindir/fon" +install_exec fon/fon.pl "$DESTDIR$usr_bindir/fon" install_exec nfsdtop/nfsdtop "$DESTDIR$usr_sbindir/nfsdtop" install_data serial-log/serial-log\@.service "$DESTDIR$systemdunitdir/serial-log@.service" install_exec serial-log/serial-log "$DESTDIR$usr_exec_prefix/libexec/serial-log"