Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1#!/usr/bin/env python 

2# This file is part of Xpra. 

3# Copyright (C) 2010 Nathaniel Smith <njs@pobox.com> 

4# Copyright (C) 2011-2019 Antoine Martin <antoine@xpra.org> 

5# Xpra is released under the terms of the GNU GPL v2, or, at your option, any 

6# later version. See the file COPYING for details. 

7 

8import inspect 

9import os.path 

10import sys 

11 

12from xpra.platform import platform_import 

13 

14 

15def valid_dir(path): 

16 try: 

17 return bool(path) and os.path.exists(path) and os.path.isdir(path) 

18 except TypeError: 

19 return False 

20 

21 

22#helpers to easily override using env vars: 

23def envaslist_or_delegate(env_name, impl, *args): 

24 env_value = os.environ.get(env_name) 

25 if env_value is not None: 

26 return [env_value] 

27 return impl(*args) 

28def env_or_delegate(env_name, impl, *args): 

29 env_value = os.environ.get(env_name) 

30 if env_value is not None: 

31 return env_value 

32 return impl(*args) 

33 

34 

35def get_install_prefix(): 

36 return env_or_delegate("XPRA_INSTALL_PREFIX", do_get_install_prefix) 

37def do_get_install_prefix(): 

38 return sys.prefix 

39 

40 

41def get_system_conf_dirs(): 

42 return envaslist_or_delegate("XPRA_SYSTEM_CONF_DIRS", do_get_system_conf_dirs) 

43def do_get_system_conf_dirs(): 

44 #overriden in all platforms 

45 return [] 

46 

47 

48def get_ssh_conf_dirs(): 

49 return envaslist_or_delegate("XPRA_SSH_CONF_DIRS", do_get_ssh_conf_dirs) 

50def do_get_ssh_conf_dirs(): 

51 return ["/etc/ssh", "/usr/local/etc/ssh", "~/.ssh", "~/ssh"] 

52 

53def get_ssh_known_hosts_files(): 

54 return envaslist_or_delegate("XPRA_SSH_KNOWN_HOSTS", do_get_ssh_known_hosts_files) 

55def do_get_ssh_known_hosts_files(): 

56 return ("~/.ssh/known_hosts", "~/ssh/known_hosts") 

57 

58 

59def get_user_conf_dirs(uid=None): 

60 return envaslist_or_delegate("XPRA_USER_CONF_DIRS", do_get_user_conf_dirs, uid) 

61def do_get_user_conf_dirs(_uid): 

62 return [] 

63 

64def get_default_conf_dirs(): 

65 return envaslist_or_delegate("XPRA_DEFAULT_CONF_DIRS", do_get_default_conf_dirs) 

66def do_get_default_conf_dirs(): 

67 #some platforms may also ship a default config with the application 

68 return [] 

69 

70 

71def get_socket_dirs(): 

72 return envaslist_or_delegate("XPRA_SOCKET_DIRS", do_get_socket_dirs) 

73def do_get_socket_dirs(): 

74 return ["~/.xpra"] 

75 

76 

77def get_client_socket_dirs(): 

78 return envaslist_or_delegate("XPRA_CLIENT_SOCKET_DIRS", do_get_client_socket_dirs) 

79def do_get_client_socket_dirs(): 

80 return [] 

81 

82 

83def get_default_log_dirs(): 

84 return envaslist_or_delegate("XPRA_LOG_DIRS", do_get_default_log_dirs) 

85def do_get_default_log_dirs(): 

86 return ["~/.xpra"] 

87 

88def get_download_dir(): 

89 return env_or_delegate("XPRA_DOWNLOAD_DIR", do_get_download_dir) 

90def do_get_download_dir(): 

91 d = "~/Downloads" 

92 if not os.path.exists(os.path.expanduser(d)): 

93 return "~" 

94 return d 

95 

96 

97def get_libexec_dir(): 

98 return env_or_delegate("XPRA_LIBEXEC_DIR", do_get_libexec_dir) 

99def do_get_libexec_dir(): 

100 return get_app_dir() 

101 

102 

103def get_mmap_dir(): 

104 return env_or_delegate("XPRA_MMAP_DIR", do_get_mmap_dir) 

105def do_get_mmap_dir(): 

106 import tempfile 

107 return tempfile.gettempdir() 

108 

109 

110def get_xpra_tmp_dir(): 

111 return env_or_delegate("XPRA_TMP_DIR", do_get_xpra_tmp_dir) 

112def do_get_xpra_tmp_dir(): 

113 import tempfile 

114 return tempfile.gettempdir() 

115 

116 

117def get_script_bin_dirs(): 

118 return envaslist_or_delegate("XPRA_SCRIPT_BIN_DIRS", do_get_script_bin_dirs) 

