Volledige sinchronisasie van gedeelde dopgehou, kontakte, kalenders tussen verspreide Kerio Connect-bedieners

Goeiemiddag, Habr!

Taak

My organisasie gebruik 'n posbediener op die Kerio Connect-platform; posbedieners word in verskillende stede geïnstalleer om hul gebruikers te bedien. Aanvanklik was daar geen verspreide struktuur nie, aangesien die domeine op die derde vlak verskil, wat die stad van die terrein aandui. Alles het gewerk en almal was gelukkig. Op 'n mooi dag het die bestuur 'n taak opgestel, 'n gemeenskaplike kalender van aktiwiteite tussen alle terreine!

voorgeskiedenis

Aanvanklik was die idee om die Kerio Distributed Mail Domain te verhoog en dit sou alles self doen. Nie gou gesê as gedaan nie, 'n verspreide domein is geskep, maar dit was nie die geval nie, die bediener was gereed om kalenders, dopgehou, kontakte te sinchroniseer - tussen domeine wat op dieselfde bediener geleë is, maar was glad nie van plan om data tussen verskeie te sinkroniseer nie. bedieners.

Ek het natuurlik nie so 'n vangs verwag nie en kon vir 'n lang tyd nie glo dat die funksionaliteit wat ek nodig gehad het, ontbreek nie. Later het ek dokumentêre bewyse van hierdie feit gevind. Ek was baie verbaas en teleurgesteld hieroor.

Die taak het glad in 'n probleem ontaard.

Wat was die opsies?

  • Skep twee kliënte op verskillende bedieners wat die nodige data uitruil met sommige derdeparty-sagteware. Dit was nodig om hierdie derdeparty-sagteware te vind wat hierdie funksionaliteit sou implementeer - ek hou nie van sulke hark nie, maar dit het gelyk of dit die enigste vinnige oplossing was.
  • Skryf jou eie skrip vir datasinchronisasie tussen bedieners. Die feit is dat Kerio elke voorwerp as 'n aparte lêer stoor, dus dit was nodig om 'n skrip te ontwikkel om met lêers te werk, maar in die lig van die voldoende aantal bronne, het die taak ietwat ingewikkeld gelyk, veral omdat dit nodig was om veelvuldige uit te voer kontroleer vir die korrektheid van die data, ingeval iemand taak in dieselfde tydperk skep, ens., ens.

As ek vorentoe kyk, sal ek sê dat alhoewel Kerio 'n voorwerp as 'n aparte lêer stoor, dit nie so dom is om te vra hoe die lêerstelsel vaar elke keer as jy toegang tot die voorwerp kry nie.

Nadat ek baie tyd spandeer het om te dink, 'n klomp stukkies papier op te stel met planne "om vyandelike grondgebied te gryp," het ek om 6-uur twee regte besluite geneem:

  • Die eerste besluit is om jou eie ding te doen en niks van buite te soek nie.
  • Die tweede oplossing is om te gaan slaap.

Reeds die oggend het ek wakker geword met een enkele en ware gedagte, wat tot 'n paar letters gereduseer is - DFS

besluit

Die oplossing self het so gelyk

  • bring alle bedieners wat aan sinchronisasie sal deelneem na OS Windows. (Deel daarvan was op Linux. Migrasie van posdata na 'n ander bedryfstelsel was nodig)
  • Bepaal die struktuur van die gidse wat aan sinchronisasie sal deelneem - hulle moet identies wees.
  • Definieer alle posbedieners onder een domein met 'n enkele DFS-spasie.
  • Skep die bogenoemde verspreide Kerio-domein, aangesien in my geval datasinchronisasie vereis word, nie net tussen bedieners nie, maar ook tussen domeine; die tweede kan onafhanklik deur die Kerio-bediener hanteer word. (anders as die eerste een)
  • Stel gesinchroniseerde gidse na DFS-spasie.
  • Kom met 'n soort kruk vorendag (jy kan immers nie sonder 'n kruk lewe nie)

Implementering

Voorbeeld op twee posbedieners (miskien meer)

1. Kerio-verspreide domein

Volledige sinchronisasie van gedeelde dopgehou, kontakte, kalenders tussen verspreide Kerio Connect-bedieners

Die Meester neem nie deel aan sinchronisasie nie, maar dit is nie 'n voorvereiste nie.

Ek sal nie beskryf hoe om 'n Kerio-verspreide domein in te samel nie, daar is niks ingewikkeld daaraan nie, jy kan die amptelike bestudeer manul

