Popolna sinhronizacija skupnih map, stikov, koledarjev med porazdeljenimi strežniki Kerio Connect

Dober dan, Habr!

Naloga

Moja organizacija uporablja poštni strežnik na platformi Kerio Connect; poštni strežniki so nameščeni v različnih mestih, da služijo svojim uporabnikom. Sprva ni bilo porazdeljene strukture, saj se domene razlikujejo na tretji ravni, ki označuje mesto mesta. Vse je delovalo in vsi so bili zadovoljni. Nekega lepega dne je vodstvo postavilo nalogo, skupni koledar aktivnosti med vsemi lokacijami!

prazgodovina

Sprva je bila ideja dvigniti Kerio Distributed Mail Domain in bi vse naredil sam. Kmalu rečeno, storjeno, porazdeljena domena je bila ustvarjena, a ni bilo tako, strežnik je bil pripravljen za sinhronizacijo koledarjev, map, kontaktov – med domenami, ki se nahajajo na istem strežniku, nikakor pa ni nameraval sinhronizirati podatkov med več strežniki.

Takšnega ulova seveda nisem pričakoval in dolgo nisem mogel verjeti, da funkcionalnost, ki sem jo potreboval, manjka. Kasneje sem našel dokumentarne dokaze o tem dejstvu. To me je zelo zmedlo in razočaralo.

Naloga se je gladko spremenila v problem.

Kakšne so bile možnosti?

  • Ustvarite dva odjemalca na različnih strežnikih, ki si izmenjujeta potrebne podatke s programsko opremo tretjih oseb. Treba je bilo najti to programsko opremo tretje osebe, ki bi izvajala to funkcionalnost - ne maram takšnih rake, vendar se je zdelo, da je to edina hitra rešitev.
  • Napišite svoj skript za sinhronizacijo podatkov med strežniki. Dejstvo je, da Kerio shrani vsak objekt kot ločeno datoteko, zato je bilo treba razviti skripto za delo z datotekami, vendar se je glede na zadostno število virov naloga zdela nekoliko zapletena, še posebej, ker je bilo treba izvesti več preveri pravilnost podatkov, če nekdo ustvari nalogo v istem časovnem obdobju itd. itd.

Če pogledam naprej, bom rekel, da čeprav Kerio shrani predmet kot ločeno datoteko, ni tako neumno, da bi se vsakič, ko dostopate do predmeta, spraševali, kako je z datotečnim sistemom.

Po tem, ko sem veliko časa razmišljal in sestavljal kup papirjev z načrti »zavzetja sovražnega ozemlja«, sem ob 6. uri sprejel dve pravilni odločitvi:

  • Prva odločitev je, da narediš svoje in ne iščeš ničesar od zunaj.
  • Druga rešitev je, da greste spat.

Že zjutraj sem se zbudila z eno samo in resnično mislijo, ki je bila skrčena na nekaj črk - DFS

odločitev

Sama rešitev je izgledala takole

  • vse strežnike, ki bodo sodelovali pri sinhronizaciji, pripeljite na OS Windows. (Del tega je bil v Linuxu. Zahtevana je bila migracija poštnih podatkov v drug OS)
  • Določite strukturo imenikov, ki bodo sodelovali pri sinhronizaciji - morajo biti enaki.
  • Določite vse poštne strežnike pod eno domeno z enim prostorom DFS.
  • Ustvarite zgoraj omenjeno porazdeljeno domeno Kerio, saj je v mojem primeru potrebna sinhronizacija podatkov, ne samo med strežniki, ampak tudi med domenami, drugo lahko samostojno upravlja strežnik Kerio. (za razliko od prvega)
  • Nastavite sinhronizirane imenike na prostor DFS.
  • Omislite si kakšno berglo (navsezadnje brez bergle ne morete živeti)

Реализация

Primer na dveh poštnih strežnikih (lahko več)

1. Porazdeljena domena Kerio

Popolna sinhronizacija skupnih map, stikov, koledarjev med porazdeljenimi strežniki Kerio Connect

Master ne sodeluje pri sinhronizaciji, vendar to ni pogoj.

Ne bom opisal, kako dvigniti porazdeljeno domeno Kerio, v tem ni nič zapletenega, lahko preučite uradno manul

Na koncu bi morali videti naslednjo sliko v skrbniški konzoli:

