#!/usr/bin/env python
#

import subprocess
import os
import sys
import signal
import string
from gi.repository import Gtk, GObject

class Rules(object):
	def __init__(self):
		self.builder = Gtk.Builder()
		self.builder.add_from_file("rules_gui.glade")
		self.window = self.builder.get_object("mainWindow")
		self.builder.connect_signals(self)

		print "[ rules_gui][00000000] List"

		self.window.set_title("Network rules")
		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")

             	self.init_entries()

		renderer_toggle = Gtk.CellRendererToggle()
		renderer_toggle.connect("toggled", self.on_cell_toggled)
		column_toggle0 = Gtk.TreeViewColumn("Enable", renderer_toggle, active = 0)
	        self.treeview.append_column(column_toggle0)

              	renderer_text = Gtk.CellRendererText() 
               	column_text1 = Gtk.TreeViewColumn("Rule", renderer_text, text = 1)
               	self.treeview.append_column(column_text1)

	        renderer_text = Gtk.CellRendererText()
                column_text2 = Gtk.TreeViewColumn("Probability", renderer_text, text = 2)
                self.treeview.append_column(column_text2)

		renderer_text = Gtk.CellRendererText()
                column_text3 = Gtk.TreeViewColumn("Attack", renderer_text, text = 3)
                self.treeview.append_column(column_text3)

		renderer_text = Gtk.CellRendererText()
                column_text4 = Gtk.TreeViewColumn("Resource", renderer_text, text = 4)
                self.treeview.append_column(column_text4)

               	self.treeview.show()
		self.scroll.show()
		self.window.show()
	
	
	def on_cell_toggled(self, widget, path):
		self.liststore[path][0] = not self.liststore[path][0]
		self.builder.get_object("button2").set_sensitive(True)

	def cancel(self, *args):
		sys.exit(0)

	def refresh(self, *args):
		print "[ rules_gui][00000000] Refresh"
		self.builder.get_object("liststore1").clear()
		self.init_entries()

	def apply(self, *args):
		miter = self.builder.get_object("liststore1").get_iter_first()
		status_f = False
		status_t = True
		
		while miter != None:
                	if self.builder.get_object("liststore1").get_value(miter, 0) == True:
				status_f = True
			else:
				status_t = False

			miter = self.builder.get_object("liststore1").iter_next(miter)

		if status_f == False:
			# All false
			self.apply_value(False)
		elif status_t == True:
			# All true
			self.apply_value(True)
		else:
			self.apply_value(None)

		self.restart_service()
		sys.exit(0)

	def apply_value(self, value):
		if value != None:
			self.apply_allfiles('/opt/td-config/share/redirect_user.txt', value)
			self.apply_allfiles('/opt/td-config/share/redirect_url.txt', value)
			self.apply_allfiles('/opt/td-config/share/intercept_file.txt', value)
		else:
			self.apply_files('/opt/td-config/share/redirect_user.txt')
			self.apply_files('/opt/td-config/share/redirect_url.txt')
			self.apply_files('/opt/td-config/share/intercept_file.txt')

	def apply_allfiles(self, nfile, value):
               	nfile_tmp = nfile + '.tmp'
 
		try:
			os.remove(nfile_tmp)
		except:
			pass

		f = open(nfile_tmp, 'a')

		for line in open(nfile, 'r'):
			if nfile == '/opt/td-config/share/redirect_url.txt':
				if string.find(line, "REDIRECT_PAGE") != -1 or string.find(line, "redirect.html") != -1:
					if line[0] == '#':
						f.write(line[1:])
					else:
						f.write(line)
					continue

			if value == False:
				if line[0] != '#':
					line_tmp = '#' + line
					f.write(line_tmp)
				else:
					f.write(line)
			else:
				if line[0] == '#':
					f.write(line[1:])
				else:
					f.write(line)

		f.close()
		os.rename(nfile_tmp, nfile)

	def apply_files(self, nfile):
		nfile_tmp = nfile + '.tmp'

		try:
			os.remove(nfile_tmp)
		except:
			pass

		f = open(nfile_tmp, 'a')

		if nfile == '/opt/td-config/share/redirect_user.txt':
			for line in open(nfile, 'r'):
				if line[0] == '#':
					f.write(line[1:])
				else:
					f.write(line)
		else:
			miter = self.builder.get_object("liststore1").get_iter_first()
			count0 = 0
			unique = False

			while miter != None:
				count0 += 1
				value = self.builder.get_object("liststore1").get_value(miter, 0)
				count1 = 0

				for line in open(nfile, 'r'):
					if nfile == '/opt/td-config/share/redirect_url.txt':
						if string.find(line, "REDIRECT_PAGE") != -1 or string.find(line, "redirect.html") != -1:
							if unique == False:
								if line[0] == '#':
									f.write(line[1:])
								else:
									f.write(line)

								unique = True

							continue
			
					count1 += 1

					if count0 == count1:
						if value == False:
							if line[0] != '#':
								line_tmp = '#' + line
								f.write(line_tmp)
							else:
								f.write(line)
						else:
							if line[0] == '#':
								f.write(line[1:])
							else:
								f.write(line)

						break	

				miter = self.builder.get_object("liststore1").iter_next(miter)

		f.close()
		os.rename(nfile_tmp, nfile)

	def restart_service(self):
		try:
			if subprocess.check_output("ps ax | grep -i RCSRedirect | grep -v grep", shell=True).strip() != '0':
				print "Reloading RCSRedirect..."
				subprocess.call('ulimit -c 10000000; killall -1 RCSRedirect 2> /dev/null', shell=True)
		except:
			pass

	def init_entries(self):
		if os.path.exists('/opt/td-config/share/redirect_user.txt') == False or os.path.exists('/opt/td-config/share/redirect_url.txt') == False or os.path.exists('/opt/td-config/share/intercept_file.txt') == False:
			print "[ rules_gui][00000000] No rules"
			self.window.set_title("Network rules not found")	
			return

	        if subprocess.check_output('cat /opt/td-config/share/redirect_user.txt | wc -l', shell=True)[:-1] == '0' or subprocess.check_output('cat /opt/td-config/share/redirect_url.txt | wc -l', shell=True)[:-1] == '0' or subprocess.check_output('cat /opt/td-config/share/intercept_file.txt | wc -l', shell=True)[:-1] == '0':
			print "[ rules_gui][00000000] No rules"
                        self.window.set_title("Network rules not found")
                        return

		for line in open('/opt/td-config/share/redirect_url.txt').readlines():
			if string.find(line, "REDIRECT_PAGE") != -1 or string.find(line, "redirect.html") != -1:
				continue

			try:
				stat_rule = None

				index1 = string.find(line, " ")

				if line[0] == '#':
					tag = line[1:index1]
					stat_rule = False
				else:
					tag = line[0:index1]
					stat_rule = True

				line = line[index1 + 1:]
				rule = subprocess.check_output("cat /opt/td-config/share/redirect_user.txt | grep -i '{}'".format(tag), shell=True)

				if rule[0] == '#':
                        		rule = rule[1:(len(rule) - len(tag) - 2)]
				else:
					rule = rule[0:(len(rule) - len(tag) - 2)]

				if string.find(rule, "TACTICAL") != -1:
					rule = rule[0:-2]

				index2 = string.find(line, " ")
				probability = line[0:index2]
				probability = probability + '%'
				line = line[index2 + 1:]

				resource = line[0:len(line) - 1]

				if string.find(resource, "javadl-esd.sun.com/update/") != -1:
					try:
						attack = subprocess.check_output("cat /opt/td-config/share/intercept_file.txt | grep -i '{}'".format("javadl-esd.sun.com/update/"), shell=True)
					except:
						attack = subprocess.check_output("cat /opt/td-config/share/intercept_file.txt | grep -v '{}'".format("javadl-esd.sun.com/update/"), shell=True)
			 	else:
					try:
						attack = subprocess.check_output("cat /opt/td-config/share/intercept_file.txt | grep -i '{}'".format(resource), shell=True)
					except:
						attack = subprocess.check_output("cat /opt/td-config/share/intercept_file.txt | grep -v '{}'".format(resource), shell=True)

				if attack[0] == '#':
					attack = attack[1:]

				attack = attack[len(tag) + 1:-2]
				index3 = string.find(attack, " ")
				attack = attack[0:index3]

                        	self.liststore.append([stat_rule, rule, probability, attack, resource])
			except:
				print "[ rules_gui][00000000] Syntax error rules"
				self.liststore.clear()
				self.window.set_title("Network rules syntax error")
				return

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

        return

def main():
	if os.path.exists('/opt/td-config/share/') == False:
		return

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

	app = Rules()
	Gtk.main()

	return

if __name__ == "__main__":
	main()
