86 lines
2.6 KiB
Python
Executable File
86 lines
2.6 KiB
Python
Executable File
#!/usr/bin/python2.7
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from ..model.interface import Interface
|
|
from ..tools.ifconfig import Ifconfig
|
|
from ..util.color import Color
|
|
|
|
class Macchanger(object):
|
|
is_changed = False
|
|
|
|
@classmethod
|
|
def down_macch_up(cls, iface, options):
|
|
'''Put interface down, run macchanger with options, put interface up'''
|
|
from ..util.process import Process
|
|
|
|
Color.clear_entire_line()
|
|
Color.p('\r{+} {C}macchanger{W}: taking interface {C}%s{W} down...' % iface)
|
|
|
|
Ifconfig.down(iface)
|
|
|
|
Color.clear_entire_line()
|
|
Color.p('\r{+} {C}macchanger{W}: changing mac address of interface {C}%s{W}...' % iface)
|
|
|
|
command = ['macchanger']
|
|
command.extend(options)
|
|
command.append(iface)
|
|
macch = Process(command)
|
|
macch.wait()
|
|
if macch.poll() != 0:
|
|
Color.pl('\n{!} {R}macchanger{O}: error running {R}%s{O}' % ' '.join(command))
|
|
Color.pl('{!} {R}output: {O}%s, %s{W}' % (macch.stdout(), macch.stderr()))
|
|
return False
|
|
|
|
Color.clear_entire_line()
|
|
Color.p('\r{+} {C}macchanger{W}: bringing interface {C}%s{W} up...' % iface)
|
|
|
|
Ifconfig.up(iface)
|
|
|
|
return True
|
|
|
|
|
|
@classmethod
|
|
def get_interface(cls):
|
|
# Helper method to get interface from configuration
|
|
from ..config import Configuration
|
|
return Configuration.interface
|
|
|
|
|
|
@classmethod
|
|
def reset(cls):
|
|
iface = cls.get_interface()
|
|
Color.pl('\r{+} {C}macchanger{W}: resetting mac address on %s...' % iface)
|
|
# -p to reset to permanent MAC address
|
|
if cls.down_macch_up(iface, ['-p']):
|
|
new_mac = Ifconfig.get_mac(iface)
|
|
|
|
Color.clear_entire_line()
|
|
Color.pl('\r{+} {C}macchanger{W}: reset mac address back to {C}%s{W} on {C}%s{W}' % (new_mac, iface))
|
|
|
|
|
|
@classmethod
|
|
def random(cls):
|
|
from ..util.process import Process
|
|
if not Process.exists('macchanger'):
|
|
Color.pl('{!} {R}macchanger: {O}not installed')
|
|
return
|
|
|
|
iface = cls.get_interface()
|
|
Color.pl('\n{+} {C}macchanger{W}: changing mac address on {C}%s{W}' % iface)
|
|
|
|
# -r to use random MAC address
|
|
# -e to keep vendor bytes the same
|
|
if cls.down_macch_up(iface, ['-e']):
|
|
cls.is_changed = True
|
|
new_mac = Ifconfig.get_mac(iface)
|
|
|
|
Color.clear_entire_line()
|
|
Color.pl('\r{+} {C}macchanger{W}: changed mac address to {C}%s{W} on {C}%s{W}' % (new_mac, iface))
|
|
|
|
|
|
@classmethod
|
|
def reset_if_changed(cls):
|
|
if cls.is_changed:
|
|
cls.reset()
|
|
|