Tarqatilgan Kerio Connect serverlari o'rtasida umumiy papkalarni, kontaktlarni, kalendarlarni to'liq sinxronlashtirish

Xayrli kun, Xabr!

Maqsad

Mening tashkilotim Kerio Connect platformasida pochta serveridan foydalanadi; pochta serverlari o'z foydalanuvchilariga xizmat ko'rsatish uchun turli shaharlarda o'rnatilgan. Dastlab taqsimlangan tuzilma yo'q edi, chunki domenlar sayt shahrini ko'rsatuvchi uchinchi darajada farqlanadi. Hammasi ishladi va hamma xursand edi. Yaxshi kunlarning birida rahbariyat barcha saytlar o'rtasida umumiy faoliyat taqvimi, vazifa qo'ydi!

Sana oldin

Dastlab, Kerio tarqatilgan pochta domenini ko'tarish g'oyasi edi va u hamma narsani o'zi qiladi. Darhol aytilishicha, taqsimlangan domen yaratildi, ammo bunday emas edi, server bir xil serverda joylashgan domenlar o'rtasida taqvimlar, papkalar, kontaktlarni sinxronlashtirishga tayyor edi, lekin bir nechta domenlar o'rtasida ma'lumotlarni sinxronlashtirmoqchi emas edi. serverlar.

Men, albatta, bunday ushlashni kutmagan edim va uzoq vaqt davomida menga kerak bo'lgan funksionallik etishmayotganiga ishonmadim. Keyinchalik men bu faktning hujjatli dalillarini topdim. Men bundan juda hayron bo'ldim va hafsalam pir bo'ldi.

Vazifa muammosiz muammoga aylandi.

Variantlar qanday edi?

  • Ba'zi uchinchi tomon dasturlari bilan kerakli ma'lumotlarni almashadigan turli serverlarda ikkita mijoz yarating. Ushbu funktsiyani amalga oshiradigan uchinchi tomon dasturiy ta'minotini topish kerak edi - men bunday rakeni yoqtirmayman, lekin bu yagona tezkor echim bo'lib tuyuldi.
  • Serverlar o'rtasida ma'lumotlarni sinxronlashtirish uchun o'z skriptingizni yozing. Gap shundaki, Kerio har bir ob'ektni alohida fayl sifatida saqlaydi, shuning uchun fayllar bilan ishlash uchun skriptni ishlab chiqish kerak edi, ammo etarli miqdordagi manbalarni hisobga olgan holda, vazifa biroz murakkab bo'lib tuyuldi, ayniqsa bir nechta ob'ektni bajarish kerak edi. ma'lumotlarning to'g'riligini tekshiradi, agar kimdir xuddi shu vaqt ichida topshiriq yaratgan bo'lsa va hokazo.

Oldinga qarab, shuni aytamanki, Kerio ob'ektni alohida fayl sifatida saqlasa ham, har safar ob'ektga kirganingizda fayl tizimi qanday ishlashini so'rash unchalik ahmoq emas.

Ko'p vaqt o'ylab, "dushman hududini egallab olish" rejalari bilan bir nechta qog'oz parchalarini tuzib, soat 6 da ikkita to'g'ri qaror qabul qildim:

  • Birinchi qaror - o'z ishingni qilish va tashqaridan hech narsa qidirmaslik.
  • Ikkinchi yechim - uxlash.

Ertalab men bir nechta harflarga qisqartirilgan bitta va haqiqiy fikr bilan uyg'ondim - DFS

qaror

Yechimning o'zi shunday ko'rinardi

  • sinxronlashda ishtirok etadigan barcha serverlarni Windows OS ga keltiring. (Uning bir qismi Linuxda edi. Pochta ma'lumotlarini boshqa OT ga ko'chirish kerak edi)
  • Sinxronizatsiyada ishtirok etadigan kataloglarning tuzilishini aniqlang - ular bir xil bo'lishi kerak.
  • Bitta DFS maydoni bilan bitta domen ostidagi barcha pochta serverlarini belgilang.
  • Yuqorida aytib o'tilgan taqsimlangan Kerio domenini yarating, chunki mening holatimda ma'lumotlarni sinxronlashtirish nafaqat serverlar, balki domenlar o'rtasida ham talab qilinadi; ikkinchisini Kerio serveri mustaqil ravishda boshqarishi mumkin. (birinchisidan farqli o'laroq)
  • Sinxronlashtirilgan kataloglarni DFS maydoniga o'rnating.
  • Qandaydir tayoqchani o'ylab toping (oxir-oqibat, siz qo'ltiqsiz yashay olmaysiz)

РСализация

Ikki pochta serveridagi misol (ehtimol ko'proq)

1. Kerio taqsimlangan domen

Tarqatilgan Kerio Connect serverlari o'rtasida umumiy papkalarni, kontaktlarni, kalendarlarni to'liq sinxronlashtirish

Magistr sinxronizatsiyada ishtirok etmaydi, lekin bu shart emas.

Men Kerio taqsimlangan domenni qanday oshirishni tasvirlamayman, bu erda hech qanday murakkab narsa yo'q, siz rasmiyni o'rganishingiz mumkin manul

Oxir-oqibat, ma'muriyat konsolida quyidagi rasmni ko'rishingiz kerak:

Tarqatilgan Kerio Connect serverlari o'rtasida umumiy papkalarni, kontaktlarni, kalendarlarni to'liq sinxronlashtirish

Tarqatilgan Kerio Connect serverlari o'rtasida umumiy papkalarni, kontaktlarni, kalendarlarni to'liq sinxronlashtirish

Keyin men umumiy papkalarga qiziqdim; Master serverda siz quyidagi variantlarni belgilashingiz mumkin:

Tarqatilgan Kerio Connect serverlari o'rtasida umumiy papkalarni, kontaktlarni, kalendarlarni to'liq sinxronlashtirish

Tarqatilgan Kerio Connect serverlari o'rtasida umumiy papkalarni, kontaktlarni, kalendarlarni to'liq sinxronlashtirish

Har bir domen uchun maxsus - server umumiy papkalarni domenlar o'rtasida sinxronlashtirmaydi

Barcha domenlar uchun umumiy - barcha serverlar har bir domendagi mavjud umumiy papkalarni tark etadi va har bir pochta serveridagi barcha domenlar uchun yangi yagona papkalarni yaratadi.

E'tibor bering! Garchi ushbu parametr barcha serverlarda konfiguratsiya siyosatini o'zgartirsa ham, u har bir serverdan alohida sinxronlashtiriladi (ya'ni bitta umumiy maydonsiz)

Administrator hali ham foydalanuvchilar o'rtasida kirishni taqsimlash imkoniyatiga ega bo'ladi.
mening holatimda, ularning barchasi meniki va menga to'liq sinxronizatsiya kerak (sizning holingizda, yechim boshqacha bo'lishi mumkin) har bir serverda sinxronlashtirilishi kerak bo'lgan bir xil domenlar to'plamini yaratishingiz kerak.

2. Kerio ma'lumotlar kataloglari

Endi siz har bir serverda sinxronlashtirilishi kerak bo'lgan bir xil umumiy kataloglarni yaratishingiz kerak. Papkalar, kalendarlar, kontaktlar.

Maslahat - ingliz tilida kataloglarni yarating, agar siz ularni lotin tilida yaratsangiz, katalog ba'zi tushunarsiz kodlashda nomga ega bo'ladi, bu hech bo'lmaganda noqulay.

Endi siz har bir serverdagi pochta papkalarining jismoniy yo'llarini topishingiz kerak.

Barcha domenlar uchun umumiy ~DataMailmail#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs
Har bir domen uchun maxsus ~DataMailmail**Domain**#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs

Iltimos, biz butun katalogni emas, balki faqat konteynerni ma'lumotlar bilan sinxronlashtiramiz #xabarlar β€” ob'ektlarning o'zi bu erda saqlanadi, qolgan barcha ma'lumotlar har bir server uchun alohida bo'lishi kerak.

3.DFS

DFSni qanday sozlashni batafsil tasvirlab bermayman, bu masala bo'yicha etarli ma'lumot mavjud.

DFS Windows Serverdagi rol xizmati bo'lib, u turli serverlarda joylashgan umumiy papkalarni birlashtirish imkoniyatini beradi
MS DFS hujjatiga havola

DFS ni o'rnatishdan oldin siz ma'lumotlarni sinxronlashtirishda ishtirok etadigan barcha pochta serverlarini to'xtatishingiz kerak.

O'rnatishni tugatgandan so'ng, sinxronlangan papkalarning har biri uchun quyidagi rasmni olishingiz kerak

Tarqatilgan Kerio Connect serverlari o'rtasida umumiy papkalarni, kontaktlarni, kalendarlarni to'liq sinxronlashtirish

Tabiiyki, biz takrorlangan papkalarni nashr etishimiz shart emas.

Tarqatilgan Kerio Connect serverlari o'rtasida umumiy papkalarni, kontaktlarni, kalendarlarni to'liq sinxronlashtirish

Replikatsiya sodir bo'lgandan so'ng (va u erda takrorlash uchun maxsus hech narsa yo'q - papkalar bo'sh), pochta serverlarini ishga tushirish mumkin.

Keyinchalik, siz pochta serverlaridan birini ma'lumotlar bilan to'ldirishingiz va ma'lumotlarning to'g'ri takrorlanganligini tekshirishingiz mumkin.

4. Qo'ltiq tayoqcha

Ko'zgu tavsifi

Ma'lumotlar sinxronlash (DFS) boshlanganidan keyin ko'rib turganingizdek, agar siz birinchi serverda biror narsa yaratgan bo'lsangiz, ikkinchi serverda qandaydir tarzda hech narsa ko'rinmaydi yoki paydo bo'ladi, lekin qandaydir tarzda har doim ham emas.

Umidsizlikka tushmang, albatta, u erda ertami-kechmi paydo bo'ladi, lekin ertami-kechmi yaxshiroq. Chunki 6 - 12 soat ichida juda kech.

Gap shundaki, siz birinchi serverda biror narsa yaratganingizdan so'ng, ikkinchi va keyingi serverlarda fayl, albatta, DFS tizimi tufayli darhol paydo bo'ladi, ammo agar bu pochta katalogi allaqachon kimdir tomonidan o'qilgan bo'lsa. va yana so'ralsa, server #msgs jildini qayta o'qimaydi, balki o'z indeksidagi ma'lumotlarni chiqarib tashlaydi, bu endi bizning haqiqatimizga mos kelmasligi mumkin.

Kerio indeksni qayta o'qish mexanizmiga ega, ammo u taxminan olti soat ichida ishlashi mumkin va shu 6 soat ichida taqvimdagi vazifaning ahamiyati biroz yo'qolishi mumkin.
Sinxronizatsiyani hozir sinab ko'rish uchun siz pochta serveridagi papkaga qayta kirganingizdan so'ng index.fld mos sinxronlangan katalogdagi faylni o'chirishingiz mumkin va agar bu fayl yo'q bo'lsa, Kerio katalog va ma'lumotlarni qayta o'qiydi. paydo bo'ladi. Bu yechim bo'lib tuyuladi, ma'lumotlar o'zgarganda faylni o'chiring, lekin bu har safar ishlamaydi, lekin faqat birinchi marta, keyin Kerio negadir index.fld-ga qiziqishni yo'qotadi.
Shuningdek, u foydalanuvchi uchun tushunarsiz bo'lgan xabarlarni tupura boshlaydi - qandaydir indeks haqida va u allaqachon u erda nimadir qilmoqda.

Yana bir variant bor, biror narsa yaratish - yangi ob'ektni yaratish paytida, server to'satdan u tayinlamoqchi bo'lgan fayl nomi allaqachon olinganligini tushunadi, lekin u qor bo'ladi va bu o'lik variant.

Qanday qilib bo'lish kerak?

Bizga allaqachon tanish bo'lgan rasmga yana bir bor e'tibor qaratsak.

Tarqatilgan Kerio Connect serverlari o'rtasida umumiy papkalarni, kontaktlarni, kalendarlarni to'liq sinxronlashtirish

Ammo boshqa samolyotda siz bizga hozir kerak bo'lgan juda qiziqarli tugmani ko'rishingiz mumkin - Reindex papkalar

Va albatta. Sinxronlashtirilgan #msg'larda biror narsa o'zgarganligini bilmagan pochta serverida ushbu tugmani bossak, biz barqaror, tez natijaga erishamiz. Yashirin hamma narsa aniq bo'ladi.

Jurnalda bu jarayon qancha davom etishini ko'rishingiz mumkin, mening holatimda bir necha ming (15 ming) yozuvlar bilan bu taxminan 3-4 daqiqa davom etadi.

Biz qilishimiz kerak bo'lgan narsa, kerak bo'lganda ushbu tugmani qanday bosish kerakligini aniqlashdir.

Bu chiqadi Kerio o'zlariga ega API

tavsifi
hujjatlar

Bizning vazifamizni bajaradigan funktsiya quyidagicha ko'rinadi:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Yuqorida aytilganlarning barchasidan biz qiziqadigan papkalarning holatini kuzatadigan va agar biror narsa o'zgargan bo'lsa, bizga kerakli funktsiyani bajaradigan skript yozishimiz kerak.

Aytmoqchimanki, men turli xil tekshiruvlarni amalga oshiradigan skriptlarning bir nechta turli versiyalarini yozdim va fayllar soniga qarab barcha xulosalar chiqaradiganiga qaror qildim.

Skriptni amalga oshirish

CMD skript namunasi va tavsifi

Re-index.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

Skript nusxasi har bir pochta serverida ishlaydi (xizmat sifatida foydalanish mumkin, adm huquqlari talab qilinmaydi)

Skript faylni o'qiydi Setup%Computername%.List

Bu yerda %Computername% joriy server nomi (Katalog bir vaqtning o'zida barcha serverlar ro'yxatini o'z ichiga olishi mumkin.)

%Computername%.List fayli - sinxronlashtirilgan kataloglarning to'liq yo'llarini o'z ichiga oladi, har bir yo'l yangi satrga yoziladi va bo'sh satrlarni o'z ichiga olmaydi.

Birinchi ishga tushirilgandan so'ng, skript kerak yoki yo'qligidan qat'i nazar, indekslash protsedurasini bajaradi va skript har bir sinxronlashtirilgan katalogdagi fayllar soni indeksini ham yaratadi.

Skriptning maqsadi belgilangan katalogdagi barcha fayllarni hisoblashdir.

Har bir katalogni hisoblash oxirida, agar kamida bitta katalogdagi fayllarning joriy qiymati avvalgisiga mos kelmasa, skript sinxronlangan pochta katalogining asosiy katalogidan fayllarni o'chiradi: index.fld, indexlog.fld, search.fld va umumiy pochta papkalarini indekslash jarayonini boshlaydi.

Vazifaning bajarilishi haqidagi ma'lumotlar LOG katalogiga tashlanadi.

Indekslash jarayoni
Indekslash jarayoni Kerio API funktsiyasini bajarishga to'g'ri keladi
Sessiya = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Amalga oshirish misoli - pythonda keltirilgan
PublicFolders.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 uni avvalgidek qoldirishingiz mumkin, lekin agar sizga HTTPS kerak bo'lsa, python Kerio sertifikatiga ishonishi kerak.

Shuningdek, faylda pochta serverining ushbu funksiyasini (Adm - umumiy pochta papkalari) bajarish huquqiga ega hisob qaydnomasini ko'rsatishingiz kerak.

Umid qilamanki, mening maqolam Kerio Connect ma'murlari uchun foydali bo'ladi.

Manba: www.habr.com

a Izoh qo'shish