Ноутбук общего пользования с ограничением времени сеанса

в 8:39, , рубрики: linux, Ubuntu, Убунтариум, метки: ,

Приветствуюе,

недавно вот попросили настроить ноутбук в одном из маленьких кафе так, чтоб им смогли бесплатно пользоваться посетители, причем с ограничением времени и не беспокоясь за свои данные.

Итак, исходная ситуация и требуемая функциональность:

  • Ноутбук Acer i3, 4GB RAM, WIFI/USB, 640GB HDD(1 Recovery Partition + 1 System/Data), Win 7 Home Premium;
  • необходимое время сессии ограничено 30 минутами;
  • перерыв между сессиями(минимальный между логинами) в 2 минуты;
  • данные сеанса не сохраняются, более того — должны быть удалены с ноутбука по окончании сессии;
  • возможность работы определенного пользователя(работник кафе) без ограничения времени;
  • возможность использования при необходимости предустановленной Windows 7.

После интенсивного поиска в интернет на тему программ для интернет-кафе я решил, что из пушки по воробьям все-таки палить не стоит, и выбрал следующие средства для решения поставленной задачи:

  • Линукс как вторая, и основная операционная система(Ubuntu 12.04 LTS, т.к. будет еще пару лет поддерживаться обновлениями);
  • гостевая учетная запись, которая в 12.04 присутствует и после окончания сессии удаляет все данные пользователя;
  • двойная скрытая загрузка, с опциональной загрузкой windows.


Теперь по порядку.

Установка системы

В windows через „Система-Управление-Управление дисками“ уменьшил основной раздел (с меткой „Acer“) на 200 ГБ, получилось свободная неформатированная область диска(200ГБ), туда и поставим убунту.

Инсталляция Ubuntu проводится стандартно, загрузка с cd/dvd.
При установке можно выбрать вариант «рядом с существующей операционной системой», я выбрал ручное разбиение на разделы:

  • (расширенный) корневой раздел root (использовать как „/“) 20 GB ext4 (/dev/sda5);
  • домашний раздел (использовать как „/home“) 176 GB ext4 (/dev/sda6);
  • раздел файла подкачки (использовать как swap) 4 GB (/dev/sda7), хотя в принципе не нужен, т.к. глубокий сон с сохранением на диск не предвидится, а для инет-серфинга он не понадобится.

Систему устанавливаем с именем пользователя administrator („admin“ уже зарезервирован в убунту).

После первой перезагрузки подключаем сеть/WIFI (если еще не подключились) и инсталлируем все обновления плюс парочку необходимых дополнений для нормальной работы:

sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install flashplugin-downloader
sudo apt-get install gimp

Если планируется использование java (например, онлайн-банкинг и т.п.), ставим ее тоже:

sudo apt-get install openjdk-7-jre icedtea-7-plugin

В этом ноутбуке первый раздел (/dev/sda1) – это раздел восстановления Windows, поэтому из загрузочного меню GRUB его желательно убрать от греха подальше.
Я сделал так:

из /boot/grub/grub.conf скопировал нужную секцию в /etc/grub.d/40_custom:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry "Windows 7 (loader) (on /dev/sda2)" --class windows --class os {
insmod part_msdos
insmod ntfs
set root='(hd0,msdos2)'
search --no-floppy --fs-uuid --set=root 70E253CBE25393E6
chainloader +1
}

в конец файла /etc/default/grub дописываем

GRUB_DISABLE_OS_PROBER="true"

и запускаем в терминале обновление меню GRUB

sudo update-grub

Tеперь при перезагрузке в меню видим только пункты относящиеся к линуксу и последним пунктом загрузку установленной Windows.

Если необходимо спрятать загрузочное меню, придется обойти один баг, присутствующий в ubuntu 12.04, а именно то что просто изменением параметров в /etc/default/grub

GRUB_HIDDEN_TIMEOUT="5"
GRUB_HIDDEN_TIMEOUT_QUIET="false"

спрятать меню при загрузке не удастся.
Это лечится добавлением в конец файла /etc/grub.d/00_header фрагмента

### BEGIN Hidden Menu Test ###
cat << EOF
if [ ${timeout} != -1 ]; then
if sleep --verbose --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then
set timeout=0
fi
fi
EOF
### END Hidden Menu Test ###

В конечном итоге файл /ets/default/grub имеет у меня следующий вид:

