Coverage for /home/antoine/projects/xpra-git/dist/python3/lib64/python/xpra/platform/paths.py : 50%
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.
8import inspect
9import os.path
10import sys
12from xpra.platform import platform_import
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
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)
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
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 []
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"]
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")
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 []
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 []
71def get_socket_dirs():
72 return envaslist_or_delegate("XPRA_SOCKET_DIRS", do_get_socket_dirs)
73def do_get_socket_dirs():
74 return ["~/.xpra"]
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 []
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"]
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
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()
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()
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()
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"]
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"]
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
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()
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!
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()
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 :(
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)
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)
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 []
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"]
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()
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()
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"]
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 )
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 }
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")
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())
348if __name__ == "__main__":
349 main()