PHP · 08.08.2025

Выключатель без логона

Продолжаю всматриваться в базу данных шлюза Apache Guacamole (здесь тег).

Репозиторий проекта притаился где-то здесь.

В предыдущем посте на тему Apache Guacamole я рассказывал про взаимодействие API шлюза и PowerShell с использованием модуля PSGuacamole. Там же шла речь о создании консольного отчёта с общим количеством пользователей шлюза и получении данных из Active Directory.

Сегодня покажу свой генератор отчётов о статусах пользователей Apache Guacamole. Кроме данных о количестве пользователей и их статусе, прикрутил к проекту простую выключалку. Штука удобная, когда необходимо в срочном порядке выключить учётную запись пользователя.

Написано это всё на php (метка) c капелькой javascript. Версия php на сервере 7.4.3.

В итоговом варианте всё это выглядит вот так:

Страничка умеет фильтровать представления по статусу пользователей, в подвале таблицы можно увидеть количество пользователей текущего представления. Также скрипт позволяет скачать csv-отчёт для дальнейшей работы с данными.

Перейдём к коду. Основным (но не главным) скриптом является скрипт logins.php. Именно он отвечает за всю ту красоту, что Вы видели на изображении выше. Название скрипта наследовано от старого проекта. Немного нелогично, но отказываться от наименования не стал в целях соблюдения преемственности между проектами.

Вы с легкостью можете переименовать этот скрипт без ущерба работоспособности проекта.

Теперь самый главный скрипт проекта — db_connect.php:

<?php
// Переменные
$servername = "localhost"; // Адрес сервера
$username = "guacamole_user"; // Пользователь базы данных
$password = "verystrongpassword"; // Пароль пользователя
$dbname = "guacamole_db"; // Имя базы данных

// Создаем соединение
$con = mysqli_connect($servername, $username, $password, $dbname);

// Проверяем соединение
if (!$con) {
    die("Connection failed: " . mysqli_connect_error());
}

// Запрос для всех пользователей
function fetchUsers($con)
{
    $query = "SELECT * FROM guacamole_user WHERE full_name <> '' AND full_name <> 'Фамилия Имя Отчество' ORDER BY full_name ASC";
    $result = mysqli_query($con, $query);
    if (!$result) {
        die("Query failed: " . mysqli_error($con));
    }
    return $result;
}

// Функция для выключенных пользователей
function fetchDisabledUsers($con)
{
    $query = "SELECT * FROM guacamole_user WHERE disabled = 1 AND full_name <> '' AND full_name <> 'Фамилия Имя Отчество' ORDER BY full_name ASC;";
    $result = mysqli_query($con, $query);
    if (!$result) {
        die("Query failed: " . mysqli_error($con));
    }
    return $result;
}

// Функция для включенных пользователей
function fetchEnabledUsers($con)
{
    $query = "SELECT * FROM guacamole_user WHERE disabled = 0 AND full_name <> '' AND full_name <> 'Фамилия Имя Отчество' ORDER BY full_name ASC;";
    $result = mysqli_query($con, $query);
    if (!$result) {
        die("Query failed: " . mysqli_error($con));
    }
    return $result;
}
?>

Именно с помощью этого скрипта производится подключение к серверу базы данных шлюза Apache Guacamole. В db_connect.php необходимо внести изменения в блок переменных:

$servername = "localhost"; // Адрес сервера
$username = "guacamole_user"; // Пользователь базы данных
$password = "verystrongpassword"; // Пароль пользователя
$dbname = "guacamole_db"; // Имя базы данных

Если соединение прошло корректно — запускайте скрипт logins.php. На моём сервере этот скрипт расположен на отдельном порту, скрытым от любопытных глаз. URL выглядит примерно так:

http://192.168.1.100:10020/scripts/logins.php

Но всё же давайте вернёмся к скрипту подключения к базе данных. В нём припрятана пара любопытных хитростей, которые я применяю в работе с Apache Guacamole. Обратите внимание, что во время запроса к базе я исключаю из выборки тех, у кого нет полного имени (столбец full_name) и чьё полное имя выглядит как (буквальная) строка Фамилия Имя Отчество.

Фокус с пустыми данными в столбце full_name нужен, чтобы исключить из выборки системные учётные записи администраторов. Для них указывать данные о фамилии, имени и отчестве нет никакого смысла.

А строка Фамилия Имя Отчество — это запись шаблонного пользователя, которого я держу, как пример для клонирования учётных записей в системе.

Таким образом, я исключаю из выборки все системные учетки и шаблон пользователя. Конечно, высока вероятность, что у Вас совсем другой подход к администрированию шлюза. В таком случае отредактируйте запрос по своему усмотрению.

Два других скрипта отвечают за смену статуса учётной записи пользователя (toggle_user_status.php) и формирование файла csv с текущей выборкой (download_csv.php).

Ну, а чтобы не тратить время на написание логинки — вооружимся ufw (тык) и создадим таблицу маршрутизации для порта, на котором крутится виртуальный хост со скриптами для Apache Guacamole.