Mirëmëngjes, Habr!
Detyra
Në organizatën time përdoret një server i postës mbi platformën Kerio Connect, dhe në qytete të ndryshme janë instaluar serverë të postës që shërbejnë përdoruesit e tyre. Fillimisht nuk kishte një strukturë të shpërndarë, pasi domainet dalloheshin në nivelin e tretë me shënimin e qytetit të platformës. Të gjitha funksiononte dhe të gjithë ishin të kënaqur. Një ditë të bukur, menaxhimenti vuri në dispozitë detyrën: një kalendar të përbashkët të çështjeve midis të gjitha platformave!
Historia e mëparshme
Fillimisht ideja ishte â tĂ« ngrija njĂ« domain tĂ« shpĂ«rndarĂ« tĂ« postĂ«s Kerio dhe ai do bĂ«nte gjithçka vetĂ«. E thĂ«nĂ« e bĂ«rĂ«, domaini i shpĂ«rndarĂ« u krijua, por jo ashtu si e prisja; serveri ishte gati tĂ« sinkronizonte kalendaret, dosjet, kontaktet â midis domainĂ«ve qĂ« ndodheshin nĂ« tĂ« njĂ«jtin server, por aspak nuk kishte ndĂ«rmend tĂ« sinkronizonte tĂ« dhĂ«nat midis disa serverĂ«ve.
Natyrisht, nuk e prisja një mashtrim të tillë dhe gjatë gjithë kohës nuk mundesha të besoja se nuk kishte funksionin e nevojshëm. Më vonë gjeta dokumentin që e konfirmonte këtë fakt. Kjo më shqetësoi shumë dhe më zhgënjeu.
Detyra kaloi pa ndalur në një problem.
Cilat ishin opsionet
- TĂ« krijoja dy klientĂ« nĂ« servera tĂ« ndryshĂ«m, tĂ« cilĂ«t me ndihmĂ«n e ndonjĂ« programi tĂ« palĂ«s sĂ« tretĂ« do shkĂ«mbenin tĂ« dhĂ«nat e nevojshme. Duhej tĂ« gjeja atĂ« programin e palĂ«s sĂ« tretĂ«, i cili do implementonte atĂ« funksionalitet â nuk mĂ« pĂ«lqejnĂ« kĂ«to rrethana, por dukej se ishte zgjidhja e vetme e shpejtĂ«.
- Të shkruaja skenarin tim të sinkronizimit të të dhënave midis serverëve. Problemi është se Kerio ruan çdo objekt si një skedar të veçantë, për pasojë, kërkohej të zhvillohej një skenar për punën me skedarë, por për shkak të numrit të mjaftueshëm të burimeve, detyra dukej disi e komplikuar, sidomos sepse duhej të bënte kontrollime të shumta të saktësisë së të dhënave, dhe nëse ndokush krijonte një detyrë në një interval kohor të njëjtë, etj.
Duke e kaluar përpara, mund të them se Kerio, megjithëse ruan objektin si një skedar të veçantë, nuk është aq e budallaçk të kërkojë gjendjen e sistemit të skedarëve me çdo qasje në objektin.
Pas shpenzimit të një sasi të madhe kohe në mendime, duke skicuar një grumbull letër me planet "për të pushtuar territorin armik", në orën 6 të mëngjesit kam marrë dy vendime të drejta:
- Vendimi i parĂ« â tĂ« bĂ«j tĂ« mirĂ«n time dhe tĂ« mos kĂ«rkoj asgjĂ« tĂ« palĂ«s sĂ« tretĂ«.
- Vendimi i dytĂ« â tĂ« shkoj pĂ«r tĂ« fjetur.
NĂ« mĂ«ngjes u zgjova me njĂ« mendim tĂ« vetĂ«m dhe tĂ« sigurt, i cili u shkurtohej nĂ« disa shkronja â DFS
Zgjidhja
Zgjidhja në vetvete dukej kështu
- të sillte të gjitha serverët që do të merrnin pjesë në sinkronizim në OS Windows. (Pjesa ishte në Linux. kërkohej migrimi i të dhënave të postës në një OS tjetër)
- TĂ« pĂ«rcaktohej struktura e katalogĂ«ve qĂ« do tĂ« merrnin pjesĂ« nĂ« sinkronizim â ata duhet tĂ« jenĂ« identikĂ«.
- Të përcaktohen të gjitha serverët e postës nën një domene me një hapësirë DFS të vetëm.
- Të krijohet mbi domeneja e shpërndarë e përmendur më sipër Kerio, pasi në rastin tim nevojitet sinkronizimi i të dhënave, jo vetëm midis serverëve por edhe midis domenesh, domeneja e dytë mund të merret përsipër nga serveri Kerio. (ndryshe nga e para)
- Të drejtohen katalogët e sinkronizuar në hapësirën DFS.
- Të imagjinohet ndonjë zgjidhje alternative (sepse pa zgjidhje alternative nuk bëhet)
Implementimi
Shembuj në dy serverë të postës (mund të ketë më shumë)
1. Domeni i shpërndarë Kerio

