Beispiel #1
0
def PIL_logging_workaround():
    import logging

    PIL_DEBUG = os.environ.get("XPRA_PIL_DEBUG", "0") == "1"
    if PIL_DEBUG:
        from xpra.log import Logger

        log = Logger("util")
        log.info("enabling PIL.DEBUG")
        level = logging.DEBUG
    else:
        level = logging.INFO

    # newer versions use this logger,
    # we must initialize it before we load the class:
    for x in ("Image", "PngImagePlugin", "WebPImagePlugin", "JpegImagePlugin"):
        logger = logging.getLogger("PIL.%s" % x)
        logger.setLevel(level)
    import PIL
    from PIL import Image

    assert PIL and Image
    if hasattr(Image, "DEBUG"):
        # for older versions (pre 3.0), use Image.DEBUG flag:
        Image.DEBUG = int(PIL_DEBUG)
Beispiel #2
0
def log_screen_sizes(root_w, root_h, sizes):
    try:
        do_log_screen_sizes(root_w, root_h, sizes)
    except Exception as e:
        from xpra.log import Logger
        log = Logger("screen")
        log.warn("failed to parse screen size information: %s", e, exc_info=True)
Beispiel #3
0
class ChildReaper(object):
    def __init__(self, quit_cb, children_pids={}):
        self._quit = quit_cb
        self._children_pids = children_pids
        self._dead_pids = set()
        from xpra.log import Logger
        self._logger = Logger()

    def check(self):
        if self._children_pids:
            pids = set(self._children_pids.keys())
            if pids.issubset(self._dead_pids):
                self._quit()

    def sigchld(self, signum, frame):
        self.reap()

    def add_dead_pid(self, pid):
        if pid not in self._dead_pids:
            cmd = self._children_pids.get(pid)
            if cmd:
                self._logger.info("child '%s' with pid %s has terminated", cmd, pid)
            self._dead_pids.add(pid)
            self.check()

    def reap(self):
        while True:
            try:
                pid, _ = os.waitpid(-1, os.WNOHANG)
            except OSError:
                break
            if pid == 0:
                break
            self.add_dead_pid(pid)
Beispiel #4
0
def start_children(child_reaper, cwd, commands, fake_xinerama):
    assert os.name == "posix"
    from xpra.log import Logger

    log = Logger("server")
    env = os.environ.copy()
    # add fake xinerama:
    if fake_xinerama:
        libfakeXinerama_so = find_fakeXinerama()
        if libfakeXinerama_so:
            env["LD_PRELOAD"] = libfakeXinerama_so
    # disable ubuntu's global menu using env vars:
    env.update(
        {
            "UBUNTU_MENUPROXY": "",
            "QT_X11_NO_NATIVE_MENUBAR": "1",
            "MWNOCAPTURE": "true",
            "MWNO_RIT": "true",
            "MWWM": "allwm",
        }
    )
    for child_cmd in commands:
        if not child_cmd:
            continue
        try:
            proc = subprocess.Popen(child_cmd, stdin=subprocess.PIPE, env=env, cwd=cwd, shell=True, close_fds=True)
            child_reaper.add_process(proc, child_cmd)
            log.info("started child '%s' with pid %s", child_cmd, proc.pid)
        except OSError, e:
            sys.stderr.write("Error spawning child '%s': %s\n" % (child_cmd, e))
Beispiel #5
0
def do_get_resources_dir():
    rsc = None
    RESOURCES = "/Resources/"
    #FUGLY warning: importing gtkosx_application causes the dock to appear,
    #and in some cases we don't want that.. so use the env var XPRA_SKIP_UI as workaround for such cases:
    if os.environ.get("XPRA_SKIP_UI", "0")=="0":
        try:
            import gtkosx_application        #@UnresolvedImport
            try:
                rsc = gtkosx_application.gtkosx_application_get_resource_path()
                debug("get_resources_dir() gtkosx_application_get_resource_path=%s", rsc)
            except:
                #maybe we're not running from an app bundle?
                pass
        except:
            #delayed import to prevent cycles:
            from xpra.log import Logger
            log = Logger("util")
            log.error("ERROR: gtkosx_application module is missing - trying to continue anyway")
    else:
        debug("XPRA_SKIP_UI is set, not importing gtkosx_application")
    if rsc is None:
        #try using the path to this file to find the resource path:
        rsc = __file__
    i = rsc.rfind(RESOURCES)
    if i<=0:
        #last fallback: try the default app dir
        from xpra.platform.paths import default_get_app_dir
        rsc = default_get_app_dir()
        debug("get_resources_dir() default_get_app_dir()=%s", rsc)
    i = rsc.rfind(RESOURCES)
    if i>0:
        rsc = rsc[:i+len(RESOURCES)]
    debug("get_resources_dir()=%s", rsc)
    return rsc
Beispiel #6
0
def start_children(child_reaper, commands, fake_xinerama):
    assert os.name=="posix"
    from xpra.log import Logger
    log = Logger()
    env = os.environ.copy()
    #add fake xinerama:
    if fake_xinerama:
        #locate the fakeXinerama lib:
        #it would be better to rely on dlopen to find the paths
        #but I cannot find a way of getting ctypes to tell us the path
        #it found the library in
        libpaths = os.environ.get("LD_LIBRARY_PATH", "").split(":")
        libpaths.append("/usr/lib64")
        libpaths.append("/usr/lib")
        for libpath in libpaths:
            if not libpath or not os.path.exists(libpath):
                continue
            libfakeXinerama_so = "%s/%s" % (libpath, "libfakeXinerama.so.1")
            if os.path.exists(libfakeXinerama_so):
                env["LD_PRELOAD"] = libfakeXinerama_so
    #disable ubuntu's global menu using env vars:
    env.update({
        "UBUNTU_MENUPROXY"          : "",
        "QT_X11_NO_NATIVE_MENUBAR"  : "1"})
    for child_cmd in commands:
        if not child_cmd:
            continue
        try:
            proc = subprocess.Popen(child_cmd, stdin=subprocess.PIPE, env=env, shell=True, close_fds=True)
            child_reaper.add_process(proc, child_cmd)
            log.info("started child '%s' with pid %s", child_cmd, proc.pid)
        except OSError, e:
            sys.stderr.write("Error spawning child '%s': %s\n" % (child_cmd, e))
Beispiel #7
0
    def err(*msg):
        """ log an error message and return None """
        from xpra.log import Logger

        log = Logger("icon")
        log.error(*msg)
        return None
Beispiel #8
0
def log_screen_sizes(root_w, root_h, ss):
    try:
        do_log_screen_sizes(root_w, root_h, ss)
    except Exception, e:
        from xpra.log import Logger
        log = Logger()
        log.warn("failed to parse screen size information: %s", e)
Beispiel #9
0
def get_sys_info():
    info = {}
    try:
        import resource
        for k, constant in {"server"   : "RUSAGE_SELF",
                         "children" : "RUSAGE_CHILDREN",
                         "total"    : "RUSAGE_BOTH"}.items():
            try:
                v = getattr(resource, constant)
            except (NameError, AttributeError):
                continue
            stats = resource.getrusage(v)
            prefix = "memory.%s." % k
            for var in ("utime", "stime", "maxrss",
                        "ixrss", "idrss", "isrss",
                        "minflt", "majflt", "nswap",
                        "inblock", "oublock",
                        "msgsnd", "msgrcv",
                        "nsignals", "nvcsw", "nivcsw"):
                value = getattr(stats, "ru_%s" % var)
                if type(value)==float:
                    value = int(value)
                info[prefix+var] = value
    except:
        from xpra.log import Logger
        log = Logger()
        log.error("error getting memory usage info", exc_info=True)
    return info
