Задача: заставить синюю лампочку на ноутбуках 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..." ("Настройка" -> "Уведомления..."), см. рисунок. И в этом уведомлении можно выполнить любую команду. Проблема в том, что уведомление о приходе новой почты есть, но уведомления о том, что почта просмотрена или прочитана - нет.
Решение подсказала статья о работе 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