summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'net-scripts/net/macchanger.sh')
-rw-r--r--net-scripts/net/macchanger.sh102
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 :