summary refs log tree commit diff
path: root/modules/tasks/network-interfaces.nix
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2009-07-16 17:18:54 +0000
committerEelco Dolstra <eelco.dolstra@logicblox.com>2009-07-16 17:18:54 +0000
commitb58682401ede3842ba41fd6665f27630650413bd (patch)
tree6952c62b2b3f444d14f45d006d8a47d028ad6e90 /modules/tasks/network-interfaces.nix
parentf53c9d70ec2f056957151ea4198bbdc836da65bd (diff)
downloadnixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar
nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar.gz
nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar.bz2
nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar.lz
nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar.xz
nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.tar.zst
nixpkgs-b58682401ede3842ba41fd6665f27630650413bd.zip
* Give a type to networking.interfaces.
* Simplified the pre-start script of the network-interfaces module.
* Removed wireless support from the network-interfaces module.  It
  only worked for static WEP configurations anyway, and AFAIK nobody
  used it.

svn path=/nixos/branches/modular-nixos/; revision=16406
Diffstat (limited to 'modules/tasks/network-interfaces.nix')
-rw-r--r--modules/tasks/network-interfaces.nix237
1 files changed, 127 insertions, 110 deletions
diff --git a/modules/tasks/network-interfaces.nix b/modules/tasks/network-interfaces.nix
index d075d04ed6b..d2e01370668 100644
--- a/modules/tasks/network-interfaces.nix
+++ b/modules/tasks/network-interfaces.nix
@@ -2,168 +2,185 @@
 
 let
 
-  inherit (pkgs.lib) mkOption;
+  inherit (pkgs.lib) mkOption types;
 
+  inherit (pkgs) nettools;
 
-###### interface
+  cfg = config.networking;
+
+in 
+
+{
+
+  ###### interface
 
   options = {
 
     networking.hostName = mkOption {
       default = "nixos";
-      description = "
+      description = ''
         The name of the machine.  Leave it empty if you want to obtain
         it from a DHCP server (if using DHCP).
-      ";
+      '';
     };
 
     networking.nativeIPv6 = mkOption {
       default = false;
-      description = "
+      description = ''
         Whether to use IPv6 even though gw6c is not used. For example, 
         for Postfix.
-      ";
+      '';
     };
 
     networking.defaultGateway = mkOption {
       default = "";
       example = "131.211.84.1";
-      description = "
+      description = ''
         The default gateway.  It can be left empty if it is auto-detected through DHCP.
-      ";
+      '';
     };
 
     networking.nameservers = mkOption {
       default = [];
       example = ["130.161.158.4" "130.161.33.17"];
-      description = "
+      description = ''
         The list of nameservers.  It can be left empty if it is auto-detected through DHCP.
-      ";
+      '';
     };
 
     networking.domain = mkOption {
       default = "";
       example = "home";
-      description = "
+      description = ''
         The domain.  It can be left empty if it is auto-detected through DHCP.
-      ";
+      '';
     };
 
     networking.localCommands = mkOption {
       default = "";
       example = "text=anything; echo You can put $text here.";
-      description = "
+      description = ''
         Shell commands to be executed at the end of the
         <literal>network-interfaces</literal> Upstart job.  Note that if
         you are using DHCP to obtain the network configuration,
         interfaces may not be fully configured yet.
-      ";
+      '';
+    };
+
+    networking.interfaces = mkOption {
+      default = [];
+      example = [
+        { name = "eth0";
+          ipAddress = "131.211.84.78";
+          subnetMask = "255.255.255.128";
+        }
+      ];
+      description = ''
+        The configuration for each network interface.  If
+        <option>networking.useDHCP</option> is true, then every
+        interface not listed here will be configured using DHCP.
+      '';
+
+      type = types.list types.optionSet;
+
+      options = {
+
+        name = mkOption {
+          example = "eth0";
+          type = types.string;
+          description = ''
+            Name of the interface.
+          '';
+        };
+
+        ipAddress = mkOption {
+          default = "";
+          example = "10.0.0.1";
+          type = types.string;
+          description = ''
+            IP address of the interface.  Leave empty to configure the
+            interface using DHCP.
+          '';
+        };
+
+        subnetMask = mkOption {
+          default = "";
+          example = "255.255.255.0";
+          type = types.string;
+          description = ''
+            Subnet mask of the interface.  Leave empty to use the
+            default subnet mask.
+          '';
+        };
+
+      };
+      
     };
 
   };
 
 
-###### implementation
+  ###### implementation
 
-  inherit (pkgs) nettools wirelesstools bash writeText;
+  config = {
 
-  cfg = config.networking;
+    jobs = pkgs.lib.singleton
+      { name = "network-interfaces";
 
-  # !!! use XML
-  names = map (i: i.name) cfg.interfaces;
-  ipAddresses = map (i: if i ? ipAddress then i.ipAddress else "dhcp") cfg.interfaces;
-  subnetMasks = map (i: if i ? subnetMask then i.subnetMask else "default") cfg.interfaces;
-  essids = map (i: if i ? essid then i.essid else "default") cfg.interfaces;
-  wepKeys = map (i: if i ? wepKey then i.wepKey else "nokey") cfg.interfaces;
-  modprobe = config.system.sbin.modprobe;
+        startOn = "udev";
 
-in 
+        preStart =
+          ''
+            export PATH=${config.system.sbin.modprobe}/sbin:$PATH
+            modprobe af_packet || true
 
-{
-  require = [options];
-
-  services.extraJobs = [{
-    name = "network-interfaces";
-
-    job = ''
-      start on udev
-      stop on shutdown
-
-      start script
-          export PATH=${modprobe}/sbin:$PATH
-          modprobe af_packet || true
-
-          for i in $(cd /sys/class/net && ls -d *); do
-              echo "Bringing up network device $i..."
-              ${nettools}/sbin/ifconfig $i up || true
-          done
-
-          # Configure the manually specified interfaces.
-          names=(${toString names})
-          ipAddresses=(${toString ipAddresses})
-          subnetMasks=(${toString subnetMasks})
-          essids=(${toString essids})
-          wepKeys=(${toString wepKeys})
-
-          for ((n = 0; n < ''${#names[*]}; n++)); do
-              name=''${names[$n]}
-              ipAddress=''${ipAddresses[$n]}
-              subnetMask=''${subnetMasks[$n]}
-              essid=''${essids[$n]}
-              wepKey=''${wepKeys[$n]}
-
-              # Set wireless networking stuff.
-              if test "$essid" != default; then
-                  ${wirelesstools}/sbin/iwconfig "$name" essid "$essid" || true
-              fi
-
-              if test "$wepKey" != nokey; then
-                  ${wirelesstools}/sbin/iwconfig "$name" key "$(cat "$wepKey")" || true
-              fi
-
-              # Set IP address / netmask.        
-              if test "$ipAddress" != dhcp; then
-                  echo "Configuring interface $name..."
+            for i in $(cd /sys/class/net && ls -d *); do
+                echo "Bringing up network device $i..."
+                ${nettools}/sbin/ifconfig $i up || true
+            done
+
+            # Configure the manually specified interfaces.
+            ${pkgs.lib.concatMapStrings (i:
+              if i.ipAddress != "" then
+                ''
+                  echo "Configuring interface ${i.name}..."
                   extraFlags=
-                  if test "$subnetMask" != default; then
-                      extraFlags="$extraFlags netmask $subnetMask"
+                  if test -n "${i.subnetMask}"; then
+                      extraFlags="$extraFlags netmask ${i.subnetMask}"
                   fi
-                  ${nettools}/sbin/ifconfig "$name" "$ipAddress" $extraFlags || true
-              fi
-
-          done
-
-          # Set the nameservers.
-          if test -n "${toString cfg.nameservers}"; then
-              rm -f /etc/resolv.conf
-              if test -n "${cfg.domain}"; then
-                  echo "domain ${cfg.domain}" >> /etc/resolv.conf
-              fi
-              for i in ${toString cfg.nameservers}; do
-                  echo "nameserver $i" >> /etc/resolv.conf
-              done
-          fi
-
-          # Set the default gateway.
-          if test -n "${cfg.defaultGateway}"; then
-              ${nettools}/sbin/route add default gw "${cfg.defaultGateway}" || true
-          fi
-
-          # Run any user-specified commands.
-          ${bash}/bin/sh ${writeText "local-net-cmds" cfg.localCommands} || true
-
-      end script
-
-      # Hack: Upstart doesn't yet support what we want: a service that
-      # doesn't have a running process associated with it.
-      respawn sleep 100000
-
-      stop script
-          #for i in $(cd /sys/class/net && ls -d *); do
-          #    echo "Taking down network device $i..."
-          #    ${nettools}/sbin/ifconfig $i down || true
-          #done
-      end script
-    '';
-  }];
+                  ${nettools}/sbin/ifconfig "${i.name}" "${i.ipAddress}" $extraFlags || true
+                ''
+              else "") cfg.interfaces}
+
+            # Set the nameservers.
+            if test -n "${toString cfg.nameservers}"; then
+                rm -f /etc/resolv.conf
+                if test -n "${cfg.domain}"; then
+                    echo "domain ${cfg.domain}" >> /etc/resolv.conf
+                fi
+                for i in ${toString cfg.nameservers}; do
+                    echo "nameserver $i" >> /etc/resolv.conf
+                done
+            fi
+
+            # Set the default gateway.
+            if test -n "${cfg.defaultGateway}"; then
+                ${nettools}/sbin/route add default gw "${cfg.defaultGateway}" || true
+            fi
+
+            # Run any user-specified commands.
+            ${pkgs.stdenv.shell} ${pkgs.writeText "local-net-cmds" cfg.localCommands} || true
+          '';
+
+        postStop =
+          ''
+            #for i in $(cd /sys/class/net && ls -d *); do
+            #    echo "Taking down network device $i..."
+            #    ${nettools}/sbin/ifconfig $i down || true
+            #done
+          '';
+    };
+
+  };
+  
 }