1 #!/bin/sh 2 [ -z "$2" ] && echo "Error: should be run by odhcpc6c" && exit 1 3 4 update_resolv() { 5 local device="$1" 6 local dns="$2" 7 8 ( 9 flock 9 10 grep -v "#odhcp6c:$device:" /etc/resolv.conf > /tmp/resolv.conf.tmp 11 for c in $dns; do 12 echo "nameserver $c #odhcp6c:$device:" >> /tmp/resolv.conf.tmp 13 done 14 mv /tmp/resolv.conf.tmp /etc/resolv.conf 15 chmod 0644 /etc/resolv.conf 16 ) 9>/tmp/resolv.conf.lock 17 rm -f /tmp/resolv.conf.lock /tmp/resolv.conf.tmp 18 } 19 20 setup_interface () { 21 local device="$1" 22 23 # Merge RA-DNS 24 for radns in $RA_DNS; do 25 local duplicate=0 26 for dns in $RDNSS; do 27 [ "$radns" = "$dns" ] && duplicate=1 28 done 29 [ "$duplicate" = 0 ] && RDNSS="$RDNSS $radns" 30 done 31 32 update_resolv "$device" "$RDNSS" 33 34 local prefixpart="" 35 for entry in $PREFIXES; do 36 local addr="${entry%%,*}" 37 entry="${entry#*,}" 38 local preferred="${entry%%,*}" 39 entry="${entry#*,}" 40 local valid="${entry%%,*}" 41 entry="${entry#*,}" 42 [ "$entry" = "$valid" ] && entry= 43 44 local class="" 45 local excluded="" 46 47 while [ -n "$entry" ]; do 48 local key="${entry%%=*}" 49 entry="${entry#*=}" 50 local val="${entry%%,*}" 51 entry="${entry#*,}" 52 [ "$entry" = "$val" ] && entry= 53 54 if [ "$key" = "class" ]; then 55 class=", \"class\": $val" 56 elif [ "$key" = "excluded" ]; then 57 excluded=", \"excluded\": \"$val\"" 58 fi 59 done 60 61 local prefix="{\"address\": \"$addr\", \"preferred\": $preferred, \"valid\": $valid $class $excluded}" 62 63 if [ -z "$prefixpart" ]; then 64 prefixpart="$prefix" 65 else 66 prefixpart="$prefixpart, $prefix" 67 fi 68 69 # TODO: delete this somehow when the prefix disappears 70 ip -6 route add unreachable "$addr" 71 done 72 73 ip -6 route flush dev "$device" 74 ip -6 address flush dev "$device" scope global 75 76 # Merge addresses 77 for entry in $RA_ADDRESSES; do 78 local duplicate=0 79 local addr="${entry%%/*}" 80 for dentry in $ADDRESSES; do 81 local daddr="${dentry%%/*}" 82 [ "$addr" = "$daddr" ] && duplicate=1 83 done 84 [ "$duplicate" = "0" ] && ADDRESSES="$ADDRESSES $entry" 85 done 86 87 for entry in $ADDRESSES; do 88 local addr="${entry%%,*}" 89 entry="${entry#*,}" 90 local preferred="${entry%%,*}" 91 entry="${entry#*,}" 92 local valid="${entry%%,*}" 93 94 ip -6 address add "$addr" dev "$device" preferred_lft "$preferred" valid_lft "$valid" 95 done 96 97 for entry in $RA_ROUTES; do 98 local addr="${entry%%,*}" 99 entry="${entry#*,}" 100 local gw="${entry%%,*}" 101 entry="${entry#*,}" 102 local valid="${entry%%,*}" 103 entry="${entry#*,}" 104 local metric="${entry%%,*}" 105 106 if [ -n "$gw" ]; then 107 ip -6 route add "$addr" via "$gw" metric "$metric" dev "$device" from "::/128" 108 else 109 ip -6 route add "$addr" metric "$metric" dev "$device" 110 fi 111 112 for prefix in $PREFIXES; do 113 local paddr="${prefix%%,*}" 114 [ -n "$gw" ] && ip -6 route add "$addr" via "$gw" metric "$metric" dev "$device" from "$paddr" 115 done 116 done 117 } 118 119 teardown_interface() { 120 local device="$1" 121 ip -6 route flush dev "$device" 122 ip -6 address flush dev "$device" scope global 123 update_resolv "$device" "" 124 } 125 126 ( 127 flock 9 128 case "$2" in 129 bound) 130 teardown_interface "$1" 131 setup_interface "$1" 132 ;; 133 informed|updated|rebound|ra-updated) 134 setup_interface "$1" 135 ;; 136 stopped|unbound) 137 teardown_interface "$1" 138 ;; 139 started) 140 teardown_interface "$1" 141 ;; 142 esac 143 144 # user rules 145 [ -f /etc/odhcp6c.user ] && . /etc/odhcp6c.user 146 ) 9>/tmp/odhcp6c.lock.$1 147 rm -f /tmp/odhcp6c.lock.$1
This page was automatically generated by LXR 0.3.1. • OpenWrt