Beispiel #10
0
def log_screen_sizes(root_w, root_h, sizes):
    try:
        do_log_screen_sizes(root_w, root_h, sizes)
    except Exception:
        from xpra.log import Logger
        log = Logger("util")
        log.warn("failed to parse screen size information: %s", sys.exc_info()[1])
Beispiel #11
0
def get_sys_info():
    try:
        from xpra.platform.xposix.info import get_sys_info as xposix_get_sys_info
        return xposix_get_sys_info()
    except:
        from xpra.log import Logger
        log = Logger("osx")
        log.error("error getting memory usage info", exc_info=True)
    return  {}
Beispiel #12
0
def setbinarymode(fd):
    if WIN32:
        #turn on binary mode:
        try:
            import msvcrt
            msvcrt.setmode(fd, os.O_BINARY)         #@UndefinedVariable
        except:
            from xpra.log import Logger
            log = Logger("util")
            log.error("setting stdin to binary mode failed", exc_info=True)
Beispiel #13
0
def get_icc_info():
    from xpra.log import Logger

    log = Logger("platform")
    info = {}
    try:
        from PIL.ImageCms import (
            get_display_profile,
            getProfileName,
            getProfileInfo,
            getProfileCopyright,
            getProfileManufacturer,
            getProfileModel,
            getProfileDescription,
            getDefaultIntent,
            INTENT_PERCEPTUAL,
            INTENT_RELATIVE_COLORIMETRIC,
            INTENT_SATURATION,
            INTENT_ABSOLUTE_COLORIMETRIC,
        )

        INTENT_STR = {
            INTENT_PERCEPTUAL: "perceptual",
            INTENT_RELATIVE_COLORIMETRIC: "relative-colorimetric",
            INTENT_SATURATION: "saturation",
            INTENT_ABSOLUTE_COLORIMETRIC: "absolute-colorimetric",
        }

        def getDefaultIntentStr(_p):
            return INTENT_STR.get(getDefaultIntent(_p), "unknown")

        def getData(_p):
            return _p.tobytes()

        p = get_display_profile()
        if p:
            for (k, fn) in {
                "name": getProfileName,
                "info": getProfileInfo,
                "copyright": getProfileCopyright,
                "manufacturer": getProfileManufacturer,
                "model": getProfileModel,
                "description": getProfileDescription,
                "default-intent": getDefaultIntentStr,
                "data": getData,
            }.items():
                try:
                    v = fn(p)
                    info[k] = v
                except Exception as e:
                    log("ICC profile error on %s using %s: %s", k, fn, e)
    except Exception as e:
        log.warn("Warning: cannot query ICC profiles:")
        log.warn(" %s", e)
    return info
Beispiel #14
0
def mdns_publish(display_name, mode, listen_on, text_dict={}):
    try:
        from xpra.net.avahi_publisher import AvahiPublishers
    except Exception, e:
        global MDNS_WARNING
        if not MDNS_WARNING:
            MDNS_WARNING = True
            from xpra.log import Logger
            log = Logger("mdns")
            log.error("failed to load the mdns avahi publisher: %s", e)
            log.error("either fix your installation or use the '--no-mdns' flag")
        return
Beispiel #15
0
def get_icc_info():
    from xpra.log import Logger
    log = Logger("platform")
    ENV_ICC_DATA = os.environ.get("XPRA_ICC_DATA")
    if ENV_ICC_DATA:
        import binascii
        return {
                "source"    : "environment-override",
                "data"      : binascii.unhexlify(ENV_ICC_DATA),
                }
    info = {}
    try:
        from PIL import ImageCms
        from PIL.ImageCms import get_display_profile, getDefaultIntent
        INTENT_STR = {}
        for x in ("PERCEPTUAL", "RELATIVE_COLORIMETRIC", "SATURATION", "ABSOLUTE_COLORIMETRIC"):
            v = getattr(ImageCms, "INTENT_%s" % x, None)
            if v:
                INTENT_STR[v] = x.lower().replace("_", "-")
        log("get_icc_info() intents=%s", INTENT_STR)
        def getDefaultIntentStr(_p):
            return INTENT_STR.get(getDefaultIntent(_p), "unknown")
        def getData(_p):
            return _p.tobytes()
        p = get_display_profile()
        log("get_icc_info() display_profile=%s", p)
        if p:
            for (k, fn) in {
                            "name"          : "getProfileName",
                            "info"          : "getProfileInfo",
                            "copyright"     : "getProfileCopyright",
                            "manufacturer"  : "getProfileManufacturer",
                            "model"         : "getProfileModel",
                            "description"   : "getProfileDescription",
                            "default-intent": "getDefaultIntentStr",
                            "data"          : "getData",
                            }.items():
                m = getattr(ImageCms, fn, None)
                if not m:
                    log("%s lacks %s", ImageCms, fn)
                    continue
                try:
                    v = m(p)
                    info[k] = v
                except Exception as e:
                    log("ICC profile error on %s using %s: %s", k, fn, e)
    except Exception as e:
        log("get_icc_info()", exc_info=True)
        log.warn("Warning: cannot query ICC profiles:")
        log.warn(" %s", e)
    return info
Beispiel #16
0
def do_log_screen_sizes(root_w, root_h, sizes):
    from xpra.log import Logger

    log = Logger()
    # old format, used by some clients (android):
    if type(sizes) not in (tuple, list):
        return
    if any(True for x in sizes if type(x) not in (tuple, list)):
        return

    def dpi(size_pixels, size_mm):
        if size_mm == 0:
            return 0
        return int(size_pixels * 254 / size_mm / 10)

    for s in sizes:
        if len(s) < 10:
            log.info(" %s", s)
            continue
        # more detailed output:
        display_name, width, height, width_mm, height_mm, monitors, work_x, work_y, work_width, work_height = s[:10]
        # always log plug name:
        info = ["'%s'" % prettify_plug_name(display_name)]
        if width != root_w or height != root_h:
            # log plug dimensions if not the same as display (root):
            info.append("%sx%s" % (width, height))
        info.append("(%sx%s mm - DPI: %sx%s)" % (width_mm, height_mm, dpi(width, width_mm), dpi(height, height_mm)))

        def add_workarea(wx, wy, ww, wh):
            info.append("workarea: %sx%s" % (ww, wh))
            if wx != 0 or wy != 0:
                # log position if not (0, 0)
                info.append("at %sx%s" % (wx, wy))

        if work_width != width or work_height != height or work_x != 0 or work_y != 0:
            add_workarea(work_x, work_y, work_width, work_height)
        log.info("  " + " ".join(info))
        for i, m in enumerate(monitors, start=1):
            if len(m) < 7:
                log.info("    %s", m)
                continue
            plug_name, plug_x, plug_y, plug_width, plug_height, plug_width_mm, plug_height_mm = m[:7]
            info = ["%s" % prettify_plug_name(plug_name, "monitor %s" % i)]
            if plug_width != width or plug_height != height or plug_x != 0 or plug_y != 0:
                info.append("%sx%s" % (plug_width, plug_height))
                if plug_x != 0 or plug_y != 0:
                    info.append("at %sx%s" % (plug_x, plug_y))
            if (plug_width_mm != width_mm or plug_height_mm != height_mm) and (plug_width_mm > 0 or plug_height_mm > 0):
                info.append(
                    "(%sx%s mm - DPI: %sx%s)"
                    % (plug_width_mm, plug_height_mm, dpi(plug_width, plug_width_mm), dpi(plug_height, plug_height_mm))
                )
            if len(m) >= 11:
                work_x, work_y, work_width, work_height = m[7:11]
                add_workarea(work_x, work_y, work_width, work_height)
            log.info("    " + " ".join(info))
