#!/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 ointerface
global minterface
global mdevinterface
global sinterface

class LinkTest(object):
	builder = None

	def __init__(self):
		global ointerface
		global minterface
		global mdevinterface
		global sinterface

		self.builder = Gtk.Builder()

		if minterface != 'no':
			self.builder.add_from_file("link_test_niwifieth_plus.glade")
		else:
			self.builder.add_from_file("link_test_niwifieth.glade")
		self.builder.connect_signals(self)

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

		if ointerface == 'eth0':
			if minterface != 'no':
				self.builder.get_object("label11").set_label(ointerface + ' (Internal Ethernet device) + 3G modem')
			else:
				self.builder.get_object("label11").set_label(ointerface + ' (Internal Ethernet device)')
                else:
			if minterface != 'no':
				self.builder.get_object("label11").set_label(ointerface + ' (External Ethernet device) + 3G modem')
			else:
                        	self.builder.get_object("label11").set_label(ointerface + ' (External Ethernet device)')

		if ointerface == sinterface:
			self.builder.get_object("label2").set_label('Use the same interface')
		else:
			if sinterface == 'eth0':
				self.builder.get_object("label2").set_label(sinterface + ' (Internal Ethernet device)')
			elif sinterface == 'dag0':
				self.builder.get_object("label2").set_label(sinterface + ' (Internal DAG Endace device)') 
			else:
				self.builder.get_object("label2").set_label(sinterface + ' (External Ethernet device)')

		self.builder.get_object("label6").set_label('Please wait...')

		if minterface != 'no':
			print "[ ltest_gui][00000000] Injecting Interface: " + ointerface + " with 3G modem on " + minterface + " with dev: " + mdevinterface + " and Sniffing Interface: " + sinterface 
		else:
			print "[ ltest_gui][00000000] Injecting Interface: " + ointerface + " Sniffing Interface: " + sinterface

		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.testtimeout1 = GObject.timeout_add(100, self.test1, None)

		if mdevinterface != 'no':
			self.testtimeout2 = GObject.timeout_add(100, self.test2, None)

	def test1(self, *args):
		global ointerface
                global minterface
                global mdevinterface
                global sinterface

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

		icon_theme = Gtk.IconTheme.get_default()

                test = 'Injecting interface IP address test'
                flag = None
                retip = None
                try:
                    retip = subprocess.check_output("LANG=en_US.utf8 nmcli -t -f IP4 dev list iface '{}' | grep -i IP4.ADDRESS | awk '{{print $3}}' | sed -e 's/\/.*//g'".format(ointerface), shell=True)
                    if len(retip) == 0:
                        retip = None
                except:
                    retip = None

                if retip == None:
                        flag = icon_theme.load_icon('gtk-close', 25, 0)
                else:
                        flag = icon_theme.load_icon('gtk-apply', 25, 0)

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

                retcn = '1'

                test = "Internet connectivity test"

                try:
                        retcon = subprocess.check_output("/opt/td-config/scripts/http_conntest.py", shell=True)

                        if string.find(retcon, "Status 1") != -1:
                                retcn = '1'
                                pass
                        else:
                                retcn = '0'
                                pass
                except:
                        retcn = '0'
                        pass

                flag = None

                if retcn != '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])

		if minterface == 'no':
			self.builder.get_object("label6").set_label("")
                        self.builder.get_object("button1").set_sensitive(True)

                return False

	def test2(self, *args):
		global ointerface
                global minterface
                global mdevinterface
                global sinterface

		test = 'Public IP address test for 3G modem'
		icon_theme = Gtk.IconTheme.get_default()
		flag = None

		theip = None

            	try:
                	theip = subprocess.check_output("LANG=en_US.utf8 nmcli -t -f IP4 dev list iface '{}' | grep -i IP4.ADDRESS | awk '{{print $3}}' | sed -e 's/\/.*//g'".format(mdevinterface), shell=True)
                	if len(theip) == 0:
                		flag = icon_theme.load_icon('gtk-close', 25, 0)
				self.liststore.append([test, flag])
				self.builder.get_object("label6").set_label("")
	                        self.builder.get_object("button1").set_sensitive(True)
				return False
            	except:
                	flag = icon_theme.load_icon('gtk-close', 25, 0)
			self.liststore.append([test, flag])
			self.builder.get_object("label6").set_label("")
                        self.builder.get_object("button1").set_sensitive(True)
			return False

            	theip = theip[0:len(theip) - 1]

            	try:
                	inet_pton(AF_INET, theip)
            	except:
                	flag = icon_theme.load_icon('gtk-close', 25, 0)
			self.liststore.append([test, flag])
			self.builder.get_object("label6").set_label("")
                        self.builder.get_object("button1").set_sensitive(True)
			return False

            	f  = unpack('!I', inet_pton(AF_INET, theip))[0]
            	private = ([ 2130706432 , 4278190080 ], [ 3232235520 , 4294901760 ], [ 2886729728 , 4293918720 ], [ 167772160 , 4278190080 ])

            	ispriv = False

            	for net in private:
               		if (f & net[1] == net[0]):
                    		ispriv = True

            	if ispriv == True:
                	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):
		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.testtimeout1 = GObject.timeout_add(100, self.test1, None)

		if mdevinterface != 'no':
			self.testtimeout2 = GObject.timeout_add(100, self.test2, None)

def usage():
        print " "
        print "  Ethernet Link Test (GUI) usage:"
        print " "
	print "  -o <Interface>   : The injecting network interface"
	print "  -m <Interface|no>: 3G modem network interface or disable"
	print "  -p <profile|no>  : 3G modem network profile or disable"
	print "  -i <Interface>   : The sniffing network interface"
        print " "
        sys.exit()

        return

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

        return

def main():
	global ointerface
	global minterface
	global mdevinterface
	global sinterface

        try:
                opts, args = getopt.getopt(sys.argv[1:],"o:m:p:i:")
        except:
                usage()
                sys.exit(1)

	ointerface = None
	minterface = None
	mdevinterface = None
	sinterface = None

        for o, a in opts:
		if o == '-o':
			ointerface = a
		elif o == '-m':
			mdevinterface = a
		elif o == '-p':
			minterface = a
                elif o == '-i':
			sinterface = a

        if ointerface == None or mdevinterface == None or minterface == None or sinterface == None:
                usage()
                sys.exit(1)

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

	app = LinkTest()
	Gtk.main()

	return

if __name__ == "__main__":
	main()
