aboutsummaryrefslogtreecommitdiffstats
path: root/lib/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'lib/default.nix')
-rw-r--r--lib/default.nix43
1 files changed, 32 insertions, 11 deletions
diff --git a/lib/default.nix b/lib/default.nix
index 48e005e..3bbd754 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -28,13 +28,23 @@ let {
# This function's return value can be used as pkgs.populate input.
source: sanitize (eval source).config.source;
- getHostName = let
+ maybeHostName = default: let
# We're parsing /etc/hostname here because reading
# /proc/sys/kernel/hostname yields ""
- y = lib.filter lib.types.label.check (lib.splitString "\n" (lib.readFile /etc/hostname));
+ path = "/etc/hostname";
+ lines = lib.splitString "\n" (lib.readFile path);
+ hostNames = lib.filter lib.types.label.check lines;
in
- if lib.length y != 1 then throw "malformed /etc/hostname" else
- lib.elemAt y 0;
+ if lib.pathExists path then
+ if lib.length hostNames == 1 then
+ lib.head hostNames
+ else
+ lib.trace "malformed ${path}" default
+ else
+ default;
+
+ firstWord = s:
+ lib.head (lib.match "^([^[:space:]]*).*" s);
isLocalTarget = let
origin = lib.mkTarget "";
@@ -43,15 +53,26 @@ let {
lib.elem target.host [origin.host "localhost"];
mkTarget = s: let
- default = defVal: val: if val != null then val else defVal;
- parse = lib.match "(([^@]+)@)?(([^:/]+))?(:([^/]+))?(/.*)?" s;
+ parse = lib.match "(([^@]*)@)?(([^:/]+))?(:([^/]+))?(/.*)?" s;
elemAt' = xs: i: if lib.length xs > i then lib.elemAt xs i else null;
+ filterNull = lib.filterAttrs (n: v: v != null);
in {
- user = default (lib.getEnv "LOGNAME") (elemAt' parse 1);
- host = default (lib.maybeEnv "HOSTNAME" lib.getHostName) (elemAt' parse 3);
- port = default "22" /* "ssh"? */ (elemAt' parse 5);
- path = default "/var/src" /* no default? */ (elemAt' parse 6);
- };
+ user = lib.maybeEnv "LOGNAME" null;
+ host = lib.maybeEnv "HOSTNAME" (lib.maybeHostName "localhost");
+ port = null;
+ path = "/var/src";
+ sudo = false;
+ extraOptions = [];
+ } // (if lib.isString s then filterNull {
+ user = elemAt' parse 1;
+ host = elemAt' parse 3;
+ port = elemAt' parse 5;
+ path = elemAt' parse 6;
+ } else s);
+
+ mkUserPortSSHOpts = target:
+ (lib.optionals (target.user != null) ["-l" target.user]) ++
+ (lib.optionals (target.port != null) ["-p" target.port]);
shell = let
isSafeChar = lib.testString "[-+./0-9:=A-Z_a-z]";