ZNC боунсер на RPi



Так получилось, что в последнее время одним из каналов общения для меня стали IRC чаты. Практически сразу стало понятно, что «голый» IRC лишен некоторых удобств, к которым я так привык в скайпе, например:
  • История сообщений, доступная непосредственно из окна чата
  • Возможность подключаться из нескольких точек


Для решения этих проблем через некоторое время у нас в компании появилась виртуалка с IRC боунсером, и все стало гораздо лучше и удобнее. Понятно, что для компании держать виртуалку под такие цели совершенно не проблема, но как быть, если захочется завести такого зверька для личных нужд (а мне в какой-то момент захотелось)? Отбросив варианты с хостингом (не стоит это лишних денег), отдельным компом (ибо нет), и виртуалкой на существующем (100 Вт потребляемые круглосуточно тоже денег стоят) я остановился на RaspberryPi, которая на тот момент выполняла роль как-бы NAS, но по факту большую часть времени бездействовала.

Краткое описание того, на чем все собрано и о чем будет упомяунуто в статье:
  • Платформа — RaspberryPi Model B (512 Mb / Ethernet).
  • ОС — Raspbian.
  • Особенности установки ОС — корневой раздел полностью перенесен на USB 2.0 жесткий диск, на SD карте оставлен только загрузочный раздел. Об этом, к сожалению, ни слова, но могу написать, если будет интересно.
  • Боунсер — ZNC, версия 1.2.
  • Особенности установки боунсера — сборка из тарбола, установка в chroot, сборка модуля modpython (modperl, modtcl по желанию).


В качестве боунсера я выбрал ZNC по следующим причинам:
  • Достаточно распространенный боунсер.
  • Возможность расширения функциональности за счет модулей.
  • Достаточно много этих самых модулей.
  • Возможность писать свои модули на python (а также perl и tcl, хотя это мне было не нужно).
  • После чтения вики проекта еще одним пунктом добавилась возможность простого переноса боунсера в chroot.


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

Первым неприятным сюрпризом стало наличие весьма древней сборки ZNC в репозиториях — кажется это была 0.206. Впрочем, это лишь укрепило мое намерение собрать ZNC из тарболла, тем более что процес хорошо описан на вики проекта.

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

Сначала надо установить необходимые пакеты для сборки:
pi@raspberrypi ~ $ sudo apt-get install build-essential pkg-config libssl-dev


Если нужно собрать модуль поддержки python, perl или tcl, потребуется установить соответствующие пакеты из списка:
  • modpython — пакет python-dev.
  • modperl — пакет libperl-dev.
  • modtcl — пакет tcl-dev.


Мне нужен только модуль для питона:
pi@raspberrypi ~ $ sudo apt-get install python-dev


Скачиваем и распаковываем тарболл:
pi@raspberrypi ~ $ wget http://znc.in/releases/znc-1.2.tar.gz
pi@raspberrypi ~ $ tar xzvf znc-1.2.tar.gz


Создаем пользователя для запуска боунсера:
pi@raspberrypi ~ $ sudo adduser bouncer
pi@raspberrypi ~ $ sudo passwd bouncer


Создаем структуру каталогов для chroot (я буду ставить все в /opt/znc):
pi@raspberrypi ~ $ sudo mkdir /opt/znc

pi@raspberrypi ~ $ cd /opt/znc/
pi@raspberrypi /opt/znc $ sudo mkdir -p etc dev usr/lib usr/local/{share,bin,lib} lib home/bouncer
pi@raspberrypi /opt/znc $ sudo mkdir -p lib/arm-linux-gnueabihf usr/lib/arm-linux-gnueabihf

pi@raspberrypi /opt/znc $ sudo chown bouncer:bouncer home/bouncer/

pi@raspberrypi /opt/znc $ cd dev/
pi@raspberrypi /opt/znc/dev $ sudo mknod -m 644 random c 1 8
pi@raspberrypi /opt/znc/dev $ sudo mknod -m 644 urandom c 1 9
pi@raspberrypi /opt/znc/dev $ sudo mknod -m 666 null c 1 3

pi@raspberrypi /opt/znc $ sudo cp /etc/hosts etc/
pi@raspberrypi /opt/znc $ sudo cp /etc/resolv.conf etc/
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libnss_dns.so.2 lib/arm-linux-gnueabihf/
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libresolv.so.2 lib/arm-linux-gnueabihf/

pi@raspberrypi /opt/znc/dev $ cd


Конфигурируем исходники для сборки. Для сборки модулей для perl или tcl нужно добавить --enable-perl и/или --enable-tcl соответственно:
pi@raspberrypi ~ $ cd znc-1.2/
pi@raspberrypi ~/znc-1.2 $ ./configure --enable-python


Запускаем сборку (процесс занимает примерно 1.5-2 часа):
pi@raspberrypi ~/znc-1.2 $ make


Устанавливаем в chroot каталог. При таком способе установки (DESTDIR=/opt/znc) все файлы сразу оказываются в указанном подкаталоге, и не затрагивают основную систему. Кроме того, мы избавляемся от необходимости копировать файлы в chroot, как предлагается в официальном документе:
pi@raspberrypi ~/znc-1.2 $ sudo DESTDIR=/opt/znc make install


Теперь нужно посмотреть, какие библиотеки необходимы для работы приложения…
pi@raspberrypi ~/znc-1.2 $ ldd /opt/znc/usr/local/bin/znc


… и скопировать их:
pi@raspberrypi ~/znc-1.2 $ cd /opt/znc/
pi@raspberrypi /opt/znc $ sudo cp /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so ./usr/lib/arm-linux-gnueabihf/libcofi_rpi.so
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libdl.so.2 ./lib/arm-linux-gnueabihf/libdl.so.2
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libz.so.1 ./lib/arm-linux-gnueabihf/libz.so.1
pi@raspberrypi /opt/znc $ sudo cp /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 ./usr/lib/arm-linux-gnueabihf/libstdc++.so.6
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libm.so.6 ./lib/arm-linux-gnueabihf/libm.so.6
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libgcc_s.so.1 ./lib/arm-linux-gnueabihf/libgcc_s.so.1
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libpthread.so.0 ./lib/arm-linux-gnueabihf/libpthread.so.0
pi@raspberrypi /opt/znc $ sudo cp /lib/arm-linux-gnueabihf/libc.so.6 ./lib/arm-linux-gnueabihf/libc.so.6
pi@raspberrypi /opt/znc $ sudo cp /lib/ld-linux-armhf.so.3 ./lib/ld-linux-armhf.so.3


Осталось только создать несколько симлинков на каталоги znc, чтобы боунсер можно было запускать не только из chroot, но и «как обычно». Это потребуется нам при первом запуске (чтобы создать конфигурационный файл), а также в будущем, если нужно будет запускать компиляцию модулей для ZNC.

Создаем симлинки:
pi@raspberrypi ~ $ sudo ln -sv /opt/znc/usr/local/lib/znc /usr/local/lib/
pi@raspberrypi ~ $ sudo ln -sv /opt/znc/usr/local/share/znc /usr/local/share/
pi@raspberrypi ~ $ sudo ln -sv /opt/znc/usr/local/include/znc /usr/local/include/


Прежде чем запускать боунсер, необходимо создать для него начальный конфиг и скопировать полученный конфиг в chroot каталог. Для этого становимся пользователем bouncer, переходим в домашний каталог и запускаем znc c ключом --makeconf:
pi@raspberrypi ~ $ su bouncer
bouncer@raspberrypi /home/pi $ cd
bouncer@raspberrypi ~ $ /opt/znc/usr/local/bin/znc --makeconf


Сам процесс настройки достаточно прост благодаря весьма информативным подсказкам. По завершении настройки мы должны получить запущенный работоспособный боунсер. Продолжить настройку можно открыв веб-интерфейс боунсера (если был активирован модуль webadmin), или через IRC клиента.

Последнее, что осталось сделать — это переместить полученный конфиг в chroot и запустить боунсер уже оттуда. Кстати, не стоит редактировать конфиг файл боусера руками. Для этого рекомендуется использовать webadmin.

Сначала останавливаем боунсер. Первая команда сохранит текущую конфигурацию в конфиг файл, а вторая остановит боунсер:
bouncer@raspberrypi ~ $ pkill -SIGUSR1 znc
bouncer@raspberrypi ~ $ pkill znc


Копируем каталог с настройками в chroot:
bouncer@raspberrypi ~ $ cp -r .znc /opt/znc/home/bouncer


