Համօգտագործվող թղթապանակների, կոնտակտների, օրացույցների ամբողջական համաժամացում բաշխված Kerio Connect սերվերների միջև

Բարի օր, Հաբր:

Առաջադրանք

Իմ կազմակերպությունն օգտագործում է փոստի սերվեր Kerio Connect հարթակում, փոստային սերվերները տեղադրված են տարբեր քաղաքներում՝ իրենց օգտատերերին սպասարկելու համար: Սկզբում չկար բաշխված կառուցվածք, քանի որ տիրույթները տարբերվում են երրորդ մակարդակում՝ նշելով կայքի քաղաքը։ Ամեն ինչ ստացվեց, և բոլորը երջանիկ էին: Մի գեղեցիկ օր ղեկավարությունը խնդիր դրեց՝ գործունեության ընդհանուր օրացույց բոլոր կայքերի միջև:

նախապատմությանը

Ի սկզբանե, գաղափարն այն էր, որ բարձրացնել Kerio Distributed Mail Domain-ը, և այն ամեն ինչ կանի ինքն իրեն: Արվածից անմիջապես հետո ստեղծվեց բաշխված տիրույթ, բայց դա այդպես չէր, սերվերը պատրաստ էր համաժամեցնել օրացույցները, թղթապանակները, կոնտակտները՝ նույն սերվերում տեղակայված տիրույթների միջև, բայց ընդհանրապես չէր պատրաստվում համաժամեցնել տվյալները մի քանիսի միջև: սերվերներ.

Ես, իհարկե, չէի սպասում նման բռնելու և երկար ժամանակ չէի կարողանում հավատալ, որ ինձ անհրաժեշտ ֆունկցիոնալությունը բացակայում է: Ավելի ուշ ես գտա այս փաստի փաստագրական ապացույցները։ Ես շատ շփոթված և հիասթափված էի սա:

Առաջադրանքը սահուն վերածվեց խնդրի։

Որո՞նք էին տարբերակները:

  • Ստեղծեք երկու հաճախորդ տարբեր սերվերների վրա, որոնք փոխանակում են անհրաժեշտ տվյալները երրորդ կողմի ծրագրերի հետ: Անհրաժեշտ էր գտնել այս երրորդ կողմի ծրագրակազմը, որը կիրականացներ այս ֆունկցիոնալությունը. ես չեմ սիրում նման փոցխ, բայց թվում էր, որ սա միակ արագ լուծումն էր:
  • Գրեք ձեր սեփական սցենարը սերվերների միջև տվյալների համաժամացման համար: Փաստն այն է, որ Kerio-ն յուրաքանչյուր օբյեկտ պահում է որպես առանձին ֆայլ, ուստի անհրաժեշտ էր մշակել ֆայլերի հետ աշխատելու սցենար, բայց հաշվի առնելով աղբյուրների բավարար քանակությունը, առաջադրանքը որոշ չափով բարդ էր թվում, մանավանդ որ անհրաժեշտ էր մի քանի անգամ կատարել: ստուգում է տվյալների ճշգրտությունը, եթե ինչ-որ մեկը նույն ժամանակահատվածում առաջադրանք է ստեղծում և այլն, և այլն:

Նայելով առաջ՝ ես կասեմ, որ թեև Kerio-ն օբյեկտը պահում է որպես առանձին ֆայլ, բայց դա այնքան էլ հիմար չէ, որ ամեն անգամ օբյեկտին մուտք գործելիս հարցնել, թե ինչպես է ֆայլային համակարգը գործում:

Շատ ժամանակ անցկացնելով մտածելու, մի փունջ թղթի կտոր կազմելով «թշնամու տարածքը գրավելու» պլաններով, ժամը 6-ին ես երկու ճիշտ որոշում կայացրի.

  • Առաջին որոշումն այն է, որ դու զբաղվես քո գործով և դրսից ոչինչ չփնտրես:
  • Երկրորդ լուծումը քնելն է։

Արդեն առավոտյան ես արթնացա մեկ և ճշմարիտ մտքով, որը կրճատվեց մի քանի տառով - DFS

որոշում

Լուծումն ինքնին այսպիսի տեսք ուներ

  • բերել բոլոր սերվերները, որոնք կմասնակցեն համաժամացմանը ՕՀ Windows: (Դրա մի մասը Linux-ում էր: Պահանջվում էր փոստի տվյալների տեղափոխում այլ ՕՀ)
  • Որոշեք դիրեկտորիաների կառուցվածքը, որոնք կմասնակցեն համաժամացմանը. դրանք պետք է լինեն նույնական:
  • Սահմանեք բոլոր փոստի սերվերները մեկ տիրույթի տակ մեկ DFS տարածությամբ:
  • Ստեղծեք վերը նշված բաշխված Kerio տիրույթը, քանի որ իմ դեպքում անհրաժեշտ է տվյալների համաժամացում ոչ միայն սերվերների, այլ նաև տիրույթների միջև, երկրորդը կարող է ինքնուրույն կառավարվել Kerio սերվերի կողմից: (ի տարբերություն առաջինի)
  • Սահմանեք համաժամացված գրացուցակները DFS տարածության մեջ:
  • Գտեք ինչ-որ հենակով (ի վերջո, դուք չեք կարող ապրել առանց հենակի)