Masteri nuk merr pjesë në sinkronizim, por kjo nuk është një kusht i detyrueshëm.
Nuk do të përshkruaj se si të ngresh domenin e shpërndarë Kerio, nuk ka asgjë të komplikuar në këtë, mund të studiohet manuali zyrtar
Në fund, në konsolën e administratës duhet të shihni imazhin e mëposhtëm:
![]()

Pastaj, më interesonin dosjet e përbashkëta, në serverin Master mund të tregohen variantet e mëposhtme:
![]()

TĂ« veçanta pĂ«r çdo domen â serveri nuk do tĂ« sinkronizojĂ« dosjet publike midis domenesh
TĂ« pĂ«rbashkĂ«ta pĂ«r tĂ« gjithĂ« domenet â tĂ« gjithĂ« serverĂ«t do tĂ« heqin dorĂ« nga dosjet ekzistuese tĂ« pĂ«rbashkĂ«ta nĂ« çdo domen dhe do tĂ« krijojnĂ« dosje tĂ« reja tĂ« pĂ«rbashkĂ«ta pĂ«r tĂ« gjitha domenet nĂ« secilin nga serverĂ«t e postĂ«s.
Kujdes! Kjo mundĂ«si, megjithĂ«se ndryshon politikĂ«n e konfigurimit nĂ« tĂ« gjithĂ« serverĂ«t, krijon sinkronizim veçmas nga secili nga serverĂ«t (dmth â pa njĂ« hapĂ«sirĂ« tĂ« pĂ«rbashkĂ«t tĂ« vetme)
Administratori do të ketë mundësinë të shpërndajë akseset midis përdoruesve.
nĂ« rastin tim â tĂ« gjitha tĂ« mijat dhe mĂ« duhet sinkronizim i plotĂ« (NĂ« rastin tuaj, zgjidhja mund tĂ« jetĂ« e ndryshme) nĂ« secilin server duhet krijuar tĂ« njĂ«jtat grupe domenesh qĂ« duhen sinkronizuar.
2. Katalogët e të dhënave Kerio
Tani është e nevojshme të krijohen katalogë të njëjtë të përbashkët, të cilët duhet të sinkronizohen në secilin nga serverët. Dosjet, Kalendari, Kontakto.
KĂ«shillĂ« â krijoni katalohe nĂ« anglisht, nĂ« rast se i krijoni nĂ« latinisht, katalogu do tĂ« ketĂ« njĂ« emĂ«r nĂ« njĂ« kodim tĂ« paqartĂ«, kjo Ă«shtĂ« tĂ« paktĂ«n e pakĂ«ndshme.
Tani është e nevojshme të gjeni rrugët fizike të dosjeve postale në çdo server.
Të përbashkëta për të gjithë domenet ~DataMailmail#publikKatalogu i sinkronizuar#msgs
Të veçanta për çdo domen ~DataMailmail**Domeni**#publikKatalogu i sinkronizuar#msgs
Vini re se ne do tĂ« sinkronizojmĂ« jo tĂ« gjithĂ« katalogun, por vetĂ«m kontejnerin me tĂ« dhĂ«nat. #msgs â kĂ«tu ruhen objektet, tĂ« gjitha tĂ« dhĂ«nat e tjera pĂ«r secilin nga serverĂ«t duhet tĂ« jenĂ« tĂ« ndryshme.
3. DFS
Nuk do ta përshkruaj në hollësi si të konfigurohet DFS, informacioni mbi këtë çështje është mjaftueshëm i disponueshëm.
DFS është një shërbim roli në Windows Server, i cili ofron mundësinë e bashkimit të dosjeve të zakonshme, që ndodhen në serverë të ndryshëm.
Para se tĂ« konfiguroni DFS â duhet tĂ« ndaloni tĂ« gjithĂ« serverĂ«t e postĂ«s qĂ« do tĂ« marrin pjesĂ« nĂ« sinkronizimin e tĂ« dhĂ«nave.
Pas përfundimit të konfigurimit, duhet të merrni imazhin e mëposhtëm për çdo dosje të sinkronizuar.

