104 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, pkgs, lib, ... }:
 | ||
| 
 | ||
| with lib;
 | ||
| 
 | ||
| {
 | ||
| 
 | ||
|   config = mkIf config.boot.isContainer {
 | ||
| 
 | ||
|     # Provide a login prompt on /var/lib/login.socket.  On the host,
 | ||
|     # you can connect to it by running ‘socat
 | ||
|     # unix:<path-to-container>/var/lib/login.socket -,echo=0,raw’.
 | ||
|     systemd.sockets.login =
 | ||
|       { description = "Login Socket";
 | ||
|         wantedBy = [ "sockets.target" ];
 | ||
|         socketConfig =
 | ||
|           { ListenStream = "/var/lib/login.socket";
 | ||
|             SocketMode = "0666";
 | ||
|             Accept = true;
 | ||
|           };
 | ||
|       };
 | ||
| 
 | ||
|     systemd.services."login@" =
 | ||
|       { description = "Login %i";
 | ||
|         environment.TERM = "linux";
 | ||
|         serviceConfig =
 | ||
|           { Type = "simple";
 | ||
|             StandardInput = "socket";
 | ||
|             ExecStart = "${pkgs.socat}/bin/socat -t0 - exec:${pkgs.shadow}/bin/login,pty,setsid,setpgid,stderr,ctty";
 | ||
|             TimeoutStopSec = 1; # FIXME
 | ||
|           };
 | ||
|       };
 | ||
| 
 | ||
|     # Also provide a root login prompt on /var/lib/root-login.socket
 | ||
|     # that doesn't ask for a password. This socket can only be used by
 | ||
|     # root on the host.
 | ||
|     systemd.sockets.root-login =
 | ||
|       { description = "Root Login Socket";
 | ||
|         wantedBy = [ "sockets.target" ];
 | ||
|         socketConfig =
 | ||
|           { ListenStream = "/var/lib/root-login.socket";
 | ||
|             SocketMode = "0600";
 | ||
|             Accept = true;
 | ||
|           };
 | ||
|       };
 | ||
| 
 | ||
|     systemd.services."root-login@" =
 | ||
|       { description = "Root Login %i";
 | ||
|         environment.TERM = "linux";
 | ||
|         serviceConfig =
 | ||
|           { Type = "simple";
 | ||
|             StandardInput = "socket";
 | ||
|             ExecStart = "${pkgs.socat}/bin/socat -t0 - \"exec:${pkgs.shadow}/bin/login -f root,pty,setsid,setpgid,stderr,ctty\"";
 | ||
|             TimeoutStopSec = 1; # FIXME
 | ||
|           };
 | ||
|       };
 | ||
| 
 | ||
|     # Provide a daemon on /var/lib/run-command.socket that reads a
 | ||
|     # command from stdin and executes it.
 | ||
|     systemd.sockets.run-command =
 | ||
|       { description = "Run Command Socket";
 | ||
|         wantedBy = [ "sockets.target" ];
 | ||
|         socketConfig =
 | ||
|           { ListenStream = "/var/lib/run-command.socket";
 | ||
|             SocketMode = "0600";  # only root can connect
 | ||
|             Accept = true;
 | ||
|           };
 | ||
|       };
 | ||
| 
 | ||
|     systemd.services."run-command@" =
 | ||
|       { description = "Run Command %i";
 | ||
|         environment.TERM = "linux";
 | ||
|         serviceConfig =
 | ||
|           { Type = "simple";
 | ||
|             StandardInput = "socket";
 | ||
|             TimeoutStopSec = 1; # FIXME
 | ||
|           };
 | ||
|         script =
 | ||
|           ''
 | ||
|             #! ${pkgs.stdenv.shell} -e
 | ||
|             source /etc/bashrc
 | ||
|             read c
 | ||
|             eval "command=($c)"
 | ||
|             exec "''${command[@]}"
 | ||
|           '';
 | ||
|       };
 | ||
| 
 | ||
|     systemd.services.container-startup-done =
 | ||
|       { description = "Container Startup Notification";
 | ||
|         wantedBy = [ "multi-user.target" ];
 | ||
|         after = [ "multi-user.target" ];
 | ||
|         script =
 | ||
|           ''
 | ||
|             if [ -p /var/lib/startup-done ]; then
 | ||
|               echo done > /var/lib/startup-done
 | ||
|             fi
 | ||
|           '';
 | ||
|         serviceConfig.Type = "oneshot";
 | ||
|         serviceConfig.RemainAfterExit = true;
 | ||
|       };
 | ||
| 
 | ||
|   };
 | ||
| 
 | ||
| }
 | 