Beispiel #17
0
def ival(key, default, minv=0, maxv=None):
    try:
        v = os.environ.get("XPRA_BATCH_%s" % key)
        if v is None:
            return default
        iv = int(v)
        assert minv is None or minv<=iv, "value for %s is too small: %s (minimum is %s)" % (key, iv, minv)
        assert maxv is None or maxv>=iv, "value for %s is too high: %s (maximum is %s)" % (key, iv, maxv)
        return iv
    except Exception as e:
        from xpra.log import Logger
        log = Logger("util")
        log.warn("failed to parse value '%s' for %s: %s", v, key, e)
        return default
Beispiel #18
0
def set_application_name(name):
    global NAME_SET
    if NAME_SET:
        return
    NAME_SET = True
    from xpra.log import Logger
    log = Logger()
    if sys.version_info[:2]<(2,5):
        log.warn("Python %s is too old!", sys.version_info)
        return
    try:
        import glib
        glib.set_application_name(name or "Xpra")
    except ImportError, e:
        log.warn("glib is missing, cannot set the application name, please install glib's python bindings: %s", e)
Beispiel #19
0
def parse_simple_dict(s="", sep=","):
    #parse the options string and add the pairs:
    d = {}
    for s in s.split(sep):
        if not s:
            continue
        try:
            k,v = s.split("=", 1)
            d[k] = v
        except Exception as e:
            from xpra.log import Logger
            log = Logger("util")
            log.warn("Warning: failed to parse dictionary option '%s':", s)
            log.warn(" %s", e)
    return d
Beispiel #20
0
    def __init__(self, event_cb, events=CONSOLE_EXIT_EVENTS):
        self.event_cb = event_cb
        self.events = events
        self.result = 0
        from xpra.log import Logger

        self.log = Logger("win32")
Beispiel #21
0
def mdns_publish(display_name, mode, listen_on, text_dict={}):
    try:
        from xpra.net.avahi_publisher import AvahiPublishers
    except Exception as e:
        global MDNS_WARNING
        if not MDNS_WARNING:
            MDNS_WARNING = True
            from xpra.log import Logger
            log = Logger("mdns")
            log.error("failed to load the mdns avahi publisher: %s", e)
            log.error("either fix your installation or use the '--no-mdns' flag")
        return
    d = text_dict.copy()
    d["mode"] = mode
    ap = AvahiPublishers(listen_on, "Xpra %s %s" % (mode, display_name), text_dict=d)
    _when_ready.append(ap.start)
    _cleanups.append(ap.stop)
Beispiel #22
0
def main():
    log = Logger("client")
    from xpra.client.gtk2.tray_menu import GTK2TrayMenu
    client = FakeClient()
    log.info("creating tray menu")
    tray = GTK2TrayMenu(client)
    client.menu = tray.build()
    client.fire_handshake_callbacks()
    log.info("creating tray widget")
    def tray_click(button, pressed, time=0):
        log.info("tray_click(%s, %s, %s)", button, pressed, time)
        if button==1 and pressed:
            glib.idle_add(tray.activate, button, time)
        elif button==3 and not pressed:
            glib.idle_add(tray.popup, button, time)
    def tray_mouseover(*args):
        log.info("tray_mouseover(%s)", args)
    def tray_exit(*args):
        log.info("tray_exit(%s)", args)
        gtk.main_quit()
    def tray_geometry(*args):
        log.info("tray_geometry%s", args)
    GTKStatusIconTray(client, client.menu, "test", None, size_changed_cb=tray_geometry(), click_cb=tray_click, mouseover_cb=tray_mouseover, exit_cb=tray_exit)
    log.info("running main loop")
    gtk.main()
Beispiel #23
0
def start_children(child_reaper, commands):
    assert os.name=="posix"
    from xpra.log import Logger
    log = Logger()
    #disable ubuntu's global menu using env vars:
    env = os.environ.copy()
    env.update({
        "UBUNTU_MENUPROXY"          : "",
        "QT_X11_NO_NATIVE_MENUBAR"  : "1"})
    for child_cmd in commands:
        if not child_cmd:
            continue
        try:
            proc = subprocess.Popen(child_cmd, stdin=subprocess.PIPE, env=env, shell=True, close_fds=True)
            child_reaper.add_process(proc, child_cmd)
            log.info("started child '%s' with pid %s", child_cmd, proc.pid)
        except OSError, e:
            sys.stderr.write("Error spawning child '%s': %s\n" % (child_cmd, e))
Beispiel #24
0
def main():
    from xpra.log import Logger
    log = Logger("util")
    sp = sys.platform
    log.info("platform_name(%s)=%s", sp, platform_name(sp, ""))
    log.info("get_machine_id()=%s", get_machine_id())
    log.info("get_hex_uuid()=%s", get_hex_uuid())
    log.info("get_int_uuid()=%s", get_int_uuid())
Beispiel #25
0
def start_pulseaudio(child_reaper, pulseaudio_command):
    from xpra.log import Logger

    log = Logger("sound")
    log("pulseaudio_command=%s", pulseaudio_command)
    pa_proc = subprocess.Popen(pulseaudio_command, stdin=subprocess.PIPE, shell=True, close_fds=True)
    child_reaper.add_process(pa_proc, "pulseaudio", ignore=True)
    log.info("pulseaudio server started with pid %s", pa_proc.pid)

    def check_pa_start():
        if pa_proc.poll() is not None or pa_proc.pid in child_reaper._dead_pids:
            log.warn(
                "Warning: pulseaudio has terminated. Either fix the pulseaudio command line or use --no-pulseaudio to avoid this warning."
            )
            log.warn(
                " usually, only a single pulseaudio instance can be running for each user account, and one may be running already"
            )
        return False

    gobject.timeout_add(1000 * 2, check_pa_start)

    def cleanup_pa():
        log(
            "cleanup_pa() process.poll()=%s, pid=%s, dead_pids=%s", pa_proc.poll(), pa_proc.pid, child_reaper._dead_pids
        )
        if pa_proc.poll() is None and pa_proc.pid not in child_reaper._dead_pids:
            log.info("stopping pulseaudio with pid %s", pa_proc.pid)
            try:
                # first we try pactl (required on Ubuntu):
                from xpra.scripts.exec_util import safe_exec

                r, _, _ = safe_exec(["pactl", "exit"])
                # warning: pactl will return 0 whether it succeeds or not...
                # but we can't kill the process because Ubuntu starts a new one
                if r != 0:
                    # fallback to using SIGINT:
                    pa_proc.terminate()
            except:
                log.warn("error trying to stop pulseaudio", exc_info=True)

    _cleanups.append(cleanup_pa)
