Sincronización completa de carpetas compartidas, contactos, calendarios entre servidores distribuidos Kerio Connect

Buenas tardes, Habr!



Una tarea



En mi organización, se utiliza un servidor de correo en la plataforma Kerio Connect; los servidores de correo que sirven a sus usuarios están instalados en diferentes ciudades. Inicialmente, no había una estructura distribuida, ya que los dominios difieren en el tercer nivel, lo que indica la ciudad del sitio. Todo funcionó y todos estaban felices. Un buen día: ¡la gerencia estableció una tarea, un calendario común de asuntos entre todos los sitios!



Antecedentes



Inicialmente, la idea era aumentar el dominio de correo distribuido de Kerio y él hará todo por sí mismo. Se dijo que se creó el dominio distribuido, pero no estaba allí, el servidor estaba listo para sincronizar calendarios, carpetas, contactos, entre dominios ubicados en el mismo servidor, pero no iba a sincronizar los datos entre varios servidores.



Por supuesto, no esperaba un truco así y durante mucho tiempo no pude creer la ausencia de la funcionalidad que necesitaba. Más tarde encontré confirmación documental de este hecho. Que estaba muy perplejo y decepcionado.



La tarea se convirtió sin problemas en un problema.



Cuales fueron las opciones



  • Cree dos clientes en diferentes servidores, que intercambiaron los datos necesarios con algún software de terceros. Era necesario encontrar este software de terceros que implementara esta funcionalidad. No me gusta ese rastrillo, pero parecía que esta era la única solución rápida.
  • . , 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 .





Proceso de indexación El proceso de indexación se reduce a ejecutar la función API Kerio

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



Se da un ejemplo de ejecución en - 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 se puede dejar como está, sin embargo, si necesita HTTPS, Python debe confiar en el certificado de Kerio.



También en el archivo debe especificar una cuenta con los derechos para realizar esta función (Administrador - carpetas de correo compartidas) del servidor de correo.



Espero que mi artículo sea útil para los administradores de Kerio Connect.




All Articles