OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 # Virtual Me2Me implementation. This script runs and manages the processes | 6 # Virtual Me2Me implementation. This script runs and manages the processes |
7 # required for a Virtual Me2Me desktop, which are: X server, X desktop | 7 # required for a Virtual Me2Me desktop, which are: X server, X desktop |
8 # session, and Host process. | 8 # session, and Host process. |
9 # This script is intended to run continuously as a background daemon | 9 # This script is intended to run continuously as a background daemon |
10 # process, running under an ordinary (non-root) user account. | 10 # process, running under an ordinary (non-root) user account. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 # By default, provide a maximum size that is large enough to support clients | 42 # By default, provide a maximum size that is large enough to support clients |
43 # with large or multiple monitors. This is a comma-separated list of | 43 # with large or multiple monitors. This is a comma-separated list of |
44 # resolutions that will be made available if the X server supports RANDR. These | 44 # resolutions that will be made available if the X server supports RANDR. These |
45 # defaults can be overridden in ~/.profile. | 45 # defaults can be overridden in ~/.profile. |
46 DEFAULT_SIZES = "1600x1200,3840x2560" | 46 DEFAULT_SIZES = "1600x1200,3840x2560" |
47 | 47 |
48 # If RANDR is not available, use a smaller default size. Only a single | 48 # If RANDR is not available, use a smaller default size. Only a single |
49 # resolution is supported in this case. | 49 # resolution is supported in this case. |
50 DEFAULT_SIZE_NO_RANDR = "1600x1200" | 50 DEFAULT_SIZE_NO_RANDR = "1600x1200" |
51 | 51 |
52 SCRIPT_PATH = sys.path[0] | 52 SCRIPT_PATH = os.path.abspath(sys.argv[0]) |
| 53 SCRIPT_DIR = os.path.dirname(SCRIPT_PATH) |
53 | 54 |
54 IS_INSTALLED = (os.path.basename(sys.argv[0]) != 'linux_me2me_host.py') | 55 IS_INSTALLED = (os.path.basename(sys.argv[0]) != 'linux_me2me_host.py') |
55 | 56 |
56 if IS_INSTALLED: | 57 if IS_INSTALLED: |
57 HOST_BINARY_NAME = "chrome-remote-desktop-host" | 58 HOST_BINARY_NAME = "chrome-remote-desktop-host" |
58 else: | 59 else: |
59 HOST_BINARY_NAME = "remoting_me2me_host" | 60 HOST_BINARY_NAME = "remoting_me2me_host" |
60 | 61 |
61 CHROME_REMOTING_GROUP_NAME = "chrome-remote-desktop" | 62 CHROME_REMOTING_GROUP_NAME = "chrome-remote-desktop" |
62 | 63 |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 args = ["xrandr", "-s", label] | 439 args = ["xrandr", "-s", label] |
439 subprocess.call(args, env=self.child_env, stdout=devnull, stderr=devnull) | 440 subprocess.call(args, env=self.child_env, stdout=devnull, stderr=devnull) |
440 | 441 |
441 # Set the physical size of the display so that the initial mode is running | 442 # Set the physical size of the display so that the initial mode is running |
442 # at approximately 96 DPI, since some desktops require the DPI to be set to | 443 # at approximately 96 DPI, since some desktops require the DPI to be set to |
443 # something realistic. | 444 # something realistic. |
444 args = ["xrandr", "--dpi", "96"] | 445 args = ["xrandr", "--dpi", "96"] |
445 subprocess.call(args, env=self.child_env, stdout=devnull, stderr=devnull) | 446 subprocess.call(args, env=self.child_env, stdout=devnull, stderr=devnull) |
446 | 447 |
447 # Monitor for any automatic resolution changes from the desktop environment. | 448 # Monitor for any automatic resolution changes from the desktop environment. |
448 args = [sys.argv[0], "--watch-resolution", str(initial_size[0]), | 449 args = [SCRIPT_PATH, "--watch-resolution", str(initial_size[0]), |
449 str(initial_size[1])] | 450 str(initial_size[1])] |
450 | 451 |
451 # It is not necessary to wait() on the process here, as this script's main | 452 # It is not necessary to wait() on the process here, as this script's main |
452 # loop will reap the exit-codes of all child processes. | 453 # loop will reap the exit-codes of all child processes. |
453 subprocess.Popen(args, env=self.child_env, stdout=devnull, stderr=devnull) | 454 subprocess.Popen(args, env=self.child_env, stdout=devnull, stderr=devnull) |
454 | 455 |
455 devnull.close() | 456 devnull.close() |
456 | 457 |
457 def _launch_x_session(self): | 458 def _launch_x_session(self): |
458 # Start desktop session. | 459 # Start desktop session. |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 # Use the session wrapper by itself, and let the system choose a | 602 # Use the session wrapper by itself, and let the system choose a |
602 # session. | 603 # session. |
603 return [session_wrapper] | 604 return [session_wrapper] |
604 return None | 605 return None |
605 | 606 |
606 | 607 |
607 def locate_executable(exe_name): | 608 def locate_executable(exe_name): |
608 if IS_INSTALLED: | 609 if IS_INSTALLED: |
609 # If the script is running from its installed location, search the host | 610 # If the script is running from its installed location, search the host |
610 # binary only in the same directory. | 611 # binary only in the same directory. |
611 paths_to_try = [ SCRIPT_PATH ] | 612 paths_to_try = [ SCRIPT_DIR ] |
612 else: | 613 else: |
613 paths_to_try = map(lambda p: os.path.join(SCRIPT_PATH, p), | 614 paths_to_try = map(lambda p: os.path.join(SCRIPT_DIR, p), |
614 [".", "../../../out/Debug", "../../../out/Release" ]) | 615 [".", "../../../out/Debug", "../../../out/Release" ]) |
615 for path in paths_to_try: | 616 for path in paths_to_try: |
616 exe_path = os.path.join(path, exe_name) | 617 exe_path = os.path.join(path, exe_name) |
617 if os.path.exists(exe_path): | 618 if os.path.exists(exe_path): |
618 return exe_path | 619 return exe_path |
619 | 620 |
620 raise Exception("Could not locate executable '%s'" % exe_name) | 621 raise Exception("Could not locate executable '%s'" % exe_name) |
621 | 622 |
622 | 623 |
623 class ParentProcessLogger(object): | 624 class ParentProcessLogger(object): |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
878 self.running = False | 879 self.running = False |
879 if time.time() < self.earliest_successful_termination: | 880 if time.time() < self.earliest_successful_termination: |
880 self.failures += 1 | 881 self.failures += 1 |
881 else: | 882 else: |
882 self.failures = 0 | 883 self.failures = 0 |
883 logging.info("Failure count for '%s' is now %d", self.label, self.failures) | 884 logging.info("Failure count for '%s' is now %d", self.label, self.failures) |
884 | 885 |
885 | 886 |
886 def relaunch_self(): | 887 def relaunch_self(): |
887 cleanup() | 888 cleanup() |
888 os.execvp(sys.argv[0], sys.argv) | 889 os.execvp(SCRIPT_PATH, sys.argv) |
889 | 890 |
890 | 891 |
891 def waitpid_with_timeout(pid, deadline): | 892 def waitpid_with_timeout(pid, deadline): |
892 """Wrapper around os.waitpid() which waits until either a child process dies | 893 """Wrapper around os.waitpid() which waits until either a child process dies |
893 or the deadline elapses. | 894 or the deadline elapses. |
894 | 895 |
895 Args: | 896 Args: |
896 pid: Process ID to wait for, or -1 to wait for any child process. | 897 pid: Process ID to wait for, or -1 to wait for any child process. |
897 deadline: Waiting stops when time.time() exceeds this value. | 898 deadline: Waiting stops when time.time() exceeds this value. |
898 | 899 |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1310 else: | 1311 else: |
1311 logging.info("Host exited with status %s." % os.WEXITSTATUS(status)) | 1312 logging.info("Host exited with status %s." % os.WEXITSTATUS(status)) |
1312 elif os.WIFSIGNALED(status): | 1313 elif os.WIFSIGNALED(status): |
1313 logging.info("Host terminated by signal %s." % os.WTERMSIG(status)) | 1314 logging.info("Host terminated by signal %s." % os.WTERMSIG(status)) |
1314 | 1315 |
1315 | 1316 |
1316 if __name__ == "__main__": | 1317 if __name__ == "__main__": |
1317 logging.basicConfig(level=logging.DEBUG, | 1318 logging.basicConfig(level=logging.DEBUG, |
1318 format="%(asctime)s:%(levelname)s:%(message)s") | 1319 format="%(asctime)s:%(levelname)s:%(message)s") |
1319 sys.exit(main()) | 1320 sys.exit(main()) |
OLD | NEW |