Popolna sinhronizacija skupnih map, stikov, koledarjev med porazdeljenimi strežniki Kerio Connect

Popolna sinhronizacija skupnih map, stikov, koledarjev med porazdeljenimi strežniki Kerio Connect

Nato so me zanimale mape v skupni rabi; na glavnem strežniku lahko določite naslednje možnosti:

Popolna sinhronizacija skupnih map, stikov, koledarjev med porazdeljenimi strežniki Kerio Connect

Popolna sinhronizacija skupnih map, stikov, koledarjev med porazdeljenimi strežniki Kerio Connect

Za vsako domeno posebej - strežnik ne bo sinhroniziral javnih map med domenami

Skupno vsem domenam - vsi strežniki bodo opustili obstoječe javne mape v vsaki domeni in ustvarili nove posamezne mape za vse domene na vsakem poštnem strežniku.

Opozorilo! Čeprav ta možnost spremeni konfiguracijsko politiko na vseh strežnikih, se sinhronizira ločeno od vsakega strežnika (to je brez enega skupnega prostora)

Skrbnik bo še vedno imel možnost porazdeliti dostop med uporabniki.
v mojem primeru so vse moje in potrebujem popolno sinhronizacijo (v vašem primeru je rešitev lahko drugačna) na vsakem strežniku morate ustvariti enake nabore domen, ki jih je treba sinhronizirati.

2. Podatkovni imeniki Kerio

Zdaj morate ustvariti enake imenike v skupni rabi, ki jih je treba sinhronizirati na vsakem od strežnikov. Mape, koledarji, stiki.

Nasvet - ustvarite imenike v angleščini, če jih ustvarite v latinici, bo imel imenik ime v nekem nerazumljivem kodiranju, to je vsaj neprijetno.

Zdaj morate poiskati fizične poti poštnih map na vsakem strežniku.

Skupno vsem domenam ~DataMailmail#publicСинхронизируемый каталог#msgs
Za vsako domeno posebej ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Upoštevajte, da ne bomo sinhronizirali celotnega imenika, ampak samo vsebnik s podatki #sporočila — tukaj so shranjeni sami objekti, vsi ostali podatki morajo biti ločeni za vsak strežnik.

3.DFS

Ne bom podrobno opisal, kako konfigurirati DFS, o tem vprašanju je dovolj informacij.

DFS je storitev vloge v sistemu Windows Server, ki omogoča združevanje map v skupni rabi, ki se nahajajo na različnih strežnikih
Povezava do dokumenta MS DFS

Preden nastavite DFS, morate ustaviti vse poštne strežnike, ki bodo sodelovali pri sinhronizaciji podatkov.

Po zaključku namestitve bi morali prejeti naslednjo sliko za vsako od sinhroniziranih map

Popolna sinhronizacija skupnih map, stikov, koledarjev med porazdeljenimi strežniki Kerio Connect

Seveda nam ni treba objaviti podvojenih map.

Popolna sinhronizacija skupnih map, stikov, koledarjev med porazdeljenimi strežniki Kerio Connect

Ko pride do replikacije (in tam ni ničesar posebnega za replikacijo - mape so prazne), lahko zaženete poštne strežnike.

Nato lahko enega od poštnih strežnikov napolnite s podatki in preverite, ali so podatki pravilno podvojeni.

4. bergla

Opis refleksije

Kot lahko vidite, potem ko se podatki začnejo sinhronizirati (DFS), če ste ustvarili nekaj na prvem strežniku, se nekako nič ne prikaže na drugem strežniku ali pa se prikaže, vendar nekako ne vedno.

Ne obupajte, seveda se bo tam prej ali slej pojavilo, a bolje prej kot slej. Ker je čez 6-12 ur prepozno.

Stvar je v tem, da takoj, ko nekaj ustvarite na prvem strežniku, se bo datoteka na drugem in naslednjih strežnikih seveda takoj pojavila zahvaljujoč sistemu DFS, vendar v primeru, da je ta poštni imenik že nekdo prebral in je ponovno zahtevan, strežnik ne bo ponovno prebral mape #msgs, ampak bo izpljunil podatke iz lastnega indeksa, ki morda ne ustrezajo več naši realnosti.

