diff options
Diffstat (limited to 'net-scripts/net/macchanger.sh')
-rw-r--r-- | net-scripts/net/macchanger.sh | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/net-scripts/net/macchanger.sh b/net-scripts/net/macchanger.sh new file mode 100644 index 0000000..6331997 --- /dev/null +++ b/net-scripts/net/macchanger.sh @@ -0,0 +1,102 @@ +# Copyright (c) 2004-2006 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# Contributed by Roy Marples (uberlord@gentoo.org) + +# void macchanger_depend(void) +# +# Sets up the dependancies for the module +macchanger_depend() { + before macnet + functions interface_get_mac_address interface_set_mac_address +} + +# void macchanger_expose(void) +# +# Expose variables that can be configured +macchanger_expose() { + variables mac +} + +# bool macchanger_pre_start(char *iface) +# +# Configures the MAC address for iface +macchanger_pre_start() { + # We don't change MAC addresses from background + ${IN_BACKGROUND} && return 0 + + local iface="$1" mac opts ifvar="$(bash_variable "$1")" + + mac="mac_${ifvar}" + [[ -z ${!mac} ]] && return 0 + + interface_exists "${iface}" true || return 1 + + ebegin "Changing MAC address of ${iface}" + + # The interface needs to be up for macchanger to work most of the time + interface_down "${iface}" + + mac="$(echo "${!mac}" | tr '[:upper:]' '[:lower:]')" + case "${mac}" in + # specific mac-addr, i wish there were a shorter way to specify this + [0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]) + # We don't need macchanger to change to a specific mac address + interface_set_mac_address "${iface}" "${mac}" + eend "$?" + if [[ $? == "0" ]] ; then + mac="$(interface_get_mac_address "${iface}")" + eindent + einfo "changed to ${mac}" + eoutdent + return 0 + fi + ;; + + # increment MAC address, default macchanger behavior + increment) opts="${opts}" ;; + + # randomize just the ending bytes + random-ending) opts="${opts} -e" ;; + + # keep the same kind of physical layer (eg fibre, copper) + random-samekind) opts="${opts} -a" ;; + + # randomize to any known vendor of any physical layer type + random-anykind) opts="${opts} -A" ;; + + # fully random bytes + random-full) opts="${opts} -r" ;; + + # default case is just to pass on all the options + *) opts="${opts} ${mac}" ;; + esac + + if [[ ! -x /sbin/macchanger ]] ; then + eerror "For changing MAC addresses, emerge net-analyzer/macchanger" + return 1 + fi + + mac="$( /sbin/macchanger ${opts} "${iface}" \ + | sed -n -e 's/^Faked MAC:.*\<\(..:..:..:..:..:..\)\>.*/\U\1/p' )" + + # Sometimes the interface needs to be up .... + if [[ -z ${mac} ]] ; then + interface_up "${iface}" + mac="$( /sbin/macchanger ${opts} "${iface}" \ + | sed -n -e 's/^Faked MAC:.*\<\(..:..:..:..:..:..\)\>.*/\U\1/p' )" + fi + + if [[ -z ${mac} ]] ; then + eend 1 "Failed to set MAC address" + return 1 + fi + + eend 0 + eindent + einfo "changed to ${mac}" + eoutdent + + return 0 #important +} + +# vim: set ts=4 : |