Sinkronizim i plotë i dosjeve të zakonshme, kontakteve, kalendarëve mes serverave të shpërndarë Kerio Connect

Mirëdita, Habr!

Detyra

NĂ« organizatĂ«n time pĂ«rdorin njĂ« server postash nĂ« platformĂ«n Kerio Connect, nĂ« qytete tĂ« ndryshme janĂ« vendosur serverĂ« postash qĂ« shĂ«rbejnĂ« pĂ«rdoruesit e tyre. Fillimisht nuk kishte njĂ« strukturĂ« tĂ« shpĂ«rndarĂ«, pasi domenet ndryshonin nĂ« nivelin e tretĂ« me tregimin e qytetit tĂ« platformĂ«s. Gjithçka funksiononte dhe tĂ« gjithĂ« ishin tĂ« kĂ«naqur. NjĂ« ditĂ« tĂ« bukur — drejtoria vendosi njĂ« detyrĂ«, kalendari i pĂ«rbashkĂ«t i çështjeve midis tĂ« gjitha platformave!

Pas historia

Fillimisht ideja ishte — tĂ« ngrinte njĂ« domen tĂ« shpĂ«rndarĂ« postash Kerio dhe ai do tĂ« bĂ«nte gjithçka vetĂ«. E thĂ«nĂ« e bĂ«rĂ«, domeni i shpĂ«rndarĂ« u krijua, por befas, serveri ishte i gatshĂ«m tĂ« sinkronizonte kalendarĂ«t, dosjet, kontaktet — midis domenesh qĂ« ndodheshin nĂ« njĂ« server, por aspak nuk kishte ndĂ«rmend tĂ« sinkronizonte tĂ« dhĂ«nat midis disa serverĂ«ve.

Të tilla pritshmërish nuk e prisja, dhe për një kohë të gjatë nuk mund të besoja në mungesën e funksionalitetit që më nevojitej. Më vonë gjeta dokumentimin e kësaj fakti. Më tej, isha shumë i shqetësuar dhe i zhgënjyer.

Detyra gradualisht u shndërrua në një problem.

ÇfarĂ« ishin opsionet?

  • TĂ« krijoj dy klientĂ« nĂ« servera tĂ« ndryshĂ«m, tĂ« cilĂ«t exchanges data tĂ« nevojshme pĂ«rmes njĂ« software tĂ« palĂ«ve tĂ« treta. Duhej tĂ« gjente atĂ« software tĂ« palĂ«ve tĂ« treta qĂ« do tĂ« realizonte kĂ«tĂ« funksionalitet - nuk mĂ« pĂ«lqejnĂ« kĂ«to pengesa, por dukej se ishte zgjidhja e vetme e shpejtĂ«.
  • TĂ« shkruaj njĂ« skenar tĂ« vet pĂ«r sinkronizimin e tĂ« dhĂ«nave midis serverave. Problemi Ă«shtĂ« se Kerio ruan çdo objekt si njĂ« skedar tĂ« veçantĂ«, kĂ«shtu qĂ« duhet tĂ« zhvilloja njĂ« skenar pĂ«r punĂ«n me skedarĂ«t, por pĂ«r shkak tĂ« numrit tĂ« mjaftueshĂ«m tĂ« burimeve, detyra dukej disi e komplikuar, aq mĂ« tepĂ«r qĂ« duhej tĂ« bĂ«ja kontrollime tĂ« shumta tĂ« saktĂ«sisĂ« sĂ« tĂ« dhĂ«nave, pĂ«r shkak se ndoshta dikush do tĂ« krijonte njĂ« detyrĂ« nĂ« tĂ« njĂ«jtĂ«n kohĂ« dhe tĂ« tjera.

Duke u nxjerrë përpara, do të them se pavarësisht se Kerio ruan objektin si një skedar të veçantë, ai nuk është aq i dobët sa të pyesë çdo herë kur iu qaset objektit - si është gjendja me sistemin e skedarëve.

