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
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
Galu galÄ administrÄcijas konsolÄ vajadzÄtu redzÄt Å”Ädu attÄlu:
TÄlÄk mani interesÄja koplietotÄs mapes; galvenajÄ serverÄ« varat norÄdÄ«t Å”Ädas opcijas:
ÄŖ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
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
Protams, mums nav jÄpublicÄ replicÄtas mapes.
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.
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
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)
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