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