def run_server(parser, opts, mode, xpra_file, extra_args): if len(extra_args) != 1: parser.error("need exactly 1 extra argument") display_name = extra_args.pop(0) if display_name==":0": print("WARNING:") print("You are attempting to run the xpra server against the default X11 display '%s'." % display_name) print("This is generally not what you want.") print("You should probably use a higher display number just to avoid any confusion (and also this warning message).") if opts.exit_with_children and not opts.children: print("--exit-with-children specified without any children to spawn; exiting immediately") return 1 atexit.register(run_cleanups) signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) assert mode in ("start", "upgrade") upgrading = (mode == "upgrade") from xpra.scripts.main import get_default_socket_dir dotxpra = DotXpra(opts.sockdir or get_default_socket_dir()) # This used to be given a display-specific name, but now we give it a # single fixed name and if multiple servers are started then the last one # will clobber the rest. This isn't great, but the tradeoff is that it # makes it possible to use bare 'ssh:hostname' display names and # autodiscover the proper numeric display name when only one xpra server # is running on the remote host. Might need to revisit this later if # people run into problems or autodiscovery turns out to be less useful # than expected. scriptpath = os.path.join(dotxpra.confdir(), "run-xpra") # Save the starting dir now, because we'll lose track of it when we # daemonize: starting_dir = os.getcwd() # Daemonize: if opts.daemon: logpath = dotxpra.conf_path(display_name) + ".log" sys.stderr.write("Entering daemon mode; " + "any further errors will be reported to:\n" + (" %s\n" % logpath)) # Do some work up front, so any errors don't get lost. if os.path.exists(logpath): os.rename(logpath, logpath + ".old") logfd = os.open(logpath, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, o0666) assert logfd > 2 os.chdir("/") if os.fork(): os._exit(0) os.setsid() if os.fork(): os._exit(0) close_all_fds(exceptions=[logfd]) fd0 = os.open("/dev/null", os.O_RDONLY) if fd0 != 0: os.dup2(fd0, 0) os.close(fd0) os.dup2(logfd, 1) os.dup2(logfd, 2) os.close(logfd) # Make these line-buffered: sys.stdout = os.fdopen(1, "w", 1) sys.stderr = os.fdopen(2, "w", 1) # Write out a shell-script so that we can start our proxy in a clean # environment: scriptfile = open(scriptpath, "w") # Unix is a little silly sometimes: umask = os.umask(0) os.umask(umask) if hasattr(os, "fchmod"): os.fchmod(scriptfile.fileno(), o0700 & ~umask) else: os.chmod(scriptpath, o0700 & ~umask) scriptfile.write(xpra_runner_shell_script(xpra_file, starting_dir, opts.sockdir)) scriptfile.close() # Initialize the sockets before the display, # That way, errors won't make us kill the Xvfb # (which may not be ours to kill at that point) sockets = [] if opts.bind_tcp: try: tcp_socket = create_tcp_socket(parser, opts.bind_tcp) sockets.append(tcp_socket) def cleanup_tcp_socket(): print("closing tcp socket %s" % opts.bind_tcp) try: tcp_socket.close() except: pass _cleanups.append(cleanup_tcp_socket) except Exception, e: print("cannot start - failed to create tcp socket at %s: %s" % (opts.bind_tcp, e)) return 1
def run_server(parser, opts, mode, xpra_file, extra_args): if len(extra_args) != 1: parser.error("need exactly 1 extra argument") display_name = extra_args.pop(0) if opts.exit_with_children and not opts.children: print( "--exit-with-children specified without any children to spawn; exiting immediately" ) return atexit.register(run_cleanups) signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) assert mode in ("start", "upgrade") upgrading = (mode == "upgrade") dotxpra = DotXpra(opts.sockdir) # This used to be given a display-specific name, but now we give it a # single fixed name and if multiple servers are started then the last one # will clobber the rest. This isn't great, but the tradeoff is that it # makes it possible to use bare 'ssh:hostname' display names and # autodiscover the proper numeric display name when only one xpra server # is running on the remote host. Might need to revisit this later if # people run into problems or autodiscovery turns out to be less useful # than expected. scriptpath = os.path.join(dotxpra.confdir(), "run-xpra") # Save the starting dir now, because we'll lose track of it when we # daemonize: starting_dir = os.getcwd() clobber = upgrading or opts.use_display try: sockpath = dotxpra.server_socket_path(display_name, clobber) except ServerSockInUse: parser.error("You already have an xpra server running at %s\n" " (did you want 'xpra upgrade'?)" % (display_name, )) # Daemonize: if opts.daemon: logpath = dotxpra.conf_path(display_name) + ".log" sys.stderr.write("Entering daemon mode; " + "any further errors will be reported to:\n" + (" %s\n" % logpath)) # Do some work up front, so any errors don't get lost. if os.path.exists(logpath): os.rename(logpath, logpath + ".old") logfd = os.open(logpath, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, o0666) assert logfd > 2 os.chdir("/") if os.fork(): os._exit(0) os.setsid() if os.fork(): os._exit(0) close_all_fds(exceptions=[logfd]) fd0 = os.open("/dev/null", os.O_RDONLY) if fd0 != 0: os.dup2(fd0, 0) os.close(fd0) os.dup2(logfd, 1) os.dup2(logfd, 2) os.close(logfd) # Make these line-buffered: sys.stdout = os.fdopen(1, "w", 1) sys.stderr = os.fdopen(2, "w", 1) # Write out a shell-script so that we can start our proxy in a clean # environment: scriptfile = open(scriptpath, "w") # Unix is a little silly sometimes: umask = os.umask(0) os.umask(umask) if hasattr(os, "fchmod"): os.fchmod(scriptfile.fileno(), o0700 & ~umask) else: os.chmod(scriptpath, o0700 & ~umask) scriptfile.write(xpra_runner_shell_script(xpra_file, starting_dir)) scriptfile.close() # Do this after writing out the shell script: os.environ["DISPLAY"] = display_name if not clobber: # We need to set up a new server environment xauthority = os.environ.get("XAUTHORITY", os.path.expanduser("~/.Xauthority")) xvfb_cmd = opts.xvfb.replace("$XAUTHORITY", xauthority).split() xvfb_executable = xvfb_cmd[0] xvfb_cmd[0] = "%s-for-Xpra-%s" % (xvfb_executable, display_name) try: xvfb = subprocess.Popen(xvfb_cmd + [display_name], executable=xvfb_executable) except OSError, e: sys.stderr.write("Error starting Xvfb: %s\n" % (e, )) return raw_cookie = os.urandom(16) baked_cookie = raw_cookie.encode("hex") try: code = subprocess.call([ "xauth", "add", display_name, "MIT-MAGIC-COOKIE-1", baked_cookie ]) if code != 0: raise OSError("non-zero exit code: %s" % code) except OSError, e: sys.stderr.write("Error running xauth: %s\n" % e)
def run_server(parser, opts, mode, xpra_file, extra_args): if len(extra_args) != 1: parser.error("need exactly 1 extra argument") display_name = extra_args.pop(0) if display_name == ":0": print("WARNING:") print( "You are attempting to run the xpra server against the default X11 display '%s'." % display_name) print("This is generally not what you want.") print( "You should probably use a higher display number just to avoid any confusion (and also this warning message)." ) if opts.exit_with_children and not opts.children: print( "--exit-with-children specified without any children to spawn; exiting immediately" ) return 1 atexit.register(run_cleanups) signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) assert mode in ("start", "upgrade") upgrading = (mode == "upgrade") from xpra.scripts.main import get_default_socket_dir dotxpra = DotXpra(opts.sockdir or get_default_socket_dir()) # This used to be given a display-specific name, but now we give it a # single fixed name and if multiple servers are started then the last one # will clobber the rest. This isn't great, but the tradeoff is that it # makes it possible to use bare 'ssh:hostname' display names and # autodiscover the proper numeric display name when only one xpra server # is running on the remote host. Might need to revisit this later if # people run into problems or autodiscovery turns out to be less useful # than expected. scriptpath = os.path.join(dotxpra.confdir(), "run-xpra") # Save the starting dir now, because we'll lose track of it when we # daemonize: starting_dir = os.getcwd() # Daemonize: if opts.daemon: logpath = dotxpra.conf_path(display_name) + ".log" sys.stderr.write("Entering daemon mode; " + "any further errors will be reported to:\n" + (" %s\n" % logpath)) # Do some work up front, so any errors don't get lost. if os.path.exists(logpath): os.rename(logpath, logpath + ".old") logfd = os.open(logpath, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, o0666) assert logfd > 2 os.chdir("/") if os.fork(): os._exit(0) os.setsid() if os.fork(): os._exit(0) close_all_fds(exceptions=[logfd]) fd0 = os.open("/dev/null", os.O_RDONLY) if fd0 != 0: os.dup2(fd0, 0) os.close(fd0) os.dup2(logfd, 1) os.dup2(logfd, 2) os.close(logfd) # Make these line-buffered: sys.stdout = os.fdopen(1, "w", 1) sys.stderr = os.fdopen(2, "w", 1) # Write out a shell-script so that we can start our proxy in a clean # environment: scriptfile = open(scriptpath, "w") # Unix is a little silly sometimes: umask = os.umask(0) os.umask(umask) if hasattr(os, "fchmod"): os.fchmod(scriptfile.fileno(), o0700 & ~umask) else: os.chmod(scriptpath, o0700 & ~umask) scriptfile.write( xpra_runner_shell_script(xpra_file, starting_dir, opts.sockdir)) scriptfile.close() # Initialize the sockets before the display, # That way, errors won't make us kill the Xvfb # (which may not be ours to kill at that point) sockets = [] if opts.bind_tcp: try: tcp_socket = create_tcp_socket(parser, opts.bind_tcp) sockets.append(tcp_socket) def cleanup_tcp_socket(): print("closing tcp socket %s" % opts.bind_tcp) try: tcp_socket.close() except: pass _cleanups.append(cleanup_tcp_socket) except Exception, e: print("cannot start - failed to create tcp socket at %s: %s" % (opts.bind_tcp, e)) return 1
def run_server(parser, opts, mode, xpra_file, extra_args): if len(extra_args) != 1: parser.error("need exactly 1 extra argument") display_name = extra_args.pop(0) if opts.exit_with_children and not opts.children: print("--exit-with-children specified without any children to spawn; exiting immediately") return atexit.register(run_cleanups) signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) assert mode in ("start", "upgrade") upgrading = (mode == "upgrade") dotxpra = DotXpra(opts.sockdir) # This used to be given a display-specific name, but now we give it a # single fixed name and if multiple servers are started then the last one # will clobber the rest. This isn't great, but the tradeoff is that it # makes it possible to use bare 'ssh:hostname' display names and # autodiscover the proper numeric display name when only one xpra server # is running on the remote host. Might need to revisit this later if # people run into problems or autodiscovery turns out to be less useful # than expected. scriptpath = os.path.join(dotxpra.confdir(), "run-xpra") # Save the starting dir now, because we'll lose track of it when we # daemonize: starting_dir = os.getcwd() clobber = upgrading or opts.use_display try: sockpath = dotxpra.server_socket_path(display_name, clobber) except ServerSockInUse: parser.error("You already have an xpra server running at %s\n" " (did you want 'xpra upgrade'?)" % (display_name,)) # Daemonize: if opts.daemon: logpath = dotxpra.conf_path(display_name) + ".log" sys.stderr.write("Entering daemon mode; " + "any further errors will be reported to:\n" + (" %s\n" % logpath)) # Do some work up front, so any errors don't get lost. if os.path.exists(logpath): os.rename(logpath, logpath + ".old") logfd = os.open(logpath, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, o0666) assert logfd > 2 os.chdir("/") if os.fork(): os._exit(0) os.setsid() if os.fork(): os._exit(0) close_all_fds(exceptions=[logfd]) fd0 = os.open("/dev/null", os.O_RDONLY) if fd0 != 0: os.dup2(fd0, 0) os.close(fd0) os.dup2(logfd, 1) os.dup2(logfd, 2) os.close(logfd) # Make these line-buffered: sys.stdout = os.fdopen(1, "w", 1) sys.stderr = os.fdopen(2, "w", 1) # Write out a shell-script so that we can start our proxy in a clean # environment: scriptfile = open(scriptpath, "w") # Unix is a little silly sometimes: umask = os.umask(0) os.umask(umask) if hasattr(os, "fchmod"): os.fchmod(scriptfile.fileno(), o0700 & ~umask) else: os.chmod(scriptpath, o0700 & ~umask) scriptfile.write(xpra_runner_shell_script(xpra_file, starting_dir)) scriptfile.close() # Do this after writing out the shell script: os.environ["DISPLAY"] = display_name if not clobber: # We need to set up a new server environment xauthority = os.environ.get("XAUTHORITY", os.path.expanduser("~/.Xauthority")) xvfb_cmd = opts.xvfb.replace("$XAUTHORITY", xauthority).split() xvfb_executable = xvfb_cmd[0] xvfb_cmd[0] = "%s-for-Xpra-%s" % (xvfb_executable, display_name) try: xvfb = subprocess.Popen(xvfb_cmd+[display_name], executable=xvfb_executable) except OSError, e: sys.stderr.write("Error starting Xvfb: %s\n" % (e,)) return raw_cookie = os.urandom(16) baked_cookie = raw_cookie.encode("hex") try: code = subprocess.call(["xauth", "add", display_name, "MIT-MAGIC-COOKIE-1", baked_cookie]) if code != 0: raise OSError("non-zero exit code: %s" % code) except OSError, e: sys.stderr.write("Error running xauth: %s\n" % e)