Tere, Habr!
Ülesanne
Minu organisatsioonis kasutatakse Kerio Connect platvormil meiliservert, erinevates linnades on paigaldatud meiliserverid, mis teenindavad oma kasutajaid. Algset jaotust ei olnud, kuna domeenid erinesid kolmandas tasemes, näidates linna asukohta. Kõik töötas ja kõik olid rahul. Ühel kaunil päeval - juhtkond pani ülesande, ühine kalendri haldamine kõigi kohtade vahel!
Eellugu
Algne idee oli - tõsta üles jaotatud Kerio meilidomeen ja see ise kõik teeb. Öeldud, tehtud - jaotatud domeen loodi, kuid asjad ei läinud nii nagu plaanitud, server oli valmis sünkroonima kalendreid, kaustu, kontakte - domeenide vahel, mis asusid samal serveril, kuid ei kavatsenud sünkroonida andmeid mitme serveri vahel.
Seda üllatust ma muidugi ei oodanud ja kaua ei suutnud uskuda vajaliku funktsionaalsuse puudumisse. Hiljem leidsin selle fakti dokumentaalset kinnitust. Olin selle pärast väga segaduses ja pettunud.
Ülesanne voolas sujuvalt probleemiks.
Millised olid valikud
- Loo kaks klienti erinevates serverites, mis vahetaksid vajalikke andmeid milleki kolmanda osapoole programmiga. Pidi leidma selle kolmanda osapoole programmi, mis täidaks seda funktsionaalsust - ma ei armasta selliseid ääretuid riske, kuid tundus, et see on ainus kiire lahendus.
- Kirjutada omaenda andmete sünkroonimise skript serverite vahel. Asi on selles, et Kerio salvestab iga objekti eraldi failina, seega tuli välja töötada skript failidega töötamiseks, kuid piisava hulga allikate tõttu tundus ülesanne veidi keeruline, seda enam, et tuli teha mitmeid andmete õigsuse kontrollimisi, äkki keegi loob ülesande samal ajal jne.
Eelnevalt ütlen, et Kerio salvestab objekti eraldi failina, kuid ta ei ole nii rumal, et igal objekti lugemise korral küsida - kuidas on asjad failisüsteemiga.
Mõtlema kulutasin palju aega, joonistasin hunniku pabereid plaanidega 'vaenlasliku territooriumi hõivamiseks', kell 6 hommikul jõudsin kahe õige otsuseni:
- Esimene otsus - teha enda oma ja mitte otsida midagi kolmandat.
- Teine otsus - minna magama.
Hommikul ärkasin ma üles ühe selge ja kindla mõttega, mis lühenes paariks tähiseks – DFS
Lahendus
Lahendus nägi välja järgnev.
- Tuleb viia kõik serverid, mis osalevad sünkroniseerimises, OS Windowsi. (Osa oli Linuxil. Mailide andmete üleviimine teisele operatsioonisüsteemile oli vajalik.)
- Pean määrama kataloogistruktuuri, mis osaleb sünkroniseerimises – need peavad olema identsed.
- Määrata kõik meiliserverid ühe domeeni all ühtse DFS ruumiga.
- Loo ülalmainitud hajutatud domeen Kerio, kuna minu juhul on vajalik andmete sünkroniseerimine mitte ainult serverite vahel, vaid ka domeenide vahel, mille teise saab Kerio server iseseisvalt hallata. (erinevalt esimesest)
- Suuna sünkroniseeritavad kataloogid DFS ruumi poole.
- Vajadus välja mõelda mõni ajutine lahendus (ilma ajutiste lahendusteta ei saa).
Rakendamine
Näide kahel meiliserveril (võib olla rohkem).
1. Kerio hajutatud domeen.

Master ei osale sünkroniseerimises, kuid see ei ole kohustuslik tingimus.
Ma ei hakka kirjeldama, kuidas luua Kerio hajutatud domeeni, selles pole midagi keerulist, seda saab uurida ametlikest.
Lõpuks peaksite halduskonsoolis nägema järgmist pilti:
![]()

Seejärel huvitavad mind jagatud kaustad, serveris Master saab määrata järgmised variandid:
![]()

