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
Anúncios

Cyrus Imap: Muitas mensagens fetching user_deny no log

Ao instalar o Cyrus Imap 2.4 (essa dica se aplica a todas versões do Cyrus), observei que a mensagem fetching user_deny  estava sendo repetida muitas vezes a cada conexão, conforme o exemplo abaixo:

cyrus/imap[19325]: fetching user_deny.db entry for ‘usuario’

Para criar uma exceção no ryslog para que a mensagem não seja mais exibida basta criar o aquivo /etc/rsyslog.d/cyrus-imapd.conf conforme abaixo:

if $programname == ‘cyrus’ and $msg contains_i ‘fetching user_deny’ then ~

Feito isso, basta reiniciar o serviço do rsyslog que a mensagem não será mais exibida.

Cyrus aggregator: Servidor Backend retornar mensagem de férias / fora do escritório

Essa dica é para quem possui o Cyrus Aggregator ou pretende implementá-lo,  para que o serviço Sieve no servidor Backend consiga enviar a mensagem de férias (ou fora do escritório), é necessário ter um MTA configurado localmente. Abaixo segue uma configuração básica caso opte por utilizar o Postfix para atender esta demanda, o SMTP configurado no Backkend somente irá efetyar Relay para o servidor SMTP desejado:

O arquivo abaixo também está publicado em: https://github.com/fsschmidt/cyrusimap/blob/master/Aggregator/backend-main.cf

# Arquivo de configuração para servidores Backend com Cyrus Aggregator
# Efetua o relay para o servidor SMTP desejado
# Debian specific: Specifying a file name will cause the first
smtpd_banner = $myhostname ESMTP
biff = no
append_dot_mydomain = no
readme_directory = no
myhostname = NOME_DA_MAQUINA
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = NOME_DA_MAQUINA
#ENDERECO DO SERVIDOR SMTP PARA ENCAMINHAR A MENSAGEM
relayhost = SMTP_PARA_EFETUAR_RELAY
#CONTROLE DE ACESSO, INCLUIR SOMENTE LOCALHOST E IP DO PROPRIO SERVIDOR
mynetworks = 127.0.0.0/8 IP_REDE_SERVIDOR_BACKEND/32
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

Cyrus Aggregator: Serviço Sieve não conecta no Backend

Olá, essa dica pode ser útil para quem utiliza o Cyrus Aggregator e atualizou a versão, no caso onde tivemos o problema atualizamos da versão 2.4.12 para 2.4.14.

Verificamos que após a atualização, o serviço Sieve do Frontend não conseguia conectar ao servidor Backend, toda a configuração estava correta e o serviço estava rodando em ambos os servidores, mas o seguinte erro era apresentado nos logs do Frontend:

Jul 29 15:15:44 meufrontend cyrus/master[30298]: about to exec /usr/lib/cyrus/bin/timsieved
Jul 29 15:15:44 meufrontend cyrus/sieve[30298]: executed
Jul 29 15:15:54 meufrontend cyrus/sieve[30298]: accepted connection
Jul 29 15:15:54 meufrontend cyrus/sieve[30298]: connect(meubackend) failed: Connection refused
Jul 29 15:15:54 meufrontend cyrus/sieve[30298]: couldn’t authenticate to backend server
Jul 29 15:15:54 meufrontend cyrus/sieve[30298]: Lost connection to client — exiting
Jul 29 15:15:54 meufrontend cyrus/master[30260]: process 30298 exited, status 0

Como se sabe a porta do serviço Sieve foi definida para 4190/tcp recentemente (anteriormente utilizava a porta 2000/tcp), porém,  estávamos utilizando a porta antiga e ao atualizar para a versão 2.4.14 mesmo se o Sieve no Frontend estiver escutando nessa porta ele irá efetuar a conexão porta 4190 do Backend.

Portanto, é imprescindível atualizar a configuração do ambiente definindo o Sieve para escutar na sua porta oficial.

Separando os meta-arquivos do Cyrus Imap

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

Vejamos o exemplo abaixo com as configurações no arquivo /etc/imapd.conf :

metapartition_files: header index cache expunge squat

metapartition-default: /var/spool/cyrus

metapartition-splitmeta: /var/spool/splitmeta/metadata

partition-default: /var/spool/cyrus/

partition-splitmeta: /var/spool/splitmeta/partition

