Cyrus IMAP 2.5.0: Um horizonte promissor para o projeto !

Olá ! É com muito prazer que escrevo sobre a restruturação do projeto Cyrus IMAP. O Cyrus é um dos servidores POP/IMAP livres mais bem conceituados e seu ambiente Aggregator, que permite a distribuição de caixas em múltiplos servidores, é um dos grandes diferenciais desta solução.

Mas de fato o projeto encontrava-se parado, a última versão (2.4.17) havia sido lançada em Dezembro de 2012 e desde então apenas versões beta da integração do Caldav com esta versão foram lançadas.

Porém, no dia 19 de Fevereiro, Bron Gondwana (um dos principais desenvolvedores do projeto) anunciou a reformulação do projeto, com a formação da Cyrus Foundation, que captou recursos (financeiros e desenvolvedores) para levar o projeto a uma nova era ! As metas principais são: lançar o Cyrus 2.5.0 em Março de 2015 e a versão 3.0 em Julho do mesmo ano. Foi notória a empolgação da comunidade com este anuncio.

E cumprindo o cronograma, Jeroen van Meeuwen anunciou a liberação da versão 2.5 no dia 03 de Março :

https://docs.cyrus.foundation/imap/release-notes/2.5-current.html

Escreverei muito sobre o Cyrus este ano ! Por enquanto, seguem algumas das melhorias da versão 2.5.0:

  • AUTOCREATE
  • Suporte Caldav e Carddav
  • Suporte estendido de quotas: Número de pastas, mensagens e annotations
  • RFC 5464: METADADOS IMAP
  • Notificações de eventos
  • Melhorias da distribuição de partições: Mais opções para distribuição entre Backends e partições
  • Novo formato para o arquivo mailboxes.db
  • Suporte a bases twoskip: Mais segura, rápida do que o formato skiplist
  • Conta “Catchall” para o protocolo LMTP

Cyrus Aggegator: IMAP com escalabilidade

Em um artigo anterior, eu apresentei o Cyrus Imap e suas principais funcionalidades:

https://respirandolinux.wordpress.com/2013/03/20/sobre-o-cyrus-imap/

Agora apresento o Cyrus Aggregator, recurso nativo para escalabilidade do Cyrus. O ambiente Aggregator (muito vezes chamado também de Murder, devido a um artigo que foi publico com o título “Cyrus Aggregator: The Imap Murder”), permitir distribuir as caixas postais IMAP e POP entre diversos servidores de forma transparente aos usuários, isto é, sendo apresentado como único ambiente.

 A solução possui três classes de servidores: Frontend, Backend e Mupdate. Os clientes IMAP/POP se conectam aos servidores Fontends que por sua vez realizam a consulta no servidor Mupdate obtendo a localização da caixa postal do cliente conectado e o servidor Mupdate informa aos Fontends que estabelecem a comunicação com o Backend trazendo a caixa postal do usuário. Os servidores Backend armazenam as caixas postais e informam ao servidor Mupdate a sua localização, permissões e mudanças, o Mupdate sincroniza com os Frontends a posição das caixa postais e controla para que não haja conflitos.

Nesta arquitetura, os servidores Frontend recebem a relação de caixas postais do ambiente do servidor Mupdate, esta classe de servidor não possui dados, portanto é redundante em todos os aspectos. Se a relação de caixas postais corromper em algum servidor Frontend, basta remover essa base e sincronizar com o Mupdate novamente. É possível adicionar novos servidores Frontend e Backend a qualquer momento, sem impacto no ambiente.

 

 

Expresso 2.5: Instalando no Debian 7

Expresso 2.5: Instalando no Debian 7

Colaboração de Elias Silva (elias.eps@dpf.gov.br)

A versão 2.5.1 do Expresso não é compatível com a versão do PHP dos repositórios do Debian 7 (Wheezy), por utilizar a versão 5.4 e até o momento o Expresso estar compatível somente com a versão 5.3

