#!/usr/share/ucs-test/runner python
## -*- coding: utf-8 -*-
## desc: computerroom two rooms settings
## roles: [domaincontroller_master, domaincontroller_slave]
## tags: [apptest, ucsschool]
## exposure: dangerous
## packages: [ucs-school-umc-computerroom]


from essential.computerroom import Room, Computers, add_printer, remove_printer, clean_folder, run_commands
from essential.internetrule import InternetRule
from essential.workgroup import Workgroup
from univention.lib.umc_connection import UMCConnection
from univention.testing.network import NetworkRedirector
import datetime
import httplib
import itertools
import univention.testing.strings as uts
import univention.testing.ucr as ucr_test
import univention.testing.ucsschool as utu


def main():
	with utu.UCSTestSchool() as schoolenv:
		with ucr_test.UCSTestConfigRegistry() as ucr:
			with NetworkRedirector() as nethelper:
				school, oudn = schoolenv.create_ou(name_edudc=ucr.get('hostname'))
				tea, tea_dn = schoolenv.create_user(school, is_teacher=True)
				open_ldap_co = schoolenv.open_ldap_connection()

				# importing random 2 computers
				computers = Computers(open_ldap_co, school, 2, 0, 0)
				created_computers = computers.create()
				computers_dns = computers.get_dns(created_computers)
				computers_ips = computers.get_ips(created_computers)

				# setting computer rooms contains the created computers
				room1 = Room(school, host_members=computers_dns[0])
				room2 = Room(school, host_members=computers_dns[1])
				# Creating the rooms
				for room in [room1, room2]:
					schoolenv.create_computerroom(
							school,
							name=room.name,
							description=room.description,
							host_members=room.host_members
							)

				# preparing the network loop
				nethelper.add_loop(computers_ips[0], computers_ips[1])

				umc_connection = UMCConnection(ucr.get('hostname'))
				umc_connection.auth(tea, 'univention')

				printer = uts.random_string()
				try:
					# Create new workgroup and assign new internet rule to it
					group = Workgroup(school, members=[tea_dn])
					global_domains = ['univention.de', 'google.de']
					rule = InternetRule(typ='whitelist',domains=global_domains)
					rule.define()
					rule.assign(school, group.name, 'workgroup')

					# Add new hardware printer
					add_printer(
							printer,
							school,
							ucr.get('hostname'),
							ucr.get('domainname'),
							ucr.get('ldap/base')
							)

					# generate all the possible combinations for (rule, printmode, sharemode)
					white_page = 'univention.de'
					rules = ['none', 'Kein Internet', 'Unbeschränkt', 'custom']
					printmodes = ['default', 'all', 'none']
					sharemodes = ['all', 'home']
					settings1 = itertools.product(rules, printmodes, sharemodes)

					# Choosing offset times for settings
					# should be at least 3 mins after user creation
					t1 = 2 * 15 * 60
					t2 = t1 + 10 * 60
					# Testing loop
					for i in xrange(24):
						period1 = datetime.time.strftime(
								(datetime.datetime.now() + datetime.timedelta(0,t1)).time(), '%H:%M')

						# get the old settings
						room1.aquire_room(umc_connection)
						old_settings = room1.get_room_settings(umc_connection)
						partial_old_settings = {
								'period' : old_settings['period'][:-3],
								'printMode': old_settings['printMode'],
								'shareMode': old_settings['shareMode'],
								'internetRule': old_settings['internetRule']
								}

						rule1, printMode1, shareMode1 = next(settings1)
						new_settings1 = {
								'customRule':	white_page,
								'printMode':	printMode1,
								'internetRule': rule1,
								'shareMode':	shareMode1,
								'period':	period1
								}
						room1.set_room_settings(umc_connection, new_settings1)

						# Testing loop
						settings2 = itertools.product(rules, printmodes, sharemodes)
						for j in xrange(24):
							try:
								period2 = datetime.time.strftime(
										(datetime.datetime.now() + datetime.timedelta(0,t2)).time(), '%H:%M')
								rule2, printMode2, shareMode2 = next(settings2)
								print
								print '*** ROOM 1 ***'
								print '***', i, '-(internetRule, printMode, shareMode) = (',\
										rule1,',', printMode1,',', shareMode1, ')', '-' * 10
								print '*** ROOM 2 ***'
								print '***', j, '-(internetRule, printMode, shareMode) = (',\
										rule2,',', printMode2,',', shareMode2, ')', '-' * 10
								new_settings2 = {
										'customRule':	white_page,
										'printMode':	printMode2,
										'internetRule': rule2,
										'shareMode':	shareMode2,
										'period':	period2
										}
								room1.set_room_settings(umc_connection, new_settings1)
								room2.aquire_room(umc_connection)
								room2.set_room_settings(umc_connection, new_settings2)
								# Check room1 settings
								room1.aquire_room(umc_connection)
								room1.check_room_settings(umc_connection, new_settings1)
								room1.check_behavior(
										partial_old_settings,
										new_settings1,
										tea,
										computers_ips[1],
										printer,
										white_page,
										global_domains,
										ucr)
								# For DEBUG purposes
								# run_commands([['ucr', 'search', room1.name], ['ucr','search', room2.name], ['atq']], {})
								clean_folder('/home/gsmitte/groups/Marktplatz/')
								clean_folder('/home/%s/lehrer/%s/' % (school, tea))
							#TODO Exception Errno4
							except httplib.HTTPException as e:
								if '[Errno 4] Unterbrechung' in str(e):
									print 'FAILED to get or set room (%s) settings, exception [Errno4]' % (room2.name,)
								else:
									print("Exception: '%s' '%s' '%r'" % (str(e), type(e), e))
									raise
								
				finally:
					remove_printer(printer, school, ucr.get('ldap/base'))


if __name__ == '__main__':
	main()
