web-dev-qa-db-ja.com

PuppetでXにログインせずにdconfキーを変更する

Xにログインせずに、コマンドラインでdconfキーを設定する方法はありますか?
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でテストしています

(私の質問は this one に似ていますが、その場合、ユーザーはログインしています)

2
Joril

私は問題を解決することができました:

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

ジョリル、ソリューションを提供してくれてありがとう!私がやったばかりの問題が発生した場合に備えて、コメントを1つ追加します。この型定義を使用して文字列値を設定する場合、追加の引用符とエスケープ文字を渡す必要があります。たとえば、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',  
}

正しく動作し、数値もおそらく余分なエスケープ文字なしで設定できると想定しています。

3
user153385

Jorilの答えに基づいて、そのためのパペットモジュールを作成しました。

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

User153385が述べているように、shを使用しているため、エスケープする必要があります。 bool、string、arrayの例は、リポジトリのREADME.mdに記載されています。

1
sitaktif

私は一時的な解決策を見つけました:

  1. リモートシステムにログインし、sshターミナルを介してリモートシステムに接続し、ディスプレイをエクスポートします:export DISPLAY=:0

  2. これで、sshターミナルを介して通常どおり「dconf」を使用できます。しかし、gconftool-2は現在は機能しません。

ディスプレイをエクスポートせずにdconfで動作するより良いソリューションがありますか?

0
speefak

私はこの問題を解決するために、類似しているがわずかに簡略化された定義型を使用します。

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
Chris Pick