Cadangan untuk Linux tidak menulis surat

Halo semuanya!

Hari ini saya ingin memberi tahu Anda tentang cara mengelola Veeam Agent untuk Linux menggunakan baris perintah, dan tentang kemungkinan apa yang terbuka di tangan terampil seorang programmer.

Saya diminta untuk menulis artikel dengan komentar di artikel sebelumnya. Mengutip kejutan pengguna: “Ya, bagaimana bisa begitu? Server tidak menulis surat yang menyatakan telah disimpan! ” Selain itu, menurut analis, dia bukan satu-satunya, kalau tidak, utasnya tidak akan muncul di forum. Dan karena orang menulis, itu berarti seseorang membutuhkannya!

Dalam artikel tersebut saya akan menjelaskan mengapa fitur ini tidak ada dalam produk. Tapi kami tidak akan berhenti di situ, kami akan menambahkan fungsi ini! Kami adalah programmer, jadi kami akan menulis surat dan menghasilkan laporan dalam bentuk halaman html.


Selain itu, saya akan menunjukkan perintah yang paling berguna, menurut saya, yang dapat memfasilitasi pekerjaan administrator.

Bersiap-siap: banyak kode, tidak ada gambar.

Pertama, mari kita jawab pertanyaan: "Mengapa Veeam Agent untuk Linux tidak menulis surat?"

Anda mungkin tidak suka jawabannya, jangan salahkan saya. Tetapi kenyataannya adalah bahwa pengguna perusahaan besar atau kecil tidak membutuhkan ini, dan inilah alasannya:

  • Pertama, untuk bekerja dengan surat, Anda harus meletakkan server smpt di mesin lokal, atau menggunakan seseorang di jaringan. Dengan implementasi yang paling sederhana (perintah mail ), Anda perlu menginstal paket mailutils . Dan banyak administrator sistem tidak ingin membuat kerentanan potensial pada server produksi mereka dalam bentuk layanan yang dapat mengirim surat ke mana saja. Ya, dan kemungkinan tidak disebabkan oleh port yang ditutup, independensi subnet, dan banyak lagi ...
  • Kedua, karena paket mailutils mungkin tidak ada di sistem (untuk alasan pertama), tidak masuk akal untuk mencoba menggunakannya. Kalau tidak, kita bisa mendapatkan fungsi yang tampaknya ada di sana, tetapi "out of the box" tidak berfungsi, yang berarti bahwa akan ada utas di forum tentang topik seperti: "Cara mengonfigurasi server sehingga surat dikirim."
  • Dan ketiga, secara umum, tidak ada pemberitahuan tambahan yang diperlukan, karena lebih banyak atau lebih sedikit pelanggan perusahaan menggunakan Veeam Backup & Replication . Konsolnya mengumpulkan informasi tentang semua cadangan yang dibuat untuk repositori terkenal. Lihat sendiri.

Dalam versi Veeam Backup & Replication 9.5 Update 4 , dimungkinkan untuk menggunakan produk ini secara gratis, tetapi dengan pembatasan pada mesin virtual / fisik yang dilayani.
Jika Anda memiliki hingga 3 server fisik (inklusif) - fungsi VBR gratis akan lebih dari cukup untuk Anda.

Jika Anda memiliki lebih dari 3 mesin, tidak ada cara untuk membayar perangkat lunak, tetapi Anda masih ingin memonitor server secara terpusat, saya sarankan menambahkan beberapa skrip sendiri. Saya suka menghibur diri dengan python setelah bekerja untuk C / C ++.

veeamconfig kami akan membungkus veeamconfig perintah veeamconfig . Tim veeamconfig menyediakan akses ke semua fungsionalitas produk. Tidak diragukan lagi, antarmuka pseudografis yang dibuat menggunakan perpustakaan ncurses jauh lebih menyenangkan bagi mata, namun, jika Anda perlu menautkan program ke sesuatu yang baru, maka CLI adalah segalanya bagi kami.

Deskripsi Veeam Agent untuk perintah Linux valid untuk versi 3.0. Saya tidak memeriksa versi sebelumnya, jadi mungkin ada perbedaan.

Antarmuka CLI di Veeam Agent untuk Linux cukup nyaman dan didokumentasikan dengan baik. Cukup masukkan veeamconfig --help dan Anda akan mendapatkan daftar perintah yang tersedia:

 $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 

Untuk melihat apa yang setiap perintah memungkinkan Anda lakukan, cukup panggil veeamconfig config --help . Kami mendapatkan:

 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 

