#!/usr/bin/env python
# -*- coding: UTF8 -*-

# gnome-sshman

#        
#         GPL License                                                                         
#        
#         Copyright (c) 2005, Jordi Ivars Oller <ear@oronetes.net>                    
#                                                                                     
#         This program is free software; you can redistribute it and/or               
#         modify it under the terms of the GNU General Public License                 
#         as published by the Free Software Foundation; either version 2              
#         of the License, or (at your option) any later version.                      
#                                                                                     
#         This program is distributed in the hope that it will be useful,             
#         but WITHOUT ANY WARRANTY; without even the implied warranty of              
#         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               
#         GNU General Public License for more details.                                
#                                                                                     
#         You should have received a copy of the GNU General Public License           
#         along with this program; if not, write to the Free Software                 
#         Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
#      


#version 0.4

#TODO:
#Store passwords (with gnome-keyring if possible)

#CHANGELOG (version 0.4):
#-Corrected bug with text. With strings translated with different number 
#of characters than original language now the text label expands 
#correctly
#-Simplified look&feel to be more compliant with Gnome HIG
#-New and more simplest sessions selector
#-New button to go to sessions folder (to delete, rename, etc sessions)
#-Eliminated filechooser (with new sessions selector is not necessary)
#-New about dialog


#Import modules and set the path to glade and python modules


import os, gtk, sys, os.path, gnome, dircache

glade_dir = "/usr/share/gnome-sshman"
sys.path.append('/usr/share/gnome-sshman')

from gnomesshman import gnomesshman
from os.path import exists


		
class main:

	def __init__(self):
	
#Try with arguments. If exists args (a path to file), pass the args. If not, args are empty (None)

	
		try:


			port = 22
	
			
			if sys.argv[1]:
			

				if sys.argv[1] == "--about":
			
					
					acercax = Acerca()
					acercax.run()			
					

				else:
					
					start(sys.argv[1],port)
				
							
		except:
			
				port=22
				ip=None
				start(ip,port)										


class start:

	def __init__(self,conection,port):
					
				
		home=os.path.expanduser("~")
		session_folder=home+"/.gnome-sshman"
		
		#If not exists ssh session directories, create
			
		if not exists (session_folder):
			
			os.system("mkdir "+session_folder)
		

#If exists args, open the file passed in args

		if conection != None:
			lee=open(conection,'r')
			ip=lee.read()
			lee.close()
			host=ip.split("\n")[0]
			
#By default, the session_name=filename withouth .ssh. To separe file and directories, split / 

			index=len(conection.split("/"))
			session_name=conection.split("/")[index-1]
			
			session_name=session_name.split(".ssh")[0]
			
#Separe file content with split @. If list have 1 valor, only have IP. If have 2, user+ip
#and if is different from 1 or 2, error.

			if len(host.split("@")) == 1:
			
				username=None
				host=host.split("@")[0]
				self.conectar(host,username,port,session_name)
			
			elif len(host.split("@")) == 2:
		
				
				username=host.split("@")[0]
				host=host.split("@")[1]				
				self.conectar(host,username,port,session_name)
			else:
		
				
				IpErrorMsg()
				
		
		else:
			
			host = None
			username = None
			session_name = None			
			self.conectar(host,username,port,session_name)

#Pass all the needed vars, the ip, username, the port and the session name.

		
	def conectar(self,ip,username,port,session_name):
			
		
		if ip != None:		
	
#Find if exists a previous registered session name in saved sessions directory.

			home=os.path.expanduser("~")
			regster=home+"/.gnome-sshman/"+session_name+".ssh"

			if exists (regster):

#If exists register, open, read it and pass ip and user

				a=open(regster,'r')
				data=a.read()
				username = data.split('@')[0]
				ip = data.split('@')[1]
				host = ip.split('/n')[0]
			
				gssh_main = GsshMain(username,ip,port,session_name)
				gssh_main.run()			
						
			else:

#If not exists register, username is empty
	
				gssh_main = GsshMain(username,ip,port,session_name)
				gssh_main.run()	
		else:

#If not arguments in main, username and ip are empty (None)

			username=None
			ip=None
			gssh_main = GsshMain(username,ip,port,session_name)
			gssh_main.run()

