VollstÀndige Synchronisierung von freigegebenen Ordnern, Kontakten und Kalendern zwischen verteilten Kerio Connect-Servern

Guten Tag, Habr!



Eine Aufgabe



In meiner Organisation wird auf der Kerio Connect-Plattform ein Mailserver verwendet. Mailserver, die ihre Benutzer bedienen, werden in verschiedenen StĂ€dten installiert. AnfĂ€nglich gab es keine verteilte Struktur, da sich die DomĂ€nen auf der dritten Ebene unterscheiden und die Stadt des Standorts angeben. Alles hat funktioniert und alle waren glĂŒcklich. Ein schöner Tag - das Management hat eine Aufgabe festgelegt, einen gemeinsamen Kalender aller Standorte!



Hintergrund



UrsprĂŒnglich bestand die Idee darin, die verteilte Kerio-Mail-Domain zu erhöhen, und er wird alles selbst erledigen. Es wurde gesagt, dass die verteilte DomĂ€ne erstellt wurde, aber nicht vorhanden war. Der Server war bereit, Kalender, Ordner und Kontakte zu synchronisieren - zwischen DomĂ€nen, die sich auf demselben Server befinden, aber er wollte ĂŒberhaupt keine Daten zwischen mehreren Servern synchronisieren.



NatĂŒrlich hatte ich keinen solchen Trick erwartet und konnte lange Zeit nicht an das Fehlen der benötigten FunktionalitĂ€t glauben. SpĂ€ter fand ich eine dokumentarische BestĂ€tigung dieser Tatsache. Dann war ich sehr verwirrt und enttĂ€uscht.



Die Aufgabe wurde reibungslos zu einem Problem.



Was waren die Optionen



  • Erstellen Sie zwei Clients auf verschiedenen Servern, die die erforderlichen Daten mit Software von Drittanbietern austauschen. Es war notwendig, diese Software von Drittanbietern zu finden, die diese FunktionalitĂ€t implementiert - ich mag einen solchen Rechen nicht, aber es schien, dass dies die einzige schnelle Lösung war.
  • . , 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 .



Indizierungsprozess Der Indizierungsprozess

reduziert sich auf die AusfĂŒhrung der API-Funktion Kerio

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



Ein Beispiel fĂŒr die AusfĂŒhrung finden Sie in - 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 kann unverÀndert bleiben. Wenn Sie jedoch HTTPS benötigen, muss Python dem Kerio-Zertifikat vertrauen.



Außerdem mĂŒssen Sie in der Datei ein Konto mit den Rechten angeben, um diese Funktion (Admin - freigegebene E-Mail-Ordner) des Mailservers auszufĂŒhren.



Ich hoffe, mein Artikel ist nĂŒtzlich fĂŒr Kerio Connect-Administratoren.




All Articles