Plná synchronizácia zdieľaných priečinkov, kontaktov, kalendárov medzi distribuovanými servermi Kerio Connect

Dobré popoludnie, Habr!

Úloha

Moja organizácia používa poštový server na platforme Kerio Connect, poštové servery sú nainštalované v rôznych mestách, aby slúžili svojim používateľom. Spočiatku neexistovala žiadna distribuovaná štruktúra, pretože domény sa líšia na tretej úrovni, čo naznačuje mesto lokality. Všetko fungovalo a všetci boli spokojní. Jedného pekného dňa vedenie stanovilo úlohu, spoločný kalendár aktivít medzi všetkými lokalitami!

pravek

Pôvodnou myšlienkou bolo zvýšiť doménu Kerio Distributed Mail, ktorá by všetko spravila sama. Hneď ako bolo povedané, bola vytvorená distribuovaná doména, ale nebolo to tak, server bol pripravený synchronizovať kalendáre, priečinky, kontakty - medzi doménami umiestnenými na rovnakom serveri, ale vôbec sa nechystal synchronizovať údaje medzi niekoľkými serverov.

Takýto úlovok som, samozrejme, nečakal a dlho som nemohol uveriť, že chýba funkcia, ktorú potrebujem. Neskôr som našiel listinné dôkazy o tejto skutočnosti. Bol som z toho veľmi zmätený a sklamaný.

Úloha sa plynule zmenila na problém.

Aké boli možnosti?

  • Vytvorte dvoch klientov na rôznych serveroch, ktorí si vymieňajú potrebné údaje s nejakým softvérom tretích strán. Bolo potrebné nájsť tento softvér tretej strany, ktorý by implementoval túto funkciu - nepáči sa mi taký rake, ale zdalo sa, že to bolo jediné rýchle riešenie.
  • Napíšte si vlastný skript na synchronizáciu dát medzi servermi. Faktom je, že Kerio ukladá každý objekt ako samostatný súbor, takže bolo potrebné vyvinúť skript pre prácu so súbormi, no vzhľadom na dostatočný počet zdrojov sa táto úloha zdala trochu komplikovaná, najmä preto, že bolo potrebné vykonať viacero kontroluje správnosť údajov, v prípade, že niekto vytvorí úlohu v rovnakom časovom období atď., atď.

Pri pohľade do budúcnosti poviem, že aj keď Kerio ukladá objekt ako samostatný súbor, nie je to také hlúpe, aby ste sa pri každom prístupe k objektu spýtali, ako je na tom súborový systém.

Keď som strávil veľa času premýšľaním, zostavením kúskov papiera s plánmi „zabaviť nepriateľské územie“, o šiestej som urobil dve správne rozhodnutia:

  • Prvé rozhodnutie je robiť si po svojom a nehľadať nič zvonku.
  • Druhým riešením je ísť spať.

Už ráno som sa zobudil s jednou jedinou a pravdivou myšlienkou, ktorá bola zredukovaná na pár písmen – DFS

rozhodnutie

Samotné riešenie vyzeralo takto

  • preniesť všetky servery, ktoré sa budú podieľať na synchronizácii, do OS Windows. (Časť bola na Linuxe. Bola potrebná migrácia poštových údajov do iného OS)
  • Určite štruktúru adresárov, ktoré sa budú podieľať na synchronizácii – musia byť identické.
  • Definujte všetky poštové servery pod jednou doménou s jedným priestorom DFS.
  • Vytvorte si vyššie spomínanú distribuovanú doménu Kerio, keďže v mojom prípade je potrebná synchronizácia dát nielen medzi servermi, ale aj medzi doménami, druhú môže server Kerio zvládnuť samostatne. (na rozdiel od prvého)
  • Nastavte synchronizované adresáre na priestor DFS.
  • Vymyslite si nejakú barličku (koniec koncov, bez barle nemôžete žiť)

Реализация

Príklad na dvoch poštových serveroch (možno viac)

1. Distribuovaná doména Kerio

Plná synchronizácia zdieľaných priečinkov, kontaktov, kalendárov medzi distribuovanými servermi Kerio Connect

Master sa nezúčastňuje synchronizácie, ale nie je to podmienkou.

Nebudem popisovať, ako získať distribuovanú doménu Kerio, nie je na tom nič zložité, môžete si preštudovať oficiálne manul

