web-dev-qa-db-fra.com

Changer les clés dconf sans se connecter à X dans Puppet

Est-il possible de définir une clé dconf par ligne de commande, sans se connecter à X?
J'aimerais utiliser ceci de Puppet.

Si j'essaie (de SSH, en tant qu'utilisateur normal) un simple

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

Je reçois

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

Alors que si j'essaye

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

Je reçois

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

Si je supprime $ 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

Je teste sur Xubuntu 12.04

(Ma question est similaire à celle-ci mais dans ce cas l'utilisateur est connecté)

2
Joril

J'ai réussi à résoudre le problème:

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

Joril, merci d'avoir fourni votre solution! J'aimerais ajouter un commentaire au cas où les gens rencontreraient le problème que je venais de rencontrer: lorsque vous utilisez cette définition de type pour définir des valeurs de chaîne, vous devez transmettre des guillemets et des caractères d'échappement supplémentaires. Par exemple, je voulais définir mon jeu de couleurs dans gedit, alors j'ai essayé ceci:

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

mais ça n'a pas marché. Ce que je devais faire était ceci:

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

Peut-être que quelqu'un pourrait faire cela d'une manière plus simple ou l'intégrer dans la fonction que vous avez fournie? Quoi qu'il en soit, cela fonctionne pour moi maintenant, donc je le laisse seul.

Notez que le passage de booléens fonctionne bien sans ce non-sens supplémentaire, par exemple:

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

fonctionne correctement, et je suppose que les valeurs numériques peuvent probablement être définies sans caractères d'échappement supplémentaires.

3
user153385

J'ai créé un module de marionnettes pour cela, basé sur la réponse de Joril:

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

Comme user153385 le mentionne, il doit s'échapper à cause de l'utilisation de sh. Des exemples avec bool, string et array sont donnés dans le README.md du référentiel.

1
sitaktif

J'ai trouvé une solution temporaire:

  1. Connectez-vous au système distant, puis connectez-vous via le terminal ssh au système distant et exportez l'affichage via: export DISPLAY=:0.

  2. Vous pouvez maintenant utiliser "dconf" comme d'habitude via le terminal ssh. Mais le gconftool-2 ne fonctionne pas maintenant.

Avez-vous une meilleure solution pour dconf sans exporter l’affichage?

0
speefak

J'utilise le type défini similaire, mais légèrement simplifié, pour résoudre ce problème:

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

Ce qui précède n'inclut pas la possibilité d'être exécuté par un utilisateur particulier (bien que cela puisse facilement être ajouté). Cependant, il utilise une invocation différente de dbus-run-session qui ne laisse pas les démons dbus supplémentaires s'exécuter après la fin de la commande et supprime la nécessité d'une couche séparée sh -c (bien que cet avantage puisse également être obtenu avec dbus-launch <command>). Ceci élimine les multiples couches douloureuses d'évasion mentionnées par certaines des autres réponses.

Quelques exemples utilisant ce qui précède:

# 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