00001 __copyright__ = """\ 00002 (c). Copyright 1990-2008, Vyper Logix Corp., All Rights Reserved. 00003 00004 Published under Creative Commons License 00005 (http://creativecommons.org/licenses/by-nc/3.0/) 00006 restricted to non-commercial educational use only., 00007 00008 See also: http://www.VyperLogix.com and http://www.pypi.info for details. 00009 00010 THE AUTHOR VYPER LOGIX CORP DISCLAIMS ALL WARRANTIES WITH REGARD TO 00011 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 00012 FITNESS, IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, 00013 INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 00014 FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 00015 NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 00016 WITH THE USE OR PERFORMANCE OF THIS SOFTWARE ! 00017 00018 USE AT YOUR OWN RISK. 00019 """ 00020 00021 import base64 00022 from binascii import hexlify 00023 import getpass 00024 import os 00025 import select 00026 import socket 00027 import sys 00028 import threading 00029 import time 00030 import traceback 00031 00032 import paramiko 00033 00034 from vyperlogix.classes.CooperativeClass import Cooperative 00035 from vyperlogix.misc import ObjectTypeName 00036 from vyperlogix.misc import _utils 00037 00038 __pageant_warning__ = '(Are you sure you have Pageant Running with the host key installed ?)' 00039 00040 class ParamikoSFTP(Cooperative): 00041 def __init__(self,hostname,port,username,password,callback=None,logPath=os.path.abspath(os.path.dirname(sys.argv[0]))): 00042 self.__hostname__ = hostname 00043 self.__port__ = port 00044 self.__username__ = username 00045 self.__password__ = password 00046 self.__transport__ = None 00047 _utils._makeDirs(logPath) 00048 paramiko.util.log_to_file(os.path.join(logPath,'%s.log' % (ObjectTypeName.objectSignature(self)))) 00049 if self.hostname.find(':') >= 0: 00050 self.__hostname__, portstr = hostname.split(':') 00051 self.__port__ = int(portstr) 00052 try: 00053 self.__sock__ = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 00054 self.__sock__.connect((self.hostname, self.port)) 00055 except Exception, _details: 00056 info_string = _utils.formattedException(details=_details) 00057 print '*** Connect failed: %s' % (info_string) 00058 sys.exit(1) 00059 00060 try: 00061 self.__transport__ = paramiko.Transport(self.__sock__) 00062 try: 00063 self.transport.start_client() 00064 except paramiko.SSHException: 00065 print '*** SSH negotiation failed.' 00066 sys.exit(1) 00067 00068 try: 00069 keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) 00070 except IOError: 00071 try: 00072 keys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts')) 00073 except IOError: 00074 print '*** Unable to open host keys file' 00075 keys = {} 00076 00077 # check server's host key -- this is important. 00078 key = self.transport.get_remote_server_key() 00079 if not keys.has_key(hostname): 00080 print '*** WARNING: Unknown host key! %s' % (__pageant_warning__) 00081 elif not keys[hostname].has_key(key.get_name()): 00082 print '*** WARNING: Unknown host key! %s' % (__pageant_warning__) 00083 elif keys[hostname][key.get_name()] != key: 00084 print '*** WARNING: Host key has changed!!! %s' % (__pageant_warning__) 00085 sys.exit(1) 00086 else: 00087 print '*** Host key OK.' 00088 00089 self.agent_auth() 00090 if not self.transport.is_authenticated(): 00091 self.manual_auth() 00092 if not self.transport.is_authenticated(): 00093 print '*** Authentication failed. :(' 00094 t.close() 00095 sys.exit(1) 00096 00097 self.__channel__ = self.transport.open_session() 00098 self.channel.get_pty() 00099 print '*** Here we go!' 00100 print 00101 if (callable(callback)): 00102 callback(self) 00103 self.channel.close() 00104 self.transport.close() 00105 00106 except Exception, _details: 00107 info_string = _utils.formattedException(details=_details) 00108 print info_string 00109 try: 00110 self.transport.close() 00111 except: 00112 pass 00113 sys.exit(1) 00114 00115 00116 def hostname(): 00117 doc = "hostname" 00118 def fget(self): 00119 return self.__hostname__ 00120 return locals() 00121 hostname = property(**hostname()) 00122 00123 def port(): 00124 doc = "port" 00125 def fget(self): 00126 return self.__port__ 00127 return locals() 00128 port = property(**port()) 00129 00130 def username(): 00131 doc = "username" 00132 def fget(self): 00133 return self.__username__ 00134 return locals() 00135 username = property(**username()) 00136 00137 def password(): 00138 doc = "password" 00139 def fget(self): 00140 return self.__password__ 00141 return locals() 00142 password = property(**password()) 00143 00144 def transport(): 00145 doc = "transport" 00146 def fget(self): 00147 return self.__transport__ 00148 return locals() 00149 transport = property(**transport()) 00150 00151 def channel(): 00152 doc = "channel" 00153 def fget(self): 00154 return self.__channel__ 00155 return locals() 00156 channel = property(**channel()) 00157 00158 def getSFTPClient(): 00159 doc = "SFTPClient" 00160 def fget(self): 00161 return paramiko.SFTPClient.from_transport(self.transport) 00162 return locals() 00163 getSFTPClient = property(**getSFTPClient()) 00164 00165 ## 00166 # 00167 # Attempt to authenticate to the given transport using any of the private 00168 # keys available from an SSH agent. 00169 # 00170 def agent_auth(self): 00171 00172 agent = paramiko.Agent() 00173 agent_keys = agent.get_keys() 00174 if len(agent_keys) == 0: 00175 return 00176 00177 for key in agent_keys: 00178 print 'Trying ssh-agent key %s' % hexlify(key.get_fingerprint()), 00179 try: 00180 self.transport.auth_publickey(self.username, key) 00181 print '... success!' 00182 return 00183 except paramiko.SSHException: 00184 print '... nope.' 00185 00186 def manual_auth(self): 00187 self.transport.auth_password(self.username, self.password) 00188 00189 def read(self,sftp,fpath): 00190 return sftp.open(fpath, 'r').read() 00191 00192 def write(self,sftp,fpath,data): 00193 sftp.open(fpath, 'w').write(data) 00194 00195 if (__name__ == '__main__'): 00196 import sys 00197 print >>sys.stdout, __copyright__ 00198 print >>sys.stderr, __copyright__ 00199 00200 00201
© Copyright 2008-2009 Vyper Logix Corp., All Right Reserved; If you reference this document or any part of this document you must use the citation verbatim (including the link) "© Copyright 2008-2009 Vyper Logix Corp., All Right Reserved."
Notice: This source code contained in this document is NOT open source and is NOT being distributed as open source.
122,241 lines of code and growing...