Pilnīga koplietoto mapju, kontaktu, kalendāru sinhronizācija starp izplatītajiem Kerio Connect serveriem

Labdien, Habr!

Uzdevums

Mana organizācija izmanto pasta serveri Kerio Connect platformā; pasta serveri ir instalēti dažādās pilsētās, lai apkalpotu savus lietotājus. Sākotnēji nebija sadalÄ«tas struktÅ«ras, jo domēni atŔķiras treÅ”ajā lÄ«menÄ«, norādot vietnes pilsētu. Viss strādāja un visi bija apmierināti. Kādā jaukā dienā vadÄ«ba izvirzÄ«ja uzdevumu, kopÄ«gu aktivitāŔu kalendāru starp visām vietnēm!

Aizvēsture

Sākotnēji bija doma paaugstināt Kerio Distributed Mail domēnu, un tas visu darītu pats. Tikko tika izveidots izplatīts domēns, taču tas tā nebija, serveris bija gatavs sinhronizēt kalendārus, mapes, kontaktus - starp domēniem, kas atrodas vienā serverī, bet nemaz negrasījās sinhronizēt datus starp vairākiem serveriem.

Es, protams, nebiju gaidÄ«jis Ŕādu lomu un ilgi nevarēju noticēt, ka pietrÅ«kst vajadzÄ«gās funkcionalitātes. Vēlāk es atradu dokumentālus pierādÄ«jumus Å”im faktam. Es biju ļoti neizpratnē un vÄ«lies par to.

Uzdevums vienmērīgi pārvērtās par problēmu.

Kādi bija varianti?

  • Izveidojiet divus klientus dažādos serveros, kas apmainās ar nepiecieÅ”amajiem datiem ar kādu treŔās puses programmatÅ«ru. Bija jāatrod Ŕī treŔās puses programmatÅ«ra, kas ieviestu Å”o funkcionalitāti - man nepatÄ«k Ŕāds grābeklis, bet Ŕķita, ka tas bija vienÄ«gais ātrais risinājums.
  • Uzrakstiet savu skriptu datu sinhronizÄ“Å”anai starp serveriem. Fakts ir tāds, ka Kerio katru objektu glabā kā atseviŔķu failu, tāpēc bija nepiecieÅ”ams izstrādāt skriptu darbam ar failiem, taču, ņemot vērā pietiekamu avotu skaitu, uzdevums Ŕķita nedaudz sarežģīts, jo Ä«paÅ”i tāpēc, ka bija nepiecieÅ”ams veikt vairākus pārbauda datu pareizÄ«bu, ja kāds tajā paŔā laika periodā izveido uzdevumu utt., utt.

Raugoties uz priekÅ”u, es teikÅ”u, ka, lai gan Kerio objektu saglabā kā atseviŔķu failu, tas nav tik stulbi, lai ikreiz, kad piekļūstat objektam, jautātu, kā klājas failu sistēmai.

PavadÄ«jis daudz laika, domājot, sastādot papÄ«ru kaudzi ar plāniem ā€œiekarot ienaidnieka teritorijuā€, pulksten 6 es pieņēmu divus pareizos lēmumus:

  • Pirmais lēmums ir darÄ«t savu lietu un neko nemeklēt no malas.
  • Otrs risinājums ir iet gulēt.

Jau no rīta pamodos ar vienu vienīgu un patiesu domu, kas tika samazināta līdz dažiem burtiem - DFS

Å Ä·Ä«dums

Pats risinājums izskatījās Ŕādi

  • nogādājiet visus serverus, kas piedalÄ«sies sinhronizācijā, uz OS Windows. (Daļa no tā bija operētājsistēmā Linux. Bija nepiecieÅ”ama pasta datu migrācija uz citu OS)
  • Nosakiet to direktoriju struktÅ«ru, kas piedalÄ«sies sinhronizācijā - tiem jābÅ«t identiskiem.
  • Definējiet visus pasta serverus vienā domēnā ar vienu DFS vietu.
  • Izveidojiet iepriekÅ” minēto izplatÄ«to Kerio domēnu, jo manā gadÄ«jumā ir nepiecieÅ”ama datu sinhronizācija ne tikai starp serveriem, bet arÄ« starp domēniem, otro Kerio serveris var apstrādāt neatkarÄ«gi. (atŔķirÄ«bā no pirmās)
  • IestatÄ«t sinhronizētos direktorijus uz DFS vietu.
  • Izdomājiet kaut kādu kruÄ·i (galu galā, jÅ«s nevarat dzÄ«vot bez kruÄ·a)

IevieŔana

Piemērs uz diviem pasta serveriem (varbūt vairāk)

1. Kerio izplatītais domēns

Pilnīga koplietoto mapju, kontaktu, kalendāru sinhronizācija starp izplatītajiem Kerio Connect serveriem

Meistars nepiedalās sinhronizācijā, bet tas nav priekŔnoteikums.

Es neaprakstÄ«Å”u, kā izveidot Kerio izplatÄ«to domēnu, tajā nav nekā sarežģīta, varat izpētÄ«t oficiālo manul

Galu galā administrācijas konsolē vajadzētu redzēt Ŕādu attēlu:

Pilnīga koplietoto mapju, kontaktu, kalendāru sinhronizācija starp izplatītajiem Kerio Connect serveriem

Pilnīga koplietoto mapju, kontaktu, kalendāru sinhronizācija starp izplatītajiem Kerio Connect serveriem

Tālāk mani interesēja koplietotās mapes; galvenajā serverÄ« varat norādÄ«t Ŕādas opcijas:

Pilnīga koplietoto mapju, kontaktu, kalendāru sinhronizācija starp izplatītajiem Kerio Connect serveriem

Pilnīga koplietoto mapju, kontaktu, kalendāru sinhronizācija starp izplatītajiem Kerio Connect serveriem

ÄŖpaÅ”i katram domēnam - serveris nesinhronizēs publiskās mapes starp domēniem

KopÄ«gs visiem domēniem - visi serveri atteiksies no esoÅ”ajām publiskajām mapēm katrā domēnā un izveidos jaunas atseviŔķas mapes visiem domēniem katrā pasta serverÄ«.

UzmanÄ«bu! Lai gan Ŕī opcija maina konfigurācijas politiku visos serveros, tā tiek sinhronizēta atseviŔķi no katra servera (tas ir, bez vienas kopējas telpas).

Administrators joprojām varēs sadalīt piekļuvi starp lietotājiem.
manā gadÄ«jumā tie visi ir manējie, un man ir nepiecieÅ”ama pilna sinhronizācija (JÅ«su gadÄ«jumā risinājums var bÅ«t atŔķirÄ«gs) katrā serverÄ« ir jāizveido identiskas domēnu kopas, kuras jāsinhronizē.

2. Kerio datu direktoriji

Tagad jums ir jāizveido identiski koplietotie direktoriji, kas jāsinhronizē katrā no serveriem. Mapes, kalendāri, kontakti.

Padoms - veidojiet direktorijus angļu valodā, ja izveidosiet tos latīņu valodā, direktorijam būs nosaukums kaut kādā nesaprotamā kodējumā, tas ir vismaz neērti.

Tagad jums ir jāatrod pasta mapju fiziskie ceļi katrā serverī.

KopÄ«gs visiem domēniem ~DataMailmail#publicŠ”ŠøŠ½Ń…Ń€Š¾Š½ŠøŠ·ŠøруŠµŠ¼Ń‹Š¹ ŠŗŠ°Ń‚Š°Š»Š¾Š³#msgs
ÄŖpaÅ”i katram domēnam ~DataMailmail**Domain**#publicŠ”ŠøŠ½Ń…Ń€Š¾Š½ŠøŠ·ŠøруŠµŠ¼Ń‹Š¹ ŠŗŠ°Ń‚Š°Š»Š¾Š³#msgs

LÅ«dzu, ņemiet vērā, ka mēs nesinhronizēsim visu direktoriju, bet tikai konteineru ar datiem #ziņas ā€” Å”eit tiek glabāti paÅ”i objekti, visiem pārējiem datiem ir jābÅ«t atseviŔķi katram serverim.

3.DFS

Es sÄ«kāk neaprakstÄ«Å”u, kā konfigurēt DFS, par Å”o problēmu ir pietiekami daudz informācijas.

DFS ir Windows Server lomu pakalpojums, kas nodroÅ”ina iespēju apvienot koplietotās mapes, kas atrodas dažādos serveros
Saite uz MS DFS dokumentu

Pirms DFS iestatīŔanas ir jāaptur visi pasta serveri, kas piedalīsies datu sinhronizācijā.

Kad iestatÄ«Å”ana ir pabeigta, katrai sinhronizētajai mapei jāsaņem Ŕāds attēls

Pilnīga koplietoto mapju, kontaktu, kalendāru sinhronizācija starp izplatītajiem Kerio Connect serveriem

Protams, mums nav jāpublicē replicētas mapes.

Pilnīga koplietoto mapju, kontaktu, kalendāru sinhronizācija starp izplatītajiem Kerio Connect serveriem

Pēc replikācijas (un tur nav nekā Ä«paÅ”a, ko replicēt - mapes ir tukÅ”as), pasta serverus var palaist.

Pēc tam varat aizpildīt vienu no pasta serveriem ar datiem un pārbaudīt, vai dati ir pareizi replicēti.

4. KruÄ·is

Pārdomu apraksts

Kā redzat pēc datu sinhronizācijas (DFS) sākÅ”anas, ja kaut ko izveidojāt pirmajā serverÄ«, otrajā serverÄ« kaut kā nekas neparādās, vai arÄ« tas parādās, bet kaut kā ne vienmēr.

Neesiet izmisumā, protams, agrāk vai vēlāk tas tur parādÄ«sies, bet labāk agrāk nekā vēlāk. Jo ir par vēlu pēc 6ā€“12 stundām.

Lieta tāda, ka tiklÄ«dz esi kaut ko izveidojis pirmajā serverÄ«, otrajā un nākamajos serveros fails, protams, uzreiz parādÄ«sies, pateicoties DFS sistēmai, bet gadÄ«jumā, ja Å”o pasta direktoriju kāds jau ir izlasÄ«jis un tiek pieprasÄ«ts vēlreiz, serveris atkārtoti nelasÄ«s mapi #msgs, bet izspļaus datus no sava indeksa, kas, iespējams, vairs neatbilst mÅ«su realitātei.

Kerio ir indeksa pārlasÄ«Å”anas mehānisms, taču tas var darboties aptuveni seÅ”u stundu laikā, un Å”o 6 stundu laikā uzdevuma aktualitāte kalendārā var nedaudz zaudēt.
Lai tÅ«lÄ«t pārbaudÄ«tu sinhronizāciju, varat izdzēst failu attiecÄ«gajā sinhronizētajā direktorijā index.fld, pēc atkārtotas piekļuves pasta servera mapei un, ja Ŕī faila trÅ«kst, Kerio atkārtoti nolasÄ«s direktoriju un datus. parādÄ«sies. Å Ä·iet, ka tas ir risinājums, izdzēsiet failu, kad mainās dati, bet tas nedarbojas katru reizi, bet tikai pirmajā reizē, tad Kerio nez kāpēc zaudē interesi par index.fld
Sāk arī izspļaut lietotājam nesaprotamus ziņojumus - par kaut kādu indeksu un ka tas jau tur kaut ko dara.

Ir vēl viens variants, kaut ko izveidot - jauna objekta izveides brÄ«dÄ« serveris pēkŔņi saprot, ka faila nosaukums, ko gribēja pieŔķirt, jau ir aizņemts, bet tas snigst un tas ir strupceļa variants.

Kā tad tā?

Ja vēlreiz pievērÅ”am uzmanÄ«bu mums jau pazÄ«stamajai bildei.