Kerio ima mehanizem za ponovno branje indeksa, vendar lahko deluje v približno šestih urah in v teh 6 urah se lahko pomembnost opravila v koledarju nekoliko izgubi.
Če želite zdaj preizkusiti sinhronizacijo, lahko izbrišete datoteko v ustreznem sinhroniziranem imeniku index.fld, po ponovnem dostopu do mape na poštnem strežniku in če ta datoteka manjka, bo Kerio ponovno prebral imenik in podatke se bo prikazal. Zdi se, da je to rešitev, izbrišite datoteko, ko se podatki spremenijo, vendar to ne deluje vsakič, ampak samo prvič, potem Kerio iz nekega razloga izgubi vse zanimanje za index.fld
Začne tudi pljuvati uporabniku nerazumljiva sporočila - o nekakšnem indeksu in da tam že nekaj počne.

Obstaja še ena možnost, da nekaj ustvarite - v trenutku ustvarjanja novega objekta strežnik nenadoma ugotovi, da je ime datoteke, ki ga je želel dodeliti, že zasedeno, vendar se sneži in je to slepa možnost.

Kako je to mogoče?

Če smo še enkrat pozorni na sliko, ki nam je že poznana.

Popolna sinhronizacija skupnih map, stikov, koledarjev med porazdeljenimi strežniki Kerio Connect

Toda na drugi ravnini lahko vidite zelo zanimiv gumb, ki ga zdaj potrebujemo - Ponovno indeksiranje map

In res. Če kliknemo ta gumb na poštnem strežniku, ki ne ve, da se je v sinhroniziranih #msgs že kaj spremenilo, bomo dobili stabilen, hiter rezultat. Vse skrito bo postalo jasno.

V dnevniku lahko vidite, koliko časa ta postopek traja, v mojem primeru z več tisoč (15 tisoč) zapisi traja približno 3-4 minute.

Vse, kar moramo storiti, je ugotoviti, kako dejansko pritisniti ta gumb, ko ga potrebujemo.

Izkazalo se je, da Kerio imajo svoje API

Opis
Dokumentacija

Funkcija, ki opravlja našo nalogo, izgleda takole:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Iz vsega zgoraj navedenega moramo napisati skript, ki bi spremljal stanje map, ki nas zanimajo, in če se je kaj spremenilo, izvajal funkcijo, ki jo potrebujemo.

Želim povedati, da sem napisal več različnih različic skriptov, ki izvajajo različna preverjanja, in se odločil za tisto, ki vse sklepe naredi na podlagi števila datotek.

Izvedba skripta

Primer in opis skripta CMD

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

Kopija skripta se izvaja na vsakem poštnem strežniku (lahko se uporablja kot storitev, pravice Adm niso potrebne)

Skript prebere datoteko Setup%Computername%.List

Pri čemer je %Computername% ime trenutnega strežnika (imenik lahko vsebuje sezname vseh strežnikov hkrati.)

Datoteka %Computername%.List – vsebuje polne poti sinhroniziranih imenikov, vsaka pot je zapisana v novi vrstici in ne sme vsebovati praznih vrstic.

Po prvem zagonu skript izvede postopek indeksiranja, ne glede na to, ali je to potrebno ali ne, prav tako pa skript ustvari indeks števila datotek v posameznem sinhroniziranem imeniku.

Namen skripte je prešteti vse datoteke v določenem imeniku.

Na koncu štetja vsakega imenika, če se v vsaj enem imeniku trenutna vrednost datotek ne ujema s prejšnjo, skript izbriše datoteke iz korenskega imenika sinhroniziranega poštnega imenika: index.fld, indexlog.fld, search.fld in zažene postopek indeksiranja poštnih map v skupni rabi.

Podatki o izvajanju naloge so odloženi v imenik LOG.

Postopek indeksiranja
Postopek indeksiranja se zmanjša na izvajanje funkcije Kerio API
Seja = callMethod("Domains.checkPublicFoldersIntegrity",{}, žeton)

Primer izvedbe je podan v – 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 lahko ga pustite takšnega, kot je, vendar če potrebujete HTTPS, mora python zaupati potrdilu Kerio.

Prav tako morate v datoteki navesti račun s pravicami za izvajanje te funkcije (Adm - javne poštne mape) poštnega strežnika.

Upam, da bo moj članek koristen skrbnikom Kerio Connect.

Vir: www.habr.com

Dodaj komentar