summary refs log tree commit diff
path: root/nixos/modules/virtualisation/containers.nix
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-03-18 11:36:03 +0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-03-18 11:36:03 +0100
commit11c4c4ae54bbef647358d2b6d6c3ddf0457f81f7 (patch)
tree8e146d716c9f7bd0acc35cafaa260bf8fa276115 /nixos/modules/virtualisation/containers.nix
parent7b82d1ee27a60157418e241152ef1aa3f909ad7b (diff)
downloadnixlib-11c4c4ae54bbef647358d2b6d6c3ddf0457f81f7.tar
nixlib-11c4c4ae54bbef647358d2b6d6c3ddf0457f81f7.tar.gz
nixlib-11c4c4ae54bbef647358d2b6d6c3ddf0457f81f7.tar.bz2
nixlib-11c4c4ae54bbef647358d2b6d6c3ddf0457f81f7.tar.lz
nixlib-11c4c4ae54bbef647358d2b6d6c3ddf0457f81f7.tar.xz
nixlib-11c4c4ae54bbef647358d2b6d6c3ddf0457f81f7.tar.zst
nixlib-11c4c4ae54bbef647358d2b6d6c3ddf0457f81f7.zip
Add command ‘nixos-container-shell’ for logging into a container
Diffstat (limited to 'nixos/modules/virtualisation/containers.nix')
-rw-r--r--nixos/modules/virtualisation/containers.nix54
1 files changed, 54 insertions, 0 deletions
diff --git a/nixos/modules/virtualisation/containers.nix b/nixos/modules/virtualisation/containers.nix
index ff17fcc1221d..28ee78e3fcce 100644
--- a/nixos/modules/virtualisation/containers.nix
+++ b/nixos/modules/virtualisation/containers.nix
@@ -14,6 +14,58 @@ let
     installPhase = "true";
   };
 
+  nixos-container-shell = pkgs.writeScriptBin "nixos-container-shell"
+    ''
+      #! ${pkgs.bash}/bin/sh -e
+
+      usage() {
+        echo "Usage: $0 <container-name>" >&2
+        echo "       $0 (-r|--root-shell) <container-name>" >&2
+      }
+
+      args="`getopt --options 'r' -l help -- "$@"`"
+      eval "set -- $args"
+      rootShell=
+      while [ $# -gt 0 ]; do
+        case "$1" in
+          (--help) usage; exit 0;;
+          (-r|--root-shell) rootShell=1;;
+          (--) shift; break;;
+          (*) break;;
+        esac
+        shift
+      done
+
+      container="$1"
+      if [ -z "$container" ]; then
+        usage
+        exit 1
+      fi
+      shift
+
+      root="/var/lib/containers/$container"
+      if ! [ -d "$root" ]; then
+        echo "$0: container ‘$container’ does not exist" >&2
+        exit 1
+      fi
+
+      if [ -n "$rootShell" ]; then
+        socket="$root/var/lib/root-shell.socket"
+      else
+        socket="$root/var/lib/login.socket"
+      fi
+      if ! [ -S "$socket" ]; then
+        echo "$0: socket ‘$socket’ does not exist" >&2
+        exit 1
+      fi
+
+      if [ -n "$rootShell" ]; then
+        exec ${pkgs.socat}/bin/socat "unix:$socket" -
+      else
+        exec ${pkgs.socat}/bin/socat "unix:$socket" -,echo=0,raw
+      fi
+    '';
+
 in
 
 {
@@ -246,5 +298,7 @@ in
         ${cfg.localAddress} ${name}.containers
       '') config.systemd.containers);
 
+    environment.systemPackages = optional (config.systemd.containers != {}) nixos-container-shell;
+
   };
 }