summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rcscripts/net.modules.d/macchanger')
-rw-r--r--lib/rcscripts/net.modules.d/macchanger126
1 files changed, 126 insertions, 0 deletions
diff --git a/lib/rcscripts/net.modules.d/macchanger b/lib/rcscripts/net.modules.d/macchanger
new file mode 100644
index 0000000..7cc2c5b
--- /dev/null
+++ b/lib/rcscripts/net.modules.d/macchanger
@@ -0,0 +1,126 @@
+#!/bin/bash
+# Copyright (c) 2004-2005 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+# Contributed by Roy Marples (uberlord@gentoo.org)
+
+# char* macchanger_provides(void)
+#
+# Returns a string to change module definition for starting up
+macchanger_provides() {
+ echo "macchanger"
+}
+
+# void macchanger_depend(void)
+#
+# Sets up the dependancies for the module
+macchanger_depend() {
+ before macnet
+}
+
+# bool macchanger_check_installed(void)
+#
+# macchanger is always installed as an interface can change to a specific
+# mac address, and an interface is always installed
+macchanger_check_installed() {
+ return 0
+}
+
+# bool macchanger_check_depends(void)
+#
+# Checks to see if we have the needed functions
+macchanger_check_depends() {
+ local f
+
+ for f in interface_get_mac_address interface_set_mac_address; do
+ [[ $( type -t "${f}" ) == "function" ]] && continue
+ eerror "macchanger: missing required function ${f}\n"
+ return 1
+ done
+
+ return 0
+}
+
+# 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" )
+
+ eval mac=\"\$\{mac_${ifvar}\}\"
+ [[ -z ${mac} ]] && return 0
+
+ interface_exists "${iface}" true || return 1
+
+ ebegin "Changing MAC address of ${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
+
+ # The interface needs to be up for macchanger to work most of the time
+ interface_down "${iface}"
+
+ 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:ts=4