Глава 10. Дополнительные разделы

Сокеты команд

Это расширение позволяет получить удалённый доступ к kdm. Эта возможность в первую очередь предназначена для использования ksmserver и kdesktop из запущенной сессии, но также может быть использована и другими приложениями.

Сокеты -- обычные UNIX® сокеты, которые находяться в подкаталогах каталога определённого опцией FifoDir=.... Все сокеты названы socket, и права доступа к подкаталогам, в которых они находятся: rw-rw-rw-(0666). Это сделано потому, что некоторые операционные системы игнорируют права доступа к файлам сокетов.

Существует два типа сокетов: один глобальный (dmctl), и по одному на каждый дисплей (dmctl-<display>).

Владелец подкаталога глобальнокго сокета -- суперпользователь (root), а подкаталогов сокетов дисплеев -- пользователь запустивший текущую сессию (суперпользователь или другой вошедший в систему пользователь). Группа владельца может быть установлена опцией FifoGroup=, иначе -- группа суперпользователя(root). Права доступа подкаталогов -- rwxr-x--- (0750).

Поля команды отделены знаками табуляции (\t), поля списков -- пробелами, поля выделенные символами -- знаками \s.

Команды оканчиваются переводом строки (\n).

Тоже самое относится и к возвращаемым значениям. Так ответ при успешном завершении -- ok, возможно перед нм будет запрашиваемая информация. Если при выполнении возникла ошибка -- ответ будет в стиле eerno (например perm, noent, и т.д.), предваряемый более подробным пояснением.

Глобальные команды:

login дисплей(now | schedule) пользователь пароль [аргументы сессии]

Позволяет войти пользователю в систему с определённого дисплея. Если указан параметр now, все ранее запущенные и ещё активные сессии закрываются. Аргументы сессии -- строка в стиле printf, для заполнения файла .dmrc. Для НЕ перечисленных значений -- используются значения по умолчанию.

resume

Force return from console mode, even if TTY logins are still active.

manage display [display_class [auth_name auth_data]]

Start managing the named foreign display.

display_class, if specified and non-empty, will be used for configuration matching; see Глава 5, Конфигурационные файлы kdm.

auth_name and auth_data need to be passed if the display requires X authorization. The format is the same as the 2nd and 3rd column of the xauth list output.

unmanage display

Stop managing the named foreign display.

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

lock

Дисплей помечается как заблокированный. Если в этом состоянии X-сервер аварийно завершит работу, автоматический повторный вход в систему выполнен не будет, даже если он активирован.

unlock

Имеет обратное значение по отношению к команде lock, и снова становиться возможным автоматически заходить в систему.

suicide

Текущий сеанс принудительно закрывается. Автоматический вход в систему запрещён, но отложенная команда «login» разрешена.

Команды для всех сокетов

caps

Возвращает все возможности сокета:

kdm

идентифицирует kdm, на случай если другие менеджеры дисплеев тоже поддерживают данный протокол

list, lock, suicide, login, resume, manage

Соответствующий список поддерживаемых команд

bootoptions

Поддерживаются: команда listbootoptions и опция = к команде shutdown

shutdown <список>

Команда shutdown (выключить) разрешена и доступна для указанных пользователей (они перечисляются в списке через запятую). * — означает все зарегистрированные пользователи.

nuke <список>

Ускоренное выключение доступно следующим пользователям, перечисленным в списке.

nuke

Ускоренное выключение доступно всем

reserve <число>

Зарезервированные дисплеи сконфигурированы, и некоторое их число уже доступно.

list [all | alllocal]

Return a list of running sessions. By default all active sessions are listed (this is useful for a shutdown warning). If all is specified, passive sessions are listed as well. If alllocal is specified, passive sessions are listed as well, but all incoming remote sessions are skipped (this is useful for a fast user switching agent).

Каждая запись о сеансе представляет собой разделённый запятой набор:

  • Дисплей или имя консоли

  • VT name for local sessions, remote host name prefixed by @ for remote TTY sessions, otherwise empty

  • Имя зашедшего пользователя, это поле пусто для пустых или пассивных сессий и для исходящих удалённых сессий.

  • Session type for active local sessions, remote hostname for outgoing remote sessions, empty for passive sessions.

  • Поле флагов:

    • * для дисплеев, принадлежащих опрашиваемому сокету.

    • ! for sessions that cannot be killed by the requesting socket.

    • t for TTY sessions.

