Пример #1
0
            """ when the key is released, just ignore it - do NOT send it to the server! """
            return True
        try:
            method = getattr(window, action)
            log.info(
                "key_handled_as_shortcut(%s,%s,%s,%s) has been handled by shortcut=%s",
                window, key_name, modifiers, depressed, shortcut)
        except AttributeError, e:
            log.error("key dropped, invalid method name in shortcut %s: %s",
                      action, e)
            return True
        try:
            method()
        except Exception, e:
            log.error(
                "key_handled_as_shortcut(%s,%s,%s,%s) failed to execute shortcut=%s: %s",
                window, key_name, modifiers, depressed, shortcut, e)
        return True

    def handle_key_action(self, event, window, depressed):
        if self.readonly:
            return
        log.debug("handle_key_action(%s,%s,%s)", event, window, depressed)
        modifiers = self.mask_to_names(event.state)
        name = gdk.keyval_name(event.keyval)
        keyval = nn(event.keyval)
        keycode = event.hardware_keycode
        group = event.group
        #meant to be in PyGTK since 2.10, not used yet so just return False if we don't have it:
        is_modifier = hasattr(event, "is_modifier") and event.is_modifier
        translated = self._client_extras.translate_key(depressed, keyval, name,
Пример #2
0
 def err(*msg):
     """ log an error message and return None """
     from wimpiggy.log import Logger
     log = Logger()
     log.error(*msg)
     return None
Пример #3
0
            if rm not in modifiers:
                #modifier is missing, bail out
                return False
        if not depressed:
            """ when the key is released, just ignore it - do NOT send it to the server! """
            return  True
        try:
            method = getattr(window, action)
            log.info("key_handled_as_shortcut(%s,%s,%s,%s) has been handled by shortcut=%s", window, key_name, modifiers, depressed, shortcut)
        except AttributeError, e:
            log.error("key dropped, invalid method name in shortcut %s: %s", action, e)
            return  True
        try:
            method()
        except Exception, e:
            log.error("key_handled_as_shortcut(%s,%s,%s,%s) failed to execute shortcut=%s: %s", window, key_name, modifiers, depressed, shortcut, e)
        return  True

    def handle_key_action(self, event, window, depressed):
        if self.readonly:
            return
        log.debug("handle_key_action(%s,%s,%s)", event, window, depressed)
        modifiers = self.mask_to_names(event.state)
        name = gdk.keyval_name(event.keyval)
        keyval = nn(event.keyval)
        keycode = event.hardware_keycode
        group = event.group
        #meant to be in PyGTK since 2.10, not used yet so just return False if we don't have it:
        is_modifier = hasattr(event, "is_modifier") and event.is_modifier
        translated = self._client_extras.translate_key(depressed, keyval, name, keycode, group, is_modifier, modifiers)
        if translated is None:
Пример #4
0
from wimpiggy.log import Logger
log = Logger()

from xpra.daemon_thread import make_daemon_thread
from xpra.bytestreams import untilConcludes
from xpra.bencode import bencode, bdecode
rencode_dumps, rencode_loads = None, None
try:
    try:
        from xpra.rencode import dumps as rencode_dumps  #@UnresolvedImport
        from xpra.rencode import loads as rencode_loads  #@UnresolvedImport
    except ImportError:
        pass
except Exception, e:
    log.error("xpra.rencode is missing: %s", e)
has_rencode = rencode_dumps is not None and rencode_loads is not None
use_rencode = has_rencode and not os.environ.get("XPRA_USE_BENCODER", "0")=="1"

#stupid python version breakage:
if sys.version > '3':
    long = int          #@ReservedAssignment
    unicode = str           #@ReservedAssignment
    def zcompress(packet, level):
        return compress(bytes(packet, 'UTF-8'), level)
else:
    def zcompress(packet, level):
        return compress(packet, level)


def repr_ellipsized(obj, limit=100):
Пример #5
0
    SOURCES.append("pulsesrc")
if sys.platform.startswith("darwin"):
    SOURCES.append("osxaudiosrc")
elif sys.platform.startswith("win"):
    SOURCES.append("directsoundsrc")
if os.name == "posix":
    SOURCES += [
        "alsasrc", "jackaudiosrc", "osssrc", "oss4src", "osxaudiosrc",
        "jackaudiosrc"
    ]
SOURCES.append("audiotestsrc")

DEFAULT_SRC = os.environ.get("XPRA_SOUND_DEFAULT_SRC", SOURCES[0])
if DEFAULT_SRC not in SOURCES:
    log.error(
        "invalid default sound source: '%s' is not in %s, using %s instead",
        DEFAULT_SRC, SOURCES, SOURCES[0])
    DEFAULT_SRC = SOURCES[0]


class SoundSource(SoundPipeline):

    __gsignals__ = {
        "new-buffer": n_arg_signal(2),
    }

    def __init__(self,
                 src_type=DEFAULT_SRC,
                 src_options={},
                 codec=MP3,
                 encoder_options={}):
Пример #6
0
from wimpiggy.log import Logger
log = Logger()

from xpra.daemon_thread import make_daemon_thread
from xpra.bytestreams import untilConcludes
from xpra.bencode import bencode, bdecode
rencode_dumps, rencode_loads = None, None
try:
    try:
        from xpra.rencode import dumps as rencode_dumps  #@UnresolvedImport
        from xpra.rencode import loads as rencode_loads  #@UnresolvedImport
    except ImportError:
        pass
except Exception, e:
    log.error("xpra.rencode is missing: %s", e)
has_rencode = rencode_dumps is not None and rencode_loads is not None
use_rencode = has_rencode and not os.environ.get("XPRA_USE_BENCODER",
                                                 "0") == "1"

#stupid python version breakage:
if sys.version > '3':
    long = int  #@ReservedAssignment
    unicode = str  #@ReservedAssignment

    def zcompress(packet, level):
        return compress(bytes(packet, 'UTF-8'), level)
else:

    def zcompress(packet, level):
        return compress(packet, level)
Пример #7
0
def run_server(parser, opts, mode, xpra_file, extra_args):
    if len(extra_args) != 1:
        parser.error("need exactly 1 extra argument")
    assert mode in ("start", "upgrade", "shadow")
    upgrading = mode == "upgrade"
    shadowing = mode == "shadow"
    display_name = extra_args.pop(0)
    if display_name.startswith(":") and not shadowing:
        n = display_name[1:]
        p = n.find(".")
        if p > 0:
            n = n[:p]
        try:
            dno = int(n)
            if dno >= 0 and dno < 10:
                sys.stderr.write("WARNING: low display number: %s\n" % dno)
                sys.stderr.write(
                    "You are attempting to run the xpra server against what seems to be a default X11 display '%s'.\n"
                    % display_name)
                sys.stderr.write("This is generally not what you want.\n")
                sys.stderr.write(
                    "You should probably use a higher display number just to avoid any confusion (and also this warning message).\n"
                )
        except:
            pass

    if opts.exit_with_children and not opts.children:
        sys.stderr.write(
            "--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)

    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.log_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()

    from wimpiggy.log import Logger
    log = Logger()

    # 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():
                log.info("closing tcp socket %s", opts.bind_tcp)
                try:
                    tcp_socket.close()
                except:
                    pass

            _cleanups.append(cleanup_tcp_socket)
        except Exception, e:
            log.error("cannot start - failed to create tcp socket at %s: %s" %
                      (opts.bind_tcp, e))
            return 1
Пример #8
0
    DEFAULT_SINK = "osxaudiosink"
elif sys.platform.startswith("win"):
    SINKS.append("directsoundsink")
    DEFAULT_SINK = "directsoundsink"
if os.name=="posix":
    SINKS += ["alsasink", "osssink", "oss4sink", "jackaudiosink"]

GST_QUEUE_NO_LEAK             = 0
GST_QUEUE_LEAK_UPSTREAM       = 1
GST_QUEUE_LEAK_DOWNSTREAM     = 2

QUEUE_LEAK = int(os.environ.get("XPRA_SOUND_QUEUE_LEAK", GST_QUEUE_NO_LEAK))
QUEUE_TIME = int(os.environ.get("XPRA_SOUND_QUEUE_TIME", "80"))*1000000
DEFAULT_SINK = os.environ.get("XPRA_SOUND_SINK", DEFAULT_SINK)
if DEFAULT_SINK not in SINKS:
    log.error("invalid default sound sink: '%s' is not in %s, using %s instead", DEFAULT_SINK, SINKS, SINKS[0])
    DEFAULT_SINK = SINKS[0]

VOLUME = True
QUEUE = True


def sink_has_device_attribute(sink):
    return sink not in ("autoaudiosink", "jackaudiosink", "directsoundsink")


class SoundSink(SoundPipeline):

    __gsignals__ = {
        "underrun": one_arg_signal,
        "eos": no_arg_signal
Пример #9
0
if has_pa():
    SOURCES.append("pulsesrc")
if sys.platform.startswith("darwin"):
    SOURCES.append("osxaudiosrc")
elif sys.platform.startswith("win"):
    SOURCES.append("directsoundsrc")
if os.name=="posix":
    SOURCES += ["alsasrc", "jackaudiosrc",
                "osssrc", "oss4src",
                "osxaudiosrc", "jackaudiosrc"]
SOURCES.append("audiotestsrc")


DEFAULT_SRC = os.environ.get("XPRA_SOUND_DEFAULT_SRC", SOURCES[0])
if DEFAULT_SRC not in SOURCES:
    log.error("invalid default sound source: '%s' is not in %s, using %s instead", DEFAULT_SRC, SOURCES, SOURCES[0])
    DEFAULT_SRC = SOURCES[0]


class SoundSource(SoundPipeline):

    __gsignals__ = {
        "new-buffer": n_arg_signal(2),
        }

    def __init__(self, src_type=DEFAULT_SRC, src_options={}, codec=MP3, encoder_options={}):
        assert src_type in SOURCES
        encoders = get_encoders(codec)
        assert len(encoders)>0, "no encoders found for %s" % codec
        SoundPipeline.__init__(self, codec)
        self.src_type = src_type
Пример #10
0
        if not tray_icon_filename or not os.path.exists(tray_icon_filename):
            log.error("invalid tray icon filename: '%s'" % tray_icon_filename)

        try:
            from xpra.win32.win32_tray import Win32Tray
            self.tray = Win32Tray(self.get_tray_tooltip(), self.activate_menu, self.quit, tray_icon_filename)
        except Exception, e:
            log.error("failed to load native Windows NotifyIcon: %s", e)

        #cant do balloon without a tray:
        if self.tray and notifications:
            try:
                from xpra.win32.win32_balloon import notify
                self.notify = notify
            except Exception, e:
                log.error("failed to load native win32 balloon: %s", e)

    def mask_to_names(self, mask):
        names = ClientExtrasBase.mask_to_names(self, mask)
        log("mask_to_names(%s)=%s, emulate_altgr=%s", mask, names, self.emulate_altgr)
        if self.emulate_altgr:
            self.AltGr_modifiers(names)
        return names

    def AltGr_modifiers(self, modifiers, pressed=True):
        clear = ["mod1", "mod2", "control"]
        if pressed:
            if "mod5" not in modifiers:
                modifiers.append("mod5")
        else:
            clear.append("mod5")
Пример #11
0
            log.error("invalid tray icon filename: '%s'" % tray_icon_filename)

        try:
            from xpra.win32.win32_tray import Win32Tray
            self.tray = Win32Tray(self.get_tray_tooltip(), self.activate_menu,
                                  self.quit, tray_icon_filename)
        except Exception, e:
            log.error("failed to load native Windows NotifyIcon: %s", e)

        #cant do balloon without a tray:
        if self.tray and notifications:
            try:
                from xpra.win32.win32_balloon import notify
                self.notify = notify
            except Exception, e:
                log.error("failed to load native win32 balloon: %s", e)

    def mask_to_names(self, mask):
        names = ClientExtrasBase.mask_to_names(self, mask)
        log("mask_to_names(%s)=%s, emulate_altgr=%s", mask, names,
            self.emulate_altgr)
        if self.emulate_altgr:
            self.AltGr_modifiers(names)
        return names

    def AltGr_modifiers(self, modifiers, pressed=True):
        clear = ["mod1", "mod2", "control"]
        if pressed:
            if "mod5" not in modifiers:
                modifiers.append("mod5")
        else:
Пример #12
0
 def err(*msg):
     """ log an error message and return None """
     from wimpiggy.log import Logger
     log = Logger()
     log.error(*msg)
     return None
Пример #13
0
elif sys.platform.startswith("win"):
    SINKS.append("directsoundsink")
    DEFAULT_SINK = "directsoundsink"
if os.name == "posix":
    SINKS += ["alsasink", "osssink", "oss4sink", "jackaudiosink"]

GST_QUEUE_NO_LEAK = 0
GST_QUEUE_LEAK_UPSTREAM = 1
GST_QUEUE_LEAK_DOWNSTREAM = 2

QUEUE_LEAK = int(os.environ.get("XPRA_SOUND_QUEUE_LEAK", GST_QUEUE_NO_LEAK))
QUEUE_TIME = int(os.environ.get("XPRA_SOUND_QUEUE_TIME", "80")) * 1000000
DEFAULT_SINK = os.environ.get("XPRA_SOUND_SINK", DEFAULT_SINK)
if DEFAULT_SINK not in SINKS:
    log.error(
        "invalid default sound sink: '%s' is not in %s, using %s instead",
        DEFAULT_SINK, SINKS, SINKS[0])
    DEFAULT_SINK = SINKS[0]

VOLUME = True
QUEUE = True


def sink_has_device_attribute(sink):
    return sink not in ("autoaudiosink", "jackaudiosink", "directsoundsink")


class SoundSink(SoundPipeline):

    __gsignals__ = {"underrun": one_arg_signal, "eos": no_arg_signal}
Пример #14
0
from wimpiggy.log import Logger
log = Logger()

from xpra.daemon_thread import make_daemon_thread
from xpra.bencode import bencode, bdecode
rencode_dumps, rencode_loads, rencode_version = None, None, None
try:
    try:
        from xpra.rencode import dumps as rencode_dumps  #@UnresolvedImport
        from xpra.rencode import loads as rencode_loads  #@UnresolvedImport
        from xpra.rencode import __version__
        rencode_version = __version__
        log("found rencode version %s", rencode_version)
    except ImportError:
        log.error("rencode load error", exc_info=True)
except Exception, e:
    log.error("xpra.rencode is missing: %s", e)
has_rencode = rencode_dumps is not None and rencode_loads is not None and rencode_version is not None
use_rencode = has_rencode and not os.environ.get("XPRA_USE_BENCODER", "0")=="1"

#stupid python version breakage:
if sys.version > '3':
    long = int          #@ReservedAssignment
    unicode = str           #@ReservedAssignment
    def zcompress(packet, level):
        return compress(bytes(packet, 'UTF-8'), level)
else:
    def zcompress(packet, level):
        return compress(packet, level)
Пример #15
0
def run_server(parser, opts, mode, xpra_file, extra_args):
    if len(extra_args) != 1:
        parser.error("need exactly 1 extra argument")
    assert mode in ("start", "upgrade", "shadow")
    upgrading = mode == "upgrade"
    shadowing = mode == "shadow"
    display_name = extra_args.pop(0)
    if display_name.startswith(":") and not shadowing:
        n = display_name[1:]
        p = n.find(".")
        if p>0:
            n = n[:p]
        try:
            dno = int(n)
            if dno>=0 and dno<10:
                sys.stderr.write("WARNING: low display number: %s\n" % dno)
                sys.stderr.write("You are attempting to run the xpra server against what seems to be a default X11 display '%s'.\n" % display_name)
                sys.stderr.write("This is generally not what you want.\n")
                sys.stderr.write("You should probably use a higher display number just to avoid any confusion (and also this warning message).\n")
        except:
            pass

    if opts.exit_with_children and not opts.children:
        sys.stderr.write("--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)

    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.log_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()

    from wimpiggy.log import Logger
    log = Logger()

    # 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():
                log.info("closing tcp socket %s", opts.bind_tcp)
                try:
                    tcp_socket.close()
                except:
                    pass
            _cleanups.append(cleanup_tcp_socket)
        except Exception, e:
            log.error("cannot start - failed to create tcp socket at %s: %s" % (opts.bind_tcp, e))
            return  1
Пример #16
0
from wimpiggy.log import Logger
log = Logger()

from xpra.daemon_thread import make_daemon_thread
from xpra.bencode import bencode, bdecode
rencode_dumps, rencode_loads, rencode_version = None, None, None
try:
    try:
        from xpra.rencode import dumps as rencode_dumps  #@UnresolvedImport
        from xpra.rencode import loads as rencode_loads  #@UnresolvedImport
        from xpra.rencode import __version__
        rencode_version = __version__
        log("found rencode version %s", rencode_version)
    except ImportError:
        log.error("rencode load error", exc_info=True)
except Exception, e:
    log.error("xpra.rencode is missing: %s", e)
has_rencode = rencode_dumps is not None and rencode_loads is not None and rencode_version is not None
use_rencode = has_rencode and not os.environ.get("XPRA_USE_BENCODER",
                                                 "0") == "1"

#stupid python version breakage:
if sys.version > '3':
    long = int  #@ReservedAssignment
    unicode = str  #@ReservedAssignment

    def zcompress(packet, level):
        return compress(bytes(packet, 'UTF-8'), level)
else: