Blob Blame History Raw
#!/bin/sh
# dnssec-trigger script handling possible backup and restore of resolv.conf

SCRIPT_NAME="dnssec-trigger-resolvconf-handle.sh"
STATE_DIR="/var/run/dnssec-trigger"
RESOLV_CONF="/etc/resolv.conf"
RESOLV_CONF_BAK="$STATE_DIR/resolv.conf.bak"
NM_CONFIG="/etc/NetworkManager/NetworkManager.conf"

usage()
{
    echo
    echo "This script backs up or restores /etc/resolv.conf content"
    echo "Usage: $SCRIPT_NAME [backup|restore]"
}

# check number of arguments
if ! [ "$#" -eq 1 ]; then
    echo "ERROR: Wrong number of arguments!"
    usage
    exit 1
fi

does_nm_handle_resolv_conf()
{
    grep -x "^dns=none" $NM_CONFIG &> /dev/null
    echo "$?"
}

backup_resolv_conf()
{
    # find out if NM handles the resolv.conf
    if [ "`does_nm_handle_resolv_conf`" -eq 0 ]; then
        cp -fp $RESOLV_CONF $RESOLV_CONF_BAK
    fi
}

restore_resolv_conf()
{
    # if we have a backup and NM does not handle resolv.conf -> restore it
    if [ "`does_nm_handle_resolv_conf`" -eq 0 ] && [ -s $RESOLV_CONF_BAK ]; then
        cp -fp $RESOLV_CONF_BAK $RESOLV_CONF
    else
        # get global nameservers
        # try to get nmcli version
        NMCLI_VER="`nmcli -v 2> /dev/null | sed 's/.*version \([0-9]\)\.\([0-9]\)\.\([0-9]\)\.\([0-9]\).*/\1\2\3\4/'`"
        # if nmcli exists
        if [ -n $NMCLI_VER ]; then
            # if the version is greater or equal 0.9.9.0
                if [ $NMCLI_VER -ge 0990 ]; then
                    global_nameservers="`nmcli -f IP4,IP6 dev show | fgrep 'DNS' | awk '{print $2;}'`"
                else
                    global_nameservers="`nmcli -f IP4,IP6 dev list | fgrep 'DNS' | awk '{print $2;}'`"
                fi
        # nmcli does not exist
        else
            global_nameservers="`nm-tool | grep 'DNS:' | awk '{print $2;}'`"
        fi
        # fix whitespaces
        global_nameservers="`echo $global_nameservers`"

        # write servers to the resolv.conf
        echo "# generated by $SCRIPT_NAME script" > $RESOLV_CONF
        for server in $global_nameservers ; do
            echo "nameserver $server" >> $RESOLV_CONF
        done
    fi
}

case "$1" in
    backup)
        backup_resolv_conf
        ;;
    restore)
        restore_resolv_conf
        ;;
    *)
        echo "ERROR: Wrong argument!"
        usage
        exit 1
esac

exit 0