Pas kalimit të një sasi të madhe mendimesh, duke përshkruar një mori letërsh me plane "për kapjen e territorit armiqësor", në orën 6 të mëngjesit mora dy vendime të drejta:

  • Vendimi i parĂ« - tĂ« bĂ«j tĂ« miat dhe tĂ« mos kĂ«rkoj asgjĂ« nga jashtĂ«.
  • Zgjidhja e dytĂ« Ă«shtĂ« tĂ« shkoj nĂ« gjumĂ«.

MĂ«ngjesin e sotĂ«m u zgjova me njĂ« mendim tĂ« vetĂ«m dhe tĂ« drejtĂ«, i cili u tkurr nĂ« disa shkronja – DFS.

Zgjidhja

Zgjidhja vetë dukej si më poshtë.

  • TĂ« çojnĂ« tĂ« gjitha serverĂ«t qĂ« do tĂ« marrin pjesĂ« nĂ« sinkronizim nĂ« OS Windows. (Pjesa ishte nĂ« Linux, nevojitej migrimi i tĂ« dhĂ«nave tĂ« postĂ«s nĂ« njĂ« OS tjetĂ«r.)
  • TĂ« pĂ«rcaktohet struktura e katalogĂ«ve qĂ« do tĂ« marrin pjesĂ« nĂ« sinkronizim — ato duhet tĂ« jenĂ« identike.
  • TĂ« pĂ«rcaktohet tĂ« gjitha serverĂ«t e postĂ«s nĂ«n njĂ« domain me njĂ« hapĂ«sirĂ« DFS tĂ« unifikuar.
  • TĂ« krijohet domaini i shpĂ«rndarĂ« Kerio i pĂ«rmendur mĂ« lart, pasi nĂ« rastin tim kĂ«rkohet sinkronizimi i tĂ« dhĂ«nave, jo vetĂ«m midis serverĂ«ve, por edhe midis domenĂ«ve, njĂ« i dyti mund tĂ« menaxhohet nga serveri Kerio vetĂ«. (ndryshe nga i pari)
  • TĂ« drejtohen katalogĂ«t e sinkronizuar nĂ« hapĂ«sirĂ«n DFS.
  • TĂ« mendohet ndonjĂ« zgjidhje e provizore (pasi pa njĂ« zgjidhje nuk shkon).

Realizimi

Shembuj në dy servera të postës (mund të ketë më shumë).

1. Kerio Distributed Domain.

Sinkronizim i plotë i dosjeve të zakonshme, kontakteve, kalendarëve mes serverave të shpërndarë Kerio Connect

Masteri nuk merr pjesë në sinkronizim, por kjo nuk është një kusht i domosdoshëm.

Nuk do të përshkruaj se si të ngritesh domenin e shpërndarë Kerio, nuk ka asgjë të komplikuar në këtë, mund të studiohet dokumentacioni zyrtar. manual

Në fund, në konsolën e administratës duhet të shihni imazhin e mëposhtëm:

Sinkronizim i plotë i dosjeve të zakonshme, kontakteve, kalendarëve mes serverave të shpërndarë Kerio Connect

Sinkronizim i plotë i dosjeve të zakonshme, kontakteve, kalendarëve mes serverave të shpërndarë Kerio Connect

Më pas, më interesonin katalogët e përbashkët, në serverin Master mund të tregoni variantet e mëposhtme:

Sinkronizim i plotë i dosjeve të zakonshme, kontakteve, kalendarëve mes serverave të shpërndarë Kerio Connect

Sinkronizim i plotë i dosjeve të zakonshme, kontakteve, kalendarëve mes serverave të shpërndarë Kerio Connect

TĂ« veçantĂ« pĂ«r çdo domene — serveri nuk do tĂ« sinkronizojĂ« katalogĂ«t publikĂ« midis domeve

TĂ« pĂ«rbashkĂ«t pĂ«r tĂ« gjitha domenet — tĂ« gjitha serverĂ«t do tĂ« heqin dorĂ« nga katalogĂ«t ekzistues tĂ« pĂ«rbashkĂ«t nĂ« çdo domen dhe do tĂ« krijojnĂ« katalogĂ« tĂ« rinj tĂ« vetme pĂ«r tĂ« gjitha domenet nĂ« secilin nga serverĂ«t e postĂ«s.

Kujdes! Kjo mundësi, ndonëse ndryshon politikat e konfigurimit në të gjitha serverët, bën sinkronizimin veçmas nga secili nga serverët (dmth. - pa një hapësirë të përbashkët të vetme)

Administratori do të ketë ende mundësinë për të shpërndarë qasjet midis përdoruesve.
në rastin tim - të gjitha të mijat dhe më nevojitet sinkronizim i plotë (Në rastin tuaj, zgjidhja mund të jetë tjetër) në secilin server duhet të krijohen grupe të njëjta dome që duhet të sinkronizohen.

2. Katalogët e të dhënave Kerio

Tani është e nevojshme të krijohen katalogë të përbashkët të njëjtë që duhet të sinkronizohen në secilin nga serverët. Katalogët, Kalendaret, Kontaktet.

KĂ«shillĂ« – krijoni ĐșĐ°Ń‚Đ°Đ»ĐŸĐłĐž nĂ« anglisht, nĂ«se i krijoni ato nĂ« latinisht, ЎОрДĐșŃ‚ĐŸŃ€ĐžŃ do tĂ« ketĂ« njĂ« emĂ«r nĂ« ndonjĂ« kodifikim tĂ« pakuptueshĂ«m, kjo Ă«shtĂ« tĂ« paktĂ«n e pakĂ«ndshme.

Tani është e nevojshme të gjeni rrugët fizike të dosjeve postare në çdo server.

Të përbashkët për të gjitha domenet ~DataMailmail#publicKatalogu i sinkronizuar#msgs
Të veçantë për çdo domene ~DataMailmail**Domain**#publicKatalogu i sinkronizuar#msgs

Kjeni parasysh se ne do tĂ« sinkronizojmĂ« jo tĂ« gjithĂ« katalogun, por vetĂ«m kontejnerin me tĂ« dhĂ«na. #msgs — kĂ«tu ruhen objektet, tĂ« dhĂ«nat e tjera pĂ«r secilin nga serverĂ«t duhet tĂ« jenĂ« tĂ« veta.

3. DFS

Në detaje si të konfigurohet DFS, gjithashtu nuk do të përshkruaj, informata për këtë çështje është e mjaftueshme.

DFS — Ă«shtĂ« njĂ« shĂ«rbim roli nĂ« Windows Server, i cili ofron mundĂ«sinĂ« e kombinimit tĂ« dosjeve tĂ« zakonshme, qĂ« ndodhen nĂ« servera tĂ« ndryshĂ«m.
Linku në dokumentin MS DFS

Para se tĂ« konfigurohet DFS – duhet tĂ« ndaloni tĂ« gjithĂ« serverĂ«t postare qĂ« do tĂ« marrin pjesĂ« nĂ« sinkronizimin e tĂ« dhĂ«nave.

Pas përfundimit të konfigurimit duhet të merrni këndvështrimin e mëposhtëm për secilën nga dosjet e sinkronizuara.

Sinkronizim i plotë i dosjeve të zakonshme, kontakteve, kalendarëve mes serverave të shpërndarë Kerio Connect

natyrisht që nuk na nevojitet të publikojmë dosjet e replikueshme.

Sinkronizim i plotë i dosjeve të zakonshme, kontakteve, kalendarëve mes serverave të shpërndarë Kerio Connect

Pas përfundimit të replikimit (kur replikimi nuk ka shumë për të bërë - dosjet janë bosh) serverat e postës mund të fillojnë të funksionojnë.

Më pas, mund të mbushni me të dhëna një nga serverat e postës dhe të kontrolloni nëse të dhënat replikohen siç duhet.

4. Zgjidhje improvizuese

Përshkrimi i reflektimit

Siç mund ta vini re, pasi të fillojë sinkronizimi (DFS), nëse krijoni ndonjë gjë në serverin e parë - në serverin e dytë ndonjë gjë nuk shfaqet, ose shfaqet ndonjëherë dhe ndonjëherë jo.

Nuk ka arsye për t'u shqetësuar, sepse herët a vonë do të shfaqet atje, por është më mirë që të ndodhë herët sesa vonë. Sepse vonë do të thotë pas 6 - 12 orësh.

E gjithë çështja është se sapo krijoni diçka në serverin e parë, në serverin e dytë dhe në ata të tjerë, skedari do të shfaqet menjëherë falë sistemit DFS, megjithatë në rast se ky katalog postor është lexuar më parë nga dikush dhe kërkohet përsëri, serveri nuk do ta rilexojë dosjen #msgs, por do të nxjerrë të dhënat nga indeksi i tij të brendshëm, i cili mund të mos jetë në përputhje me realitetin tonë për një kohë të gjatë.

Kerio ka një mekanizëm për të rivlerësuar indeksin, por ai mund të funksionojë pas rreth gjashtë orësh, duke bërë që gjatë këtyre 6 orëve aktualiteti i detyrave në kalendar të humbet disi.
Për të kontrolluar punën e sinkronizimit tani, mund të fshini skedarin në katalogun e sinkronizuar përkatës index.fld; pas një qasjeje të re në dosjen në serverin e postës dhe nëse ky skedar nuk ekziston, Kerio do të rilexohet katalogun dhe të dhënat do të shfaqen. Mund të duket si një zgjidhje, fshij skedarin me ndryshimin e të dhënave, por kjo funksionon vetëm herën e parë; më pas, për një arsye, Kerio humbet gjithmonë interesin për index.fld.
Gjithashtu fillon tĂ« nxjerrĂ« mesazhe tĂ« paqartĂ« pĂ«r pĂ«rdoruesin — pĂ«r njĂ« indeks dhe se ai po bĂ«n diçka.

Ka gjithashtu një mundësi që, gjatë krijimit të një objekti të ri, serveri të kuptojë se emri i skedarit që ai dëshiron të caktojë është tashmë i zënë, por kjo kaq e thjeshtë është një mjegull dhe kjo është një mundësi e paqartë.

ÇfarĂ« tĂ« bĂ«jmĂ«?

Nëse ne shikojmë përsëri imazhin që tashmë e njohim.

Sinkronizim i plotë i dosjeve të zakonshme, kontakteve, kalendarëve mes serverave të shpërndarë Kerio Connect

Por nĂ« njĂ« dimension tjetĂ«r, mund tĂ« vĂ«rejmĂ« njĂ« buton shumĂ« interesant dhe tĂ« nevojshĂ«m pĂ«r ne tani — Rivendos indeksimin e dosjeve

Dhe me të vërtetë. Nëse shfaqim këtë buton në një server postash që nuk e di se ka ndryshuar ndonjë gjë në #msgs, do të marrim një rezultat të qëndrueshëm dhe të shpejtë. E gjitha që është e fshehtë do të bëhet e dukshme.

Në regjistrin mund të shohim sa kohë zë ky proces, në rastin tim me disa mijëra (15 mijë) regjistrime rreth 3-4 minuta.

Tani mbetet vetëm të gjejmë se si ta klikojmë këtë buton, kur na nevojitet.

Doli se Kerio ka një API

Përshkrimi
Dokumentacioni

funksion qĂ« kryen detyrĂ«n tonĂ«, i duket kĂ«shtu –
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Nga të gjitha të dhënat e mësipërme na nevojitet të shkruajmë një skenar që do të monitoronte gjendjen e dosjeve që na interesojnë dhe në rastin nëse diçka ka ndryshuar, të ekzekutonte funksionin tonë të nevojshëm.

