Pull to refresh

Учим xrdp подключаться к прошлым сессиям

Reading time 3 min
Views 28K
XRDP хорошая штука, но есть один недостаток — если ты уже открыл к сессию, а потом разъединился (без выхода из сессии), то впоследствии не факт, что ты к ней сможешь соединиться. Маялся с этим приличное время пока неудобство достигло критической точки и я решил таки взяться и глянуть в исходники, чтобы выяснить как же это поправить.

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

Ну что ж, начнем. Суть способа заключается в комментировании в файле sessman/session.c пяти следующих строк:
    if (g_strncmp(name, tmp->item->name, 255) == 0 
        //&&
        //tmp->item->width == width &&
        //tmp->item->height == height &&
        //tmp->item->bpp == bpp &&
        //tmp->item->type == type
            )

Поясню. Здесь сканируются существующие сеансы и делается проверка, от какого пользователя и какого разрешения, цветовой глубины, типа (VNC, XRDP) планируется открыть сессию. Если находится сеанс с такими же параметрами, то подключаемся к той же сессии. Если нет, открываем новую. Условия: разрешение, глубина цвета, тип сеанса, я решил отключить.


Теперь опишу как я это реализую на примере скажем Scientific Linux дистрибутива (так же подойдет под Fedora, Red Hat, CentOS). Так же учитываем, что xrdp нет в стандартных репозиториях Scientific Linux, придется подключать дополнительные (об этом я не буду здесь писать, тема гуглится на раз).
Устанавливаем нужные инструменты:
# yum groupinstall "Development tools"
# yum install yum-utils rpmdevtools tar

Скачиваем сырцы проекта, и устанавливаем их в рабочую директорию сборщика rpm:
$ yumdownloader --source xrdp
$ rpm -ivh xrdp-0.5.0-0.13.el6.src.rpm

Имя файла будет не обязательно xrdp-0.5.0-0.13.el6.src.rpm, зависит от того, что у вас скачалось первой коммандой. Здесь файл скачанный для Scientific Linux.

В рабочей папке сборщика rpm появятся файлы, в т.ч. ~/rpmbuild/SOURCES/xrdp-HEAD-*.tar.gz. Этот файл на нужно будет распаковать, т.е.:
$ cd ~/rpmbuild/SOURCES
$ tar -xzf xrdp-HEAD-a9cfc23.tar.gz


Установим все необходимое для сборки:
# yum-builddep ~/rpmbuild/SPECS/xrdp.spec


Теперь ищем указанный нами вначале файл и открываем его каким нибудь текстовым редактором, например nano:
$ nano ~/rpmbuild/SOURCES/xrdp-HEAD-a9cfc23/sesman/session.c

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

Запаковываем это дело обратно:
$ cd ~/rpmbuild/SOURCES
$ tar -czf xrdp-HEAD-a9cfc23.tar.gz xrdp-HEAD-a9cfc23


Осталось дело за малым — собрать модифицированный rpm:
$ rpmbuild -ba ~/rpmbuild/SPECS/xrdp.spec

Если все прошло нормально, то в ~/rpmbuild/RPMS/x86_64/ получаем два файлика rpm:
$ ls -l
итого 664
-rw-rw-r--. 1 rafaelrs rafaelrs 243152 Авг  5 07:41 xrdp-0.5.0-0.13.el6.x86_64.rpm
-rw-rw-r--. 1 rafaelrs rafaelrs 430620 Авг  5 07:41 xrdp-debuginfo-0.5.0-0.13.el6.x86_64.rpm

Устанавливаем первый пакет, запускаем сервис и радуемся жизни :)
yum install ~/rpmbuild/RPMS/x86_64/xrdp-0.5.0-0.13.el6.x86_64.rpm
service xrdp start


Кстати да, не забываем, что если вдруг пакет обновится, то изменения, внесенные нами, пропадут. Можно повторить операцию, можно включить xrdp в список исключений, можно вообще переименовать приложение. Тут дело вкуса, я остановился на первом, благо xrdp не так уж и часто обновляется.
Tags:
Hubs:
+10
Comments 4
Comments Comments 4

Articles