Porém, é possível efetuar a instalação através do downgrade da versão do PHP para a 5.3, utilizando os pacotes do Debian 6 (Squeeze), para isto, execute os seguintes passos:

1 – Adicione os repositórios do Debian Squeeze no /etc/apt/sources.list (sem remover as referências para os pacotes da versão 7:

# debian squeeze

deb http://ftp.debian.org/debian/ squeeze main contrib non-free

deb http://security.debian.org/ squeeze/updates main contrib non-free

Exemplo com os repositórios completos:

# debian wheezy

deb http://ftp.br.debian.org/debian/ wheezy main non-free contrib

deb http://ftp.br.debian.org/debian/ wheezy-updates main non-free contrib

deb http://security.debian.org/ wheezy/updates main non-free contrib

2 – Crie as configurações para o APT utilizar os pacotes do PHP 5.3 dos repositórios do Squeeze no arquivo /etc/apt/preferences.d/php53:

Package: libphp5*

Pin: release a=oldstable

Pin-Priority: 700

Package: phpapi*

Pin: release a=oldstable

Pin-Priority: 700

Package: libapache2-mod-php5*

Pin: release a=oldstable

Pin-Priority: 700

Package: php5*

Pin: release a=oldstable

Pin-Priority: 700

Package: libapache2-mod-php5

Pin: release a=oldstable

Pin-Priority: 700

Package: php-pear

Pin: release a=oldstable

Pin-Priority: 700

Package: php-apc

Pin: release a=oldstable

Pin-Priority: 700

Package: libgv-php5

Pin: release a=oldstable

Pin-Priority: 700

Package: *

Pin: release a=stable

Pin-Priority: 600

3 – Atualize a base e instale os pacotes abaixo:

apt-get update

apt-get install -y apache2-mpm-prefork libapache2-mod-php5 apache2-utils \

 php5 php5-common php5-dev php5-gd php5-imap php5-ldap php5-pgsql php5-cgi php5-mcrypt \

 php5-cli php5-curl php5-xmlrpc php5-memcache php5-pspell libgv-php5 zip unzip memcached

apt-get install -y tzdata-java/wheezy

apt-get install -y openjdk-6-jre-headless

apt-get install -y libmemcached5

apt-get install aspell aspell-en aspell-pt-br

4 – Efetuada a instalação do Apache e PHP 5.3, efetue o Download do instalador do Expresso e dentro do diretório INSTALL execute os comandos abaixo:

sed -e ‘s|validaSO “Debian” “6.0”|validaSO “Debian” “7.1”|g’ expressoInstall.sh > expressoInstall.sh.new

cp -r expressoInstall.sh.new expressoInstall.sh

./expressoInstall.sh

5 – Entre no diretório INSTALL debian/squeeze/etc/apache2/ e execute os comandos abaixo:

sed -e “s|Include /etc/apache2/httpd.conf|#Include /etc/apache2/httpd.conf|g” apache2.conf > /etc/apache2/apache2.conf

sed -e ‘s|LoadModule ssl_module|#LoadModule ssl_module|g’ sites-available/expresso > /etc/apache2/sites-available/expresso

Feito isso, basta reiniciar o serviço do Apache e utilizar o expresso normalmente.

Resolvendo inconsistências entre servidores Backend e Mupdate Master (Murder)

É possível que a relação de caixas postais do servidor Mupdate (Murder) perca a consistência com os servidores Backend do ambiente, como por exemplo uma caixa postal não estar mais listada no Backend e o Mupdate ainda a mantenha em sua lista. Isso pode ocorrer por falhas de comunicação (rede) entre os servidores ou erros de I/O no Mupdate. Como o servidor Mupdate é autoritativo no ambiente do Cyrus Aggregator, isto é, sua relação é considerada mandatória, não é possivel forçar novamente a criação de uma caixa no Backend que erroneamente esteja sendo listada no Mupdate.

No caso de ocorrer muitas inconsistências, o procedimento recomendado é:

  1. Parar o serviço do Cyrus no servidor Mupdate
  2. Parar o serviço do Cyrus no Backend
  3. Remover a relação de caixas posais (mailboxes.db) no servidor Mupdate
  4. Executar o comando ctl_mboxlist -m -a -w no servidor Backend como usuário Cyrus e com o serviço parado, o -w irá simular a operação, caso esteja de acordo, basta executar novamente sem esta opção.

Porém, não é viável parar o serviço caso ocorram pequenas inconsistências, para isso o utilitário cyr_dbtool do Cyrus, pode ser utilizado, ele consegue manipular o arquivo mailboxes.db, que geralmente fica no formato skiplist, sem a necessidade parar o serviço. Vejamos sua utilização:

/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist show

Informamos o caminho do arquivo (não é permitido utilizar caminhos relativos), seu formato, e por último, a operação a ser executada. Neste caso irá listar todos os registros presentes no arquivo.

Exemplo com o resultado do comando executado em um servidor Mupdate:

user.fabio            1 nome_do_backend!default fabio    lrswipkxtecda
user.fabio.Drafts    1 nome_do_backend!default fabio    lrswipkxtecda    
user.fabio.Sent     1 nome_do_backend!default fabio    lrswipkxtecda        
user.fabio.Trash    1 nome_do_backend!default fabio    lrswipkxtecda

Para remover um registro, utilizamos a operação delete:

/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio
/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio.Drafts
/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio.Sent
/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio.Trash

Desta forma, os registros serão removidos imediatamente da base, sendo possível criar as caixas novamente no servidor Backend. O comando não permite o uso de caracteres coringas.

Cyrus Imap: Eliminar mensagens “fetching user deny” no código

Olá ! Anteriormente, eu havia publicado uma dica para remover as mensagens “fetching user_deny” geradas pelo cyrus dos logs criando um filtro no Rsyslog (https://respirandolinux.wordpress.com/2013/01/16/cyrus-imap-muitas-mensagens-fetching-user_deny-no-log/), caso esteja compilando o Cyrus, segue o link com o patch para eliminar essas mensagens direto no código:

github.com/fsschmidt/cyrusimap/blob/master/Patches/user_deny_silence.patch

Obs.: Testado com a última versão até o momento, 2.4.17.

Scripts para o Cyrus Imap: Criar caixas postais e definir quota

Em um post anterior, compartilhei dois scripts, para definir permissão para o usuário admin e remover caixas postais no Cyrus Imap, agora compartilho com vocês os scripts para criar caixas postais e definir quota, também criei um script maior que além de criar a caixa postal já define a permissão e aplica a quota.

Os scripts estão disponibilizados em https://github.com/fsschmidt/cyrusimap conforme abaixo:

Criar caixa postal:

https://github.com/fsschmidt/cyrusimap/blob/master/Scripts/criar_caixas.pl

Definir quota:

https://github.com/fsschmidt/cyrusimap/blob/master/Scripts/setarquota.pl

Criar a caixa postal definindo permissão e quota:

https://github.com/fsschmidt/cyrusimap/blob/master/Scripts/criar_caixas_completo.pl

Conceitos de groupware

Olá , apresento aqui alguns conceitos sobre Groupware, termo cada vez mais empregado por soluções que antes tinham somente o correio eletrônico como foco.

Software colaborativo, ou groupware, pode ser definido como um conjunto de aplicações, síncronas e assíncronas, isto é , que ocorrem ao mesmo tempo e em tempos diferentes, respectivamente, integradas em um ambiente para promover o trabalho cooperativo de um grupo de pessoas envolvida em tarefas ou objetivos comuns. Serviços de correio eletrônico, agenda compartilhada, mensagens instantâneas, são exemplos de softwares que compõem um groupware.

Qual o próposito das soluções de groupware?

A adoção de um software colaborativo visa melhorar o fluxo de informações, com o aumento da rapidez e precisão que essas informações fluem pelo ambiente, criando interatividade entre os usuários da organização (que podem estar em pontos geográficos distintos) e permitindo que estes possam cooperar entre si.

Como obter sucesso na implantação de um groupware?

Para sucesso na implantação de uma solução de groupware é necessário que a utilização seja fácil e os recursos e informações estejam claramente acessíveis, uma vez que para o usuário a interface é o sistema. Obviamente não se pode preterir uma boa infraestrutura para implantação da solução de groupware, sendo que a aplicação e todos os seus componentes devem sempre estar disponíveis aos usuários.

Expressolivre: Anexos e mensagens exportadas com 0KB

Ao exportar múltiplas mensagens simultaneamente pelo Expresso, o arquivo .ZIP gerado é inválido, com tamanho de 0KB, seguem as possíveis soluções para este problema:

1- Instalação do pacote ZIP, o aplicativo é executado para geração do arquivo compactado.

2- Caso a partição que contenha o diretório /tmp estava sem espaço, o arquivo não poderá ser gerado, portanto é necessário limpar o conteúdo temporário.

Caso o problema apresentado seja de espaço em disco conforme relatado na segunda soluções, os seguintes warnings poderão ser observados nos logs do PHP:

PHP Warning:  filesize(): stat failed for /tmp/email_hbncqub15lc2g6j1jfuc1nl306.zip in /var/www/expresso/expressoMail1_2/inc/get_archive.php on line 27

PHP Warning:  readfile(/tmp/email_hbncqub15lc2g6j1jfuc1nl306.zip): failed to open stream: No such file or directory in /var/www/expresso/expressoMail1_2/inc/get_archive.php on line 279

Destacando que a falta de espaço de diretório temporário também gera problema com a anexação de arquivos nas mensagens, uma vez que esse procedimento também utiliza esse espaço.

 

Sobre o Cyrus IMAP

Compartilho com vocês um pequeno trecho do conteúdo de treinamento baśico de Cyrus Imap, que irei oferecer gratuitamente:

O Cyrus IMAP (http://www.cyrusimap.org) é um servidor POP/IMAP de alta performance e altamente escalável, desenvolvido pela Carnegie Mellon University (CMU), ele possibilita acessos simultâneos (leitura/escrita) a uma mesma caixa postal e quotas e regras de acesso (ACL) a qualquer caixa da hierarquia.

Nos repositórios estáveis das distribuições (Red Hat, Suse, Debian,etc…) até o momento a versão disponibilizada do Cyrus Imap é bastante antiga (2.2.13), que não é mais atualizada, recebendo somente atualizaçõs de segurança. Portanto, recomenda-se a utilização da versão atual, 2.4 , que possibilita o uso de replicação nativa e diversas melhorias para o ambiente Aggregator, além diversas melhorias no código para estabilidade, performance e segurança.

O Cyrus Imap opera somente com seu formato de armazenamento, não sendo possível utilizar os formatos Maildir, Mailbox ou qualquer outra configuração. Por padrão, o Cyrus Imap armazena as mensagens e meta-arquivos na mesma estrutura de diretório, o armazenamento de mensagens é constituído por diversos arquivos pequenos que não são acessados tão frequentemente, uma mensagem é acionada somente quando o usuário abre a mesma, os meta-arquivos são separados em arquivos por caixa postal (pasta): header, index, cache, expunge e squat, sendo os três primeiros para indexação e recuperação dos cabeçalhos das mensagens, o expunge para controle de remoção atrasada se essa opção estiver habilitada e o arquivo squat contém uma indexação específica para pesquisa de mensagens, com ganho de 20 a 30% em relação a indexação padrão para operações que envolvam pesquisa, sendo o maior dos meta-arquivos, se a mensagem não estiver referenciada neste arquivo será recuperada através da indexação normal, porém com desempenho inferior.

Sabendo que os meta-arquivos são acessados com mais frequência e ocupam um espaço relativamente pequeno, cerca de 10% para toda a estrutura de caixas postais do usuário (esse resultado foi obtido a partir de estudos com implementações reais até 1000 usuários), é uma boa estratégia configurar o Cyrus Imap para separar esses arquivos em meta-partições que utilizam discos mais rápidos para obter um melhor desempenho das operações de I/O no servidor IMAP.

A partir da versão 2.3 essa configuração é possível utilizando os parâmetros metadata no arquivo de parametrização do Cyrus Imap. Como conceito, cada partição pode ter somente uma meta-partição e a definição de quais arquivos serão separados é global, ou seja, é definido quais meta-arquivos ficarão separados em meta-partição e essa configuração é compartilhada para todas as partições.

Scripts para o Cyrus Imap: Aplicar permissão e remover caixas postais

Precisei executar um procedimento para remover cerca de 400 caixas postais no Cyrus Imap, como certamente executar essa tarefa manualmente não seria nada adequado criei um script em Perl para remover essas caixas postais em lote, porém algumas em algumas caixas postais o usuário administrador não possuía as devidas permissões, compartilho com vocês os dois scripts, para aplicar as permissões corretas e remover as caixas postais desejadas:

(Os scripts também estão disponbilizados em https://github.com/fsschmidt/cyrusimap)

Aplicar permissão:

#!/usr/bin/perl -w
#Autor: Fabio S. Schmidt <fabio_schmidt@hotmail.com>
#Revisao em: 14/03/2013
#Script para aplicar permissao em caixas postais do Cyrus Imap
use Cyrus::IMAP::Admin;
#
# PARAMETROS DE CONFIGURACAO
#
my $cyrus_server = $ARGV[2];
my $cyrus_user = “admin”;
my $matricula = $ARGV[1];
my $mechanism = “login”;
if (!$ARGV[1]) {
    die “Usage: $0 SENHA MAILBOX SERVIDOR\n”;
} else {
    $cyrus_pass = “$ARGV[0]”;
}
print “Aplicando permissao ALL para o usuario $cyrus_user na caixa : $matricula. \n”;
aplicapermissao($matricula);
sub aplicapermissao {
    my ($user, $subfolder) = @_;
    my $cyrus = Cyrus::IMAP::Admin->new($cyrus_server);
    $cyrus->authenticate($mechanism,’imap’,”,$cyrus_user,’0′,’10000′,$cyrus_pass);
    $cyrus->setaclmailbox(“user.$matricula”, ‘expresso-admin’, ‘all’);
    if ($cyrus->error) {
        print STDERR “Error: “, $matricula,” “, $cyrus->error, “\n”;
    } else {
        print “Permissao concedida para o usuario $matricula.\n”;
    }
}
Remover caixa postal:
#!/usr/bin/perl -w
#Autor: Fabio S. Schmidt <fabio_schmidt@hotmail.com>
#Script para remover caixas postais do Cyrus Imap
use Cyrus::IMAP::Admin;
#
# PARAMETROS DE CONFIGURACAO
#
my $cyrus_server = $ARGV[2];
my $cyrus_user = “admin”;
my $matricula = $ARGV[1];
my $mechanism = “login”;
if (!$ARGV[1]) {
    die “Usage: $0 SENHA MAILBOX SERVIDOR\n”;
} else {
    $cyrus_pass = “$ARGV[0]”;
}
print “Removendo usuario : $matricula. \n”;
removeusuario($matricula);
sub removeusuario {
    my ($user, $subfolder) = @_;
    my $cyrus = Cyrus::IMAP::Admin->new($cyrus_server);
    $cyrus->authenticate($mechanism,’imap’,”,$cyrus_user,’0′,’10000′,$cyrus_pass);
    $cyrus->deletemailbox(“user.$matricula”);
    if ($cyrus->error) {
        print STDERR “Error: “, $matricula,” “, $cyrus->error, “\n”;
    } else {
        print “Usuario $matricula foi removido com sucesso.\n”;
    }
}
Para executar os comandos em lote, basta criar um laço FOR conforme o exemplo abaixo:
#!/bin/bash
# EXCLUIR CAIXAS POSTAIS DO CYRUS IMAP
echo “Excluindo caixas postais do CYRUS IMAP…”
for i in `cat remover_caixas.txt`
do perl remover_caixas.pl SENHA $i SERVIDOR
done