Di sini, omong-omong, kita bisa melihat grabLogs pengumpulan log grabLogs . Ini akan memungkinkan Anda untuk dengan cepat mengumpulkan semua log yang diperlukan untuk dukungan. Ini kalau-kalau terjadi kesalahan.

Ada juga tim menarik yang muncul di versi 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 

Faktanya adalah bahwa mulai dengan versi 3.0, pengguna diharuskan untuk secara eksplisit menyetujui perjanjian lisensi. Itu terlihat seperti ini:

 $ 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): 

Dengan demikian, operasi skrip Anda dapat terganggu. Agar tidak memasuki setiap mesin dan tidak melakukan prosedur ini secara manual, perintah berikut diberikan:

 veeamconfig agreement acceptEula veeamconfig agreement acceptThirdPartyLicenses 

Mereka memungkinkan Anda untuk menerima perjanjian lisensi tanpa pertanyaan lebih lanjut.

Tapi kami menyimpang dari topik menulis surat.

Untuk tugas pemantauan status server, kita memerlukan perintah veeamconfig session list . Ini menghasilkan sesuatu seperti:

 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 

Nah, ada informasi di sini ketika server dicadangkan dan apa keberhasilannya. Pada prinsipnya, sudah dimungkinkan untuk mengumpulkan "knalpot" ke dalam file dan mengirimkannya melalui surat. Namun, dalam setahun surat itu dapat tumbuh sekitar 365 baris. Dan mencari Negara dengan kesalahan bisa terasa membosankan. Karenanya, kami akan menguraikan "pembuangan" ini dan mendapatkan daftar normal yang dengannya Anda sudah dapat melakukan sesuatu.

Lihat seluruh kode di sini

 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) 

Nah, sekarang mari kita membuat surat dan mengirimkannya kepada diri kita sendiri.

 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) 

Akibatnya, setelah menginstal mailutils, kita bisa mendapatkan surat berupa:

 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 

Surat itu hanya menampilkan 10 sesi terakhir. Pada saat yang sama, informasi tentang jumlah sesi yang berhasil dan tidak terlalu banyak ditampilkan pada awal surat itu. Cukup dengan melihat angka-angka dalam surat di awal hari kerja, memeriksa surat dan menyeruput pembuat kopi untuk memahami bahwa backup malam berhasil.

Jika Anda membutuhkan sesuatu yang lebih jelas, Anda dapat meminta informasi tentang sesi dalam format xml dan mentransfernya ke server Anda. Di sana, gabungkan data yang diperoleh ke dalam tabel ringkasan tunggal yang menampilkan semua informasi yang diperlukan dalam format yang nyaman atau layak untuk Anda.
Kami mendapatkan pasangan XML-baris:

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

Simpan file yang dihasilkan

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

Kemudian kami mengirim XML yang diterima ke server. Opsi alternatif juga dimungkinkan - server mengumpulkan XML dari mesin yang dicadangkan. Siapa inisiator belum penting bagi kami. Adalah penting bahwa file XML dikumpulkan di server dengan daftar sesi dari semua mesin. Saya memilih opsi pertama:

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

Sekarang, di sisi server, masih memproses data yang diterima dan membuat halaman html yang indah.

 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()) 

Hasilnya, laporan siap:



Saya tidak punya tugas untuk membuat produk yang indah. Tugasnya adalah menunjukkan bahwa masalah pengumpulan statistik dapat diselesaikan dalam skrip dalam satu hingga dua hari.

Pada prinsipnya, jika Anda mengembangkan ide-ide yang disajikan di sini, Anda dapat membuat "Open Backup Monitor for Veeam Agent for Linux". Menurut pendapat saya, topik yang baik untuk kursus di Python, atau mungkin bahkan untuk diploma, atau hanya alasan untuk berlatih pemrograman pada proyek open source. Setuju, lebih baik berlatih pemrograman daripada menjadi elf tingkat 80.

Semua kode dapat ditemukan di http://www.github.com/CodeImp/veeampy/ . Unduh, gunakan, suplemen, dan garpu kesehatan.

Harap dicatat bahwa kode ini didistribusikan di bawah lisensi GPL-2, mungkin mengandung kesalahan dan banyak lagi. Semuanya seperti biasa di dunia opensource. Jadi sebelum digunakan dalam produksi - jangan lupa mengemudi di lab uji.

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


All Articles