Nakoniec by ste v administračnej konzole mali vidieť nasledujúci obrázok:

Plná synchronizácia zdieľaných priečinkov, kontaktov, kalendárov medzi distribuovanými servermi Kerio Connect

Plná synchronizácia zdieľaných priečinkov, kontaktov, kalendárov medzi distribuovanými servermi Kerio Connect

Ďalej ma zaujímali zdieľané priečinky, na hlavnom serveri môžete určiť nasledujúce možnosti:

Plná synchronizácia zdieľaných priečinkov, kontaktov, kalendárov medzi distribuovanými servermi Kerio Connect

Plná synchronizácia zdieľaných priečinkov, kontaktov, kalendárov medzi distribuovanými servermi Kerio Connect

Špecifické pre každú doménu - server nebude synchronizovať verejné priečinky medzi doménami

Spoločné pre všetky domény - všetky servery opustia existujúce verejné priečinky v každej doméne a vytvoria nové samostatné priečinky pre všetky domény na každom poštovom serveri.

Varovanie! Hoci táto možnosť mení konfiguračnú politiku na všetkých serveroch, synchronizuje sa oddelene od každého servera (t. j. bez jediného spoločného priestoru)

Správca bude mať stále možnosť rozdeliť prístup medzi používateľov.
v mojom prípade sú všetky moje a potrebujem úplnú synchronizáciu (vo vašom prípade môže byť riešenie iné) na každom serveri musíte vytvoriť identické sady domén, ktoré je potrebné synchronizovať.

2. Adresáre údajov Kerio

Teraz musíte vytvoriť identické zdieľané adresáre, ktoré je potrebné synchronizovať na každom zo serverov. Priečinky, kalendáre, kontakty.

Rada - vytvorte adresáre v angličtine, ak ich vytvoríte v latinke, adresár bude mať názov v nejakom nezrozumiteľnom kódovaní, to je prinajmenšom nepohodlné.

Teraz musíte nájsť fyzické cesty poštových priečinkov na každom serveri.

Spoločné pre všetky domény ~DataMailmail#publicСинхронизируемый каталог#msgs
Špecifické pre každú doménu ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Upozorňujeme, že nebudeme synchronizovať celý adresár, ale iba kontajner s údajmi #msgs — tu sú uložené samotné objekty, všetky ostatné údaje musia byť pre každý server oddelené.

3.DFS

Nebudem podrobne popisovať, ako nakonfigurovať DFS, o tomto probléme je dostatok informácií.

DFS je služba role v systéme Windows Server, ktorá poskytuje možnosť kombinovať zdieľané priečinky umiestnené na rôznych serveroch
Odkaz na dokument MS DFS

Pred nastavením DFS musíte zastaviť všetky poštové servery, ktoré sa budú podieľať na synchronizácii údajov.

Po dokončení nastavenia by ste mali dostať nasledujúci obrázok pre každý zo synchronizovaných priečinkov

Plná synchronizácia zdieľaných priečinkov, kontaktov, kalendárov medzi distribuovanými servermi Kerio Connect

Prirodzene, nemusíme publikovať replikované priečinky.

Plná synchronizácia zdieľaných priečinkov, kontaktov, kalendárov medzi distribuovanými servermi Kerio Connect

Po vykonaní replikácie (a nie je tam nič zvláštne na replikáciu - priečinky sú prázdne), môžu byť spustené poštové servery.

Potom môžete naplniť jeden z poštových serverov údajmi a skontrolovať, či sú údaje správne replikované.

4. Barla

Popis odrazu

Ako môžete vidieť po začatí synchronizácie údajov (DFS), ak ste buď niečo vytvorili na prvom serveri, na druhom serveri sa akosi nič neobjaví, alebo sa objaví, ale nie vždy.

Nezúfajte, samozrejme, skôr či neskôr sa tam objaví, ale radšej skôr ako neskôr. Pretože o 6-12 hodín je neskoro.

Ide o to, že akonáhle niečo vytvoríte na prvom serveri, na druhom a ďalších serveroch sa súbor samozrejme okamžite zobrazí vďaka systému DFS, ale v prípade, že tento poštový adresár už niekto čítal a je znovu požiadaný, server nebude znova čítať priečinok #msgs, ale vypľuje údaje z vlastného indexu, ktorý už nemusí zodpovedať našej realite.

Kerio má mechanizmus na opätovné čítanie indexu, ale ten môže fungovať približne za šesť hodín a počas týchto 6 hodín sa môže význam úlohy v kalendári trochu stratiť.
Ak chcete synchronizáciu otestovať hneď teraz, môžete odstrániť súbor v príslušnom synchronizovanom adresári index.fld, po opätovnom prístupe k priečinku na poštovom serveri a ak tento súbor chýba, Kerio znova načíta adresár a údaje objaví sa. Zdalo by sa, že toto je riešenie, vymažte súbor pri zmene údajov, ale nefunguje to zakaždým, ale iba prvýkrát, potom Kerio z nejakého dôvodu stratí záujem o index.fld
Tiež začne chrliť správy, ktoré sú pre používateľa nezrozumiteľné - o nejakom indexe a že tam už niečo robí.

Existuje ďalšia možnosť, niečo vytvoriť - v momente vytvárania nového objektu si server zrazu uvedomí, že názov súboru, ktorý chcel priradiť, je už obsadený, ale naskakuje snehová guľa a toto je slepá možnosť.

Ako je to možné?

Ak ešte raz venujeme pozornosť obrázku, ktorý je nám už známy.

Plná synchronizácia zdieľaných priečinkov, kontaktov, kalendárov medzi distribuovanými servermi Kerio Connect

Ale v inej rovine môžete vidieť veľmi zaujímavé tlačidlo, ktoré teraz potrebujeme - Preindexovať priečinky

A skutočne. Ak klikneme na toto tlačidlo na poštovom serveri, ktorý nevie, že sa v synchronizovanom #msgs už niečo zmenilo, dostaneme stabilný a rýchly výsledok. Všetko skryté sa vyjasní.

V logu vidíte, ako dlho tento proces trvá, v mojom prípade s niekoľkými tisíckami (15 tisíc) záznamov trvá približne 3-4 minúty.

Jediné, čo musíme urobiť, je prísť na to, ako vlastne toto tlačidlo stlačiť, keď ho potrebujeme.

Ukázalo sa Kerio mať svoje vlastné API

Popis
Záznamy

Funkcia, ktorá vykonáva našu úlohu, vyzerá takto:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Zo všetkého vyššie uvedeného musíme napísať skript, ktorý by monitoroval stav záujmových priečinkov a ak sa niečo zmenilo, vykonal funkciu, ktorú potrebujeme.

Chcem povedať, že som napísal niekoľko rôznych verzií skriptov, ktoré vykonávajú rôzne kontroly, a rozhodol som sa pre tú, ktorá vyvodzuje všetky závery na základe počtu súborov.

Implementácia skriptu

Príklad a popis skriptu CMD

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

Kópia skriptu beží na každom poštovom serveri (možno použiť ako službu, nie sú potrebné práva správcu)

Skript prečíta súbor Setup%Computername%.List

Kde %Computername% je názov aktuálneho servera (Adresár môže obsahovať zoznamy všetkých serverov naraz.)

Súbor %Computername%.List – obsahuje úplné cesty k synchronizovaným adresárom, každá cesta je napísaná na novom riadku a nemala by obsahovať prázdne riadky.

Po prvom spustení skript vykoná procedúru indexovania bez ohľadu na to, či je to potrebné alebo nie, a skript tiež vytvorí index počtu súborov v každom synchronizovanom adresári.

Účelom skriptu je spočítať všetky súbory v zadanom adresári.

Na konci počítania každého adresára, ak sa v aspoň jednom adresári aktuálna hodnota súborov nezhoduje s predchádzajúcim, skript vymaže súbory z koreňového adresára synchronizovaného poštového adresára: index.fld, indexlog.fld, search.fld a spustí proces indexovania zdieľaných poštových priečinkov.

Informácie o vykonaní úlohy sa vypisujú do adresára LOG.

Proces indexovania
Proces indexovania spočíva v spustení funkcie rozhrania Kerio API
Session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Príklad implementácie je uvedený v – python
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 môžete to nechať tak, ale ak požadujete HTTPS, python musí dôverovať certifikátu Kerio.

V súbore musíte zadať aj účet s právami na vykonávanie tejto funkcie (Adm - verejné poštové priečinky) poštového servera.

Dúfam, že môj článok bude užitočný pre správcov Kerio Connect.

Zdroj: hab.com

Pridať komentár