fluxion/lib/InterfaceUtils.sh

207 lines
7.4 KiB
Bash
Executable File

#!/bin/bash
#if [ "$InterfaceUtilsVersion" ]; then return 0; fi
#readonly InterfaceUtilsVersion="1.0"
# The methods used in this script are taken from airmon-ng.
# This is all thanks for the airmon-ng authors, thanks guys.
InterfaceUtilsOutputDevice="/dev/stdout"
if [ -d /sys/bus/usb ] # && hash lsusb
then InterfaceUSBBus=1
fi
if [ -d /sys/bus/pci ] || [ -d /sys/bus/pci_express ] || [ -d /proc/bus/pci ] # && hash lspci
then InterfacePCIBus=1
fi
# Checks if the interface belongs to a physical device.
function interface_is_real() {
if [ -d /sys/class/net/$1/device ]
then return 0
else return 1
fi
}
# Checks if the interface belongs to a wireless device.
function interface_is_wireless() {
if grep -qs "DEVTYPE=wlan" /sys/class/net/$1/uevent
then return 0
else return 1
fi
}
# Returns an array of absolutely all interfaces.
# Notice: That includes interfaces such as the loopback interface.
function interface_list_all() {
InterfaceListAll=(/sys/class/net/*)
InterfaceListAll=("${InterfaceListAll[@]//\/sys\/class\/net\//}")
}
# Returns an array of interfaces pertaining to a physical device.
function interface_list_real() {
InterfaceListReal=()
interface_list_all
local __interface_list_real__candidate
for __interface_list_real__candidate in "${InterfaceListAll[@]}"; do
if interface_is_real $__interface_list_real__candidate
then InterfaceListReal+=("$__interface_list_real__candidate")
fi
done
}
# Returns an array of interfaces pertaining to a wireless device.
function interface_list_wireless() {
InterfaceListWireless=()
interface_list_all
local __interface_list_wireless__candidate
for __interface_list_wireless__candidate in "${InterfaceListAll[@]}"; do
if interface_is_wireless $__interface_list_wireless__candidate
then InterfaceListWireless+=("$__interface_list_wireless__candidate")
fi
done
}
function interface_driver() {
InterfaceDriver=$(basename $(readlink /sys/class/net/$1/device/driver))
}
function interface_physical() {
if [ ! "$1" ]; then return 1; fi
unset InterfacePhysical
local -r interface_physical_path="/sys/class/net/$1/phy80211"
if [ -d "$interface_physical_path" ]; then
if [ -r "$interface_physical_path/name" ]
then InterfacePhysical="`cat "$interface_physical_path/name"`"
fi
if [ ! "${InterfacePhysical// }" ]
then InterfacePhysical="`ls -l "$interface_physical_path" | sed 's/^.*\/\([a-zA-Z0-9_-]*\)$/\1/'`"
fi
fi
if [ ! "$InterfacePhysical" ]; then return 2; fi
}
function interface_hardware() {
if [ ! "$1" ]; then return 1; fi
local __interface_hardware__device="/sys/class/net/$1/device"
local __interface_hardware__hwinfo="$__interface_hardware__device/modalias"
InterfaceHardwareBus="`cut -d ":" -f 1 "$__interface_hardware__hwinfo" 2> $InterfaceUtilsOutputDevice`"
case "$InterfaceHardwareBus" in
"usb") # Wanted to replace the line below with awk, but i'll probably just add complexity & issues (mawk vs gawk).
InterfaceHardwareID="`cut -d ":" -f 2 $__interface_hardware__hwinfo | cut -b 1-10 | sed 's/^.//;s/p/:/'`";;
"pci" | "pcmcia" | "sdio")
InterfaceHardwareID="`cat "$__interface_hardware__device/vendor" 2> $InterfaceUtilsOutputDevice`:`cat "$__interface_hardware__device/device" 2> $InterfaceUtilsOutputDevice`";;
default) # The following will only work for USB devices.
InterfaceHardwareID="`cat "$__interface_hardware__device/idVendor" 2> $InterfaceUtilsOutputDevice`:`cat "$__interface_hardware__device/idProduct" 2> $InterfaceUtilsOutputDevice`"
InterfaceHardwareBus="usb";; # This will be reset below if InterfaceHardwareID is invalid.
esac
# Check for invalid InterfaceHardwareID (starts or ends with :) .. not a happy face, still won't quote it.
if echo "$InterfaceHardwareID" | egrep -q "^:|:$"; then
unset InterfaceHardwareID
unset InterfaceHardwareBus
return 2
else
# Remove any extraneous hex markers.
InterfaceHardwareID=${InterfaceHardwareID//0x/}
fi
}
function interface_chipset() {
if [ ! "$1" ]; then return 1; fi
if ! interface_hardware "$1"; then return 2; fi
case "$InterfaceHardwareBus" in
"usb")
if [ ! "$InterfaceUSBBus" ]; then return 3; fi
InterfaceChipset="`lsusb -d "$InterfaceHardwareID" | head -n1 - | cut -f3- -d ":" | sed 's/^....//;s/ Network Connection//g;s/ Wireless Adapter//g;s/^ //'`";;
"pci" | "pcmcia")
if [ ! "$InterfacePCIBus" ]; then return 4; fi
InterfaceChipset="$(lspci -d $InterfaceHardwareID | cut -f3- -d ":" | sed 's/Wireless LAN Controller //g;s/ Network Connection//g;s/ Wireless Adapter//;s/^ //')";;
"sdio")
if [[ "${InterfaceHardwareID,,}" = "0x02d0"* ]]
then InterfaceChipset=$(printf "Broadcom %d" ${InterfaceHardwareID:7})
else InterfaceChipset="Unknown chipset for SDIO device."
fi;;
default)
InterfaceChipset="Unknown device chipset & device bus."
esac
}
function interface_state() {
if [ ! "$1" ]; then return 1; fi
local __interface_state__stateFile="/sys/class/net/$1/operstate"
if [ ! -f "$__interface_state__stateFile" ]; then return 2; fi
InterfaceState=$(cat "$__interface_state__stateFile")
}
function interface_set_state() {
if [ "${#@}" -ne 2 ]; then return 1; fi
ip link set "$1" "$2"
}
function interface_set_mode() {
if [ "${#@}" -ne 2 ]; then return 1; fi
if ! interface_set_state "$1" "down"; then return 2; fi
if ! iwconfig "$1" mode "$2" &> $InterfaceUtilsOutputDevice; then return 3; fi
if ! interface_set_state "$1" "up"; then return 4; fi
}
function interface_prompt() {
if [ -z "$1" -o -z "$2" ]; then return 1; fi
local __interface_prompt__ifAvailable=("${!2}")
local __interface_prompt__ifAvailableInfo=()
local __interface_prompt__ifAvailableColor=()
local __interface_prompt__ifAvailableState=()
local __interface_prompt__ifCandidate
for __interface_prompt__ifCandidate in "${__interface_prompt__ifAvailable[@]}"; do
interface_chipset "$__interface_prompt__ifCandidate"
__interface_prompt__ifAvailableInfo+=("$InterfaceChipset")
interface_state "$__interface_prompt__ifCandidate"
if [ "$InterfaceState" = "up" ]
then __interface_prompt__ifAvailableColor+=("$CPrp"); __interface_prompt__ifAvailableState+=("[-]")
else __interface_prompt__ifAvailableColor+=("$CClr"); __interface_prompt__ifAvailableState+=("[+]")
fi
done
# The following conditional is required since io_query_format_fields
# only considers the the size of the first parameter, available color.
if [ "$6" ]; then # Add alternative choices
__interface_prompt__ifAvailable+=("${!3}")
__interface_prompt__ifAvailableInfo+=("${!4}")
__interface_prompt__ifAvailableState+=("${!5}")
__interface_prompt__ifAvailableColor+=("${!6}")
fi
# If only one interface exists and it's available, choose it.
if [ "${#__interface_prompt__ifAvailable[@]}" -eq 1 -a "${__interface_prompt__ifAvailableState[0]}" = "[+]" ]; then
InterfacePromptWISelected="${__interface_prompt__ifAvailable[0]}"
InterfacePromptWISelectedState="[+]" # It passed the condition, it must be +
InterfacePromptWISelectedInfo="${__interface_prompt__ifAvailableInfo[0]}"
else
format_apply_autosize "$CRed[$CSYel%1d$CClr$CRed]%b %-8b %3s$CClr %-*.*s\n"
io_query_format_fields "$1" "$FormatApplyAutosize" \
__interface_prompt__ifAvailableColor[@] __interface_prompt__ifAvailable[@] \
__interface_prompt__ifAvailableState[@] __interface_prompt__ifAvailableInfo[@]
echo
InterfacePromptIfSelected="${IOQueryFormatFields[1]}"
InterfacePromptIfSelectedState="${IOQueryFormatFields[2]}"
InterfacePromptWISelectedInfo="${IOQueryFormatFields[3]}"
fi
}