قم بتكوين النسخ الاحتياطي والاسترداد الكامل والمنفصل لـ Zimbra OSE دون استخدام Zextras

الصورة

1. من أين تبدأ


من أين يبدأ النسخ الاحتياطي؟ التخطيط. عند عمل نسخة احتياطية من أي نظام ، تحتاج إلى وضع خطة احتياطية: ما هو بالضبط ، كم مرة ، كم من الوقت لتخزين ، سيكون هناك مساحة حرة كافية؟ من الإجابات على هذه الأسئلة ، إجابة السؤال الرئيسي التالي - كيفية النسخ الاحتياطي؟

إذا كان هناك الكثير من المساحة الحرة ، يمكنك تخزين الجهاز الظاهري بأكمله. قم بعمل نسخ احتياطية بنفس Veeam في جدول ، ولا تفكر في الصعوبات. لكن بالنسبة لي ، إنها مضيعة ، اعتدت على فعل كل شيء بشكل موجز واقتصادي قدر الإمكان. بالطبع ، لقد قمت بنشر Veeam ، لكنني أقوم فقط بعمل نسخ احتياطية من تلك الأنظمة التي إما أن تكون مستحيلة أو إشكالية في النشر من النسخ الاحتياطية لفترة طويلة جدًا.

حول البرامج النصية لأدوات إدارة البيئة الافتراضية ، سأبقى صامتًا بكل معنى الكلمة.

زيمبرا لديه أداة zmmailbox. وبعد فحص دقيق لوظائفها ، أدركت أن ذلك سيكون أكثر من كافٍ بالنسبة لي. يمكنه النسخ الاحتياطي واستعادة علب البريد حتى على نظام مباشر. وأحببت القدرة على نسخ علب البريد المهمة بشكل منفصل عن النسخة الاحتياطية للنظام بأكمله. وبالتالي ، فإن المساحة التي تشغلها النسخ الاحتياطية سوف تكون محدودة بحجم صناديق البريد المؤرشفة مضروبة في عدد أيام "عمق النسخ الاحتياطي" ، وليس من خلال حجم النظام بأكمله مضروب في نفس عدد الأيام. بالإضافة إلى ذلك ، من الصعب للغاية استرداد من نسخة احتياطية للنظام بأكمله ، في حالة Zimbra. من الأسهل بكثير نسخ آلة افتراضية باستخدام Veeam أو أدوات إدارة البيئة الافتراضية (Hyper-V ، ESXI ، أدخل ما تحتاجه) مباشرةً بعد إعداد النظام ، ووضعه "على الرف" بحيث يمكنك في لحظة حرجة نشر VM بدون وزن وتحميل بسرعة في ذلك نسخ احتياطية من الصناديق. في رأيي ، هذا هو السيناريو الأقل تكلفة من جميع النواحي.

2. البيانات المصدر:


خادم نظام التشغيل : CentOS 7

حول نظام التشغيل
في الواقع ، فإن الفرق بين CentOS7 وأي نظام آخر يكمن فقط في أوامر الخادم لتثبيت الحزم ، وربما موقع بعض الملفات. يتم تنفيذ العمل بشكل أساسي باستخدام أوامر cmdlets من طراز Zimbra ، بحيث تكون فروق التكوين ضئيلة للغاية.

Zimbra المجال : zimbramail.home.local
اسم المستخدم وكلمة المرور للوصول إلى المجلد المشترك : ZimbraBackUp / 123123
المسار إلى المجلد المشترك : \\ BackUpServer1 \ ZM \
مسار تحميل الكرات على مضيف Zimbra : / mnt / ZM /

3. الإعداد


لذلك دعونا نبدأ!

سنكتب نسخ احتياطية إلى خادم يقوم بتشغيل Windows في مجلد مشترك. إذا كنت ترغب في ذلك ، يمكنك دمج النسخ الاحتياطية في أي مكان ، ولكن يتم إعداد كل شيء بحيث تتم كتابة معظم النسخ الاحتياطية على BackUpServer1.home.local. بحيث:

