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

# Jordi Ivars Oller
# 11-02-2005
# Licensed under GPL <http://www.gnu.org>
#
# 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.2

#TODO:
#Store passwords (with gnome-keyring if possible) for ssh terminal sessions
#Add --title to ssh terminal
#Check if exists nautilus and/or gnome default terminal


#CHANGELOG (version 0.4.2)
#Corrected a bug with popup menu entry with icons gtk.STOCK_ABOUT
#(not works with gtk < 2.6). If can not work, then uses none icon.

#CHANGELOG (version 0.4.1):
#-New popupmenu
#-Entry in popupmenu to open current connection with nautilus (via sftp)
#-Entry in popupmenu to view about dialog
#-Modified all windows to show default icon
#-New about dialog
#-Insensitive connection actions with empty text entries
#-Added czech translation


#Import modules and set path to glade and python modules

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

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

from gnomesshman import gnomesshman
from os.path import exists

#i18n support

import gettext
t = gettext.translation('gnome-sshman', '/usr/share/locale/')
_ = t.ugettext
		
#Globals		

import gssh_globals as gglobals
glade_dir=gglobals.glade_dir
version=gglobals.version

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"
		
		#Var used to execute menu only 1 time
		self.menu_control="1"

		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

#Press button to show menu1
	
	def on_eventbox1_button_press_event(self, widget, *args):
		
		#Paint menu
		self.menu(widget,*args)
		
		#Only connect menu 1 time, in def menu menu_control changes to 2
		if self.menu_control=="1":
			widget.connect('button-press-event', self.menu)
			
		
	def menu(self,widget, event):
	
		#Creating menu. If user+ip entries are empty, open connection with nautilus
		#in menu is insensitive		
		
		if self.ip==None or self.ip=="" or self.username==None or self.username=="":		
			
			menu1=gtk.Menu()
	
			menu_string = """<ui>
            <popup name='Popup'>
                <menuitem action='Open'/>
                <menuitem action='About'/>
            </popup>
            </ui>"""

		
			actg = gtk.ActionGroup('WindowActions')
			try:	
				actions = [('Open', gtk.STOCK_OPEN, _("Open current connection with Nautilus"), '<control>O','Create a new file', self.menu_response),

			('About', gtk.STOCK_ABOUT, _("About Gnome-Sshman"), '<control>O','Open a file', self.go_about),]
			except:
			
				actions = [('Open', gtk.STOCK_OPEN, _("Open current connection with Nautilus"), '<control>O','Create a new file', self.menu_response),

			('About', None, _("About Gnome-Sshman"), '<control>O','Open a file', self.go_about),]
			

			actg.add_actions(actions)
			menuui = gtk.UIManager(gtk.UI_MANAGER_POPUP)
			menuui.insert_action_group(actg, 0)
			menuui.add_ui_from_string(menu_string)
			menu1 = menuui.get_widget("/Popup")

	#Nautilus menu option is insensitive
			menuui.get_widget("/Popup/Open").set_sensitive(gtk.FALSE)
			

		else:
		
			menu1=gtk.Menu()
			
			menu_string = """<ui>
            <popup name='Popup'>
                <menuitem action='Open'/>
                <menuitem action='About'/>
            </popup>
            </ui>"""

			actg = gtk.ActionGroup('WindowActions')
			
			try:
				actions = [('Open', gtk.STOCK_OPEN, _("Open current connection with Nautilus"), '<control>O','Create a new file', self.menu_response),
           		('About', gtk.STOCK_ABOUT, _("About Gnome-Sshman"), '<control>O','Open a file', self.go_about),]
			except:
				actions = [('Open', gtk.STOCK_OPEN, _("Open current connection with Nautilus"), '<control>O','Create a new file', self.menu_response),
           		('About', None, _("About Gnome-Sshman"), '<control>O','Open a file', self.go_about),]

			actg.add_actions(actions)
			menuui = gtk.UIManager(gtk.UI_MANAGER_POPUP)
			menuui.insert_action_group(actg, 0)
			menuui.add_ui_from_string(menu_string)
			menu1 = menuui.get_widget("/Popup")

#Nautilus menu options turns sensitive

			menuui.get_widget("/Popup/Open").set_sensitive(gtk.TRUE)
	
	#Defining menu as popup
	
		if event.type == gtk.gdk.BUTTON_PRESS:
			#all_menu.popup(None, None, None, event.button, event.time)
			menu1.popup(None, None, None, event.button, event.time)
			#Change menu_control to 2. 
			self.menu_control="2"
	
	def go_about(self,data_enter):
		
		Acerca()		
		
	def menu_response(self,data_enter):
	
		import os			
					
		if self.ip == None or self.username == None:
							
			ConectErrorMsg()	
		else:
		
#The nautilus connection is the same that terminal connection		
###Starts nautilus connection

			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":
		
									
				if self.save_log == "no":
				
					import os
					server=self.username+"@"+self.ip
			
					os.system("nautilus sftp://"+server) 
		
		
				elif self.save_log == "yes":
		
			
					import os.path
					from os.path import exists
					import time
				
					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"
				
						a=open(regster,'wr')
						a.write(server)
						a.close()
				
						os.system("nautilus sftp://"+server)
		
			elif conexion == "no":
	
				ConectErrorMsg()
			
#####Ends nautilus connection
			
						
			os.system("nautilus sftp://"+self.username+"@"+self.ip)
				
				
		
	def get_files(self):
	
		#From our sessions folder, get all files withouth .ssh 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):
	
		self.username=self.entry_user.get_text()
	
#If username or host entries are empty, ok button is insensible

		if self.username == None or self.username == "" or self.ip == None or self.ip=="":
			
			self.button_ok.set_sensitive(gtk.FALSE)
		
		else:
		
			self.button_ok.set_sensitive(gtk.TRUE)

		
	

	def on_entry_host_changed(self, widget, *args):
	
		#Hostname or Ip entry
	
		self.ip=self.entry_host.get_text()
	
#If username or host entries are empty, ok button is insensible	
		if self.username == None or self.username == "" or self.ip == None or self.ip=="":
			
			self.button_ok.set_sensitive(gtk.FALSE)
		
		else:
		
			self.button_ok.set_sensitive(gtk.TRUE)
			
	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"
					
	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
				title="Ssh session: "+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"
					title=self.ip
					
				else:
		
					regster=home+"/.gnome-sshman/"+self.session_name+".ssh"
					title=self.session_name
		
		#!!Future!! Save session logs?
				#logster=home+"/.gnome-sshman/"+self.ip+".log"			
			
				a=open(regster,'wr')
				a.write(server)
				a.close()
				
				title="--title Ssh session: "+title
			
				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()
		
		
def Acerca():

	import gnome.ui
	about = gnome.ui.About('Gnome-Sshman\n',version,_('Published under GPL license'),_('The ssh manager for Gnome'),['Jordi Ivars <ear@oronetes.net'],None,_('Jordi Ivars <ear@oronetes.net>'))
	about.show()
	
main()
