Почтовая лампочка для KMail

Задача: заставить синюю лампочку на ноутбуках Asus работать с KMail. Эта лампочка, по задумке разработчиков ноутбука, должна загораться, когда есть новые непрочитанные письма. Для ее (лампочки) функционирования в Windows есть специальная утилита, которая вроде даже работает, если ваша почтовая программа - Outlook. У нас же будет Linux и почтовик KMail.

Управление лампочкой в ядре до 2.6.24 осуществлялось весьма просто. Нужен загруженный модуль ядра asus_acpi: либо модуль загрузится самостоятельно, либо придется поправить /etc/modules. А теперь зажигаем лампочку из командной строки:

echo 1 > /proc/acpi/asus/mled
Чтобы погасить лампочку, достаточно записать 0 в тот же файл.

В ядре 2.6.24 у нас сменилось название модуля ядра: теперь это asus_laptop и файл, зажигающий лампочку: теперь это /sys/devices/virtual/leds/asus:mail/brightness. Файл переехал из proc в sysfs и поменял права доступа: теперь писать в него может только root. Это порождает определенные проблемы.

Я написал небольшую программу на C, которая зажигает и гасит лампочки:

#include <stdio.h>

int main(int argc, char** argv) {
    if (argc <= 1) {
        printf("Usage: mled 0|1\n");
        return 1;
    }
    FILE* f;
    f = fopen("/proc/acpi/asus/mled", "wt");
    if (!f) {
        f = fopen("/sys/devices/virtual/leds/asus:mail/brightness", "wt");
    }
    if (!f) {
        printf("mled control file is not found or is not accessible\n");
        return 2;
    }
    fprintf(f, "%s", argv[1]);
    fclose(f);
    return 0;
}
Программа компилируется такой командой (gcc должен быть установлен :):
gcc mled.c -o /home/gelin/bin/mled
Далее делаем так, чтобы она всегда исполнялась от rootа:
sudo chown root /home/gelin/bin/mled
sudo chmod +s /home/gelin/bin/mled
Теперь у нас есть почти честный и почти безопасный способ зажигать и гасить лампочку.

Определимся с моментом прихода новых писем. Есть довольно много утилит, которые проверяют состояние удаленных или локальных почтовых ящиков, например, (x|k|gnu|.*)biff, korn. Но они все не годятся. Во-первых, они проверяют почтовые ящики с некоторой периодичностью, часто в десятки минут. Мне же хотелось получить уведомление сразу после получения писем. Во-вторых, хоть KMail и хранит локальные письма в формате mbox, он не пользуется им "в полной мере". Т.е. в "нормальном" mbox новые письма помещаются в подкаталог new, KMail же "пользуется" только подкаталогом cur, и названные "проверяльщики" не видят новых писем.

С другой стороны, сам KMail может послать уведомление о приходе новых писем. Есть такое стандартное уведомление, доступное через меню "Settings" -> "Configure Notifications..." ("Настройка" -> "Уведомления..."), см. рисунок. И в этом уведомлении можно выполнить любую команду. Проблема в том, что уведомление о приходе новой почты есть, но уведомления о том, что почта просмотрена или прочитана - нет.

Уведомления KMail

Решение подсказала статья о работе KNotify (механизма рассылки уведомлений в KDE) и DCOP (механизма передачи сообщений приложениям в KDE). Статью я перевел. Получился скрипт, который запускается из KMail с помощью стандартного уведомления, а затем, каждые 5 секунд проверяет (рекурсивно) число непрочитанных писем в папке "inbox". Для зажигания лампочек скрипт использует описанную выше программу на C.

#!/bin/sh

DCOP="/usr/bin/dcop"
FOLDER="/inbox"
KMAIL="kmail KMailIface"
MLED="/home/gelin/bin/mled"

if ! $MLED 1
then
    logger -is -p user.error -t mled4kmail mled is not found or is not accessible
    exit
fi

UNREAD=1
while [ $UNREAD -gt 0 ]
do
    sleep 5
    UNREAD=$($DCOP $($DCOP $KMAIL getFolder $FOLDER) unreadRecursiveMessages)
done

$MLED 0

P.S. Интересно, насколько актуален и работоспособен будет скрипт в KDE 4?

Denis Nelubin, Dec 2007 - Aug 2008
Creative Commons License This work is licensed under a Creative Commons Attribution-Share Alike 3.0 License.