aboutsummaryrefslogtreecommitdiffstats
path: root/network-scripts/ifup-post
blob: 4cb986f8a467b2014e052e9e64d3613f82fc6bf3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/bash

# Source the general functions for is_true() and is_false():
. /etc/init.d/functions

cd /etc/sysconfig/network-scripts
. ./network-functions

[ -f ../network ] && . ../network

unset REALDEVICE
if [ "$1" = --realdevice ] ; then
    REALDEVICE=$2
    shift 2
fi

CONFIG=$1
source_config

[ -z "$REALDEVICE" ] && REALDEVICE=$DEVICE

if is_false "$ISALIAS"; then
    /etc/sysconfig/network-scripts/ifup-aliases ${DEVICE} ${CONFIG}
fi

if ! is_true "$NOROUTESET"; then
    /etc/sysconfig/network-scripts/ifup-routes ${REALDEVICE} ${DEVNAME}
fi


if ! is_false "${PEERDNS}" || is_true "${RESOLV_MODS}"; then
    # Obtain the DNS entries when using PPP if necessary:
    [ -n "${MS_DNS1}" ] && DNS1="${MS_DNS1}"
    [ -n "${MS_DNS2}" ] && DNS2="${MS_DNS2}"

    # Remove duplicate DNS entries and shift them, if necessary:
    update_DNS_entries

    # Determine what regexp we should use (for testing below):
    if   [ -n "${DNS3}" ]; then
        grep_regexp="[^#]?nameserver[[:space:]]+${DNS1}[^#]?nameserver[[:space:]]+${DNS2}[^#]?nameserver[[:space:]]+${DNS3}"
    elif [ -n "${DNS2}" ]; then
        grep_regexp="[^#]?nameserver[[:space:]]+${DNS1}[^#]?nameserver[[:space:]]+${DNS2}"
    elif [ -n "${DNS1}" ]; then
        grep_regexp="[^#]?nameserver[[:space:]]+${DNS1}"
    else
        # No DNS entries used at all ->> match everything.
        grep_regexp=".*"
    fi

    # Test if the search field needs updating, or
    # if the nameserver entries order should be updated:
    if [ -n "${DOMAIN}" ] && ! grep -q "^search.*${DOMAIN}.*$" /etc/resolv.conf ||
        ! tr --delete '\n' < /etc/resolv.conf | grep -E -q "${grep_regexp}"; then

        if tmp_file=$(mktemp); then
            search_str=''

            while read line; do
                case ${line} in

                    # Skip nameserver entries when at least one DNS option was given
                    # (at this stage we know that we have to update all the nameserver
                    # enries anyway -- see below), or copy them if we are changing just
                    # the 'search' field in /etc/resolv.conf:
                    nameserver*)
                        if [[ "${grep_regexp}" != ".*" ]]; then
                            continue
                        else
                            echo "${line}" >> "${tmp_file}"
                        fi
                        ;;

                    domain* | search*)
                        if [ -n "${DOMAIN}" ]; then
                            read search value < <(echo ${line})
                            search_str+=" ${value}"
                        else
                            echo "${line}" >> "${tmp_file}"
                        fi
                        ;;

                    # Keep the rest of the /etc/resolv.conf as it was:
                    *)
                        echo "${line}" >> "${tmp_file}"
                        ;;
                esac
            done < /etc/resolv.conf

            # Insert the domain into 'search' field:
            if [ -n "${DOMAIN}" ]; then
                echo "search ${DOMAIN}${search_str}" >> "${tmp_file}"
            fi

            # Add the requested nameserver entries:
            [ -n "${DNS1}" ] && echo "nameserver ${DNS1}" >> "${tmp_file}"
            [ -n "${DNS2}" ] && echo "nameserver ${DNS2}" >> "${tmp_file}"
            [ -n "${DNS3}" ] && echo "nameserver ${DNS3}" >> "${tmp_file}"

            # Backup resolv.conf only if it doesn't exist already:
            ! [ -f /etc/resolv.conf.save ] && cp -af /etc/resolv.conf /etc/resolv.conf.save

            # Maintain permissions, but set umask in case it doesn't exist:
            umask_old=$(umask)
            umask 022

            # Update the resolv.conf:
            change_resolv_conf "${tmp_file}"

            rm -f "${tmp_file}"
            umask ${umask_old}
            unset tmp_file search_str umask_old
        else
            net_log $"/etc/resolv.conf was not updated: failed to create temporary file" 'err' 'ifup-post'
        fi
    fi

    unset grep_regexp
fi

# don't set hostname on ppp/slip connections
if [ "$2" = "boot" -a \
        "${DEVICE}" != lo -a \
        "${DEVICETYPE}" != "ppp" -a \
        "${DEVICETYPE}" != "slip" ]; then
    if need_hostname; then
        IPADDR=$(LANG=C ip -o -4 addr ls dev ${DEVICE} | awk '{ print $4 ; exit }')
        eval $(/bin/ipcalc --silent --hostname ${IPADDR} ; echo "status=$?")
        if [ "$status" = "0" ]; then
            set_hostname $HOSTNAME
        fi
    fi
fi

# Set firewall ZONE for this device (empty ZONE means default):
if [ "${REALDEVICE}" != "lo" ]; then
    dbus-send --print-reply --system --dest=org.fedoraproject.FirewallD1 \
              /org/fedoraproject/FirewallD1 \
              org.fedoraproject.FirewallD1.zone.changeZoneOfInterface \
              string:"${ZONE}" string:"${DEVICE}" \
              > /dev/null 2>&1
fi

if [ -x /sbin/ifup-local ]; then
    /sbin/ifup-local ${DEVICE}
fi

exit 0