Изменить ключи dconf без входа в X в Puppet

Есть ли способ установить ключ dconf в командной строке, не входя в X?
Я хотел бы использовать это из Puppet.

Если я попытаюсь (из SSH, как обычный пользователь) просто

dconf write /desktop/gnome/remote-access/enabled true

, я получу

error: Command line `dbus-launch --autolaunch=e4d2b270bd8471627460e57c000007f1 --binary-syntax --close-stderr' exited with non-zero exit status 1:
Autolaunch error: X11 initialization failed.\n

Хотя, если я попытаюсь

DISPLAY=:0 dconf write /desktop/gnome/remote-access/enabled true

Я получаю

error: Command line `dbus-launch --autolaunch=e4d2b270bd8471627460e57c000007f1 --binary-syntax --close-stderr' exited with non-zero exit status 1:
Invalid MIT-MAGIC-COOKIE-1 keyInvalid MIT-MAGIC-COOKIE-1 keyAutolaunch error: X11 initialization failed.\n

Если я удаляю $ HOME / .Xauthority

error: Command line `dbus-launch --autolaunch=e4d2b270bd8471627460e57c000007f1 --binary-syntax --close-stderr' exited with non-zero exit status 1:
No protocol specified\nNo protocol specified\nAutolaunch error: X11 initialization failed.\n

Я тестирую на Xubuntu 12.04

(мой вопрос похож на этот , но в этом случае пользователь вошел в систему)

2
задан 13 April 2017 в 15:25

5 ответов

Я создал для этого кукольный модуль, основываясь на ответе Джорила:

https://github.com/sitaktif/puppet-dconf

от имени пользователя 153385 упоминает, что ему нужно избежать из-за использования sh. Примеры с bool, string и array приведены в README.md хранилища.

0
ответ дан 13 April 2017 в 15:25

Мне удалось решить проблему:

define dconf::key($value) {
    exec { "Setting dconf $title":
        path => "/bin:/usr/bin",
        command => "/bin/sh -c 'eval `dbus-launch --auto-syntax` && dconf write $title $value'",
        user => "user_name",
        group => "user_name",
        unless => "dconf read $title | grep $value",
        require => Package["dconf-tools"]
    }
}
0
ответ дан 13 April 2017 в 15:25

Joril, благодарит предоставить Ваше решение! Я хотел бы добавить один комментарий в случае, если у людей есть проблема, которую я просто сделал: при использовании этого определения типа для устанавливания строковых значений, необходимо передать в некоторых дополнительных кавычках и символах ESC. Например, я хотел установить свою цветовую схему в gedit, таким образом, я попробовал это:

dconf::key {'/org/gnome/gedit/preferences/editor/scheme':
    value => 'solarized_dark',
}

но это не работало. То, что я должен был сделать, было этим:

dconf::key {'/org/gnome/gedit/preferences/editor/scheme':
    value => "\\\"solarized_dark\\\"",
}

Возможно, кто-то мог сделать это более простым способом или встроить его в функцию, которую Вы обеспечили? Так или иначе это работает на меня теперь, таким образом, я оставляю его в покое.

Обратите внимание, что передача в булевских переменных хорошо работает без той дополнительной ерунды, например:

dconf::key {'/org/gnome/gedit/preferences/editor/auto-indent': 
    value => 'true',  
}

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

3
ответ дан 13 April 2017 в 15:25

Я использую подобный, но слегка упрощенный определенный тип для решения этой проблемы:

define dconf ($key = $title, $value) {
    exec { "dbus-run-session -- dconf write \"${key}\" \"${value}\"":
        onlyif  => "test \"${value}\" != \"`dbus-run-session -- dconf read \"${key}\"`\"",
    }
}

Выше не включает возможность запуска конкретным пользователем (хотя это можно легко добавить) , Тем не менее, он использует другой вызов dbus-run-session, который не оставляет дополнительных демонов dbus работающими после завершения команды, и устраняет необходимость в отдельном уровне sh -c (хотя это преимущество также может быть достигнуто с помощью dbus-launch <command>) , Это устраняет болезненные многоуровневые побеги, упомянутые в некоторых других ответах.

Некоторые примеры, которые используют выше:

# swap capslock and escape
dconf { '/org/gnome/desktop/input-sources/xkb-options':
    value   => '[\'caps:swapescape\']',
}

# stop ibus from swallowing ctrl+space
dconf { '/desktop/ibus/general/hotkey/triggers':
    value   => '@as []',
}
0
ответ дан 13 April 2017 в 15:25

Я нашел временное решение:

  1. Войдите в удаленную систему, затем подключитесь через терминал ssh к удаленной системе и экспортируйте дисплей через: export DISPLAY=:0.

  2. Теперь вы можете использовать «dconf» как обычно через ssh терминал. Но gconftool-2 сейчас не работает.

Есть ли у вас лучшее решение для dconf без экспорта дисплея?

0
ответ дан 13 April 2017 в 15:25

Другие вопросы по тегам:

Похожие вопросы: