| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533 |
- #!/bin/sh
- DEBUG="0"
- VERBOSE="0"
- ELITE="0"
- USERID=""
- IFACE=""
- checkvm_status=""
- MAC80211=0
- IW_SOURCE="https://mirrors.edge.kernel.org/pub/software/network/iw/iw-5.0.1.tar.gz"
- IW_ERROR=""
- if [ ! -d /sys/ ]; then
- printf "CONFIG_SYSFS is disabled in your kernel, this program will almost certainly not work.\n"
- fi
- if [ "${1}" = "--elite" ]; then
- shift
- ELITE="1"
- fi
- if [ "${1}" = "--verbose" ]; then
- shift
- VERBOSE="1"
- fi
- if [ "${1}" = "--debug" ]; then
- shift
- DEBUG="1"
- VERBOSE="1"
- fi
- #yes, I know this is in here twice
- if [ "${1}" = "--elite" ]; then
- shift
- ELITE="1"
- fi
- if [ -n "${3}" ];then
- if [ "${3}" -gt 0 ] > /dev/null 2>&1; then
- CH="${3}"
- else
- printf "\nYou have entered an invalid channel \"${3}\" which will be ignored\n"
- CH=3
- fi
- else
- CH=10
- fi
- #TODO LIST
- #cleanup getDriver()
- #fix to not assume wifi drivers are modules
- #rewrite to not have two devices at any one time
- if [ -n "$(command -v id 2> /dev/null)" ]; then
- USERID="$(id -u 2> /dev/null)"
- fi
- if [ -z "${USERID}" ] && [ -n "$(id -ru)" ]; then
- USERID="$(id -ru)"
- fi
- if [ -n "${USERID}" ] && [ "${USERID}" != "0" ]; then
- printf "Run it as root\n" ; exit 1;
- elif [ -z "${USERID}" ]; then
- printf "Unable to determine user id, permission errors may occur.\n"
- fi
- #check for all needed binaries
- if [ ! -x "$(command -v uname 2>&1)" ]; then
- printf "How in the world do you not have uname installed?\n"
- printf "Please select a linux distro which has at least basic functionality (or install uname).\n"
- exit 1
- else
- OS=$(uname -s)
- #Recognized values are Linux and Darwin
- fi
- if [ ! -x "$(command -v ip 2>&1)" ] && [ ! -x "$(command -v ifconfig 2>&1)" ]; then
- printf "You have neither ip (iproute2) nor ifconfig installed.\n"
- printf "Please install one of them from your distro's package manager.\n"
- exit 1
- fi
- if [ ! -x "$(command -v iw 2>&1)" ]; then
- printf "You don't have iw installed, please install it from your distro's package manager.\n"
- printf "If your distro doesn't have a recent version you can download it from this link:\n"
- printf "${IW_SOURCE}\n"
- exit 1
- fi
- if [ ! -x "$(command -v ethtool 2>&1)" ]; then
- printf "Please install the ethtool package for your distro.\n"
- exit 1
- fi
- if [ -d /sys/bus/usb ]; then
- if [ ! -x "$(command -v lsusb 2>&1)" ]; then
- printf "Please install lsusb from your distro's package manager.\n"
- exit 1
- else
- LSUSB=1
- fi
- else
- LSUSB=0
- fi
- LSPCI=0
- # if [ -d /sys/bus/pci ] || [ -d /sys/bus/pci_express ] || [ -d /proc/bus/pci ]; then
- # PCI_DEVICES=0
- # if [ -d /sys/bus/pci/devices ] && [ "$(ls -1 /sys/bus/pci/devices 2>/dev/null | wc -l)" != '0' ]; then
- # PCI_DEVICES=1
- # elif [ -r /proc/bus/pci/devices ] && [ -n "$(cat /proc/bus/pci/devices 2>/dev/null)" ]; then
- # PCI_DEVICES=1
- # elif [ -d /sys/bus/pci_express/devices ] && [ -n "$(ls -1 /sys/bus/pci_express/devices 2>/dev/null | wc -l)" != '0' ]; then
- # PCI_DEVICES=1
- # fi
- # if [ ${PCI_DEVICES} -eq 0 ]; then
- # LSPCI=0
- # elif [ ! -x "$(command -v lspci 2>&1)" ]; then
- # printf "Please install lspci from your distro's package manager.\n"
- # exit 1
- # else
- # LSPCI=1
- # fi
- # else
- # LSPCI=0
- # fi
- if [ -f /proc/modules ] || [ -d /sys/module ]; then
- if [ ! -x "$(command -v modprobe 2>&1)" ]; then
- printf "Your kernel has module support but you don't have modprobe installed.\n"
- printf "It is highly recommended to install modprobe (typically from kmod).\n"
- MODPROBE=0
- else
- MODPROBE=1
- fi
- if [ ! -x "$(command -v modinfo 2>&1)" ]; then
- printf "Your kernel has module support but you don't have modinfo installed.\n"
- printf "It is highly recommended to install modinfo (typically from kmod).\n"
- printf "Warning: driver detection without modinfo may yield inaccurate results.\n"
- MODINFO=0
- else
- MODINFO=1
- fi
- else
- MODINFO=0
- fi
- if [ -c /dev/rfkill ]; then
- if [ ! -x "$(command -v rfkill 2>&1)" ];then
- printf "Your kernel supports rfkill but you don't have rfkill installed.\n"
- printf "To ensure devices are unblocked you must install rfkill.\n"
- RFKILL=0
- else
- RFKILL=1
- fi
- else
- RFKILL=0
- fi
- if [ ! -x "$(command -v awk 2>&1)" ]; then
- printf "How in the world do you not have awk installed?\n"
- printf "Please select a linux distro which has at least basic functionality (or install awk).\n"
- exit 1
- fi
- if [ ! -x "$(command -v grep 2>&1)" ]; then
- printf "How in the world do you not have grep installed?\n"
- printf "Please select a linux distro which has at least basic functionality (or install grep).\n"
- exit 1
- fi
- #done checking for binaries
- usage() {
- printf "usage: $(basename $0) <start|stop|check> <interface> [channel or frequency]\n\n"
- exit 0
- }
- handleLostPhys() {
- MISSING_INTERFACE=""
- if [ -d /sys/class/ieee80211 ]; then
- for i in $(ls /sys/class/ieee80211/); do
- if [ ! -d /sys/class/ieee80211/${i}/device/net ]; then
- MISSING_INTERFACE="${i}"
- printf "\nFound ${MISSING_INTERFACE} with no interfaces assigned, would you like to assign one to it? [y/n] "
- yesorno
- retcode=$?
- if [ "${retcode}" = "1" ]; then
- printf "PHY ${MISSING_INTERFACE} will remain lost.\n"
- elif [ "${retcode}" = "0" ]; then
- PHYDEV=${MISSING_INTERFACE}
- findFreeInterface monitor
- fi
- fi
- done
- fi
- #add some spacing so this doesn't make the display hard to read
- printf "\n"
- }
- findFreeInterface() {
- if [ -z "${1}" ]; then
- printf "findFreeInterface needs a target mode.\n"
- exit 1
- fi
- if [ "${1}" != "monitor" ] && [ "${1}" != "station" ]; then
- printf "findFreeInterface only supports monitor and station for target mode.\n"
- exit 1
- fi
- target_mode="${1}"
- if [ "$target_mode" = "monitor" ]; then
- target_suffix="mon"
- target_type="803"
- else
- target_suffix=""
- target_type="1"
- fi
- for i in $(seq 0 100); do
- if [ "$i" = "100" ]; then
- printf "\n\tUnable to find a free name between wlan0 and wlan99, you are on your own from here.\n"
- return 1
- fi
- if [ "$DEBUG" = "1" ]; then
- printf "\nChecking candidate wlan${i}\n"
- fi
- if [ ! -e /sys/class/net/wlan${i} ]; then
- if [ "$DEBUG" = "1" ]; then
- printf "\nCandidate wlan${i} is not in use\n"
- fi
- if [ ! -e /sys/class/net/wlan${i}mon ]; then
- if [ "$DEBUG" = "1" ]; then
- printf "\nCandidate wlan${i} and wlan${i}mon are both clear, creating wlan${i}${target_suffix}\n"
- fi
- IW_ERROR="$(iw phy ${PHYDEV} interface add wlan${i}${target_suffix} type ${target_mode} 2>&1)"
- if [ -z "${IW_ERROR}" ]; then
- if [ -d /sys/class/ieee80211/${PHYDEV}/device/net ]; then
- for j in $(ls /sys/class/ieee80211/${PHYDEV}/device/net/); do
- if [ "$(cat /sys/class/ieee80211/${PHYDEV}/device/net/${j}/type)" = "${target_type}" ]; then
- #here is where we catch udev renaming our interface
- k=${j#wlan}
- i=${k%mon}
- fi
- done
- else
- printf "Unable to create wlan${i}${target_suffix} and no error received.\n"
- return 1
- fi
- printf "\n\t\t(mac80211 ${target_mode} mode vif enabled on [${PHYDEV}]wlan${i}${target_suffix}\n"
- unset IW_ERROR
- break
- else
- printf "\n\n ERROR adding ${target_mode} mode interface: ${IW_ERROR}\n"
- break
- fi
- else
- if [ "$DEBUG" = "1" ]; then
- printf "\nCandidate wlan${i} does not exist, but wlan${i}mon does, skipping...\n"
- fi
- fi
- else
- if [ "$DEBUG" = "1" ]; then
- printf "\nCandidate wlan${i} is in use already.\n"
- fi
- fi
- done
- }
- rfkill_check() {
- #take phy and check blocks
- if [ "${RFKILL}" = 0 ]; then
- #immediately return if rfkill isn't supported
- return 0
- fi
- if [ -z "${1}" ]; then
- printf "Fatal, rfkill_check requires a phy to be passed in\n"
- exit 1
- fi
- #first we have to find the rfkill index
- #this is available as /sys/class/net/wlan0/phy80211/rfkill## but that's a bit difficult to parse
- index="$(rfkill list | grep "${1}:" | awk -F: '{print $1}')"
- if [ -z "$index" ]; then
- return 187
- fi
- rfkill_status="$(rfkill list ${index} 2>&1)"
- if [ $? != 0 ]; then
- printf "rfkill error: ${rfkill_status}\n"
- return 187
- elif [ -z "${rfkill_status}" ]; then
- printf "rfkill had no output, something went wrong.\n"
- exit 1
- else
- soft=$(printf "${rfkill_status}" | grep -i soft | awk '{print $3}')
- hard=$(printf "${rfkill_status}" | grep -i hard | awk '{print $3}')
- if [ "${soft}" = "yes" ] && [ "${hard}" = "no" ]; then
- return 1
- elif [ "${soft}" = "no" ] && [ "${hard}" = "yes" ]; then
- return 2
- elif [ "${soft}" = "yes" ] && [ "${hard}" = "yes" ]; then
- return 3
- fi
- fi
- return 0
- }
- rfkill_unblock() {
- #attempt unblock and CHECK SUCCESS
- if [ "${RFKILL}" = 0 ]; then
- #immediately return if rfkill isn't supported
- return 0
- fi
- rfkill_status="$(rfkill unblock ${1#phy} 2>&1)"
- if [ $? != 0 ]; then
- rfkill_status="$(rfkill unblock $index 2>&1)"
- if [ $? != 0 ]; then
- if [ `echo "$blah" | grep "Usage" | wc -l` -eq 1 ]; then
- printf "Missing parameters in rfkill! Report this"
- else
- printf "rfkill error: ${rfkill_status}\n"
- fi
- printf "Unable to unblock.\n"
- return 1
- fi
- fi
- sleep 1
- return 0
- }
- setLink() {
- if [ -x "$(command -v ip 2>&1)" ]; then
- ip link set dev ${1} ${2} > /dev/null 2>&1 || printf "\nFailed to set ${1} ${2} using ip\n"
- elif [ -x "$(command -v ifconfig 2>&1)" ]; then
- ifconfig ${1} ${2} > /dev/null 2>&1 || printf "\nFailed to set ${1} ${2} using ifconfig\n"
- fi
- return
- }
- ifaceIsUp() {
- if [ -x "$(command -v ip 2>&1)" ]; then
- ifaceIsUpCmd="ip link show dev"
- elif [ -x "$(command -v ifconfig 2>&1)" ]; then
- ifaceIsUpCmd="ifconfig"
- fi
- if ${ifaceIsUpCmd} ${1} 2>&1 | grep -q UP
- then
- return
- else
- return 1
- fi
- }
- #listIfaceUnspec() {
- # if [ -x "$(command -v ip 2>&1)" ]; then
- # ip link 2>/dev/null | awk -F"[: ]+" '/UNSPEC/ {print $2}'
- # elif [ -x "$(command -v ifconfig 2>&1)" ]; then
- # ifconfig -a 2>/dev/null | awk -F"[: ]+" '/UNSPEC/ {print $1}'
- # fi
- #}
- startDeprecatedIface() {
- iwconfig ${1} mode monitor > /dev/null 2>&1
- if [ -n "${2}" ]; then
- if [ ${2} -lt 1000 ]; then
- iwconfig ${1} channel ${2} > /dev/null 2>&1
- else
- iwconfig ${1} freq ${2}000000 > /dev/null 2>&1
- fi
- else
- iwconfig ${1} channel ${CH} > /dev/null 2>&1
- fi
- iwconfig ${1} key off > /dev/null 2>&1
- setLink ${1} up
- printf " (monitor mode enabled)"
- }
- yesorno() {
- read input
- case $input in
- y) return 0 ;;
- yes) return 0 ;;
- n) return 1 ;;
- no) return 1 ;;
- *) printf "\nInvalid input. Yes, or no? [y/n] "
- yesorno;;
- esac
- }
- startMac80211Iface() {
- #check if rfkill is set and cry if it is
- rfkill_check ${PHYDEV}
- rfkill_retcode="$?"
- case ${rfkill_retcode} in
- 1) printf "\t${1} is soft blocked, please run \"rfkill unblock ${index}\" to use this interface.\n" ;;
- 2) printf "\t${1} is hard blocked, please flip the hardware wifi switch (or in BIOS) to on.\n"
- printf "\tIt may also be possible to unblock with \"rfkill unblock ${index}\"\n"
- if [ "${checkvm_status}" != "run" ]; then
- checkvm
- fi
- if [ -n "${vm}" ]; then
- printf "Detected VM using ${vm_from}\n"
- printf "This appears to be a ${vm} Virtual Machine\n"
- printf "Some distributions have bugs causing rfkill hard block to be forced on in a VM.\n"
- printf "If toggling the rfkill hardware switch and \"rfkill unblock ${index}\" both fail\n"
- printf "to fix this, please try not running in a VM.\n"
- fi
- ;;
- 3) printf "\t${1} is hard and soft blocked, please flip the hardware wifi switch to on.\n"
- printf "\tIt may also be needed to unblock with \"rfkill unblock ${index}\"\n" ;;
- esac
- if [ "${rfkill_retcode}" != 0 ]; then
- printf "rfkill error, unable to start ${1}\n\n"
- printf "Would you like to try and automatically resolve this? [y/n] "
- yesorno
- retcode="$?"
- if [ "${retcode}" = "1" ]; then
- return 1
- elif [ "${retcode}" = "0" ]; then
- rfkill_unblock ${PHYDEV}
- fi
- fi
- #check if $1 already has a mon interface on the same phy and bail if it does
- if [ -d /sys/class/ieee80211/${PHYDEV}/device/net ]; then
- for i in $(ls /sys/class/ieee80211/${PHYDEV}/device/net/); do
- if [ "$(cat /sys/class/ieee80211/${PHYDEV}/device/net/${i}/type)" = "803" ]; then
- setChannelMac80211 ${i}
- printf "\n\t\t(mac80211 monitor mode already enabled for [${PHYDEV}]${1} on [${PHYDEV}]${i})\n"
- exit
- fi
- done
- fi
- #we didn't bail means we need a monitor interface
- if [ ${#1} -gt 12 ]; then
- printf "Interface ${1}mon is too long for linux so it will be renamed to the old style (wlan#) name.\n"
- findFreeInterface monitor
- else
- if [ -e /sys/class/net/${1}mon ]; then
- printf "\nYou already have a ${1}mon device but it is NOT in monitor mode."
- printf "\nWhatever you did, don't do it again."
- printf "\nPlease run \"iw ${1}mon del\" before attempting to continue\n"
- exit 1
- fi
- #we didn't bail means our target interface is available
- setLink ${1} down
- if [ "${DRIVER}" = "8812au" ] || [ "${DRIVER}" = "8814au" ] || [ "${DRIVER}" = "88XXau" ]; then
- #grumble grumble, seriously crap vendor driver
- startDeprecatedIface ${1}
- setChannelMac80211 ${1}
- return
- fi
- IW_ERROR="$(iw phy ${PHYDEV} interface add ${1}mon type monitor 2>&1)"
- if [ -z "${IW_ERROR}" ]; then
- sleep 1
- if [ -r "/sys/class/ieee80211/${PHYDEV}/device/net/${1}mon/type" ] && [ "$(cat /sys/class/ieee80211/${PHYDEV}/device/net/${1}mon/type)" = "803" ]; then
- setChannelMac80211 ${1}mon
- else
- printf "\nNewly created monitor mode interface ${1}mon is *NOT* in monitor mode.\n"
- printf "Removing non-monitor ${1}mon interface...\n"
- stopMac80211Iface ${1}mon abort
- exit 1
- fi
- printf "\n\t\t(mac80211 monitor mode vif enabled for [${PHYDEV}]${1} on [${PHYDEV}]${1}mon)\n"
- else
- printf "\n\nERROR adding monitor mode interface: ${IW_ERROR}\n"
- exit 1
- fi
- fi
- if [ "${ELITE}" = "1" ]; then
- #check if $1 is still down, warn if not
- if ifaceIsUp ${1}
- then
- printf "\nInterface ${1} is up, but it should be down. Something is interfering."
- printf "\nPlease run \"airmon-ng check kill\" and/or kill your network manager."
- fi
- else
- isRPiWireless && iw ${1} del
- printf "\t\t(mac80211 station mode vif disabled for [${PHYDEV}]${1})\n"
- fi
- }
- isRPiWireless() {
- local HW_REV=$(grep Revision /proc/cpuinfo | awk '{print $3}')
- [ -z "${HW_REV}" ] && return 0
- # http://www.raspberrypi-spy.co.uk/2012/09/checking-your-raspberry-pi-board-version/
- # https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
- [ "${HW_REV}" = 'a22082' ] && return 1
- [ "${HW_REV}" = 'a32082' ] && return 1
- [ "${HW_REV}" = 'a52082' ] && return 1
- [ "${HW_REV}" = 'a02082' ] && return 1
- [ "${HW_REV}" = '9000c1' ] && return 1
- [ "${HW_REV}" = 'a020d3' ] && return 1
- [ "${HW_REV}" = '9020e0' ] && return 1
- return 0
- }
- startwlIface() {
- if [ -f "/proc/brcm_monitor0" ]; then
- if [ -r "/proc/brcm_monitor0" ]; then
- local brcm_monitor="$(cat /proc/brcm_monitor0)"
- if [ "$brcm_monitor" = "1" ]; then
- printf "\n\t\t(experimental wl monitor mode vif already enabled for [${PHYDEV}]${1} on [${PHYDEV}]prism0)\n"
- return 0
- fi
- fi
- if [ -w "/proc/brcm_monitor0" ]; then
- printf "1" > /proc/brcm_monitor0
- if [ "$?" = "0" ]; then
- printf "\n\t\t(experimental wl monitor mode vif enabled for [${PHYDEV}]${1} on [${PHYDEV}]prism0)\n"
- else
- printf "\n\t\t(failed to enable experimental wl monitor mode for [${PHYDEV}${1})\n"
- fi
- else
- printf "\n\tUnable to write to /proc/brcm_monitor0, cannot enable monitor mode.\n"
- fi
- else
- printf "\n\tThis version of wl does not appear to support monitor mode.\n"
- fi
- }
- #startDarwinIface() {
- # if [ -x /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport ]; then
- # if [ -n "${CH}" ] && [ ${CH} -lt 220 ]; then
- # /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport $1 sniff ${CH}
- # else
- # printf "Channel is set to none channel value of ${CH}
- # fi
- # fi
- #}
- setChannelMac80211() {
- setLink ${1} up
- if [ -n "${CH}" ]; then
- if [ ${CH} -lt 1000 ]; then
- if [ -r "/sys/class/net/$1/phy80211/name" ]; then
- channel_list="$(iw phy $(cat /sys/class/net/$1/phy80211/name) info 2>&1 | awk -F'[][]' '$2{print $2}')"
- local hardware_valid_channel=1
- for i in $channel_list; do
- if [ "${CH}" = "${i}" ]; then
- hardware_valid_channel=0
- break
- fi
- done
- if [ "${hardware_valid_channel}" = "1" ]; then
- printf "Channel ${CH} does not appear to be supported by ${1} hardware, defaulting to channel 3.\n\n"
- CH=3
- fi
- fi
- IW_ERROR="$(iw dev ${1} set channel ${CH} 2>&1)"
- else
- if [ -r "/sys/class/net/$1/phy80211/name" ]; then
- frequency_list="$(iw phy $(cat /sys/class/net/$1/phy80211/name) info 2>&1 | sed -nr 's/.*( |^)([0-9]+) MHz .*/\2/p')"
- local hardware_valid_freq=1
- for i in $frequency_list; do
- if [ "${CH}" = "${i}" ]; then
- hardware_valid_freq=0
- break
- fi
- print
- done
- if [ "${hardware_valid_freq}" = "1" ]; then
- printf "Frequency ${CH} does not appear to be supported by ${1} hardware, defaulting to 2422 Mhz.\n\n"
- CH="2422"
- fi
- fi
- IW_ERROR="$(iw dev ${1} set freq "${CH}" 2>&1)"
- fi
- else
- printf "CH is unset, this should not be possible.\n"
- exit 1
- fi
- if [ -n "${IW_ERROR}" ]; then
- printf "\nError setting channel: ${IW_ERROR}\n"
- if printf "${IW_ERROR}" | grep -q "(-16)"; then
- printf "Error -16 likely means your card was set back to station mode by something.\n"
- printf "Removing non-monitor ${1} interface...\n"
- stopMac80211Iface "${1}" abort
- exit 1
- fi
- if printf "${IW_ERROR}" | grep -q "(-22)"; then
- printf "Unable to set channel/frequency ${CH}, most likely it is outside of regulatory domain\n\n"
- fi
- fi
- }
- stopDeprecatedIface() {
- setLink $1 down
- iwconfig $1 mode Managed > /dev/null 2>&1
- setLink $1 up
- printf " (monitor mode disabled)"
- }
- stopMac80211Iface() {
- if [ -f /sys/class/net/${1}/type ]; then
- if [ "${2}" != "abort" ] && [ "$(cat /sys/class/net/${1}/type)" != "803" ]; then
- printf "\n\nYou are trying to stop a device that isn't in monitor mode.\n"
- printf "Doing so is a terrible idea, if you really want to do it then you\n"
- printf "need to type 'iw ${1} del' yourself since it is a terrible idea.\n"
- printf "Most likely you want to remove an interface called wlan[0-9]mon\n"
- printf "If you feel you have reached this warning in error,\n"
- printf "please report it.\n"
- exit 1
- else
- if [ "${DRIVER}" = "8812au" ] || [ "${DRIVER}" = "8814au" ] || [ "${DRIVER}" = "88XXau" ]; then
- #grumble grumble, seriously crap vendor driver
- stopDeprecatedIface ${1}
- return
- fi
- if [ "${ELITE}" = "0" ]; then
- local need_sta=1
- if [ -d /sys/class/ieee80211/${PHYDEV}/device/net ]; then
- for i in $(ls /sys/class/ieee80211/${PHYDEV}/device/net/); do
- if [ -r /sys/class/ieee80211/${PHYDEV}/device/net/${i}/type ] && [ "$(cat /sys/class/ieee80211/${PHYDEV}/device/net/${i}/type)" = "1" ]; then
- [ "${2}" != "abort" ] && printf "\n\t\t(mac80211 station mode vif already available for [${PHYDEV}]${1} on [${PHYDEV}]${i})\n"
- need_sta=0
- fi
- done
- fi
- if [ "${need_sta}" = "1" ] && [ -e /sys/class/net/${1%mon}/phy80211/name ]; then
- if [ "$(cat /sys/class/net/${1%mon}/phy80211/name)" = "${PHYDEV}" ]; then
- printf "\nYou already have a ${1%mon} device but it is NOT in station mode."
- printf "\nWhatever you did, don't do it again."
- printf "\nPlease run \"iw ${1%mon} del\" before attempting to continue\n"
- exit 1
- else
- printf "\nYou already have a ${1%mon} device, but it is not on the same phy as ${1}.\n"
- printf "\nAttemping to pick a new name...\n"
- findFreeInterface station
- fi
- fi
- if [ "${need_sta}" = "1" ]; then
- IW_ERROR="$(iw phy ${PHYDEV} interface add ${1%mon} type station 2>&1)"
- if [ -z "${IW_ERROR}" ]; then
- interface="${1%mon}"
- if [ -d /sys/class/ieee80211/${PHYDEV}/device/net ]; then
- for i in $(ls /sys/class/ieee80211/${PHYDEV}/device/net/); do
- if [ "$(cat /sys/class/ieee80211/${PHYDEV}/device/net/${i}/type)" = "1" ]; then
- #here is where we catch udev renaming our interface
- interface="${i}"
- fi
- done
- fi
- printf "\n\t\t(mac80211 station mode vif enabled on [${PHYDEV}]${interface})\n"
- else
- printf "\n\n ERROR adding station mode interface: ${IW_ERROR}\n"
- fi
- fi
- fi
- setLink ${1} down
- IW_ERROR="$(iw dev "${1}" del 2>&1 | grep "nl80211 not found")"
- if [ -z "$IW_ERROR" ]; then
- if [ "${2}" != "abort" ]; then
- printf "\n\t\t(mac80211 monitor mode vif disabled for [${PHYDEV}]${1})\n"
- elif [ "${2}" = "abort" ]; then
- printf "\nWARNING: unable to start monitor mode, please run \"airmon-ng check kill\"\n"
- fi
- else
- if [ -f /sys/class/ieee80211/${PHYDEV}/remove_iface ]; then
- printf "${1}" > /sys/class/ieee80211/${PHYDEV}/remove_iface
- printf "\n\t\t(mac80211 monitor mode vif disabled for [${PHYDEV}]${1})\n"
- else
- printf "\n\nERROR: Neither the sysfs interface links nor the iw command is available.\nPlease download and install iw from\n$IW_SOURCE\n"
- fi
- fi
- fi
- fi
- }
- stopwlIface() {
- if [ -f "/proc/brcm_monitor0" ]; then
- if [ -r "/proc/brcm_monitor0" ]; then
- local brcm_monitor="$(cat /proc/brcm_monitor0)"
- if [ "$brcm_monitor" = "0" ]; then
- printf "\n\t\t(experimental wl monitor mode vif already disabled for [${PHYDEV}]${1})\n"
- return 0
- fi
- fi
- if [ -w "/proc/brcm_monitor0" ]; then
- printf "0" > /proc/brcm_monitor0
- if [ "$?" = "0" ]; then
- printf "\n\t\t(experimental wl monitor mode vif disabled for [${PHYDEV}]${1})\n"
- else
- printf "\n\t\t(failed to disable experimental wl monitor mode for [${PHYDEV}${1})\n"
- fi
- else
- printf "\n\tUnable to write to /proc/brcm_monitor0, cannot disable monitor mode.\n"
- fi
- else
- printf "\n\tThis version of wl does not appear to support monitor mode.\n"
- fi
- }
- getDriver() {
- unset DRIVER
- #standard detection path, this is all that is needed for proper drivers
- #DRIVER=$(printf "$ethtool_output" | awk '/driver/ {print $2}')
- #if $(modinfo -F filename ${DRIVER} > /dev/null 2>&1)
- #then
- # true
- #else
- # unset DRIVER
- #fi
- #if [ "$DRIVER" = "" ]
- #then
- if [ -f /sys/class/net/$1/device/uevent ]; then
- DRIVER="$(awk -F'=' '$1 == "DRIVER" {print $2}' /sys/class/net/$1/device/uevent)"
- fi
- #fi
- #here we test for driver usb, ath9k_htc,rt2870, possibly others show this
- if [ "$DRIVER" = "usb" ]; then
- printf "Warn ON: USB\n"
- BUSADDR="$(printf "$ethtool_output" | awk '/bus-info/ {print $2}'):1.0"
- if [ "$DEBUG" = "1" ]; then
- printf "${BUSADDR}\n"
- fi
- if [ -n "$BUSADDR" ]; then
- if [ -f /sys/class/net/$1/device/"$BUSADDR"/uevent ]; then
- DRIVER="$(awk -F'=' '$1 == "DRIVER" {print $2}' /sys/class/net/$1/device/$BUSADDR/uevent)"
- fi
- fi
- #here we can normalize driver names we don't like
- if [ "$DRIVER" = "rt2870" ]; then
- DRIVER="rt2870sta"
- fi
- if [ -f /sys/class/net/$1/device/idProduct ]; then
- if [ "$(cat /sys/class/net/$1/device/idProduct)" = "3070" ]; then
- DRIVER="rt3070sta"
- fi
- fi
- fi
- if [ "$DRIVER" = "rtl8187L" ]; then
- DRIVER="r8187l"
- fi
- if [ "$DRIVER" = "rtl8187" ] && [ "$STACK" = "ieee80211" ]; then
- DRIVER="r8187"
- fi
- if [ "$DRIVER" = "rtl88xxau" ]; then
- DRIVER="88XXau"
- fi
- if [ "$DRIVER" = "rtl8812au" ]; then
- DRIVER="8812au"
- fi
- #Here we will catch the broken lying drivers not caught above
- #currently this only functions for pci devices and not usb since lsusb has no -k option
- if [ "${MODINFO}" = "1" ]; then
- if $(modinfo -F filename $DRIVER > /dev/null 2>&1)
- then
- true
- else
- save="$DRIVER"
- if [ -n "${DEVICEID}" ] && [ "$BUS" = "pci" ]; then
- DRIVER="$(lspci -d $DEVICEID -k | awk '/modules/ {print $3}')"
- fi
- if [ -z "${BUS}" ] || [ "${BUS}" != 'sdio' ]; then
- unset DRIVER
- fi
- if [ -n "$save" ] && [ -z "$DRIVER" ] ; then
- DRIVER="$save"
- fi
- fi
- fi
- if [ -z "$DRIVER" ] ; then
- DRIVER="??????"
- fi
- if [ "$DEBUG" = "1" ]; then
- printf "getdriver() $DRIVER\n"
- fi
- }
- getFrom() {
- #from detection
- FROM="K"
- if [ "${MODINFO}" = "1" ] && [ -f /proc/modules ]; then
- if modinfo -F filename $DRIVER 2>&1 | grep -q 'kernel/drivers'
- then
- FROM="K"
- #we add special handling here because we hate the vendor drivers AND they install in the wrong place
- if [ "$DRIVER" = "r8187" ]; then
- FROM="V"
- elif [ "$DRIVER" = "r8187l" ]; then
- FROM="V"
- elif [ "$DRIVER" = "rt5390sta" ]; then
- FROM="V"
- elif [ "${DRIVER}" = "8812au" ] || [ "${DRIVER}" = "8814au" ]; then
- FROM="V"
- fi
- elif modinfo -F filename $DRIVER 2>&1 | grep -q 'updates/drivers'
- then
- FROM="C"
- elif modinfo -F filename $DRIVER 2>&1 | grep -q misc
- then
- FROM="V"
- elif modinfo -F filename $DRIVER 2>&1 | grep -q staging
- then
- FROM="S"
- else
- FROM="?"
- fi
- else
- FROM="K"
- fi
- #maybe add an 'intree' check?
- if [ "$DEBUG" = "1" ]; then
- printf "getFrom() $FROM\n"
- fi
- }
- getFirmware() {
- FIRMWARE="$(printf "$ethtool_output" | awk '/firmware-version/ {print $2}')"
- #ath9k_htc firmware is a shorter version number than most so trap and make it pretty
- if [ "$DRIVER" = "ath9k_htc" ]; then
- FIRMWARE="$FIRMWARE\t"
- fi
- if [ "$FIRMWARE" = "N/A" ]; then
- FIRMWARE="$FIRMWARE\t"
- elif [ -z "$FIRMWARE" ]; then
- FIRMWARE="unavailable"
- fi
- if [ "$DEBUG" = "1" ]; then
- printf "getFirmware $FIRMWARE\n"
- fi
- }
- getChipset() {
- #this needs cleanup, we shouldn't have multiple lines assigning chipset per bus
- #fix this to be one line per bus
- if [ -f /sys/class/net/$1/device/modalias ]; then
- if [ "$BUS" = "usb" ]; then
- if [ "${LSUSB}" = "1" ]; then
- BUSINFO="$(cut -d ":" -f 2 /sys/class/net/$1/device/modalias | cut -b 1-10 | sed 's/^.//;s/p/:/')"
- CHIPSET="$(lsusb -d "$BUSINFO" | head -n1 - | cut -f3- -d ":" | sed 's/^....//;s/ Network Connection//g;s/ Wireless Adapter//g;s/^ //')"
- elif [ "${LSUSB}" = "0" ]; then
- printf "Your system doesn't seem to support usb but we found usb hardware, please report this.\n"
- exit 1
- fi
- #yes the below line looks insane, but broadcom appears to define all the internal buses so we have to detect them here
- elif [ "${BUS}" = "pci" -o "${BUS}" = "pcmcia" ] && [ "${LSPCI}" = "1" ]; then
- if [ -f /sys/class/net/$1/device/vendor ] && [ -f /sys/class/net/$1/device/device ]; then
- DEVICEID="$(cat /sys/class/net/$1/device/vendor):$(cat /sys/class/net/$1/device/device)"
- CHIPSET="$(lspci -d $DEVICEID | cut -f3- -d ":" | sed 's/Wireless LAN Controller //g;s/ Network Connection//g;s/ Wireless Adapter//;s/^ //')"
- else
- BUSINFO="$(printf "$ethtool_output" | grep bus-info | cut -d ":" -f "3-" | sed 's/^ //')"
- CHIPSET="$(lspci | grep "$BUSINFO" | head -n1 - | cut -f3- -d ":" | sed 's/Wireless LAN Controller //g;s/ Network Connection//g;s/ Wireless Adapter//;s/^ //')"
- DEVICEID="$(lspci -nn | grep "$BUSINFO" | grep '[[0-9][0-9][0-9][0-9]:[0-9][0-9][0-9][0-9]' -o)"
- fi
- elif [ "${BUS}" = "sdio" ]; then
- if [ -f /sys/class/net/$1/device/vendor ] && [ -f /sys/class/net/$1/device/device ]; then
- DEVICEID="$(cat /sys/class/net/$1/device/vendor):$(cat /sys/class/net/$1/device/device)"
- fi
- if [ "${DEVICEID}" = '0x02d0:0x4330' ]; then
- CHIPSET='Broadcom 4330'
- elif [ "${DEVICEID}" = '0x02d0:0x4329' ]; then
- CHIPSET='Broadcom 4329'
- elif [ "${DEVICEID}" = '0x02d0:0x4334' ]; then
- CHIPSET='Broadcom 4334'
- elif [ "${DEVICEID}" = '0x02d0:0xa94c' ]; then
- CHIPSET='Broadcom 43340'
- elif [ "${DEVICEID}" = '0x02d0:0xa94d' ]; then
- CHIPSET='Broadcom 43341'
- elif [ "${DEVICEID}" = '0x02d0:0x4324' ]; then
- CHIPSET='Broadcom 43241'
- elif [ "${DEVICEID}" = '0x02d0:0x4335' ]; then
- CHIPSET='Broadcom 4335/4339'
- elif [ "${DEVICEID}" = '0x02d0:0xa962' ]; then
- CHIPSET='Broadcom 43362'
- elif [ "${DEVICEID}" = '0x02d0:0xa9a6' ]; then
- CHIPSET='Broadcom 43430'
- elif [ "${DEVICEID}" = '0x02d0:0x4345' ]; then
- CHIPSET='Broadcom 43455'
- elif [ "${DEVICEID}" = '0x02d0:0x4354' ]; then
- CHIPSET='Broadcom 4354'
- elif [ "${DEVICEID}" = '0x02d0:0xa887' ]; then
- CHIPSET='Broadcom 43143'
- else
- CHIPSET="unable to detect for sdio $DEVICEID"
- fi
- else
- CHIPSET="Not pci, usb, or sdio"
- fi
- #we don't do a check for usb here but it is obviously only going to work for usb
- elif [ -f /sys/class/net/$1/device/idVendor ] && [ -f /sys/class/net/$1/device/idProduct ]; then
- DEVICEID="$(cat /sys/class/net/$1/device/idVendor):$(cat /sys/class/net/$1/device/idProduct)"
- if [ "${LSUSB}" = "1" ]; then
- CHIPSET="$(lsusb | grep -i "$DEVICEID" | head -n1 - | cut -f3- -d ":" | sed 's/^....//;s/ Network Connection//g;s/ Wireless Adapter//g;s/^ //')"
- elif [ "${LSUSB}" = "0" ]; then
- CHIPSET="idVendor and idProduct found on non-usb device, please report this."
- fi
- elif [ "${DRIVER}" = "mac80211_hwsim" ]; then
- CHIPSET="Software simulator of 802.11 radio(s) for mac80211"
- elif $(printf "$ethtool_output" | awk '/bus-info/ {print $2}' | grep -q bcma)
- then
- BUS="bcma"
- if [ "${DRIVER}" = "brcmsmac" ] || [ "${DRIVER}" = "brcmfmac" ] || [ "${DRIVER}" = "b43" ]; then
- CHIPSET="Broadcom on bcma bus, information limited"
- else
- CHIPSET="Unrecognized driver \"${DRIVER}\" on bcma bus"
- fi
- else
- CHIPSET="non-mac80211 device? (report this!)"
- fi
- if [ "$DEBUG" = "1" ]; then
- printf "getchipset() $CHIPSET\n"
- printf "BUS = $BUS\n"
- printf "BUSINFO = $BUSINFO\n"
- printf "DEVICEID = $DEVICEID\n"
- fi
- }
- getBus() {
- if [ -f /sys/class/net/$1/device/modalias ]; then
- BUS="$(cut -d ":" -f 1 /sys/class/net/$1/device/modalias)"
- fi
- if [ "$DEBUG" = "1" ]; then
- printf "getBus $BUS\n"
- fi
- }
- getStack() {
- if [ -z "$1" ]; then
- return
- fi
- if [ -d /sys/class/net/$1/phy80211/ ]; then
- MAC80211="1"
- STACK="mac80211"
- else
- MAC80211="0"
- STACK="ieee80211"
- fi
- if [ -e /proc/sys/dev/$1/fftxqmin ]; then
- MAC80211="0"
- STACK="net80211"
- fi
- if [ "$DEBUG" = "1" ]; then
- printf "getStack $STACK\n"
- fi
- }
- getExtendedInfo() {
- #stuff rfkill info into extended if nothing else is there
- rfkill_check ${PHYDEV}
- rfkill_retcode="$?"
- if [ "${rfkill_retcode}" = "1" ]; then
- EXTENDED="rfkill soft blocked"
- elif [ "${rfkill_retcode}" = "2" ]; then
- EXTENDED="rfkill hard blocked"
- elif [ "${rfkill_redcode}" = "3" ]; then
- EXTENDED="rfkill hard and soft blocked"
- fi
- if [ "$DRIVER" = "??????" ]; then
- EXTENDED="\t Failure detecting driver properly please report"
- fi
- #first we set all the real (useful) info we can find
- if [ -f /sys/class/net/$1/device/product ]; then
- EXTENDED="\t$(cat /sys/class/net/$1/device/product)"
- fi
- #then we sweep for known broken drivers with no available better drivers
- if [ "$DRIVER" = "wl" ]; then
- if [ -f "/proc/brcm_monitor0" ]; then
- EXTENDED="Experimental monitor mode support"
- else
- EXTENDED="No known monitor support, try a newer version or b43"
- fi
- fi
- if [ "$DRIVER" = "brcmsmac" ]; then
- EXTENDED="Driver commonly referred to as brcm80211 (no injection yet)"
- fi
- if [ "$DRIVER" = "r8712u" ]; then
- EXTENDED="\t\t\t\tNo monitor or injection support"
- fi
- #lastly we detect all the broken drivers which have working alternatives
- KV="$(uname -r | awk -F'-' '{print $1}')"
- KVMAJOR="$(printf ${KV} | awk -F'.' '{print $1$2}')"
- KVMINOR="$(printf ${KV} | awk -F'.' '{print $3}')"
- if [ $KVMAJOR -lt 26 ]; then
- printf "You are running a kernel older than 2.6, I'm surprised it didn't error before now."
- if [ "$DEBUG" = "1" ]; then
- printf "${KVMAJOR} ${KVMINOR}\n"
- fi
- exit 1
- fi
- if [ "$DRIVER" = "rt2870sta" ]; then
- if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "35" ]; then
- EXTENDED="\tBlacklist rt2870sta and use rt2800usb"
- else
- EXTENDED="\tUpgrade to kernel 2.6.35 or install compat-wireless stable"
- fi
- #add in a flag for "did you tell use to do X" and emit instructions
- elif [ "$DRIVER" = "rt3070sta" ]; then
- if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "35" ]; then
- EXTENDED="\tBlacklist rt3070sta and use rt2800usb"
- else
- EXTENDED="\tUpgrade to kernel 2.6.35 or install compat-wireless stable"
- fi
- elif [ "$DRIVER" = "rt5390sta" ]; then
- if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "39" ]; then
- EXTENDED="\tBlacklist rt5390sta and use rt2800usb"
- else
- EXTENDED="\tUpgrade to kernel 2.6.39 or install compat-wireless stable"
- fi
- elif [ "$DRIVER" = "ar9170usb" ]; then
- if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "37" ]; then
- EXTENDED="\tBlacklist ar9170usb and use carl9170"
- else
- EXTENDED="\tUpgrade to kernel 2.6.37 or install compat-wireless stable"
- fi
- elif [ "$DRIVER" = "arusb_lnx" ]; then
- if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "37" ]; then
- EXTENDED="\tBlacklist arusb_lnx and use carl9170"
- else
- EXTENDED="\tUpgrade to kernel 2.6.37 or install compat-wireless stable"
- fi
- elif [ "$DRIVER" = "r8187" ]; then
- if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "29" ]; then
- EXTENDED="\t\tBlacklist r8187 and use rtl8187 from the kernel"
- else
- EXTENDED="\t\tUpgrade to kernel 2.6.29 or install compat-wireless stable"
- fi
- elif [ "$DRIVER" = "r8187l" ]; then
- if [ "$KVMAJOR" = "26" ] && [ "$KVMINOR" -ge "29" ]; then
- EXTENDED="\t\tBlacklist r8187l and use rtl8187 from the kernel"
- else
- EXTENDED="\t\tUpgrade to kernel 2.6.29 or install compat-wireless stable"
- fi
- fi
- #okay, now I take overload to a new level
- #if there is nothing else here to complain about, show mode
- if [ -z "${EXTENDED}" ]; then
- if [ -r "/sys/class/net/${1}/type" ]; then
- NET_TYPE="$(cat /sys/class/net/${1}/type)"
- elif [ -r "/sys/class/ieee80211/${PHYDEV}/device/net/${1}/type" ]; then
- NET_TYPE="$(cat /sys/class/ieee80211/${PHYDEV}/device/net/${1}/type)"
- fi
- if [ -n "${NET_TYPE}" ]; then
- if [ "${NET_TYPE}" = "803" ]; then
- EXTENDED="mode monitor"
- elif [ "${NET_TYPE}" = "1" ]; then
- EXTENDED="mode managed"
- else
- EXTENDED="mode ${NET_TYPE} unknown"
- fi
- fi
- fi
- }
- scanProcesses() {
- #this test means it errored and said it was busybox since busybox doesn't print without error
- if (ps -A 2>&1 | grep -q BusyBox)
- then
- #busybox in openwrt cannot handle -A but its output by default is -A
- psopts=""
- else
- psopts="-A"
- fi
- if ( ps -o comm= 2>&1 | grep -q BusyBox )
- then
- #busybox in openwrt cannot handle -o
- pso="0"
- else
- pso="1"
- fi
- PROCESSES="wpa_action\|wpa_supplicant\|wpa_cli\|dhclient\|ifplugd\|dhcdbd\|dhcpcd\|udhcpc\|NetworkManager\|knetworkmanager\|avahi-autoipd\|avahi-daemon\|wlassistant\|wifibox"
- #PS_ERROR="invalid\|illegal"
- if [ -x "$(command -v service 2>&1)" ] && [ "$1" = "kill" ]; then
- service network-manager stop 2> /dev/null > /dev/null
- service NetworkManager stop 2> /dev/null > /dev/null
- service avahi-daemon stop 2> /dev/null > /dev/null
- fi
- unset match
- if [ "${pso}" = 1 ]; then
- match="$(ps ${psopts} -o comm= | grep ${PROCESSES} | grep -v grep | wc -l)"
- elif [ "${pso}" = 0 ]; then
- #openwrt busybox grep hits on itself so we -v it out
- match="$(ps ${psopts} | grep ${PROCESSES} | grep -v grep | wc -l)"
- fi
- if [ ${match} -gt 0 ] && [ "${1}" != "kill" ]; then
- printf "Found $match processes that could cause trouble.\n"
- printf "Kill them using 'airmon-ng check kill' before putting\n"
- printf "the card in monitor mode, they will interfere by changing channels\n"
- printf "and sometimes putting the interface back in managed mode\n\n"
- else
- if [ "${1}" != "kill" ] && [ -n "${1}" ]; then
- printf "No interfering processes found\n"
- return
- fi
- fi
- if [ ${match} -gt 0 ]; then
- if [ "${1}" = "kill" ]; then
- printf "Killing these processes:\n\n"
- fi
- if [ "${pso}" = "1" ]; then
- ps ${psopts} -o pid=PID -o comm=Name | grep "${PROCESSES}\|PID"
- else
- #openwrt busybox grep hits on itself so we -v it out
- ps ${psopts} | grep "${PROCESSES}\|PID | grep -v grep"
- fi
- if [ "${1}" = "kill" ]; then
- #we have to use signal 9 because things like nm actually respawn wpa_supplicant too quickly
- if [ "${pso}" = "1" ]; then
- for pid in $(ps ${psopts} -o pid= -o comm= | grep ${PROCESSES} | awk '{print $1}'); do
- kill -9 ${pid}
- done
- else
- #openwrt busybox grep hits on itself so we -v it out
- for pid in $(ps ${psopts} | grep ${PROCESSES} | grep -v grep | awk '{print $1}'); do
- kill -9 ${pid}
- done
- fi
- fi
- fi
- #i=1
- #while [ $i -le $match ]
- #do
- # pid=$(ps ${psopts} -o pid= -o comm= | grep $PROCESSES | head -n $i | tail -n 1 | awk '{print $1}')
- # pname=$(ps ${psopts} -o pid= -o comm= | grep $PROCESSES | head -n $i | tail -n 1 | awk '{print $2}')
- # if [ x"$1" != "xkill" ]
- # then
- # printf "${pid}\t${pname}\n"
- # else
- # kill ${pid}
- # fi
- # i=$(($i+1))
- #done
- printf "\n"
- #this stub is for checking against the interface name, but since it almost never hits why bother?
- #if [ x"${1}" != "x" -a x"${1}" != "xkill" ]
- #then
- # #the next line doesn't work on busybox ps because -p is unimplimented
- # match2=$(ps -o comm= -p 1 2>&1 | grep $PS_ERROR -c)
- # if [ ${match2} -gt 0 ]
- # then
- # return
- # fi
- #
- # for i in $(ps auxw | grep ${1} | grep -v "grep" | grep -v "airmon-ng" | awk '{print $2}')
- # do
- # pname=$(ps -o comm= -p ${i})
- # printf "Process with PID ${i} ($pname) is running on interface ${1}\n"
- # done
- #fi
- }
- listInterfaces() {
- unset iface_list
- for iface in $(ls -1 /sys/class/net)
- do
- if [ -f /sys/class/net/${iface}/uevent ]; then
- if $(grep -q DEVTYPE=wlan /sys/class/net/${iface}/uevent)
- then
- iface_list="${iface_list}\n ${iface}"
- fi
- fi
- done
- # this block only adds garbage to me
- #if [ -x "$(command -v iwconfig 2>&1)" ] && [ -x "$(command -v sort 2>&1)" ]; then
- # for iface in $(iwconfig 2> /dev/null | sed 's/^\([a-zA-Z0-9_.]*\) .*/\1/'); do
- # iface_list="${iface_list}\n ${iface}"
- # done
- # iface_list="$(printf "${iface_list}" | sort -bu)"
- #fi
- }
- getPhy() {
- if [ -z "$1" ]; then
- return
- fi
- if [ $MAC80211 = "0" ]; then
- PHYDEV="null"
- return
- fi
- if [ -r /sys/class/net/$1/phy80211/name ]; then
- PHYDEV="$(cat /sys/class/net/$1/phy80211/name)"
- fi
- if [ -d /sys/class/net/$1/phy80211/ ] && [ -z "${PHYDEV}" ]; then
- PHYDEV="$(ls -l "/sys/class/net/$1/phy80211" | sed 's/^.*\/\([a-zA-Z0-9_-]*\)$/\1/')"
- fi
- }
- checkvm() {
- #this entire section of code is completely stolen from Carlos Perez's work in checkvm.rb for metasploit and rewritten (poorly) in sh
- #check loaded modules
- if [ -x "$(command -v lsmod 2>&1)" ]; then
- lsmod_data="$(lsmod 2>&1 | awk '{print $1}')"
- if [ -n "${lsmod}" ]; then
- printf "${lsmod_data}" | grep -iqE "vboxsf|vboxguest" 2> /dev/null && vm="VirtualBox"
- printf "${lsmod_data}" | grep -iqE "vmw_ballon|vmxnet|vmw" 2> /dev/null && vm="VMware"
- printf "${lsmod_data}" | grep -iqE "xen-vbd|xen-vnif" 2> /dev/null && vm="Xen"
- printf "${lsmod_data}" | grep -iqE "virtio_pci|virtio_net" 2> /dev/null && vm="Qemu/KVM"
- printf "${lsmod_data}" | grep -iqE "hv_vmbus|hv_blkvsc|hv_netvsc|hv_utils|hv_storvsc" && vm="MS Hyper-V"
- [ -n "${vm}" ] && vm_from="lsmod"
- fi
- fi
- #check scsi driver
- if [ -z "${vm_from}" ]; then
- if [ -r /proc/scsi/scsi ]; then
- grep -iq "vmware" /proc/scsi/scsi 2> /dev/null && vm="VMware"
- grep -iq "vbox" /proc/scsi/scsi 2> /dev/null && vm="VirtualBox"
- [ -n "${vm}" ] && vm_from="/pro/scsi/scsi"
- fi
- fi
- # Check IDE Devices
- if [ -z "${vm_from}" ]; then
- if [ -d /proc/ide ]; then
- ide_model="$(cat /proc/ide/hd*/model)"
- printf "${ide_model}" | grep -iq "vbox" 2> /dev/null && vm="VirtualBox"
- printf "${ide_model}" | grep -iq "vmware" 2> /dev/null && vm="VMware"
- printf "${ide_model}" | grep -iq "qemu" 2> /dev/null && vm="Qemu/KVM"
- printf "${ide_model}" | grep -iqE "virtual (hd|cd)" 2> /dev/null && vm="Hyper-V/Virtual PC"
- [ -n "${vm}" ] && vm_from="ide_model"
- fi
- fi
- # Check using lspci
- if [ -z "${vm_from}" ] && [ "${LSPCI}" = "1" ]; then
- lspci_data="$(lspci 2>&1)"
- printf "${lspci_data}" | grep -iq "vmware" 2> /dev/null && vm="VMware"
- printf "${lspci_data}" | grep -iq "virtualbox" 2> /dev/null && vm="VirtualBox"
- [ -n "${vm}" ] && vm_from="lspci"
- fi
- # Xen bus check
- ## XXX: Removing unsafe check
- # this check triggers if CONFIG_XEN_PRIVILEGED_GUEST=y et al are set in kconfig (debian default) even in not actually a guest
- #if [ -z ${vm} ]
- #then
- # ls -1 /sys/bus | grep -iq "xen" 2> /dev/null && vm="Xen"
- # vm_from="/sys/bus/xen"
- #fi
- # Check using lscpu
- if [ -z "${vm_from}" ]; then
- if [ -x "$(command -v lscpu 2>&1)" ]; then
- lscpu_data="$(lscpu 2>&1)"
- printf "${lscpu_data}" | grep -iq "Xen" 2> /dev/null && vm="Xen"
- printf "${lscpu_data}" | grep -iq "KVM" 2> /dev/null && vm="KVM"
- printf "${lscpu_data}" | grep -iq "Microsoft" 2> /dev/null && vm="MS Hyper-V"
- [ -n "${vm}" ] && vm_from="lscpu"
- fi
- fi
- #Check vmnet
- if [ -z "${vm_from}" ]; then
- if [ -e /dev/vmnet ]; then
- vm="VMware"
- vm_from="/dev/vmnet"
- fi
- fi
- #Check dmi info
- if [ -z "${vm_from}" ]; then
- if [ -x "$(command -v dmidecode 2>&1)" ]; then
- dmidecode 2>&1 | grep -iq "microsoft corporation" 2> /dev/null && vm="MS Hyper-V"
- dmidecode 2>&1 | grep -iq "vmware" 2> /dev/null && vm="VMware"
- dmidecode 2>&1 | grep -iq "virtualbox" 2> /dev/null && vm="VirtualBox"
- dmidecode 2>&1 | grep -iq "qemu" 2> /dev/null && vm="Qemu/KVM"
- dmidecode 2>&1 | grep -iq "domu" 2> /dev/null && vm="Xen"
- [ -n "${vm}" ] && vm_from="dmi_info"
- fi
- fi
- # Check dmesg Output
- if [ -z "${vm_from}" ]; then
- if [ -x "$(command -v dmesg 2>&1)" ]; then
- dmesg | grep -iqE "vboxbios|vboxcput|vboxfacp|vboxxsdt|(vbox cd-rom)|(vbox harddisk)" && vm="VirtualBox"
- dmesg | grep -iqE "(vmware virtual ide)|(vmware pvscsi)|(vmware virtual platform)" && vm="VMware"
- dmesg | grep -iqE "(xen_mem)|(xen-vbd)" && vm="Xen"
- dmesg | grep -iqE "(qemu virtual cpu version)" && vm="Qemu/KVM"
- [ -n "${vm}" ] && vm_from="dmesg"
- fi
- fi
- checkvm_status="run"
- }
- #end function definitions
- #begin execution
- #here we check for any phys that have no interfaces to pick up The Lost Phys
- handleLostPhys
- listInterfaces
- if [ "${1}" = "check" ] || [ "${1}" = "start" ]; then
- if [ "${2}" = "kill" ]; then
- #if we are killing, tell scanProcesses that
- scanProcesses "${2}"
- exit
- elif [ "${1}" = "start" ]; then
- #this stub can send scanProcesses the interface name
- #but this seems entirely unreliable so just run generic
- #scanProcesses "${2}"
- scanProcesses
- else
- scanProcesses
- exit
- fi
- fi
- if [ "$#" != "0" ]; then
- if [ "$1" != "start" ] && [ "$1" != "stop" ]; then
- usage
- fi
- if [ -z "$2" ]; then
- usage
- fi
- fi
- #startup checks complete, headers then main
- if [ "$DEBUG" = "1" ]; then
- if [ -x "$(command -v readlink 2>&1)" ]; then
- printf "/bin/sh -> $(readlink -f /bin/sh)\n"
- if $(readlink -f /bin/sh) --version > /dev/null 2>&1
- then
- printf "$($(readlink -f /bin/sh) --version)\n"
- fi
- else
- ls -l /bin/sh
- if /bin/sh --version > /dev/null 2>&1
- then
- /bin/sh --version
- fi
- fi
- if [ -n "$SHELL" ]; then
- if $SHELL --version > /dev/null 2>&1
- then
- printf "\nSHELL is $($SHELL --version)\n\n"
- else
- printf "\nSHELL is $SHELL\n\n"
- fi
- fi
- fi
- if [ "$VERBOSE" = "1" ]; then
- if [ -n "$(command -v lsb_release 2> /dev/null)" ]; then
- lsb_release -a
- printf "\n"
- fi
- uname -a
- checkvm
- if [ -n "${vm}" ]; then
- printf "Detected VM using ${vm_from}\n"
- printf "This appears to be a ${vm} Virtual Machine\n"
- printf "If your system supports VT-d, it may be possible to use PCI devices\n"
- printf "If your system does not support VT-d, you can only use USB wifi cards\n"
- fi
- printf "\nK indicates driver is from $(uname -r)\n"
- if [ "${MODPROBE}" = "1" ]; then
- modprobe compat > /dev/null 2>&1
- if [ -r /sys/module/compat/parameters/compat_version ]; then
- printf "C indicates driver is from $(cat /sys/module/compat/parameters/compat_version)\n"
- fi
- fi
- printf "V indicates driver comes directly from the vendor, almost certainly a bad thing\n"
- printf "S indicates driver comes from the staging tree, these drivers are meant for reference not actual use, BEWARE\n"
- printf "? indicates we do not know where the driver comes from... report this\n\n"
- fi
- if [ "${VERBOSE}" = "1" ]; then
- printf "\nX[PHY]Interface\t\tDriver[Stack]-FirmwareRev\t\tChipset\t\t\t\t\t\t\t\t\t\tExtended Info\n\n"
- else
- printf "PHY\tInterface\tDriver\t\tChipset\n\n"
- fi
- #this whole block of code shouldn't be here, it makes no sense
- #per shellcheck, this block is broken as it runs the loops once with iface=listIfaceUnspec instead of the output of listIFaceUnspec
- #for iface in listIfaceUnspec; do
- #
- # if [ -e "/proc/sys/dev/$iface/fftxqmin" ]
- # then
- # setLink ${iface} up
- # printf "$iface\t\tAtheros\t\tmadwifi-ng"
- # if [ x$1 = "xstart" ] && [ x$2 = x$iface ]
- # then
- # IFACE=$(wlanconfig ath create wlandev $iface wlanmode monitor -bssid | grep ath)
- # setLink ${iface} up
- # if [ $CH -lt 1000 ]
- # then
- # iwconfig $IFACE channel $CH 2> /dev/null > /dev/null
- # else
- # iwconfig $IFACE freq "$CH"000000 2> /dev/null > /dev/null
- # fi
- # setLink ${IFACE} up
- # UDEV_ISSUE=$?
- # fi
- #
- # if [ x$1 = "xstop" ] && [ x$2 = x$iface ]
- # then
- # printf "$iface does not support 'stop', do it on ath interface\n"
- # fi
- #
- # #why, dear god why is there a random newline here?
- # printf "\n"
- # sleep 1
- # continue
- # fi
- #done
- #end random block of code that needs to die
- for iface in $(printf "${iface_list}"); do
- unset ethtool_output DRIVER FROM FIRMWARE STACK MADWIFI MAC80211 BUS BUSADDR BUSINFO DEVICEID CHIPSET EXTENDED NET_TYPE PHYDEV ifacet DRIVERt FIELD1 FIELD1t FIELD2 FIELD2t CHIPSETt
- #add a RUNNING check here and up the device if it isn't already
- ethtool_output="$(ethtool -i $iface 2>&1)"
- if [ "$ethtool_output" != "Cannot get driver information: Operation not supported" ]; then
- getStack ${iface}
- getBus ${iface}
- getPhy ${iface}
- getDriver ${iface}
- getChipset ${iface}
- if [ "${VERBOSE}" = "1" ]; then
- getFrom ${iface}
- getFirmware ${iface}
- getExtendedInfo ${iface}
- fi
- else
- printf "\nethtool failed...\n"
- printf "Only mac80211 devices on kernel 2.6.33 or higher are officially supported by airmon-ng.\n"
- exit 1
- fi
- #yes this really is the main output loop
- if [ "${VERBOSE}" = "1" ]; then
- #beautify output spacing (within reason)
- FIELD1="${FROM}[${PHYDEV}]${iface}"
- if [ ${#FIELD1} -gt 15 ]; then
- FIELD1t="\t"
- else
- FIELD1t="\t\t"
- fi
- FIELD2="${DRIVER}[${STACK}]-${FIRMWARE}"
- if [ ${#FIELD2} -gt 28 ]; then
- FIELD2t="\t"
- else
- FIELD2t="\t\t"
- fi
- if [ -n "${EXTENDED}" ]; then
- if [ ${#CHIPSET} -gt 70 ]; then
- CHIPSETt="\t"
- elif [ ${#CHIPSET} -gt 63 ]; then
- CHIPSETt="\t\t"
- elif [ ${#CHIPSET} -gt 56 ]; then
- CHIPSETt="\t\t\t"
- elif [ ${#CHIPSET} -gt 49 ]; then
- CHIPSETt="\t\t\t\t"
- elif [ ${#CHIPSET} -gt 39 ]; then
- CHIPSETt="\t\t\t\t\t"
- elif [ ${#CHIPSET} -gt 35 ]; then
- CHIPSETt="\t\t\t\t\t\t"
- # XXX YUP, 28 and 21 are now that same. mostly because this is all hardcoded and sucks
- elif [ ${#CHIPSET} -gt 28 ]; then
- CHIPSETt="\t\t\t\t\t\t\t"
- elif [ ${#CHIPSET} -gt 21 ]; then
- CHIPSETt="\t\t\t\t\t\t\t"
- elif [ ${#CHIPSET} -gt 14 ]; then
- CHIPSETt="\t\t\t\t\t\t\t\t"
- elif [ ${#CHIPSET} -gt 7 ]; then
- CHIPSETt="\t\t\t\t\t\t\t\t\t"
- else
- CHIPSETt="\t\t\t\t\t\t\t\t\t\t"
- fi
- fi
- printf "${FROM}[${PHYDEV}]${iface}${FIELD1t}${DRIVER}[${STACK}]-${FIRMWARE}${FIELD2t}${CHIPSET}${CHIPSETt}${EXTENDED}\n"
- else
- #beautify output spacing (within reason, interface/driver max length is 15 and phy max length is 7))
- if [ ${#DRIVER} -gt 7 ]; then
- DRIVERt="\t"
- else
- DRIVERt="\t\t"
- fi
- if [ ${#iface} -gt 7 ]; then
- ifacet="\t"
- else
- ifacet="\t\t"
- fi
- printf "${PHYDEV}\t${iface}${ifacet}${DRIVER}${DRIVERt}${CHIPSET}\n"
- fi
- if [ "$DRIVER" = "wl" ]; then
- if [ "$1" = "start" ] && [ "$2" = "$iface" ]; then
- startwlIface $iface
- fi
- if [ "$1" = "stop" ] && [ "$2" = "$iface" ]; then
- stopwlIface $iface
- fi
- elif [ "$MAC80211" = "1" ]; then
- if [ "$1" = "start" ] && [ "$2" = "$iface" ]; then
- startMac80211Iface $iface
- fi
- if [ "$1" = "stop" ] && [ "$2" = "$iface" ]; then
- stopMac80211Iface $iface
- fi
- fi
- done
- #end with some space
- printf "\n"
|