gconf 관련 팁

narusas의 이미지

http://milines.egloos.com/3329612

아마 이런 문제에 봉착하는 사람이 별로 없을 거라 생각하지만 일단 정리해둔다.

gconf 는 Gnome 에서 사용되는 설정(Preferences) 시스템이다. 시스템 설정과 개인 설정, 어플리케이션 설정 등을 보관하게 되는데 보통 Gnome 어플리케이션들이 주로 사용하는데,

이 설정을 변경하기 위한 툴들은 다양한데 일단 커맨드 라인 툴인 gconftool-2이 있고 GUI 툴로는 gconf-editor 가 있으며 파이썬에서는 gconf 모듈을 사용 할 수 있다.
사용법도 어렵지 않은데

gconftool-2 --get /apps/gnome-screensaver/logout_delay
gconftool-2 --set /apps/gnome-screensaver/logout-delay --type int 200

이렇게 현재 사용자의 설정을 쉽게 바꿀 수 있으며 바뀐 설정은 이벤트 전달 시스템을 통해 각 어플리케이션에 바로 전달되어 반영된다.

여기까지는 아무런 문제가 없는데....

문제가 되는 것은 gksu, sudo 로 실행된 관리자 어플리케이션이 사용자의 설정을 변경하려고 할 때이다.
gconf 는 실제 설정이 저장되는 xml 소스와 이 변경을 전달하기 위한 데몬으로 구성된다.
데몬은 사용자 세션당 하나씩 실행되는데 오로지 해당 사용자를 위해서만 동작한다.

문제는 sudo/gksu 로 실행된 어플리케이션들의 현재 사용자는 "root"가 된다는 것이다. 당연히 현재 "root"를 위한 세션이 동작하는 상태가 아니므로(session id 가 다르므로) 데몬과 통신을 하지 않고, 그냥 root 의 xml 소스만 변경하며, 변경이벤트를 발생시키지 않는다.

파이썬에서
import gconf
e = gconf.engine_get_for_address("xml:readwrite:/home/USER/.gconf")
c = gconf.client_get_for_engine(e)
c.set_int("/apps/gnome-screensaver/logout_delay", 200)
로 root 의 설정이 아닌, USER 의 설정을 변경 하게 할 수 있지만, 이것 역시 변경이벤트를 발생시키지는 않는다.

그렇다면 현재 실행되고 있는 어플리케이션은 sudo/gksu 로 실행되고 있지만 그 안에서 gconftool-2 를 su USER 로 실행시키면 어떻게 될까?
getoutput("/bin/su ABC gconfgtool-2 --set /apps/gnome-screensaver/logout_delay --type int 150")

애석하게도 gconftool-2 는 현재 환경변수에 SUDO_USER가 있다면 USER가 아닌 SUDO_USER 의 설정을 변경하게 된다.
그러니까 이렇게 되는 것이다

초기 : USER: ABC SUDO_USER:없음
어플리케이션을 sudu 로 실행 : USER: root SUDO_USER: ABC
어플리케이션 안에서 su 실행: USER: ABC SUDO_USER:root

이렇게 되기 때문에 gconftool-2 의 스마트함 때문에 원하는 목표를 달성 할 수가 없다.

그럼 해결책은 무엇일까.

파이썬 외부 스크립트를 사용하는 것이다.
파이썬 gconf 모듈은 단순하기 때문에 실행되는 시점에 환경변수에 USER에 기록된 gconf 에 연결하게 된다.
물론 현재 실행되고 있는 어플리케이션의 USER 는 root 이지만 여기에서 su ABC 로 실행시키면 되는 것이다.

gconftool.py

import gconf
import sys
c = gconf.client_get_default()
m = getattr(c, sys.argv[1])
m(sys.args[2:]) # 대충 컨셉만 적은것임.

어플리케이션에서
getoutput("/bin/su ABC /usr/bin/gconftool.py set_int '/apps/gnome-screensaver' 150")

이렇게 하면 현재 사용자의 gconf 설정이 변경되고 데몬을 통해 변경을 전파 할 수 있게 된다.

ps. 설정 xml 을 변경하고 데몬을 다시읽기나 재시작을 시켜도 이벤트가 발생하지는 않는다.

ps2. 혹시 이 방법 말고 해당 사용자의 gconf 데몬에 이벤트를 발생시킬수 있는 방법을 아시는 분은 알려주시면 감사하겠습니다.

Forums: 

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.