Dua të them se kam shkruar disa versione të ndryshme të skenarëve që kryejnë kontrolle të ndryshme, kam ndaluar në atë që të gjitha përfundimet i ndan në bazë të numrit të skedarëve.

Zbatimi i skenarit

Shembulli i skenarit CMD dhe përshkrimi

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

Skripta kopjohet në çdo server të postës (mundësisht si shërbim, nuk kërkohen të drejtat administrative)

Skripta lexon skedarin Setup%Computername%.List

Ku Ă«shtĂ« %Computername% — emri i serverit aktual (Direktoria mund tĂ« pĂ«rmbajĂ« lista tĂ« gjitha serverĂ«ve njĂ«herĂ«sh.)

Skeda %Computername%.List – pĂ«rmban rrugĂ«t e plota tĂ« drejtorive qĂ« sinkronizohen, çdo rrugĂ« Ă«shtĂ« e shkruar nĂ« njĂ« rresht tĂ« ri, nuk duhet tĂ« ketĂ« rreshta tĂ« zbrazĂ«t.

Pas fillimit të parë, skripti realizon procedurën e indeksimit, pavarësisht nëse është e nevojshme apo jo, gjithashtu skripti krijon një indeks të numrit të skedarëve në secilën nga direktoritë që sinkronizohen.

Detyra e skriptit është të numërojë të gjitha skedarët në direktorinë e specifikuar.

Pas pĂ«rfundimit tĂ« numĂ«rimit tĂ« secilĂ«s direktori, nĂ«se nĂ« tĂ« paktĂ«n njĂ« direktori vlera e tanishme e skedarĂ«ve nuk pĂ«rputhet me atĂ« tĂ« mĂ«parshme, skripti fshin skedarĂ«t nga direktoria rrĂ«njĂ«sore e dosjes sĂ« synuar tĂ« postĂ«s: index.fld, indexlog.fld, search.fld dhe aktivizon procesin e indeksimit — dosjeve tĂ« pĂ«rbashkĂ«ta tĂ« postĂ«s.

Në direktorinë LOG shkarkohet informacioni mbi përfundimin e detyrave.

Procesi i indeksimit
Procesi i indeksimit përqendrohet në realizimin e funksionit API Kerio
Session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Shembulli i realizimit Ă«shtĂ« dhĂ«nĂ« nĂ« – python
PublicFolders.py

import json
import urllib.request
import http.cookiejar
""" Ruajtja e cookies është e nevojshme për menaxhimin e seancës """
jar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar))
urllib.request.install_opener(opener)
""" Emri i host-it ose adresa IP e instancës suaj të Kerio Control me protokollin, portin dhe akreditimet """

server = "http://127.0.0.1:4040"
username = "user"
password = "password"

def callMethod(method, params, token = None):
    """
    Thërret në mënyrë të largët metodën e dhënë me parametrat e dhënë.
    :param: method string me emrin e plotë të kualifikuar të metodës
    :param: params dict me parametrat e metodës së thirruar në distancë
    :param: token Token-i CSRF është gjithmonë i nevojshëm përveç metodës së login-it. Përdorni metodën "Session.login" për të marrë këtë 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 mund tĂ« qĂ«ndrojĂ« siç Ă«shtĂ«, por nĂ«se keni nevojĂ« pĂ«r HTTPS — python duhet tĂ« besojĂ« certifikatĂ«n Kerio.

NĂ« skedarin duhet tĂ« pĂ«rcaktohet gjithashtu njĂ« llogari me tĂ« drejta pĂ«r tĂ« kryer kĂ«tĂ« funksion (Admin – dosjet e pĂ«rbashkĂ«ta) tĂ« serverit tĂ« postĂ«s.

Shpresoj që arti jem të jetë i dobishëm për administratorët e Kerio Connect.

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster