Sincronizazione cumpleta di cartulare spartuti, cuntatti, calendarii trà i servitori Kerio Connect distribuiti

Bona sera, Habr !

Objettivu

A mo urganizazione usa un servitore di mail nantu à a piattaforma Kerio Connect; i servitori di mail sò stallati in diverse cità per serve i so utilizatori. In principiu ùn ci era micca una struttura distribuita, postu chì i duminii sò diffirenti in u terzu livellu, indicà a cità di u situ. Tuttu hà travagliatu è tutti eranu felici. Un bellu ghjornu, a gestione hà stabilitu un compitu, un calendariu cumunu di attività trà tutti i siti !

Pristoria

Inizialmente, l'idea era di elevà u Dominiu di Mail Distributed Kerio è faria tuttu. Nantu à dì chì fattu, un duminiu distribuitu hè statu creatu, ma ùn era micca u casu, u servitore era prontu à sincronizà calendarii, cartulare, cuntatti - trà domini situati in u stessu servitore, ma ùn era micca in tuttu per sincronizà e dati trà parechji. servitori.

Eiu, sicuru, ùn m'aspittava micca una tale cattura è per un bellu pezzu ùn pudia micca crede chì a funziunalità chì avia bisognu mancava. Dopu aghju trovu evidenza documentale di stu fattu. Eru assai perplessu è disappuntu da questu.

U compitu s'hè vultatu in un prublema.

Chì eranu l'opzioni?

  • Crea dui clienti in diversi servitori chì scambianu e dati necessarii cù qualchì software di terzu. Era necessariu di truvà stu software di terzu chì implementava sta funziunalità - ùn mi piace micca tali rake, ma pareva chì questa era l'unica suluzione rapida.
  • Scrivite u vostru propiu script per a sincronizazione di dati trà i servitori. U fattu hè chì Kerio guarda ogni ughjettu cum'è un schedariu separatu, cusì era necessariu di sviluppà un script per travaglià cù i schedari, ma in vista di u numeru suffirenziu di fonti, u compitu pareva un pocu complicatu, soprattuttu chì era necessariu di realizà parechje. cuntrolla per a correttezza di i dati, in casu chì qualchissia crea compitu in u stessu periodu di tempu, etc., etc.

In u futuru, diceraghju chì, ancu s'ellu Kerio guarda un ughjettu cum'è un schedariu separatu, ùn hè micca cusì stupidu per dumandà cumu si face u sistema di fugliale ogni volta chì accede à l'ughjettu.

Dopu avè passatu assai tempu à pensà, scrivendu una mansa di pezzi di carta cù piani "per piglià u territoriu nemicu", à 6 ore aghju pigliatu duie decisioni ghjuste:

  • A prima decisione hè di fà a vostra propria cosa è ùn circà nunda da fora.
  • A seconda suluzione hè di andà à dorme.

Dighjà in a matina mi svegliu cun un pensamentu unicu è veru, chì era ridutta à uni pochi di lettere - DFS

dicisioni

A suluzione stessu pareva cusì

  • portate tutti i servitori chì participanu à a sincronizazione à u OS Windows. (Parte di questu era in Linux. Migrazione di dati di mail à un altru OS era necessariu)
  • Determinate a struttura di i cartulari chì participanu à a sincronizazione - deve esse idèntica.
  • Definite tutti i servitori di mail sottu un duminiu cù un unicu spaziu DFS.
  • Crea u duminiu Kerio distribuitu sopra citatu, postu chì in u mo casu, a sincronizazione di dati hè necessaria, micca solu trà i servitori, ma ancu trà i duminii; u sicondu pò esse trattatu da u servore Kerio indipindente. (a cuntrariu di u primu)
  • Pone i cartulari sincronizati à u spaziu DFS.
  • Venite cun un tipu di crutch (dopu à tuttu, ùn pudete micca campà senza una crutch)

Реализация

Esempiu nantu à dui servitori di mail (forse più)

1. Kerio Dominiu distribuitu

Sincronizazione cumpleta di cartulare spartuti, cuntatti, calendarii trà i servitori Kerio Connect distribuiti

U Maestru ùn participa micca à a sincronizazione, ma questu ùn hè micca un prerequisite.

Ùn descriveraghju micca cumu crià un duminiu distribuitu Kerio, ùn ci hè nunda di complicatu, pudete studià l'ufficiale. manu

In ultimamente, duvete vede l'imagine seguente in a cunsola di amministrazione:

Sincronizazione cumpleta di cartulare spartuti, cuntatti, calendarii trà i servitori Kerio Connect distribuiti

