Pull to refresh

Меню выбора сессии Thinstation

Reading time4 min
Views12K
Во второй версии Thinstation присутствовало меню выбора сессии при загрузке — Replimenu. Хоть оно было страшненькое и порой вгоняло в ступор неподготовленного пользователя, привыкшего к полноценному графическому режиму, но работало. В пятой версии оно «сломалось», а разработчики никакой замены не прикрутили, на вопрос «Куда делось меню» ответили:
If you said that replimenu was a menu system to act as a low resource substitute for a window manager, then no, machines that low in resources, that they can not have both a window manager and an application in memory have not been manufactured for over 10 years and are no longer on the support radar.
что в вольном переводе означает — таких компов, чтоб совсем мало памяти, лет 10 как не производят, юзайте оконный менеджер со значками на рабочем столе.
Меня такой подход к решению проблемы не устроил и потому я решил сделать своё меню для выбора сессии, благо функционал Thinstation это позволяет.

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

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

Создаём папки и файлы пакета, я его назвал 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] или Esc на клаве, то выключить комп:
1|5|-1)
poweroff;;
esac
exit 0

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

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

В 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

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

image

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

Если пользователям плохо видно пункты меню, то можно увеличить размер шрифта в файле 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>
Получим вот ТАКОЕ меню:

image

Если настроена загрузка конфига по сети и в меню названия серверов должны быть написаны по русски (кириллицей), то в файле 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, хуже не будет.
Tags:
Hubs:
Total votes 7: ↑7 and ↓0+7
Comments9

Articles