From 7e4c13ace70c83dadf127ff8b13b68ccca6d928b Mon Sep 17 00:00:00 2001 From: Florian Fainelli Date: Mon, 6 Jul 2009 11:38:01 +0000 Subject: [PATCH] [package] add mac-to-devinfo (#5373) SVN-Revision: 16712 --- net/mac-to-devinfo/Makefile | 87 ++++++++++ net/mac-to-devinfo/files/devinfo-functions.sh | 122 ++++++++++++++ net/mac-to-devinfo/files/ip-to-devinfo | 29 ++++ net/mac-to-devinfo/files/mac-to-devinfo | 155 ++++++++++++++++++ net/mac-to-devinfo/files/macdevdb | 19 +++ net/mac-to-devinfo/files/mactodevinfo | 2 + .../files/netdiscover-to-devinfo | 26 +++ net/mac-to-devinfo/files/prep-devinfo | 15 ++ net/mac-to-devinfo/files/smap-to-devinfo | 37 +++++ 9 files changed, 492 insertions(+) create mode 100644 net/mac-to-devinfo/Makefile create mode 100644 net/mac-to-devinfo/files/devinfo-functions.sh create mode 100644 net/mac-to-devinfo/files/ip-to-devinfo create mode 100644 net/mac-to-devinfo/files/mac-to-devinfo create mode 100644 net/mac-to-devinfo/files/macdevdb create mode 100644 net/mac-to-devinfo/files/mactodevinfo create mode 100644 net/mac-to-devinfo/files/netdiscover-to-devinfo create mode 100644 net/mac-to-devinfo/files/prep-devinfo create mode 100644 net/mac-to-devinfo/files/smap-to-devinfo diff --git a/net/mac-to-devinfo/Makefile b/net/mac-to-devinfo/Makefile new file mode 100644 index 0000000000..7d4c4e111d --- /dev/null +++ b/net/mac-to-devinfo/Makefile @@ -0,0 +1,87 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=mac-to-devinfo +PKG_VERSION:=1.0.0 +PKG_RELEASE:=1 + +PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/mac-to-devinfo + SECTION:=net + CATEGORY:=Network + TITLE:=MAC Address to Device Information +endef + +define Package/mac-to-devinfo/description + Scripts to take a mac address (or ip if the ip is in the arp cache) + and translate it into device information (mostly OUI owner, from the + IEEE data files, but more information may be available for specific + devices/vendors). +endef + +define Package/smap-to-devinfo + SECTION:=net + CATEGORY:=Network + DEPENDS:=mac-to-devinfo +smap +httping + TITLE:=SIP Device Information from Scan +endef + +define Package/smap-to-devinfo/description + A script to use smap to discover all SIP devices on the networks + (provided ICMP and SIP are allowed to the network from the host) and + translate (through the ip then mac) into the device information. +endef + +define Package/netdiscover-to-devinfo + SECTION:=net + CATEGORY:=Network + DEPENDS:=mac-to-devinfo +netdiscover + TITLE:=Device Information from Scan for MAC addresses +endef + +define Package/netdiscover-to-devinfo/description + A script to use netdiscover to discover all devices on the specified + arp-able networks and translate into the device information. +endef + +define Build/Prepare +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/mac-to-devinfo/conffiles +/etc/config/mactodevinfo +endef + +define Package/mac-to-devinfo/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) ./files/mac-to-devinfo $(1)/usr/bin + $(INSTALL_BIN) ./files/ip-to-devinfo $(1)/usr/bin + $(INSTALL_BIN) ./files/prep-devinfo $(1)/usr/bin + $(INSTALL_DIR) $(1)/usr/lib/mac-to-devinfo + $(INSTALL_BIN) ./files/devinfo-functions.sh $(1)/usr/lib/mac-to-devinfo + $(INSTALL_DIR) $(1)/usr/share/mac-to-devinfo + $(CP) ./files/macdevdb $(1)/usr/share/mac-to-devinfo + $(INSTALL_DIR) $(1)/etc/config + $(CP) ./files/mactodevinfo $(1)/etc/config +endef + +define Package/smap-to-devinfo/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) ./files/smap-to-devinfo $(1)/usr/bin +endef + +define Package/netdiscover-to-devinfo/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) ./files/netdiscover-to-devinfo $(1)/usr/bin +endef + +$(eval $(call BuildPackage,mac-to-devinfo)) +$(eval $(call BuildPackage,smap-to-devinfo)) +$(eval $(call BuildPackage,netdiscover-to-devinfo)) diff --git a/net/mac-to-devinfo/files/devinfo-functions.sh b/net/mac-to-devinfo/files/devinfo-functions.sh new file mode 100644 index 0000000000..8ee999c3cc --- /dev/null +++ b/net/mac-to-devinfo/files/devinfo-functions.sh @@ -0,0 +1,122 @@ +#!/bin/sh +# Shell script compatibility wrappers for /sbin/uci +# +# Copyright (C) 2008 Felix Fietkau +# Copyright (C) 2009 Daniel Dickinson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# $UCI and $UCISTATE must be set + +CONFIG_APPEND= +_C=0 +LOAD_STATE=1 +LIST_SEP=" " + +config_load() { + local PACKAGE="$1" + local DATA + local RET + + _C=0 + + if [ -z "$CONFIG_APPEND" ]; then + CONFIG_SECTIONS= + CONFIG_NUM_SECTIONS=0 + CONFIG_SECTION= + fi + export NO_EXPORT= + DATA="$($UCI -P $UCISTATE -S -n export "$PACKAGE" 2>/dev/null)" + RET="$?" + [ "$RET" != 0 -o -z "$DATA" ] || eval "$DATA" + unset DATA + + ${CONFIG_SECTION:+config_cb} + return "$RET" +} + +reset_cb() { + config_cb() { return 0; } + option_cb() { return 0; } + list_cb() { return 0; } +} +reset_cb +config () { + local cfgtype="$1" + local name="$2" + + CONFIG_NUM_SECTIONS=$(($CONFIG_NUM_SECTIONS + 1)) + name="${name:-cfg$CONFIG_NUM_SECTIONS}" + append CONFIG_SECTIONS "$name" + [ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name" + CONFIG_SECTION="$name" + eval "CONFIG_${CONFIG_SECTION}_TYPE=\"$cfgtype\"" +} + +option () { + local varname="$1"; shift + local value="$*" + + eval "CONFIG_${CONFIG_SECTION}_${varname}=\"$value\"" + [ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*" +} + +list() { + local varname="$1"; shift + local value="$*" + local len + + config_get len "$CONFIG_SECTION" "${varname}_LENGTH" + len="$((${len:-0} + 1))" + config_set "$CONFIG_SECTION" "${varname}_ITEM$len" "$value" + config_set "$CONFIG_SECTION" "${varname}_LENGTH" "$len" + append "CONFIG_${CONFIG_SECTION}_${varname}" "$value" "$LIST_SEP" + list_cb "$varname" "$*" +} + +config_get() { + case "$3" in + "") eval "echo \"\${CONFIG_${1}_${2}}\"";; + *) eval "$1=\${CONFIG_${2}_${3}}";; + esac +} + +config_foreach() { + local function="$1" + [ "$#" -ge 1 ] && shift + local type="$1" + [ "$#" -ge 1 ] && shift + local section cfgtype + + [ -z "$CONFIG_SECTIONS" ] && return 0 + for section in ${CONFIG_SECTIONS}; do + config_get cfgtype "$section" TYPE + [ -n "$type" -a "x$cfgtype" != "x$type" ] && continue + $function "$section" "$@" + done +} + +package() { + return 0 +} + +append() { + local var="$1" + local value="$2" + local sep="${3:- }" + + eval "$var=\${$var:+\${$var}\${value:+\$sep}}\$value" +} + diff --git a/net/mac-to-devinfo/files/ip-to-devinfo b/net/mac-to-devinfo/files/ip-to-devinfo new file mode 100644 index 0000000000..2ac2677b2d --- /dev/null +++ b/net/mac-to-devinfo/files/ip-to-devinfo @@ -0,0 +1,29 @@ +#!/bin/sh + +ARP=arp +MACTODEV=mac-to-devinfo + +IP=$1 + +if [ -z "$IP" ]; then + echo "Must specify IP address" +fi + +if [ ! -x "$(which $ARP)" ]; then + do_arp() { + cat /proc/net/arp + } + ARPMACFIELD=4 +else + do_arp() { + $ARP -n + } + ARPMACFIELD=3 +fi + +ping -q -c 2 $IP >/dev/null +MAC=$(do_arp|grep "$IP "|tr -s \ | cut -f$ARPMACFIELD -d\ ) + +$MACTODEV $MAC + + diff --git a/net/mac-to-devinfo/files/mac-to-devinfo b/net/mac-to-devinfo/files/mac-to-devinfo new file mode 100644 index 0000000000..37d132e0c0 --- /dev/null +++ b/net/mac-to-devinfo/files/mac-to-devinfo @@ -0,0 +1,155 @@ +#!/bin/sh + +UCIBIN=uci +UCIFUNC=/usr/lib/mac-to-devinfo/devinfo-functions.sh +OVERRIDETABLE=mactodevinfo +DEVDB=macdevdb +UCICONFIG=/etc/config + +OUIURL=http://standards.ieee.org/regauth/oui/oui.txt +IABURL=http://standards.ieee.org/regauth/oui/iab.txt + +OUIDIR=/var/cache/mac-to-devinfo + +OUIFILE=$OUIDIR/oui.txt +IABFILE=$OUIDIR/iab.txt + +UCIDEVDB=/usr/share/mac-to-devinfo +UCISTATE="$(mktemp -t)" + +. $UCIFUNC + +MAC=$1 + +if [ -z "$MAC" ]; then + echo "Must specify MAC address" + exit 1 +fi + +parse_override() { + local cfg="$1" + config_get name "$cfg" name + config_get maclow "$cfg" maclow + config_get machigh "$cfg" machigh + config_get vendor "$cfg" vendor + config_get devtype "$cfg" devtype + config_get model "$cfg" model + config_get ouiowneroverride "$cfg" ouiowner + LOW=$(echo $maclow | sed -e 's/://g') + HIGH=$(echo $machigh | sed -e 's/://g') + 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 + echo "Invalid mac range for $name: $ouiowneroverride $vendor $devtype $model : $LOW-$HIGH" >&2 + return 1 + fi + + LOWMSB=$(expr substr "$LOW" 1 6) + LOWLSB=$(expr substr "$LOW" 7 6) + HIGHMSB=$(expr substr "$HIGH" 1 6) + HIGHLSB=$(expr substr "$HIGH" 7 6) + + if [ -z "$LOWMSB" ] || [ -z "$LOWLSB" ] || [ -z "$HIGHMSB" ] || [ -z "$HIGHLSB" ]; then + echo "Error splitting database address strings" + return 1 + fi + + MACMSB=$(expr substr "$MACNUM" 1 6) + MACLSB=$(expr substr "$MACNUM" 7 6) + + if [ -z "$MACMSB" ] || [ -z "$MACLSB" ]; then + echo "Error spliiting mac address string" + return 1 + fi + + if [ -n "$ouiowneroverride" ]; then + OUIOWNER="$ouiowneroverride" + fi + if [ $((0x$MACMSB)) -ge $((0x$LOWMSB)) ] && [ $((0x$MACMSB)) -le $((0x$HIGHMSB)) ]; then + if [ $((0x$MACLSB)) -ge $((0x$LOWLSB)) ] && [ $((0x$MACLSB)) -le $((0x$HIGHLSB)) ]; then + if [ -n "$OUTSTRING" ]; then + echo "ERROR: We already have found information '$OUTSTRING'" >&2 + echo -n "and now we have: " >&2 + echo "$MAC | $OUIOWNER | $vendor | $devtype | $model" >&2 + return 1 + else + echo "$MAC | $OUIOWNER | $vendor | $devtype | $model" + return 0 + fi + fi + fi + return 0 +} + +if [ ! -r "$OUIFILE" ] || [ ! -r "$IABFILE" ]; then + echo "Missing IEEE Registration Authority Database. Please run prep-devinfo" + exit 1 +fi + +OUI="$(echo $MAC | cut -f1-3 -d: | sed -e 's/:/-/g' | tr abcdef ABCDEF )" + +OUIOWNER="$(cat $OUIFILE | grep $OUI | tr -s '\t' | cut -f2- -d"$(printf '\t')" )" + +if [ -z "$OUIOWNER" ] || [ "$OUIOWNER" = "IEEE REGISTRATION AUTHORITY" ]; then + if [ -n "$(cat $IABFILE | grep $OUI)" ]; then + LOWRANGE="$(echo $MAC | cut -f4-6 -d: | sed -e 's/://g' | tr abcdef ABCDEF )" + for range in $(cat $IABFILE |grep -E '[0-9A-F]{6}\-[0-9A-F]{6}' |cut -f1 -d"$(printf '\t')" ); do + LOW="$(echo $range | cut -f1 -d- )" + HIGH="$(echo $range | cut -f2 -d- )" + if [ -z "$LOW" ] || [ -z "$HIGH" ]; then + echo "Error parsing IAB table" + exit 1 + + fi + LOWMSB=$(expr substr "$LOW" 1 6) + LOWLSB=$(expr substr "$LOW" 7 6) + HIGHMSB=$(expr substr "$HIGH" 1 6) + HIGHLSB=$(expr substr "$HIGH" 7 6) + + if [ -z "$LOWMSB" ] || [ -z "$LOWLSB" ] || [ -z "$HIGHMSB" ] || [ -z "$HIGHLSB" ]; then + echo "Error splitting registration authority IAB address strings" + exit 1 + fi + + MACMSB=$(expr substr "$LOWRANGE" 1 6) + MACLSB=$(expr substr "$LOWRANGE" 7 6) + + if [ -z "$MACMSB" ] || [ -z "$MACLSB" ]; then + echo "Error splitting mac address string" + exit 1 + fi + if [ $((0x$MACMSB)) -ge $((0x$LOWMSB)) ] && [ $((0x$MACMSB)) -le $((0x$HIGHMSB)) ]; then + if [ $((0x$MACLSB)) -ge $((0x$LOWLSB)) ] && [ $((0x$MACLSB)) -le $((0x$HIGHLSB)) ]; then + OUIOWNER="$(cat $IABFILE | grep "$LOW-$HIGH" | tr -s '\t' | cut -f3- -d"$(printf '\t')" )" + break; + fi + fi + done + fi +fi + +if [ -z "$OUIOWNER" ]; then + OUIOWNER="Unknown Organization" +fi + +MACNUM="$(echo $MAC |sed -e 's/://g' | tr ABCDEF abcdef )" + +UCI="$UCIBIN -c $UCIDEVDB" +config_load $DEVDB +DEVSTRING=$(config_foreach parse_override mactodevinfo) + +SAVEDEVSTRING="$DEVSTRING" + +UCI="$UCIBIN -c $UCICONFIG" +config_load $OVERRIDETABLE +DEVSTRING=$(config_foreach parse_override mactodevinfo) + +if [ -z "$DEVSTRING" ]; then + if [ -z "$SAVEDEVSTRING" ]; then + echo "$MAC | $OUIOWNER | unknown | unknown | unknown" + else + echo "$SAVEDEVSTRING" + fi +else + echo "$DEVSTRING" +fi + +rm -f $UCISTATE diff --git a/net/mac-to-devinfo/files/macdevdb b/net/mac-to-devinfo/files/macdevdb new file mode 100644 index 0000000000..93166c1fb4 --- /dev/null +++ b/net/mac-to-devinfo/files/macdevdb @@ -0,0 +1,19 @@ + +config 'mactodevinfo' + option 'name' 'Tecom Phones' + option 'maclow' '00:19:15:00:00:00' + option 'machigh' '00:19:15:ff:ff:ff' + option 'vendor' 'Vertical Communications' + option 'devtype' 'SIP devices and various' + option 'model' 'varies' + +config 'mactodevinfo' + option 'name' 'Comtrend Routers' + option 'maclow' '00:30:da:47:b0:00' + option 'machigh' '00:30:da:47:dd:ff' + option 'vendor' 'Comtrend Co.' + option 'devtype' 'Networking Equipment' + option 'model' 'varies' + option 'ouiowner' 'Comtrend Co.' + + diff --git a/net/mac-to-devinfo/files/mactodevinfo b/net/mac-to-devinfo/files/mactodevinfo new file mode 100644 index 0000000000..9cd0e5e60c --- /dev/null +++ b/net/mac-to-devinfo/files/mactodevinfo @@ -0,0 +1,2 @@ +package mactodevinfo + diff --git a/net/mac-to-devinfo/files/netdiscover-to-devinfo b/net/mac-to-devinfo/files/netdiscover-to-devinfo new file mode 100644 index 0000000000..d8908fad5f --- /dev/null +++ b/net/mac-to-devinfo/files/netdiscover-to-devinfo @@ -0,0 +1,26 @@ +#!/bin/sh + +MACTODEV=mac-to-devinfo +NETDISCOVER=netdiscover + +if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then + echo "Usage: netdiscover-to-devinfo IP-range Interface Timeout" + exit 1 +fi + +prep-devinfo +OLDIFS=$IFS +IFS=' +' +for line in $($NETDISCOVER -t $3 -k -m -i $2 -r $1); do + IFS=$OLDIFS + IP=$(echo $line | tr -s \ | cut -f1 -d\ ) + MAC=$(echo $line | tr -s \ | cut -f2 -d\ ) + echo "$IP"" | ""$($MACTODEV $MAC)" + OLDIFS=$IFS + IFS=' +' +done + +IFS=$OLDIFS + \ No newline at end of file diff --git a/net/mac-to-devinfo/files/prep-devinfo b/net/mac-to-devinfo/files/prep-devinfo new file mode 100644 index 0000000000..0abf633bac --- /dev/null +++ b/net/mac-to-devinfo/files/prep-devinfo @@ -0,0 +1,15 @@ +#!/bin/sh + +OUIURL=http://standards.ieee.org/regauth/oui/oui.txt +IABURL=http://standards.ieee.org/regauth/oui/iab.txt + +OUIDIR=/var/cache/mac-to-devinfo + +OUIFILE=$OUIDIR/oui.txt +IABFILE=$OUIDIR/iab.txt + +[ -d $OUIDIR ] || mkdir -p $OUIDIR + +wget -q -O $OUIFILE $OUIURL +wget -q -O $IABFILE $IABURL + diff --git a/net/mac-to-devinfo/files/smap-to-devinfo b/net/mac-to-devinfo/files/smap-to-devinfo new file mode 100644 index 0000000000..191bde4bd9 --- /dev/null +++ b/net/mac-to-devinfo/files/smap-to-devinfo @@ -0,0 +1,37 @@ +#!/bin/sh + +IPTODEV=ip-to-devinfo +SMAP=smap + +if [ "$1" == "-h" ] || [ "$2" == "-h" ] || [ -z "$1" ]; then + echo "Usage: $0 IP-Range [port,port,...]" +fi + +if [ -n "$2" ]; then + FIELD=1 + curport="$(echo $2 | cut -f$FIELD -d, )" + while [ "$curport" != "" ]; do + PORTS="$curport $PORTS" + FIELD=$(($FIELD + 1)) + curport="$(echo $2 | cut -f$FIELD -d, )" + done +fi + +prep-devinfo + +if [ -z "$PORTS" ]; then + PORTS=5060 +fi + +for port in $PORTS; do + for sip_device in $($SMAP -p $port $1 | grep -E -v 'host.? scanned' | grep 'SIP enabled' | cut -f1 -d: ); do + if [ -x "$(which httping)" ]; then + if httping -G -q -o 401,200 -c 2 -h $sip_device; then + echo "$sip_device"" | ""$($IPTODEV $sip_device)"" | ""http://$sip_device/" + continue + fi + fi + echo "$sip_device"" | ""$(IPTODEV $sip_device)"" | "" - " + done +done + -- 2.30.2