Uiteindelik moet u die volgende prent in die administrasiekonsole sien:

Volledige sinchronisasie van gedeelde dopgehou, kontakte, kalenders tussen verspreide Kerio Connect-bedieners

Volledige sinchronisasie van gedeelde dopgehou, kontakte, kalenders tussen verspreide Kerio Connect-bedieners

Volgende was ek geïnteresseerd in gedeelde dopgehou; op die Meesterbediener kan jy die volgende opsies spesifiseer:

Volledige sinchronisasie van gedeelde dopgehou, kontakte, kalenders tussen verspreide Kerio Connect-bedieners

Volledige sinchronisasie van gedeelde dopgehou, kontakte, kalenders tussen verspreide Kerio Connect-bedieners

Spesifiek vir elke domein - die bediener sal nie publieke vouers tussen domeine sinchroniseer nie

Gemeenskaplik vir alle domeine - alle bedieners sal bestaande publieke dopgehou in elke domein laat vaar en nuwe enkele dopgehou vir alle domeine op elke posbediener skep.

Внимание! Alhoewel hierdie opsie die konfigurasiebeleid op alle bedieners verander, sinchroniseer dit apart van elke bediener (dit wil sê sonder 'n enkele gemeenskaplike spasie)

Die administrateur sal steeds die vermoë hê om toegang tussen gebruikers te versprei.
in my geval is hulle almal myne en ek benodig volle sinchronisasie (In jou geval kan die oplossing anders wees) op elke bediener moet jy identiese stelle domeine skep wat gesinchroniseer moet word.

2. Kerio-datagidse

Nou moet jy identiese gedeelde gidse skep wat op elk van die bedieners gesinchroniseer moet word. Dopgehou, kalenders, kontakte.

Raad - skep gidse in Engels, as jy dit in Latyn skep, sal die gids 'n naam hê in een of ander onverstaanbare enkodering, dit is ten minste ongerieflik.

Nou moet jy die fisiese paaie van die posgidse op elke bediener vind.

Gemeenskaplik vir alle domeine ~DataMailmail#publicСинхронизируемый каталог#msgs
Spesifiek vir elke domein ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Neem asseblief kennis dat ons nie die hele gids sal sinchroniseer nie, maar slegs die houer met die data #boodskappe — die voorwerpe self word hier gestoor, alle ander data moet apart wees vir elke bediener.

3.DFS

Ek sal nie in detail beskryf hoe om DFS op te stel nie, daar is genoeg inligting oor hierdie kwessie.

DFS is 'n roldiens in Windows Server wat die vermoë bied om gedeelde vouers wat op verskillende bedieners geleë is, te kombineer
Skakel na MS DFS dokument

Voordat u DFS opstel, moet u alle posbedieners stop wat aan datasinchronisasie sal deelneem.

Nadat u die opstelling voltooi het, behoort u die volgende prent vir elk van die gesinchroniseerde vouers te ontvang

Volledige sinchronisasie van gedeelde dopgehou, kontakte, kalenders tussen verspreide Kerio Connect-bedieners

Natuurlik hoef ons nie gerepliseerde dopgehou te publiseer nie.

Volledige sinchronisasie van gedeelde dopgehou, kontakte, kalenders tussen verspreide Kerio Connect-bedieners

Nadat replikasie plaasvind (en daar is niks spesiaals om daar te repliseer nie - die dopgehou is leeg), kan die posbedieners begin word.

Vervolgens kan jy een van die posbedieners met data vul en seker maak dat die data korrek gerepliseer is.

4. Kruk

Beskrywing van refleksie

Soos jy kan sien nadat die data begin sinchroniseer (DFS), as jy óf iets op die eerste bediener geskep het, verskyn op een of ander manier niks op die tweede bediener nie, óf dit verskyn maar op een of ander manier nie altyd nie.

Moenie moed verloor nie; natuurlik sal dit vroeër of later daar verskyn, maar beter vroeër as later. Want dit is te laat oor 6 – 12 uur.

Die ding is dat sodra jy iets op die eerste bediener geskep het, op die tweede en daaropvolgende bedieners die lêer natuurlik onmiddellik verskyn danksy die DFS-stelsel, maar in die geval dat hierdie e-posgids reeds deur iemand gelees is. en weer versoek word, sal die bediener nie die #msgs-lêergids herlees nie, maar sal data uit sy eie indeks spoeg, wat dalk nie meer met ons realiteit ooreenstem nie.

Kerio het 'n meganisme om die indeks te herlees, maar dit kan binne ongeveer ses uur werk, en gedurende hierdie 6 uur kan die relevansie van die taak in die kalender ietwat verlore gaan.
Om die sinchronisasie op die oomblik te toets, kan jy die lêer in die ooreenstemmende gesinchroniseerde gids index.fld uitvee, nadat jy weer toegang tot die gids op die posbediener gekry het en as hierdie lêer ontbreek, sal Kerio die gids en die data weer lees sal verskyn. Dit wil voorkom asof dit die oplossing is, vee die lêer uit wanneer die data verander, maar dit werk nie elke keer nie, maar net die eerste keer, dan verloor Kerio om een ​​of ander rede alle belangstelling in index.fld
Dit begin ook boodskappe uitspoeg wat vir die gebruiker onverstaanbaar is – oor een of ander indeks en dat dit reeds iets daar doen.

Daar is 'n ander opsie, om iets te skep - op die oomblik van die skep van 'n nuwe voorwerp, besef die bediener skielik dat die lêernaam wat hy wou toeken reeds geneem is, maar dit sneeuballe en dit is 'n doodloop opsie.

Hoe om te wees?

As ons weereens aandag gee aan die prentjie wat reeds aan ons bekend is.

Volledige sinchronisasie van gedeelde dopgehou, kontakte, kalenders tussen verspreide Kerio Connect-bedieners

Maar op 'n ander vliegtuig kan jy 'n baie interessante knoppie sien wat ons nou nodig het - Herindekseer dopgehou

En sowaar. As ons op hierdie knoppie klik op 'n posbediener wat nie weet dat iets reeds in die gesinchroniseerde #msgs verander het nie, sal ons 'n stabiele, vinnige resultaat kry. Alles wat verborge is, sal duidelik word.

In die log kan jy sien hoe lank hierdie proses neem; in my geval met etlike duisende (15 duisend) rekords neem dit ongeveer 3-4 minute.

Al wat ons hoef te doen is om uit te vind hoe om hierdie knoppie werklik te druk wanneer ons dit nodig het.

Dit blyk Kerio hul eie het API

Beskrywing
Dokumentasie

Die funksie wat ons taak verrig, lyk soos volg:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Uit al die bogenoemde moet ons 'n skrip skryf wat die toestand van die vouers van belang sal monitor en, as iets verander het, die funksie uitvoer wat ons benodig.

Ek wil sê dat ek verskeie weergawes van skrifte geskryf het wat verskillende kontroles uitvoer, en op die een besluit wat alle gevolgtrekkings maak op grond van die aantal lêers.

Skripimplementering

CMD script voorbeeld en beskrywing

Herindeks.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

'n Kopie van die skrip loop op elke posbediener (kan as 'n diens gebruik word, adm regte word nie vereis nie)

