__init__.py

Go to the documentation of this file.
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...