Как стать автором
Обновить

ZNC боунсер на RPi

Время на прочтение5 мин
Количество просмотров12K


Так получилось, что в последнее время одним из каналов общения для меня стали 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
Теги:
Хабы:
+12
Комментарии14

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн