среда, 28 декабря 2011 г.

Таймер для электрозамка

На входной двери стоит электрозамок, который открывается при отключении питания и сейчас срабатывает при нажатии кнопки. Это не удобно, поскольку вынуждает удерживать кнопку, пока дверь не откроют. Иначе, при отпускании кнопки, замок вновь закроет дверь.

Решением этой проблемы может стать устройство, которое при нажатия кнопки будет отключать электрозамок и включать его обратно по истечении заданного интервала времени. Для двери вполне достаточна задержка в 10-15 секунд.

В закромах ничего подходящего под эту задачу не нашлось, потому я решил размять мозг и вспомнить университетский курс микроэлектроники. Самым простым решением для меня было поставить микроконтроллер и управлять через него реле. Задержку выставлять при программировании, либо подстроечным резистором, подключенным ко входу АЦП. В заначке лежали два ATMega8A-PU в DIP-28 корпусе, но жаба душила ставить полноценный микроконтроллер под такую задачу.

Отказавшись от идеи использовать микроконтроллер, попробовал повторить схему, приведенную на рис. 1, выкинув из нее все лишнее и заменив микросхему на К555ЛА3.

Рис. 1
Заработало, но из-за невысокого входного сопротивления 2ИЛИ-НЕ элемента конденсатор разряжался слишком быстро. Задержка составила где-то 3-4 секунды для конденсатора 470uF. Причем увеличение емкости сопровождала задержка при заряде конденсатора и результат "плавал".

Почитывая на досуге книжку по электронике, дошел до описания операционных усилителей. Если использовать операционный усилитель в качестве компаратора, то решение задачи сводилось к сравнению напряжения на разряжающемся конденсаторе и выставленным эталоном.

На выходных съездил на Ждановичи и прикупил необходимые компоненты. За вечер набросал простенькую схемку (рис. 2) и собрал на макетной плате.
Рис. 2

Заработало с первого раза. Только пришлось немного помучиться с выбором подстроечного резистора R3, чтобы найти с линейной зависимостью. При данных номиналах C1, R5 и R3 задержку можно выставить от 2 до 27 секунд. Для тестирования подключил кнопку вместо JP1.
Рис. 3 Таймер для электрозамка

Впереди еще изготовление печатной платы, но похоже я уже нашел интересное хобби, не связанное с компьютером.

пятница, 16 декабря 2011 г.

New midnight commander releases

New midnight commander versions released yesterday:
Binaries available in my repository. Repository setting can be found here.

понедельник, 12 декабря 2011 г.

Disable SSLv2 and weak ciphers

Comprehensive guide how to disable SSLv2 and weak ciphers. As a quick reference for Apache:

<IfModule mod_ssl.c>
    SSLProtocol -ALL +SSLv3 +TLSv1
    SSLCipherSuite ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM
</IfModule>

To test new settings:
$ openssl s_client -ssl2 -connect servername:443
CONNECTED(00000003)
32386:error:1407F0E5:SSL routines:SSL2_WRITE:ssl handshake failure:s2_pkt.c:428:

$ openssl s_client  -connect servername:443 -cipher LOW:EXP

CONNECTED(00000003)
32391:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:602:

пятница, 9 декабря 2011 г.

SFTP support in midnight commander

Этот пост доступен на русском. Перевод можно найти здесь


Continue watching SFTP support development in midnight commander. This week I had conversation with author and asked him for new features wich ready for packaging. He told me that SSH agent authentication ready for testing. I quickly made debian package and test it.

First disappointment - midnight can't authenticate via ssh-agent. I try to recheck auth schemes which worked in previous build:

  • password auth - works as expected;
  • public key auth - works, but only with keys, that didn't password protected (I think it's libssh2 limitation).
Trying different ssh-agent options I finally asked author how he use it. He told me that agent support works out of the box. Later I found ssh-agent example on libssh2 developers site and try to compile it

$ gcc -o agent_auth -Wall -I/usr/include -I. -lssh2 ssh2_agent.c
ssh2_agent.c: In function ‘main’:
ssh2_agent.c:99: warning: implicit declaration of function ‘libssh2_session_handshake’
/home/andrey/tmp/ccmczn2V.o: In function `main':
ssh2_agent.c:(.text+0x1a8): undefined reference to `libssh2_session_handshake'
collect2: ld returned 1 exit status
Error message points me that example written for newer libssh2 version than debian squeeze has. I try to build current available libssh2 version (1.3.0) and rebuild example against new library.

$ gcc -o agent_auth -Wall -I$PWD/libssh2/include -I. -L$PWD/libssh2/lib -lssh2 ssh2_agent.c
After that example builds without errors, but refused to work, complaining about connection problems.

$ LD_LIBRARY_PATH=$PWD/libssh2/lib ./agent-auth localhost andrey
failed to connect!
zsh: segmentation fault  ./agent_auth localhost andrey
Running under strace shows that example try to connect to 255.255.255.0 instead of 127.0.0.1 and free resources without check if they allocated. This is the reason of segfault on exit.

munmap(0xb7813000, 4096)                = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("255.255.255.255")}, 16) = -1 ENETUNREACH (Network is unreachable)
write(2, "failed to connect!\n", 19failed to connect!
)    = 19
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
zsh: segmentation fault  strace -f ./agent_auth localhost username
I added check before resource freeing

--- ssh2_agent.c.orig   2011-12-08 23:53:41.000000000 +0300
+++ ssh2_agent.c    2011-12-09 00:02:10.000000000 +0300
@@ -231,10 +231,12 @@ int main(int argc, char *argv[])
      */

   shutdown:
-
-    libssh2_agent_disconnect(agent);

-    libssh2_agent_free(agent);
+   if (agent) {
+       libssh2_agent_disconnect(agent);
+
+       libssh2_agent_free(agent);
+   }


     if(session) {
After that I rebuild example and run it.

$ gcc -o agent_auth -Wall -I$PWD/libssh2/include -I. -L$PWD/libssh2/lib -lssh2 ssh2_agent.c
$ LD_LIBRARY_PATH=$PWD/libssh2/lib ./agent_auth localhost andrey
failed to connect!
Now better - segfault on exit dissapeared, but binary still complaining about connection error. Looking code again - hostname conversion made by inet_addr() function.

if (argc > 1) {
        hostaddr = inet_addr(argv[1]);
    } else {
        hostaddr = htonl(0x7F000001);
    }
Referring to man 3 inet_addr and see that function converts symbolic representation of ip address to it's binary form. Bingo! I do a mistake by supplying localhost as hostname. Replacing localhost with 127.0.0.1 do the thing and example works now.

$ LD_LIBRARY_PATH=$PWD/libssh2/lib ./agent_auth 127.0.0.1 andrey
Fingerprint: FA F3 92 9E C4 AE 14 B4 FC BE ED 2A E8 33 0C 1E 34 09 9F B3 
Authentication methods: publickey,password
 Authentication with username andrey and public key /home/andrey/.ssh/id_rsa failed!
 Authentication with username andrey and public key /home/andrey/.ssh/id_dsa succeeded!
all done!
Now the rest - create libssh2 (1.3.0) package for squeeze and rebuild midnight commander against new library version. Binary builds can be downloaded from there


Этот пост доступен на русском. Перевод можно найти здесь

среда, 7 декабря 2011 г.

Custom virtual host config in WHM/cPanel

Today one our customer asked to separate error logs for the different virtual hosts on the server which controlled with WHM/cPanel. Default setup stores domain logs in /usr/local/apache/domlogs/ and one common error log in /usr/local/apache/logs/error_log. This makes customer unhappy because he wants to see logs by FTP.

Direct edit of apache config prohibited because cPanel will rewrite it after any change in virtual host admin panel. I google around and find useful doc which describes how to add custom part to any level of apache config.

вторник, 6 декабря 2011 г.

Блокировка клавиатуры в linux/X11

Частенько дочка любит "поклацать" по клавиатуре домашнего компа, пока за ним сидят папа или мама. Оно то понятно - ребенок хочет принять участие в процессе.. Но часто эти "игры" попадают на моменты, когда нужно спокойно изучить парочку страничек, открытых в браузере, а отвлечь ребенка некому или некогда.

Чтобы решить эту проблему, я решил реализовать временную блокировку ввода с клавиатуры (до мышки она еще не дотягивается) по нажатию комбинации клавиш. Исходник получился несложным
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
    Display *dpy;
    XEvent ev;
    KeySym *keysym;
    int i;

    dpy = XOpenDisplay(NULL);
    if (!dpy) {
        fprintf(stderr, "Unable to open display\n");
        return 1;
    }

    for (i = 0; i<5; i++) {
        if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), False, GrabModeAsync, GrabModeAsync, CurrentTime) != 0) {
            if (i == 4) {
                fprintf(stderr, "Failed to grab keyboard after 5 attepts\n");
                XCloseDisplay(dpy);
                return 1;
            }
            usleep(500000);
        } else {
            break;
        }
    }

    while (1) {
        XNextEvent(dpy, &ev);
        switch(ev.type) {
            case KeyRelease:
                keysym = XGetKeyboardMapping(dpy, ev.xkey.keycode, 1, &i);
                if ((KeySym) *keysym == XK_Scroll_Lock) {
                    XSync(dpy, True);
                    XUngrabKeyboard(dpy, CurrentTime);
                    XCloseDisplay(dpy);
                    return 0;
                }
        }
    }
}
Полный архив с исходником можно забрать тут

P.S. в процессе использования всплыли пара багов:
  • Если не разлочить клавиатуру перед блокировкой экрана в gnome-screensaver, то обратно зайти не удастся. Скринсейвер долго думает а потом просто запускает заставку обратно.
  • При залоченной клавиатуре перестают работать многие вещи, использующие XGrabKeyboard для своих нужд (в частности перемещение окон, меню во многих тулкитах, etc)
  • И нужно добавить индикацию "залоченности" клавиатуры на экран.

понедельник, 5 декабря 2011 г.

Перезагрузка алиасов в разных почтовых системах

Все время забываю, как в exim перезагрузить список алиасов. Обычно для этого предназначен newaliases, который отсутствует в сборке cPanel.

Аналоги newaliases для:
  • exim:
    exim -bi
  • postfix:
    postalias
  • sendmail:
    sendmail -bi

Синхронизация паролей в WHM/cPanel

  После массовой смены паролей (посредством passwd %username%) на сервере под управлением WHM/cPanel перестало пускать по FTP.

  Для решения этой проблемы нужно синхронизировать пароли пользователей с их ftp аккаунтами запустив /scripts/ftpupdate