Tere, Habr!
Ülesanne
Minu organisatsioonis kasutatakse Kerio Connect platvormil põhinevat meiliserverit, erinevates linnades on paigaldatud meiliserverid, mis teenindavad oma kasutajaid. Alguses ei olnud jaotatud struktuuri, kuna domeenid erinevad kolmandal tasemel, märkides linnakohaga. Kõik toimis ja kõik olid rahul. Ühel ilusal päeval määras juhtkond ülesande luua kõigi kohalike vahel ühine kalendriaeg.
Eelalugu
Algne idee oli tõsta Kerio jaotatud meeldomeen ja see kõike ise korraldada. Nii tehti, jaotatud domeen loodi, kuid ei olnud nii lihtne, server oli valmis sünkroniseerima kalendreid, kaustu, kontakte – domeenide vahel, mis asusid ühel serveril, kuid ei kavatsenud andmeid kahe erineva serveri vahel sünkroniseerida.
Sellist üllatust ma loomulikult ei osanud oodata ja kaua ei saanud uskuda vajaliku funktsiooni puudumist. Hiljem leidsin sellele faktile dokumentaalse kinnituse. See üllatas ja pettis mind väga.
Ülesanne muutus sujuvalt probleemiks.
Millised olid võimalused
- Loo kahte klienti eri serveritel, kes vahetasid vajalikke andmeid mõne kolmanda osapoole tarkvaraga. Tuli leida just see kolmanda osapoole tarkvara, mis selle funktsionaalsuse ellu viiks – mulle ei meeldi sellised takistused, kuid tundus, et see on ainus kiire lahendus.
- Kirjuta oma andmete sünkroonimise skript serverite vahel. Asi on selles, et Kerio salvestab iga objekti kui eraldi faili, seega pidi välja töötama failidega töötamise skripti, kuid piisava hulga allikate tõttu tundus ülesanne veidi keeruline, eriti kuna pidi läbima mitmeid andmete korrektuse kontrollimisi, äkki keegi loob ülesande samaaegselt ja nii edasi.
Tuleb tunnistada, et kuigi Kerio salvestab objekti kui eraldi faili, ei ole ta niivõrd rumal, et iga objekti juurde minnes küsida — kuidas läheb failisüsteemiga.
Pärast pikka mõtlemist, olles joonistanud hulgaliselt jooniseid plaanidest "vaenlase territooriumi vallutamiseks", tegin kell 6 kaks õiget otsust:
- Esimene otsus — teha oma ja mitte otsida midagi kolmandat.
- Teine lahendus on magama minna.
Hommikul ärkasin ma mõttega, mis jäi vaid paarikirja – DFS.
Lahendus
Lahendus nägi välja järgmine.
- To bring all servers participating in the synchronization to OS Windows. (Some were on Linux, migration of email data to another OS was required.)
- Määrake kataloogistruktuurid, mis osaleda hakkavad – need peavad olema identsed.
- Määrake kõik meiliserverid ühe domeeni alla, et kasutada ühtset DFS ruumi.
- Looge eelpool mainitud Kerio jaotatud domeen, kuna minu puhul on vajalik andmete sünkroniseerimine mitte ainult serverite vahel, vaid ka domeenide vahel; teise domeeni saab Kerio server iseseisvalt hallata. (eriülesanne esimesest)
- Suunake sünkroniseeritavad kataloogid DFS ruumi.
- Mõelge välja mingi lahendus (ilma selleta ei saa).
Rakendus
Näide kahe meiliserveri kohta (võib olla rohkem).
1. Kerio jaotatud domeen.

Master ei osale sünkroniseerimises, kuid see pole kohustuslik.
Kuidas luua Kerio jaotatud domeen, ma ei kirjuta; selles pole midagi keerulist, ametlike juhendite uurimine on võimalik.
Lõpuks peaksid administraatori konsoolis nägema järgmist pilti:
![]()

Järgmisena huvitas mind ühised kataloogid, mille puhul saate Master-serveris valida järgmised valikud:
![]()

