Skip to content

Instantly share code, notes, and snippets.

@tachang
Created April 10, 2015 19:37

Revisions

  1. tachang created this gist Apr 10, 2015.
    58 changes: 58 additions & 0 deletions network-restart.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,58 @@
    #!/bin/bash
    #
    # Yury V. Zaytsev <[email protected]> (C) 2011
    #
    # This work is herewith placed in public domain.
    #
    # Use this script to cleanly restart the default libvirt network after its
    # definition have been changed (e.g. added new static MAC+IP mappings) in order
    # for the changes to take effect. Restarting the network alone, however, causes
    # the guests to lose connectivity with the host until their network interfaces
    # are re-attached.
    #
    # The script re-attaches the interfaces by obtaining the information about them
    # from the current libvirt definitions. It has the following dependencies:
    #
    # - virsh (obviously)
    # - tail / head / grep / awk / cut
    # - XML::XPath (e.g. perl-XML-XPath package)
    #
    # Note that it assumes that the guests have exactly 1 NAC each attached to the
    # given network! Extensions to account for more (or none) interfaces etc. are,
    # of course, most welcome.
    #
    # ZYV
    #

    set -e
    set -u

    NETWORK_NAME=default
    NETWORK_HOOK=/etc/libvirt/hooks/qemu

    #virsh net-define /opt/config/libvirt/network-$NETWORK_NAME.xml
    virsh net-destroy $NETWORK_NAME
    virsh net-start $NETWORK_NAME

    MACHINES=$( virsh list | tail -n +3 | head -n -1 | awk '{ print $2; }' )

    for m in $MACHINES ; do

    echo "$m"
    MACHINE_INFO=$( virsh dumpxml "$m" | xpath -e /domain/devices/interface[1] 2> /dev/null )

    echo "$MACHINE_INFO"
    MACHINE_MAC=$( echo "$MACHINE_INFO" | grep "mac address" | cut -d '"' -f 2 )

    echo "$MACHINE_MAC"
    MACHINE_MOD=$( echo "$MACHINE_INFO" | grep "model type" | cut -d '"' -f 2 )

    set +e
    virsh detach-interface "$m" network --mac "$MACHINE_MAC" && sleep 3
    virsh attach-interface "$m" network $NETWORK_NAME --mac "$MACHINE_MAC" --model "$MACHINE_MOD"
    set -e

    #$NETWORK_HOOK "$m" stopped && sleep 3
    #$NETWORK_HOOK "$m" start

    done