Новые поля могут быть добавлены в будущем.

reserve

Start a reserve login screen. If nobody logs in within some time, the display is removed again. When the session on the display exits, the display is removed, too.

Разрешено только для сокетов локальных дисплеев и для глобальных сокетов.

activate (vt|display)

Переключиться на определённый виртуальный терминал (VT). Виртуальный терминал может быть определён непосредственно (например, vt3) или с помощью использующего его дисплея (например, :2).

Разрешено только для сокетов локальных дисплеев и для глобальных сокетов.

listbootoptions

Список доступных загрузочных параметров.

The return value contains these tokens:

  • A list of boot options (as shown in kdm itself).

  • The default boot option.

  • The current boot option.

The default and current option are zero-based indices into the list of boot options. If either one is unset or not determinable, it is -1.

shutdown (reboot | halt) [=bootchoice] (ask|trynow|forcenow|schedule|start (-1|end (force|forcemy|cancel))))

Послать запрос на выключение системы, или перезагрузку или на останов/выключение питания.

Операционная система, загружаемая после перезагрузки, может быть определена из списка, возвращаемого командой listbootoptions

Запросы на выключение с сокетов соответствующих отдельным дисплеям выполняются, когд текущие сессии на них закрываются. После запроса может появиться диалоговое окно спрашивающее подтверждение и/или аутентификацию.

start -- время, когда выключение будет произведено. Если перед числом будет знак плюс, то добавляется текущее время. Ноль -- выключить немедленно.

end -- время через которое выключение будет произведено, несмотря на то, что некоторые сессии ещё не закрыты. Если перед числом будет знак плюс, то добавляется текущее время. -1 -- означает бесконечность. Если время истекло и сессии не закрыты, то kdm выполнит одно из следующих действий:

  • cancel — отменить выключение

  • force — выключить несмотря ни на что

  • forcemy -- выключить активные сессии после предупреждения пользователей. Только для сокетов запущеных для каждого дисплея.

start и end задаются в секундах с начала UNIX® эпохи.

trynow синоним для 0 0 cancel, forcenow синоним для 0 0 force и schedule синоним для 0 -1.

ask — если этот параметр указан, то делается немедленная попытка выключить дисплей, и если сеанс активен, производиться соответствующий запрос пользователю.

shutdown cancel [local|global}

Отменяет отложенное выключение. Глобальные сокеты отменяют только что полученный (ожидающий) запрос на выключение, тогда как сокеты дисплеев отменяют первый запрос в очереди (буферизованный).

shutdown status

Выводит список с информацией о запросах выключения.

Каждая строка — набор разделённых запятыми полей:

  • (global|local) -- отложенный (ожидающий), или буферизованный запрос. local может быть возвращён только сокетом дисплея.

  • (halt|reboot)

  • начало работы

  • конец работы

  • ("ask"|"force"|"forcemy"|"cancel")

  • Идентификационный номер пользователя (UID), или -1 для глобального сокета.

  • Операционная система, которая будет загружена после выключения, или «-».

В будущем могут быть добавлены новые поля.

Существует два способа использовать сокеты:

  • Подключиться к нему напрямую. Переменная окружения FifoDir длжна быть экспортирована с именем $DM_CONTROL; имя дисплейного сокета определяется как $DISPLAY.

  • С помощью команды kdmctl (например в сценарии командной строки). Наберите kdmctl -h чтобы узнать остальные параметры.

Далее пример bash сценария «перезагрузиться в ОС FreeBSD»:

if kdmctl | grep -q shutdown; then
  IFS=$'\t'
  set -- `kdmctl listbootoptions`
  if [ "$1" = ok ]; then
    fbsd=$(echo "$2" | tr ' ' '\n' | sed -ne 's,\\s, ,g;/freebsd/I{p;q}')
    if [ -n "$fbsd" ]; then
      kdmctl shutdown reboot "=$fbsd" ask > /dev/null
    else
      echo "FreeBSD boot unavailable."
    fi
  else
    echo "Boot options unavailable."
  fi
else
  echo "Cannot reboot system."
fi