Die skrif lees die lêer Setup%Computername%.List

Waar %Computername% die naam van die huidige bediener is (Die gids kan lyste van alle bedieners tegelyk bevat.)

Die lêer %Computername%.List – bevat die volle paaie van die gesinchroniseerde gidse, elke pad is op 'n nuwe reël geskryf en behoort nie leë lyne te bevat nie.

Na die eerste bekendstelling voer die skrip die indekseringsprosedure uit, ongeag of dit nodig is of nie, en die skrip skep ook 'n indeks van die aantal lêers in elke gesinchroniseerde gids.

Die doel van die skrif is om al die lêers in die gespesifiseerde gids te tel.

Aan die einde van die tel van elke gids, as in ten minste een gids die huidige waarde van lêers nie ooreenstem met die vorige een nie, vee die skrip lêers uit die wortelgids van die gesinchroniseerde posgids uit: index.fld, indexlog.fld, search.fld en begin die indekseringsproses van gedeelde posvouers.

Inligting oor taakuitvoering word in die LOG-gids gestort.

Indekseringsproses
Die indekseringsproses kom daarop neer om 'n Kerio API-funksie uit te voer
Sessie = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

'n Voorbeeld van implementering word gegee 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 jy kan dit laat soos dit is, maar as jy HTTPS benodig, moet python die Kerio-sertifikaat vertrou.

Ook in die lêer moet jy 'n rekening met regte spesifiseer om hierdie funksie (Adm - publieke posvouers) van die posbediener uit te voer.

Ek hoop dat my artikel nuttig sal wees vir Kerio Connect-administrateurs.

Bron: will.com

Voeg 'n opmerking