النسخ الاحتياطي لنظام Linux لا يكتب رسائل

مرحبا بالجميع!

أريد أن أخبركم اليوم عن كيفية إدارة Veeam Agent for Linux باستخدام سطر الأوامر ، وعن الإمكانيات التي يفتحها في الأيدي الماهرة للمبرمج.

لقد طُلب مني كتابة مقال بتعليق على مقالة سابقة. لإعادة صياغة مفاجأة المستخدم: "حسنًا ، كيف ذلك؟ لا يكتب الخادم رسائل تفيد بأنه قد تم حفظه! " علاوة على ذلك ، حسب المحللين ، فهو ليس الوحيد ، وإلا فلن يظهر الخيط في المنتدى. وبما أن الناس يكتبون ، فهذا يعني أن هناك من يحتاج إليه!

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


بالإضافة إلى ذلك ، سأعرض الأوامر الأكثر فائدة ، في رأيي ، التي يمكن أن تسهل عمل المسؤول.

الاستعداد: الكثير من التعليمات البرمجية ، لا توجد صور.

أولاً ، دعنا نجيب على السؤال التالي: "لماذا لا يكتب Veeam Agent for Linux رسائل؟"

قد لا تحب الإجابات ، لا تلومني. ولكن الحقيقة هي أن أكثر أو أقل المستخدمين من المؤسسات الكبيرة لا يحتاجون إلى ذلك ، وإليكم السبب:

  • أولاً ، للعمل مع البريد ، يجب عليك إما وضع خادم smpt على الجهاز المحلي ، أو استخدام واحد على الشبكة. مع أبسط تطبيق (أمر mail ) ، ستحتاج إلى تثبيت حزمة mailutils . ولن يرغب العديد من مسؤولي النظام في إنشاء ثغرة أمنية محتملة على خادم الإنتاج الخاص بهم في شكل خدمة يمكنها إرسال رسائل إلى أي مكان. نعم ، وقد لا يكون هذا الاحتمال بسبب الموانئ المغلقة ، واستقلال الشبكات الفرعية ، والمزيد ...
  • ثانياً ، نظرًا لأن حزمة mailutils قد لا تكون موجودة على النظام (للسبب الأول) ، فمن غير المنطقي محاولة استخدامها. خلاف ذلك ، يمكننا الحصول على وظيفة تبدو موجودة ، ولكن "خارج الصندوق" لا تعمل ، مما يعني أنه سيكون هناك موضوع في المنتدى حول موضوع مثل: "كيفية تكوين الخادم بحيث يتم إرسال رسائل البريد الإلكتروني".
  • وثالثا ، بشكل عام ، لا حاجة إلى إخطار إضافي ، حيث أن عددًا كبيرًا أو أكثر من عملاء المؤسسات الكبيرة يستخدمون Veeam Backup & Replication . تقوم وحدة التحكم الخاصة به بجمع معلومات حول كافة النسخ الاحتياطية التي تم إجراؤها في مستودعات معروفة. انظر لنفسك.

في إصدار Veeam Backup & Replication 9.5 Update 4 ، يمكن استخدام هذا المنتج مجانًا ، ولكن مع فرض قيود على الأجهزة الظاهرية / الفيزيائية المخدومة.
إذا كان لديك ما يصل إلى 3 خوادم فعلية (شاملة) - ستكون وظائف VBR المجانية أكثر من كافية بالنسبة لك.

إذا كان لديك أكثر من 3 أجهزة ، فلا توجد وسيلة للدفع مقابل البرنامج ، لكنك لا تزال ترغب في مراقبة الخوادم مركزيًا ، أقترح إضافة بعض البرامج النصية بنفسك. أحب أن أروق نفسي في الثعبان بعد العمل في C / C ++.

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

وصف أوامر Veeam Agent for Linux صالح للإصدار 3.0. لم أتحقق من الإصدارات السابقة ، لذلك قد تكون هناك اختلافات.

واجهة CLI في Veeam Agent for Linux مريحة وموثقة جيدًا. فقط أدخل veeamconfig --help وستحصل على قائمة بالأوامر المتاحة:

 $sudo veeamconfig --help Veeam Agent for Linux (c) Veeam Software AG Usage: veeamconfig [command] Commands: repository - Backup repositories management vbrserver - Veeam Backup and Replication servers management job - Backup jobs management backup - Backups management point - Restore points management license - License management agreement - End User License Agreement management config - Import/export configuration schedule - Jobs schedule configuration cloud - Cloud provider management mode - Operation mode session - Sessions management ui - User interface aap - Application-aware processing version, --version, -v - Product version help, --help, -h - Short help 

لمعرفة ما يسمح لك كل أمر بالقيام به ، ما عليك سوى الاتصال بـ veeamconfig config --help . نحصل على:

 Veeam Agent for Linux (c) Veeam Software AG Usage: veeamconfig config [command] Commands: import - Import repositories and jobs into database export - Export repositories and jobs from database grabLogs - Collect support logs bundle patchiso - Create custom Veeam Recovery Media adding all hardware drivers from this system help, --help, -h - Short help 