#Main window class
class GsshMain(gnomesshman):


	def __init__(self,username,ip,port,session_name,glade_path="gssh-main.glade", root="gssh-main", domain=None):
		glade_path = os.path.join(glade_dir, glade_path)
		gnomesshman.__init__(self, glade_path, root, domain)
		
		#Pass variables to self global variables
		self.username = username
		self.ip = ip
		self.port = port
		self.save_log="yes"
		self.entry_session_changed="no"

		if session_name == None:
		
			session_name = ""
			
		self.session_name=session_name
		


		#If exists previous data, write to text entries

		if self.username != None:
			self.entry_user.set_text(self.username)

		if self.ip != None:
			self.entry_host.set_text(self.ip)
			
		self.entry_save.set_text(self.session_name)
		self.entry_port.set_text(str(self.port))
		
		#Get a list of all session files
		self.get_files()
		

	def new(self):
		pass

	def get_files(self):
	
		#From our sessions folder, get all files withouth .sshman to put in comboboxentry1
		
		home=os.path.expanduser("~")
		session_folder=home+"/.gnome-sshman"
		
		a=dircache.listdir(session_folder)
		b=len(a)
		c=0

	
		while c < b:
			x=a[c]
			self.comboboxentry1.append_text(x.split(".ssh")[0])
			c=c+1


	def on_comboboxentry1_changed(self, widget, *args):
    
	
		
		#Get text from combobox
	
		entrada = self.comboboxentry1.get_model()
		activo = self.comboboxentry1.get_active()
		if activo < 0:
			return None
		filename=entrada[activo][0]+".ssh"
		home=os.path.expanduser("~")
		session_folder=home+"/.gnome-sshman/"
		filename=session_folder+filename
		
		port = "22"
		
			
		lee=open(filename,'r')
		filedata=lee.read()
		lee.close()
		filedata=filedata.split("\n")[0]
				
		index=len(filename.split("/"))
		session_name=filename.split("/")[index-1]
			
		session_name=session_name.split(".ssh")[0]
						
		if len(filedata.split("@")) == 1:
				
			username=None
			host=filedata.split("@")[0]
			self.entry_host.set_text(host)
			self.entry_user.set_text("")
			self.entry_save.set_text(session_name)
			
		elif len(filedata.split("@")) == 2:
			
			username=filedata.split("@")[0]
			host=filedata.split("@")[1]				
						
			self.entry_user.set_text(username)
			self.entry_host.set_text(host)
			self.entry_save.set_text(session_name)
			
					
    
	
	def on_entry_user_changed(self, widget, *args):
	
		#Username text entry
			
		self.username=self.entry_user.get_text()
	

	def on_entry_host_changed(self, widget, *args):
	
		#Hostname or Ip entry
	
		self.ip=self.entry_host.get_text()
				
	def on_entry_save_changed(self, widget, *args):
	
		#Save session name entry

		self.session_name=self.entry_save.get_text()
		self.entry_session_changed="yes"
	

	def on_entry_port_changed(self, widget, *args):
	
		#Port entry

		self.port=self.entry_port.get_text()


	def on_save_session_toggled(self, widget, *args):
	
		#Save session checkbutton. If is or not active, save_log is advised
				
		if self.save_session.get_active():
		 	
			
   			self.save_log="yes"
		else:
		
			self.save_log="no"
		#print "on_save_session_toggled called with self.%s" % widget.get_name()
	
	
			
	def on_button3_clicked(self, widget, *args):
	
		#Cancel button
	
		gtk.main_quit()
		
	def on_button4_clicked(self, widget, *args):
	
		#Ok button. 
		
		#Check session name changes.
		if self.entry_session_changed == "no":
			self.session_name = self.session_name
			
		
		self.open_session()
		
	def on_sessions_folder_button_clicked(self, widget, *args):
		
		#Button to open nautilus in sessions folder.

		home=os.path.expanduser("~")
		session_folder=home+"/.gnome-sshman/"
		
		os.system("nautilus "+session_folder)
		
	def open_session(self):

	
		#Check if passed host/port is available opening a connection. If not, error
		
		try:
			import socket
			s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
			s.connect((self.ip, int(self.port)))
			s.close()
			
			conexion = "yes"
		
		except:
	
			conexion = "no"
		
		
		if conexion == "yes":
		
		#Close main window and open xterm connection. Save register if save_log permits it.
		
			gtk.main_quit()
			
			if self.save_log == "no":
				
				import os
				server=self.username+"@"+self.ip
						
		#Checking gnome module
					
				gnome.execute_terminal_shell(os.getcwd(),"ssh %s" % server) 
		
		
			elif self.save_log == "yes":
		
			
				import os.path
				from os.path import exists
				import time
		#In register .ssh file, adds username@ip		
				server=self.username+"@"+self.ip
				
				home=os.path.expanduser("~")
		
				if self.session_name=="":
				
					regster=home+"/.gnome-sshman/"+self.ip+".ssh"
					
				else:
		
					regster=home+"/.gnome-sshman/"+self.session_name+".ssh"
		
		#!!Future!! Save session logs
				#logster=home+"/.gnome-sshman/"+self.ip+".log"			
			
				a=open(regster,'wr')
				a.write(server)
				a.close()
				
				gnome.execute_terminal_shell(os.getcwd(),"ssh %s" % server)
		
		elif conexion == "no":
	
		#Call error window when connection is not available
		
			ConectErrorMsg()
	


#Window for invalid ip error
class IpErrorMsg(gnomesshman):
	def __init__(self, glade_path="gssh-main.glade", root="ip_error_msg", domain=None):
		glade_path = os.path.join(glade_dir, glade_path)
		gnomesshman.__init__(self, glade_path, root, domain)

	def new(self):
		pass

	def on_okbutton1_clicked(self, widget, *args):
		self.ip_error_msg.hide()

#Window for invalid connection error
class ConectErrorMsg(gnomesshman):
	def __init__(self, glade_path="gssh-main.glade", root="conect_error_msg", domain=None):
		glade_path = os.path.join(glade_dir, glade_path)
		gnomesshman.__init__(self, glade_path, root, domain)

	def new(self):
		
		pass
			

	def on_okbutton2_clicked(self, widget, *args):
		self.conect_error_msg.hide()
		

class Acerca(gnomesshman):
	def __init__(self, glade_path="gssh-main.glade", root="acerca", domain=None):
		glade_path = os.path.join(glade_dir, glade_path)
		gnomesshman.__init__(self, glade_path, root, domain)

	def new(self):
		#context Acerca.new {
		pass
		#context Acerca.new }

	#context Acerca custom methods {
	#--- Write your own methods here ---#
	#context Acerca custom methods }

	def on_aboutdialog1_destroy(self, widget, *args):
		
		gtk.main_quit()
		

main()