Iga domeeni jaoks eraldi. — server ei sünkroniseeri avalikke kaustu domeenide vahel.
Üksikud kõigi domeenide jaoks. — kõik serverid loobuvad olemasolevatest jagatud kaustadest igas domeenis ja loovad igas meiliserveris uued ühtsed kaustad kõigi domeenide jaoks.
Tähelepanu! See valik, kuigi muudab seadistuspoliitikat kõigis serverites, sünkroniseerib iga serveri eraldi (st – ilma ühise ruumi olemasoluta).
Administraatoril jääb võimalus jagada juurdepääsu kasutajate vahel.
Minu puhul – kõik oma ja mul on vaja täis sünkroniseerimist (teie juhul võib lahendus olla erinev), igas serveris tuleb luua identsed domeenide kogumid, mida tuleb sünkroniseerida.
2. Kerio andmekataloogid.
Nüüd on vajalik luua identsed jagatud kataloogid, mida tuleb igas serveris sünkroniseerida. Kaustad, Kalendrid, Kontaktid.
Soovitus - looge kataloogid inglise keeles, sest kui loote neid ladina tähestikus, kantakse katalooge mõnes arusaamatus kodeeringus, mis on vähemalt ebamugav.
Nüüd tuleb leida füüsilised teed postikataloogidele igal serveril.
Üksikud kõigi domeenide jaoks. ~DataMailmail#publicSünkroonitav kataloog#msgs
Iga domeeni jaoks eraldi. ~DataMailmail**Domain**#publicSünkroonitav kataloog#msgs
Pange tähele, et me sünkroonime mitte kogu katalooge, vaid ainult andmekonteinerit. #msgs — siin hoitakse objekte ise, kõik muud andmed iga serveri jaoks peavad olema erinevad.
3. DFS
Kuidas DFS-i seadistada, seda ma üksikasjalikult ei selgita, sellel teema kohta on piisavalt teavet.
DFS on Windows Serveri rolliteenus, mis võimaldab ühendada jagatud kaustu, mis asuvad erinevates serverites.
Enne DFS-i seadistamist peate peatama kõik postiserverid, mis osalevad andmete sünkroonimises.
Seadistamise lõpuks peate iga sünkroonitava kausta jaoks saama järgmise pildi.

Meil ei ole loomulikult vaja replikeerida jagatavaid kaustu.

Pärast replikatsiooni (milles replikatsiooni tegelikult eriti pole - kaustad on tühjad) saab postiserverid uuesti käivitada.
Seejärel saab andmeid täita ühe postiserveri juurde ja kontrollida, et andmed replitseeruvad õigesti.
4. Kinnitatud lahendus
Mõtlemise kirjeldus
Kuidas te saate veenduda, et pärast andmete sünkroonimist (DFS), juhul kui midagi loote esimeses serveris - teises serveris ei ilmu midagi, või ilmub, aga mitte alati.
Ärge heitke meelt, see ilmub varsti, kuid parem varakult kui hilja. Sest hilja tähendab 6 - 12 tundi.
Asjaolu on see, et kui te midagi loote esimeses serveris, ilmub see teises ja järgnevatesse serveritesse kohe tänu DFS-ile, kuid juhul, kui seda postikatalooge on varem keegi lugenud ja seda nõutakse uuesti, ei loe server kausta #msgs uuesti, vaid väljastab andmed omaenda indeksist, mis võib juba ammu meie reaalsusele mitte vastata.
Kerio-l on индексiga uuendamise mehhanism, kuid see võib käivituda alles kuue tunni pärast, mil selle kuue tunni jooksul võib kalendris oleva ülesande värskus mõnevõrra kaduma minna.
Selleks, et kohe praegu sünkroonimise tööd kontrollida, saab vastavas sünkroonitavas kataloogis kustutada faili index.fld, pärast mida, kui taas pöörduda posti serverisse ja selle faili puudumisel, Kerio loeb katalooge uuesti ja andmed ilmuvad. Tundub, et see on lahendus: kustuta fail, kui andmed muudavad, kuid see ei toimi iga kord, vaid ainult esmakordselt, pärast mille Kerio mingil põhjusel kaotab huvi index.fld vastu.
Ja hakkab veel viskama kasutajale arusaamatuid teadete - mingist indeksist ja et ta juba midagi teeb.
On veel variant, et midagi luua - uue objekti loomise hetkel võib server äkki mõelda, et talle antud faili nimi on juba kasutuses, kuid siin on lumepall ja see on ummiktee.
Kuidas siis olla?
Kui pöörata veel kord tähelepanu juba tuttavale pildile.

