[gnome-shell.in] When we don't have DISPLAY, attempt to pull in running session
This is a convenience for debugging when logging in over ssh. Longer term we should stick this code (in a more OS portable fashion) into ConsoleKit.
This commit is contained in:
parent
ec36a0070e
commit
8552721983
50
src/gnome-shell.in
Executable file → Normal file
50
src/gnome-shell.in
Executable file → Normal file
@ -14,6 +14,50 @@ import termios
|
|||||||
import time
|
import time
|
||||||
import errno
|
import errno
|
||||||
|
|
||||||
|
def get_running_session_environs():
|
||||||
|
wanted_environment = ['DBUS_SESSION_BUS_ADDRESS', 'DISPLAY', 'XDG_DATA_DIRS',
|
||||||
|
'XAUTHORITY', 'XDG_SESSION_COOKIE', 'ORBIT_SOCKETDIR',
|
||||||
|
'SESSION_MANAGER']
|
||||||
|
num_re = re.compile('^[0-9]+$')
|
||||||
|
myuid = os.getuid()
|
||||||
|
if not os.path.isdir('/proc'):
|
||||||
|
return {}
|
||||||
|
for filename in os.listdir('/proc'):
|
||||||
|
if not num_re.match(filename):
|
||||||
|
continue
|
||||||
|
piddir = '/proc/' + filename
|
||||||
|
try:
|
||||||
|
stat = os.stat(piddir)
|
||||||
|
except OSError, e:
|
||||||
|
continue
|
||||||
|
if not stat.st_uid == myuid:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
exe = os.readlink(piddir + '/exe')
|
||||||
|
except OSError, e:
|
||||||
|
continue
|
||||||
|
if os.path.basename(exe) != 'gnome-session':
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
f = open(os.path.join(piddir, 'environ'))
|
||||||
|
except OSError, e:
|
||||||
|
continue
|
||||||
|
environ_data = f.read()
|
||||||
|
f.close()
|
||||||
|
# There's a trailing null at the last one, so remove the
|
||||||
|
# empty string
|
||||||
|
environs = environ_data.split('\0')[:-1]
|
||||||
|
# Rumor has it the presence of just FOO (instead of FOO=bar)
|
||||||
|
# represents a deleted environment variable
|
||||||
|
environs = filter(lambda x: '=' in x, environs)
|
||||||
|
# Turn it into a dictionary
|
||||||
|
environs = dict(map(lambda x: x.split('=', 1), environs))
|
||||||
|
result = {}
|
||||||
|
for key in wanted_environment:
|
||||||
|
if key in environs:
|
||||||
|
result[key] = environs[key]
|
||||||
|
return result
|
||||||
|
|
||||||
def start_xephyr():
|
def start_xephyr():
|
||||||
tmpdir = tempfile.mkdtemp("", "gnome-shell.")
|
tmpdir = tempfile.mkdtemp("", "gnome-shell.")
|
||||||
atexit.register(shutil.rmtree, tmpdir)
|
atexit.register(shutil.rmtree, tmpdir)
|
||||||
@ -343,6 +387,12 @@ else:
|
|||||||
if options.verbose:
|
if options.verbose:
|
||||||
print "Starting shell"
|
print "Starting shell"
|
||||||
|
|
||||||
|
|
||||||
|
# Handle ssh logins
|
||||||
|
if 'DISPLAY' not in os.environ:
|
||||||
|
running_env = get_running_session_environs()
|
||||||
|
os.environ.update(running_env)
|
||||||
|
|
||||||
if options.debug:
|
if options.debug:
|
||||||
# Record initial terminal state so we can reset it to that
|
# Record initial terminal state so we can reset it to that
|
||||||
# later, in case we kill gdb at a bad time
|
# later, in case we kill gdb at a bad time
|
||||||
|
Loading…
Reference in New Issue
Block a user