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
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
Azken finean, hurrengo irudia ikusi beharko zenuke administrazio kontsolan:
Ondoren partekatutako karpetak interesatzen zitzaizkidan; zerbitzari nagusian aukera hauek zehaztu ditzakezu:
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
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
Jakina, ez dugu karpeta erreplikatuak argitaratu behar.
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.
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
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)
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