GRUB_DEFAULT="0"
GRUB_HIDDEN_TIMEOUT="5"
GRUB_HIDDEN_TIMEOUT_QUIET="false"
GRUB_TIMEOUT="5"
GRUB_DISTRIBUTOR="`lsb_release -i -s 2> /dev/null || echo Debian`"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL="console"

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
GRUB_GFXMODE="640x480"

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID="true"

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

GRUB_DISABLE_OS_PROBER="true"

и конечно, не забудьте обновить grub перед перезагрузкой:

sudo update-grub

Теперь если после исчезновения экрана биос в течение 5 секунд нажать ESC, появится меню GRUB, иначе будет тихо загружен первый пункт меню по умолчанию (Ubuntu).

Конфигурируем гостевую сессию

  • Создаем нового пользователа user (это будет сначала наш образец для гостя, потом логин для работника кафе);
  • Меняем обои;
  • Выставляем нужные ярлыки на рабочий стол/конфигурируем по вкусу панель Unity;
  • Меняем настройки LibreOffice, Gimp и т.д.

Выходим из системы и логинимся снова как administrator.
Создаем папку /etc/guest-session/skel:

sudo mkdir -p /etc/guest-session/skel

и копируем туда домашний каталог нашего user:

sudo cp -a /home/rus/* /etc/guest-session/skel/
sudo cp -a /home/rus/.* /etc/guest-session/skel/

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

Ограничение гостевой сессии по времени

Логинимся в систему как administrator.
Добавляем в файл /usr/sbin/guest-account в конец функции remove_account() (выполняется, когда гость выходит из системы) строки:

remove_account ()
{
…
…
  
  rm -f /tmp/*.guest
  touch /tmp/$(date -d "today" +"%Y%m%d%H%M").guest
}

Создаем файл /etc/guest-session/skel/.guest.sh со следующим содержимым:

#!/bin/sh

if [ -f /tmp/*.guest ]
then
    TIMEOUT=2
    TIMESTAMP=`date -d "today" +"%Y%m%d%H%M"`

    for FNAME in /tmp/*.guest 
    do
	OLDTIME="$(basename $FNAME .guest)"
    done

    if [ $(($TIMESTAMP-$OLDTIME)) -lt $TIMEOUT ]
    then
	sleep 10
	notify-send -u critical "Новая сессия еще не может быть запущена!" "Подождите некоторое время (сейчас будет выполнен выход из системы)."
	sleep 10
	gnome-session-quit --logout --no-prompt
    fi
fi

sleep 10
notify-send -u critical "Новая сессия запущена"  "У Вас 30 минут времени.nnПользуйтесь!"
sleep 600
notify-send -u critical "Осталось 20 минут..."
sleep 600
notify-send -u critical "Осталось 10 минут..."
sleep 300
notify-send -u critical "Через 5 минут будет выполнен автоматических выход из системы!nВсе данные Вашего сеанса будут удалены."
sleep 300
notify-send -u critical "До свидания" "Сеанс завершится через 10 секунд.nВсе данные Вашего сеанса будут удалены."
sleep 10
gnome-session-quit --logout --no-prompt

и делаем его исполняемым:

sudo chmod a+x /etc/guest-session/skel/.guest.sh

Остается только добавить в конец файла /etc/guest-session/skel/.profile строчку


$HOME/.guest.sh &

и собственно на этом все.

Результат

В результате я получил ноутбук, который без предупреждения и показа меню загружается в убунту, с тремя пользователями: administrator, user и „гость“, и с ограничением времени „гостевого“ сеанса в 30 минут с принудительной паузой в 2 минуты. Паузу можно сбросить, перезагрузив ноутбук. Если такое нежелательно, то стоит сохранять файл .guest не в /tmp, а, скажем, в /var/log (см. /usr/sbin/guest-account).
Через определенные промежутки времени пользователю выдаются сообщения об оставшемся времени сеанса.
Во время сеанса возможна смена пользователя (например на user, и обратно на гость без необходимости полного выхода user'a из системы).

Недостатки

Скрипт .guest.sh хотя и не виден в домашней папке (по крайней мере сразу), но виден в списке процессов, и этот процесс спокойно убивается гостем (если он знает как), что в принципе снимает ограничение на время сеанса.

Конструктивная критика и предложения по улучшению данного решения приветствуется!

Автор: hrum

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js