Seiten

Montag, 22. März 2021

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

#!/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

zzzz

Keine Kommentare:

Kommentar veröffentlichen