1) ننشئ في مجال المستخدم للوصول إلى المجلد المشترك على هذا الخادم بحيث يمكن تثبيته على خادم Zimbramail.home.local. اسم المستخدم ZimbraBackUp ، كلمة المرور ، مشروط ، 123123.

2) على خادم BackUpServer1 ، قم بإنشاء الدليل \ ZM \ في المستودع ومشاركته ، مع إعطاء حقوق التغيير للمستخدم ZimbraBackUp. سيكون المسار إلى الكرة: \\ BackUpServer1 \ ZM \

3) قم بتركيب الكرة على خادم Zimbramail.home.local. لكي يتم تثبيت المجلد تلقائيًا ، تحتاج إلى إصلاح ملف / etc / fstab عن طريق إضافة السطر إليه:

//BackUpServer/ZM /mnt/ZM cifs user,uid=500,rw,suid,username=ZimbraBackUp,password=123123 0 0 

لكن عليك أولاً التحقق مما إذا كان الحامل يعمل:

 $ mount -t cifs //BackUpServer/ZM /mnt/ZM -o user=ZimbraBackUp,password=123123 

غالبًا ما يظهر خطأ مثل هذا:

 mount: wrong fs type, bad option, bad superblock on //BackUpServer1/ZM/, missing codepage or helper program, or other error (for several filesystems (eg nfs, cifs) you might need a /sbin/mount.<type> helper program) In some cases useful info is found in syslog - try dmesg | tail or so. 

يمكنك إصلاحه عن طريق تثبيت cifs-utils:

 $ yum install cifs-utils 

بعد الإعداد ، أوصي بإعادة تشغيل الخادم.

4) إنشاء ملفات البرنامج النصي 3: FullBackUp.sh HandBackUp.sh Restore.sh

سيتم استخدام الملف الأول لإنشاء نسخ احتياطية مجدولة تلقائيًا ، والثاني للقدرة على إجراء نسخ احتياطي لصناديق البريد الفردية ، أو ببساطة بدء "ماذا لو" يدويًا. والنص الثالث هو استعادة واحد أو كل الصناديق في وقت واحد. حاولت قدر الإمكان التعليق على عمل البرامج النصية وقطع الأشجار المقررة.

