Shell Script / Perl para sincronizar base de usuários do AD com o Zimbra
Publicado por Daniel Santos 28/03/2009
[ Hits: 11.087 ]
Homepage: mypenguim.wordpress.com
Este script faz a sincronia dos usuários do Active Directory (AD) com a base de dados de usuários do Zimbra.
Basta configurar os arquivos .pl e .sh para atender as credenciais e variáveis de seu ambiente.
#!/bin/bash
#
# (c) Copyright by Daniel Santos (danlsgiga@yahoo.com.br)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# ( http://www.fsf.org/licenses/gpl.txt )
#####################################################################
# Replication of AD accounts to Zimbra-Postfix v2.0
cd /opt/zimbra/ReplicaAD
diffUsersFile=diffUsers
diffGroupsFile=diffGroups
ADUsersFile=ADUsersFile
ADGroupsFile=ADGroupsFile
ADGroupsFile_old=ADGroupsFile_old
ADUsersFile_old=ADUsersFile_old
LogReplicaAD=LogReplica.log
UsersDefaultPasswd="coloqueumasenhacomplicadaaqui"
# Update user data
./ReplicaUsersAD.pl 2> /dev/null
diff $ADUsersFile_old $ADUsersFile > $diffUsersFile
cp -f $ADUsersFile $ADUsersFile_old
# Update distribution groups data
./ReplicaGroupsAD.pl 2> /dev/null
diff $ADGroupsFile_old $ADGroupsFile > $diffGroupsFile
cp -f $ADGroupsFile $ADGroupsFile_old
# Create, Modify and Remove Accounts Functions
_createAccount()
{
date +%d"."%m"."%Y" - "%H":"%M":"%S >> $LogReplicaAD
echo "-------------------------- Replica AD - Criando conta $2 -------------------------" >> $LogReplicaAD
if [[ -z $3 ]]; then
zmprov ca "$2" "$UsersDefaultPasswd" displayName "$1" 2>&1>> $LogReplicaAD
else
quotaBytes=$(($3*1024*1024))
zmprov ca "$2" "$UsersDefaultPasswd" displayName "$1" zimbraMailQuota "$quotaBytes" 2>&1>> $LogReplicaAD
fi;
aliasExemplo=`echo $2 | awk -F'@' '{ print $1 }'`"@exemplo.com.br"
zmprov aaa "$2" "$aliasExemplo" 2>&1>> $LogReplicaAD
echo "$1" >> $LogReplicaAD
echo "$2" >> $LogReplicaAD
echo "$aliasExemplo" >> $LogReplicaAD
echo "$3""MB" >> $LogReplicaAD
echo "---------------------------- Replica AD - Conta $2 criada -------------------------" >> $LogReplicaAD
return
}
_modifyAccount()
{
date +%d"."%m"."%Y" - "%H":"%M":"%S >> $LogReplicaAD
echo "-------------------------- Replica AD - Modificando conta $2 ----------------------" >> $LogReplicaAD
if [ "$1" != "$4" ]; then
zmprov ma "$2" displayName "$4" 2>&1>> $LogReplicaAD
fi;
if [ "$3" != "$6" ]; then
quotaBytes=$(($6*1024*1024))
zmprov ma "$2" zimbraMailQuota "$quotaBytes" 2>&1>> $LogReplicaAD
fi;
if [ "$2" != "$5" ]; then
aliasExemplo=`echo $2 | awk -F'@' '{ print $1 }'`"@exemplo.com.br"
aliasExemploNovo=`echo $5 | awk -F'@' '{ print $1 }'`"@exemplo.com.br"
zmprov ra "$2" "$5" 2>&1>> $LogReplicaAD
zmprov raa "$5" "$aliasExemplo" 2>&1>> $LogReplicaAD
zmprov aaa "$5" "$aliasExemploNovo" 2>&1>> $LogReplicaAD
fi;
echo "$1" >> $LogReplicaAD
echo "$2" >> $LogReplicaAD
echo "$aliasExemplo" >> $LogReplicaAD
echo "$3""MB" >> $LogReplicaAD
echo "$4" >> $LogReplicaAD
echo "$5" >> $LogReplicaAD
echo "$aliasExemploNovo" >> $LogReplicaAD
echo "$6""MB" >> $LogReplicaAD
echo "---------------------------- Replica AD - Conta $2 modificada ---------------------" >> $LogReplicaAD
return
}
_removeAccount()
{
date +%d"."%m"."%Y" - "%H":"%M":"%S >> $LogReplicaAD
echo "-------------------------- Replica AD - Removendo conta $1 -------------------------" >> $LogReplicaAD
zmprov da "$1" 2>&1>> $LogReplicaAD
echo "$1" >> $LogReplicaAD
echo "---------------------------- Replica AD - Conta $1 removida ------------------------" >> $LogReplicaAD
return
}
_removeDistributionList()
{
date +%d"."%m"."%Y" - "%H":"%M":"%S >> $LogReplicaAD
echo "-------------------------- Replica AD - Removendo Distribution List $1 -------------------------" >> $LogReplicaAD
aliasExemplo=`echo $1 | awk -F'@' '{ print $1 }'`"@exemplo.com.br"
zmprov ddl "$1" 2>&1>> $LogReplicaAD
zmprov ddl "$aliasExemplo" 2>&1>> $LogReplicaAD
echo "$1" >> $LogReplicaAD
echo "$aliasExemplo" >> $LogReplicaAD
echo "---------------------------- Replica AD - Distribution List $1 removida ------------------------" >> $LogReplicaAD
return
}
_removeDistributionListMember()
{
date +%d"."%m"."%Y" - "%H":"%M":"%S >> $LogReplicaAD
echo "-------------------------- Replica AD - Removendo Membro da Distribution List $1 -------------------------" >> $LogReplicaAD
aliasExemplo=`echo $1 | awk -F'@' '{ print $1 }'`"@exemplo.com.br"
zmprov rdlm "$1" "$2" 2>&1>> $LogReplicaAD
zmprov rdlm "$aliasExemplo" "$2" 2>&1>> $LogReplicaAD
echo "$1" >> $LogReplicaAD
echo "$aliasExemplo" >> $LogReplicaAD
echo "$2" >> $LogReplicaAD
echo "---------------------------- Replica AD - Membro da Distribution List $1 removido ------------------------" >> $LogReplicaAD
return
}
_addDistributionList()
{
date +%d"."%m"."%Y" - "%H":"%M":"%S >> $LogReplicaAD
echo "-------------------------- Replica AD - Criando a Distribution List $1 -------------------------" >> $LogReplicaAD
aliasExemplo=`echo $1 | awk -F'@' '{ print $1 }'`"@exemplo.com.br"
zmprov cdl "$1" 2>&1>> $LogReplicaAD
zmprov cdl "$aliasExemplo" 2>&1>> $LogReplicaAD
echo "$1" >> $LogReplicaAD
echo "$aliasExemplo" >> $LogReplicaAD
echo "---------------------------- Replica AD - Distribution List $1 criada ------------------------" >> $LogReplicaAD
return
}
_addDistributionListMember()
{
date +%d"."%m"."%Y" - "%H":"%M":"%S >> $LogReplicaAD
echo "-------------------------- Replica AD - Adicionando Membro na Distribution List $1 -------------------------" >> $LogReplicaAD
aliasExemplo=`echo $1 | awk -F'@' '{ print $1 }'`"@exemplo.com.br"
zmprov adlm "$1" "$2" 2>&1>> $LogReplicaAD
zmprov adlm "$aliasExemplo" "$2" 2>&1>> $LogReplicaAD
echo "$1" >> $LogReplicaAD
echo "$aliasExemplo" >> $LogReplicaAD
echo "$2" >> $LogReplicaAD
echo "---------------------------- Replica AD - Membro adicionado na Distribution List $1 ------------------------" >> $LogReplicaAD
return
}
################################ Users AD Replication (BEGIN) ####################################
if [ -e $diffUsersFile ]; then
while read LINHA; do
if [ "${LINHA:0:1}" = "<" ]; then
nomeUsuario=`echo $LINHA | sed 's/< //g' | awk -F',' '{ print $1 }'`
emailUsuario=`echo $LINHA | sed 's/< //g' | awk -F',' '{ print $2 }'`
quotaUsuario=`echo $LINHA | sed 's/< //g' | awk -F',' '{ print $3 }'`
if [ `egrep "$nomeUsuario|$emailUsuario" $diffUsersFile | grep -c "^>"` = "1" ]; then
nomeUsuarioAlterado=`egrep "$nomeUsuario|$emailUsuario" $diffUsersFile | grep "^>" | sed 's/> //g' | awk -F',' '{ print $1 }'`
emailUsuarioAlterado=`egrep "$nomeUsuario|$emailUsuario" $diffUsersFile | grep "^>" | sed 's/> //g' | awk -F',' '{ print $2 }'`
quotaUsuarioAlterado=`egrep "$nomeUsuario|$emailUsuario" $diffUsersFile | grep "^>" | sed 's/> //g' | awk -F',' '{ print $3 }'`
_modifyAccount "$nomeUsuario" "$emailUsuario" "$quotaUsuario" "$nomeUsuarioAlterado" "$emailUsuarioAlterado" "$quotaUsuarioAlterado"
else
_removeAccount "$emailUsuario"
fi;
elif [ "${LINHA:0:1}" = ">" ]; then
nomeUsuario=`echo $LINHA | sed 's/> //g' | awk -F',' '{ print $1 }'`
emailUsuario=`echo $LINHA | sed 's/> //g' | awk -F',' '{ print $2 }'`
quotaUsuario=`echo $LINHA | sed 's/> //g' | awk -F',' '{ print $3 }'`
if [ `egrep "$nomeUsuario|$emailUsuario" $diffUsersFile | grep -c "^<"` = "0" ]; then
_createAccount "$nomeUsuario" "$emailUsuario" "$quotaUsuario"
fi;
fi;
done < $diffUsersFile
fi;
################################ Users AD Replication (END) ####################################
########################## Distribution Groups AD Replication (BEGIN) ##########################
if [ -e $diffGroupsFile ]; then
while read LINHA; do
if [ "${LINHA:0:1}" = "<" ]; then
emailGrupo=`echo $LINHA | sed 's/< //g' | awk -F'#' '{ print $1 }'`
emailUsuariosAD=`echo $LINHA | sed 's/< //g' | awk -F'#' '{ print $2 }'`
if [ `grep "$emailGrupo" $diffGroupsFile | grep -c "^>"` = "1" ]; then
emailUsuariosAlterado=`grep "$emailGrupo" $diffGroupsFile | grep "^>" | sed 's/> //g' | awk -F'#' '{ print $2 }'`
emailsZimbra=`zmprov gdl $emailGrupo | grep zimbraMailForwardingAddress: | sed 's/zimbraMailForwardingAddress: //g'`
arrayEmail=`echo $emailUsuariosAlterado | awk '{ split($0,a,","); for (i in a) print a[i] }'`
for i in $emailsZimbra; do
if [ "`echo $emailUsuariosAlterado | grep -c $i`" != "1" ]; then
_removeDistributionListMember "$emailGrupo" "$i"
fi;
done
for i in $arrayEmail; do
if [ "`echo $emailsZimbra | grep -c $i`" != "1" ]; then
_addDistributionListMember "$emailGrupo" "$i"
fi;
done
else
_removeDistributionList "$emailGrupo"
fi;
elif [ "${LINHA:0:1}" = ">" ]; then
emailGrupo=`echo $LINHA | sed 's/> //g' | awk -F'#' '{ print $1 }'`
if [ `grep "$emailGrupo" $diffGroupsFile | grep -c "^<"` = "0" ]; then
emailUsuariosAD=`echo $LINHA | sed 's/> //g' | awk -F'#' '{ print $2 }'`
_addDistributionList "$emailGrupo"
arrayEmail=`echo $emailUsuariosAD | awk '{ split($0,a,","); for (i in a) print a[i] }'`
for i in $arrayEmail; do
_addDistributionListMember "$emailGrupo" "$i"
done
fi;
fi;
done < $diffGroupsFile
fi;
########################## Distribution Groups AD Replication (END) ########################
slackpigs - veja os pacotes que mais ocupam espaço no Slackware
zsh: Validar IPv4 utilizando PCRE
Cadastrando usuários para email no Slackware de forma mais simples
Firewall - Satefull inspection com NAT
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como verificar a saúde dos discos no Linux
Como instalar , particionar, formatar e montar um HD adicional no Linux?
Como automatizar sua instalação do Ubuntu para desenvolvimento de software.
Servidor Ubuntu 24.04 HD 500 não tenho espaço na \home\adminis... (6)
Dá para criar um bom jogo usando a linguagem de programação C? (2)
Fiz uma pergunta no fórum mas não consigo localizar (8)
E como programar um sistema operacional inspirado no próprio linux usa... (3)