هنا ، بالمناسبة ، يمكننا أن نرى الأمر grabLogs log collection. سيسمح لك بسرعة جمع كافة السجلات اللازمة للحصول على الدعم. هذا في حالة حدوث خطأ ما.

هناك أيضًا فريق مثير للاهتمام ظهر في الإصدار 3.0:

 $ sudo veeamconfig agreement --help Veeam Agent for Linux (c) Veeam Software AG Usage: veeamconfig agreement [command] Commands: acceptEula - Accept Veeam End User License Agreements acceptThirdPartyLicenses - Accept Veeam 3rd party License Agreement show - Show End User License Agreements acceptance status help, --help, -h - Short help 

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

 $ sudo veeamconfig job list I accept Veeam Software End User License Agreement: /usr/share/doc/veeam/EULA (yes/no | y/n): yes I accept the terms of the following 3rd party software components license agreements: /usr/share/doc/veeam/3rd_party (yes/no | y/n): 

وفقًا لذلك ، قد تتعطل تشغيل البرامج النصية الخاصة بك. من أجل عدم إدخال كل جهاز وعدم تنفيذ هذا الإجراء يدويًا ، تم توفير الأوامر التالية:

 veeamconfig agreement acceptEula veeamconfig agreement acceptThirdPartyLicenses 

إنها تسمح لك بقبول اتفاقيات الترخيص دون المزيد من الأسئلة.

لكننا انحرفنا عن موضوع كتابة خطاب.

بالنسبة إلى مهمة مراقبة حالة الخادم ، نحتاج إلى أمر veeamconfig session list . انها تنتج شيئا مثل:

 Job name Type ID State Started at Finished at bj-home Backup {dbe48e88-3df7-4712-a472-09af8fed4e80} Success 2018-12-05 15:43 2018-12-05 15:44 bj-home Backup {c178a799-2935-4bd6-883b-b11278000076} Success 2018-12-05 16:26 2018-12-05 16:26 bj-home Backup {3405dad3-0016-4a00-933e-60ef66b30324} Success 2018-12-06 06:00 2018-12-06 06:00 

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

انظر الكود كله هنا

 class CSession: @staticmethod def List(): return subproccall( ["veeamconfig", "session", "list"] ) class CSessionInfoList(object): def __init__(self, list): self.list = list def List(self): return self.list @staticmethod def Get(): text = CSession.List() lines = text.split("\n") list = [] # session info list for line in lines: if len(line) == 0: continue words = line.split() if len(words) == 0: continue if words[0] == "Job": continue if words[0] == "Total": continue try: jobName = words[0] type = words[1] id = words[2] state = words[3] startTime = words[4] + " " + words[5] finishTime = words[6] + " " + words[7] list.append(CSessionInfo(id, type, jobName, state, startTime, finishTime)) except: print "Failed to parse [", line, "]" return CSessionInfoList(list) 

حسنًا ، دعونا الآن نرسل خطابًا ونرسله إلى أنفسنا.

 def SendMailsessions(): print "---" print "Sending statistic to administrator:" sessions = veeamlpb.session.CSessionInfoList.Get() recipient = "dear.admin@company.com" subject = "VAL status notification" text = "Statistic:\n" inx = 0; successCount = 0 warningCount = 0 errorCount = 0 for sessionInfo in sessions.List(): if (sessionInfo.State() == "Success"): successCount += 1 elif (sessionInfo.State() == "Warning"): warningCount += 1 else: errorCount += 1 text += str(successCount)+"/"+str(warningCount)+"/"+str(errorCount)+" Success/Warning/Error\n" text += "Last 10 session:\n" for sessionInfo in reversed(sessions.List()): if inx == 10: text += "...\n" break; text += str(inx)+" | "+sessionInfo.State()+" | "+sessionInfo.JobName()+" | "+sessionInfo.StartTime()+" / "+sessionInfo.FinishTime() + "\n" #text += inx += 1 text += "\n" text += "--------------------------------------------------------------------------------\n" text += " Yours sincerely, Veeam Agent for Linux Monitor\n" print text os.system("echo '"+text+"' | mail -s '"+subject+"' "+recipient) 

نتيجة لذلك ، بعد تثبيت mailutils ، يمكننا الحصول على خطاب من النموذج:

 Statistic: 3/0/0 Success/Warning/Error Last 10 session: 0 | Success | bj-home | 2018-12-06 06:00 / 2018-12-06 06:00 1 | Success | bj-home | 2018-12-05 16:26 / 2018-12-05 16:26 2 | Success | bj-home | 2018-12-05 15:43 / 2018-12-05 15:44 -------------------------------------------------------------------------------- Yours sincerely, Veeam Agent for Linux Monitor 

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

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

 sessionList = veeamlpb.session.CSessionList() text = sessionList.ToXml() 

احفظ الملف الناتج

 sessionListFileName = "session_list.xml" print "Store XML to file: ",sessionListFileName sessionListXmlFile = open(sessionListFileName, "w") sessionListXmlFile.write(text) sessionListXmlFile.close() 

ثم نرسل XML المستلم إلى الخادم. خيار بديل ممكن أيضًا - يقوم الخادم بجمع XMLs من الأجهزة التي تم نسخها احتياطيًا. من هو البادئ ليس مهم بالنسبة لنا حتى الآن. من المهم أن يتم جمع ملفات XML على الخادم مع قوائم الجلسات من جميع الأجهزة. اخترت الخيار الأول:

 hostname = os.uname()[1] target = "user@admin-desktop:/home/user" os.system("scp ./"+sessionListFileName+" "+target+"/backups/"+hostname+"/session_list.xml") 

الآن ، على جانب الخادم ، يبقى معالجة البيانات المستلمة وإنشاء صفحة html جميلة.

 import veeamlpb import os import datetime import xml.etree.ElementTree as xml def main(): hosts = [] backupsDirectory = "/home/user/backups" for item in os.listdir(backupsDirectory): if item in [".", ".."]: continue if os.path.isdir(os.path.join(backupsDirectory,item)): hosts.append(item) print "item: ",item if len(hosts) == 0: return 0 backupSessionMap = {} for host in hosts: print "found host: ", host sessionInfoFile = os.path.join(os.path.join(backupsDirectory,host), "session_list.xml") sessionList = veeamlpb.session.CSessionInfoList.FromXmlFile(sessionInfoFile) backupSessionMap[host] = sessionList for sessionInfo in sessionList.List(): print "Session:",sessionInfo.ToString() html = xml.Element("html") body = xml.SubElement(html, "body", {"style":"background-color: #00b336;"}) xml.SubElement(body,"h1").text = "Report at "+datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") xml.SubElement(body,"h2").text = "Statistic:" for host in hosts: sessionList = backupSessionMap[host] success=0 warning=0 error=0 if len(sessionList.List()) == 0: continue for sessionInfo in sessionList.List(): if sessionInfo.State() == "Success": success +=1 elif sessionInfo.State() == "Warning": warning +=1 else: error +=1 latestSessionInfo = sessionList.List()[-1] attr = {} if latestSessionInfo.State() == "Success": #attr["style"] = "background-color: #00b336;" attr["style"] = "background-color: #005f4b; color: white;" elif latestSessionInfo.State() == "Warning": attr["style"] = "background-color: #93ea20;" else: attr["style"] = "background-color: #ba0200; color: white;" xml.SubElement(xml.SubElement(body,"p"),"span", attr).text = \ host + " - "+str(success)+"/"+str(warning)+"/"+str(error)+" Success/Warning/Error" for host in hosts: sessionList = backupSessionMap[host] xml.SubElement(body,"h2").text = host+":" tableStyle =xml.SubElement(body,"style") tableStyle.attrib["type"] = "text/css" tableStyle.text = "TABLE {border: 1px solid green;} TD{ border: 1px solid green; padding: 4px;}" table = xml.SubElement(body,"table") thead = xml.SubElement(table, "thead") xml.SubElement(thead, "th").text = "Number" xml.SubElement(thead, "th").text = "State" xml.SubElement(thead, "th").text = "Job name" xml.SubElement(thead, "th").text = "Start at" xml.SubElement(thead, "th").text = "Complete at" tbody = xml.SubElement(table, "tbody") inx = 0 for sessionInfo in reversed(sessionList.List()): if inx == 10: break; tr = xml.SubElement(tbody,"tr") xml.SubElement(tr, "td").text = str(inx) attr ={} if sessionInfo.State() == "Success": pass elif sessionInfo.State() == "Warning": attr["style"] ="background-color: #93ea20;" else: attr["style"] ="background-color: #ba0200; color: white;" xml.SubElement(tr, "td", attr).text = sessionInfo.State() xml.SubElement(tr, "td").text = sessionInfo.JobName() xml.SubElement(tr, "td").text = sessionInfo.StartTime() xml.SubElement(tr, "td").text = sessionInfo.FinishTime() inx += 1 xml.ElementTree(html).write("summary.html", encoding='utf-8', method='html') return 0 exit(main()) 

نتيجة لذلك ، التقرير جاهز:



لم يكن لدي أي مهمة لصنع منتج جميل. كانت المهمة هي إظهار أن مسألة جمع الإحصاءات يمكن حلها في نصوص في يوم إلى يومين.

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

يمكن العثور على جميع الشفرات على http://www.github.com/CodeImp/veeampy/ . تحميل ، استخدام ، تكملة وشوكة على الصحة.

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

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


All Articles