Kuid teises mõõtmes, võime märgata väga huvitavat ja meile praegu vajalikku nuppu - Kataloogide uuesti indekseerimine
Ja tõepoolest. Kui vajutada seda nuppu postiserveris, mis ei tea, et selles sünkroonitavas #msgs-s on juba midagi muutunud, saame stabiilse ja kiire tulemuse. Kõik peidetud muutub nähtavaks.
Logis saab vaadata, kui palju aega see protsess võtab, minu puhul, kus on mitu tuhat (15 tuhat) kirje, umbes 3-4 minutit.
On jäänud vaid välja mõelda, kuidas tegelikult vajutada sellele nupule, siis kui see meile vajalik on.
Selgub, et Kerio-l on oma API
funktsioon, mis täidab meie ülesande, näeb välja selline -
session = callMethod("Domains.checkPublicFoldersIntegrity", {}, token)
Kõik eelnevalt öeldu põhjal peaksime kirjutama skripti, mis jälgib huvitavate kataloogide olekut ja juhul, kui midagi muutub, täidab meie jaoks vajalikku funktsiooni.
Tahan öelda, et kirjutasin mitu erinevat versiooni skripti, mis teevad erinevaid kontrolle, peatudes sellel, mis kõik väljundid põhinevad failide arvu peal.
Skripti teostamine
Skripti CMD näide ja selgitus
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
Skripti koopia käivitatakse igal meiliserveril (võib toimida teenusena, administraatori õigused ei ole vajalikud)
Skript loeb faili Setup%Computername%.List
Kus %Computername% on praeguse serveri nimi (kaust võib sisaldada kõikide serverite loendeid.)
Fail %Computername%.List sisaldab sünkroonitavate kaustade täispilte, iga tee on kirjutatud uuele reale, tühje ridu ei tohiks olla.
Pärast esimese käivitamist viib skript läbi indekseerimisprotseduuri, olenemata selle vajadusest, samuti loob skript indeksi, mis sisaldab iga sünkroonitava kausta failide arvu.
Skripti ülesanne on lugeda kõiki faile määratud kaustas.
Iga kausta lugemise lõppedes, kui vähemalt ühes kaustas ei ühti praegune failide arv eelmisega, kustutab skript failid sünkroonitava meilikatalooge juurkaustast: index.fld, indexlog.fld, search.fld ja käivitab indekseerimisprotsessi — jagatud meilipostkastide jaoks.
LOG kausta salvestatakse teave ülesannete täitmise kohta.
Indekseerimisprotsess
Indekseerimisprotsess seisneb Kerio API funktsiooni täitmise kaudu
Session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)
Näidis täitmiseks on esitatud pythonis
PublicFolders.py
import json
import urllib.request
import http.cookiejar
""" Küpsiste salvestamine on vajalik seansi haldamiseks """
jar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar))
urllib.request.install_opener(opener)
""" Kerio Control'i eksemplari hostinimi või IP-aadress koos protokolli, pordi ja mandaadiga """
server = "http://127.0.0.1:4040"
username = "user"
password = "password"
def callMethod(method, params, token = None):
"""
Kaugkutsuge antud meetod antud parameetritega.
:param: meetod stringiga, mis sisaldab täielikult kvalifitseeritud meetodi nime
:param: params dict parameetritega kaugkutsutud meetodi jaoks
:param: token CSRF token on alati vajalik, välja arvatud sisselogimise meetodi korral. Kasutage meetodit "Session.login", et see token saada.
"""
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)
Saate jätta nii nagu on, kuid kui vajate HTTPS-i, peab Python usaldama Kerio sertifikaati.
Samuti peaks failis olema määratud konto, millel on õigused selle funktsiooni täitmiseks (Admin - üldised postkastikaustad) postiserveris.
Loodan, et minu artikkel on kasulik Kerio Connecti administraatoritele.
Allikas: habr.com
