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 , .
:
, 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.