ove QEMU (and other NixOS instances that use a remote filesystem like NFS): * Don't take down the network interfaces during shutdown. * Don't try to unmount the Nix store. Usually, this doesn't work because it's still in use, but on remote filesystems like CIFS the `-f' umount flag actually works. svn path=/nixos/branches/modular-nixos/; revision=16036
		
			
				
	
	
		
			170 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{pkgs, config, ...}:
 | 
						|
 | 
						|
let
 | 
						|
 | 
						|
  inherit (pkgs.lib) mkOption;
 | 
						|
 | 
						|
 | 
						|
###### interface
 | 
						|
 | 
						|
  options = {
 | 
						|
 | 
						|
    networking.hostName = mkOption {
 | 
						|
      default = "nixos";
 | 
						|
      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 = "
 | 
						|
        Whether to use IPv6 even though gw6c is not used. For example, 
 | 
						|
        for Postfix.
 | 
						|
      ";
 | 
						|
    };
 | 
						|
 | 
						|
    networking.defaultGateway = mkOption {
 | 
						|
      default = "";
 | 
						|
      example = "131.211.84.1";
 | 
						|
      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 = "
 | 
						|
        The list of nameservers.  It can be left empty if it is auto-detected through DHCP.
 | 
						|
      ";
 | 
						|
    };
 | 
						|
 | 
						|
    networking.domain = mkOption {
 | 
						|
      default = "";
 | 
						|
      example = "home";
 | 
						|
      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 = "
 | 
						|
        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.
 | 
						|
      ";
 | 
						|
    };
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
 | 
						|
###### implementation
 | 
						|
 | 
						|
  inherit (pkgs) nettools wirelesstools bash writeText;
 | 
						|
 | 
						|
  cfg = config.networking;
 | 
						|
 | 
						|
  # !!! 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;
 | 
						|
 | 
						|
in 
 | 
						|
 | 
						|
{
 | 
						|
  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..."
 | 
						|
                  extraFlags=
 | 
						|
                  if test "$subnetMask" != default; then
 | 
						|
                      extraFlags="$extraFlags netmask $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
 | 
						|
    '';
 | 
						|
  }];
 | 
						|
}
 |