Իրականացման

Օրինակ երկու փոստի սերվերների վրա (գուցե ավելին)

1. Kerio Բաշխված տիրույթ

Համօգտագործվող թղթապանակների, կոնտակտների, օրացույցների ամբողջական համաժամացում բաշխված Kerio Connect սերվերների միջև

Վարպետը չի մասնակցում համաժամացմանը, բայց դա նախապայման չէ:

Ես չեմ նկարագրի, թե ինչպես բարձրացնել Kerio բաշխված տիրույթը, դրանում բարդ բան չկա, դուք կարող եք ուսումնասիրել պաշտոնականը մանուլ

Ի վերջո, դուք պետք է տեսնեք հետևյալ պատկերը կառավարման վահանակում.

Համօգտագործվող թղթապանակների, կոնտակտների, օրացույցների ամբողջական համաժամացում բաշխված Kerio Connect սերվերների միջև

Համօգտագործվող թղթապանակների, կոնտակտների, օրացույցների ամբողջական համաժամացում բաշխված Kerio Connect սերվերների միջև

Հաջորդը ինձ հետաքրքրեց ընդհանուր թղթապանակները, Master սերվերում կարող եք նշել հետևյալ տարբերակները.

Համօգտագործվող թղթապանակների, կոնտակտների, օրացույցների ամբողջական համաժամացում բաշխված Kerio Connect սերվերների միջև

Համօգտագործվող թղթապանակների, կոնտակտների, օրացույցների ամբողջական համաժամացում բաշխված Kerio Connect սերվերների միջև

Հատուկ յուրաքանչյուր տիրույթի համար - սերվերը չի համաժամանակացնի հանրային թղթապանակները տիրույթների միջև

Ընդհանուր բոլոր տիրույթների համար - բոլոր սերվերները կհրաժարվեն յուրաքանչյուր տիրույթում առկա հանրային թղթապանակներից և կստեղծեն նոր միայնակ թղթապանակներ բոլոր տիրույթների համար յուրաքանչյուր փոստային սերվերի վրա:

Զգուշացում! Չնայած այս տարբերակը փոխում է կազմաձևման քաղաքականությունը բոլոր սերվերների վրա, այն համաժամացվում է յուրաքանչյուր սերվերից առանձին (այսինքն՝ առանց մեկ ընդհանուր տարածության)

Ադմինիստրատորը դեռևս կունենա օգտատերերի միջև հասանելիությունը բաշխելու հնարավորություն:
իմ դեպքում, դրանք բոլորն իմն են, և ինձ անհրաժեշտ է լիարժեք համաժամացում (ձեր դեպքում լուծումը կարող է տարբեր լինել) յուրաքանչյուր սերվերի վրա դուք պետք է ստեղծեք տիրույթների նույնական հավաքածուներ, որոնք պետք է համաժամանակացվեն:

2. Kerio տվյալների գրացուցակներ

Այժմ դուք պետք է ստեղծեք նույնական համօգտագործվող դիրեկտորիաներ, որոնք պետք է համաժամացվեն սերվերներից յուրաքանչյուրի վրա: Թղթապանակներ, օրացույցներ, կոնտակտներ:

Խորհուրդ - դիրեկտորիաներ ստեղծեք անգլերենով, եթե դրանք ստեղծեք լատիներեն, գրացուցակը կունենա անուն ինչ-որ անհասկանալի կոդավորման մեջ, սա առնվազն անհարմար է:

Այժմ դուք պետք է գտնեք յուրաքանչյուր սերվերի փոստի թղթապանակների ֆիզիկական ուղիները:

Ընդհանուր բոլոր տիրույթների համար ~DataMailmail#publicСинхронизируемый каталог#msgs
Հատուկ յուրաքանչյուր տիրույթի համար ~DataMailmail**Domain**#publicСинхронизируемый каталог#msgs

Խնդրում ենք նկատի ունենալ, որ մենք չենք համաժամանակացնի ամբողջ գրացուցակը, այլ միայն կոնտեյները տվյալների հետ #msgs — օբյեկտներն իրենք են պահվում այստեղ, մնացած բոլոր տվյալները պետք է առանձին լինեն յուրաքանչյուր սերվերի համար:

