Enfim, a treta é a seguinte: usuários tem um .procmailrc em seus homedirs e por consequência os homedirs estão montados via NFS no servidor de e-mail. NFS dá zica e não venha me falar que pra você funciona bem porque você não vai mudar minha opnião, já cansei de ver a porra do lockd pirar e ter que rebootar a máquina. Logo no servidor novo não tem NFS montado, porém os usuários necessitam colocar suas regras de filtragem no servidor. Como estou usando dovecot, a escolha óbvia é usar a linguagem Sieve para filtragem. Mas como o usuário vai colocar os scripts dele no servidor?
Eis que vem para o salvamento um cara chamado ManageSieve, um protocolo criado pra que um servidor receba os scripts Sieve e os armazene. Dei uma pesquisada e achei o daemon pysieved para receber os scripts e existem vários clientes, uma extensão para o Thunderbird e um plugin para o SquirrelMail. Maravilha! Instala o pysieved, instala o plugin avelsieve no SquirrelMail. Cria uma regrinha de filtragem, salva, testa. Ó, funcionou! Agora apaga a regra e... não apaga.
Bom, sobe o pysieved com o debug no máximo. Manda apagar a regra e isso é mostrado no terminal:
= Authenticated user miguel
=== S: 'OK\r\n'
=== C: 'CAPABILITY\r\n'
=== S: '"IMPLEMENTATION" "pysieved 1.0"\r\n'
...
=== C: 'DELETESCRIPT "phpscript"\r\n'
=== S: 'NO "Script is active"\r\n'
Hmmm, manda o comando DELETESCRIPT e ao invés de voltar OK o servidor volta um sonoro NO. E fala que o script está ativo. Imagino que seria necessário desativar o cara e depois apagar. Mas como faz isso? Que tal ler a RFC do protocolo, nada mal para um dia ensolarado, não?
A RFC está aqui: http://ietfreport.isoc.org/idref/draft-martin-managesieve/.
E não é que eu achei! Saca só:
2.8. SETACTIVE Command
This command sets a script active. If the script name is the empty string (i.e. "") then any active script is disabled.
Ahá, olhando o debug do pysieved eu não vi nenhum SETACTIVE "". Então o pau certamente está no avelsieve.
Zapeando pelo código usando egrep DELETESCRIPT * -r achei rapidinho o médoto da classe que manda o comando DELETESCRIPT, e obviamente ele não estava mandando um SETACTIVE "" antes. Beleza então, mando eu:
$this->sieve_setactivescript(""); //minha linha
$this->lastcmd = "DELETESCRIPT \"$scriptname\"\r\n";
fputs($this->fp, $this->lastcmd);
Tchanã! Tudo funcionando. Eu falei que não é para o fracos, não falei?