Beispiel #26
0
class console_event_catcher(object):
    def __init__(self, event_cb, events=CONSOLE_EXIT_EVENTS):
        self.event_cb = event_cb
        self.events = events
        self.result = 0
        from xpra.log import Logger

        self.log = Logger("win32")

    def __enter__(self):
        try:
            self.result = win32api.SetConsoleCtrlHandler(self.handle_console_event, 1)
            if self.result == 0:
                self.log.error("could not SetConsoleCtrlHandler (error %r)", win32api.GetLastError())
        except Exception as e:
            self.log.error("SetConsoleCtrlHandler error: %s", e)

    def __exit__(self, exc_type, exc_val, exc_tb):
        try:
            win32api.SetConsoleCtrlHandler(None, 0)
        except:
            pass

    def __repr__(self):
        return "console_event_catcher(%s, %s)" % (self.event_cb, self.events)

    def handle_console_event(self, event):
        self.log("handle_console_event(%s)", event)
        if event in self.events:
            self.log.info("received console event %s", event)
            self.event_cb(event)
Beispiel #27
0
def main():
    import logging
    logging.basicConfig(format="%(asctime)s %(message)s")
    logging.root.setLevel(logging.INFO)
    from xpra.log import Logger
    log = Logger("")
    sp = sys.platform
    log.info("platform_name(%s)=%s", sp, platform_name(sp, ""))
    log.info("get_machine_id()=%s", get_machine_id())
    log.info("get_hex_uuid()=%s", get_hex_uuid())
    log.info("get_int_uuid()=%s", get_int_uuid())
Beispiel #28
0
def start_pulseaudio(child_reaper, pulseaudio_command):
    from xpra.log import Logger
    log = Logger("sound")
    log("pulseaudio_command=%s", pulseaudio_command)
    pa_proc = subprocess.Popen(pulseaudio_command, stdin=subprocess.PIPE, shell=True, close_fds=True)
    child_reaper.add_process(pa_proc, "pulseaudio", ignore=True)
    log.info("pulseaudio server started with pid %s", pa_proc.pid)
    def check_pa_start():
        if pa_proc.poll() is not None or pa_proc.pid in child_reaper._dead_pids:
            log.warn("Warning: pulseaudio has terminated. Either fix the pulseaudio command line or use --no-pulseaudio to avoid this warning.")
            log.warn(" usually, only a single pulseaudio instance can be running for each user account, and one may be running already")
        return False
    gobject.timeout_add(1000*2, check_pa_start)
    def cleanup_pa():
        log("cleanup_pa() process.poll()=%s, pid=%s, dead_pids=%s", pa_proc.poll(), pa_proc.pid, child_reaper._dead_pids)
        if pa_proc.poll() is None and pa_proc.pid not in child_reaper._dead_pids:
            log.info("stopping pulseaudio with pid %s", pa_proc.pid)
            try:
                pa_proc.terminate()
            except:
                log.warn("error trying to stop pulseaudio", exc_info=True)
    _cleanups.append(cleanup_pa)
Beispiel #29
0
 def abort_test(action):
     """ if ssh dies, we don't need to try to read/write from its sockets """
     e = child.poll()
     if e is not None:
         error_message = "cannot %s using %s: the SSH process has terminated with exit code=%s" % (action, display_desc["full_ssh"], e)
         if debug_cb:
             debug_cb(error_message)
         if ssh_fail_cb:
             ssh_fail_cb(error_message)
         if "ssh_abort" not in display_desc:
             display_desc["ssh_abort"] = True
             from xpra.log import Logger
             log = Logger()
             log.error("The SSH process has terminated with exit code %s", e)
             if conn.input_bytecount==0 and conn.output_bytecount==0:
                 log.error("Connection to the xpra server via SSH failed for: %s", display_name)
                 log.error(" the command line used was: %s", cmd)
                 log.error(" check your username, hostname, display number, etc")
         raise ConnectionClosedException(error_message)
Beispiel #30
0
def main():
    import sys
    from xpra.platform import program_context, command_error
    with program_context("Webcam", "Webcam"):
        from xpra.log import Logger, add_debug_category
        log = Logger("webcam")
        if "-v" in sys.argv or "--verbose" in sys.argv:
            add_debug_category("webcam")
            log.enable_debug()
        try:
            import cv2
        except ImportError as e:
            command_error("Error: no opencv support module: %s" % e)
            return 1
        device = 0
        if len(sys.argv)==2:
            try:
                device = int(sys.argv[1])
            except:
                command_error("Warning: failed to parse value as a device number: '%s'" % sys.argv[1])
        try:
            cap = cv2.VideoCapture(device)
        except Exception as e:
            command_error("Error: failed to capture video using device %s:\n%s" % (device, e))
            return 1
        log.info("capture device for %i: %s", device, cap)
        while True:
            ret, frame = cap.read()
            if not ret:
                command_error("Error: frame capture failed using device %s" % device)
                return 1
            cv2.imshow('frame', frame)
            if cv2.waitKey(10) & 0xFF in (ord('q'), 27):
                break
        cap.release()
        cv2.destroyAllWindows()
        return 0
Beispiel #31
0
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import sys
import os
import time
import errno
import socket

from xpra.net.common import ConnectionClosedException
from xpra.util import envint, envbool, csv
from xpra.os_util import WIN32, PYTHON2, POSIX, LINUX
from xpra.platform.features import TCP_OPTIONS, IP_OPTIONS, SOCKET_OPTIONS
from xpra.log import Logger

log = Logger("network", "protocol")

SOCKET_CORK = envbool("XPRA_SOCKET_CORK", LINUX)
if SOCKET_CORK:
    try:
        assert socket.TCP_CORK > 0
    except (AttributeError, AssertionError) as cork_e:
        log.warn("Warning: unable to use TCP_CORK on %s", sys.platform)
        log.warn(" %s", cork_e)
        SOCKET_CORK = False
SOCKET_NODELAY = envbool("XPRA_SOCKET_NODELAY", None)
VSOCK_TIMEOUT = envint("XPRA_VSOCK_TIMEOUT", 5)
SOCKET_TIMEOUT = envint("XPRA_SOCKET_TIMEOUT", 20)
SSL_PEEK = envbool("XPRA_SSL_PEEK", True)
#this is more proper but would break the proxy server:
SOCKET_SHUTDOWN = envbool("XPRA_SOCKET_SHUTDOWN", False)
Beispiel #32
0
# This file is part of Xpra.
# Copyright (C) 2008 Nathaniel Smith <*****@*****.**>
# Copyright (C) 2012-2014 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import cairo

from xpra.client.gtk_base.cairo_backing_base import CairoBackingBase
from xpra.gtk_common.gtk_util import pixbuf_new_from_data, COLORSPACE_RGB
from xpra.os_util import memoryview_to_bytes

from xpra.log import Logger
log = Logger("paint", "cairo")


"""
    With python2 / gtk2, we can create an ImageSurface using either:
    * cairo.ImageSurface.create_for_data
    * pixbuf_new_from_data
    Failing that, we use the horrible roundtrip via PNG using PIL.
"""
class CairoBacking(CairoBackingBase):

    #with gtk2 we can convert these directly to a cairo image surface:
    RGB_MODES = ["ARGB", "RGBA", "RGBX", "RGB"]


    def __repr__(self):
        return "gtk2.CairoBacking(%s)" % self._backing
Beispiel #33
0
# This file is part of Xpra.
# Copyright (C) 2010 Nathaniel Smith <*****@*****.**>
# Copyright (C) 2011-2017 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

# Ubuntu re-invents the wheel, and it's a broken one

import os

from xpra.log import Logger
log = Logger("tray", "posix")

from xpra.util import envbool
from xpra.os_util import is_unity
from xpra.client.tray_base import TrayBase
from xpra.platform.paths import get_icon_dir, get_icon_filename

DELETE_TEMP_FILE = envbool("XPRA_APPINDICATOR_DELETE_TEMP_FILE", True)

_appindicator = False


def get_appindicator():
    global _appindicator
    if _appindicator is False:
        try:
            import sys
            if "gi" in sys.modules:
                import gi
                gi.require_version('AppIndicator3', '0.1')
Beispiel #34
0
# Copyright (C) 2010-2021 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import os

from xpra.codecs.codec_constants import PREFERRED_ENCODING_ORDER
from xpra.codecs.loader import load_codec, codec_versions, has_codec, get_codec
from xpra.codecs.video_helper import getVideoHelper, NO_GFX_CSC_OPTIONS
from xpra.scripts.config import parse_bool_or_int
from xpra.net import compression
from xpra.util import envint, envbool, updict, csv, typedict
from xpra.client.mixins.stub_client_mixin import StubClientMixin
from xpra.log import Logger

log = Logger("client", "encoding")

B_FRAMES = envbool("XPRA_B_FRAMES", True)
PAINT_FLUSH = envbool("XPRA_PAINT_FLUSH", True)
MAX_SOFT_EXPIRED = envint("XPRA_MAX_SOFT_EXPIRED", 5)
SEND_TIMESTAMPS = envbool("XPRA_SEND_TIMESTAMPS", False)
VIDEO_MAX_SIZE = tuple(int(x) for x in os.environ.get("XPRA_VIDEO_MAX_SIZE", "4096,4096").replace("x", ",").split(","))
SCROLL_ENCODING = envbool("XPRA_SCROLL_ENCODING", True)

#we assume that any server will support at least those:
DEFAULT_ENCODINGS = os.environ.get("XPRA_DEFAULT_ENCODINGS", "rgb32,rgb24,jpeg,png").split(",")


def get_core_encodings():
    """
        This method returns the actual encodings supported.
Beispiel #35
0
# This file is part of Xpra.
# Copyright (C) 2010-2018 Antoine Martin <*****@*****.**>
# Copyright (C) 2008, 2010 Nathaniel Smith <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import signal
import os
import sys
import socket
import string
from collections import OrderedDict

from xpra.log import Logger, is_debug_enabled
log = Logger("client")
netlog = Logger("network")
authlog = Logger("auth")
mouselog = Logger("mouse")
cryptolog = Logger("crypto")
bandwidthlog = Logger("bandwidth")

from xpra.scripts.config import InitExit, parse_with_unit
from xpra.child_reaper import getChildReaper, reaper_cleanup
from xpra.net import compression
from xpra.net.protocol import Protocol, sanity_checks
from xpra.net.net_util import get_network_caps
from xpra.net.crypto import crypto_backend_init, get_iterations, get_iv, get_salt, choose_padding, gendigest, \
    ENCRYPTION_CIPHERS, ENCRYPT_FIRST_PACKET, DEFAULT_IV, DEFAULT_SALT, DEFAULT_ITERATIONS, INITIAL_PADDING, DEFAULT_PADDING, ALL_PADDING_OPTIONS, PADDING_OPTIONS
from xpra.version_util import get_version_info, XPRA_VERSION
from xpra.platform.info import get_name
from xpra.os_util import get_machine_id, get_user_uuid, load_binary_file, SIGNAMES, PYTHON3, strtobytes, bytestostr, hexstr, monotonic_time, osexpand, BITS, WIN32, OSX
Beispiel #36
0
#!/usr/bin/env python
# This file is part of Xpra.
# Copyright (C) 2008 Nathaniel Smith <*****@*****.**>
# Copyright (C) 2011-2013 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

from xpra.log import Logger
log = Logger("keyboard")

#this allows platforms to inject keyname workarounds
# the key is a tuple (keyname, keyval, keycode)
# the value is the keyname override
KEY_TRANSLATIONS = {}


def get_gtk_keymap(ignore_keys=[None, "VoidSymbol"]):
    """
        Augment the keymap we get from gtk.gdk.keymap_get_default()
        by adding the keyval_name.
        We can also ignore some keys
    """
    from xpra.gtk_common.gtk_util import get_default_keymap, import_gdk, is_gtk3
    gdk = import_gdk()
    keymap = get_default_keymap()
    keycodes=[]
    for i in range(0, 2**8):
        entries = keymap.get_entries_for_keycode(i)
        log("%s.get_entries_for_keycode(%s)=%s", keymap, i, entries)
        if not entries:
            continue
Beispiel #37
0
# This file is part of Xpra.
# Copyright (C) 2016-2019 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

from xpra.util import envbool
from xpra.net.websockets.common import make_websocket_accept_hash
from xpra.server.http_handler import HTTPRequestHandler
from xpra.log import Logger

log = Logger("network", "websocket")

WEBSOCKET_ONLY_UPGRADE = envbool("XPRA_WEBSOCKET_ONLY_UPGRADE", False)

# HyBi-07 report version 7
# HyBi-08 - HyBi-12 report version 8
# HyBi-13 reports version 13
SUPPORT_HyBi_PROTOCOLS = ("7", "8", "13")


class WebSocketRequestHandler(HTTPRequestHandler):

    server_version = "Xpra-WebSocket-Server"

    def __init__(self, sock, addr, new_websocket_client,
                 web_root="/usr/share/xpra/www/",
                 http_headers_dir="/usr/share/xpra/http-headers", script_paths=None):
        self.new_websocket_client = new_websocket_client
        self.only_upgrade = WEBSOCKET_ONLY_UPGRADE
        super().__init__(sock, addr, web_root, http_headers_dir, script_paths)
Beispiel #38
0
class typedict(dict):

    from xpra.log import Logger
    log = Logger("util")

    def capsget(self, key, default=None):
        v = self.get(key)
        #py3k and bytes as keys...
        if v is None and type(key) == str:
            v = self.get(strtobytes(key), default)
        if sys.version >= '3' and type(v) == bytes:
            v = bytestostr(v)
        return v

    def strget(self, k, default=None):
        v = self.capsget(k, default)
        if v is None:
            return None
        return bytestostr(v)

    def intget(self, k, d=0):
        v = self.capsget(k)
        if v is None:
            return d
        try:
            return int(v)
        except Exception as e:
            typedict.log.warn("error on %s: %s", k, e)
            return d

    def boolget(self, k, default_value=False):
        return bool(self.capsget(k, default_value))

    def dictget(self, k, default_value={}):
        v = self.capsget(k, default_value)
        if v is None:
            return None
        if type(v) != dict:
            typedict.log.warn("expected a dict value for %s but got %s", k,
                              type(v))
            return default_value
        return v

    def intpair(self, k, default_value=None):
        v = self.intlistget(k, default_value)
        if v is None:
            return default_value
        if len(v) != 2:
            #"%s is not a pair of numbers: %s" % (k, len(v))
            return default_value
        try:
            return int(v[0]), int(v[1])
        except:
            return default_value

    def strlistget(self, k, default_value=[]):
        return self.listget(k, default_value, str)

    def intlistget(self, k, default_value=[]):
        return self.listget(k, default_value, int)

    def listget(self, k, default_value=[], item_type=None, max_items=None):
        v = self.capsget(k, default_value)
        if v is None:
            return default_value
        if type(v) not in (list, tuple):
            typedict.log.warn(
                "expected a list or tuple value for %s but got %s", k, type(v))
            return default_value
        aslist = list(v)
        if item_type:
            for i in range(len(aslist)):
                x = aslist[i]
                if sys.version > '3' and type(x) == bytes and item_type == str:
                    x = bytestostr(x)
                    aslist[i] = x
                elif type(x) == unicode and item_type == str:
                    x = str(x)
                    aslist[i] = x
                if type(x) != item_type:
                    typedict.log.warn(
                        "invalid item type for %s %s: expected %s but got %s",
                        type(v), k, item_type, type(x))
                    return default_value
        if max_items is not None:
            if len(v) > max_items:
                typedict.log.warn(
                    "too many items in %s %s: maximum %s allowed, but got %s",
                    type(v), k, max_items, len(v))
                return default_value
        return aslist
Beispiel #39
0
# -*- coding: utf-8 -*-
# This file is part of Xpra.
# Copyright (C) 2010-2020 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

from xpra.os_util import strtobytes
from xpra.util import engs, csv, iround
from xpra.util import log_screen_sizes
from xpra.os_util import bytestostr, get_loaded_kernel_modules
from xpra.server.mixins.stub_server_mixin import StubServerMixin
from xpra.log import Logger

log = Logger("screen")
gllog = Logger("opengl")

"""
Mixin for servers that handle displays.
"""
class DisplayManager(StubServerMixin):

    def __init__(self):
        self.randr = False
        self.bell = False
        self.cursors = False
        self.default_dpi = 96
        self.dpi = 0
        self.xdpi = 0
        self.ydpi = 0
        self.antialias = {}
        self.cursor_size = 0
Beispiel #40
0
# -*- coding: utf-8 -*-
# This file is part of Xpra.
# Copyright (C) 2011 Serviware (Arthur Huillet, <*****@*****.**>)
# Copyright (C) 2010-2018 Antoine Martin <*****@*****.**>
# Copyright (C) 2008 Nathaniel Smith <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import os.path
import hashlib

from xpra.log import Logger
printlog = Logger("printing")
filelog = Logger("file")

from xpra.simple_stats import to_std_unit
from xpra.os_util import bytestostr, WIN32
from xpra.util import engs, repr_ellipsized
from xpra.net.file_transfer import FileTransferAttributes
from xpra.server.mixins.stub_server_mixin import StubServerMixin

SAVE_PRINT_JOBS = os.environ.get("XPRA_SAVE_PRINT_JOBS", None)
"""
Mixin for servers that can handle file transfers and forwarded printers.
Printer forwarding is only supported on Posix servers with the cups backend script.
"""


class FilePrintServer(StubServerMixin):
    def __init__(self):
        self.lpadmin = ""
Beispiel #41
0
def do_log_screen_sizes(root_w, root_h, sizes):
    from xpra.log import Logger
    log = Logger("util")
    #old format, used by some clients (android):
    if type(sizes) not in (tuple, list):
        return
    if any(True for x in sizes if type(x) not in (tuple, list)):
        return

    def dpi(size_pixels, size_mm):
        if size_mm == 0:
            return 0
        return int(size_pixels * 254 / size_mm / 10)

    for s in sizes:
        if len(s) < 10:
            log.info(" %s", s)
            continue
        #more detailed output:
        display_name, width, height, width_mm, height_mm, \
        monitors, work_x, work_y, work_width, work_height = s[:10]
        #always log plug name:
        info = ["%s" % prettify_plug_name(display_name)]
        if width != root_w or height != root_h:
            #log plug dimensions if not the same as display (root):
            info.append("%ix%i" % (width, height))
        info.append("(%ix%i mm - DPI: %ix%i)" %
                    (width_mm, height_mm, dpi(
                        width, width_mm), dpi(height, height_mm)))

        def add_workarea(wx, wy, ww, wh):
            info.append("workarea: %ix%i" % (ww, wh))
            if wx != 0 or wy != 0:
                #log position if not (0, 0)
                info.append("at %ix%i" % (wx, wy))

        if work_width != width or work_height != height or work_x != 0 or work_y != 0:
            add_workarea(work_x, work_y, work_width, work_height)
        log.info("  " + " ".join(info))
        for i, m in enumerate(monitors, start=1):
            if len(m) < 7:
                log.info("    %s", m)
                continue
            plug_name, plug_x, plug_y, plug_width, plug_height, plug_width_mm, plug_height_mm = m[:
                                                                                                  7]
            info = ['%s' % prettify_plug_name(plug_name, "monitor %i" % i)]
            if plug_width != width or plug_height != height or plug_x != 0 or plug_y != 0:
                info.append("%ix%i" % (plug_width, plug_height))
                if plug_x != 0 or plug_y != 0:
                    info.append("at %ix%i" % (plug_x, plug_y))
            if (plug_width_mm != width_mm or plug_height_mm != height_mm) and (
                    plug_width_mm > 0 or plug_height_mm > 0):
                info.append("(%ix%i mm - DPI: %ix%i)" %
                            (plug_width_mm, plug_height_mm,
                             dpi(plug_width, plug_width_mm),
                             dpi(plug_height, plug_height_mm)))
            if len(m) >= 11:
                dwork_x, dwork_y, dwork_width, dwork_height = m[7:11]
                #only show it again if different from the screen workarea
                if dwork_x != work_x or dwork_y != work_y or dwork_width != work_width or dwork_height != work_height:
                    add_workarea(dwork_x, dwork_y, dwork_width, dwork_height)
            log.info("    " + " ".join(info))
Beispiel #42
0
# Copyright (C) 2011-2013 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import os
import re

#ensure that we use gtk as display source:
from xpra.x11.gtk_x11 import gdk_display_source
assert gdk_display_source

from xpra.x11.gtk_x11.error import trap
from xpra.x11.bindings.keyboard_bindings import X11KeyboardBindings #@UnresolvedImport
X11Keyboard = X11KeyboardBindings()
from xpra.log import Logger
log = Logger()


KEYBOARD_DEBUG = os.environ.get("XPRA_KEYBOARD_DEBUG", "0")=="1"
if KEYBOARD_DEBUG:
    debug = log.info
else:
    debug = log.debug
KEYBOARD_VERBOSE = os.environ.get("XPRA_KEYBOARD_DEBUG", "0")=="2"
if KEYBOARD_VERBOSE:
    verbose = log.info
else:
    verbose = log.debug


def exec_keymap_command(args, stdin=None):
Beispiel #43
0
# This file is part of Xpra.
# Copyright (C) 2008, 2009 Nathaniel Smith <*****@*****.**>
# Copyright (C) 2011-2016 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import os
import gobject

from xpra.gtk_common.gobject_util import AutoPropGObjectMixin

from xpra.log import Logger
log = Logger("x11", "window")
metalog = Logger("x11", "window", "metadata")


PROPERTIES_DEBUG = [x.strip() for x in os.environ.get("XPRA_WINDOW_PROPERTIES_DEBUG", "").split(",")]


class WindowModelStub(AutoPropGObjectMixin, gobject.GObject):
    """
        Stub for all window models
    """

    #things that we expose:
    _property_names         = []
    #exposed and changing (should be watched for notify signals):
    _dynamic_property_names = []
    _internal_property_names = []
    _MODELTYPE = "Stub"
#!/usr/bin/env python
# This file is part of Xpra.
# Copyright (C) 2014 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

from collections import deque
import gobject  #@UnresolvedImport
import gtk  #@UnresolvedImport

from xpra.client.gobject_client_base import CommandConnectClient
from xpra.log import Logger

log = Logger()


class gobject_loop_adapter(object):
    def quit(self):
        gtk.main_quit()

    def run(self):
        gtk.main()


class ServerMessenger(CommandConnectClient):
    def run(self):
        self._protocol.start()
        #override so we can use the gtk main loop here:
        self.gobject_mainloop = gobject_loop_adapter()
        self.gobject_mainloop.run()
        return self.exit_code
Beispiel #45
0
# Copyright (C) 2010-2020 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.
#pylint: disable-msg=E1101

import os
from time import sleep

from xpra.server.mixins.stub_server_mixin import StubServerMixin
from xpra.scripts.config import parse_with_unit
from xpra.simple_stats import std_unit
from xpra.os_util import livefds, POSIX
from xpra.util import envbool, envint, detect_leaks, typedict
from xpra.log import Logger

log = Logger("network")
bandwidthlog = Logger("bandwidth")

DETECT_MEMLEAKS = envint("XPRA_DETECT_MEMLEAKS", 0)
DETECT_FDLEAKS = envbool("XPRA_DETECT_FDLEAKS", False)

MIN_BANDWIDTH_LIMIT = envint("XPRA_MIN_BANDWIDTH_LIMIT", 1024 * 1024)
MAX_BANDWIDTH_LIMIT = envint("XPRA_MAX_BANDWIDTH_LIMIT",
                             10 * 1024 * 1024 * 1024)
CPUINFO = envbool("XPRA_CPUINFO", False)


class NetworkStateServer(StubServerMixin):
    """
    Mixin for adding client / network state monitoring functions:
    - ping and echo
