Potpuna sinkronizacija dijeljenih mapa, kontakata, kalendara između distribuiranih Kerio Connect poslužitelja

Dobar dan, Habr!

Zadatak

Moja organizacija koristi poslužitelj pošte na platformi Kerio Connect; poslužitelji pošte instalirani su u različitim gradovima kako bi služili svojim korisnicima. U početku nije bilo distribuirane strukture, budući da se domene razlikuju na trećoj razini, označavajući grad stranice. Sve je radilo i svi su bili zadovoljni. Jednog lijepog dana, uprava je postavila zadatak, zajednički kalendar aktivnosti između svih stranica!

prapovijest

U početku je ideja bila podići Kerio Distributed Mail Domain i on će sve sam raditi. Rečeno, učinjeno, stvorena je distribuirana domena, ali to nije bio slučaj, poslužitelj je bio spreman za sinkronizaciju kalendara, mapa, kontakata – između domena smještenih na istom poslužitelju, ali uopće nije namjeravao sinkronizirati podatke između nekoliko poslužitelji.

Nisam, naravno, očekivao takav ulov i dugo nisam mogao vjerovati da nedostaje funkcionalnost koja mi je potrebna. Kasnije sam pronašao dokumentarne dokaze o ovoj činjenici. Bio sam vrlo zbunjen i razočaran time.

Zadatak se glatko pretvorio u problem.

Koje su bile opcije?

  • Napravite dva klijenta na različitim poslužiteljima koji razmjenjuju potrebne podatke s nekim softverom treće strane. Bilo je potrebno pronaći softver treće strane koji bi implementirao ovu funkcionalnost - ne volim takve grablje, ali činilo se da je to jedino brzo rješenje.
  • Napišite vlastitu skriptu za sinkronizaciju podataka između poslužitelja. Činjenica je da Kerio svaki objekt pohranjuje kao zasebnu datoteku, pa je bilo potrebno razviti skriptu za rad s datotekama, no s obzirom na dovoljan broj izvora zadatak se činio pomalo kompliciranim, pogotovo jer je bilo potrebno izvršiti više provjerava ispravnost podataka, ako netko kreira zadatak u istom vremenskom periodu, itd., itd.

Gledajući unaprijed, reći ću da, iako Kerio pohranjuje objekt kao zasebnu datoteku, nije toliko glupo pitati kako je datotečni sustav svaki put kada pristupite objektu.

Nakon što sam proveo dosta vremena razmišljajući, sastavljajući hrpu papirića s planovima "zauzimanja neprijateljskog teritorija", u 6 sati donio sam dvije ispravne odluke:

  • Prva odluka je raditi po svom i ne tražiti ništa izvana.
  • Drugo rješenje je otići na spavanje.

Već ujutro sam se probudio s jednom jedinom i istinitom mišlju, koja se svela na nekoliko slova - DFS

odluka

Samo rješenje izgledalo je ovako

  • dovesti sve poslužitelje koji će sudjelovati u sinkronizaciji na OS Windows. (Dio je bio na Linuxu. Bila je potrebna migracija podataka pošte na drugi OS)
  • Odredite strukturu imenika koji će sudjelovati u sinkronizaciji – moraju biti identični.
  • Definirajte sve poslužitelje e-pošte pod jednom domenom s jednim DFS prostorom.
  • Napravite gore navedenu distribuiranu Kerio domenu, budući da je u mom slučaju potrebna sinkronizacija podataka, ne samo između poslužitelja, već i između domena; drugom se može samostalno baviti Kerio poslužitelj. (za razliku od prvog)
  • Postavite sinkronizirane direktorije na DFS prostor.
  • Smislite neku vrstu štake (uostalom, ne možete živjeti bez štake)

Provedba

Primjer na dva poslužitelja pošte (možda i više)

1. Kerio Distribuirana domena

Potpuna sinkronizacija dijeljenih mapa, kontakata, kalendara između distribuiranih Kerio Connect poslužitelja

Master ne sudjeluje u sinkronizaciji, ali to nije preduvjet.

Neću opisivati ​​kako podići Kerio distribuiranu domenu, u tome nema ništa komplicirano, možete proučiti službenu manul

Na kraju biste trebali vidjeti sljedeću sliku na konzoli za administraciju:

Potpuna sinkronizacija dijeljenih mapa, kontakata, kalendara između distribuiranih Kerio Connect poslužitelja

Potpuna sinkronizacija dijeljenih mapa, kontakata, kalendara između distribuiranih Kerio Connect poslužitelja

Zatim su me zanimale zajedničke mape; na glavnom poslužitelju možete odrediti sljedeće opcije:

Potpuna sinkronizacija dijeljenih mapa, kontakata, kalendara između distribuiranih Kerio Connect poslužitelja

Potpuna sinkronizacija dijeljenih mapa, kontakata, kalendara između distribuiranih Kerio Connect poslužitelja

Specifično za svaku domenu - poslužitelj neće sinkronizirati javne mape između domena

Zajedničko za sve domene - svi će poslužitelji napustiti postojeće javne mape u svakoj domeni i stvoriti nove pojedinačne mape za sve domene na svakom poslužitelju e-pošte.

Upozorenje! Iako ova opcija mijenja pravila konfiguracije na svim poslužiteljima, sinkronizira se zasebno sa svakog poslužitelja (to jest, bez jedinstvenog zajedničkog prostora)

Administrator će i dalje imati mogućnost raspodjele pristupa među korisnicima.
u mom slučaju, svi su moji i potrebna mi je potpuna sinkronizacija (u vašem slučaju rješenje može biti drugačije) na svakom poslužitelju trebate kreirati identične skupove domena koje je potrebno sinkronizirati.

2. Kerio direktoriji podataka

Sada morate stvoriti identične dijeljene direktorije koje je potrebno sinkronizirati na svakom od poslužitelja. Mape, kalendari, kontakti.

Savjet - stvorite imenike na engleskom, ako ih stvorite na latinici, imenik će imati naziv u nekom nerazumljivom kodiranju, ovo je u najmanju ruku nezgodno.

Sada trebate pronaći fizičke putove mapa pošte na svakom poslužitelju.

Zajedničko za sve domene ~DataMailmail#publicСинхронизируемый каталог#msgs
Specifično za svaku domenu ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Imajte na umu da nećemo sinkronizirati cijeli imenik, već samo spremnik s podacima #poruke — ovdje se pohranjuju sami objekti, svi ostali podaci moraju biti zasebni za svaki poslužitelj.

3.DFS

Neću detaljno opisivati ​​kako konfigurirati DFS, ima dovoljno informacija o ovom pitanju.

DFS je usluga uloga u sustavu Windows Server koja pruža mogućnost kombiniranja dijeljenih mapa smještenih na različitim poslužiteljima
Link na MS DFS dokument

Prije postavljanja DFS-a morate zaustaviti sve poslužitelje e-pošte koji će sudjelovati u sinkronizaciji podataka.

Nakon dovršetka postavljanja, trebali biste primiti sljedeću sliku za svaku od sinkroniziranih mapa

Potpuna sinkronizacija dijeljenih mapa, kontakata, kalendara između distribuiranih Kerio Connect poslužitelja

Naravno, ne moramo objavljivati ​​replicirane mape.

Potpuna sinkronizacija dijeljenih mapa, kontakata, kalendara između distribuiranih Kerio Connect poslužitelja

Nakon što dođe do replikacije (a tu nema ništa posebno za replicirati - mape su prazne), poslužitelji e-pošte mogu se pokrenuti.

Zatim možete ispuniti jedan od poslužitelja e-pošte podacima i provjeriti jesu li podaci ispravno replicirani.

4. Štaka

Opis odraza

Kao što možete vidjeti nakon što se podaci počnu sinkronizirati (DFS), ako ste kreirali nešto na prvom poslužitelju, nekako se ništa ne pojavljuje na drugom poslužitelju ili se pojavljuje, ali nekako ne uvijek.

Ne očajavajte, naravno, pojavit će se prije ili kasnije, ali bolje prije nego kasnije. Zato što je prekasno za 6 – 12 sati.

Stvar je u tome da čim ste nešto kreirali na prvom poslužitelju, na drugom i narednim poslužiteljima datoteka će se naravno odmah pojaviti zahvaljujući DFS sustavu, ali u slučaju da je ovaj mail imenik već netko prije pročitao i bude ponovno zatražen, poslužitelj neće ponovno pročitati mapu #msgs, već će izbaciti podatke iz vlastitog indeksa, koji možda više ne odgovaraju našoj stvarnosti.

