Замена REPLIMENU

  • Печать

Последняя редакция статьи от 14.10.2015 г.

Во второй версии Thinstation присутствовало меню выбора сессии при загрузке - Replimenu. В пятой версии оно "сломалось", а разработчики никакой замены не прикрутили, решили что достаточно Openbox-а со значками на рабочем столе. Меня такой подход к решению проблемы не устроил и потому я решил сделать своё меню для выбора сессии.

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

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

( HTML ломает некоторые знаки. Для точного копирования команд справа от листинга есть кнопка <>)

Создаём папки и файлы пакета, я его назвал xmenu:

cd /Ваша/папка/thinstation/ts/build/packages
mkdir -p xmenu/{etc/{init.d,rc5.d},bin,lib/{fonts/X11/TTF,icons/default/cursors}}
cp icons-cursor/lib/icons/dmz-aa/cursors/top_left_arrow xmenu/lib/icons/default/cursors
cp fonts-TTF-liberation/lib/fonts/X11/TTF/LiberationMono-Regular.ttf xmenu/lib/fonts/X11/TTF
echo -e "base\nzenity\npango\nfontconfig" > xmenu/dependencies
echo ",dependencies,0,0,,0,,,,,,,,," > xmenu/.dna
echo > xmenu/bin/xmenu
echo > xmenu/etc/init.d/xmenu
chmod 766 xmenu/bin/xmenu
chmod 766 xmenu/etc/init.d/xmenu
cd xmenu/etc/rc5.d
ln -s ../init.d/xmenu xmenu

Копируем в xmenu/etc/init.d/xmenu следующий скрипт:

#! /bin/sh
. $TS_GLOBAL
case "$1" in
init)
 if ! pkg_initialized $PACKAGE; then
 pkg_set_init_flag $PACKAGE
 fi
 ;;
console)
 exec /bin/xmenu
 ;;
help)
 echo "Usage: $0 {init|console}"
 ;;
 *)
 exit 1
 ;;
esac
exit 0

В xmenu/bin/xmenu копируем:
#!/bin/sh
. $TS_GLOBAL
#Получаем IP клиента
IPSHOW=$(ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}')
#Опции курсора и фонового цвета
xsetroot -cursor_name top_left_arrow -solid rgb:4B/69/83
#Menu zenity:
ip=`zenity --list --timeout=30 --height=250 --print-column=1,2 --hide-column=1,2 \
--text="ХОСТ: $(hostname) ||| IP: $IPSHOW""\n"'<span foreground="blue">\
\nДля выключения компьютера нажмите [Cancel]\n\
Для подключения выберите сервер и нажмите [OK]\n\
</span>' --column "type" --column "server" --column "Выберите сервер:" \
"$MENU_1_TYPE" "$MENU_1_SERVER" "$MENU_1_TITLE" \
"$MENU_2_TYPE" "$MENU_2_SERVER" "$MENU_2_TITLE" \
"$MENU_3_TYPE" "$MENU_3_SERVER" "$MENU_3_TITLE"`
retval=$?
#Действия в при выборе или отмене:
case $retval in
0)
#Получаем IP сервера:
ipserver=$(echo $ip | awk -F'|' '{ print $2 }')
#проверка условия если rdesktop и задан юзер, то:
if echo $ip | grep rdesktop && echo $ip | grep -u ; then
 rdesktop $RDESKTOP_OPTIONS $ipserver
#проверка условия если rdesktop без юзера, то:
elif echo $ip | grep rdesktop; then
 rdesktop -u '' $RDESKTOP_OPTIONS $ipserver
#проверка условия если freerdp, то:
elif echo $ip | grep freerdp; then
 xfreerdp $FREERDP_OPTIONS /v:$ipserver
#Есле сервер не выбран и нажата кнопка ОК, то выдаётся сообщение:
else zenity --warning --text="Вы не выбрали сервер.\n \
Попробуйте еще раз..."
xmenu
fi;;
#Если нажата кнопка [Cancel], то выключить комп:
1|5|-1)
poweroff;;
esac
exit 0

Этот скрипт подходит для запуска freerdp и rdesktop сессий, через 30 секунд бездействия (параметр --timeout=30) компьютер выключится.

Пакет для создания меню готов, добавляем его в файл build.conf строчкой package xmenu и собираем образ.

В thinstation.conf.xxx нужно ЗАМЕНИТЬ переменные сессий на:

# Автоматический запуск меню, не изменять
SESSION_0_TYPE=xmenu
SESSION_0_AUTOSTART=On
# Опции подключений, замените на свои:
RDESKTOP_OPTIONS="-x 0x90 -N -a 16 -f -k ru -x l"
FREERDP_OPTIONS="+fonts -sec-tls -sec-nla"
# Ниже название сетвера, тип подключения и IP сервера
MENU_1_TITLE="Сервер1"
MENU_1_TYPE=rdesktop
MENU_1_SERVER=192.168.111.100
MENU_2_TITLE="Сервер2"
MENU_2_TYPE=freerdp
MENU_2_SERVER=192.168.111.100
MENU_3_TITLE="Сервер3"
MENU_3_TYPE=freerdp
MENU_3_SERVER=192.168.111.100

После загрузки образа увидим вот такое славное меню:

По моему намного приятнее чем replimenu, всё по русски и пользователям с мышкой удобнее управляться. При нажатии кнопки "Cancel" тонкий клиент выключится.

Если кому-то плохо видно, можно увеличить размер шрифта в файле packages/fontconfig/etc/fonts/conf.avail/51-local.conf, приведя его к такому виду и меняя параметр pixelsize:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
 <!-- Load local system customization file -->
 <match target="font">
 <edit name="pixelsize" mode="assign"><int>22</int></edit>
 </match>
 <include ignore_missing="yes">local.conf</include>
</fontconfig>
Получим вот ТАКОЕ меню:

Если настроена загрузка конфига по сети и в меню названия серверов должны быть написаны по русски, то в файле packages/netfiles/etc/init.d/network_files, в начале 34 строчки

catv /tmp/"$CONFNET"network |sed -e 's/\^M//g' >> $TS_NETWORK 2> /dev/null
заменить catv на cat, иначе в меню получите крякозябры.
В принципе можно во всём файле заменить catv на cat, хуже не будет.

Обсудить на форуме (комментариев 13).