#! /usr/bin/python -u

import sys
import os
import traceback
import Cookie
import string
import time
import cgi
import re
import types
import config
import db_access
import auth
import website
import tools


def main(environ=os.environ):
	start = time.time()
	pard = {}
	pard['ERROR'] = ''
	pard['HOSTNAME'] = ''
	pard['html'] = ''
	pard['file_upload'] = []
	html = ''
	error_log = ''
	error_sid = ''
	cmd = ''
	id_utente = ''
	sys.stderr = sys.stdout
	#sys.stdout.write(pard['header'])
	#sys.stdout.write(repr(pard['tok']))
	pard['header'] = 'Content-type: text/html\n\n'
	try:
		pard = config.global_parameters(pard)
		for k in environ.keys():
			if not k in pard.keys():
				pard[k] = environ[k]
		pard['HTTP_REFERER'] = pard.get('HTTP_REFERER', '')
		form = cgi.FieldStorage(keep_blank_values=1)
		for k in form.keys():
			if not k in pard.keys():
				if (k[0:12] == 'file_upload_') and (form[k].filename != ''):
					pard['file_upload'].append({'filename': form[k].filename, 'content': form.getvalue(k, ''), 'form_id': k})
				else:
					pard[k] = form.getvalue(k, '')
		pard['tok'] = pard.get('tok', 'start')
		pard['sid'] = pard.get('sid', '')
		pard['sid_auth'] = pard.get('sid_auth', 'N')
		if pard.has_key('HTTP_COOKIE'):
			cookie = Cookie.SimpleCookie(pard['HTTP_COOKIE'])
			try:
				pard['sid'] = cookie['sid'].value
				pard['sid_auth'] = cookie['sid_auth'].value
			except:
				pass
		if (pard['sid'] == '') or (auth.check_sid(pard) == 'SID_ERROR'):
			pard = auth.sid_new(pard)
			pard['sid_auth'] = 'N'
# 			if 'www.facebook.com' in pard['HTTP_USER_AGENT']:
# 				pard['tok'] = pard['tok']
# 			else:
# 				pard['tok'] = 'start'
			pard['tok'] = pard['tok']
		else:
			pard = auth.load_sid_data(pard)
		flag = 'STOP'
		#tools.dump3(pard, pard['TOKEN'][pard['tok']]['auth'])
		#tools.dump3(pard, pard['sid_auth'])
		if (pard['TOKEN'][pard['tok']]['auth'] == 'N'):
			flag = 'GO'
		elif (pard['TOKEN'][pard['tok']]['auth'] == 'Y') and (pard['sid_auth'] == 'Y'):
			flag = 'GO'
		elif pard['tok'] == 'img':
			flag = 'GO'
		elif pard['tok'] == 'smenu':
			flag = 'GO'
		#tools.dump3(pard, flag)
		if flag == 'GO':
			module = pard['TOKEN'][pard['tok']]['module']
			program = pard['TOKEN'][pard['tok']]['program']
			cmd = module + '.' + program + '(pard)'
			if os.path.isfile(pard['BIN_DIR'] + '/' + module + '.py') or os.path.isfile(pard['BIN_DIR'] + '/' + module + '.pyc'):
				if __import__(module).__dict__.has_key(program):
					pard = __import__(module).__dict__[program](pard)
		else:
			pard['tok'] = 'login'
			pard = website.website(pard)
		stop = time.time()
	except:
		stop = time.time()
		pard['ERROR'] = build_exception()
		tools.dump3(pard, pard['ERROR'])
		#pard = website.render_error(pard)
		pard['html'] = website.render_home(pard)
	sys.stdout.write(pard['header'])
	sys.stdout.write(pard['html'])
	pard['sid_id_utente'] = pard.get('sid_id_utente', '')
	error_log = log_hit(start, stop, pard['REMOTE_ADDR'], pard['sid_id_utente'], cmd, len(pard['html']), pard['ERROR'], pard)
	error_sid = log_sid(start, stop, len(html), pard)
	if error_log:
		sys.stdout.write(error_log)
	if error_sid:
		sys.stdout.write(error_sid)
	#exec_time = repr(stop - start)[0:5]
	#print '<br><br><center><font size=1>Exec Time: ' + exec_time + '</font></center>'


def build_exception(type=None, value=None, tb=None, limit=None):
	if type is None:
		type, value, tb = sys.exc_info()
	buf = "<H3>Traceback (most recent call last):</H3>"
	list = traceback.format_tb(tb, limit) + traceback.format_exception_only(type, value)
	buf = buf + "<PRE>%s<B>%s</B></PRE>" % (escape("".join(list[:-1])), escape(list[-1]))
	del tb
	return buf


def escape(s, quote=None):
	s = s.replace("&", "&amp;") # Must be done first!
	s = s.replace("<", "&lt;")
	s = s.replace(">", "&gt;")
	if quote:
		s = s.replace('"', "&quot;")
	return s


def log_hit(start, stop, ip, id_utente, cmd, bytes, error, pard):
	try:
		action = pard.get('tok', '')
		id_utente = pard.get('sid_id_utente', '')
		h = pard.get('html', '')
		bytes = len(h)
		exec_time = repr(stop - start)[0:5]
		log_file = open(pard['APPLICATION_LOG_FILE'], 'a')
		log_date = time.asctime(time.localtime(time.time()))
		error_id = ''
		if error != '':
			error_id = string.split(repr(stop), '.')[0]
			#error = string.replace(error[0], '\n', '\040')
			error = error + '<br><br>ERROR_FILE -> ' + error_id + '.err'
			#if pard['HOSTNAME'] != 'red baron':
			#	email_notify(pard, error)
		log_buf = string.join([log_date, id_utente, ip, repr(bytes), exec_time, cmd, action, pard['HTTP_REFERER'], error], '\t') + '\n'
		log_file.write(log_buf)
		log_file.close()
		if error_id != '':
			error_file = pard['LOG_DIR'] + '/' + error_id + '.err'
			fp = open(error_file, 'w')
			fp.write(error + '\n')
			keys = pard.keys()
			keys.sort()
			for k in keys:
				if k not in ('MENU', 'MENU_TREE', 'MYSQL_PASSWORD', 'SQL_CHALLENGE', 'TOKEN', 'sid_password', 'password'):
					buf = repr(k) + ': ' + repr(pard[k]) + '\n'
					fp.write(buf)
			fp.close()
		auth.log_hit(log_buf, pard)
		#auth.log_user(log_buf, pard)
		return ''
	except:
		return build_exception()


def log_sid(start, stop, bytes, pard):
	if pard.has_key('sid'):
		try:
			exec_time = repr(stop - start)[0:5]
			pard['sql'] = "select user, dict, auth, nickname from sid where sid = '%(sid)s'" % pard
			result = db_access.mysql_dict(pard)
			sid_file = {}
			if result and result[0]['dict']:
				sid_file = eval(result[0]['dict'])		
			log_date = time.asctime(time.localtime(time.time()))
			pard['EXEC_TIME'] = exec_time
			pard['LOG_DATE'] = log_date
			pard['BYTES'] = repr(bytes)
			#tools.dump3(pard, pard['provincia'])
			pard['provincia'] = pard.get('provincia', '')
			if pard['provincia']:
				sid_file['sid_provincia'] = pard['provincia']
			result = auth.sid_set(pard, sid_file)
			return ''
		except:
			error = build_exception()
			tools.dump3(pard, error)


def email_notify(pard, error):
	import smtplib
	from email.MIMEText import MIMEText
	try:
		errore = ''
		pard['cc'] = []
		pard['bcc'] = ''
		msg = MIMEText(error, 'html')
		msg['From'] = 'info@inputidea.it'
		now = time.strftime('%d-%m-%Y %H:%M:%S', time.localtime(time.time()))
		msg['Subject'] = 'ERROR - IZOOM - %s' % now
		msg['To'] = 'marco.tasselli2@gmail.com'
		s = smtplib.SMTP(pard['SMTP_HOST'])
		s.sendmail(msg['From'], msg['To'], msg.as_string())
		s.close()
	except:
		tools.dump3(pard, traceback.format_exc())
		pass




try:
	main()
except:
	type, value, tb = sys.exc_info()
	list = traceback.format_tb(tb, limit=None) + traceback.format_exception_only(type, value)
	sys.stdout.write('Content-type: text/html\n\n')
	sys.stdout.write('Not found')
	#sys.stdout.write('General server error!' + string.join(list))