Beispiel #46
0
#!/usr/bin/env python
# This file is part of Xpra.
# Copyright (C) 2014-2017 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import sys, os

#default implementation uses pycups
from xpra.util import envbool, print_nested_dict
from xpra.os_util import WIN32, PYTHON3
from xpra.log import Logger

log = Logger("printing")

RAW_MODE = envbool("XPRA_PRINTER_RAW", False)

if PYTHON3:
    unicode = str  #@ReservedAssignment


def err(*args, **kwargs):
    log.error(*args, **kwargs)


def get_printers():
    return {}


def get_printer_attributes(_name):
    return []
Beispiel #47
0
# but it works on win32, for whatever that's worth.

import time
import sys
from socket import error as socket_error
import struct
import os
import threading
import binascii
from threading import Lock

ZLIB_FLAG = 0x00
LZ4_FLAG = 0x10

from xpra.log import Logger
log = Logger("network", "protocol")
debug = log.debug
from xpra.os_util import Queue, strtobytes, get_hex_uuid
from xpra.daemon_thread import make_daemon_thread
from xpra.simple_stats import std_unit, std_unit_dec
from xpra.net.bytestreams import ABORT

try:
    from Crypto.Cipher import AES
    from Crypto.Protocol.KDF import PBKDF2
except Exception, e:
    AES = None
    PBKDF2 = None
    log("pycrypto is missing: %s", e)

from zlib import compress, decompress
Beispiel #48
0
def get_util_logger():
    global util_logger
    if not util_logger:
        from xpra.log import Logger
        util_logger = Logger("util")
    return util_logger
Beispiel #49
0
# This file is part of Xpra.
# Copyright (C) 2008, 2009 Nathaniel Smith <*****@*****.**>
# Copyright (C) 2011-2015 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import os

from xpra.util import WORKSPACE_UNSET, WORKSPACE_ALL
from xpra.x11.gtk_x11.prop import prop_set, prop_get
from xpra.x11.gtk2.models.core import CoreX11WindowModel, gobject, xswallow, gdk
from xpra.x11.bindings.window_bindings import X11WindowBindings, constants      #@UnresolvedImport
from xpra.x11.gtk2.gdk_bindings import get_pywindow, get_pyatom                 #@UnresolvedImport

from xpra.log import Logger
log = Logger("x11", "window")
workspacelog = Logger("x11", "window", "workspace")
metalog = Logger("x11", "window", "metadata")
geomlog = Logger("x11", "window", "geometry")
menulog = Logger("x11", "window", "menu")


dbus_helper = None
MENU_FORWARDING = os.environ.get("XPRA_MENU_FORWARDING", "1")=="1"
if MENU_FORWARDING:
    try:
        from xpra import dbus
        assert dbus
    except ImportError as e:
        log("this build does not include the dbus module, no menu forwarding")
        del e
Beispiel #50
0
#!/usr/bin/env python
# This file is part of Xpra.
# Copyright (C) 2015-2020 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import dbus.service

from xpra.server.dbus.dbus_server import DBUS_Server, INTERFACE, ni
from xpra.log import Logger
log = Logger("dbus", "server")


class Shadow_DBUS_Server(DBUS_Server):
    @dbus.service.method(INTERFACE, in_signature='i')
    def SetRefreshDelay(self, milliseconds):
        log("SetRefreshDelay(%i)", milliseconds)
        return self.server.set_refresh_delay(ni(milliseconds))
Beispiel #51
0
#!/usr/bin/env python
# This file is part of Xpra.
# Copyright (C) 2011-2014 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

#tricky: use xpra.scripts.config to get to the python "platform" module
from xpra.scripts.config import python_platform
import sys
import os
from xpra.util import updict
from xpra.os_util import get_linux_distribution
from xpra import __version__ as local_version
from xpra.log import Logger
log = Logger("util")


def version_as_numbers(version):
    return [int(x) for x in version.split(".")]


def version_compat_check(remote_version):
    if remote_version is None:
        msg = "remote version not available!"
        log(msg)
        return msg
    rv = version_as_numbers(remote_version)
    lv = version_as_numbers(local_version)
    if rv == lv:
        log("identical remote version: %s", remote_version)
        return None
Beispiel #52
0
    PostMessageA,
    CreateWindowExA, CreatePopupMenu, AppendMenu,
    LoadIconA,
    DefWindowProcA, RegisterWindowMessageA, RegisterClassExA,
    ICONINFO, BITMAPV5HEADER,
    LoadImageW, CreateIconIndirect, DestroyIcon,
    GetDC, ReleaseDC,
    CreateBitmap, CreateDIBSection,
    UpdateWindow, DestroyWindow,
    PostQuitMessage,
    GetModuleHandleA,
    GetStockObject, DeleteObject,
    )
from xpra.log import Logger

log = Logger("tray", "win32")

log("loading ctypes NotifyIcon functions")
sprintf = ctypes.cdll.msvcrt.sprintf


TRAY_ALPHA = envbool("XPRA_TRAY_ALPHA", True)


def GetProductInfo(dwOSMajorVersion=5, dwOSMinorVersion=0, dwSpMajorVersion=0, dwSpMinorVersion=0):
    product_type = DWORD(0)
    from xpra.platform.win32.common import GetProductInfo as k32GetProductInfo
    v = k32GetProductInfo(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, byref(product_type))
    log("GetProductInfo(%i, %i, %i, %i)=%i product_type=%s", dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, v, hex(product_type.value))
    return bool(v)
#win7 is actually 6.1:
Beispiel #53
0
# This file is part of Xpra.
# Copyright (C) 2011-2015 Antoine Martin <*****@*****.**>
# Copyright (C) 2008, 2009, 2010 Nathaniel Smith <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

from xpra.os_util import strtobytes
from xpra.log import Logger
log = Logger("network", "crypto")

__all__ = ("get_info", "get_key", "get_encryptor", "get_decryptor", "ENCRYPTION_CIPHERS")

ENCRYPTION_CIPHERS = []
backend = None


