[package] add mac-to-devinfo (#5373)
[openwrt/svn-archive/archive.git] / net / mac-to-devinfo / files / mac-to-devinfo
1 #!/bin/sh
2
3 UCIBIN=uci
4 UCIFUNC=/usr/lib/mac-to-devinfo/devinfo-functions.sh
5 OVERRIDETABLE=mactodevinfo
6 DEVDB=macdevdb
7 UCICONFIG=/etc/config
8
9 OUIURL=http://standards.ieee.org/regauth/oui/oui.txt
10 IABURL=http://standards.ieee.org/regauth/oui/iab.txt
11
12 OUIDIR=/var/cache/mac-to-devinfo
13
14 OUIFILE=$OUIDIR/oui.txt
15 IABFILE=$OUIDIR/iab.txt
16
17 UCIDEVDB=/usr/share/mac-to-devinfo
18 UCISTATE="$(mktemp -t)"
19
20 . $UCIFUNC
21
22 MAC=$1
23
24 if [ -z "$MAC" ]; then
25 echo "Must specify MAC address"
26 exit 1
27 fi
28
29 parse_override() {
30 local cfg="$1"
31 config_get name "$cfg" name
32 config_get maclow "$cfg" maclow
33 config_get machigh "$cfg" machigh
34 config_get vendor "$cfg" vendor
35 config_get devtype "$cfg" devtype
36 config_get model "$cfg" model
37 config_get ouiowneroverride "$cfg" ouiowner
38 LOW=$(echo $maclow | sed -e 's/://g')
39 HIGH=$(echo $machigh | sed -e 's/://g')
40 if [ -z "$LOW" ] || [ -z "$HIGH" ] || [ -n "$(echo $LOW | grep -E -v '^[0-9A-Fa-f]{12}$')" ] || [ -n "$(echo $HIGH | grep -E -v '^[0-9A-Fa-f]{12}$')" ]; then
41 echo "Invalid mac range for $name: $ouiowneroverride $vendor $devtype $model : $LOW-$HIGH" >&2
42 return 1
43 fi
44
45 LOWMSB=$(expr substr "$LOW" 1 6)
46 LOWLSB=$(expr substr "$LOW" 7 6)
47 HIGHMSB=$(expr substr "$HIGH" 1 6)
48 HIGHLSB=$(expr substr "$HIGH" 7 6)
49
50 if [ -z "$LOWMSB" ] || [ -z "$LOWLSB" ] || [ -z "$HIGHMSB" ] || [ -z "$HIGHLSB" ]; then
51 echo "Error splitting database address strings"
52 return 1
53 fi
54
55 MACMSB=$(expr substr "$MACNUM" 1 6)
56 MACLSB=$(expr substr "$MACNUM" 7 6)
57
58 if [ -z "$MACMSB" ] || [ -z "$MACLSB" ]; then
59 echo "Error spliiting mac address string"
60 return 1
61 fi
62
63 if [ -n "$ouiowneroverride" ]; then
64 OUIOWNER="$ouiowneroverride"
65 fi
66 if [ $((0x$MACMSB)) -ge $((0x$LOWMSB)) ] && [ $((0x$MACMSB)) -le $((0x$HIGHMSB)) ]; then
67 if [ $((0x$MACLSB)) -ge $((0x$LOWLSB)) ] && [ $((0x$MACLSB)) -le $((0x$HIGHLSB)) ]; then
68 if [ -n "$OUTSTRING" ]; then
69 echo "ERROR: We already have found information '$OUTSTRING'" >&2
70 echo -n "and now we have: " >&2
71 echo "$MAC | $OUIOWNER | $vendor | $devtype | $model" >&2
72 return 1
73 else
74 echo "$MAC | $OUIOWNER | $vendor | $devtype | $model"
75 return 0
76 fi
77 fi
78 fi
79 return 0
80 }
81
82 if [ ! -r "$OUIFILE" ] || [ ! -r "$IABFILE" ]; then
83 echo "Missing IEEE Registration Authority Database. Please run prep-devinfo"
84 exit 1
85 fi
86
87 OUI="$(echo $MAC | cut -f1-3 -d: | sed -e 's/:/-/g' | tr abcdef ABCDEF )"
88
89 OUIOWNER="$(cat $OUIFILE | grep $OUI | tr -s '\t' | cut -f2- -d"$(printf '\t')" )"
90
91 if [ -z "$OUIOWNER" ] || [ "$OUIOWNER" = "IEEE REGISTRATION AUTHORITY" ]; then
92 if [ -n "$(cat $IABFILE | grep $OUI)" ]; then
93 LOWRANGE="$(echo $MAC | cut -f4-6 -d: | sed -e 's/://g' | tr abcdef ABCDEF )"
94 for range in $(cat $IABFILE |grep -E '[0-9A-F]{6}\-[0-9A-F]{6}' |cut -f1 -d"$(printf '\t')" ); do
95 LOW="$(echo $range | cut -f1 -d- )"
96 HIGH="$(echo $range | cut -f2 -d- )"
97 if [ -z "$LOW" ] || [ -z "$HIGH" ]; then
98 echo "Error parsing IAB table"
99 exit 1
100
101 fi
102 LOWMSB=$(expr substr "$LOW" 1 6)
103 LOWLSB=$(expr substr "$LOW" 7 6)
104 HIGHMSB=$(expr substr "$HIGH" 1 6)
105 HIGHLSB=$(expr substr "$HIGH" 7 6)
106
107 if [ -z "$LOWMSB" ] || [ -z "$LOWLSB" ] || [ -z "$HIGHMSB" ] || [ -z "$HIGHLSB" ]; then
108 echo "Error splitting registration authority IAB address strings"
109 exit 1
110 fi
111
112 MACMSB=$(expr substr "$LOWRANGE" 1 6)
113 MACLSB=$(expr substr "$LOWRANGE" 7 6)
114
115 if [ -z "$MACMSB" ] || [ -z "$MACLSB" ]; then
116 echo "Error splitting mac address string"
117 exit 1
118 fi
119 if [ $((0x$MACMSB)) -ge $((0x$LOWMSB)) ] && [ $((0x$MACMSB)) -le $((0x$HIGHMSB)) ]; then
120 if [ $((0x$MACLSB)) -ge $((0x$LOWLSB)) ] && [ $((0x$MACLSB)) -le $((0x$HIGHLSB)) ]; then
121 OUIOWNER="$(cat $IABFILE | grep "$LOW-$HIGH" | tr -s '\t' | cut -f3- -d"$(printf '\t')" )"
122 break;
123 fi
124 fi
125 done
126 fi
127 fi
128
129 if [ -z "$OUIOWNER" ]; then
130 OUIOWNER="Unknown Organization"
131 fi
132
133 MACNUM="$(echo $MAC |sed -e 's/://g' | tr ABCDEF abcdef )"
134
135 UCI="$UCIBIN -c $UCIDEVDB"
136 config_load $DEVDB
137 DEVSTRING=$(config_foreach parse_override mactodevinfo)
138
139 SAVEDEVSTRING="$DEVSTRING"
140
141 UCI="$UCIBIN -c $UCICONFIG"
142 config_load $OVERRIDETABLE
143 DEVSTRING=$(config_foreach parse_override mactodevinfo)
144
145 if [ -z "$DEVSTRING" ]; then
146 if [ -z "$SAVEDEVSTRING" ]; then
147 echo "$MAC | $OUIOWNER | unknown | unknown | unknown"
148 else
149 echo "$SAVEDEVSTRING"
150 fi
151 else
152 echo "$DEVSTRING"
153 fi
154
155 rm -f $UCISTATE