* Added some docs, updated existing docs. * Use single-quotes for strings when possible. * Color.pexception() prints exception and stack trace.
118 lines
3.6 KiB
Python
Executable File
118 lines
3.6 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import sys
|
|
|
|
class Color(object):
|
|
''' Helper object for easily printing colored text to the terminal. '''
|
|
|
|
# Basic console colors
|
|
colors = {
|
|
'W' : '\033[0m', # white (normal)
|
|
'R' : '\033[31m', # red
|
|
'G' : '\033[32m', # green
|
|
'O' : '\033[33m', # orange
|
|
'B' : '\033[34m', # blue
|
|
'P' : '\033[35m', # purple
|
|
'C' : '\033[36m', # cyan
|
|
'GR': '\033[37m', # gray
|
|
'D' : '\033[2m' # dims current color. {W} resets.
|
|
}
|
|
|
|
# Helper string replacements
|
|
replacements = {
|
|
'{+}': ' {W}{D}[{W}{G}+{W}{D}]{W}',
|
|
'{!}': ' {O}[{R}!{O}]{W}',
|
|
'{?}': ' {W}[{C}?{W}]'
|
|
}
|
|
|
|
last_sameline_length = 0
|
|
|
|
@staticmethod
|
|
def p(text):
|
|
'''
|
|
Prints text using colored format on same line.
|
|
Example:
|
|
Color.p('{R}This text is red. {W} This text is white')
|
|
'''
|
|
sys.stdout.write(Color.s(text))
|
|
sys.stdout.flush()
|
|
if '\r' in text:
|
|
text = text[text.rfind('\r')+1:]
|
|
Color.last_sameline_length = len(text)
|
|
else:
|
|
Color.last_sameline_length += len(text)
|
|
|
|
@staticmethod
|
|
def pl(text):
|
|
'''Prints text using colored format with trailing new line.'''
|
|
Color.p('%s\n' % text)
|
|
Color.last_sameline_length = 0
|
|
|
|
@staticmethod
|
|
def pe(text):
|
|
'''Prints text using colored format with leading and trailing new line to STDERR.'''
|
|
sys.stderr.write(Color.s('%s\n' % text))
|
|
Color.last_sameline_length = 0
|
|
|
|
@staticmethod
|
|
def s(text):
|
|
''' Returns colored string '''
|
|
output = text
|
|
for (key,value) in Color.replacements.items():
|
|
output = output.replace(key, value)
|
|
for (key,value) in Color.colors.items():
|
|
output = output.replace('{%s}' % key, value)
|
|
return output
|
|
|
|
@staticmethod
|
|
def clear_line():
|
|
spaces = ' ' * Color.last_sameline_length
|
|
sys.stdout.write('\r%s\r' % spaces)
|
|
sys.stdout.flush()
|
|
Color.last_sameline_length = 0
|
|
|
|
@staticmethod
|
|
def clear_entire_line():
|
|
import os
|
|
(rows, columns) = os.popen('stty size', 'r').read().split()
|
|
Color.p('\r' + (' ' * int(columns)) + '\r')
|
|
|
|
|
|
@staticmethod
|
|
def pattack(attack_type, target, attack_name, progress):
|
|
'''
|
|
Prints a one-liner for an attack.
|
|
Includes attack type (WEP/WPA), target ESSID & power, attack type, and progress.
|
|
ESSID (Pwr) Attack_Type: Progress
|
|
e.g.: Router2G (23db) WEP replay attack: 102 IVs
|
|
'''
|
|
essid = '{C}%s{W}' % target.essid if target.essid_known else '{O}unknown{W}'
|
|
Color.p('\r{+} {G}%s{W} ({C}%sdb{W}) {G}%s {C}%s{W}: %s ' % (
|
|
essid, target.power, attack_type, attack_name, progress))
|
|
|
|
|
|
@staticmethod
|
|
def pexception(exception):
|
|
'''Prints an exception. Includes stack trace if necessary.'''
|
|
Color.pl('\n{!} {R}Error: {O}%s' % str(exception))
|
|
|
|
from ..config import Configuration
|
|
if Configuration.verbose > 0 or Configuration.print_stack_traces:
|
|
Color.pl('\n{!} {O}Full stack trace below')
|
|
from traceback import format_exc
|
|
Color.p('\n{!} ')
|
|
err = format_exc().strip()
|
|
err = err.replace('\n', '\n{!} {C} ')
|
|
err = err.replace(' File', '{W}File')
|
|
err = err.replace(' Exception: ', '{R}Exception: {O}')
|
|
Color.pl(err)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
Color.pl('{R}Testing{G}One{C}Two{P}Three{W}Done')
|
|
print(Color.s('{C}Testing{P}String{W}'))
|
|
Color.pl('{+} Good line')
|
|
Color.pl('{!} Danger')
|
|
|