nuk na nevojitet natyrisht të publikojmë dosjet që mund të replikohen.

Pas pĂ«rfundimit tĂ« replikimit (dhe nuk ka shumĂ« pĂ«r tĂ« replikuar â dosjet janĂ« bosh) serverĂ«t e postĂ«s mund tĂ« aktivizohen.
Më pas mund të mbushni me të dhëna një nga serverët e postës dhe të kontrolloni se të dhënat replikohen saktë.
4. Zgjidhje e shkurtër
Përshkrimi i reflektimit
Siç mund ta shihni pas fillimit tĂ« sinkronizimit tĂ« tĂ« dhĂ«nave (DFS), nĂ«se krijoni diçka nĂ« serverin e parĂ« â nĂ« serverin e dytĂ« ndodhi tĂ« mos shfaqet ndonjĂ«herĂ«, ose shfaqet por ndonjĂ«herĂ« jo.
Nuk duhet tĂ« dĂ«shpĂ«roheni, natyrisht se vonĂ« ose mĂ« herĂ«t do tĂ« shfaqet aty, por mĂ« mirĂ« herĂ«t se vonĂ«. Sepse vonĂ« do tĂ« thotĂ« pas 6 â 12 orĂ«sh.
E gjithë çështja është se sapo krijoni diçka në serverin e parë, ajo do të shfaqet menjëherë në serverin e dytë dhe më pas falë sistemit DFS, megjithatë nëse ky katalog postal është lexuar më parë nga dikush dhe kërkohet përsëri, serveri nuk do ta lexojë përsëri dosjen #msgs por do të nxjerrë të dhënat nga indeksi i tij, i cili mund të mos përputhet më me realitetin tonë.
Kerio ka një mekanizëm për rishikimin e indeksit, por ai mund të funksionojë pas rreth gjashtë orësh, gjatë kësaj kohe rëndësia e detyrës në kalendar mund të humbasë disi.
Për të kontrolluar funksionimin e sinkronizimit tani, mund të fshini skedarin në katalogun përkatës të sinkronizuar index.fld, pas një vizite të përsëritur në dosjen në serverin e postës, dhe në mungesë të këtij skedari, Kerio do të rishikojë katalogun dhe të dhënat do të shfaqen. Duket si një zgjidhje, fshi skedarin kur të dhënat ndryshojnë, por kjo funksionon vetëm herën e parë, pastaj Kerio për një arsye të pakuptueshme humbet çdo interes për index.fld.
Po ashtu, fillon tĂ« nxjerrĂ« mesazhe tĂ« paqartĂ« pĂ«r pĂ«rdoruesin â pĂ«r njĂ« indesk dhe pĂ«r atĂ« qĂ« ai po bĂ«n tani.
Ka edhe njĂ« opsion tjetĂ«r, diçka pĂ«r tĂ« krijuar â gjatĂ« krijimit tĂ« njĂ« objekti tĂ« ri, serveri mund tĂ« kuptojĂ« papritur, se emri i skedarit qĂ« ai dĂ«shironte t'i jepte Ă«shtĂ« tashmĂ« i zĂ«nĂ«, por kĂ«tu Ă«shtĂ« njĂ« top bore dhe kjo Ă«shtĂ« njĂ« variant pa dalje.
ĂfarĂ« tĂ« bĂ«jmĂ«?
Nëse e shikojmë përsëri imazhin e njohur për ne.

