Во второй версии 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/icons/default/cursors}
cp icons-cursor/lib/icons/dmz-aa/cursors/top_left_arrow xmenu/lib/icons/default/cursors
echo -e "zenity\nfonts-TTF-liberation" >  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) компьютер выключится.

Пакет меню готов, добавляем его в файл 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

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

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, хуже не будет.

Комментарии (8)


  1. ZimniY
    13.10.2015 17:04

    Надписи на кнопках тоже можно поменять.


    1. shweew
      13.10.2015 17:15

      Да, вроде бы можно, типа --ok-label=Выбрать --cancel-label=Отмена, я не пробовал.


      1. ZimniY
        13.10.2015 17:17

        Если надписи перевести — то можно убрать часть шпаргалки из Label. Да и более «локализовано» выглядеть будет.


        1. shweew
          13.10.2015 18:30

          Согласен, надо попробовать.


          1. shweew
            13.10.2015 19:11

            Посмотрел мануал zenty, эти опции не сработают, они для диалогов Question и Text, завтра попробую, но вряд ли, скорее всего когда делал меню тоже пытался, для чего бы я шпаргалку писал…


            1. shweew
              14.10.2015 09:05

              --ok-label=Выбрать --cancel-label=Отмена не работает для диалога List…


  1. shweew
    14.10.2015 10:30

    На случай если вдруг пользователи подслеповаты добавил в статью способ увеличения шрифта в меню.


  1. shweew
    15.10.2015 12:26

    Для особо ленивых вот готовый пакет.