• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/odhcp6c/odhcp6c-example-script.sh

  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