xpra icon
Bug tracker and wiki

Ticket #1105: systemd-run.patch

File systemd-run.patch, 5.0 KB (added by Antoine Martin, 4 years ago)

wrap xpra server command with systemd-run automatically

  • etc/xpra/conf.d/60_server.conf.in

     
    7777# pactl set-source-volume SomeSource 20%%
    7878%(pulseaudio_configure_commands)s
    7979
     80
     81# Systemd specific options:
     82# Wrap server start commands with systemd-run:
     83#systemd-run = no
     84systemd-run = auto
     85
     86# Command line arguments passed to systemd-run:
     87#systemd-run-args = -p MemoryAccounting=true -p MemoryHigh=384M -p MemoryLimit=512M
     88#systemd-run-args = -p CPUAccounting=true -p CPUQuota=25%%
  • xpra/os_util.py

     
    333333            return libname_so
    334334    return None
    335335
     336def is_systemd_pid1():
     337    if not os.name=="posix":
     338        return False
     339    d = load_binary_file("/proc/1/cmdline")
     340    return d.find("/systemd")>=0
    336341
    337342def main():
    338343    from xpra.log import Logger
     
    342347    log.info("get_machine_id()=%s", get_machine_id())
    343348    log.info("get_hex_uuid()=%s", get_hex_uuid())
    344349    log.info("get_int_uuid()=%s", get_int_uuid())
     350    log.info("systemd=%s", is_systemd_pid1())
    345351    ld = get_linux_distribution()
    346352    if ld:
    347353        log.info("get_linux_distribution()=%s", ld)
  • xpra/scripts/config.py

     
    318318                    "encryption"        : str,
    319319                    "encryption-keyfile": str,
    320320                    "mode"              : str,
     321                    "systemd-run"       : str,
     322                    "systemd-run-args"  : str,
    321323                    "ssh"               : str,
    322324                    "xvfb"              : str,
    323325                    "socket-dir"        : str,
     
    531533                    "tcp-encryption"    : "",
    532534                    "encryption-keyfile": "",
    533535                    "tcp-encryption-keyfile": "",
     536                    "systemd-run"       : "auto",
     537                    "systemd-run-args"  : "",
    534538                    "ssh"               : DEFAULT_SSH_COMMAND,
    535539                    "xvfb"              : " ".join(xvfb),
    536540                    "socket-dir"        : "",
  • xpra/scripts/main.py

     
    296296    group.add_option("--start-env", action="append",
    297297                      dest="start_env", default=list(defaults.start_env or []),
    298298                      help="Define environment variables used with 'start-child' and 'start', can be specified multiple times. Default: %s." % ", ".join([("'%s'" % x) for x in (defaults.start_env or []) if not x.startswith("#")]))
     299    legacy_bool_parse("systemd-run")
     300    group.add_option("--systemd-run", action="store", metavar="yes|no|auto",
     301                      dest="systemd_run", default=defaults.systemd_run,
     302                      help="Wrap server start commands with systemd-run. Default: %default.")
     303    group.add_option("--systemd-run-args", action="store", metavar="ARGS",
     304                      dest="systemd_run_args", default=defaults.systemd_run_args,
     305                      help="Command line arguments passed to systemd-run. Default: '%default'.")
    299306
    300307    legacy_bool_parse("html")
    301308    if supports_server or supports_shadow:
     
    10621069            os.environ[v[0]] = v[1]
    10631070
    10641071
     1072def systemd_run_wrap(mode, args, systemd_run_args):
     1073    cmd = ["systemd-run", "--scope", "--user"]
     1074    if systemd_run_args:
     1075        cmd += shlex.split(systemd_run_args)
     1076    cmd += args
     1077    print("using systemd-run to wrap '%s' server command" % mode)
     1078    print("%s" % csv(["'%s'" % x for x in cmd]))
     1079    env = os.environ.copy()
     1080    env["XPRA_SYSTEMD_RUN"] = "0"
     1081    import subprocess
     1082    try:
     1083        p = subprocess.Popen(cmd, shell=False, env=env)
     1084        p.wait()
     1085    except KeyboardInterrupt as e:
     1086        return 128+signal.SIGINT
     1087
    10651088def run_mode(script_file, error_cb, options, args, mode, defaults):
    10661089    #configure default logging handler:
    10671090    if os.name=="posix" and os.getuid()==0 and mode!="proxy" and not NO_ROOT_WARNING:
    10681091        warn("\nWarning: running as root")
    10691092
     1093    if mode in ("start", "start_desktop", "shadow"):
     1094        systemd_run = parse_bool("systemd-run", options.systemd_run)
     1095        if systemd_run is None:
     1096            #detect:
     1097            from xpra.os_util import is_systemd_pid1
     1098            systemd_run = is_systemd_pid1()
     1099        if systemd_run:
     1100            #check if we have wrapped it already (or if disabled via env var)
     1101            wrapit = os.environ.get("XPRA_SYSTEMD_RUN", "1")=="1"
     1102            if wrapit:
     1103                return systemd_run_wrap(mode, sys.argv, options.systemd_run_args)
     1104
    10701105    configure_env(options)
    10711106    configure_logging(options, mode)
    10721107    configure_network(options)