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

class LinkTest(object):
	builder = None

	def __init__(self):
		global minterface
		global mipinterface
		global sinterface

		self.builder = Gtk.Builder()

		if mipinterface != 'no':
			self.builder.add_from_file("link_test_fap_plus.glade")
		else:
			self.builder.add_from_file("link_test_fap.glade")
		self.builder.connect_signals(self)

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

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

		if minterface == 'eth0':
			self.builder.get_object("label2").set_label(minterface + ' (Internal Ethernet device)') 
		elif string.find(minterface, "eth") != -1:
			self.builder.get_object("label2").set_label(minterface + ' (External Ethernet device)')
		elif minterface == 'wlan0':
			self.builder.get_object("label2").set_label(minterface + ' (Internal 802.11 WiFi device)')
		elif string.find(minterface, "wlan") != -1:
			self.builder.get_object("label2").set_label(minterface + ' (External 802.11 WiFi device)')
		elif string.find(minterface, "usb") != -1:
			self.builder.get_object("label2").set_label(minterface + ' (Internal 3G modem device)')
		elif string.find(minterface, "ppp") != -1 or string.find(minterface, "ttyUSB") != -1:
			self.builder.get_object("label2").set_label(minterface + ' (External 3G modem device)')
		else:
			self.builder.get_object("label2").set_label("Not found for sharing connection")

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

		if mipinterface != 'no':
			print "[ ltest_gui][00000000] Wireless Interface: " + sinterface + " with routing on 3G modem on " + minterface + " with 3G IP address " + mipinterface
		else:
			print "[ ltest_gui][00000000] Wireless Interface: " + sinterface + " with routing on " + minterface

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

		if mipinterface != 'no':
			self.testtimeout3 = GObject.timeout_add(100, self.test3, None)

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

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

                devroute = None

                defiface = subprocess.check_output("route -n | grep -i 'UG' | awk '{{print $8}}'", shell=True).strip()
                if len(defiface) == 0:
                    devroute = None

                test = "Default route entry"

                icon_theme = Gtk.IconTheme.get_default()
                flag = None

                if defiface != minterface:
                        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 mipinterface == 'no':
                        self.builder.get_object("label6").set_label("")
                        self.builder.get_object("button1").set_sensitive(True)

                return False

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

                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

                icon_theme = Gtk.IconTheme.get_default()
                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])

                return False

	def test3(self, *args):
                global minterface
                global mipinterface
                global sinterface

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

		theip = mipinterface 

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

		if mipinterface != 'no':
			self.testtimeout3 = GObject.timeout_add(100, self.test3, None)

def usage():
        print " "
        print "  Wireless Link Test (GUI) usage:"
        print " "
	print "  -m <Route Interface> : Default routing interface or disable"
	print "  -p <3G IP address>   : 3G modem IP address 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 minterface
	global mipinterface
	global sinterface

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

	minterface = None
	mipinterface = None
	sinterface = None

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

        if minterface == None or sinterface == None or mipinterface == 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()
