From e074d4da25ecc1baa59de4208ca878eb3dac48b5 Mon Sep 17 00:00:00 2001 From: cajus Date: Tue, 19 Jan 2010 07:59:19 +0000 Subject: [PATCH] Added missing goAgent.pl from 2.5.19. Closes #815 git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@15188 594d385d-05f5-0310-b6e9-bd551577e9d8 --- gosa-plugins/squid/contrib/goAgent.pl | 225 ++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 gosa-plugins/squid/contrib/goAgent.pl diff --git a/gosa-plugins/squid/contrib/goAgent.pl b/gosa-plugins/squid/contrib/goAgent.pl new file mode 100644 index 000000000..41b991e24 --- /dev/null +++ b/gosa-plugins/squid/contrib/goAgent.pl @@ -0,0 +1,225 @@ +#!/usr/bin/perl +# +# Igor Muratov +# +# Find changes at LDAP and put this to filesystem +# +# +# Igor Muratov +# 20041004 +# - Added rebuildVirtual function +# +# Igor Muratov +# 20040617: +# - Changed search fiter to exclude gosaUserTemplate entries +# +# Simon Liebold : +# 20040617: +# - Changed $TS_FILE-location +# +# $Id: goAgent.pl,v 1.4 2004/11/19 21:46:56 migor-guest Exp $ +# + +use strict; +use Net::LDAP; + +my $LDAP_HOST='localhost'; +my $LDAP_PORT='389'; +my $LDAP_BASE='dc=example,dc=com'; +#my $LDAP_USER='cn=admin,dc=example,dc=com'; +#my $LDAP_PASS='secret'; + +my $HOME_DIR='/home'; +my $TS_FILE='/tmp/gosa_timestamp'; +my $KEYS_DIR='/etc/openssh/authorized_keys2'; +my $MAIL_DIR='/var/spool/mail'; +my $VLOCAL='/etc/postfix/virtual_local'; +my $VFORWARD='/etc/postfix/virtual_forward'; +my ($ldap, $mesg, $entry); +my $virtuals = 0; + +# Anonymous bind to LDAP +sub anonBind +{ + my $ldap = Net::LDAP->new( $LDAP_HOST, port => $LDAP_PORT ); + my $mesg = $ldap->bind(); + $mesg->code && die $mesg->error; + return $ldap; +} + +# Bind as LDAP user +#sub userBind +#{ +# my $ldap = Net::LDAP->new( $LDAP_HOST, port => $LDAP_PORT ); +# my $mesg = $ldap->bind($LDAP_USER, password=>$LDAP_PASS); +# $mesg->code && die $mesg->error; +# return $ldap; +#} + +# Read timestamp +sub getTS +{ + open(F, "< $TS_FILE"); + my $ts = ; + chop $ts; + $ts ||= "19700101000000Z"; + return $ts; +} + +# save timestamp +sub putTS +{ + my $ts = `date -u '+%Y%m%d%H%M%SZ'`; + open(F, "> $TS_FILE"); + print F $ts; +} + +sub rebuildVirtuals +{ + print "Rebuild virtuals table for postfix\n"; + $mesg = $ldap->search( + base => $LDAP_BASE, + filter => "(&(objectClass=gosaMailAccount)(gosaMailDeliveryMode=[*L*])(|(mail=*)(gosaMailAlternateAddress=*)))", + attrs => [ + 'mail', + 'uid', + 'gosaMailForwardingAddress', + 'memberUid' + ], + ); + + # Work if changes is present + open(VIRT, "> $VLOCAL"); + foreach my $entry ($mesg->all_entries) + { + foreach my $addr ($entry->get_value('mail')) + { + print VIRT "$addr\t"; + print VIRT join(",", ( + $entry->get_value("uid"), + $entry->get_value("gosaMailForwardingAddress"), + $entry->get_value("memberUid"), + )); + print VIRT "\n"; + } + } + close(VIRT); + `postmap $VLOCAL`; + + $mesg = $ldap->search( + base => $LDAP_BASE, + filter => "(&(objectClass=gosaMailAccount)(!(gosaMailDeliveryMode=[*L*]))(|(mail=*)(gosaMailAlternateAddress=*)))", + attrs => [ + 'gosaMailForwardingAddress', + ], + ); + + # Work if changes is present + open(VIRT, "> $VFORWARD"); + foreach my $entry ($mesg->all_entries) + { + foreach my $addr ($entry->get_value('mail')) + { + print VIRT "$addr\t"; + print VIRT join(",", ( + $entry->get_value("gosaMailForwardingAddress"), + )); + print VIRT "\n"; + } + } + close(VIRT); + `postmap $VFORWARD`; +} + +sub posixAccount +{ + my $entry = shift; + my $uid = ($entry->get_value('uid'))[0]; + my $home = ($entry->get_value('homeDirectory'))[0]; + my $uidNumber = ($entry->get_value('uidNumber'))[0]; + my $gidNumber = ($entry->get_value('gidNumber'))[0]; + + print "Update posixAccount: $uid\n"; + `install -dD -m0701 -o$uidNumber:$gidNumber $home`; + #`install -d -m0700 -o$uidNumber:$gidNumber $home/.ssh`; + #`install -d -m0751 -o$uidNumber:$gidNumber $home/.public_html`; + print "\tEntry ".$entry->dn()." updated\n"; +} + +# Get ssh keys and place to system directory +sub strongAuthenticationUser +{ + my $entry = shift; + my $uid = ($entry->get_value('uid'))[0]; + open(KEYS, "> $KEYS_DIR/$uid"); + print KEYS $_ foreach ($entry->get_value('userCertificate;binary')); +} + +# Create mailbox if need +sub inetLocalMailRecipient +{ + my $entry = shift; + my $uid = ($entry->get_value('uid'))[0]; + my $mail = ($entry->get_value('mailLocalAddress'))[0]; + my $addr = ($entry->get_value('mailRoutingAddress'))[0]; + my $uidNumber = ($entry->get_value('uidNumber'))[0]; + my $mailbox = "$MAIL_DIR/$uid"; + + print "Update inetLocalMailRecipient: $mail\n"; + if( $uid eq $addr ) + { + if( -f "$mailbox" ) + { + print "Warning: mailbox $mailbox alredy exists. No changes.\n"; + } else { + `install -m660 -o$uidNumber -gmail /dev/null $mailbox`; + } + } + print "\tEntry ".$entry->dn()." updated\n"; +} + +sub disassemble +{ + my $entry = shift; + + foreach my $attr ($entry->get_value('objectClass')) + { + if( $attr eq "posixAccount" ) { + posixAccount($entry); + } elsif( $attr eq "inetLocalMailRecipient" ) { + inetLocalMailRecipient($entry); + } elsif( $attr eq "strongAuthenticationUser" ) { + strongAuthenticationUser($entry); + } elsif( $attr eq "gosaMailAccount" ) { + $virtuals++; + } + } +} + +# +# Start main process +# + +# Read timestamp from file +my $ts = getTS; + +$ldap = anonBind; +$mesg = $ldap->search( + base => $LDAP_BASE, + filter => "(&(modifyTimestamp>=$ts)(!(objectClass=gosaUserTemplate)))" +); + +# Put timestamp to file +putTS; + +# Work if changes is present +if($mesg->count > 0) +{ + print "Processing records modified after $ts\n\n"; + + foreach my $entry ($mesg->all_entries) + { + disassemble($entry); + } + rebuildVirtuals if $virtuals; +} -- 2.30.2