Ticket #10380: dhcp6c

File dhcp6c, 4.1 KB (added by pb@…, 6 years ago)

new version of /etc/init.d/dhcp6c

Line 
1#!/bin/sh /etc/rc.common
2
3DHCP6C_REQUEST_OPTIONS='domain_name_servers domain_name ntp_servers sip_server_address sip_domain_name nis_server_address nis_domain_name nisp_server_address nisp_domain_name bcmcs_server_address bcmcs_domain_name'
4
5get_ifname() {
6        local interface=$1
7        local ifname
8        scan_interfaces
9        config_get ifname "$interface" ifname
10        printf '%s\n' "$ifname"
11        return 0
12}
13
14get_device() {
15        local interface=$1
16        local ifname=$2
17        local device
18        scan_interfaces
19        config_get device "$interface" device
20        grep -qE "^ *$device:" /proc/net/dev && \
21                printf '%s\n' "$device" || \
22                printf '%s\n' "$ifname"
23        return 0
24}
25
26dhcp6c_write_duid() {
27        local mac="${1:-$(ifconfig "$client_device" | sed -ne 's/[[:space:]]*$//; s/.*HWaddr //p')}"
28        local pat="[0-9A-F][0-9A-F]"
29
30        case "$mac" in
31                $pat:$pat:$pat:$pat:$pat:$pat:$pat:$pat:$pat:$pat)
32                        local duid="$mac"
33                        logger -t dhcp6c "Using user provided DUID $mac"
34                ;;
35                $pat:$pat:$pat:$pat:$pat:$pat)
36                        local oIFS="$IFS"; IFS=":"; set -- $mac; IFS="$oIFS"
37                        local duid="00:03:00:06:$1:$2:$3:$4:$5:$6"
38                        logger -t dhcp6c "Using MAC address DUID 00:03:00:06:$1:$2:$3:$4:$5:$6"
39                ;;
40                *)
41                        logger -t dhcp6c "Unable to derive DUID from interface '$client_device' and no valid user DUID given"
42                ;;
43        esac
44       
45        if [ -n "$duid" ]; then
46                # low endian
47                if [ "$(printf \\1 | hexdump -n1 -ve '8/2 "%04x"' | awk '{ print $1 }')" = "0001" ]; then
48                        logger -t dhcp6c "low endian system"
49                        printf \\x0a\\x00
50                # big endian
51                else
52                        logger -t dhcp6c "big endian system"
53                        printf \\x00\\x0a
54                fi
55                printf $(echo "$duid" | sed -e 's/^/\\x/; s/:/\\x/g')
56        fi
57}
58
59dhcp6c_write_interface() {
60        local cfg=$1
61        local sla_id
62        local sla_len
63        local enabled
64       
65        config_get_bool enabled "$cfg" enabled 0
66         
67        if [ $enabled -ne 0 ]; then
68       
69                config_get sla_id "$cfg" sla_id
70                config_get sla_len "$cfg" sla_len
71
72                printf '\tprefix-interface %s {\n' "$(get_ifname $cfg)"
73                printf '\t\tsla-id %s;\n' "$sla_id"
74                printf '\t\tsla-len %s;\n' "$sla_len"
75                printf '\t};\n'
76       
77        fi
78       
79}
80
81dhcp6c_write_request() {
82        printf '\trequest %s;\n' $1 | sed -e s/_/-/g
83}
84
85dhcp6c_write_config() {
86
87        local pd
88        local na
89        config_get_bool pd basic pd 0
90        config_get_bool na basic na 0
91       
92        printf 'interface %s {\n' "$client_ifname"
93       
94        if [ $pd -ne 0 ]; then
95                printf '\tsend ia-pd 0;\n'
96        fi
97       
98        if [ $na -ne 0 ]; then
99                printf '\tsend ia-na 0;\n'
100        fi
101       
102        local rapid_commit
103        config_get_bool rapid_commit basic rapid_commit 0
104        [ $rapid_commit -ne 0 ] && printf '\tsend rapid-commit;\n'
105       
106        local script
107        config_get script basic script
108        [ "$script" != "" ] && printf '\tscript "%s";\n' "$script"
109       
110        local request
111        local value
112        for request in $DHCP6C_REQUEST_OPTIONS; do
113                config_get_bool value basic "$request" 0
114                [ $value -ne 0 ] && dhcp6c_write_request "$request"
115        done
116
117        printf '};\n\n'
118       
119        if [ $pd -ne 0 ]; then
120                printf 'id-assoc pd 0 {\n'
121                config_foreach dhcp6c_write_interface interface
122                printf '};\n\n'
123        fi
124       
125        if [ $na -ne 0 ]; then
126                printf 'id-assoc na 0 {\n'
127                printf '};\n\n'
128        fi
129       
130        return 0
131}
132
133start() {
134
135        [ ! -e /etc/dhcp6cctlkey ] && `dd if=/dev/urandom count=1 2> /dev/null | md5sum | cut -d" " -f1 > /etc/dhcp6cctlkey`
136
137        [ -e /var/run/dhcp6c.pid ] && return 0
138
139        include /lib/network
140
141        config_load "dhcp6c"
142       
143        local enabled
144        config_get_bool enabled basic enabled 0
145        [ $enabled -eq 0 ] && return 0
146
147        local user_duid
148        config_get user_duid basic duid
149
150        logger -t dhcp6c starting dhcp6c
151       
152        local client_interface
153        config_get client_interface basic interface
154        local client_ifname=$(get_ifname "$client_interface")
155        local client_device=$(get_device "$client_interface" "$client_ifname")
156       
157        local config_file="/var/etc/dhcp6c.conf"
158        local duid_file="/var/dhcp6c_duid"
159        mkdir -m 755 -p /var/etc
160        dhcp6c_write_config > $config_file
161        dhcp6c_write_duid "$user_duid" > $duid_file
162       
163        local debug
164        local debug_option
165        config_get_bool debug basic debug 0
166        [ $debug -eq 1 ] && debug_option="-D"
167        /usr/sbin/dhcp6c -c $config_file $debug_option $client_ifname
168       
169        sleep 3
170        ACTION=start /sbin/hotplug-call dhcp6c
171       
172        return 0
173       
174}
175
176stop() {
177
178        logger -t dhcp6c stopping dhcp6c
179        service_kill dhcp6c /var/run/dhcp6c.pid
180        rm -f /var/etc/dhcp6c.conf /var/run/dhcp6c.pid
181        ACTION=stop /sbin/hotplug-call dhcp6c
182        return 0
183       
184}
185
186