Skip to content

Commit

Permalink
Merge pull request #170 from mariux64/fix-fon
Browse files Browse the repository at this point in the history
fon: introduce fon on steroids
  • Loading branch information
wwwutz authored Apr 23, 2021
2 parents 2f4d06f + fb8911a commit c55ba40
Show file tree
Hide file tree
Showing 2 changed files with 231 additions and 1 deletion.
230 changes: 230 additions & 0 deletions fon/fon.pl
Original file line number Diff line number Diff line change
@@ -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, (<C>);
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 (<P>) {
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', # <E1>
"\342" => 'a',
"\344" => 'ae',
"\347" => 'c',
"\350" => 'e',
"\351" => 'e', # <E9>
"\352" => 'e',
"\355" => 'i',
"\357" => 'i',
"\366" => 'oe',
"\372" => 'u',
"\373" => 'u',
"\374" => 'ue',
"\364" => 'o',
);

}
2 changes: 1 addition & 1 deletion install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down

0 comments on commit c55ba40

Please sign in to comment.