#!/usr/bin/env python
#
# Name: 		Global SSH Client
# Description:	help connect ssh between client behind NAT.
#				ssh use paramiko
# project 2
#
# Author: 		Nguyen Thanh Hiep - Nguyen Huu Dinh
# Time: 		2014/10
# Requirements: paramiko, ecdsa
#
import os, sys, getpass
from optparse 	import OptionParser
from optparse 	import OptionGroup
from gosh 		import Request, __version__
from gosh.config import windows, DEBUG
request = Request()
def Main():
	parser = OptionParser(description='Global SSH help connect SSH behind NAT',
                                   prog='gosh',
                                   version=__version__,
                                   usage='%prog [options] [user@][hostname]')
	group = OptionGroup(parser, "Network")
	group.add_option("-j", "--join", action ='store_true', default=False,
        help="Join a Domain")
	group.add_option("-r", "--register", action ='store_true', default=False, 
		help="Create new Domain")
	group.add_option("-g", "--group",  metavar="*", default=None,
		help="Join a Workgroup")
	group.add_option("-c", "--create", metavar="*",
        help="[workgroup] create a Workgroup")
	group.add_option("-d", "--delete", metavar="*",
        help="[workgroup] delete Workgroup")
	group.add_option("-l", "--logout", action ='store_true', default=False, 
		help="logout Domain or Workgroup")
	parser.add_option_group(group)

	group = OptionGroup(parser, "Connect")	#create group of parser
	group.add_option("-D", "--bind", metavar="*",
        help="-D [bindport:]destport") # add option parser
	group.add_option("-L", "--tunnel", metavar="*",
        help="-L port:host:port") # add option parser

	group.add_option("-p", "--port", type="int", metavar="*",
        help="[user@]hostname -p port") # add option parser
	group.add_option("-i", "--identity", metavar="*",
        help="[user@]hostname -i identity_file") # add option parser
	group.add_option("-v", "--verbose", action ='store_true', default=False,
        help="[user@]hostname -v debugging mode") # add option parser

	parser.add_option_group(group)

	group = OptionGroup(parser, "Infomation")
	group.add_option("-I", "--info", action ='store_true', default=False,
        help="show infomation of machine")	
	group.add_option("-m", "--mac", metavar="*",
        help="-I -m hostname") # add option parser
	group.add_option("-n", "--nat", action ='store_true', default=False, 
        help="check nat type") # add option parser
	parser.add_option_group(group)
	options, args = parser.parse_args()
	if DEBUG or options.verbose:
		try:
			processparser(options, args)
		except KeyboardInterrupt:
			print "\nCancel"
			return
	else:
		try:
			processparser(options, args)
		except Exception as e:
			print "* ERROR: %s" %e
def superuser():
	if not windows:
		if os.geteuid() != 0:
			args = ['sudo', sys.executable] + sys.argv + [os.environ]
			# the next line replaces the currently-running process with the sudo
			os.execlpe('sudo', *args)

def processparser(options, args):
	if options.verbose:
		request.setverbose()
	if options.register:
		if len(args) == 0:
			domain = raw_input("* Domain Name: ")	
			pswd = getpass.getpass('* PASSWORD for Domain %s:' % domain)
			repswd = getpass.getpass('* CONFIRM PASSWORD: ')
			if pswd != repswd:
				print '* ERROR: confirm password not match!'
				return
		elif len(args) == 1:
			domain = args[0]
			pswd = getpass.getpass('* PASSWORD for Domain %s:' % domain)
			repswd = getpass.getpass('* CONFIRM PASSWORD: ')
			if pswd != repswd:
				print '* ERROR: confirm password not match!'
				return
		else:
			domain = args[0]
			pswd = args[1]
		request.register(domain, pswd)
		return

	if options.join:
		superuser()
		if len(args) == 0:
			domain = raw_input("* Domain Name: ")	
			pswd = getpass.getpass('* PASSWORD for Domain %s:' % domain)
		elif len(args) == 1:
			domain = args[0]
			pswd = getpass.getpass('* PASSWORD for Domain %s:' % domain)
		else:
			domain = args[0]
			pswd = args[1]
		request.join_domain(domain, pswd)
		return
	if options.logout:
		superuser()
		request.logout()
		return

	if options.group is not None:
		superuser()
		request.join_workgroup(options.group)
		return
	if options.create is not None:
		superuser()
		request.create_workgroup(options.create)
		return
	if options.delete is not None:
		superuser()
		request.remove_workgroup(options.delete)
		return
	if options.info:
		if options.mac is not None:
			request.info_machine(options.mac)
		else:
			request.info_machine()
		return
	if options.nat:
		request.show_nat_type()
		return
	if len(args) == 0:
		request.listmachine()
	if len(args) >= 1:
		if not request.connect(args[0], options, args):
			request.basic_connect(args[0], options, args)
if __name__ == "__main__":
	Main()