Synchronisation complÚte des dossiers, contacts et calendriers partagés entre les serveurs Kerio Connect distribués

Bonjour, Habr!



Une tĂąche



Dans mon organisation, un serveur de messagerie est utilisé sur la plate-forme Kerio Connect; les serveurs de messagerie servant leurs utilisateurs sont installés dans différentes villes. Au départ, il n'y avait pas de structure distribuée, puisque les domaines diffÚrent au troisiÚme niveau, indiquant la ville du site. Tout fonctionnait et tout le monde était content. Un beau jour - la direction a fixé une tùche, un calendrier commun des affaires entre tous les sites!



Contexte



Initialement, l'idĂ©e Ă©tait d'Ă©lever le domaine de messagerie Kerio distribuĂ© et il fera tout lui-mĂȘme. Il a Ă©tĂ© dit, le domaine distribuĂ© a Ă©tĂ© crĂ©Ă©, mais il n'Ă©tait pas lĂ , le serveur Ă©tait prĂȘt Ă  synchroniser les calendriers, les dossiers, les contacts - entre les domaines situĂ©s sur le mĂȘme serveur, mais il n'allait pas du tout synchroniser les donnĂ©es entre plusieurs serveurs.



Bien sûr, je ne m'attendais pas à une telle astuce et pendant longtemps, je ne pouvais pas croire en l'absence de la fonctionnalité dont j'avais besoin. Plus tard, j'ai trouvé une confirmation documentaire de ce fait. Que j'ai été trÚs perplexe et déçu.



La tùche s'est doucement transformée en problÚme.



Quelles Ă©taient les options



  • CrĂ©ez deux clients sur des serveurs diffĂ©rents, qui ont Ă©changĂ© les donnĂ©es nĂ©cessaires avec des logiciels tiers. Il Ă©tait nĂ©cessaire de trouver ce logiciel trĂšs tiers qui implĂ©menterait cette fonctionnalitĂ© - je n'aime pas un tel rĂąteau, mais il semblait que c'Ă©tait la seule solution rapide.
  • . , Kerio , , - , , - .


, Kerio , , — .



, “ ”, 6 :



  • – .
  • — .


, – DFS







  • , OS Windows. ( Linux. OS)
  • , — .
  • DFS .
  • Kerio, , , Kerio . ( )
  • DFS.
  • - ( )




( )



1. Kerio Distributed domain





Master , .



, Kerio , ,



:







, Master :







—



— .



! , ( — )



— , .

— ( ) .



2. Kerio



, . , , .



– , , , - , .



.



~DataMail\mail\#public\ \#msgs

~DataMail\mail\**Domain**\#public\ \#msgs



, , #msgs — , .



3. DFS



DFS, , .



DFS — Windows Server, ,

MS DFS



DFS – .







.





( — ) .



.



4.





(DFS), — - - , - .



, , . 6 – 12 .



, - , DFS, - , #msgs , .



Kerio , , 6 .

, index.fld, Kerio . , , , , , Kerio - index.fld

— - - .



, - — , , , .



?



.





, —



. , - #msgs, , . .



, , (15 ) 3-4 .



, , .



Kerio 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


( , )



\Setup\%Computername%.List



%Computername% — ( .)



%Computername%.List – , , .



, , .



.



, , , : index.fld, indexlog.fld, search.fld — .



LOG .





Processus d' indexation Le processus d' indexation est réduit à l'exécution de la fonction API Kerio

Session = callMethod ("Domains.checkPublicFoldersIntegrity", {}, token)



Un exemple d'exécution est donné dans - 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 peut ĂȘtre laissĂ© tel quel, cependant si vous avez besoin de HTTPS - python doit faire confiance au certificat Kerio.



Dans le fichier, vous devez également spécifier un compte avec les droits pour exécuter cette fonction (Admin - dossiers de messagerie partagés) du serveur de messagerie.



J'espĂšre que mon article sera utile aux administrateurs de Kerio Connect.




All Articles