Cydamseriad llawn o ffolderi a rennir, cysylltiadau, calendrau rhwng gweinyddwyr Kerio Connect dosbarthedig

Prynhawn da, Habr!

Gorchwyl

Mae fy sefydliad yn defnyddio gweinydd post ar blatfform Kerio Connect; mae gweinyddwyr post yn cael eu gosod mewn gwahanol ddinasoedd i wasanaethu eu defnyddwyr. I ddechrau nid oedd unrhyw strwythur gwasgaredig, gan fod y parthau'n amrywio ar y drydedd lefel, gan nodi dinas y safle. Gweithiodd popeth ac roedd pawb yn hapus. Un diwrnod braf, gosododd y rheolwyr dasg, calendr cyffredin o weithgareddau rhwng pob safle!

cynhanes

I ddechrau, y syniad oedd codi Parth Post Dosbarthedig Kerio a byddai'n gwneud popeth ei hun. Wedi dweud na gwneud yn gynt, crΓ«wyd parth dosbarthedig, ond nid oedd hynny'n wir, roedd y gweinydd yn barod i gydamseru calendrau, ffolderi, cysylltiadau - rhwng parthau sydd wedi'u lleoli ar yr un gweinydd, ond nid oedd yn mynd i gydamseru data rhwng sawl un o gwbl gweinyddion.

Nid oeddwn, wrth gwrs, yn disgwyl y fath ddal ac am amser hir ni allwn gredu bod y swyddogaeth yr oeddwn ei angen ar goll. Yn ddiweddarach deuthum o hyd i dystiolaeth ddogfennol o'r ffaith hon. Cefais fy synnu a'm siomi gan hyn.

Trodd y dasg yn broblem yn ddidrafferth.

Beth oedd yr opsiynau?

  • Creu dau gleient ar weinyddion gwahanol sy'n cyfnewid y data angenrheidiol gyda rhywfaint o feddalwedd trydydd parti. Roedd angen dod o hyd i'r feddalwedd trydydd parti hon a fyddai'n gweithredu'r swyddogaeth hon - nid wyf yn hoffi rhaca o'r fath, ond roedd yn ymddangos mai dyma'r unig ateb cyflym.
  • Ysgrifennwch eich sgript eich hun ar gyfer cydamseru data rhwng gweinyddwyr. Y ffaith yw bod Kerio yn storio pob gwrthrych fel ffeil ar wahΓ’n, felly roedd angen datblygu sgript ar gyfer gweithio gyda ffeiliau, ond o ystyried y nifer digonol o ffynonellau, roedd y dasg yn ymddangos braidd yn gymhleth, yn enwedig gan fod angen perfformio lluosog. gwirio cywirdeb y data, rhag ofn bod rhywun yn creu tasg yn yr un cyfnod o amser, ac ati, ac ati.

Wrth edrych ymlaen, dywedaf, er bod Kerio yn storio gwrthrych fel ffeil ar wahΓ’n, nid yw mor dwp Γ’ gofyn sut mae'r system ffeiliau yn ei wneud bob tro y byddwch chi'n cyrchu gwrthrych.

Ar Γ΄l treulio llawer o amser yn meddwl, yn llunio bagad o ddarnau o bapur gyda chynlluniau β€œi gipio tiriogaeth y gelyn,” am 6 o’r gloch gwnes i ddau benderfyniad cywir:

  • Y penderfyniad cyntaf yw gwneud eich peth eich hun a pheidio Γ’ chwilio am unrhyw beth o'r tu allan.
  • Yr ail ateb yw mynd i gysgu.

Eisoes yn y bore deffrais gydag un meddwl sengl a gwir, a gafodd ei leihau i ychydig o lythyrau - DFS

penderfyniad

Roedd yr ateb ei hun yn edrych fel hyn

  • dod Γ’'r holl weinyddion a fydd yn cymryd rhan mewn cydamseru i OS Windows. (Roedd rhan ohono ar Linux. Roedd angen mudo data post i OS arall)
  • Darganfyddwch strwythur y cyfeiriaduron a fydd yn cymryd rhan mewn cydamseru - rhaid iddynt fod yn union yr un fath.
  • Diffiniwch bob gweinydd post o dan un parth gydag un gofod DFS.
  • Creu'r parth Kerio dosbarthedig uchod, oherwydd yn fy achos i mae angen cydamseru data, nid yn unig rhwng gweinyddwyr ond hefyd rhwng parthau; gall gweinydd Kerio drin yr ail yn annibynnol. (yn wahanol i'r un cyntaf)
  • Gosod cyfeiriaduron cydamserol i ofod DFS.
  • Meddyliwch am ryw fath o faglau (wedi'r cyfan, ni allwch fyw heb faglau)

Gweithredu

Enghraifft ar ddau weinydd post (efallai mwy)

1. Parth Dosbarthedig Kerio

Cydamseriad llawn o ffolderi a rennir, cysylltiadau, calendrau rhwng gweinyddwyr Kerio Connect dosbarthedig

Nid yw'r Meistr yn cymryd rhan mewn cydamseru, ond nid yw hyn yn rhagofyniad.

Ni fyddaf yn disgrifio sut i godi parth gwasgaredig Kerio, does dim byd cymhleth yn ei gylch, gallwch chi astudio'r swyddog manwl

Yn y pen draw, dylech weld y ddelwedd ganlynol yn y consol gweinyddu:

Cydamseriad llawn o ffolderi a rennir, cysylltiadau, calendrau rhwng gweinyddwyr Kerio Connect dosbarthedig

Cydamseriad llawn o ffolderi a rennir, cysylltiadau, calendrau rhwng gweinyddwyr Kerio Connect dosbarthedig

Nesaf roedd gennyf ddiddordeb mewn ffolderi a rennir; ar y gweinydd Meistr gallwch nodi'r opsiynau canlynol:

Cydamseriad llawn o ffolderi a rennir, cysylltiadau, calendrau rhwng gweinyddwyr Kerio Connect dosbarthedig

Cydamseriad llawn o ffolderi a rennir, cysylltiadau, calendrau rhwng gweinyddwyr Kerio Connect dosbarthedig

Penodol ar gyfer pob parth - ni fydd y gweinydd yn cysoni ffolderi cyhoeddus rhwng parthau

Cyffredin i bob parth - bydd pob gweinydd yn cefnu ar ffolderi cyhoeddus presennol ym mhob parth ac yn creu ffolderi sengl newydd ar gyfer pob parth ar bob gweinydd post.

Sylw! Er bod yr opsiwn hwn yn newid y polisi ffurfweddu ar bob gweinydd, mae'n cydamseru ar wahΓ’n i bob gweinydd (hynny yw, heb un gofod cyffredin)

Bydd gan y gweinyddwr y gallu o hyd i ddosbarthu mynediad rhwng defnyddwyr.
yn fy achos i, maen nhw i gyd yn fy un i ac mae angen cydamseru llawn arnaf (Yn eich achos chi, efallai y bydd yr ateb yn wahanol) ar bob gweinydd mae angen i chi greu setiau unfath o barthau y mae angen eu cydamseru.

2. Cyfeiriaduron data Kerio

Nawr mae angen i chi greu cyfeiriaduron a rennir union yr un fath y mae angen eu cysoni ar bob un o'r gweinyddwyr. Ffolderi, Calendrau, Cysylltiadau.

Cyngor - creu cyfeiriaduron yn Saesneg, os ydych yn eu creu yn Lladin, bydd y cyfeiriadur yn cael enw mewn rhai amgodio annealladwy, mae hyn o leiaf yn anghyfleus.

Nawr mae angen ichi ddod o hyd i lwybrau ffisegol y ffolderi post ar bob gweinydd.

Cyffredin i bob parth ~DataMailmail#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs
Penodol ar gyfer pob parth ~DataMailmail**Domain**#publicΠ‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³#msgs

Sylwch na fyddwn yn cydamseru'r cyfeiriadur cyfan, ond dim ond y cynhwysydd gyda'r data # negesau β€” mae'r gwrthrychau eu hunain yn cael eu storio yma, rhaid i'r holl ddata arall fod ar wahΓ’n ar gyfer pob gweinydd.

3.DFS

Ni fyddaf yn disgrifio'n fanwl sut i ffurfweddu DFS, mae digon o wybodaeth ar y mater hwn.

Mae DFS yn wasanaeth rΓ΄l yn Windows Server sy'n darparu'r gallu i gyfuno ffolderi a rennir sydd wedi'u lleoli ar wahanol weinyddion
Dolen i ddogfen MS DFS

Cyn sefydlu DFS, rhaid i chi atal pob gweinydd post a fydd yn cymryd rhan mewn cydamseru data.

Ar Γ΄l cwblhau'r gosodiad, dylech dderbyn y ddelwedd ganlynol ar gyfer pob un o'r ffolderi wedi'u cydamseru

Cydamseriad llawn o ffolderi a rennir, cysylltiadau, calendrau rhwng gweinyddwyr Kerio Connect dosbarthedig

Yn naturiol, nid oes angen i ni gyhoeddi ffolderi wedi'u hailadrodd.

Cydamseriad llawn o ffolderi a rennir, cysylltiadau, calendrau rhwng gweinyddwyr Kerio Connect dosbarthedig

Ar Γ΄l dyblygu (ac nid oes unrhyw beth arbennig i'w ailadrodd yno - mae'r ffolderi'n wag), gellir cychwyn y gweinyddwyr post.

Nesaf, gallwch chi lenwi un o'r gweinyddwyr post Γ’ data a gwirio bod y data'n cael ei ailadrodd yn gywir.

4. baglau

Disgrifiad o'r adlewyrchiad

Fel y gallwch weld ar Γ΄l i'r data ddechrau cydamseru (DFS), os ydych naill ai wedi creu rhywbeth ar y gweinydd cyntaf, rywsut nid oes dim yn ymddangos ar yr ail weinydd, neu mae'n ymddangos ond rywsut nid bob amser.

Peidiwch Γ’ digalonni; wrth gwrs, bydd yn ymddangos yno yn hwyr neu'n hwyrach, ond yn well yn gynt nag yn hwyrach. Oherwydd ei bod hi'n rhy hwyr mewn 6 - 12 awr.

Y peth yw, cyn gynted ag y byddwch wedi creu rhywbeth ar y gweinydd cyntaf, ar yr ail weinyddion a'r gweinyddwyr dilynol, bydd y ffeil wrth gwrs yn ymddangos ar unwaith diolch i'r system DFS, ond os bydd y cyfeiriadur post hwn eisoes wedi'i ddarllen gan rywun o'r blaen a gofynnir eto, ni fydd y gweinydd yn ail-ddarllen y ffolder #msgs ond bydd yn poeri data o'i fynegai ei hun, nad yw o bosibl yn cyfateb i'n realiti ni mwyach.

Mae gan Kerio fecanwaith ar gyfer ailddarllen y mynegai, ond gall weithio mewn tua chwe awr, ac yn ystod y 6 awr hyn efallai y bydd perthnasedd y dasg yn y calendr yn cael ei golli rhywfaint.
Er mwyn profi'r cydamseriad ar hyn o bryd, gallwch ddileu'r ffeil yn y cyfeiriadur cydamserol cyfatebol index.fld, ar Γ΄l ail-gyrchu'r ffolder ar y gweinydd post ac os yw'r ffeil hon ar goll, bydd Kerio yn ail-ddarllen y cyfeiriadur a'r data bydd yn ymddangos. Mae'n ymddangos mai dyma'r ateb, dileu'r ffeil pan fydd y data'n newid, ond nid yw hyn yn gweithio bob tro, ond dim ond y tro cyntaf, yna mae Kerio am ryw reswm yn colli pob diddordeb yn index.fld
Mae hefyd yn dechrau poeri allan negeseuon sy'n annealladwy i'r defnyddiwr - am ryw fath o fynegai a'i fod eisoes yn gwneud rhywbeth yno.

Mae yna opsiwn arall, i greu rhywbeth - ar hyn o bryd o greu gwrthrych newydd, mae'r gweinydd yn sylweddoli'n sydyn bod enw'r ffeil yr oedd am ei aseinio eisoes wedi'i gymryd, ond mae'n peli eira ac mae hwn yn opsiwn diwedd marw.

Sut i fod?

Os byddwn yn talu sylw unwaith eto i'r darlun sydd eisoes yn gyfarwydd i ni.

Cydamseriad llawn o ffolderi a rennir, cysylltiadau, calendrau rhwng gweinyddwyr Kerio Connect dosbarthedig

Ond ar awyren arall, gallwch weld botwm diddorol iawn sydd ei angen arnom nawr - Ffolderi Reindex

Ac yn wir. Os byddwn yn clicio ar y botwm hwn ar weinydd post nad yw'n gwybod bod rhywbeth eisoes wedi newid yn y #msgs cydamserol, byddwn yn cael canlyniad sefydlog, cyflym. Bydd popeth cudd yn dod yn glir.

Yn y log gallwch weld pa mor hir y mae'r broses hon yn ei gymryd; yn fy achos i gyda rhai miloedd (15 mil) o gofnodion mae'n cymryd tua 3-4 munud.

Y cyfan sy'n rhaid i ni ei wneud yw darganfod sut i wasgu'r botwm hwn pan fydd ei angen arnom.

Mae'n troi allan hynny Kerio cael eu rhai eu hunain API

Disgrifiad
Cofnodion

Mae'r swyddogaeth sy'n cyflawni ein tasg yn edrych fel hyn:
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

O'r uchod i gyd, mae angen i ni ysgrifennu sgript a fyddai'n monitro cyflwr y ffolderi o ddiddordeb ac, os yw rhywbeth wedi newid, yn cyflawni'r swyddogaeth sydd ei hangen arnom.

Rwyf am ddweud fy mod wedi ysgrifennu sawl fersiwn wahanol o sgriptiau sy'n perfformio gwahanol wiriadau, ac wedi setlo ar yr un sy'n dod i bob casgliad yn seiliedig ar nifer y ffeiliau.

Gweithredu sgript

Enghraifft a disgrifiad sgript CMD

Ail-fynegai.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

Mae copi o'r sgript yn rhedeg ar bob gweinydd post (gellir ei ddefnyddio fel gwasanaeth, nid oes angen hawliau Adm)

Mae'r sgript yn darllen y ffeil Setup%Computername%.List

Lle mae %Computername% yn enw'r gweinydd presennol (Gall y cyfeiriadur gynnwys rhestrau o'r holl weinyddion ar unwaith.)

Mae'r ffeil % Computername%.Rhestr - yn cynnwys llwybrau llawn y cyfeiriaduron cydamserol, mae pob llwybr wedi'i ysgrifennu ar linell newydd, ac ni ddylai gynnwys llinellau gwag.

Ar Γ΄l y lansiad cyntaf, mae'r sgript yn perfformio'r weithdrefn mynegeio, ni waeth a yw'n angenrheidiol ai peidio, ac mae'r sgript hefyd yn creu mynegai o nifer y ffeiliau ym mhob cyfeiriadur cydamserol.

Pwrpas y sgript yw cyfrif yr holl ffeiliau yn y cyfeiriadur penodedig.

Ar ddiwedd cyfrif pob cyfeiriadur, os nad yw gwerth cyfredol y ffeiliau mewn o leiaf un cyfeiriadur yn cyfateb i'r un blaenorol, mae'r sgript yn dileu ffeiliau o gyfeiriadur gwraidd y cyfeiriadur post cydamserol: index.fld, indexlog.fld, search.fld ac yn dechrau'r broses fynegeio o ffolderi post a rennir.

Mae gwybodaeth am gyflawni tasg yn cael ei dympio i'r cyfeiriadur LOG.

Proses fynegeio
Daw'r broses fynegeio i lawr i weithredu swyddogaeth API Kerio
Sesiwn = callMethod("Domains.checkPublicFoldersIntegrity",{}, tocyn)

Rhoddir enghraifft o weithrediad yn – 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 gallwch ei adael fel y mae, ond os oes angen HTTPS arnoch, rhaid i python ymddiried yn nhystysgrif Kerio.

Hefyd yn y ffeil rhaid i chi nodi cyfrif gyda hawliau i gyflawni'r swyddogaeth hon (Adm - ffolderi post cyhoeddus) y gweinydd post.

Rwy'n gobeithio y bydd fy erthygl yn ddefnyddiol i weinyddwyr Kerio Connect.

Ffynhonnell: hab.com

Ychwanegu sylw