"""tcpdump: helper module that gathers wireless network MCS using tcpdump."""

import multiprocessing
import os
import re
import subprocess


def MCSBackground(tcpdump, out):
  """Continually extract wireless MCS from `tcpdump` output.

  If tcpdump is actively capturing packets, this function will not return as
  long as tcpdump is running. You probably want to run it in a background
  activity using multiprocessing.

  Args:
    tcpdump: a tcpdump process that's writing text output with Radiotap headers
             to its stdout stream.
    out:     Python file-like object to write MCS information to.
  """
  mcsre = re.compile(r'MCS (\d+)')
  x = 0

  for row in iter(tcpdump.stdout.readline, b''):
    x += 1
    match = mcsre.search(row)
    if match:
      mcs = int(match.group(1))
      out.write('{:02} '.format(mcs))
    else:
      out.write(' . ')

    if x % 25 == 0:
      out.write('\n')


def MCS(bssid, interface, report_dir=''):
  """Runs tcpdump in the background to gather wireless MCS."""
  print 'Please enter password for `sudo` if prompted.'
  subprocess.call(['sudo', '-v'])

  out = open(os.path.join(report_dir, 'mcs'), 'w+b')
  err = open(os.path.join(report_dir, 'mcserr'), 'w+b')

  filt = ('(not subtype beacon and not subtype ack) and '
          '(wlan addr1 {0} or wlan addr2 {0} or wlan addr3 {0})'.format(
              bssid, bssid, bssid))

  sudo_tcpdump = subprocess.Popen(['sudo', 'tcpdump', '-Z', os.getlogin(),
                                   '-Ilnei', interface, filt],
                                  stdout=subprocess.PIPE,
                                  stderr=err)
  proc = multiprocessing.Process(target=MCSBackground,
                                 args=(sudo_tcpdump, out))
  proc.start()

  return sudo_tcpdump, out, err


def tcpdump(bssid, interface, report_dir='', filtered=True):
  """Runs tcpdump in the background to gather wireless MCS."""

  cap = os.path.join(report_dir, 'testnetwork.pcap')
  tcpdump_args = ['tcpdump',  '-IUnei', interface, '-w', cap]

  login = os.getlogin()
  if login != 'root':
    print 'Please enter password for `sudo` if prompted.'
    subprocess.call(['sudo', '-v'])
    tcpdump_args = ['sudo'] + tcpdump_args + ['-Z', login]

  if filtered:
    filt = ('(not subtype beacon and not subtype ack) and '
            '(wlan addr1 {0} or wlan addr2 {0} or wlan addr3 {0})'.format(
                bssid, bssid, bssid))
    tcpdump_args += [filt]

  err = open(os.path.join(report_dir, 'mcserr'), 'w+b')
  tcpdump = subprocess.Popen(tcpdump_args, stderr=err)

  return tcpdump, err

