Banatutako Kerio Connect zerbitzarien artean partekatutako karpeta, kontaktu eta egutegien sinkronizazio osoa

Arratsalde on, Habr!

Task

Nire erakundeak posta-zerbitzari bat erabiltzen du Kerio Connect plataforman; posta-zerbitzariak hiri ezberdinetan instalatuta daude erabiltzaileei zerbitzatzeko. Hasieran ez zegoen egitura banaturik, hirugarren mailan domeinuak desberdinak baitira, guneko hiria adieraziz. Dena funtzionatu zuen eta denak pozik zeuden. Egun eder batean, zuzendaritzak zeregin bat ezarri zuen, gune guztien arteko jardueren egutegi komuna!

historiaurrea

Hasieran, Kerio Banatutako Posta Domeinua igotzea zen eta dena berak egingo zuen. Egin baino lehen, banatutako domeinu bat sortu zen, baina ez zen horrela izan, zerbitzaria prest zegoen egutegiak, karpetak, kontaktuak - zerbitzari berean kokatutako domeinuen artean sinkronizatzeko, baina ez zen batere datuak sinkronizatzera joango hainbaten artean. zerbitzariak.

Nik, noski, ez nuen halako harrapaketarik espero eta denbora luzez ezin nuen sinetsi behar nuen funtzionaltasuna falta zenik. Geroago gertakari horren froga dokumentala aurkitu nuen. Oso harrituta eta etsita nengoen honekin.

Zeregina arazorik gabe bihurtu zen.

Zeintzuk ziren aukerak?

  • Sortu bi bezero zerbitzari desberdinetan, beharrezko datuak hirugarrenen software batzuekin trukatzen dituztenak. Funtzionalitate hau inplementatuko zuen hirugarrenen software hau aurkitzea beharrezkoa zen - ez zait horrelako arrastoa gustatzen, baina bazirudien hori zela irtenbide azkar bakarra.
  • Idatzi zure script-a zerbitzarien arteko datuak sinkronizatzeko. Kontua da Kerio-k objektu bakoitza fitxategi bereizi batean gordetzen duela, beraz, fitxategiekin lan egiteko script bat garatzea beharrezkoa zen, baina iturri kopuru nahikoa ikusita, zeregina konplikatu samarra iruditu zitzaidan, batez ere hainbat gauza egitea beharrezkoa zelako. datuen zuzentasuna egiaztatzen du, norbaitek denbora tarte berean zeregina sortzen badu, etab., etab.

Aurrera begira, esango dut Keriok objektu bat fitxategi bereizi gisa gordetzen duen arren, ez dela hain ergela objektura sartzen zaren bakoitzean fitxategi-sistema nola dagoen galdetzea.

Denbora asko hausnartzen, paper mordoa "etsaiaren lurraldea aprobetxatzeko" planekin eginda, 6etan bi erabaki zuzen hartu nituen:

  • Lehen erabakia norberak egitea da eta kanpotik ezer ez bilatzea.
  • Bigarren irtenbidea lotara joatea da.

Dagoeneko goizean pentsamendu bakar eta egiazko batekin esnatu nintzen, letra batzuetara murriztu zena - DFS

Erabaki

Irtenbideak berak itxura hau zuen

  • ekarri sinkronizazioan parte hartuko duten zerbitzari guztiak OS Windows-era. (Zati bat Linux-en zegoen. Posta-datuak beste OS batera migratu behar ziren)
  • Sinkronizazioan parte hartuko duten direktorioen egitura zehaztu - berdinak izan behar dute.
  • Definitu posta-zerbitzari guztiak domeinu bakarrean DFS espazio bakarrarekin.
  • Sortu aipatutako Kerio domeinu banatua, nire kasuan datuen sinkronizazioa beharrezkoa baita, zerbitzarien artean ez ezik domeinuen artean ere; bigarrena Kerio zerbitzariak modu independentean kudea dezake. (lehenengoan ez bezala)
  • Ezarri direktorio sinkronizatuak DFS espaziora.
  • Asmatu makulu motaren bat (finean, ezin zara makulurik gabe bizi)

Inplementazioa

Adibidea bi posta zerbitzarietan (agian gehiago)

1. Kerio Domeinu banatua

Banatutako Kerio Connect zerbitzarien artean partekatutako karpeta, kontaktu eta egutegien sinkronizazio osoa

Masterrak ez du sinkronizazioan parte hartzen, baina hori ez da ezinbesteko baldintza.

Ez dut deskribatuko Kerio banatutako domeinu bat nola planteatu, ez dago ezer konplikaturik, ofiziala azter dezakezu manul

Azken finean, hurrengo irudia ikusi beharko zenuke administrazio kontsolan:

Banatutako Kerio Connect zerbitzarien artean partekatutako karpeta, kontaktu eta egutegien sinkronizazio osoa

Banatutako Kerio Connect zerbitzarien artean partekatutako karpeta, kontaktu eta egutegien sinkronizazio osoa

Ondoren partekatutako karpetak interesatzen zitzaizkidan; zerbitzari nagusian aukera hauek zehaztu ditzakezu:

Banatutako Kerio Connect zerbitzarien artean partekatutako karpeta, kontaktu eta egutegien sinkronizazio osoa

Banatutako Kerio Connect zerbitzarien artean partekatutako karpeta, kontaktu eta egutegien sinkronizazio osoa

Domeinu bakoitzerako espezifikoak - zerbitzariak ez ditu domeinuen artean karpeta publikoak sinkronizatuko

Domeinu guztietan komuna - zerbitzari guztiek domeinu bakoitzean dauden karpeta publikoak alde batera utziko dituzte eta karpeta bakar berriak sortuko dituzte posta-zerbitzari bakoitzean domeinu guztietarako.

Arreta! Aukera honek zerbitzari guztietan konfigurazio-politika aldatzen badu ere, zerbitzari bakoitzetik bereizita sinkronizatzen da (hau da, espazio komun bakar bat gabe)

Administratzaileak erabiltzaileen artean sarbidea banatzeko gaitasuna izango du oraindik.
nire kasuan, nireak dira guztiak eta sinkronizazio osoa behar dut (Zure kasuan, irtenbidea desberdina izan daiteke) zerbitzari bakoitzean sinkronizatu beharreko domeinu multzo berdinak sortu behar dituzu.

2. Kerio datu-direktorioak

Orain zerbitzarietako bakoitzean sinkronizatu beharreko direktorio partekatu berdinak sortu behar dituzu. Karpetak, Egutegiak, Kontaktuak.

Aholkua - sortu direktorioak ingelesez, latinez sortzen badituzu, direktorioak izen bat izango du kodeketa ulertezin batean, hau behintzat deserosoa da.

Orain zerbitzari bakoitzeko posta-karpeten bide fisikoak aurkitu behar dituzu.

Domeinu guztietan komuna ~DataMailmail#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs
Domeinu bakoitzerako espezifikoak ~DataMailmail**Domain**#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs

Kontuan izan ez dugula direktorio osoa sinkronizatuko, edukiontzia baizik eta datuekin #msgs β€” objektuak beraiek hemen gordetzen dira, gainerako datu guztiak bereizita egon behar dute zerbitzari bakoitzeko.

3.DFS

Ez dut zehatz-mehatz deskribatuko DFS nola konfiguratu, arazo honi buruzko informazio nahikoa dago.

DFS Windows Server-en rol-zerbitzu bat da, zerbitzari desberdinetan dauden karpeta partekatuak konbinatzeko gaitasuna ematen duena
Esteka MS DFS dokumentura

DFS konfiguratu aurretik, datuen sinkronizazioan parte hartuko duten posta-zerbitzari guztiak gelditu behar dituzu.

Konfigurazioa amaitutakoan, sinkronizatutako karpeta bakoitzerako honako irudi hau jaso beharko zenuke

Banatutako Kerio Connect zerbitzarien artean partekatutako karpeta, kontaktu eta egutegien sinkronizazio osoa

Jakina, ez dugu karpeta erreplikatuak argitaratu behar.

Banatutako Kerio Connect zerbitzarien artean partekatutako karpeta, kontaktu eta egutegien sinkronizazio osoa

Erreplikatzea gertatu ondoren (eta ez dago ezer berezirik errepikatzeko hor - karpetak hutsik daude), posta-zerbitzariak abiarazi daitezke.

Ondoren, posta-zerbitzarietako bat datuz bete dezakezu eta datuak behar bezala errepikatu direla egiaztatu.

4. Makulua

Hausnarketaren deskribapena

Datuak sinkronizatzen hasi ondoren (DFS) ikus dezakezun bezala, lehenengo zerbitzarian zerbait sortu baduzu, nolabait ez da ezer agertzen bigarren zerbitzarian, edo agertzen da baina nolabait ez beti.

Ez etsi; jakina, bertan agertuko da lehenago edo beranduago, baina hobeto geroago baino. 6-12 ordutan beranduegi delako.

Kontua da lehen zerbitzarian zerbait sortu bezain laster, bigarren eta ondorengo zerbitzarietan fitxategia berehala agertuko dela noski DFS sistemari esker, baina posta-direktorio hori aurretik norbaitek irakurri badu. eta berriro eskatzen zaio, zerbitzariak ez du #msgs karpeta berriro irakurriko baina bere indizeko datuak txutuko ditu, agian gure errealitatearekin bat ez datozenak.

