aboutsummaryrefslogtreecommitdiff
path: root/infra/libkookie/nixpkgs/nixos/tests/upnp.nix
diff options
context:
space:
mode:
authorMx Kookie <kookie@spacekookie.de>2020-10-31 19:35:09 +0100
committerMx Kookie <kookie@spacekookie.de>2020-10-31 19:35:09 +0100
commitc4625b175f8200f643fd6e11010932ea44c78433 (patch)
treebce3f89888c8ac3991fa5569a878a9eab6801ccc /infra/libkookie/nixpkgs/nixos/tests/upnp.nix
parent49f735974dd103039ddc4cb576bb76555164a9e7 (diff)
parentd661aa56a8843e991261510c1bb28fdc2f6975ae (diff)
Add 'infra/libkookie/' from commit 'd661aa56a8843e991261510c1bb28fdc2f6975ae'
git-subtree-dir: infra/libkookie git-subtree-mainline: 49f735974dd103039ddc4cb576bb76555164a9e7 git-subtree-split: d661aa56a8843e991261510c1bb28fdc2f6975ae
Diffstat (limited to 'infra/libkookie/nixpkgs/nixos/tests/upnp.nix')
-rw-r--r--infra/libkookie/nixpkgs/nixos/tests/upnp.nix96
1 files changed, 96 insertions, 0 deletions
diff --git a/infra/libkookie/nixpkgs/nixos/tests/upnp.nix b/infra/libkookie/nixpkgs/nixos/tests/upnp.nix
new file mode 100644
index 000000000000..a7d837ea0708
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/tests/upnp.nix
@@ -0,0 +1,96 @@
+# This tests whether UPnP port mappings can be created using Miniupnpd
+# and Miniupnpc.
+# It runs a Miniupnpd service on one machine, and verifies
+# a client can indeed create a port mapping using Miniupnpc. If
+# this succeeds an external client will try to connect to the port
+# mapping.
+
+import ./make-test-python.nix ({ pkgs, ... }:
+
+let
+ internalRouterAddress = "192.168.3.1";
+ internalClient1Address = "192.168.3.2";
+ externalRouterAddress = "80.100.100.1";
+ externalClient2Address = "80.100.100.2";
+in
+{
+ name = "upnp";
+ meta = with pkgs.stdenv.lib.maintainers; {
+ maintainers = [ bobvanderlinden ];
+ };
+
+ nodes =
+ {
+ router =
+ { pkgs, nodes, ... }:
+ { virtualisation.vlans = [ 1 2 ];
+ networking.nat.enable = true;
+ networking.nat.internalInterfaces = [ "eth2" ];
+ networking.nat.externalInterface = "eth1";
+ networking.firewall.enable = true;
+ networking.firewall.trustedInterfaces = [ "eth2" ];
+ networking.interfaces.eth1.ipv4.addresses = [
+ { address = externalRouterAddress; prefixLength = 24; }
+ ];
+ networking.interfaces.eth2.ipv4.addresses = [
+ { address = internalRouterAddress; prefixLength = 24; }
+ ];
+ services.miniupnpd = {
+ enable = true;
+ externalInterface = "eth1";
+ internalIPs = [ "eth2" ];
+ appendConfig = ''
+ ext_ip=${externalRouterAddress}
+ '';
+ };
+ };
+
+ client1 =
+ { pkgs, nodes, ... }:
+ { environment.systemPackages = [ pkgs.miniupnpc_2 pkgs.netcat ];
+ virtualisation.vlans = [ 2 ];
+ networking.defaultGateway = internalRouterAddress;
+ networking.interfaces.eth1.ipv4.addresses = [
+ { address = internalClient1Address; prefixLength = 24; }
+ ];
+ networking.firewall.enable = false;
+
+ services.httpd.enable = true;
+ services.httpd.virtualHosts.localhost = {
+ listen = [{ ip = "*"; port = 9000; }];
+ adminAddr = "foo@example.org";
+ documentRoot = "/tmp";
+ };
+ };
+
+ client2 =
+ { pkgs, ... }:
+ { environment.systemPackages = [ pkgs.miniupnpc_2 ];
+ virtualisation.vlans = [ 1 ];
+ networking.interfaces.eth1.ipv4.addresses = [
+ { address = externalClient2Address; prefixLength = 24; }
+ ];
+ networking.firewall.enable = false;
+ };
+ };
+
+ testScript =
+ { nodes, ... }:
+ ''
+ start_all()
+
+ # Wait for network and miniupnpd.
+ router.wait_for_unit("network-online.target")
+ # $router.wait_for_unit("nat")
+ router.wait_for_unit("firewall.service")
+ router.wait_for_unit("miniupnpd")
+
+ client1.wait_for_unit("network-online.target")
+
+ client1.succeed("upnpc -a ${internalClient1Address} 9000 9000 TCP")
+
+ client1.wait_for_unit("httpd")
+ client2.wait_until_succeeds("curl http://${externalRouterAddress}:9000/")
+ '';
+
+})