def run_server(parser, opts, mode, xpra_file, extra_args): if opts.encoding and opts.encoding=="help": from xpra.codecs.loader import encodings_help from xpra.server.server_base import ServerBase print("xpra server supports the following encodings:\n * %s" % ("\n * ".join(encodings_help(ServerBase().encodings)))) return 0 assert mode in ("start", "upgrade", "shadow", "proxy") starting = mode == "start" upgrading = mode == "upgrade" shadowing = mode == "shadow" proxying = mode == "proxy" clobber = upgrading or opts.use_display #get the display name: if shadowing and len(extra_args)==0: from xpra.scripts.main import guess_X11_display display_name = guess_X11_display() else: if len(extra_args) != 1: parser.error("need exactly 1 extra argument") display_name = extra_args.pop(0) if not shadowing and not proxying: display_name_check(display_name) if not shadowing and not proxying and opts.exit_with_children and not opts.start_child: sys.stderr.write("--exit-with-children specified without any children to spawn; exiting immediately") return 1 atexit.register(run_cleanups) #the server class will usually override those: signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) dotxpra = DotXpra(opts.socket_dir) # Generate the script text now, because os.getcwd() will # change if/when we daemonize: script = xpra_runner_shell_script(xpra_file, os.getcwd(), opts.socket_dir) # Daemonize: if opts.daemon: logfd = open_log_file(dotxpra, opts.log_file, display_name) assert logfd > 2 daemonize(logfd) # Write out a shell-script so that we can start our proxy in a clean # environment: write_runner_shell_script(dotxpra, script) from xpra.log import Logger log = Logger() try: # 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) bind_tcp = parse_bind_tcp(opts.bind_tcp) sockets = [] mdns_info = {"display" : display_name, "username": getpass.getuser()} if opts.session_name: mdns_info["session"] = opts.session_name #tcp: for host, iport in bind_tcp: socket = setup_tcp_socket(host, iport) sockets.append(socket) #unix: socket, cleanup_socket = setup_local_socket(dotxpra, display_name, clobber, opts.mmap_group) if socket: #win32 returns None! sockets.append(socket) if opts.mdns: ssh_port = get_ssh_port() if ssh_port: mdns_publish(display_name, "ssh", [("", ssh_port)], mdns_info) if opts.mdns: mdns_publish(display_name, "tcp", bind_tcp, mdns_info) except Exception, e: log.error("cannot start server: failed to setup sockets: %s", e) return 1
def run_client(parser, opts, extra_args, mode): if mode=="screenshot": if len(extra_args)==0: parser.error("invalid number of arguments for screenshot mode") screenshot_filename = extra_args[0] extra_args = extra_args[1:] if opts.compression_level < 0 or opts.compression_level > 9: parser.error("Compression level must be between 0 and 9 inclusive.") if opts.quality!=-1 and (opts.quality < 0 or opts.quality > 100): parser.error("Quality must be between 0 and 100 inclusive. (or -1 to disable)") def connect(): return connect_or_fail(pick_display(parser, opts, extra_args)) if mode=="screenshot": from xpra.client.gobject_client_base import ScreenshotXpraClient app = ScreenshotXpraClient(connect(), opts, screenshot_filename) elif mode=="info": from xpra.client.gobject_client_base import InfoXpraClient app = InfoXpraClient(connect(), opts) elif mode=="control": from xpra.client.gobject_client_base import ControlXpraClient if len(extra_args)<=1: parser.error("not enough arguments for 'control' mode") args = extra_args[1:] extra_args = extra_args[:1] app = ControlXpraClient(connect(), opts) app.set_command_args(args) elif mode=="version": from xpra.client.gobject_client_base import VersionXpraClient app = VersionXpraClient(connect(), opts) elif mode=="detach": from xpra.client.gobject_client_base import DetachXpraClient app = DetachXpraClient(connect(), opts) else: if mode in ("attach"): sys.stdout.write("xpra client version %s\n" % XPRA_VERSION) sys.stdout.flush() app = make_client(parser.error, opts) if opts.encoding: #fix old encoding names if needed: from xpra.codecs.loader import encodings_help err = opts.encoding not in app.get_encodings() if err and opts.encoding!="help": print("invalid encoding: %s" % opts.encoding) if opts.encoding=="help" or err: print("%s xpra client supports the following encodings:\n * %s" % (app.client_toolkit(), "\n * ".join(encodings_help(app.get_encodings())))) if err: return 1 return 0 layouts = app.get_supported_window_layouts() or ["default"] layouts_str = ", ".join(layouts) if opts.window_layout and opts.window_layout.lower()=="help": print("%s supports the following layouts: %s" % (app.client_toolkit(), layouts_str)) return 0 if opts.window_layout not in layouts: parser.error("window layout '%s' is not supported by the %s toolkit, valid options are: %s" % (opts.window_layout, app.client_toolkit(), layouts_str)) conn = connect() def handshake_complete(*args): from xpra.log import Logger log = Logger() log.info("Attached to %s (press Control-C to detach)\n" % conn.target) if hasattr(app, "connect"): app.connect("handshake-complete", handshake_complete) app.setup_connection(conn) app.init(opts) return do_run_client(app)