Keriok badu aurkibidea berrirakurtzeko mekanismoa, baina sei ordu ingurutan funtziona dezake, eta 6 ordu horietan zereginaren garrantzia egutegian zertxobait galdu daiteke.
Sinkronizazioa oraintxe bertan probatzeko, dagokion direktorio sinkronizatuko index.fld-ko fitxategia ezabatu dezakezu, posta-zerbitzariko karpetara berriro sartu ondoren eta fitxategi hau falta bada, Kerio-k direktorioa eta datuak berriro irakurriko ditu. agertuko da. Badirudi hau dela irtenbidea, ezabatu fitxategia datuak aldatzen direnean, baina honek ez du aldi bakoitzean funtzionatzen, baina lehen aldiz bakarrik, orduan Keriok arrazoiren batengatik index.fld-en interesa galtzen du.
Erabiltzailearentzat ulergaitzak diren mezuak txunditzen hasten da ere, indize motaren bati buruz eta dagoeneko zerbait egiten ari dela.

Bada beste aukera bat, zerbait sortzea - ​​objektu berri bat sortzeko momentuan, zerbitzaria bat-batean konturatzen da esleitu nahi zuen fitxategi-izena dagoeneko hartua dela, baina elur-bola egiten du eta hau muturreko aukera bat da.

Nola egin dezaket hori?

Erreparatzen badiogu berriro ere jada ezaguna zaigun argazkiari.

Banatutako Kerio Connect zerbitzarien artean partekatutako karpeta, kontaktu eta egutegien sinkronizazio osoa

Baina beste hegazkin batean, orain behar dugun botoi oso interesgarri bat ikus dezakezu - Berriro indexatu karpetak

Eta hain zuzen ere. Sinkronizatutako #msgetan zerbait aldatu dela ez dakien posta zerbitzari batean botoi hau sakatzen badugu, emaitza egonkorra eta azkarra lortuko dugu. Ezkutuan dagoen guztia argi geratuko da.

Erregistroan prozesu honek zenbat irauten duen ikus dezakezu; nire kasuan hainbat mila (15 mila) erregistrorekin 3-4 minutu inguru behar dira.

Egin behar dugun bakarra botoi hau nola sakatu behar dugunean da.

Gertatzen da Kerio bereak dituzte API

Description
Dokumentazioa

Gure zeregina betetzen duen funtzioak honelako itxura du:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Aurreko guztietatik, interesgarri diren karpeten egoera kontrolatuko lukeen script bat idatzi behar dugu eta, zerbait aldatu bada, behar dugun funtzioa beteko luke.

Esan nahi dut egiaztapen desberdinak egiten dituzten scripten hainbat bertsio idatzi ditudala, eta fitxategi kopuruaren arabera ondorio guztiak ateratzen dituena finkatu dudala.

Script inplementazioa

CMD script adibidea eta deskribapena

Berriz indexatu.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

Script-aren kopia bat posta-zerbitzari bakoitzean exekutatzen da (zerbitzu gisa erabil daiteke, Adm eskubideak ez dira beharrezkoak)

Gidoiak fitxategia irakurtzen du Setup%Computername%.List

Non %Computername% uneko zerbitzariaren izena den (direktorioak zerbitzari guztien zerrendak izan ditzake aldi berean.)

%Computername%.List fitxategiak - sinkronizatutako direktorioen bide osoak ditu, bide bakoitza lerro berri batean idatzita dago eta ez luke lerro hutsik eduki behar.

Lehenengo abiarazi ondoren, scriptak indexatzeko prozedura egiten du, beharrezkoa den ala ez kontuan hartu gabe, eta scriptak sinkronizatutako direktorio bakoitzeko fitxategi kopuruaren indizea ere sortzen du.

Scriptaren helburua zehaztutako direktorioko fitxategi guztiak zenbatzea da.

Direktorio bakoitzaren zenbaketaren amaieran, gutxienez direktorio batean fitxategien uneko balioa aurrekoarekin bat ez badator, script-ak fitxategiak ezabatzen ditu posta-direktorioaren erro-direktoriotik: index.fld, indexlog.fld, search.fld eta partekatutako posta-karpetak indexatzeko prozesua hasten du.

Zereginen exekuzioari buruzko informazioa LOG direktoriora isurtzen da.

Indexazio-prozesua
Indexazio-prozesua Kerio API funtzio bat exekutatzera dator
Saioa = callMethod ("Domains.checkPublicFoldersIntegrity",{}, token)

Inplementazio adibide bat – python-en ematen da
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 dagoen bezala utz dezakezu, baina HTTPS eskatzen baduzu, python-ek Kerio ziurtagirian fidatu behar du.

Fitxategian ere posta zerbitzariaren funtzio hau (Adm - posta-karpeta publikoak) betetzeko eskubide dituen kontu bat zehaztu behar duzu.

Nire artikulua Kerio Connect administratzaileentzat erabilgarria izatea espero dut.

Iturria: www.habr.com

Gehitu iruzkin berria