diff options
| author | lassulus <lassulus@lassul.us> | 2018-04-01 16:17:45 +0200 | 
|---|---|---|
| committer | lassulus <lassulus@lassul.us> | 2018-04-01 16:17:45 +0200 | 
| commit | 0f47b98e81755494df19325e91974f8d9d2c8617 (patch) | |
| tree | 8b772c6c7aca951441e91c10b4d70f10dff5e2f1 /lass | |
| parent | a75858a8ced30f9ed46e282e75a3cdccd515abd7 (diff) | |
l xjail: add working GPU acceleration
Diffstat (limited to 'lass')
| -rw-r--r-- | lass/3modules/xjail.nix | 121 | 
1 files changed, 99 insertions, 22 deletions
diff --git a/lass/3modules/xjail.nix b/lass/3modules/xjail.nix index af851760b..325ebcc99 100644 --- a/lass/3modules/xjail.nix +++ b/lass/3modules/xjail.nix @@ -1,33 +1,88 @@ -{ config, pkgs, ... }: +{ config, pkgs, lib, ... }:  with import <stockholm/lib>;  {    options.lass.xjail = mkOption {      type = types.attrsOf (types.submodule ({ config, ...}: {        options = { +        name = mkOption { +          type = types.string; +          default = config._module.args.name; +        };          user = mkOption {            type = types.string; -          default = "nobody"; +          default = config.name;          };          groups = mkOption {            type = types.listOf types.str;            default = [];          }; -        name = mkOption { +        from = mkOption {            type = types.string; -          default = config._module.args.name; +          default = "lass";          };          display = mkOption {            type = types.string;            default = toString (genid_signed config._module.args.name);          }; +        dpi = mkOption { +          type = types.int; +          default = 90; +        }; +        extraXephyrArgs = mkOption { +          type = types.str; +          default = ""; +        }; +        extraVglrunArgs = mkOption { +          type = types.str; +          default = ""; +        };          script = mkOption {            type = types.path;            default = pkgs.writeScript "echo_lol" "echo lol";          }; -        from = mkOption { +        wm = mkOption { +          #TODO find type            type = types.string; -          default = "lass"; +          default = "${pkgs.writeHaskell "xephyrify-xmonad" { +            executables.xmonad = { +              extra-depends = [ +                "containers" +                "unix" +                "xmonad" +              ]; +              text = /* haskell */ '' +                module Main where +                import XMonad +                import Data.Monoid +                import System.Posix.Process (executeFile) +                import qualified Data.Map as Map + +                main :: IO () +                main = do +                  xmonad def +                    { workspaces = [ "1" ] +                    , layoutHook = myLayoutHook +                    , keys = myKeys +                    , normalBorderColor  = "#000000" +                    , focusedBorderColor = "#000000" +                    , handleEventHook = myEventHook +                    } + +                myEventHook :: Event -> X All + +                myEventHook (ConfigureEvent { ev_event_type = 22 }) = do +                  spawn "${pkgs.xorg.xrandr}/bin/xrandr >/dev/null 2>&1" +                  return (All True) + +                myEventHook _ = do +                  return (All True) + +                myLayoutHook = Full +                myKeys _ = Map.fromList [] +              ''; +            }; +          }}/bin/xmonad";          };        };      })); @@ -39,7 +94,42 @@ with import <stockholm/lib>;    };    # implementation -  config = { +  config = let +    scripts = mapAttrs' (name: cfg: +      let +        newOrExisting = pkgs.writeDash "${cfg.name}-existing" '' +          DISPLAY=:${cfg.display} ${pkgs.xorg.xrandr}/bin/xrandr +          if test $? -eq 0; then +            echo using existing xephyr +            ${sudo_} "$@" +          else +            echo starting new xephyr +            ${xephyr_} "$@" +          fi +        ''; +        xephyr_ = pkgs.writeDash "${cfg.name}-xephyr" '' +          ${pkgs.xorg.xorgserver}/bin/Xephyr -br -ac -reset -terminate -resizeable -nolisten local -dpi ${toString cfg.dpi} ${cfg.extraXephyrArgs} :${cfg.display} & +          XEPHYR_PID=$! +          DISPLAY=:${cfg.display} ${cfg.wm} & +          WM_PID=$! +          ${sudo_} "$@" +          ${pkgs.coreutils}/bin/kill $WM_PID +          ${pkgs.coreutils}/bin/kill $XEPHYR_PID +        ''; +        sudo_ = pkgs.writeDash "${cfg.name}-sudo" '' +          /var/run/wrappers/bin/sudo -u ${cfg.name} -i ${vglrun_} "$@" +        ''; +        vglrun_ = pkgs.writeDash "${cfg.name}-vglrun" '' +          DISPLAY=:${cfg.display} ${pkgs.virtualgl}/bin/vglrun ${cfg.extraVglrunArgs} ${cfg.script} "$@" +        ''; +      in nameValuePair name { +        existing = newOrExisting; +        xephyr = xephyr_; +        sudo = sudo_; +        vglrun = vglrun_; +      } +    ) config.lass.xjail; +  in {      users.users = mapAttrs' (_: cfg:        nameValuePair cfg.name { @@ -66,21 +156,8 @@ with import <stockholm/lib>;      ) config.lass.xjail));      lass.xjail-bins = mapAttrs' (name: cfg: -      let -        sudo-wrapper = pkgs.writeScript name '' -          /var/run/wrappers/bin/sudo -u ${cfg.name} -i ${cfg.script} "$@" -        ''; -      in nameValuePair name (pkgs.writeScriptBin cfg.name '' -        export NDISPLAY=${cfg.display} -        DISPLAY=:$NDISPLAY ${pkgs.xorg.xrandr}/bin/xrandr -        if test $? -eq 0; then -          echo xephyr already running -          export DISPLAY=:$NDISPLAY -          ${sudo-wrapper} "$@" -        else -          echo xephyr not running -          DROP_TO_USER=${cfg.name} ${pkgs.xephyrify}/bin/xephyrify ${sudo-wrapper} "$@" -        fi +      nameValuePair name (pkgs.writeScriptBin cfg.name '' +        ${scripts.${name}.existing} "$@"        '')      ) config.lass.xjail;    };  | 
