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.

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.
Në fund, në konsolën e administratës duhet të shihni imazhin e mëposhtëm:
![]()

Më pas, më interesonin katalogët e përbashkët, në serverin Master mund të tregoni variantet e mëposhtme:
![]()

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

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

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.

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
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)
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