محتويات ملف FullBackUp.sh:
 #!/bin/bash #   Path="/mnt/ZM/BackUps" #    ArchPath="/mnt/ZM/Archive" #    MPath="/mnt/ZM/Mounthly" #  Zimbra ZDomain="zimbramail.home.local" #  MBoxes="/mnt/ZM/MBoxesList" #  CDate=$(date +%d-%m-%Y) #   MDay=$(date +%d) #   log="/mnt/ZM/BackUpLog.txt" echo -en "BackUp ALL MailBoxes started in $(date +%T)\n" >> $log #       if [ ! -d $Path ]; then #     echo "    ..." mkdir -p $Path if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "BackUp dirctory was created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "BackUp dirctory was NOT created in $(date +%T)\n" >> $log fi else echo "    ,      ..." fi #       if [ ! -d $Path/$CDate ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo #        echo "       ..." mkdir -p $Path/$CDate if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "BackUp CDate dirctory was created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "BackUp CDate dirctory was NOT created in $(date +%T)\n" >> $log fi else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo "    ,     ..." fi #     /opt/zimbra/bin/zmprov -l gaa $ZDomain > $MBoxes #    if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Mail Boxes list created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en "Mail Box list is NOT created! in $(date +%T)\n" >> $log exit fi #       for MailBox in $( cat $MBoxes); do echo "    $MailBox..." /opt/zimbra/bin/zmmailbox -z -m $MailBox getRestUrl "//?fmt=tgz" > $Path/$CDate/$MailBox if [ $? -eq 0 ]; then #        echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Mail Box $MailBox BackUp created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en "Mail Box $MailBox BackUp is NOT created! in $(date +%T)\n" >> $log fi done #     echo "    ..." echo -n > $MBoxes if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "File $MBoxes clear\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "File $MBoxes can NOT be cleared\n" >> $log fi #      #      if [ ! -d $ArchPath ]; then #    echo "   ..." mkdir -p $ArchPath if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive dirctory was created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive dirctory was NOT created in $(date +%T)\n" >> $log fi else echo "   , ..." fi tar -czf $ArchPath/$CDate.tar $Path/$CDate if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive created in $(date +%T)\n" >> $log #         if [ "$MDay" = 1 ]; then #      if [ ! -d $MPath ]; then #     echo "    ..." mkdir -p $MPath if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Long saving dirctory was created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Long saving dirctory was NOT created in $(date +%T)\n" >> $log fi else #  echo "    ,     ..." fi cp $ArchPath/$CDate.tgz $MPath/$CDate if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive is copied in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive is NOT copied in $(date +%T)\n" >> $log fi echo "    ( 1 )..." # ,   ,   find $Path -atime +7 | xargs rm -d if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Old BackUps files was deleted\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Old BackUps files is NOT deleted in $(date +%T)\n" >> $log fi #    ( 2 ) echo "     ( 2 )..." find $ArchPath -atime +61 | xargs rm -f if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Old BackUps archives was deleted\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Old BackUps archives is NOT deleted in $(date +%T)\n" >> $log fi fi else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive is NOT created in $(date +%T)\n" >> $log fi echo "BackUp job finished in $(date +%T)" #  -     echo -en "BackUp job finished in $(date +%T) $(date +%T)\n" >> $log echo -en "_____________________________________________\n" >> $log 

محتوى ملف HandBackUp.sh:
 #!/bin/bash #   Path="/mnt/ZM/BackUps" #    ArchPath="/mnt/ZM/Archive" #  Zimbra ZDomain="zimbramail.home.local" #  MBoxes="/mnt/ZM/MBoxesList" #  CDate=$(date +%d-%m-%Y) #   log="/mnt/ZM/BackUpLog.txt" read -p "    (  ),  ALL      : " A if [[ "$A" = "ALL" || "$A" = "all" ]]; then echo -en "BackUp started in $(date +%T)\n" >> $log #     echo "    ..." /opt/zimbra/bin/zmprov -l gaa $ZDomain > $MBoxes if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Mail Boxes list created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en "Mail Box list is NOT created! in $(date +%T)\n" >> $log exit fi if ! [ -d $Path/$Date ]; then #    mkdir -p $Path/$CDate/ echo -en "BackUp directory created in $(date +%T)\n" >> $log fi #       echo "      " for MailBox in $( cat $MBoxes); do echo "    $MailBox..." /opt/zimbra/bin/zmmailbox -z -m $MailBox getRestUrl "//?fmt=tgz" > $Path/$CDate/$MailBox if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Mail Box $MailBox BackUp created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en "Mail Box $MailBox BackUp is NOT created! in $(date +%T)\n" >> $log fi done else MailBox="$A@$ZDomain" #    echo "   ..." Result=$(/opt/zimbra/bin/zmprov getMailboxInfo $MailBox) if [ $? -eq 0 ]; then #   echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo "  $MailBox ,  ..." echo -en "Required Mail Box $MailBox exist $(date +%T)\n" >> $log #      if ! [ -d $Path/$Date ]; then #    mkdir -p $Path/$CDate/ echo -en "BackUp directory created in $(date +%T)\n" >> $log fi #    $MailBox /opt/zimbra/bin/zmmailbox -z -m $MailBox getRestUrl "//?fmt=tgz" > $Path/$CDate/$MailBox if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Mail Box $MailBox BackUp created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en "Mail Box $MailBox BackUp is NOT created! in $(date +%T)\n" >> $log fi else #    -  echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo "  $MailBox  .   " echo -en "Required Mail Box $MailBox is not exist\n" >> $log exit fi fi read -p "      $MailBox? [N]: " F if [[ "$F" = "Y" || "$F" = "y" ]]; then #      if [ ! -d $ArchPath ]; then #     echo "   ..." mkdir -p $ArchPath if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive dirctory was created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive dirctory was NOT created in $(date +%T)\n" >> $log fi else echo "   , ..." fi #    echo "  ..." if [[ "$A" = "ALL" || "$A" = "all" ]]; then tar -czf $ArchPath/$CDate.tar $Path/$CDate if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive is NOT created in $(date +%T)\n" >> $log fi else tar -czf $ArchPath/$MailBox.tar $Path/$CDate/$MailBox if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Archive created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Archive is NOT created in $(date +%T)\n" >> $log fi fi else echo "   " echo -en "User decline archive creating\n" >> $log fi #     echo "    ..." echo -n > $MBoxes if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo fi echo "BackUp job finished in $(date +%T) $(date +%T)" #  -     echo -en "BackUp job finished in $(date +%T) $(date +%T)\n" >> $log echo -en "_____________________________________________\n" >> $log 

محتويات ملف Restore.sh:
 #!/bin/bash #   Path="/mnt/ZM/BackUps" #  Zimbra ZDomain="zimbramail.home.local" #  MBoxes="/mnt/ZM/MBoxesList" #   log="/mnt/ZM/RestoreLog.txt" read -p "  ,      02-09-2001: " Date if ! [ -d $Path/$Date ]; then echo "     ." echo -en "No BackUp file at $Date $(date +%T)\n" > $log exit fi read -p "    (  ),  ALL        : " A if [[ "$A" = "ALL" || "$A" = "all" ]]; then echo -en "Restore started in $(date +%T)\n" >> $log #     ls "$Path/$Date" > $MBoxes for MailBox in $( cat $MBoxes); do #   echo "   $MailBox" Result=$(/opt/zimbra/bin/zmprov getMailboxInfo $MailBox) if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "Start restore job for $MailBox $(date +%T)\n" >> $log echo " $MailBox . ..." else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Mail Box $MailBox does not exist, creating Mail Box $MailBox $(date +%T)\n" >> $log echo " $MailBox  .   $MailBox..." #   Result=$(/opt/zimbra/bin/zmprov ca $MailBox 12345678 displayName "$MailBox") if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "Mail Box $MailBox is created, starting restore $(date +%T)\n" >> $log echo " $MailBox  . ..." else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Can NOT create Mail Box $MailBox ! $(date +%T)\n" >> $log echo " $MailBox   ." fi fi #  Result=$(/opt/zimbra/bin/zmmailbox -z -m $MailBox postRestURL "//?fmt=tgz&resolve=replace" $Path/$Date/$MailBox) if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en " $MailBox   $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en " $MailBox  ! $(date +%T)\n" >> $log fi done else #     MailBox="$A@$ZDomain" if [ -a $Path/$Date/$MailBox ]; then #   echo "   $MailBox..." Result=$(/opt/zimbra/bin/zmprov getMailboxInfo $MailBox) if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "Start restore job for $MailBox $(date +%T)\n" >> $log echo " $MailBox . ..." else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Mail Box $MailBox does not exist $(date +%T)\n" >> $log echo " $MailBox  ." read -p "            ? [N]: " B if [[ "$B" = "Y" || "$B" = "y" ]]; then echo "   $MailBox..." Result=$(/opt/zimbra/bin/zmprov ca $MailBox 12345678 displayName "$MailBox") #   if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "Mail Box $MailBox is created, starting restore $(date +%T)\n" >> $log echo " $MailBox  . ..." else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Can NOT create Mail Box $MailBox ! $(date +%T)\n" >> $log echo " $MailBox   .   ..." exit fi else #   ,  .  echo "   .   " exit fi fi #  Result=$(/opt/zimbra/bin/zmmailbox -z -m $MailBox postRestURL "//?fmt=tgz&resolve=replace" $Path/$Date/$MailBox) if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en " $MailBox   $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en " $MailBox  ! $(date +%T)\n" >> $log fi else #     echo "    .   " echo -en "Required BackUp file is not exist\n" >> $log exit fi fi #     echo "    ..." echo -n > $MBoxes if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo fi echo "BackUp job finished in $(date +%T) $(date +%T)" #  -     echo -en "Restore job complete in $(date +%T)\n" >> $log echo -en "____________________________________\n" >> $log 

هناك دقة واحدة. إذا قمت بإنشاء وتحرير ملفات البرامج النصية للباش تحت ويندوز ، فعندما تحاول تشغيل البرنامج النصي ، سيظهر خطأ: / bin / sh ^ M: مترجم سيئ: لا يوجد ملف أو دليل ، وهو ما يضيفه المحررين الذين يعملون تحت ويندوز إلى نهاية السطر هي حرف الإرجاع "CR \ LF" ، الذي لا يعرضه المحررون على نظام Linux. لكن هذا الرمز موجود ولم يختف. للتخلص من الخطأ وإزالة الأحرف الزائدة ، نقوم بما يلي:

 $ cat your-script.sh | tr -d '\r' > corrected-your-script.sh 

حسنًا ، أو يمكنك استخدام الأداة المساعدة dos2unix ، ولكن لا تزال تحتاج إلى تثبيتها:

 $ yum install dos2unix $ dos2unix your-script.sh 

5) نجعل البرامج النصية قابلة للتنفيذ:

 $ chmod 0740 /opt/zimbra/BkUpRestScripts/FullBackUp.sh $ chmod 0740 /opt/zimbra/BkUpRestScripts/HandBackUp.sh $ chmod 0740 /opt/zimbra/BkUpRestScripts/Restore.sh 

6) أوصي بأن تقوم بتشغيل البرامج النصية بيديك ومعرفة ما إذا كانت تعمل وكيف تعمل.

7) إنشاء مهمة في كرون للنسخ الاحتياطي اليومي لصناديق البريد:

 10 0 * * * root /opt/zimbra/ BkUpRestScripts/FullBackUp.sh 

8) استمتع

4. البرمجة النصية


في حالة التعليقات في البرامج النصية نفسها لم يساعد.

1) البرنامج النصي FullBaclUp.sh:
في البداية ، يتم تحديد المتغيرات ، أي واحد مسؤول عن ماذا - يتم التعليق على كل شيء.

التالي هو التحقق من عدم وجود دليل للنسخ الاحتياطي ؛ إذا كان غير موجود ، يتم إنشاؤه. يتم الاستنتاج لملف السجل وللشاشة (في حالة البدء بالأيدي) حول نجاح أو فشل إنشاء دليل.

تحقق من وجود كتالوج مفقود مع تاريخ اليوم. إذا لم يكن هناك ، يتم إنشاؤه ، كما يتم إنشاء الإخراج إلى الشاشة وسجل نتيجة إنشاء الدليل.

الكتابة إلى ملف جميع علب بريد Zimbra الموجودة. هناك حاجة للحجز التسلسلي لكل مربع. يعرض نتيجة الأمر.

إنشاء نسخة احتياطية لكل صندوق بريد من القائمة المستلمة. مع إخراج التنفيذ إلى الشاشة وإلى ملف السجل.

مسح ملف مع قائمة المربعات. نظرًا لأن جميع البرامج النصية الثلاثة تعمل مع هذا الملف ، فمن المستحسن تنظيفه بعد كل عملية تشغيل حتى لا تكون هناك مفاجآت. يمكنك تنظيفه قبل بدء البرنامج النصي ، لكن من المألوف بالنسبة لي ألا أقوم بتخزين البيانات غير الضرورية بعد الانتهاء من العمل ، لكن القيام بنفس الشيء قبل وبعد عمل البرنامج النصي هو درجة خفيفة من الفصام.

التالي هو كتلة لإنشاء أرشيف مضغوط.

التحقق من عدم وجود دليل تخزين الأرشيف ، وإنشائه في غيابه ، وعرض نتيجة الإنشاء على الشاشة والسجل

الأرشفة

تحقق "ليس اليوم الأول اليوم؟" أفضل تخزين النسخ الاحتياطية لليوم الأول من كل الأشهر لفترة طويلة ، وهذا يكفي بالنسبة لي للعمل. يمكن تخزينه لعدة أسابيع ، لكن غالبًا ما يكون ذلك ضروريًا. ولكن يتم تعيين شرط تخزين النسخ الاحتياطية لكامل فترة تشغيل خادم البريد في الأعلى ، لذلك يكون هناك دائمًا هناك. إذا كان الرقم هو الأول ، فسيتم نسخ الأرشيف الناتج إلى دليل منفصل "Mounthly". ولنسخه هناك ، تحتاج إلى التحقق مما إذا كان هناك مثل هذا الدليل ، وإذا لم يكن الأمر كذلك ، قم بإنشائه ، والذي يجب إبلاغه إلى الشاشة وملف السجل.

بعد ذلك ، يتم تنظيف وحدة التخزين - يتم حذف جميع النسخ الاحتياطية التي مضى عليها أكثر من أسبوعين ، وكذلك المحفوظات التي يزيد عمرها عن 61 يومًا. يتم عرض نتيجة الحذف على الشاشة وفي ملف السجل.

بعد ذلك يكتب البرنامج النصي وقت الانتهاء إلى ملف السجل وعلى الشاشة ، وينهي عمله.

2) البرنامج النصي HandBackUp.sh:
في البداية ، يتم تعريف المتغيرات أيضًا ، وعلقت أيضًا على سبب الحاجة إليها.

بعد ذلك ، تتم مطالبة المستخدم بإدخال اسم صندوق البريد الذي يجب نسخه احتياطيًا ، دون تحديد مجال Zimbra. (مكتوب في الدعوة للدخول) ، أو حدد نسخة احتياطية لجميع صناديق البريد عن طريق كتابة الكل أو الكل.

إذا اخترت نسخًا احتياطيًا لجميع صناديق البريد ، فإن البرنامج النصي يعمل تقريبًا كما هو الحال مع أول واحد مدرج أعلاه ، إلا أنه بعد إنشاء نسخ احتياطية لكل صندوق بريد ، سوف يطلب ذلك - هل أحتاج إلى أرشفتها؟

إذا تم كتابة صندوق بريد محدد ، فسيتم التحقق من وجوده في Zimbra. في حالة وجود مربع بالاسم المحدد ، تبدأ عملية النسخ الاحتياطي لهذا المربع ، مع عرض المعلومات المقابلة على الشاشة وفي ملف السجل. إذا كان المربع المحدد غير موجود ، فسيتم إعلام المستخدم بهذا ، وسوف يكمل البرنامج النصي عمله.

بعد اكتمال النسخ الاحتياطي للمربع ، ستتم مطالبتك بأرشفة النسخة. إذا وافق المستخدم - هناك فحص لعدم وجود دليل لتخزين الأرشيف ومزيد من أسفل القائمة ، كما هو الحال في البرنامج النصي الأول.

بعد اكتمال الأرشفة ، يتم مسح الملف مع قائمة صناديق البريد. فقط في القضية.

في النهاية ، يتم عرض معلومات حول وقت إكمال البرنامج النصي على الشاشة وفي ملف السجل.

3) استعادة البرنامج النصي:
كما في الملفات السابقة ، أولاً - تعريف المتغيرات مع التعليقات.

تتم مطالبة المستخدم بتحديد تاريخ النسخ الاحتياطي المطلوب استعادته. إذا لم يكن التاريخ المحدد في النسخ الاحتياطية ، فسيتم إنهاء البرنامج النصي عن طريق الإبلاغ عن هذا.