Pilnīga koplietoto mapju, kontaktu, kalendāru sinhronizācija starp izplatītajiem Kerio Connect serveriem

Bet citā plaknē jūs varat redzēt ļoti interesantu pogu, kas mums tagad ir vajadzīga - Pārindeksēt mapes

Un tieŔām. Ja mēs noklikŔķināsim uz Ŕīs pogas pasta serverÄ«, kas nezina, ka sinhronizētajā #msgs kaut kas jau ir mainÄ«jies, mēs iegÅ«sim stabilu, ātru rezultātu. Viss apslēptais kļūs skaidrs.

Žurnālā var redzēt, cik ilgi Å”is process aizņem, manā gadÄ«jumā ar vairākiem tÅ«kstoÅ”iem (15 tÅ«kstoÅ”iem) ierakstu tas aizņem apmēram 3-4 minÅ«tes.

Viss, kas mums jādara, ir izdomāt, kā faktiski nospiest Ŕo pogu, kad mums tā ir nepiecieŔama.

Izrādās Kerio ir savs API

Apraksts
Š”Š¾ŠŗуŠ¼ŠµŠ½Ń‚Š°Ń†Šøя

Funkcija, kas veic mūsu uzdevumu, izskatās Ŕādi:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

No visa iepriekÅ” minētā mums ir jāuzraksta skripts, kas uzraudzÄ«tu interesējoÅ”o mapju stāvokli un, ja kaut kas ir mainÄ«jies, veiktu mums nepiecieÅ”amo funkciju.

Es gribu teikt, ka es uzrakstīju vairākas dažādas skriptu versijas, kas veic dažādas pārbaudes, un izvēlējos to, kas izdara visus secinājumus, pamatojoties uz failu skaitu.

Skripta ievieŔana

CMD skripta piemērs un apraksts

Pārindex.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

Skripta kopija darbojas katrā pasta serverī (var izmantot kā pakalpojumu, administratora tiesības nav nepiecieŔamas)

Skripts nolasa failu Setup%Computername%.List

Kur %Computername% ir paÅ”reizējā servera nosaukums (direktorijā var bÅ«t visu serveru saraksti vienlaikus.)

Fails %Computername%.List ā€“ satur pilnus sinhronizēto direktoriju ceļus, katrs ceļŔ ir ierakstÄ«ts jaunā rindā, un tajā nedrÄ«kst bÅ«t tukÅ”as rindas.

Pēc pirmās palaiÅ”anas skripts veic indeksÄ“Å”anas procedÅ«ru neatkarÄ«gi no tā, vai tas ir nepiecieÅ”ams, un skripts arÄ« izveido indeksu par failu skaitu katrā sinhronizētajā direktorijā.

Skripta mērķis ir saskaitīt visus failus norādītajā direktorijā.

Katra direktorija skaitÄ«Å”anas beigās, ja vismaz vienā direktorijā failu paÅ”reizējā vērtÄ«ba nesakrÄ«t ar iepriekŔējo, skripts izdzÄ“Å” failus no sinhronizētā pasta direktorija saknes direktorija: index.fld, indexlog.fld, search.fld un sāk koplietoto pasta mapju indeksÄ“Å”anas procesu.

Informācija par uzdevuma izpildi tiek ievietota LOG direktorijā.

IndeksēŔanas process
IndeksēŔanas process ir saistīts ar Kerio API funkcijas izpildi
Sesija = callMethod("Domains.checkPublicFoldersIntegrity",{}, marÄ·ieris)

ÄŖstenoÅ”anas piemērs ir dots - 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 varat atstāt to tādu, kāds tas ir, bet, ja jums ir nepiecieŔams HTTPS, python ir jāuzticas Kerio sertifikātam.

Tāpat failā jānorāda konts ar tiesībām veikt Ŕo pasta servera funkciju (Adm - publiskās pasta mapes).

Es ceru, ka mans raksts būs noderīgs Kerio Connect administratoriem.

Avots: www.habr.com

Pievieno komentāru