Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve midis serverëve të shpërndarë Kerio Connect

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

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve midis serverëve të shpërndarë Kerio Connect

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 manuali

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

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve midis serverëve të shpërndarë Kerio Connect

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve midis serverëve të shpërndarë Kerio Connect

Pastaj, më interesonin dosjet e përbashkëta, në serverin Master mund të tregohen variantet e mëposhtme:

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve midis serverëve të shpërndarë Kerio Connect

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve midis serverëve të shpërndarë Kerio Connect

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.
Lidhja me dokumentin MS DFS

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.

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve midis serverëve të shpërndarë Kerio Connect

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

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve midis serverëve të shpërndarë Kerio Connect

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.

Sinkronizimi i plotë i dosjeve të përbashkëta, kontakteve, kalendarëve midis serverëve të shpërndarë Kerio Connect

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

Përshkrimi
Dokumentacioni

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)

http://127.0.0.1:4040 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

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster