Unverified Commit c9e3cc43 authored by Rémy Grünblatt's avatar Rémy Grünblatt Committed by GitHub
Browse files

nixos: fix iproute2 invocations (#263976)

When using iproute2's ip binary, you can omit the dev parameter, e.g. ip link set up eth0 instead of ip link set up dev eth0.

This breaks if for some reason your device is named e.g. he, hel, … because it is interpreted as ip link set up help.

I just encountered this bug using networking.bridges trying to create an interface named he.

I used a grep on nixpkgs to try to find iproute2 invocations using variables without the dev keyword, and found a few, and fixed them by providing the dev keyword.

I merely fixed what I found, but the use of abbreviated commands makes it a bit hard to be sure everything has been found (e.g. ip l set … up instead of ip link set … up).
parent 5cea7ee4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ let

      export PATH=$PATH:${pkgs.iproute2}/sbin

      ip link set $IFNAME up
      ip link set dev $IFNAME up
      ip address add ${cfg.ipAddress} dev $IFNAME
      ip route add ${cfg.subnet} dev $IFNAME

+3 −3
Original line number Diff line number Diff line
@@ -138,7 +138,7 @@ in
        # Bring up all interfaces.
        for iface in ${dhcpIfShellExpr}; do
          echo "bringing up network interface $iface..."
          ip link set "$iface" up && ifaces="$ifaces $iface"
          ip link set dev "$iface" up && ifaces="$ifaces $iface"
        done

        # Acquire DHCP leases.
@@ -152,8 +152,8 @@ in

    boot.initrd.postMountCommands = mkIf cfg.flushBeforeStage2 ''
      for iface in $ifaces; do
        ip address flush "$iface"
        ip link set "$iface" down
        ip address flush dev "$iface"
        ip link set dev "$iface" down
      done
    '';

+31 −31
Original line number Diff line number Diff line
@@ -28,12 +28,12 @@ let
      SLAVES=$(ip link | grep 'master ${i}' | awk -F: '{print $2}')
      for I in $SLAVES; do
        UPDATED=0
        ip link set "$I" nomaster
        ip link set dev "$I" nomaster
      done
      [ "$UPDATED" -eq "1" ] && break
    done
    ip link set "${i}" down 2>/dev/null || true
    ip link del "${i}" 2>/dev/null || true
    ip link set dev "${i}" down 2>/dev/null || true
    ip link del dev "${i}" 2>/dev/null || true
  '';

  # warn that these attributes are deprecated (2017-2-2)
@@ -193,7 +193,7 @@ let
                state="/run/nixos/network/addresses/${i.name}"
                mkdir -p $(dirname "$state")

                ip link set "${i.name}" up
                ip link set dev "${i.name}" up

                ${flip concatMapStrings ips (ip:
                  let
@@ -270,7 +270,7 @@ let
              ip tuntap add dev "${i.name}" mode "${i.virtualType}" user "${i.virtualOwner}"
            '';
            postStop = ''
              ip link del ${i.name} || true
              ip link del dev ${i.name} || true
            '';
          };

@@ -291,15 +291,15 @@ let
            script = ''
              # Remove Dead Interfaces
              echo "Removing old bridge ${n}..."
              ip link show dev "${n}" >/dev/null 2>&1 && ip link del "${n}"
              ip link show dev "${n}" >/dev/null 2>&1 && ip link del dev "${n}"

              echo "Adding bridge ${n}..."
              ip link add name "${n}" type bridge

              # Enslave child interfaces
              ${flip concatMapStrings v.interfaces (i: ''
                ip link set "${i}" master "${n}"
                ip link set "${i}" up
                ip link set dev "${i}" master "${n}"
                ip link set dev "${i}" up
              '')}
              # Save list of enslaved interfaces
              echo "${flip concatMapStrings v.interfaces (i: ''
@@ -316,7 +316,7 @@ let
                    for uri in qemu:///system lxc:///; do
                      for dom in $(${pkgs.libvirt}/bin/virsh -c $uri list --name); do
                        ${pkgs.libvirt}/bin/virsh -c $uri dumpxml "$dom" | \
                        ${pkgs.xmlstarlet}/bin/xmlstarlet sel -t -m "//domain/devices/interface[@type='bridge'][source/@bridge='${n}'][target/@dev]" -v "concat('ip link set ',target/@dev,' master ',source/@bridge,';')" | \
                        ${pkgs.xmlstarlet}/bin/xmlstarlet sel -t -m "//domain/devices/interface[@type='bridge'][source/@bridge='${n}'][target/@dev]" -v "concat('ip link set dev ',target/@dev,' master ',source/@bridge,';')" | \
                        ${pkgs.bash}/bin/bash
                      done
                    done
@@ -328,23 +328,23 @@ let
                echo 2 >/sys/class/net/${n}/bridge/stp_state
              ''}

              ip link set "${n}" up
              ip link set dev "${n}" up
            '';
            postStop = ''
              ip link set "${n}" down || true
              ip link del "${n}" || true
              ip link set dev "${n}" down || true
              ip link del dev "${n}" || true
              rm -f /run/${n}.interfaces
            '';
            reload = ''
              # Un-enslave child interfaces (old list of interfaces)
              for interface in `cat /run/${n}.interfaces`; do
                ip link set "$interface" nomaster up
                ip link set dev "$interface" nomaster up
              done

              # Enslave child interfaces (new list of interfaces)
              ${flip concatMapStrings v.interfaces (i: ''
                ip link set "${i}" master "${n}"
                ip link set "${i}" up
                ip link set dev "${i}" master "${n}"
                ip link set dev "${i}" up
              '')}
              # Save list of enslaved interfaces
              echo "${flip concatMapStrings v.interfaces (i: ''
@@ -395,7 +395,7 @@ let
            postStop = ''
              echo "Cleaning Open vSwitch ${n}"
              echo "Shutting down internal ${n} interface"
              ip link set ${n} down || true
              ip link set dev ${n} down || true
              echo "Deleting flows for ${n}"
              ovs-ofctl --protocols=${v.openFlowVersion} del-flows ${n} || true
              echo "Deleting Open vSwitch ${n}"
@@ -433,10 +433,10 @@ let
              while [ ! -d "/sys/class/net/${n}" ]; do sleep 0.1; done;

              # Bring up the bond and enslave the specified interfaces
              ip link set "${n}" up
              ip link set dev "${n}" up
              ${flip concatMapStrings v.interfaces (i: ''
                ip link set "${i}" down
                ip link set "${i}" master "${n}"
                ip link set dev "${i}" down
                ip link set dev "${i}" master "${n}"
              '')}
            '';
            postStop = destroyBond n;
@@ -457,13 +457,13 @@ let
            path = [ pkgs.iproute2 ];
            script = ''
              # Remove Dead Interfaces
              ip link show dev "${n}" >/dev/null 2>&1 && ip link delete "${n}"
              ip link show dev "${n}" >/dev/null 2>&1 && ip link delete dev "${n}"
              ip link add link "${v.interface}" name "${n}" type macvlan \
                ${optionalString (v.mode != null) "mode ${v.mode}"}
              ip link set "${n}" up
              ip link set dev "${n}" up
            '';
            postStop = ''
              ip link delete "${n}" || true
              ip link delete dev "${n}" || true
            '';
          });

@@ -515,7 +515,7 @@ let
            path = [ pkgs.iproute2 ];
            script = ''
              # Remove Dead Interfaces
              ip link show dev "${n}" >/dev/null 2>&1 && ip link delete "${n}"
              ip link show dev "${n}" >/dev/null 2>&1 && ip link delete dev "${n}"
              ip link add name "${n}" type sit \
                ${optionalString (v.remote != null) "remote \"${v.remote}\""} \
                ${optionalString (v.local != null) "local \"${v.local}\""} \
@@ -526,10 +526,10 @@ let
                    optionalString (v.encapsulation.sourcePort != null)
                      "encap-sport ${toString v.encapsulation.sourcePort}"
                  }"}
              ip link set "${n}" up
              ip link set dev "${n}" up
            '';
            postStop = ''
              ip link delete "${n}" || true
              ip link delete dev "${n}" || true
            '';
          });

@@ -549,16 +549,16 @@ let
            path = [ pkgs.iproute2 ];
            script = ''
              # Remove Dead Interfaces
              ip link show dev "${n}" >/dev/null 2>&1 && ip link delete "${n}"
              ip link show dev "${n}" >/dev/null 2>&1 && ip link delete dev "${n}"
              ip link add name "${n}" type ${v.type} \
                ${optionalString (v.remote != null) "remote \"${v.remote}\""} \
                ${optionalString (v.local != null) "local \"${v.local}\""} \
                ${optionalString (v.ttl != null) "${ttlarg} ${toString v.ttl}"} \
                ${optionalString (v.dev != null) "dev \"${v.dev}\""}
              ip link set "${n}" up
              ip link set dev "${n}" up
            '';
            postStop = ''
              ip link delete "${n}" || true
              ip link delete dev "${n}" || true
            '';
          });

@@ -577,17 +577,17 @@ let
            path = [ pkgs.iproute2 ];
            script = ''
              # Remove Dead Interfaces
              ip link show dev "${n}" >/dev/null 2>&1 && ip link delete "${n}"
              ip link show dev "${n}" >/dev/null 2>&1 && ip link delete dev "${n}"
              ip link add link "${v.interface}" name "${n}" type vlan id "${toString v.id}"

              # We try to bring up the logical VLAN interface. If the master
              # interface the logical interface is dependent upon is not up yet we will
              # fail to immediately bring up the logical interface. The resulting logical
              # interface will brought up later when the master interface is up.
              ip link set "${n}" up || true
              ip link set dev "${n}" up || true
            '';
            postStop = ''
              ip link delete "${n}" || true
              ip link delete dev "${n}" || true
            '';
          });

+1 −1
Original line number Diff line number Diff line
@@ -442,7 +442,7 @@ in
            postStop = ''
              echo "Cleaning Open vSwitch ${n}"
              echo "Shutting down internal ${n} interface"
              ip link set ${n} down || true
              ip link set dev ${n} down || true
              echo "Deleting flows for ${n}"
              ovs-ofctl --protocols=${v.openFlowVersion} del-flows ${n} || true
              echo "Deleting Open vSwitch ${n}"
+1 −1
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ stdenv.mkDerivation rec {
  ];

  postPatch = ''
    sed -e 's@"/sbin/ifconfig.*"@"${iproute2}/sbin/ip link set $IFNAME address $MAC mtu $MTU"@' -i src/device-linux.C
    sed -e 's@"/sbin/ifconfig.*"@"${iproute2}/sbin/ip link set dev $IFNAME address $MAC mtu $MTU"@' -i src/device-linux.C
    sed -e 's@/sbin/ifconfig@${nettools}/sbin/ifconfig@g' -i src/device-*.C
  '';