gconf 관련 팁
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 데몬에 이벤트를 발생시킬수 있는 방법을 아시는 분은 알려주시면 감사하겠습니다.
댓글 달기