Vemos que com o parâmetro metapartion_files estamos definindo que todos os 5 meta-arquivos devem ser armazenados na meta-partição, neste cenário já temos uma partição em funcionamento, a partição default que é a padrão do Cyrus Imap e precisamos separar os meta-arquivos das caixas postais já existentes.

Como a configuração de separação de meta-arquivos é global, precisamos informar que os meta-arquivos da partição default estão localizados no mesmo diretório da estrutura de mensagens, como pode ser visto nos parametros partition-default e metapartition-default, já para a nova partição, nomeada splitmeta os meta-arquivos serão armazenados em outro diretório, definido com a diretiva metapartition-splitmeta, onde “slipmeta” deve ser substituído com o nome de cada partição do servidor IMAP.

Após efetuar as modificações execute o comando abaixo para criar a estrutura necessária para a nova partição e meta-partição:

su -s /bin/bash – cyrus -c ‘/usr/lib/cyrus/bin/mkimap /etc/imapd.conf

Será necessário efetuar o reload do serviço do Cyrus Imap para utilizar as novas configurações:

/etc/init.d/cyrus-imapd restart

Para movimentar os usuários para a nova partição é necessário utilizar o comando rename na shell do Cyrus (cyradm) conforme abaixo, durante a movimentação para a nova partição os meta-arquivos serão separados na meta-partição:

cyradm> renamemailbox user/fabio user/fabio splitmeta

Com este comando estamos movimentando o usuário fabio com toda sua estrutura de caixas postais para a nova partição splimeta.

Filtros sieve, erros: Unsupported feature(s) in “require”

Olá, essa dica é para quem está obtendo erros como : Unsupported feature(s) in “require” ao aplicar scripts sieve no Cyrus Imapd. Algumas extensões não são habilitados por padrão, por exemplo a função BODY, como no erro abaixo:

line 1: Unsupported feature(s) in "require": "body".

Para habilitar as funções desejadas, edite a diretiva sieve_extensions no arquivo de configuração /etc/imapd.conf, conforme a documentação oficial:

sieve_extensions: fileinto reject vacation imapflags notify envelope
relational regex subaddress copy

Space-separated list of Sieve extensions allowed to be used in sieve scripts, enforced at 
submission by timsieved(8). Any previously installed script will be unaffected by this option 
and will continue to execute regardless of the extensions used. This option has no effect on 
options that are disabled at compile time (e.g., "regex").

Allowed values: fileinto, reject, vacation, imapflags, notify, include, envelope, body, 
relational, regex, subaddress, copy

Lembrando que é preciso consultar o manual do arquivo imapd.conf para verificar quais extensões são suportadas pela versão utilizada.

Patch para Cyrus Imap 2.4.x: “Message contains bare newlines”

Olá, nesse post https://respirandolinux.wordpress.com/2012/01/21/cyrus-imap-message-contains-bare-newlines-erro-ao-importar-mensagens/ fiz um parecer sobre o problema ao importar mensagens no Cyrus, que resultava na mensagem “Message contains bare newlines” e publiquei um patch para quem deseja que o Cyrus Imap desconsidere essa RFC para a versão 2.3.7.

Abaixo segue o patch para aplicar na versão 2.4.x do Cyrus, trabalhei e testei na versão 2.4.13, última release até o momento:

O patch abaixo também está publicado em: https://github.com/fsschmidt/cyrusimap/blob/master/Patches/cyrus24-barenewlines.patch

— imap/message.c    2012-01-30 18:18:04.381330805 +0000
+++ imap/message.c.nobarenewline    2012-01-30 18:17:34.929449683 +0000
@@ -197,8 +197,8 @@ int allow_null;
r = IMAP_MESSAGE_CONTAINSNULL;
}
else if (*p == ‘\n’) {
–        if (!sawcr && (inheader || !allow_null))
–            r = IMAP_MESSAGE_CONTAINSNL;
+        /* Do *NOT* check for RFC compliant line breaks (bare newlines) */
+        /* if (!sawcr && (inheader || !allow_null)) r = IMAP_MESSAGE_CONTAINSNL; */
sawcr = 0;
if (blankline) {
inheader = 0;

Para aplicar o Patch, copie o conteúdo para um arquivo no diretório raiz dos fontes do Cyrus e aplique : patch -p0 < nome_do_arquivo.