diff options
Diffstat (limited to 'lib/rcscripts/net.modules.d/macchanger')
-rw-r--r-- | lib/rcscripts/net.modules.d/macchanger | 126 |
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 |