odhcp6c-example-script.sh 3.5 KB

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