И запускаем уже из chroot каталога командой:
pi@raspberrypi ~ $ sudo start-stop-daemon --chroot /opt/znc/ --chuid bouncer:bouncer --start --exec /usr/local/bin/znc


Остановить боунсер можно командой:
pi@raspberrypi ~ $ sudo start-stop-daemon --chroot /opt/znc/ --chuid bouncer:bouncer --stop --exec /usr/local/bin/znc


Ну вот вроде бы и все. Для автоматического запуска боунера при старте системы можно добавить команду запуска в /etc/rc.local.

Как обычно, вопросы и комментарии приветствуются.

Ссылка на сайт проекта: ZNC

Комментарии 14

    +5
    Почему пакет не собрали?
      –2
      Потому что я изначально планировал устанавливать znc в chroot. Кроме того:
      — Метод установки аналогичен тому, который применяется при сборке пакетов. Так что все компоненты боунсера все равно находятся в одном каталоге (/opt/znc) который при необходимости легко удалить.
      — Симлинки, которые останутся в системе, тоже легко найти и удалить.
      — Даже если бы я собрал пакет, все равно после его установки в «основную» систему придется выполнить все шаги, необходимые для переноса в chroot. Т.е. получаем в некотором роде лишние действия.
      — И я не очень представляю, как сделать пакет, который будет ставить компоненты сразу в chroot, при условии что путь до каталога нельзя хардкодить.

      Я согласен, что невозможность обнаружить установленный компонент через dpkg -l является неудобством. Но учитывая все выщеперечисленное я склонен считать полученное решение скорее компромиссом.
      +1
      Мне нравится клиент irssi с плагином proxy. Простейшая настройка позволяет раскинуть по разным портам разные сети. При этом всегда можно подключиться к irssi по ssh и использовать его как обычный консольный клиент. Все логи ведутся тут же. Единственный минус в сравнении с полноценным BNC — при подключении не будут показаны непрочитанные сообщения отправленные в приватах.
        0
        Этот минус перекрывает все плюсы.
        +2
        кстати да, +1 за irssi c proxy

        более того, с помощью Bitlbee любую переписку из IRC можно сливать во внешний IM (jabber, MSN, Yahoo, AIM, ICQ, Twitter)
        я об этом небольшую статью написал
          0
          Никогда не понимал смысла сборки на самой платформе. Рассматривалась ли возможность кросс-компиляции на x86 машине?
            0
            Кросс-компиляцию не рассматривал по очень простой причине: когда начинал собирать — не думал что оно столько времени займет. Когда же все собралось — переделывать не пришлось, поэтому оставил как есть. Для разовой сборки оно вполне нормально, как мне кажется, особенно учитывая то, что кросс-компиляцией я никогда ничего не собирал.

            Но вообще я думаю посмотреть в эту сторону, спасибо за идею.
            0
            Спасибо за статью, сам как раз хотел сделать нечто подобное. Пара вопросов:

            • Почему бы просто не сделать apt-get install znc? Зачем нужен chroot?
            • Как именно вы подключаетесь «из нескольких точек»? У вас статический IP?
              0
              В официальном репозитории достаточно старый пакет:
              pi@raspberrypi ~ $ sudo apt-cache policy znc
              znc:
                Installed: (none)
                Candidate: 0.206-2
                Version table:
                   0.206-2 0
                      500 http://mirrordirector.raspbian.org/raspbian/ wheezy/main armhf Packages
              


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

              Да, у меня статический IP. Подключаюсь откуда придется — чаще это ноутбук/компьютер, реже смартфон/планшет.
                0
                А, в stable действительно устаревшая версия. А вот из тестинга можно добыть свежую 1.2.
                Спасибо.
                  0
                  О, и правда. А там-то я и не смотрел…
                    0
                    Спасибо, буду знать.
                0
                Иногда даже такой небольшой компьютер как RPi бывает проблемно держать online 24//7 и вот если вы один из таких могу порекомендовать lowendbox.com там собирают предложения по lowend VPS/VDS. Я себе нашел за 1$ в месяц 30г диска 512 памяти, вроде самое то для таких проектов :) Даже с бесплатным хостингом для RPi цена самого RPi 50-60$ будет окупаться 5 лет.
                  0
                  а еще можно найти бесплатный shell для таких вещей

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое