COKPOWEHEU

View on GitHub

Настройка сервера

Сервер оригинальной Каракатицы работает под ALT Linux, но мне для теста привычнее было поднять на Debian. Заранее предупреждаю, что вся эта конфигурация - “лишь бы работало”, полноценно протестировать возможности пока нет. Хотя бы потому что нет “белого” IP-адреса, по которому можно было бы расположить сервер.

Чтобы безбоязненно проводить эксперименты, воспользуемся qemu, создадим там виртуальную машину и установим базовую систему (debian-netinst). Туда же устанавливаем все необходимые программы вроде ssh, git, screen, компилятора и т.д. и настраиваем права доступа - включаем нужных пользователей в нужные группы, пишем правила udev.

Подключение пользователей можно сделать просто по ssh. Хоть через ключи, хоть по паролю.

Для трансляции изображения с камеры, направленной на Каракатицу, можно взять ustreamer из репозитория. Просто прописываем в автозагрузку (возможно, с параметрами: ustreamer -i 0 -r 800x600 -f 15 - захват с камеры 0, разрешение 800x600, фпс 15 кадров в секунду). При старте он поднимает локальный http-сервер по умолчанию на порту 8080.

Теперь нужно каким-то образом пробросить в виртуалку камеру и Каракатицу. Получить их адреса можно обычным lsusb. У меня Каракатица скрывается под 16c0:05df, а камера - под 13d3:56a8. В первую очередь важно убедиться, что у пользователя, от которого будем запускать виртуалку на хосте вообще есть права на них. При необходимости можно подправить udev:

#/etc/udev/rules.d/95.Karakatitsa.rules

SUBSYSTEM=="usb", ATTRS{idVendor}=="13d3", ATTRS{idProduct}=="56a8", GROUP="user", MODE="0660"
SUBSYSTEM=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05df", GROUP="user", MODE="0660"
# udevadm control --reload-rules && udevadm trigger

Теперь виртуальную машину можно запустить например с такими ключами:

qemu-system-x86_64 -m 2G -hda qemu_image.img -name "Lin_ssh_user@127.0.0.1:45022" \
-display none \
-net nic -nic user,model=virtio-net-pci,mac="52:54:00:f8:86:7e",ipv4=on,hostfwd=:127.0.0.1:45022-:22 \
-usb -device usb-host,vendorid=0x16c0,productid=0x05df \
-usb -device usb-host,vendorid=0x16c0,productid=0x05df \
-device usb-ehci,id=usb \
 --device usb-host,vendorid=0x13d3,productid=0x56a8 \

Шаманство с портом 45022 говорит, что к машине можно будет получить доступ локально по ssh: ssh -p 45022 user@127.0.0.1 -L8008:localhost:8080

Обратите внимание, что в моем случае к серверу подключены две Каракатицы, поэтому и в настройках строчка -usb -device usb-host,vendorid=0x16c0,productid=0x05df продублирована.

На время настройки можно оставить -nographic для консольного доступа или -display gtk,gl=on для графического, но при повседневном использовании дисплей серверу не нужен.

Для доступа пользователей к COM-портам и “клавиатуре” они должны входить в группы dialout и uucp. Также нужно прописать правило для udev:

#/etc/udev/rules.d/70-Karakatitsa.rules 

SUBSYSTEM=="tty", ATTRS{manufacturer}=="COKPOWEHEU" ENV{CONNECTED_vusb}="yes"
#ENV{CONNECTED_vusb}=="yes", SUBSYSTEM=="tty", ATTRS{interface}=="?*", PROGRAM="/bin/bash -c \"ls /dev | grep tty_$attr{interface}_ | wc -l \"", SYMLINK+="tty_$attr{interface}_%c"
ENV{CONNECTED_vusb}=="yes", SUBSYSTEM=="tty", ATTRS{interface}=="?*", SYMLINK+="tty_$attr{interface}_0"
# USB
SUBSYSTEM=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05df", GROUP="uucp", MODE="0660"

Благодаря нему у Каракатицы появятся человеко-читаемые симлинки в системе. В отличие от номеров портов, их можно хоть в makefile прописать и быть уверенным, что прошьется то, что нужно:

$ ls -l  /dev | grep tty_
lrwxrwxrwx 1 root root           7 мар 29 02:13 tty_CH32_DBG_0 -> ttyACM0
lrwxrwxrwx 1 root root           7 мар 29 02:13 tty_CH32_PROG_0 -> ttyACM1
lrwxrwxrwx 1 root root           7 мар 29 02:13 tty_GD32_DBG_0 -> ttyACM2
lrwxrwxrwx 1 root root           7 мар 29 02:13 tty_GD32_LOG_0 -> ttyACM4
lrwxrwxrwx 1 root root           7 мар 29 02:13 tty_GD32_PROG_0 -> ttyACM3

Настройка удаленного подключения

Допустим, логин пользователя на виртуальной машине user, трансляция с камеры идет на 8080 порт, а для самого стенда обеспечен “белый” IP-адрес 120.340.560.780:100500.

Добавляем ssh-ключи на стенд. Подобная операция будет проводиться и каждый раз, когда надо добавить нового пользователя. Допустим, он прислал ключ ключ.pub, сгенерированный по примеру отсюда или отсюда:

cd ~user # Переход в домашний каталог пользователя, который будет работать со стендом
mkdir -p .ssh
cat ключ.pub >> .ssh/authorized_keys # Добавляем ПУБЛИЧНЫЙ ключ к списку доступных

И отключаем удаленный доступ по паролю (вот это для каждого пользователя повторять не надо). В файле /etc/ssh/sshd_config раскомментируем строчку PasswordAuthentication и меняем ее значение на no:

#/etc/ssh/sshd_config
...
#   PasswordAuthentication yes
PasswordAuthentication no

Но пока что удаленный пользователь может запустить su и повысить себе привилегии. Чтобы это исправить, создаем группу wheel ( addgroup wheel ) и прописываем запрет всем, кто в нее не входит (а свежесозданный пользователь не входит, хотя в этом можно и отдельно удостовериться), пользоваться этой утилитой. Для этого в файле /etc/pam.d/su находим и раскомментируем строку auth required pam_wheel.so

Теперь по желанию запуск всех необходимых программ прописывается в автозагрузку.

CC BY 4.0