Sincronizazione cumpleta di cartulare spartuti, cuntatti, calendarii trà i servitori Kerio Connect distribuiti

In seguitu era interessatu à i cartulare spartuti; nantu à u servitore Master pudete specificà e seguenti opzioni:

Sincronizazione cumpleta di cartulare spartuti, cuntatti, calendarii trà i servitori Kerio Connect distribuiti

Sincronizazione cumpleta di cartulare spartuti, cuntatti, calendarii trà i servitori Kerio Connect distribuiti

Specificu per ogni duminiu - u servitore ùn sincronizeghja micca i cartulare publichi trà i duminii

Cumunu à tutti i domini - tutti i servitori abbandunaranu i cartulare publichi esistenti in ogni duminiu è creanu novi cartulare unichi per tutti i domini in ogni servitore di mail.

Attenzione! Ancu s'è sta opzione cambia a pulitica di cunfigurazione in tutti i servitori, sincronizza separatamente da ogni servitore (vale à dì, senza un unicu spaziu cumuni)

L'amministratore hà sempre a capacità di distribuisce l'accessu trà l'utilizatori.
in u mo casu, sò tutti i mei è aghju bisognu di una sincronizazione completa (In u vostru casu, a suluzione pò esse diversa) in ogni servitore avete bisognu di creà insemi idèntici di domini chì deve esse sincronizatu.

2. Cartulari di dati Kerio

Avà avete bisognu di creà cartulari spartuti identichi chì anu da esse sincronizzati nantu à ognunu di i servitori. Cartelle, Calendari, Cuntatti.

Cunsigliu - creanu cartulari in inglese, se li creanu in latinu, u repertoriu avarà un nome in qualchì codificazione incomprensibile, questu hè almenu inconveniente.

Avà avete bisognu di truvà i percorsi fisici di i cartulare di mail in ogni servitore.

Cumunu à tutti i domini ~DataMailmail#publicСинхронизируемый каталог#msgs
Specificu per ogni duminiu ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Per piacè nutate chì ùn sincronizeremu micca tuttu u cartulare, ma solu u cuntinuu cù i dati #msgs - l'uggetti stessi sò almacenati quì, tutti l'altri dati devenu esse separati per ogni servitore.

3.DFS

Ùn descriveraghju micca in dettagliu cumu cunfigurà DFS, ci hè abbastanza infurmazione nantu à questu prublema.

DFS hè un serviziu di rolu in Windows Server chì furnisce a capacità di cumminà cartulare spartuti situati in diversi servitori
Link à u documentu MS DFS

Prima di stallà DFS, duvete piantà tutti i servitori di mail chì participanu à a sincronizazione di dati.

Dopu à a fine di a stallazione, duvete riceve l'imaghjini seguenti per ognuna di i cartulare sincronizati

Sincronizazione cumpleta di cartulare spartuti, cuntatti, calendarii trà i servitori Kerio Connect distribuiti

Naturalmente, ùn avemu micca bisognu di pubblicà cartulare replicati.

Sincronizazione cumpleta di cartulare spartuti, cuntatti, calendarii trà i servitori Kerio Connect distribuiti

Dopu chì a replicazione hè accaduta (è ùn ci hè nunda di spiciale per riplicà quì - i cartulare sò vacanti), i servitori di mail ponu esse cuminciati.

In seguitu, pudete riempie unu di i servitori di mail cù dati è verificate chì e dati sò riplicati currettamente.

4. Crutch

Descrizzione di a riflessione

Comu pudete vede dopu chì i dati cumincianu à sincronizà (DFS), sè vo avete creatu qualcosa nantu à u primu servitore, in qualchì manera nunda ùn appare nantu à u sicondu servitore, o appare, ma in qualchì manera micca sempre.

Ùn disperate micca; di sicuru, apparirà quì prima o dopu, ma megliu prima chè dopu. Perchè hè troppu tardu in 6 - 12 ore.

A cosa hè chì quandu avete creatu qualcosa nantu à u primu servitore, nantu à u sicondu è i servitori sussegwenti, u schedariu appariscerà di sicuru immediatamente grazia à u sistema DFS, ma in l'eventu chì questu annuariu di mail hè digià statu lettu da qualchissia prima. è hè dumandatu di novu, u servitore ùn rileggerà micca u cartulare #msgs ma sputarà dati da u so propiu indice, chì ùn pò più currisponde à a nostra realità.

Kerio hà un mekanismu per re-leghje l'indici, ma pò travaglià in circa sei ore, è durante queste 6 ore, a rilevanza di u compitu in u calendariu pò esse un pocu persu.
Per pruvà a sincronizazione avà, pudete sguassate u schedariu in u repertoriu sincronizatu currispundente index.fld, dopu à accede à u cartulare nant'à u servitore di mail è s'ellu manca stu schedariu, Kerio rileghjerà u cartulare è i dati. apparirà. Sembra chì questu hè a suluzione, sguassate u schedariu quandu i cambiamenti di dati, ma questu ùn hè micca travagliatu ogni volta, ma solu a prima volta, allora Kerio per qualchì mutivu perde ogni interessu in index.fld
Hè ancu cuminciatu à sputanu missaghji chì sò incomprensibili per l'utilizatore - circa un tipu d'indici è chì hè digià fattu qualcosa quì.

Ci hè una altra opzione, per creà qualcosa - à u mumentu di a creazione di un novu ughjettu, u servitore sùbitu capisce chì u nome di u schedariu chì vulia assignà hè digià pigliatu, ma hè una bola di neve è questu hè una opzione senza fine.

Cumu serà?

Sè avemu attentu una volta di più à u ritrattu chì hè digià familiar à noi.

Sincronizazione cumpleta di cartulare spartuti, cuntatti, calendarii trà i servitori Kerio Connect distribuiti

Ma in un altru pianu, pudete vede un buttone assai interessante chì avemu bisognu avà - Reindexà i cartulare

È veramente. Se clicchemu nant'à stu buttone nantu à un servitore di mail chì ùn sapi micca chì qualcosa hà digià cambiatu in i #msgs sincronizati, averemu un risultatu stabile è veloce. Tuttu ciò chì hè ammucciatu diventerà chjaru.

In u logu pudete vede quantu dura stu prucessu; in u mo casu cù parechji milla (15 mila) records, ci vole circa 3-4 minuti.

Tuttu ciò chì avemu da fà hè di scopre cumu appughjà veramente stu buttone quandu avemu bisognu.

Risulta Kerio avè u so propiu API

discrizzione
Documentazione

A funzione chì esegue u nostru compitu s'assumiglia cusì:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Da tuttu ciò chì sopra, avemu bisognu di scrive un script chì seguite u statu di i cartulare d'interessu è, se qualcosa hà cambiatu, eseguisce a funzione chì avemu bisognu.

Vogliu dì chì aghju scrittu parechje versioni diffirenti di scripts chì facenu cuntrolli diffirenti, è stallatu nantu à quellu chì tira tutte e cunclusioni basatu annantu à u numeru di schedari.

Implementazione di script

Esempiu di scrittura CMD è descrizzione

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

Una copia di u script corre nantu à ogni servitore di mail (pò esse usatu cum'è serviziu, i diritti Adm ùn sò micca richiesti)

U script leghje u schedariu Setup%Computername%.List

Induve %Computername% hè u nome di u servitore attuale (U repertoriu pò cuntene listi di tutti i servitori à una volta).

U schedariu %Computername%.List - cuntene i percorsi cumpleti di i cartulari sincronizati, ogni percorsu hè scrittu nantu à una nova linea, è ùn deve micca cuntene linee vacanti.

Dopu à u primu lanciamentu, u script eseguisce a prucedura di indexazione, indipendendu s'ellu hè necessariu o micca, è u script crea ancu un indice di u numeru di schedari in ogni repertoriu sincronizatu.

U scopu di u script hè di cuntà tutti i schedari in u cartulare specificatu.

À a fine di cuntà ogni repertoriu, se in almenu un repertoriu u valore attuale di i schedari ùn currisponde à u precedente, u script sguassate i schedari da u repertoriu radicale di u cartulare di mail sincronizatu: index.fld, indexlog.fld, search.fld è principia u prucessu di indexazione di i cartulare di mail spartuti.

L'infurmazione nantu à l'esekzione di u travagliu hè scaricata in u cartulare LOG.

Prucessu di indexazione
U prucessu di indexazione si riduce à eseguisce una funzione API Kerio
Session = callMethod ("Domains.checkPublicFoldersIntegrity", {}, token)

Un esempiu di implementazione hè datu in - 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 pudete lascià cum'è, ma s'ellu avete bisognu di HTTPS, python deve fiducia in u certificatu Kerio.

Dinù in u schedariu vi tocca à specificà un contu cù i diritti à fà sta funzione (Adm - cartulare di posta publica) di u servore mail.

Spergu chì u mo articulu serà utile à l'amministratori di Kerio Connect.

Source: www.habr.com

Add a comment