Wieviel den noch nebenher?
Es ist einigen bekannt, dass ich nicht gerade als Programmierer glänze.
Das kann damit einher gehen das ich nicht der größte Freund von
entwickelnden Admin oder administrierenden Entwicklern bin, jeder geht
Lösungen gern anders an. Die Notlösung wenn es nicht geht es als Root
laufen zu lassen ist nur bedingt befriedigend. Ich schreibe mir kleine
Scripte die für mich die Aufgaben erledigen damit ich meinen geliebten
Kaffee schlürfen kann und dabei mich auf SPAM umschauen kann oder
versuche Webcomis zu verstehen.
Letztens hatte ich fast die Befürchtung das ich meinen warmen Kaffe stehen lassen müsste und was machen müsste. Die Aufgabe der Umzug von mehren tausend Emailpostfächern von einem Server zu einen anderen.
Der Helfer der einem da gleich ein fällt ist Imapsync. Seit einiger seit schon ein Quasistandart auch wenn sich weitere Mitstreiter empfehlen Da haste nicht gekleckert, trainiert als gäbe es kein morgen mehr war imapsync mein Helfer der Wahl.
Die IMAP-Server waren jeweil ein Courier, bei dem mir nicht klar wurde ob ich einen Superuseracccount für die Migration nützen könnte. Ich entschloss mich einfach für jeden User einen Migrationsuser mit jeweils mir bekannten Passwort anzulegen.
Userer User werden in einem LDAP gehalten, dort wollte ich die migrationsuser aufkeinen Fall haben, die Einbindung einer weiteren authmethode lösste diese Problem
zzzz
Letztens hatte ich fast die Befürchtung das ich meinen warmen Kaffe stehen lassen müsste und was machen müsste. Die Aufgabe der Umzug von mehren tausend Emailpostfächern von einem Server zu einen anderen.
Der Helfer der einem da gleich ein fällt ist Imapsync. Seit einiger seit schon ein Quasistandart auch wenn sich weitere Mitstreiter empfehlen Da haste nicht gekleckert, trainiert als gäbe es kein morgen mehr war imapsync mein Helfer der Wahl.
Die IMAP-Server waren jeweil ein Courier, bei dem mir nicht klar wurde ob ich einen Superuseracccount für die Migration nützen könnte. Ich entschloss mich einfach für jeden User einen Migrationsuser mit jeweils mir bekannten Passwort anzulegen.
Userer User werden in einem LDAP gehalten, dort wollte ich die migrationsuser aufkeinen Fall haben, die Einbindung einer weiteren authmethode lösste diese Problem
#!/bin/bash
ldapsearch_output="ldapsearch_output"
searchstring="gidNumber"
#Enthält die Daten der User die Migriert werden soll
maildaten="migration_accounts.csv"
logpfad="/opt/mig/scripte/create_userdb"
log=$logpfad/mkuserdb_$(date +%s).log
ldap_host="example.de"
ldap_user="uid=mmuster,ou=intern,o=example.de"
ldap_pwd="xxx"
ldap_base="o=example.de"
search="uidNumber gidNumber maildir"
mig_pwd=""
if [[ ! -d $logpfad ]]
then
mkdir -p $logpfad
fi
if [[ -f $maildaten ]]
then
while read line
do
uid=$(echo $line| cut -f12 -d",")
filter="(uid="$uid")"
#pwd in crypt und maskiert
mig_pwd=$(echo $line| cut -f17 -d",")
status=$(echo $line| cut -f3 -d",")
if [[ $status -gt 4 ]]
then
echo " [400] Status !< 5" | tee -a $log
else
# if [[ -n $uid ]] || [[ $uid == "" ]]
if [[ -n "$uid" ]] || [[ $uid != "" ]]
then
#im Ldap nach uidnummer gidnummer homedir suchen
search=$(ldapsearch -h $ldap_host -D "$ldap_user" -w $ldap_pwd -b
\\$ldap_base -LLL "$filter" $search | tee $ldapsearch_output)
if [[ $? == 0 ]] && [[ $(grep -c \\
"$searchstring" $ldapsearch_output) -eq 1 ]]
then
add=$(echo $search | sed 's/dn: uid=/userdb default\//; \\
s/,.*uid/-migration set uid/;s/uidNumber: /uid=/;s/gidNumber: /gid=/;\\
s/maildir: /home=/; s/$/ systempw=$mig_pwd')
echo "$add" >> create_userdb4couri
$add
if [[ $? != 0 ]]
then
echo "[500] Eintrag von $uid in die Userdb nicht erfolgreich"\\
| tee -a $log
else
echo "[200] Eintrag von $uid in die Userdb erfolgreich"\\
| tee -a $log
fi
else
echo "[502] Probleme bei der LDAP-Abfrage " | tee -a $log
fi
else
echo "[404] keine Uid gefunden in $line " | tee -a $log
fi
fi
done < $maildaten
cd /etc/courier/
makeuserdb
else
echo "[404] Maildaten fehlen" | tee -a $log
exit 1
fi
#!/bin/bash
###Mailmigration
#Anzahl der zulaufenden imasyncs
PMAX=10
maildaten="migration_accounts.csv"
logpfad="/opt/mig/scripte/imapsynclog"
sed_logpfad=$(echo $logpfad| sed 's/\//\\\//g; s/$/\\\//')
log="$logpfad/sync.log"
echo "" > $log
#Pfad zu imapsync
imapsync="/opt/mig/scripte/imapsync-master/imapsync"
pwd=""
uid=""
account=""
user=""
domain=""
status=""
email=""
function create_logpfad() {
if [[ ! -d $logpfad ]]
then
mkdir $logpfad
if [[ $? -gt 0 ]]
then
exit 1
fi
fi
}
function sync_imap() {
login_1=$uid
pwd_1=$pwd
host_1="imap.example.net"
login_2=$(echo $uid"-migration")
pwd_2=$mig_pwd
host_2="imap.example.de"
imap_log=$logpfad/$user"."$(date +%s)".log"
#imasync von server 1 zu server 2
$imapsync --host1 $host_1 -user1 $login_1 -password1 $pwd_1\\
--authmech1 login --host2 $host_2 -user2 $login_2 -password2 $pwd_2 \\
--authmech2 login --subscribe_all --useuid --tmpdir /dev/shm >> $imap_log
#checklog
if [[ $(grep -c "Detected 0 errors" $imap_log ) -eq 1 ]]
then
echo "[200] User $user(uid: $uid) erfolgreich gesynct" \\
| tee -a $log
else
echo "[500] Fehler beim syncen von user $user(uid: $uid) für \\
Details schau in $imap_log "| tee -a $log
fi
}
function run_sync_p() {
while [ $(jobs -rp | wc -l) -ge $PMAX ]
do
sleep 0.5
done
sync_imap &
}
function start_sync() {
if [[ -f $maildaten ]]
then
while read line
do
#echo "line $line"
pwd=$(echo $line| cut -f7 -d",")
uid=$(echo $line| cut -f12 -d",")
account=$(echo $line| cut -f2 -d",")
user=$(echo $line| cut -f6 -d","|cut -f1 -d@)
domain=$(echo $line| cut -f5 -d",")
status=$(echo $line| cut -f3 -d",")
email=$(echo $line | cut -f2 -d","|cut -f1 -d@)
mig_pwd=$(echo $line| cut -f17 -d",")
if [[ $status -lt 5 ]]
then
if [[ ! -n $uid ]] || [[ $uid == "" ]]
then
echo "[404] keine Uid zu user $user gefunden \\
in: $line" | tee -a $log
else
if [[ $user == "N" ]] || [[ ! -n $user ]]
then
if [[ -n $email ]]
then
user=$email
run_sync_p
else
echo "[409] kein Nutzerinformationen in\\
$line zu finden" | tee -a $log
fi
else
run_sync_p
fi
fi
else
echo "[400] Staus >= 5 in $line " | tee -a $log
fi
done < $maildaten
else
echo "[404] Maildaten fehlen" | tee -a $log
exit 1
fi
}
function create_report() {
while [ $(jobs -rp | wc -l) -gt 0 ]
do
sleep 1
done
#Anzahl erfolgreiche Sync
anz_status_200=$( grep -c "\[200\]" $log )
#Anzahl fehlerhafte Sync
anz_status_500=$( grep -c "\[500\]" $log )
if [[ $anz_status_500 -gt 0 ]]
then
anz_status_500=$(expr $anz_status_500 - 1 )
fi
status_500=$( grep "\[500\]" $log )
anz_status_409=$( grep -c "\[409\]" $log )
anz_status_400=$( grep -c "\[400\]" $log )
anz_status_404=$( grep -c "\[404\]" $log )
anzahl_zeilen_csv=$( wc -l $maildaten | cut -d" " -f1)
error_lis=$(grep "\[500\]" $log | sed 's/.*\/opt\//\/opt\//')
echo -e "
REPORT:
####################################
Erfolgreich: $anz_status_200
Fehler bei Sync: $anz_status_500
keine UID gefunden: $anz_status_404
kein Userinformationen gefunden: $anz_status_409
user Status >= 5: $anz_status_400
in CSV: $anzahl_zeilen_csv
####################################
"
l_nr=1
if [[ $anz_status_500 -gt 0 ]]
then
draw=0
#echo -e "Fehlerhafte Syncs \n $status_500"
for line in $error_lis
do
if [[ $(grep "Failure: error login on " $line | grep -c \\
"example.de") -gt 0 ]]
then
if [[ $draw -eq 0 ]]
then
echo -e "Fehlerhaftes Login imap.example.de\n------\n"
draw=1
fi
echo -e "$l_nr:\t $(grep "Failure: error login on " \\
$line | grep "wodan")"
l_nr=$(expr $l_nr + 1 )
fi
done
draw=0
for line in $error_lis
do
if [[ $(grep "Failure: error login on " $line | grep -cv \\
"example.de" ) -gt 0 ]]
then
if [[ $draw -eq 0 ]]
then
echo -e "\n------\nFehlerhaftes Login bei \\
imap.example.net\n------\n"
draw=1
fi
echo -e "$l_nr:\t $(grep "Failure: error login on " \\
$line | grep -v "wodan")"
l_nr=$(expr $l_nr + 1 )
fi
done
draw=0
for line in $error_lis
do
if [[ $(grep -ie "Detected [0-9]* errors" $line | grep -v \\
"Detected 0 errors" |wc -l ) -gt 0 ]]
then
if [[ $draw -eq 0 ]]
then
echo -e "\n------\nSyncfehler\n------\n"
draw=1
fi
echo -e "$l_nr:\tuser: $(grep -i "Detected [0-9]* \\
errors" $line | grep -v "Detected 0 errors" | sed 's/$sed_logpfad//; \\
s/\..*//')\nDetails $(grep -i "Detected [0-9]* errors" $line | grep -v \\
"Detected 0 errors" | cut -d: -f1)"
l_nr=$(expr $l_nr + 1 )
fi
done
fi
}
function main () {
create_logpfad
start_sync
create_report
}
main
Kommentare
Kommentar veröffentlichen