def patch_crypto_be_discovery():
    """
    Monkey patches cryptography's backend detection.
    Objective: support pyinstaller / cx_freeze / pyexe / py2app freezing.
    """
    from cryptography.hazmat import backends
    try:
        from cryptography.hazmat.backends.commoncrypto.backend import backend as be_cc
    except ImportError:
        log("failed to import commoncrypto", exc_info=True)
        be_cc = None
    try:
        import _ssl
        log("loaded _ssl=%s", _ssl)
    except ImportError:
Beispiel #54
0
from gi.repository import GLib, Gdk, Gtk

from xpra.util import flatten_dict, envbool
from xpra.os_util import monotonic_time
from xpra.gtk_common.gobject_compat import register_os_signals
from xpra.server import server_features
from xpra.server.server_base import ServerBase
from xpra.gtk_common.gtk_util import (
    get_gtk_version_info,
    get_root_size,
)
from xpra.log import Logger

UI_THREAD_WATCHER = envbool("XPRA_UI_THREAD_WATCHER")

log = Logger("server", "gtk")
screenlog = Logger("server", "screen")
cursorlog = Logger("server", "cursor")
notifylog = Logger("notify")


class GTKServerBase(ServerBase):
    """
        This is the base class for servers.
        It provides all the generic functions but is not tied
        to a specific backend (X11 or otherwise).
        See X11ServerBase, XpraServer and XpraX11ShadowServer
    """
    def __init__(self):
        log("GTKServerBase.__init__()")
        self.idle_add = GLib.idle_add
Beispiel #55
0
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

# taken from the code I wrote for winswitch

import avahi
import dbus
try:
    from dbus.exceptions import DBusException
except:
    #not available in all versions of the bindings?
    DBusException = Exception
from xpra.net.mdns import XPRA_MDNS_TYPE, SHOW_INTERFACE

from xpra.log import Logger
log = Logger("network", "mdns")

from xpra.dbus.common import init_system_bus
from xpra.net.net_util import get_iface, if_nametoindex, if_indextoname


def get_interface_index(host):
    log("get_interface_index(%s)", host)
    if host == "0.0.0.0" or host == "" or host == "*" or host == "::":
        return avahi.IF_UNSPEC

    if not if_nametoindex:
        log.error(
            "cannot convert interface to index (if_nametoindex is missing), so returning 'IF_UNSPEC', avahi will publish on ALL interfaces"
        )
        return avahi.IF_UNSPEC
Beispiel #56
0
import os.path
import subprocess

from xpra.gtk_common.gobject_compat import import_gtk, import_gdk, import_pango, import_glib
gtk = import_gtk()
gdk = import_gdk()
pango = import_pango()
glib = import_glib()
glib.threads_init()

from xpra.platform.paths import get_icon_dir, get_xpra_command
from xpra.os_util import OSX, WIN32
from xpra.gtk_common.gtk_util import gtk_main, set_tooltip_text, add_close_accel, pixbuf_new_from_file, add_window_accel, imagebutton, window_defaults, scaled_image, WIN_POS_CENTER

from xpra.log import Logger
log = Logger("client", "util")

try:
    from xpra import client
    has_client = bool(client)
except ImportError:
    has_client = False
try:
    from xpra.server import server_util
    has_server = bool(server_util)
except ImportError:
    has_server = False
try:
    from xpra.server import shadow
    has_shadow = bool(shadow)
except ImportError:
Beispiel #57
0
from xpra.os_util import monotonic_time
from xpra.util import (
    iround,
    envint,
    envfloat,
    envbool,
    log_screen_sizes,
    engs,
    flatten_dict,
    typedict,
    XPRA_SCALING_NOTIFICATION_ID,
)
from xpra.client.mixins.stub_client_mixin import StubClientMixin
from xpra.log import Logger

log = Logger("screen")
workspacelog = Logger("client", "workspace")
scalinglog = Logger("scaling")

MONITOR_CHANGE_REINIT = envint("XPRA_MONITOR_CHANGE_REINIT")

MIN_SCALING = envfloat("XPRA_MIN_SCALING", "0.1")
MAX_SCALING = envfloat("XPRA_MAX_SCALING", "8")
SCALING_OPTIONS = [
    float(x) for x in os.environ.get(
        "XPRA_TRAY_SCALING_OPTIONS",
        "0.25,0.5,0.666,1,1.25,1.5,2.0,3.0,4.0,5.0").split(",")
    if float(x) >= MIN_SCALING and float(x) <= MAX_SCALING
]
SCALING_EMBARGO_TIME = int(os.environ.get("XPRA_SCALING_EMBARGO_TIME",
                                          "1000")) / 1000.0
Beispiel #58
0
from math import sqrt

from collections import deque
from xpra.simple_stats import get_list_stats, get_weighted_list_stats
from xpra.os_util import monotonic_time
from xpra.util import engs, csv, envint
from xpra.server.cystats import (
    logp,  #@UnresolvedImport
    calculate_time_weighted_average,  #@UnresolvedImport
    calculate_size_weighted_average,  #@UnresolvedImport
    calculate_timesize_weighted_average,  #@UnresolvedImport
    calculate_for_average,  #@UnresolvedImport
)

from xpra.log import Logger
log = Logger("stats")

#how many historical records to keep
#for the various statistics we collect:
#(cannot be lower than DamageBatchConfig.MAX_EVENTS)
NRECS = 100

TARGET_LATENCY_TOLERANCE = envint("XPRA_TARGET_LATENCY_TOLERANCE", 20) / 1000.0


class WindowPerformanceStatistics:
    """
    Statistics which belong to a specific WindowSource
    """
    def __init__(self):
        self.reset()
Beispiel #59
0
#!/usr/bin/env python
# This file is part of Xpra.
# Copyright (C) 2010-2015 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

import sys
import os.path
from xpra.log import Logger
log = Logger("codec", "loader")
try:
    #this makes py2exe do the right thing:
    from xpra.codecs import codec_checks
    assert codec_checks
except:
    pass

if sys.version > '3':
    unicode = str  #@ReservedAssignment

#these codecs may well not load because we
#do not require the libraries to be installed
NOWARN = ["nvenc4", "nvenc5", "nvenc6", "opencl", "opencv"]

SELFTEST = os.environ.get("XPRA_CODEC_SELFTEST", "1") == "1"
FULL_SELFTEST = os.environ.get("XPRA_CODEC_FULL_SELFTEST", "0") == "1"

CODEC_FAIL_IMPORT = os.environ.get("XPRA_CODEC_FAIL_IMPORT", "").split(",")
CODEC_FAIL_SELFTEST = os.environ.get("XPRA_CODEC_FAIL_SELFTEST", "").split(",")

log(
Beispiel #60
0
# Copyright (C) 2018-2021 Antoine Martin <*****@*****.**>
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.

from xpra.platform import program_context
from xpra.platform.gui import get_native_tray_menu_helper_class, get_native_tray_classes
from xpra.platform.paths import get_icon_filename
from xpra.gtk_common.gtk_util import scaled_image
from xpra.log import Logger

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import GLib, Gtk, GdkPixbuf

log = Logger("client")


class FakeApplication:
    def __init__(self):
        self.idle_add = GLib.idle_add
        self.timeout_add = GLib.timeout_add
        self.source_remove = GLib.source_remove
        self.display_desc = {}
        self.session_name = "Test System Tray"
        self.mmap_enabled = False
        self.windows_enabled = True
        self.readonly = False
        self.opengl_enabled = False
        self.modal_windows = False
        self.server_bell = False