في حالة وجود نسخ احتياطية للتاريخ المحدد - اطلب من المستخدم إدخال اسم المربع الذي يجب استعادته. لاستعادة جميع المربعات تحتاج إلى كتابة الكل أو الكل.

في حالة تحديد الخيار ALL ، يقوم البرنامج النصي بإنشاء قائمة بالملفات الموجودة في مجلد النسخة الاحتياطية في الملف ، ويبلغ عن نتيجة الإنشاء.

التالي هو الاسترداد خطوة بخطوة لكل مربع. أولاً ، تحقق من وجود مربع في النظام ، إن لم يكن ، يتم إنشاؤه ، ثم استعادته. يتم عرض المعلومات حول كل عملية في ملف السجل وعلى الشاشة.

إذا تم تحديد مربع معين ، فسيكون متشابهًا تقريبًا. تحقق من وجود ملف بالاسم المطلوب. الإخراج إلى الشاشة وملف سجل النتيجة.

التحقق من وجود مربع في النظام. الإخراج إلى الشاشة وملف سجل النتيجة.
دعوة للمستخدم للموافقة على إنشاء الصندوق في حالة عدم وجود مثل هذا في النظام. الإخراج إلى الشاشة وملف سجل النتيجة.

إنشاء مربع إذا وافق. الإخراج إلى الشاشة وملف سجل النتيجة.
صندوق البريد الانتعاش. الإخراج إلى الشاشة وملف سجل النتيجة.

مسح ملف مع قائمة صناديق الاسترداد.

في النهاية ، يتم عرض معلومات حول وقت إكمال البرنامج النصي على الشاشة وفي ملف السجل.

5. فيما يتعلق الانتعاش


إذا قمت بتعديل هذه البرامج النصية قليلاً ، فهي مناسبة تمامًا لنقل البريد من خادم إلى خادم ، وذلك ببساطة عن طريق إنشاء صناديق بريد تحتوي على جميع المحتويات في مكان جديد. يمكنك أيضًا استعادة النظام من نقطة الصفر ، عندما يكون من السهل إعادة رفع خادم Zimbra بدلاً من محاولة إعادة تنشيط الخادم القديم لسبب ما. كما هو موضح أعلاه ، يمكنك حفظ صورة الجهاز الظاهري المكوّن عن طريق توسيعه إذا لزم الأمر ، وملؤه بكافة البيانات. نفس الخوارزمية للانتقال من خادم Zimbra إلى آخر. وليس هناك حاجة إلى المرافق المدفوعة مثل Zextras.

6. الخاتمة


بشكل عام ، لا يوجد شيء معقد في النصوص التي كتبت. نعم ، هناك الكثير من الشروط فيها ، لأنني حاولت التنبؤ بأكبر عدد ممكن من المشاكل والأخطاء في عملهم ، لكنني حاولت أيضًا التعليق على النص بأكبر قدر ممكن. على الأرجح ، من خارج الصندوق ، لن يعملوا مع الجميع. ربما لا يمتلك شخص ما طريقة النسخ الاحتياطي هذه على الإطلاق. ولكني آمل أن يجد الكثيرون ذلك مفيدًا.

7. ملاحظة:


هذا هو المقال الثاني في سلسلة "كيف نفذت زيمبرا". الأول يدور حول التطبيق وترخيص LDAP وإنشاء صناديق البريد تلقائيًا لمستخدمي م ، هنا .
المقالة الثالثة حول الإنشاء التلقائي وتحديث قوائم المراسلات القائمة على الإعلانات في نظام التشغيل Zimbra OSE موجودة هنا .

وأريد أيضًا أن أشير إلى أن هذه هي تجربتي الأولى في البرمجة النصية على bash ، ولهذا السبب ، تبين أن النصوص البرمجية ضخمة جدًا و "ذكية جدًا" ، كما يقولون.

Source: https://habr.com/ru/post/ar439728/


All Articles