Kerio ima mehanizam za ponovno čitanje indeksa, ali može raditi za oko šest sati, a tijekom tih 6 sati relevantnost zadatka u kalendaru može se donekle izgubiti.
Kako biste odmah testirali sinkronizaciju, možete izbrisati datoteku u odgovarajućem sinkroniziranom direktoriju index.fld, nakon ponovnog pristupa mapi na poslužitelju e-pošte i ako ta datoteka nedostaje, Kerio će ponovno pročitati direktorij i podatke pojavit će se. Čini se da je ovo rješenje, izbrišite datoteku kada se podaci promijene, ali to ne radi svaki put, već samo prvi put, tada Kerio iz nekog razloga gubi sav interes za index.fld
Također počne bljivati ​​korisniku nerazumljive poruke - o nekakvom indeksu i da on tu već nešto radi.

Postoji još jedna opcija, kreirati nešto - u trenutku kreiranja novog objekta, server odjednom shvati da je ime datoteke koje je htio dodijeliti već zauzeto, ali dolazi do grudve snijega i to je slijepa opcija.

Kako je to moguće?

Ako još jednom obratimo pažnju na već poznatu nam sliku.

Potpuna sinkronizacija dijeljenih mapa, kontakata, kalendara između distribuiranih Kerio Connect poslužitelja

Ali na drugoj ravnini možete vidjeti vrlo zanimljiv gumb koji nam je sada potreban - Ponovno indeksiranje mapa

I doista. Ako kliknemo na ovaj gumb na poslužitelju e-pošte koji ne zna da se već nešto promijenilo u sinkroniziranim #msgs, dobit ćemo stabilan, brz rezultat. Sve skriveno postat će jasno.

U logu možete vidjeti koliko taj proces traje, u mom slučaju s nekoliko tisuća (15 tisuća) zapisa traje oko 3-4 minute.

Sve što trebamo učiniti je smisliti kako zapravo pritisnuti ovaj gumb kada nam zatreba.

Ispostavilo se da Kerio imaju svoje API

Opis
Документация

Funkcija koja obavlja naš zadatak izgleda ovako:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Iz svega navedenog trebamo napisati skriptu koja bi pratila stanje fascikli od interesa i, ako se nešto promijenilo, obavljala funkciju koju trebamo.

Želim reći da sam napisao nekoliko različitih verzija skripti koje vrše različite provjere, a odlučio sam se za onu koja sve zaključke izvodi na temelju broja datoteka.

Implementacija skripte

Primjer i opis CMD skripte

Ponovno indeksiranje.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

Kopija skripte radi na svakom poslužitelju e-pošte (može se koristiti kao usluga, nisu potrebna prava administratora)

Skripta čita datoteku Setup%Computername%.List

Gdje je %Computername% naziv trenutnog poslužitelja (direktorij može sadržavati popise svih poslužitelja odjednom.)

Datoteka %Computername%.List – sadrži pune staze sinkroniziranih direktorija, svaka se staza piše u novom retku i ne smije sadržavati prazne retke.

Nakon prvog pokretanja, skripta provodi proceduru indeksiranja, bez obzira je li potrebna ili ne, a skripta također kreira indeks broja datoteka u svakom sinkroniziranom direktoriju.

Svrha skripte je prebrojati sve datoteke u navedenom direktoriju.

Na kraju brojanja svakog direktorija, ako u barem jednom direktoriju trenutna vrijednost datoteka ne odgovara prethodnoj, skripta briše datoteke iz korijenskog direktorija sinkroniziranog direktorija pošte: index.fld, indexlog.fld, search.fld i pokreće proces indeksiranja zajedničkih mapa pošte.

Informacije o izvršenju zadatka ubacuju se u direktorij LOG.

Proces indeksiranja
Proces indeksiranja svodi se na izvršavanje Kerio API funkcije
Sesija = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Primjer implementacije je dan u – python
Javne mape.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 možete ostaviti kako jest, ali ako vam je potreban HTTPS, python mora vjerovati Kerio certifikatu.

Također u datoteci morate navesti račun s pravima za obavljanje ove funkcije (Adm - javne mape pošte) poslužitelja pošte.

Nadam se da će moj članak biti koristan administratorima Kerio Connecta.

Izvor: www.habr.com

Dodajte komentar