diff --git a/flake.nix b/flake.nix index c80afe8..862e05d 100644 --- a/flake.nix +++ b/flake.nix @@ -20,7 +20,9 @@ { packages = forAllSystems (pkgs: rec { utils = pkgs.callPackage ./meta.nix { inherit tunnel; }; - tunnel = pkgs.callPackage ./tunnel-go { }; + tunnel-go = pkgs.callPackage ./tunnel-go { }; + tunnel-nim = pkgs.callPackage ./tunnel-nim { }; + tunnel = tunnel-nim; default = utils; }); devShells = forAllSystems (pkgs: { diff --git a/tunnel-nim/tunnel.nim b/tunnel-nim/tunnel.nim index 1941630..0a26ec2 100644 --- a/tunnel-nim/tunnel.nim +++ b/tunnel-nim/tunnel.nim @@ -1,24 +1,18 @@ import std/[os, osproc, sequtils, strformat, strutils, sugar] - import cligen proc checkHost(host: seq[string]): string = case host.len: - of 0: quit "expected hostname" of 1: return host[0] - else: quit "expected one positinal argument" + of 0: quit "expected hostname" + else: quit "expected one positinal argument" +proc check(name: string): bool = (execCmd &"ssh -O check {name}") == 0 +proc startSsh(name: string) = discard execCmd &"ssh -M -f -N {name}" +proc activateTunnel(name: string, port: int): int = execCmd &"""ssh -fNL "{port}:localhost:{port}" {name}""" +proc exitSsh(name: string):int = execCmd &"ssh -O exit {name}" -proc check(name: string): bool = - (execCmd &"ssh -O check {name}") == 0 -proc startSsh(name: string) = - discard execCmd &"ssh -M -f -N {name}" -proc activateTunnel(name: string, port: int): int = - execCmd &"""ssh -fNL "{port}:localhost:{port}" {name}""" -proc exitSsh(name: string):int = - execCmd &"ssh -O exit {name}" - -proc up(port: int, host: seq[string]) = +proc up(port: int, host: seq[string]) = ## activate a tunnel let name = checkHost host echo "activating connection to", name @@ -27,7 +21,7 @@ proc up(port: int, host: seq[string]) = quit activateTunnel(name, port) -proc down(host: seq[string]) = +proc down(host: seq[string]) = ## disable all tunnels let name = checkHost host echo "deactivating connection to", name @@ -36,7 +30,7 @@ proc down(host: seq[string]) = proc show() = ## show active connections let sshDir = (getEnv "HOME") / ".ssh" - let controllers = + let controllers = collect(for _,p in walkDir(sshDir): p) .map(extractFilename) .filterIt(it.startsWith("control")) @@ -44,9 +38,9 @@ proc show() = if controllers.len == 0: quit 0 echo "hosts:" echo controllers.mapIt(" " & it.split('-')[1]).join("\n") - -const - hostUsage = "$command [flags] hostname\n${doc}Options:\n$options" + +const + hostUsage = "$command [flags] hostname\n${doc}Options:\n$options" usage = "$command [flags]\n${doc}Options:\n$options" dispatchMulti([up, usage=hostUsage], [down, usage=hostUsage], [show, usage=usage])