Por nĂ« njĂ« plan tjetĂ«r, mund tĂ« vĂ«rehet njĂ« buton shumĂ« interesant dhe tĂ« nevojshĂ«m pĂ«r ne tani â Rishiko dosjet
Dhe me tĂ« vĂ«rtetĂ«. NĂ«se klikoni nĂ« kĂ«tĂ« buton nĂ« serverin e postĂ«s, i cili nuk e di se diçka ka ndryshuar nĂ« #msgs tĂ« sinkronizuar, do tĂ« marrim njĂ« rezultat tĂ« qĂ«ndrueshĂ«m dhe tĂ« shpejtĂ«. Ădo gjĂ« e fshehur do tĂ« bĂ«het e dukshme.
Në regjistër mund të shikoni sa kohë zgjat ky proces, në rastin tim me disa mijëra (15 mijë) regjistrime rreth 3-4 minuta.
Na mbetet vetëm të mendojmë se si të klikojmë në këtë buton, atëherë kur na nevojitet.
Të duket se Kerio ka një API
funksion, i cili pĂ«rmbush detyrĂ«n tonĂ«, duket kĂ«shtu â
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)
Nga e gjithë ajo që është thënë më sipër, na nevojitet të shkruajmë një skript, i cili monitoron gjendjen e dosjeve të interesit dhe në rastin e çdo ndryshimi, të kryejë funksionin që na nevojitet.
Dua të them se kam shkruar disa versione të ndryshme të skripteve që kryejnë kontrollime të ndryshme, ndalova te ai, i cili ndalon të gjitha daljet duke u bazuar në numrin e skedareve.
Implementimi i skriptit
Shembulli i skriptit CMD dhe përshkrimi
Re-index.bat
@echo off
set dir=%~dp0
%dir:~0,2%
CD "%~dp0"
md "%LOG"
md "%Setup"
ECHO -Start- >> "%LOG%Computername%.log"
ECHO Start -> %Computername% te% %Time% >> "%LOG%Computername%.log"
SetLocal EnableDelayedExpansion
for /f "UseBackQ Delims=" %%A IN ("%Setup%Computername%.List") do (
set /a c+=1
set "m!c!=%%A"
)
set d=%c%
Echo Folder = %c%
ECHO Folder = %c% >> "%LOG%Computername%.log"
ECHO.
ECHO. >> "%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 te% %Time% - Delete !m%id%! >> "%LOG%Computername%.log"
set 1DirSize!id!=!2DirSize%id%!
ECHO.
ECHO.
set /a id+=1
goto Find
:Reindex
ECHO. >> "%LOG%Computername%.log"
ECHO --- RE-INDEX - Start - te% %Time% --- >> "%LOG%Computername%.log"
ECHO. >> ----------------------------------- >> "%LOG%Computername%.log"
call PublicFolders.py
timeout 60
goto start
exit
Një kopje e skenarit ekzekutohet në çdo server të postës (mund të jetë si një shërbim, nuk kërkohen të drejta administratorësh)
Skenari lexon skedarin Setup%Computername%.List
Kështu që %Computername% është emri i serverit aktual (Direktoria mund të përmbajë menjëherë lista të të gjithë serverëve.)
Skedari %Computername%.List përmban rrugët e plota të direktorive që sinkronizohen, çdo rrugë regjistrohet në një rresht të ri, nuk duhet të ketë rreshtash bosh.
Pas ekzekutimit të parë, skenari kryen një procedurë indeksoje, pa marrë parasysh nëse është e nevojshme apo jo, gjithashtu skenari krijon një indeks të numrit të skedarëve në çdo nga direktorive që sinkronizohen.
Detyra e skenarit është të numërojë të gjithë skedarët në direktorinë e specifikuar.
Pas përfundimit të numërimit në çdo direktor, nëse të paktën në një direktor, vlera aktuale e skedarëve nuk përputhet me të mëparshmen, skenari fshin skedarët nga direktoria kryesore e katalogut të sinkronizuar të postës: index.fld, indexlog.fld, search.fld dhe nis procesin e indeksimit - të dosjeve të zakonshme të postave.
NĂ« direktorine LOG regjistrohet informacioni mbi ekzekutimin e detyrave.
Procesi i indeksimit
Procesi i indeksimit përfshin ekzekutimin e funksionit API Kerio
Session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)
Shembulli i ekzekutimit tĂ« dhĂ«nĂ« nĂ« â python
PublicFolders.py
import json
import urllib.request
import http.cookiejar
""" Ruajtja e cookie-ve ë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 hostit ose adresa ip e instancës suaj të Kerio Control me protokoll, port dhe akreditivë """
server = "http://127.0.0.1:4040"
username = "user"
password = "password"
def callMethod(method, params, token = None):
"""
Thirret në distancë metoda 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ë thirrur në distancë
:param: token Tokeni CSRF është gjithmonë i nevojshëm përveç metodës për login. 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Ă« lihet siç Ă«shtĂ«, megjithatĂ« nĂ«se ju nevojitet HTTPS â python duhet tĂ« besojĂ« certifikatĂ«n Kerio.
Po ashtu, nĂ« skedarin e duhur duhet tĂ« tregoni njĂ« llogari me mundĂ«si pĂ«r tĂ« kryer kĂ«tĂ« funksion (Admin â dosjet e zakonshme tĂ« postĂ«s) tĂ« serverit tĂ« postĂ«s.
Shpresoj që artikulli im do të jetë i dobishëm për administratorët e Kerio Connect.
Burimi: habr.com
