| 1 | #!/bin/sh /etc/rc.common |
| 2 | # Copyright (c) 2011-2012 OpenWrt.org |
| 3 | START=80 |
| 4 | |
| 5 | resolve_ifname() { |
| 6 | grep -qs "^ *$1:" /proc/net/dev && { |
| 7 | append ifaces "$1" |
| 8 | } |
| 9 | } |
| 10 | |
| 11 | resolve_network() { |
| 12 | local ifn |
| 13 | fixup_interface "$1" |
| 14 | config_get ifn "$1" ifname |
| 15 | [ -z "$ifn" ] && return 1 |
| 16 | resolve_ifname "$ifn" |
| 17 | } |
| 18 | |
| 19 | start_6relayd() { |
| 20 | local cfg="$1" |
| 21 | local mode="$2" |
| 22 | local args="-s -l" |
| 23 | local ifaces="" |
| 24 | |
| 25 | SERVICE_DAEMONIZE=1 |
| 26 | SERVICE_WRITE_PID=1 |
| 27 | SERVICE_PID_FILE="/var/run/6relayd-$cfg.pid" |
| 28 | [ -f "$SERVICE_PID_FILE" ] && { |
| 29 | if grep -q 6relayd "/proc/$(cat $SERVICE_PID_FILE)/cmdline"; then |
| 30 | return 0 |
| 31 | else |
| 32 | rm -f "$SERVICE_PID_FILE" |
| 33 | fi |
| 34 | } |
| 35 | |
| 36 | local net networks |
| 37 | config_get networks "$cfg" network |
| 38 | for net in $networks; do |
| 39 | resolve_network "$net" || { |
| 40 | return 1 |
| 41 | } |
| 42 | done |
| 43 | |
| 44 | local ifn ifnames |
| 45 | config_get ifnames "$cfg" ifname |
| 46 | for ifn in $ifnames; do |
| 47 | resolve_ifname "$ifn" |
| 48 | done |
| 49 | |
| 50 | local rd |
| 51 | config_get rd "$cfg" rd |
| 52 | [ -n "$rd" ] && append args "-R$rd" |
| 53 | |
| 54 | local dhcpv6 |
| 55 | config_get dhcpv6 "$cfg" dhcpv6 |
| 56 | [ -n "$dhcpv6" ] && append args "-D$dhcpv6" |
| 57 | |
| 58 | local ndp |
| 59 | config_get ndp "$cfg" ndp |
| 60 | [ "$ndp" == "relay" ] && append args "-N -r" |
| 61 | |
| 62 | local always_rewrite_dns |
| 63 | config_get_bool always_rewrite_dns "$cfg" always_rewrite_dns 0 |
| 64 | [ $always_rewrite_dns -eq 1 ] && append args "-n" |
| 65 | |
| 66 | # In server mode the first interface needs to be passed twice |
| 67 | [ "$mode" == "server" ] && ifaces=". $ifaces" |
| 68 | |
| 69 | service_start /usr/sbin/6relayd $args $ifaces |
| 70 | } |
| 71 | |
| 72 | stop() { |
| 73 | for pid in /var/run/6relayd-*.pid; do |
| 74 | SERVICE_PID_FILE="$pid" |
| 75 | service_stop /usr/sbin/6relayd |
| 76 | rm -f "$SERVICE_PID_FILE" |
| 77 | done |
| 78 | } |
| 79 | |
| 80 | start() { |
| 81 | include /lib/network |
| 82 | config_load 6relayd |
| 83 | config_foreach start_6relayd relay relay |
| 84 | config_foreach start_6relayd server server |
| 85 | } |
| 86 | |