Sinkronisasi penuh folder bersama, kontak, kalender antara server Kerio Connect yang didistribusikan

Selamat siang, Habr!

Tugas

Organisasi saya menggunakan server email pada platform Kerio Connect; server email dipasang di berbagai kota untuk melayani penggunanya. Awalnya tidak ada struktur terdistribusi, karena domain berbeda pada tingkat ketiga, yang menunjukkan kota situs. Semuanya berhasil dan semua orang senang. Suatu hari, manajemen menetapkan tugas, kalender kegiatan umum antara semua situs!

prasejarah

Awalnya, idenya adalah untuk meningkatkan Domain Surat Terdistribusi Kerio dan akan melakukan semuanya sendiri. Tidak lama kemudian, domain terdistribusi telah dibuat, tetapi bukan itu masalahnya, server siap untuk menyinkronkan kalender, folder, kontak - antar domain yang terletak di server yang sama, tetapi sama sekali tidak akan menyinkronkan data antara beberapa server.

Saya, tentu saja, tidak mengharapkan hasil seperti itu dan untuk waktu yang lama tidak percaya bahwa fungsi yang saya butuhkan tidak ada. Belakangan saya menemukan bukti dokumenter tentang fakta ini. Saya sangat bingung dan kecewa dengan hal ini.

Tugas itu dengan lancar berubah menjadi masalah.

Apa saja pilihannya?

  • Buat dua klien di server berbeda yang bertukar data yang diperlukan dengan beberapa perangkat lunak pihak ketiga. Penting untuk menemukan perangkat lunak pihak ketiga yang dapat mengimplementasikan fungsi ini - Saya tidak suka penggaruk seperti itu, tetapi sepertinya ini adalah satu-satunya solusi cepat.
  • Tulis skrip Anda sendiri untuk sinkronisasi data antar server. Faktanya adalah Kerio menyimpan setiap objek sebagai file terpisah, sehingga perlu untuk mengembangkan skrip untuk bekerja dengan file, tetapi mengingat jumlah sumber yang memadai, tugasnya tampak agak rumit, terutama karena perlu melakukan banyak hal. memeriksa kebenaran data, apakah ada yang membuat tugas dalam jangka waktu yang sama, dsb., dsb.

Ke depan, saya akan mengatakan bahwa meskipun Kerio menyimpan suatu objek sebagai file terpisah, tidaklah bodoh untuk menanyakan bagaimana kinerja sistem file setiap kali Anda mengakses objek tersebut.

Setelah menghabiskan banyak waktu untuk berpikir, menyusun sekumpulan kertas dengan rencana β€œuntuk merebut wilayah musuh”, pada pukul 6 saya membuat dua keputusan yang tepat:

  • Keputusan pertama adalah melakukan urusan Anda sendiri dan tidak mencari apa pun dari luar.
  • Solusi kedua adalah tidur.

Di pagi hari saya bangun dengan satu pemikiran tunggal dan benar, yang direduksi menjadi beberapa huruf - DFS

keputusan

Solusinya sendiri terlihat seperti ini

  • membawa semua server yang akan berpartisipasi dalam sinkronisasi ke OS Windows. (Sebagiannya ada di Linux. Diperlukan migrasi data email ke OS lain)
  • Tentukan struktur direktori yang akan berpartisipasi dalam sinkronisasi - direktori tersebut harus identik.
  • Tentukan semua server email dalam satu domain dengan satu ruang DFS.
  • Buat domain Kerio terdistribusi yang disebutkan di atas, karena dalam kasus saya sinkronisasi data diperlukan, tidak hanya antar server tetapi juga antar domain; yang kedua dapat ditangani oleh server Kerio secara mandiri. (tidak seperti yang pertama)
  • Atur direktori yang disinkronkan ke ruang DFS.
  • Buatlah semacam tongkat penyangga (lagipula, Anda tidak bisa hidup tanpa tongkat penyangga)

Implementasi

Contoh pada dua server email (mungkin lebih)

1. Domain terdistribusi Kerio

Sinkronisasi penuh folder bersama, kontak, kalender antara server Kerio Connect yang didistribusikan

Master tidak berpartisipasi dalam sinkronisasi, tetapi ini bukan prasyarat.

Saya tidak akan menjelaskan cara membesarkan domain terdistribusi Kerio, tidak ada yang ribet, Anda bisa mempelajarinya secara resmi manul

Pada akhirnya, Anda akan melihat gambar berikut di konsol administrasi:

Sinkronisasi penuh folder bersama, kontak, kalender antara server Kerio Connect yang didistribusikan

Sinkronisasi penuh folder bersama, kontak, kalender antara server Kerio Connect yang didistribusikan

Selanjutnya saya tertarik pada folder bersama; di server Master Anda dapat menentukan opsi berikut:

Sinkronisasi penuh folder bersama, kontak, kalender antara server Kerio Connect yang didistribusikan

Sinkronisasi penuh folder bersama, kontak, kalender antara server Kerio Connect yang didistribusikan

Khusus untuk setiap domain - server tidak akan menyinkronkan folder publik antar domain

Umum untuk semua domain - semua server akan meninggalkan folder publik yang ada di setiap domain dan membuat folder tunggal baru untuk semua domain di setiap server email.

Peringatan! Meskipun opsi ini mengubah kebijakan konfigurasi di semua server, opsi ini melakukan sinkronisasi secara terpisah dari setiap server (yaitu, tanpa satu ruang bersama)

Administrator masih memiliki kemampuan untuk mendistribusikan akses antar pengguna.
dalam kasus saya, semuanya milik saya dan saya memerlukan sinkronisasi penuh (Dalam kasus Anda, solusinya mungkin berbeda) di setiap server Anda perlu membuat kumpulan domain identik yang perlu disinkronkan.

2. Direktori data Kerio

Sekarang Anda perlu membuat direktori bersama yang identik yang perlu disinkronkan di setiap server. Folder, Kalender, Kontak.

Saran - buat direktori dalam bahasa Inggris, jika Anda membuatnya dalam bahasa Latin, direktori tersebut akan memiliki nama dalam pengkodean yang tidak dapat dipahami, setidaknya ini merepotkan.

Sekarang Anda perlu menemukan jalur fisik folder email di setiap server.

Umum untuk semua domain ~DataMailmail#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs
Khusus untuk setiap domain ~DataMailmail**Domain**#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs

Harap dicatat bahwa kami tidak akan menyinkronkan seluruh direktori, tetapi hanya wadah dengan datanya #pesan β€” objeknya sendiri disimpan di sini, semua data lainnya harus terpisah untuk setiap server.

3.DFS

Saya tidak akan menjelaskan secara detail cara mengkonfigurasi DFS, informasi tentang masalah ini sudah cukup.

DFS adalah layanan peran di Windows Server yang menyediakan kemampuan untuk menggabungkan folder bersama yang terletak di server berbeda
Tautan ke dokumen MS DFS

Sebelum menyiapkan DFS, Anda harus menghentikan semua server email yang akan berpartisipasi dalam sinkronisasi data.

Setelah menyelesaikan pengaturan, Anda akan menerima gambar berikut untuk setiap folder yang disinkronkan

Sinkronisasi penuh folder bersama, kontak, kalender antara server Kerio Connect yang didistribusikan

Tentu saja, kita tidak perlu memublikasikan folder yang direplikasi.

Sinkronisasi penuh folder bersama, kontak, kalender antara server Kerio Connect yang didistribusikan

Setelah replikasi terjadi (dan tidak ada yang khusus untuk direplikasi di sana - foldernya kosong), server email dapat dimulai.

Selanjutnya, Anda dapat mengisi salah satu server email dengan data dan memeriksa apakah data tersebut direplikasi dengan benar.

4. Kruk

Deskripsi refleksi

Seperti yang Anda lihat setelah data mulai disinkronkan (DFS), jika Anda membuat sesuatu di server pertama, entah bagaimana tidak ada yang muncul di server kedua, atau muncul tetapi tidak selalu.

Jangan putus asa; tentu saja, hal itu akan muncul cepat atau lambat, tapi lebih baik cepat daripada nanti. Karena sudah terlambat dalam 6 – 12 jam.

Soalnya begitu Anda membuat sesuatu di server pertama, di server kedua dan selanjutnya tentu saja file tersebut akan langsung muncul berkat sistem DFS, tetapi jika direktori email ini sudah dibaca oleh seseorang sebelumnya. dan diminta lagi, server tidak akan membaca ulang folder #msgs tetapi akan mengeluarkan data dari indeksnya sendiri, yang mungkin tidak lagi sesuai dengan kenyataan kita.

Kerio memiliki mekanisme untuk membaca ulang indeks, namun dapat bekerja dalam waktu sekitar enam jam, dan selama 6 jam tersebut relevansi tugas di kalender mungkin agak hilang.
Untuk menguji sinkronisasi sekarang, Anda dapat menghapus file di direktori tersinkronisasi yang sesuai index.fld, setelah mengakses kembali folder di server email dan jika file ini hilang, Kerio akan membaca ulang direktori dan datanya akan muncul. Tampaknya ini adalah solusinya, hapus file ketika data berubah, tetapi ini tidak berfungsi setiap saat, tetapi hanya pertama kali, kemudian Kerio karena alasan tertentu kehilangan minat pada index.fld
Itu juga mulai mengeluarkan pesan-pesan yang tidak dapat dipahami oleh pengguna - tentang semacam indeks dan bahwa ia sudah melakukan sesuatu di sana.

Ada opsi lain, untuk membuat sesuatu - pada saat membuat objek baru, server tiba-tiba menyadari bahwa nama file yang ingin ditetapkan sudah diambil, tetapi menjadi semakin besar dan ini adalah opsi buntu.

Bagaimana itu bisa terjadi?

Jika kita perhatikan sekali lagi gambar yang sudah tidak asing lagi di telinga kita.

Sinkronisasi penuh folder bersama, kontak, kalender antara server Kerio Connect yang didistribusikan

Namun di pesawat lain, Anda dapat melihat tombol yang sangat menarik yang kita perlukan sekarang - Indeks ulang folder

Dan memang benar. Jika kita mengklik tombol ini di server email yang tidak mengetahui bahwa ada sesuatu yang berubah di #msgs yang disinkronkan, kita akan mendapatkan hasil yang stabil dan cepat. Segala sesuatu yang tersembunyi akan menjadi jelas.

Di log Anda dapat melihat berapa lama proses ini berlangsung; dalam kasus saya dengan beberapa ribu (15 ribu) catatan, dibutuhkan sekitar 3-4 menit.

Yang harus kita lakukan adalah mencari cara untuk menekan tombol ini saat kita membutuhkannya.

Ternyata kerio memiliki mereka sendiri API

ОписаниС
ДокумСнтация

Fungsi yang melakukan tugas kita terlihat seperti ini:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Dari penjelasan di atas, kita perlu menulis skrip yang akan memantau status folder yang diinginkan dan, jika ada yang berubah, menjalankan fungsi yang kita perlukan.

Saya ingin mengatakan bahwa saya menulis beberapa versi skrip berbeda yang melakukan pemeriksaan berbeda, dan memilih versi skrip yang menarik semua kesimpulan berdasarkan jumlah file.

Implementasi skrip

Contoh dan penjelasan script CMD

Indeks ulang.bat

@echo off
set dir=%~dp0
%dir:~0,2%
CD "%~dp0"
md "%CD%LOG"
md "%CD%Setup"

ECHO -Start- >> "%CD%LOG%Computername%.log"
ECHO Start -> %Computername% %Date% %Time% >> "%CD%LOG%Computername%.log"

SetLocal EnableDelayedExpansion
for /f "UseBackQ Delims=" %%A IN ("%CD%Setup%Computername%.List") do (
  set /a c+=1
  set "m!c!=%%A"
)

set d=%c%
Echo Folder = %c%
ECHO Folder = %c% >> "%CD%LOG%Computername%.log"
ECHO.
ECHO. >> "%CD%LOG%Computername%.log"

:start
cls
if %c% LSS 1 exit
set /a id=1
set R=0

:Find
REM PF-Start
if "%id%" gtr "%c%" if %R% == 1 Goto Reindex 
if "%id%" gtr "%c%" timeout 60 && Goto start

For /F "tokens=1-3" %%a IN ('Dir "!m%id%!#msgs" /-C/S/A:-D') Do Set 2DirSize!id!=!DS!& Set DS=%%c
if "2DirSize!id!" == "" set 1DirSize!id!=!2DirSize%id%!