3.DFS

Ես մանրամասն չեմ նկարագրի, թե ինչպես կարգավորել DFS-ը, այս հարցի վերաբերյալ բավականաչափ տեղեկատվություն կա:

DFS-ը Windows Server-ում դերային ծառայություն է, որն ապահովում է տարբեր սերվերների վրա տեղակայված ընդհանուր թղթապանակների համատեղման հնարավորություն
Հղում դեպի MS DFS փաստաթուղթ

Նախքան DFS-ը կարգավորելը, դուք պետք է դադարեցնեք բոլոր փոստային սերվերները, որոնք կմասնակցեն տվյալների համաժամացմանը:

Կարգավորումն ավարտելուց հետո դուք պետք է ստանաք հետևյալ պատկերը համաժամացված թղթապանակներից յուրաքանչյուրի համար

Համօգտագործվող թղթապանակների, կոնտակտների, օրացույցների ամբողջական համաժամացում բաշխված Kerio Connect սերվերների միջև

Բնականաբար, մենք կարիք չունենք կրկնվող թղթապանակներ հրապարակելու։

Համօգտագործվող թղթապանակների, կոնտակտների, օրացույցների ամբողջական համաժամացում բաշխված Kerio Connect սերվերների միջև

Կրկնօրինակելուց հետո (և այնտեղ կրկնօրինակելու հատուկ բան չկա. թղթապանակները դատարկ են), փոստային սերվերները կարող են գործարկվել:

Հաջորդը, դուք կարող եք լրացնել փոստի սերվերներից մեկը և ստուգել, ​​որ տվյալները ճիշտ են կրկնօրինակվում:

4. Հենակ

Արտացոլման նկարագրությունը

Ինչպես տեսնում եք տվյալների համաժամացման մեկնարկից հետո (DFS), եթե դուք կամ ինչ-որ բան եք ստեղծել առաջին սերվերում, ինչ-որ կերպ ոչինչ չի հայտնվում երկրորդ սերվերի վրա, կամ այն ​​հայտնվում է, բայց ինչ-որ կերպ ոչ միշտ:

Մի հուսահատվեք, իհարկե, այն վաղ թե ուշ կհայտնվի այնտեղ, բայց ավելի լավ է, քան ուշ: Քանի որ 6-12 ժամից շատ ուշ է:

Բանն այն է, որ հենց առաջին սերվերում ինչ-որ բան ստեղծեք, երկրորդ և հաջորդ սերվերների վրա ֆայլը, իհարկե, անմիջապես կհայտնվի DFS համակարգի շնորհիվ, բայց այն դեպքում, երբ այս փոստի գրացուցակը նախկինում ինչ-որ մեկի կողմից արդեն կարդացվել է: և նորից պահանջվում է, սերվերը նորից չի կարդա #msgs թղթապանակը, այլ կթքի իր սեփական ինդեքսից տվյալները, որոնք այլևս չեն համապատասխանում մեր իրականությանը:

Kerio-ն ունի ինդեքսը նորից կարդալու մեխանիզմ, բայց այն կարող է աշխատել մոտ վեց ժամում, և այս 6 ժամվա ընթացքում օրացույցում առաջադրանքի արդիականությունը կարող է որոշ չափով կորցնել։
Համաժամացումը հենց հիմա փորձարկելու համար կարող եք ջնջել ֆայլը համապատասխան համաժամացված գրացուցակում index.fld, փոստային սերվերի թղթապանակ նորից մուտք գործելուց հետո, և եթե այս ֆայլը բացակայում է, Kerio-ն նորից կկարդա գրացուցակը և տվյալները: կհայտնվի. Թվում է, թե սա է լուծումը, ջնջեք ֆայլը, երբ տվյալները փոխվում են, բայց դա չի աշխատում ամեն անգամ, այլ միայն առաջին անգամ, այնուհետև Kerio-ն ինչ-ինչ պատճառներով կորցնում է ամբողջ հետաքրքրությունը index.fld-ի նկատմամբ:
Այն նաև սկսում է թքել օգտվողի համար անհասկանալի հաղորդագրություններ՝ ինչ-որ ինդեքսների մասին, և որ նա արդեն ինչ-որ բան է անում այնտեղ:

Կա ևս մեկ տարբերակ՝ ինչ-որ բան ստեղծելու. նոր օբյեկտ ստեղծելու պահին սերվերը հանկարծ հասկանում է, որ ֆայլի անունը, որն ուզում էր նշանակել, արդեն վերցված է, բայց ձնագնդի է գալիս, և սա փակուղային տարբերակ է։

Ինչպե՞ս լինել:

Եթե ​​մեկ անգամ եւս ուշադրություն դարձնենք մեզ արդեն ծանոթ նկարին.

Համօգտագործվող թղթապանակների, կոնտակտների, օրացույցների ամբողջական համաժամացում բաշխված Kerio Connect սերվերների միջև

Բայց մեկ այլ ինքնաթիռում դուք կարող եք տեսնել մի շատ հետաքրքիր կոճակ, որը մեզ հիմա պետք է. Թղթապանակների վերաինդեքսավորում

Եվ իսկապես։ Եթե ​​մենք սեղմենք այս կոճակը փոստի սերվերի վրա, որը չգիտի, որ ինչ-որ բան արդեն փոխվել է համաժամացված #msgs-ում, մենք կստանանք կայուն, արագ արդյունք: Թաքնված ամեն ինչ պարզ կդառնա։

Գրանցամատյանում դուք կարող եք տեսնել, թե որքան ժամանակ է տևում այս գործընթացը, իմ դեպքում մի քանի հազար (15 հազար) գրառումների դեպքում դա տևում է մոտ 3-4 րոպե:

Մեզ մնում է միայն պարզել, թե իրականում ինչպես սեղմել այս կոճակը, երբ դա մեզ անհրաժեշտ է:

Պարզվում է Քերիո ունեն իրենց սեփականը API

Նկարագրություն
Փաստաթղթերով հիմնավորում

Մեր առաջադրանքը կատարող ֆունկցիան ունի հետևյալ տեսքը.
session = callMethod("Domains.checkPublicFoldersIntegrity",{}, token)

Վերոհիշյալ բոլորից մենք պետք է գրենք սկրիպտ, որը կվերահսկի հետաքրքրող թղթապանակների վիճակը և, եթե ինչ-որ բան փոխվել է, կատարի մեզ անհրաժեշտ գործառույթը:

Ես ուզում եմ ասել, որ ես գրել եմ սկրիպտների մի քանի տարբեր տարբերակներ, որոնք տարբեր ստուգումներ են կատարում, և որոշել եմ այն ​​մեկը, որը բոլոր եզրակացությունները անում է ֆայլերի քանակի հիման վրա:

Սցենարի իրականացում

CMD սցենարի օրինակ և նկարագրություն

Re-index.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

Սկրիպտի պատճենն աշխատում է յուրաքանչյուր փոստի սերվերի վրա (կարող է օգտագործվել որպես ծառայություն, Adm-ի իրավունքները պարտադիր չեն)

Սցենարը կարդում է ֆայլը Setup%Computername%.List

Որտեղ %Computername% ընթացիկ սերվերի անունն է (գրացուցակը կարող է պարունակել միանգամից բոլոր սերվերների ցուցակները:)

%Computername%.List ֆայլը պարունակում է համաժամացված գրացուցակների ամբողջական ուղիները, յուրաքանչյուր ուղի գրված է նոր տողում և չպետք է պարունակի դատարկ տողեր:

Առաջին գործարկումից հետո սկրիպտը կատարում է ինդեքսավորման պրոցեդուրան՝ անկախ նրանից՝ դա անհրաժեշտ է, թե ոչ, և սկրիպտը նաև ստեղծում է յուրաքանչյուր համաժամացված գրացուցակում ֆայլերի քանակի ինդեքս։

Սկրիպտի նպատակը նշված գրացուցակի բոլոր ֆայլերը հաշվելն է:

Յուրաքանչյուր գրացուցակ հաշվելու վերջում, եթե առնվազն մեկ գրացուցակում ֆայլերի ընթացիկ արժեքը չի համընկնում նախորդի հետ, սցենարը ջնջում է ֆայլերը համաժամացված փոստի գրացուցակի արմատային գրացուցակից. index.fld, indexlog.fld, search.fld և սկսում է ընդհանուր փոստի թղթապանակների ինդեքսավորման գործընթացը:

Առաջադրանքի կատարման մասին տեղեկատվությունը թափվում է LOG գրացուցակում:

Ինդեքսավորման գործընթաց
Ինդեքսավորման գործընթացը հանգում է Kerio API ֆունկցիայի կատարմանը
Session = callMethod ("Domains.checkPublicFoldersIntegrity",{}, նշան)

Տրված է իրականացման օրինակ՝ 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 դուք կարող եք թողնել այն այնպես, ինչպես կա, բայց եթե Ձեզ անհրաժեշտ է HTTPS, python-ը պետք է վստահի Kerio վկայականին:

Նաև ֆայլում պետք է նշեք փոստի սերվերի այս գործառույթը (Adm - հանրային փոստի թղթապանակներ) կատարելու իրավունք ունեցող հաշիվ:

Հուսով եմ, որ իմ հոդվածը օգտակար կլինի Kerio Connect-ի ադմինիստրատորներին:

Source: www.habr.com

Добавить комментарий