Boa tarde, Habr!
Uma tarefa
Na minha organização, um servidor de email Ă© usado na plataforma Kerio Connect; os servidores de email que atendem aos usuários sĂŁo instalados em cidades diferentes. Inicialmente, nĂŁo havia estrutura distribuĂda, pois os domĂnios diferem no terceiro nĂvel, indicando a cidade do site. Tudo funcionou e todo mundo estava feliz. Um belo dia - a gerĂŞncia definiu uma tarefa, um calendário comum entre todos os sites!
fundo
Inicialmente, a idĂ©ia era aumentar o domĂnio de correio do Distributed Kerio e ele fará tudo sozinho. Dizia-se que o domĂnio distribuĂdo foi criado, mas nĂŁo estava lá, o servidor estava pronto para sincronizar calendários, pastas, contatos - entre domĂnios localizados no mesmo servidor, mas nĂŁo sincronizava dados entre vários servidores.
Obviamente, eu não esperava esse truque e, por muito tempo, não acreditei na ausência da funcionalidade necessária. Mais tarde, encontrei confirmação documental desse fato. Do que fiquei muito intrigado e decepcionado.
A tarefa se transformou sem problemas em um problema.
Quais foram as opções
- Crie dois clientes em servidores diferentes, que trocaram os dados necessários com algum software de terceiros. Era necessário encontrar um software de terceiros que implementasse essa funcionalidade - eu não gosto de um rake, mas parecia que essa era a única solução rápida.
- . , 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 .
Processo de indexação O processo de indexação é reduzido à execução da função de API Kerio
Session = callMethod ("Domains.checkPublicFoldersIntegrity", {}, token)
Um exemplo de execução é fornecido em - 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 pode ser deixado como está, no entanto, se você precisar de HTTPS, o python deve confiar no certificado Kerio.
Também no arquivo, você deve especificar uma conta com os direitos para executar esta função (pastas de correio compartilhadas pelo administrador) do servidor de correio.
Espero que meu artigo seja Ăştil para administradores do Kerio Connect.