#!/usr/bin/env python
#

import subprocess
import os
import sys
import threading
import getopt
import signal
import string
from gi.repository import Gtk, GObject
from struct import *
from socket import *

global interface
global qsignal
global channel
global essid
global bssid

class LinkTest(object):
	builder = None

	def __init__(self):
		global interface
		global qsignal
		global channel
		global essid 
		global bssid

		self.builder = Gtk.Builder()
		self.builder.add_from_file("link_test_wi.glade")
		self.builder.connect_signals(self)

		self.window = self.builder.get_object("mainWindow")
		self.window.set_title("Link test to wireless network")

		if interface == 'wlan0':
			self.builder.get_object("label2").set_label(interface + ' (Internal 802.11 WiFi device)')
		else:
			self.builder.get_object("label2").set_label(interface + ' (External 802.11 WiFi device)')

		self.builder.get_object("label7").set_label(channel)
		self.builder.get_object("label8").set_label(essid)
		self.builder.get_object("label9").set_label(bssid)
		self.builder.get_object("label6").set_label('Please wait...')

		print "[ ltest_gui][00000000] Wireless Interface: " + interface + " Signal: " + str(qsignal) + " Channel: " + channel + " Essid: " + essid + " Bssid: " + bssid

		self.window.connect("delete-event", Gtk.main_quit)
		self.scroll = self.builder.get_object("mainScrolledWindow")
		self.liststore = self.builder.get_object("liststore1")
		self.treeview = self.builder.get_object("mainTree")

              	renderer_text = Gtk.CellRendererText() 
               	column_text0 = Gtk.TreeViewColumn("Link test", renderer_text, text = 0)
               	self.treeview.append_column(column_text0)

		renderer_text = Gtk.CellRendererPixbuf()
                column_text1 = Gtk.TreeViewColumn('Result', renderer_text, pixbuf = 1)
		self.treeview.append_column(column_text1)

               	self.treeview.show()
		self.scroll.show()
		self.window.show()

		self.testtimeout = GObject.timeout_add(100, self.test, None)

	def test(self, *args):
		global interface
		global qsignal
                global channel
                global essid
                global bssid

		self.builder.get_object("button1").set_sensitive(False)
		self.liststore.clear()

		icon_theme = Gtk.IconTheme.get_default()

		test = 'Wireless interface quality signal'
		flag = None

		if int(qsignal) < 70:
			flag = icon_theme.load_icon('gtk-close', 25, 0)
		else:
			flag = icon_theme.load_icon('gtk-apply', 25, 0)

		self.liststore.append([test, flag])

		subprocess.call('/opt/td-config/bin/airmon-ng stop mon0 >/dev/null', shell=True)
          	subprocess.call("/opt/td-config/bin/airmon-ng start '{}' '{}' >/dev/null".format(interface, channel), shell=True)
		subprocess.call("/opt/td-config/bin/aireplay-ng --test -e '{}' -a '{}' mon0 > /opt/td-config/run/link_test/result".format(essid, bssid), shell=True)
		subprocess.call('/opt/td-config/bin/airmon-ng stop mon0 >/dev/null', shell=True)

		ret = subprocess.check_output("grep -i 'Injection is working!' /opt/td-config/run/link_test/result | wc -l", shell=True)
		ret = ret[:len(ret) - 1]

		icon_theme = Gtk.IconTheme.get_default()

		test = 'Injection test to wireless network'
		flag = None
		if str(ret) == '1':
			flag = icon_theme.load_icon('gtk-apply', 25, 0)	
		else:
			flag = icon_theme.load_icon('gtk-close', 25, 0)

		self.liststore.append([test, flag])

		ret = subprocess.check_output("grep -i '%' /opt/td-config/run/link_test/result | wc -l", shell=True)
		ret = ret[:len(ret) - 1]
		if str(ret) == '0':
			test = 'Connectivity test to wireless network'
			flag = icon_theme.load_icon('gtk-close', 25, 0)
		else:
			test = 'Connectivity test to wireless network'
                        flag = icon_theme.load_icon('gtk-apply', 25, 0)

		self.liststore.append([test, flag])

		test = 'Unique AP ESSID name test'
		flag = None
		rectl = None

		try:
                    retcl = subprocess.check_output("LANG=en_US.utf8 nmcli -t -f SSID dev wifi list iface '{}' | grep -Fi '{}' | wc -l".format(interface, essid), shell=True).strip()

                    if len(retcl) == 0:
                        retcl = None
                except:
                    retcl = None
                
		if retcl == None or retcl != '1':
			flag = icon_theme.load_icon('gtk-close', 25, 0)
                else:
                        flag = icon_theme.load_icon('gtk-apply', 25, 0)

                self.liststore.append([test, flag])

		self.builder.get_object("label6").set_label("")
                self.builder.get_object("button1").set_sensitive(True)

		return False

	def repeat(self, *args):
		try:
	                subprocess.call('rm -Rf /opt/td-config/run/link_test 2> /dev/null', shell=True)
	        except:
	                pass

	        try:
	                os.makedirs('/opt/td-config/run/link_test/')
	        except:
	                pass

		self.builder.get_object("label6").set_label("")
                self.builder.get_object("label6").set_label('Please wait...')
		self.liststore.clear()
		self.builder.get_object("button1").set_sensitive(False)

		self.testtimeout = GObject.timeout_add(100, self.test, None)

def usage():
        print " "
        print "  Wireless Link Test (GUI) usage:"
        print " "
	print "  -i <Interface>: The wireless network interface"
	print "  -l <Signal>   : The wireless network signal"
	print "  -c <Channel>  : The channel of ESSID/BSSID network"
	print "  -e <ESSID>    : The ESSID of your wireless network"
	print "  -b <BSSID>    : The BSSID of your wireless network"
        print " "
        sys.exit()

        return

def signal_handler(signum, frame):
        print "[ ltest_gui][00000000] Signal caught."
        sys.exit()

        return

def main():
	global interface
	global qsignal
	global channel
	global essid
	global bssid

        try:
                opts, args = getopt.getopt(sys.argv[1:],"l:i:c:e:b:")
        except:
                usage()
                sys.exit(1)

	qsignal = None
	interface = None
	channel = None
        essid = None
	bssid = None

        for o, a in opts:
                if o == '-i':
			interface = a
		elif o == '-l':
			qsignal = a
		elif o == '-c':
			channel = a
		elif o == '-e':
                        essid = a
		elif o == '-b':
			bssid = a

        if qsignal == None or interface == None or channel == None or essid == None or bssid == None:
                usage()
                sys.exit(1)

	try:
                subprocess.call('rm -Rf /opt/td-config/run/link_test 2> /dev/null', shell=True)
        except:
                pass

        try:
                os.makedirs('/opt/td-config/run/link_test/')
        except:
                pass

	bssid = bssid.upper()

        signal.signal(signal.SIGINT, signal_handler)
        signal.signal(signal.SIGTERM, signal_handler)

	app = LinkTest()
	Gtk.main()

	return

if __name__ == "__main__":
	main()
