c9f8eb0c31467c569563873dbcbb61103f9ea5ff
[oweals/openwrt.git] / package / base-files / files / lib / functions / system.sh
1 # Copyright (C) 2006-2013 OpenWrt.org
2
3 . /usr/share/libubox/jshn.sh
4
5 get_mac_binary() {
6         local path="$1"
7         local offset="$2"
8
9         if ! [ -e "$path" ]; then
10                 echo "get_mac_binary: file $path not found!" >&2
11                 return
12         fi
13
14         hexdump -v -n 6 -s $offset -e '5/1 "%02x:" 1/1 "%02x"' $path 2>/dev/null
15 }
16
17 get_mac_label_dt() {
18         local basepath="/proc/device-tree"
19         local macdevice="$(cat "$basepath/aliases/label-mac-device" 2>/dev/null)"
20         local macaddr
21
22         [ -n "$macdevice" ] || return
23
24         macaddr=$(get_mac_binary "$basepath/$macdevice/mac-address" 0 2>/dev/null)
25         [ -n "$macaddr" ] || macaddr=$(get_mac_binary "$basepath/$macdevice/local-mac-address" 0 2>/dev/null)
26
27         echo $macaddr
28 }
29
30 get_mac_label_json() {
31         local cfg="/etc/board.json"
32         local macaddr
33
34         [ -s "$cfg" ] || return
35
36         json_init
37         json_load "$(cat $cfg)"
38         if json_is_a system object; then
39                 json_select system
40                         json_get_var macaddr label_macaddr
41                 json_select ..
42         fi
43
44         echo $macaddr
45 }
46
47 get_mac_label() {
48         local macaddr=$(get_mac_label_dt)
49
50         [ -n "$macaddr" ] || macaddr=$(get_mac_label_json)
51
52         echo $macaddr
53 }
54
55 find_mtd_chardev() {
56         local INDEX=$(find_mtd_index "$1")
57         local PREFIX=/dev/mtd
58
59         [ -d /dev/mtd ] && PREFIX=/dev/mtd/
60         echo "${INDEX:+$PREFIX$INDEX}"
61 }
62
63 mtd_get_mac_ascii() {
64         local mtdname="$1"
65         local key="$2"
66         local part
67         local mac_dirty
68
69         part=$(find_mtd_part "$mtdname")
70         if [ -z "$part" ]; then
71                 echo "mtd_get_mac_ascii: partition $mtdname not found!" >&2
72                 return
73         fi
74
75         mac_dirty=$(strings "$part" | sed -n 's/^'"$key"'=//p')
76
77         # "canonicalize" mac
78         [ -n "$mac_dirty" ] && macaddr_canonicalize "$mac_dirty"
79 }
80
81 mtd_get_mac_text() {
82         local mtdname=$1
83         local offset=$(($2))
84         local part
85         local mac_dirty
86
87         part=$(find_mtd_part "$mtdname")
88         if [ -z "$part" ]; then
89                 echo "mtd_get_mac_text: partition $mtdname not found!" >&2
90                 return
91         fi
92
93         if [ -z "$offset" ]; then
94                 echo "mtd_get_mac_text: offset missing!" >&2
95                 return
96         fi
97
98         mac_dirty=$(dd if="$part" bs=1 skip="$offset" count=17 2>/dev/null)
99
100         # "canonicalize" mac
101         [ -n "$mac_dirty" ] && macaddr_canonicalize "$mac_dirty"
102 }
103
104 mtd_get_mac_binary() {
105         local mtdname="$1"
106         local offset="$2"
107         local part
108
109         part=$(find_mtd_part "$mtdname")
110         get_mac_binary "$part" "$offset"
111 }
112
113 mtd_get_mac_binary_ubi() {
114         local mtdname="$1"
115         local offset="$2"
116
117         . /lib/upgrade/nand.sh
118
119         local ubidev=$(nand_find_ubi $CI_UBIPART)
120         local part=$(nand_find_volume $ubidev $1)
121
122         get_mac_binary "/dev/$part" "$offset"
123 }
124
125 mtd_get_part_size() {
126         local part_name=$1
127         local first dev size erasesize name
128         while read dev size erasesize name; do
129                 name=${name#'"'}; name=${name%'"'}
130                 if [ "$name" = "$part_name" ]; then
131                         echo $((0x$size))
132                         break
133                 fi
134         done < /proc/mtd
135 }
136
137 macaddr_add() {
138         local mac=$1
139         local val=$2
140         local oui=${mac%:*:*:*}
141         local nic=${mac#*:*:*:}
142
143         nic=$(printf "%06x" $((0x${nic//:/} + val & 0xffffff)) | sed 's/^\(.\{2\}\)\(.\{2\}\)\(.\{2\}\)/\1:\2:\3/')
144         echo $oui:$nic
145 }
146
147 macaddr_geteui() {
148         local mac=$1
149         local sep=$2
150
151         echo ${mac:9:2}$sep${mac:12:2}$sep${mac:15:2}
152 }
153
154 macaddr_setbit_la() {
155         local mac=$1
156
157         printf "%02x:%s" $((0x${mac%%:*} | 0x02)) ${mac#*:}
158 }
159
160 macaddr_2bin() {
161         local mac=$1
162
163         echo -ne \\x${mac//:/\\x}
164 }
165
166 macaddr_canonicalize() {
167         local mac="$1"
168         local canon=""
169
170         mac=$(echo -n $mac | tr -d \")
171         [ ${#mac} -gt 17 ] && return
172         [ -n "${mac//[a-fA-F0-9\.: -]/}" ] && return
173
174         for octet in ${mac//[\.:-]/ }; do
175                 case "${#octet}" in
176                 1)
177                         octet="0${octet}"
178                         ;;
179                 2)
180                         ;;
181                 4)
182                         octet="${octet:0:2} ${octet:2:2}"
183                         ;;
184                 12)
185                         octet="${octet:0:2} ${octet:2:2} ${octet:4:2} ${octet:6:2} ${octet:8:2} ${octet:10:2}"
186                         ;;
187                 *)
188                         return
189                         ;;
190                 esac
191                 canon=${canon}${canon:+ }${octet}
192         done
193
194         [ ${#canon} -ne 17 ] && return
195
196         printf "%02x:%02x:%02x:%02x:%02x:%02x" 0x${canon// / 0x} 2>/dev/null
197 }