echo %id%
ECHO !m%id%!
echo Count        [ !1DirSize%id%! -- !2DirSize%id%! ]

if "!1DirSize%id%!" == "!2DirSize%id%!" ECHO Synk

REM DEL index.fld
if "!1DirSize%id%!" NEQ "!2DirSize%id%!" del /f /q !m%id%!index.fld && del /f /q !m%id%!indexlog.fld && del /f /q !m%id%!search.fld && set R=1 && ECHO RE-index Count && ECHO RE-index Count %Date% %Time% - Delete !m%id%! >> "%CD%LOG%Computername%.log"

set 1DirSize!id!=!2DirSize%id%!

ECHO.
ECHO.

set /a id+=1
goto Find

:Reindex
ECHO. >> "%CD%LOG%Computername%.log"
ECHO --- RE-INDEX - Start - %Date% %Time% --- >> "%CD%LOG%Computername%.log"
ECHO. >> ----------------------------------- >> "%CD%LOG%Computername%.log"
call PublicFolders.py
timeout 60
goto start

exit

Salinan skrip berjalan di setiap server email (dapat digunakan sebagai layanan, hak Adm tidak diperlukan)

Skrip membaca file Setup%Computername%.List

Dimana %Nama Komputer% adalah nama server saat ini (Direktori dapat berisi daftar semua server sekaligus.)

File %Nama Komputer%.Daftar – berisi jalur lengkap dari direktori yang disinkronkan, setiap jalur ditulis pada baris baru, dan tidak boleh berisi baris kosong.

Setelah peluncuran pertama, skrip melakukan prosedur pengindeksan, terlepas dari apakah perlu atau tidak, dan skrip juga membuat indeks jumlah file di setiap direktori yang disinkronkan.

Tujuan skrip ini adalah untuk menghitung semua file di direktori yang ditentukan.

Di akhir penghitungan setiap direktori, jika dalam setidaknya satu direktori nilai file saat ini tidak cocok dengan nilai sebelumnya, skrip akan menghapus file dari direktori root dari direktori email yang disinkronkan: index.fld, indexlog.fld, search.fld dan memulai proses pengindeksan folder email bersama.

Informasi tentang pelaksanaan tugas dibuang ke direktori LOG.

Proses pengindeksan
Proses pengindeksan dilakukan untuk menjalankan fungsi Kerio API
Sesi = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Contoh implementasi diberikan di – python
Folder Publik.py

import json
import urllib.request
import http.cookiejar
""" Cookie storage is necessary for session handling """
jar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar))
urllib.request.install_opener(opener)
""" Hostname or ip address of your Kerio Control instance with protocol, port and credentials """

server = "http://127.0.0.1:4040"
username = "user"
password = "password"

def callMethod(method, params, token = None):
    """
    Remotely calls given method with given params.
    :param: method string with fully qualified method name
    :param: params dict with parameters of remotely called method
    :param: token CSRF token is always required except login method. Use method "Session.login" to obtain this token.
    """
    data =  {"method": method ,"id":1, "jsonrpc":"2.0", "params": params}

    req = urllib.request.Request(url = server + '/admin/api/jsonrpc/')
    req.add_header('Content-Type', 'application/json')
    if (token is not None):
        req.add_header('X-Token', token)    

    httpResponse = urllib.request.urlopen(req, json.dumps(data).encode())

    if (httpResponse.status == 200):
        body = httpResponse.read().decode()
        return json.loads(body)

session = callMethod("Session.login", {"userName":username, "password":password, "application":{"vendor":"Kerio", "name":"Control Api-Local", "version":"Python"}})
token = session["result"]["token"]
print (session)

session = callMethod("Domains.checkPublicFoldersIntegrity",{"domainId": "test2.local"}, token)
print (session)

callMethod("Session.logout",{}, token)

http://127.0.0.1:4040 Anda dapat membiarkannya apa adanya, tetapi jika Anda memerlukan HTTPS, python harus mempercayai sertifikat Kerio.

Juga dalam file tersebut Anda harus menentukan akun dengan hak untuk melakukan fungsi ini (Adm - folder surat publik) dari server surat.

Saya harap artikel saya bermanfaat bagi administrator Kerio Connect.

Sumber: www.habr.com

Tambah komentar