Eriline igale domeenile — server ei sünkroniseeri avalikke katalooge domeenide vahel
Ühised kõikidele domeenidele — kõik serverid loobuvad olemasolevatest ühestest kataloogidest igas domeenis ja loovad uued ühed kataloogid kõigis domeenides igas postiserveris.
Tähelepanu! See valik muudab seadistamispoliitikat kõigis serverites, kuid sünkroniseerimine toimub eraldi igast serverist (st — ilma ühtse ühise ruumita)
Administraatoril jääb siiski võimalus jaotada juurdepääsu kasutajate vahel.
minu puhul — kõik oma ja mul on vaja täielikku sünkroniseerimist (Teie puhul võib lahendus olla teine) igas serveris tuleb luua identsed domeenide kogumid, mida tuleb sünkroniseerida.
2. Kerio andmekataloogid
Nüüd tuleb luua identsed ühised kataloogid, mida tuleb sünkroniseerida igas serveris. Kataloogid, Kalender, Kontaktid.
Soovitus – looge katalooge inglise keeles, sest kui loote need ladina tähtedega, on katalooge nimed mingis mõttes arusaamatutes sümbolites, mis on vähemalt ebamugav.
Nüüd on vajalik leida füüsilised postikataloogide teed igas serveris.
Ühised kõikidele domeenidele ~DataMailmail#publicSünkroonitud kataloog#msgs
Eriline igale domeenile ~DataMailmail**Domeen**#publicSünkroonitud kataloog#msgs
Pange tähele, et me sünkroonime mitte kogu katalooge, vaid ainult andmekonteinerit. #msgs — siin hoitakse objekte, kõik ülejäänud andmed iga serveri jaoks peavad olema omad.
3. DFS
DFS-i seadistamise kohta tohin üksikasjadesse siseneda, informatsiooni selle teema kohta on piisavalt.
DFS on Windows Serveri rolliteenus, mis võimaldab ühendada erinevates serverites asuvaid jagatud kaustu.
Enne DFS-i seadistamist tuleb peatada kõik postiserverid, mis osalevad andmete sünkroonimises.
Seadistamise lõpuks peaksite iga sünkroonitava kausta jaoks saama järgmise pildi.

me ei pea replitseerivaid kaustu loomulikult avaldama.

Pärast replikatsiooni toimumist (aga seal ei ole erilist, mida replikeerida — kaustad on tühjad) saab meiliserverid käivitada.
Seejärel saab ühte meiliserverit andmetega täita ja kontrollida, et andmed replitseeruvad õigesti.
4. Lahendus
Mõttekirjeldus
Nagu võite veenduda, pärast seda kui andmed hakkasid sünkroonima (DFS), juhul kui te loomulikult midagi esimesel serveril lõite — siis teisel serveril ei ilmu midagi või ilmub, kuid mitte alati.
Lootma ei pea, muidugi varem või hiljem see ilmub, aga parem varem kui hiljem. Sest hiljem tähendab 6–12 tundi.
Asi on selles, et niipea kui te esimesel serveril midagi lõite, ilmub fail teisel ja järgmistel serveritel kohe tänu DFS süsteemile, kuid juhul kui see meilikaust on varem kellegi poolt läbi vaadatud ja seda nõutakse uuesti, ei loe server kausta #msgs uuesti, vaid viskab andmed välja oma omast indeksist, mis võib juba ammu meie reaalsusega mitte ühtida.
Kerio-l on indeksit uuesti lugemise mehhanism, kuid see võib töötada umbes kuue tunni pärast ja selle aja jooksul võib kalendris oleva ülesande ajakohasus mõnevõrra kaduma minna.
Sünkroonimise töö kontrollimiseks kohe nüüd, saab kustutada vastavas sünkroonitavas kataloogis faili index.fld. Pärast kaustale uuesti pöördumist ja selle faili puudumisel loeb Kerio katalooge uuesti ja andmed ilmuvad. See võiks tunduda lahendusena — kustutage fail andmete muutumise korral, kuid see töötab ainult esimesel korral; hiljem kaotab Kerio mingil põhjusel index.fld vastu huvi.
Samuti hakkab Kerio väljastama kasutajale arusaamatuid teadete — millestki indeksist ja et see seal juba midagi teeb.
On ka veel variant, et luua midagi — uut objekti luues mõtleb server järsku välja, et failinimi, mille ta tahab määrata, on juba hõivatud, kuid siit tekib lumeplats ja see on ummiktee.
Kuidas edasi tegutseda?
Kui märgata veel kord tuttavat pilti.

Kuid teises mõõtmes võib leida väga huvitava ja meile praegu vajaliku nupu — Kataloogide reindekseerimine
Ja, tõepoolest. Kui vajutada seda nuppu postiserveris, mis ei tea, et sünkroniseeritud #msgs-is on midagi muutunud, saame stabiilse ja kiire tulemuse. Kõik, mis on varjatud, muutub nähtavaks.
Logis saab vaadata, kui kaua see protsess aega võtab; minu puhul, kus on mitu tuhat (15 tuhat) kirjet, umbes 3-4 minutit.
Järgi jääb vaid välja mõelda, kuidas tegelikult selle nuppu vajutada, siis kui me seda vajame.
Selgub, et Kerio on oma API
funktsioon, mis täidab meie ülesande, näeb välja nii –
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)
Kõigest eelnevast peab kirjutama skripti, mis jälgib huvipakkuvate kaustade seisundit ja juhul, kui midagi on muutunud, täidab meie jaoks vajaliku funktsiooni.
Pean ütlema, et olen kirjutanud mitu erinevat versiooni skripte, mis teevad erinevaid kontrollimisi, ja peatusin selle peal, mis kõik järeldused oma failide arvu põhjal koostab.
Skripti rakendamine
CMD skripti näide ja kirjeldus
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
Skripti koopia käivitatakse igas postiserveris (võib olla teenusena, admin õigusi ei ole vajalikud)
Skripts loeb faili Setup%Computername%.List
Kus %Computername% — praeguse serveri nimi (Kaust võib sisaldada kohe loendit kõigist serveritest.)
Fail %Computername%.List – sisaldab täielikke teid sünkroonitavatest kaustadest, iga tee on kirjutatud uuele reale, tühje reasi sisaldama ei tohi.
Pärast esimest käivitamist skript täidab indekseerimise protseduuri, olenemata sellest, kas see on vajalik või mitte, samuti loob skript faili arvu indeksi iga sünkroonitava kausta kohta.
Skripti ülesanne on arvestada kõiki faile määratud kaustas.
Kuna iga kausta lugemine on lõppenud, kui ühes kaustas ei vasta failide praegune väärtus eelmisele, kustutab skript failid sünkroonitava postikatalooge juurkaustast: index.fld, indexlog.fld, search.fld ja käivitab indekseerimise protsessi — üldiste postkastide jaoks.
LOG kausta salvestatakse teave ülesannete täitmise kohta.
Indekseerimise protsess
Indekseerimise protsess seisneb Kerio API funktsiooni täitmises
Session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)
Näide täitmisest on toodud – python
PublicFolders.py
import json
import urllib.request
import http.cookiejar
""" Küpsiste salvestamine on vajalik sessiooni haldamiseks """
jar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar))
urllib.request.install_opener(opener)
""" Kerio Control'i instantsi hostinimi või IP-aadress, sealhulgas protokoll, port ja volitused """
server = "http://127.0.0.1:4040"
username = "user"
password = "password"
def callMethod(method, params, token = None):
"""
Kaugkutsed antud meetodile koos antud parameetritega.
:param: method string, millel on täielikult kvalifitseeritud meetodi nimi
:param: params dict kaugt kutsutava meetodi parameetritega
:param: token CSRF token on alati nõutud välja arvatud sisselogimise meetodi puhul. Kasutage meetodit "Session.login", et seda tokenit 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)
võite jätta nii, nagu on, kuid kui vajate HTTPS-i, peab Python usaldama Kerio sertifikaati.
Failis tuleb samuti märkida konto, millel on selle funktsiooni täitmiseks õigused (Admin – ühised postkastid) postiserveris.
Loodan, et minu artikkel on kasulik Kerio Connecti administreerijatele.
Allikas: habr.com
