GUI для FreeRDP

Искусство написания bash скриптов. Делимся своими наработками
Ответить
Аватара пользователя
ZEN
Администратор
Сообщения: 1349
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

GUI для FreeRDP

Сообщение ZEN » 26 май 2015, 15:47

Прочитав следующую заметку в блоге XELFAER, появилось желание написать скрипт, который будет предоставлять разный GUI к FreeRDP в зависимости от того был ли он запущен в терминале или нет.

Кроме того, скрипт делает следующее:
  • В зависимости от типа запуска проверяет установлены ли зависимости для работы скрипта/
  • В случае ошибки, в зависимости от типа запуска, пишет текст с сообщением в терминал или использует notify-send
  • Логирует сообщения об ошибках в /tmp/FreeRDP.log
  • Проверяет не отменил ли юзер ввод нажав на кнопку "Отмена"
Пример интерфейса через whiptail в случае, если скрипт запущен в терминале:
Изображение

Пример интерфейса через zenity в случае, если скрипт запущен через Alt+F2 или *.desktop файл:
Изображение

Скрипт можно скачать командой
wget -q http://dumpz.org/1402141/nixtext/ -O ~/FreeRDP.sh

Ниже код скрипта:

Код: Выделить всё

#!/usr/bin/env bash

# Initial vars
APP_ICON="dialog-information";
APP_NAME="FreeRDP GUI";
DOMAIN_NAME="Test";
CONNECTION_ADDRESS="127.0.0.1";
LOG_FILE="/tmp/FreeRDP.log"
HAS_STDOUT=0;

# Check script dependencies
function require () {
    local NF;
    while (($#)); do
        test -z $(which $1 2> /dev/null) && NF+=("$1");
        shift;
    done

    # Return the elements of array what have been not found
    test ${#NF[@]} -ne 0 && {
        echo ${NF[@]} && return 1;
    }

    return 0;
}

# Show message
function error_message () {
    local MESSAGE="$@";

    echo "[$(LC_ALL=C date)] $MESSAGE" >> $LOG_FILE;

    (( $HAS_STDOUT > 0 )) && {
        echo -e "$MESSAGE" 1>&2;
    } || {
        notify-send -t 10000 -i $APP_ICON "$APP_NAME" "$MESSAGE" &> /dev/null
    }
}

# Get login and password
function get_user_input () {
    local USER_INPUT;
    (( $HAS_STDOUT > 0)) && {
        USER_INPUT=$(whiptail --backtitle "Авторизация на сервере" --inputbox "Логин:" 10 40 3>&1 1>&2 2>&3) || return 1;
        USER_INPUT="$USER_INPUT|$(whiptail --backtitle "Авторизация на сервере" --inputbox "Пароль:" 10 40 3>&1 1>&2 2>&3)" || return 1;
    } || {
        USER_INPUT=$(
            zenity  --forms \
                    --title="$APP_NAME" \
                    --text="Авторизация на сервере:" \
                    --add-entry="Логин:" \
                    --add-password="Пароль:" \
        ) || return 1;
    }
    echo $USER_INPUT;
}

# Check script dependencies
REQUIRED_APPS=();
test -t 1 && {
    HAS_STDOUT=1;
    REQUIRED_APPS+=(whiptail xfreerdp);
} || {
    REQUIRED_APPS+=(zenity xfreerdp notify-send);
}

NOT_FOUND=( $(require ${REQUIRED_APPS[@]}) ) || {
    error_message "Нерешенные зависимости: $(printf '%s ' ${NOT_FOUND[@]})";
    exit 1;
}

USER_INPUT=$(get_user_input) || {
    # The 'Cancel' button was pressed
    exit 0;
}

USER_LOGIN="${USER_INPUT%%|*}";
USER_PASSD="${USER_INPUT#*|}";

MSG=$(xfreerdp -f -d "$DOMAIN_NAME" -u "$USER_LOGIN" -p "$USER_PASSD" "$CONNECTION_ADDRESS" 2>&1) || {
    error_message $MSG;
    exit 2;
}

exit 0;
P.S. Сам по себе скрипт - игрушка для проверки test -t, но может быть кто-то найдет для себя что-то полезное.
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость