prepare-guest-account.sh 3,9 КБ
Newer Older
1
2
3
4
5
6
7
8
9
10
#!/bin/bash

set -e
set -u

trap 'echo exit' EXIT

# Удалить / отмонтировать home гостя, если папка существует.
_remove_home_if_exist()
{
11
    { test -d "${1}" && { umount -f "${1}" || umount -fl "${1}" || rm -rf "${1}"; } ; } || true
12
13
}

sgakerru's avatar
sgakerru включено в состав коммита
14
15
16
17
18
19
20
21
22
23
24
25
# Для считывания значений из конфига.
_parse_config_true_val()
{
    [[ "$1" == "true" || "$1" == "yes" || "$1" == "1" ]]
}

_parse_config_empty_val()
{
    [[ "$1" == "" ]]
}

# Основной код.
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
if [[ $PAM_USER == "guest"
    && $PAM_SERVICE != "systemd-user"
    && ($PAM_TYPE == "open_session" || $PAM_TYPE == "close_session") ]]
then
    HOME="$( getent passwd "$PAM_USER" | cut -d: -f6 )"

    # Если сессия завершается.
    if [[ $PAM_TYPE == "close_session" ]]
    then
        if { loginctl show-user guest ; }
        then
            loginctl kill-user --signal KILL guest
        fi
        exit
    fi

    # Если уже есть активная сессия, то ничего не делаем.
    if [[ $(loginctl show-user -p State guest) == "State=active"
            || $(loginctl show-user -p State guest) == "State=online" ]]
    then
        exit
    fi

    # Иначе state of session = closing.
    if { loginctl show-user guest ; }
    then
        loginctl kill-user --signal KILL guest
    fi

    _remove_home_if_exist "$HOME"

    # Создаем папку home.
    mkdir --parents "${HOME}"
59
60

    # Если в конфиге включена опция 'guest-home-tmpfs', то монтируем как tmpfs.
61
    declare -l guest_home_tmpfs
sgakerru's avatar
sgakerru включено в состав коммита
62
    # py-ini-config возвращает != 0 и пустую строку, если значение не найдено
63
    guest_home_tmpfs="$(py-ini-config get sddm guest-home-tmpfs -a /usr/lib/mos-auth/mos-auth.conf -a /etc/mos-auth/mos-auth.conf -e conf || true)"
sgakerru's avatar
sgakerru включено в состав коммита
64
    if { _parse_config_true_val "$guest_home_tmpfs" ; }
65
66
67
68
    then
        mount --types tmpfs --options mode=700 none "${HOME}"
    fi

sgakerru's avatar
sgakerru включено в состав коммита
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
    # Если в конфиге переопределена директория skel для гостя, то считываем это значение.
    # Иначе, считываем стандартное значение из `/etc/default/useradd`.
    # Если оно отсутствует или равно "", тогда используем `/etc/skel`.
    # Также проверяем, чтобы указанные директории существовали.
    declare -l guest_skel_directory
    guest_skel_directory="$(py-ini-config get sddm guest-skel-directory -a /usr/lib/mos-auth/mos-auth.conf -a /etc/mos-auth/mos-auth.conf -e conf || true)"

    if { _parse_config_empty_val "$guest_skel_directory" || ! test -d "$guest_skel_directory" ; }
    then
        guest_skel_directory="$(py-ini-config get /etc/default/useradd --no-section SKEL || true)"

        if { _parse_config_empty_val "$guest_skel_directory" || ! test -d "$guest_skel_directory" ; }
        then
            guest_skel_directory="/etc/skel"
        fi
    fi

sgakerru's avatar
sgakerru включено в состав коммита
86
    # Копируем содержимое папки skel в домашний профиль гостя.
sgakerru's avatar
sgakerru включено в состав коммита
87
    cp --reflink=auto --recursive --no-target-directory "${guest_skel_directory}" "${HOME}"
sgakerru's avatar
sgakerru включено в состав коммита
88

sgakerru's avatar
sgakerru включено в состав коммита
89
90
91
92
93
    # Если в конфиге включена опция 'guest-dbus-service', то ставим в автозагрузку DBus службу.
    declare -l guest_dbus_service
    guest_dbus_service="$(py-ini-config get sddm guest-dbus-service -a /usr/lib/mos-auth/mos-auth.conf -a /etc/mos-auth/mos-auth.conf -e conf || true)"
    if { _parse_config_true_val "$guest_dbus_service" || _parse_config_empty_val "$guest_dbus_service" ; }
    then
94
        mkdir --parents "${HOME}/.config/autostart"
sgakerru's avatar
sgakerru включено в состав коммита
95
        cat << EOF > "${HOME}/.config/autostart/mos-guest-dbus-service.desktop"
sgakerru's avatar
sgakerru включено в состав коммита
96
97
98
99
100
[Desktop Entry]
Name=MOS Guest DBus Service
Exec=mos-guest-dbus-service
Type=Application
EOF
sgakerru's avatar
sgakerru включено в состав коммита
101
    fi
sgakerru's avatar
sgakerru включено в состав коммита
102

103
104
    chown --recursive "$PAM_USER:" "${HOME}"
fi