Изменить ключи 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

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

5 ответов

Решение

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

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"]
    }
}

Джорил, спасибо за предоставленное решение! Я хотел бы добавить один комментарий на тот случай, если у людей возникнет проблема, с которой я столкнулся: когда вы используете это определение типа для установки строковых значений, вам нужно передать несколько дополнительных кавычек и экранирующие символы. Например, я хотел установить свою цветовую схему в 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',  
}

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

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

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

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

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

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 []',
}

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

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

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

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

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