119def do_get_script_bin_dirs(): 

120 return ["~/.xpra"] 

121 

122def get_remote_run_xpra_scripts(): 

123 return envaslist_or_delegate("XPRA_REMOTE_RUN_XPRA_SCRIPTS", do_get_remote_run_xpra_scripts) 

124def do_get_remote_run_xpra_scripts(): 

125 return ["xpra", "$XDG_RUNTIME_DIR/xpra/run-xpra", "/usr/local/bin/xpra", "~/.xpra/run-xpra", "Xpra_cmd.exe"] 

126 

127 

128def get_sshpass_command(): 

129 return env_or_delegate("XPRA_SSHPASS", do_get_sshpass_command) 

130def do_get_sshpass_command(): 

131 def is_exe(fpath): 

132 return os.path.isfile(fpath) and os.access(fpath, os.X_OK) 

133 SSHPASS = "sshpass" 

134 from xpra.platform.features import EXECUTABLE_EXTENSION 

135 if EXECUTABLE_EXTENSION: 

136 SSHPASS = "sshpass.%s" % EXECUTABLE_EXTENSION 

137 paths = os.environ["PATH"].split(os.pathsep) 

138 for path in paths: 

139 path = path.strip('"') 

140 exe_file = os.path.join(path, SSHPASS) 

141 if is_exe(exe_file): 

142 return exe_file 

143 return None 

144 

145 

146#overriden in platform code: 

147def get_app_dir(): 

148 return env_or_delegate("XPRA_APP_DIR", do_get_app_dir) 

149def do_get_app_dir(): 

150 return default_get_app_dir() 

151 

152def default_get_app_dir(): 

153 if os.name=="posix": 

154 for prefix in ( 

155 os.environ.get("RPM_BUILD_ROOT"), 

156 get_install_prefix(), 

157 sys.exec_prefix, 

158 "/usr", 

159 "/usr/local", 

160 ): 

161 if not prefix: 

162 continue 

163 adir = os.path.join(prefix, "share", "xpra") 

164 if valid_dir(adir): 

165 return adir 

166 adir = os.path.dirname(inspect.getfile(sys._getframe(1))) #pylint: disable=protected-access 

167 def root_module(d): 

168 for psep in (os.path.sep, "/", "\\"): 

169 pos = d.find("xpra%splatform" % psep) 

170 if pos>=0: 

171 return d[:pos] 

172 return d 

173 if valid_dir(adir): 

174 return root_module(adir) 

175 adir = os.path.dirname(sys.argv[0]) 

176 if valid_dir(adir): 

177 return root_module(adir) 

178 adir = os.getcwd() 

179 return adir #tried our best, hope this works! 

180 

181#may be overriden in platform code: 

182def get_resources_dir(): 

183 return env_or_delegate("XPRA_RESOURCES_DIR", do_get_resources_dir) 

184def do_get_resources_dir(): 

185 return get_app_dir() 

186 

187#may be overriden in platform code: 

188def get_icon_dir(): 

189 return env_or_delegate("XPRA_ICON_DIR", do_get_icon_dir) 

190def do_get_icon_dir(): 

191 adir = get_app_dir() 

192 idir = os.path.join(adir, "icons") 

193 if valid_dir(idir): 

194 return idir 

195 for prefix in (sys.exec_prefix, "/usr", "/usr/local"): 

196 idir = os.path.join(prefix, "icons") 

197 if os.path.exists(idir): 

198 return idir 

199 return adir #better than nothing :( 

200 

201def get_icon(name): 

202 filename = get_icon_filename(name) 

203 if not filename: 

204 return None 

205 from xpra.gtk_common.gtk_util import get_icon_from_file 

206 return get_icon_from_file(filename) 

207 

208def get_icon_filename(basename=None, ext="png"): 

209 if not basename: 

210 return None 

211 filename = basename 

212 fext = os.path.splitext(filename)[1] 

213 if not fext: 

214 filename = "%s.%s" % (basename, ext) 

215 if not os.path.isabs(filename): 

216 icon_dir = get_icon_dir() 

217 filename = os.path.join(icon_dir, filename) 

218 if not os.path.exists(filename): 

219 return None 

220 return os.path.abspath(filename) 

221 

222 

223def get_desktop_background_paths(): 

224 return envaslist_or_delegate("XPRA_DESKTOP_BACKGROUND_PATHS", do_get_desktop_background_paths) 

225def do_get_desktop_background_paths(): 

226 return [] 

227 

228 

229def get_xpra_command(): 

230 envvalue = os.environ.get("XPRA_COMMAND") 

231 if envvalue: 

232 import shlex 

233 return shlex.split(envvalue) 

234 return do_get_xpra_command() 

235def do_get_xpra_command(): 

236 return default_do_get_xpra_command() 

237def default_do_get_xpra_command(): 

238 #try to use the same "xpra" executable that launched this server: 

239 if sys.argv and sys.argv[0].lower().endswith("/xpra"): 

240 return [sys.argv[0]] 

241 return ["xpra"] 

242 

243 

244def get_nodock_command(): 

245 envvalue = os.environ.get("XPRA_NODOCK_COMMAND") 

246 if envvalue: 

247 import shlex 

248 return shlex.split(envvalue) 

249 return do_get_nodock_command() 

250def do_get_nodock_command(): 

251 return get_xpra_command() 

252 

253 

254def get_sound_command(): 

255 envvalue = os.environ.get("XPRA_SOUND_COMMAND") 

256 if envvalue: 

257 import shlex 

258 return shlex.split(envvalue) 

259 return do_get_sound_command() 

260def do_get_sound_command(): 

261 return get_xpra_command() 

262 

263def get_python_execfile_command(): 

264 envvalue = os.environ.get("XPRA_PYTHON_COMMAND") 

265 if envvalue: 

266 import shlex 

267 return shlex.split(envvalue) 

268 return do_get_python_execfile_command() 

269def do_get_python_execfile_command(): 

270 return ["python3"] 

271 

272 

273platform_import(globals(), "paths", True, 

274 "do_get_resources_dir", 

275 "do_get_app_dir", 

276 "do_get_icon_dir") 

277platform_import(globals(), "paths", False, 

278 "do_get_sshpass_command", 

279 "do_get_xpra_command", 

280 "do_get_sound_command", 

281 "do_get_nodock_command", 

282 "do_get_install_prefix", 

283 "do_get_default_conf_dirs", 

284 "do_get_system_conf_dirs", 

285 "do_get_ssh_conf_dirs", 

286 "do_get_ssh_known_hosts_files", 

287 "do_get_user_conf_dirs", 

288 "do_get_socket_dirs", 

289 "do_get_client_socket_dirs", 

290 "do_get_default_log_dirs", 

291 "do_get_download_dir", 

292 "do_get_libexec_dir", 

293 "do_get_mmap_dir", 

294 "do_get_xpra_tmp_dir", 

295 "do_get_script_bin_dirs", 

296 "do_get_desktop_background_paths", 

297 "do_get_python_execfile_command", 

298 ) 

299 

300def get_info(): 

301 try: 

302 import xpra 

303 XPRA_MODULE_PATH = xpra.__file__ 

304 pos = XPRA_MODULE_PATH.find("__init__.py") 

305 if pos>0: 

306 XPRA_MODULE_PATH = XPRA_MODULE_PATH[:pos] 

307 except AttributeError: 

308 XPRA_MODULE_PATH = "" 

309 return { 

310 "install" : {"prefix" : get_install_prefix()}, 

311 "default_conf" : {"dirs" : get_default_conf_dirs()}, 

312 "system_conf" : {"dirs" : get_system_conf_dirs()}, 

313 "ssh_conf" : {"dirs" : get_ssh_conf_dirs()}, 

314 "user_conf" : {"dirs" : get_user_conf_dirs()}, 

315 "socket" : {"dirs" : get_socket_dirs()}, 

316 "client-socket" : {"dirs" : get_client_socket_dirs()}, 

317 "log" : {"dirs" : get_default_log_dirs()}, 

318 "download" : {"dir" : get_download_dir()}, 

319 "libexec" : {"dir" : get_libexec_dir()}, 

320 "mmap" : {"dir" : get_mmap_dir()}, 

321 "xpra-tmp" : {"dir" : get_xpra_tmp_dir()}, 

322 "xpra-module" : XPRA_MODULE_PATH, 

323 "app" : {"default" : {"dir" : default_get_app_dir()}}, 

324 "desktop-background": get_desktop_background_paths(), 

325 "ssh-known-hosts" : get_ssh_known_hosts_files(), 

326 "resources" : get_resources_dir(), 

327 "icons" : get_icon_dir(), 

328 "home" : os.path.expanduser("~"), 

329 "xpra_command" : get_xpra_command(), 

330 "nodock_command" : get_nodock_command(), 

331 "sound_command" : get_sound_command(), 

332 "sshpass_command" : get_sshpass_command(), 

333 "python-execfile" : get_python_execfile_command(), 

334 } 

335 

336 

337def main(): 

338 if "-v" in sys.argv or "--verbose" in sys.argv: 

339 from xpra.log import add_debug_category 

340 add_debug_category("util") 

341 

342 from xpra.util import print_nested_dict 

343 from xpra.platform import program_context 

344 with program_context("Path-Info", "Path Info"): 

345 print_nested_dict(get_info()) 

346 

347 

348if __name__ == "__main__": 

349 main()