#!/usr/bin/env python
#
# Name:			handle
# Description:	keep connection to webservice
#

import sys, os, time, thread
import logging.handlers, logging
from threading import Thread
from gosh import Server, __version__
from gosh import Request
from gosh.config import *
# Deafults
LOG_LEVEL = logging.DEBUG  # Could be e.g. "DEBUG" or "WARNING"

# Make a class we can use to capture stdout and sterr in the log
class MyLogger(object):
	def __init__(self, logger, level):
		"""Needs a logger and a logger level."""
		self.logger = logger
		self.level = level
	def write(self, message):
		# Only log if there is a message (not just a new line)
		if message.rstrip() != "":
			self.logger.log(self.level, message.rstrip())


class Handle():
	"""Handle keep conect with server"""
	def __init__(self):
		self.request = Request()
		self.connection = None
	def reconnect(self):
		i = 1
		while not self.connection and i <= 5:
			print "* INFO: Reconnect to server..."
			time.sleep(2 * i)
			self.connection = self.request.keepconnect()
			i +=1
		if i >5:
			return False
		return True
		
	def process(self, data):
		try:
			response = data["response"]
			connect = data["connect"]
			session = data["session"]
			machine = data["machine"]
		except:
			print "* ERROR: Response Not Accept"
			return False
		if response and connect:
			conn_bind = Server(session, machine)
			conn_bind.start()
			return True
		return False
	def run(self):
		self.connection = self.request.keepconnect()
		if not self.connection:
			if not self.reconnect():
				os._exit(1)
		self.request.authorization()
		self.request.natconfig()
		while True:
			try:
				data = self.connection.read_obj()
			except Exception, e:
				print e
				self.connection.close()
				self.reconnect()
				continue
			self.process(data)
		self.connection.close()
		os._exit(1)

if __name__ == "__main__":
	from optparse 	import OptionParser
	parser = OptionParser(description='Global SSH Deamon help keepconnect Server',
                                   prog='goshd',
                                   version=__version__,
                                   usage='%prog [options]')
	parser.add_option("-l", "--log", action ='store_true', default=False, help="Show log")
	options, args = parser.parse_args()
	if options.log:
		pass
	else:
		# Make a handler that writes to a file, making a new file at midnight and keeping 3 backups
		handler = logging.handlers.TimedRotatingFileHandler(LOG_FILENAME, when="midnight", backupCount=3)
		# Format each log message like this
		formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s')
		# Attach the formatter to the handler
		handler.setFormatter(formatter)
		# Attach the handler to the logger
		logger.addHandler(handler)

			# Replace stdout with logging to file at INFO level
		sys.stdout = MyLogger(logger, logging.DEBUG)
		# Replace stderr with logging to file at ERROR level
		sys.stderr = MyLogger(logger, logging.ERROR)
 
	exe = Handle()
	exe.run()