Welcome, guest | Sign In | My Account | Store | Cart
import sys,re,time
import pexpect
import exceptions

from string import *
from telnetlib import Telnet

""" Define exceptions """

class TelnetError(exceptions.Exception):
   
def __init__(self, args=None):
       
self.args=args
       
self.errmsg = ''
       
for a in self.args:
           
self.errmsg += str(a)

class JumpError(exceptions.Exception):
   
def __init__(self, args=None):
       
self.args=args
       
self.errmsg = ''
       
for a in self.args:
           
self.errmsg += str(a)

class Jump:

   
""" Initiate an SSH tunnel  
    """

   
def __init__(self, host, env = {}):

       
""" If env not passed explicitly, then
            assume that its inherited from parent
            class.
        """

       
if env != {}:
           
self.env = env

       
self._jump_params()

        sshcmd
= "ssh %s -L %s:%s:23" % \
           
(self.jumpserver,self.jumpport,host)

       
if self.DEBUG >= 3: print "ssh cmd: %s" % (sshcmd)

       
""" Create SSH tunnel """
       
self.tunnel = pexpect.spawn(sshcmd)

       
if self.DEBUG >= 2: print "jump to %s:%s" % \
               
(self.jumpserver,self.jumpport)

       
if self.DEBUG >= 3: print "waiting for %s" % \
           
(self.jumpprompt)

       
""" Process response from jump server """
        expected_replies
= [self.jumpprompt,\
           
'Are you sure you want to continue connecting'\
           
'ssword:']

       
while 1:
            response
= self.tunnel.expect(expected_replies)

           
if response == 0:  # got prompt
               
break

           
""" Got ssh password, prompt, so no public
                key encryption set up
            """

           
if response == 1:  
               
if self.env.has_key('SSHPASSWD'):
                   
self.sshpassword = "%s\n" % \
                       
(self.env['SSHPASSWD'])
               
else:
                   
raise JumpError, "no SSH Password"
               
self._ssh_login()

           
""" If prompted, add to known_hosts file """
           
if response == 2:              
               
self.tunnel.send("yes\n")
     
       
if self.DEBUG >= 1: print self.tunnel.before

       
if self.DEBUG >= 3: print "tunnel %s:%s established" % \
               
(self.jumpserver,self.jumpport)

   
""" Process parameters needed to create the
        SSH tunnel to the Jump host
    """

   
def _jump_params(self):

       
""" Set debug level """
       
if self.env.has_key('DEBUG'):
           
self.DEBUG = int(self.env['DEBUG'])
       
else:
           
self.DEBUG = 0

       
try:
           
self.jumpserver = self.env['JMPSERVER']
           
self.jumpport   = self.env['PORT']
           
self.jumpprompt = self.env['JMPPROMPT']
       
except:
           
raise JumpError, "missing parameters"

       
return 0

   
""" Login with SSH password
    """

   
def _ssh_login(self):
       
if self.DEBUG >= 1: print self.tunnel.before
       
self.tunnel.send(self.sshpassword)

class Climgmt(Jump):

   
def __init__(self,host,env = {}):

       
self.host = host

       
""" If no environment passed as a parameter,
            then assume environment is inherited from
            parent class.
        """

       
if env != {}:
           
self.env = env

       
self._climgmt_params()

       
""" Create ssh tunnel is jump server specified """
       
if self.jumpserver != None:
           
Jump.__init__(self,host)  

       
if self.DEBUG >= 3: print "Telneting to %s on port %d" %  \
           
(self.host, self.port)

       
""" Initiate Telnet session """
       
try:
           
self.session = Telnet(self.host, self.port)
       
except:
           
self.tunnel.close()
           
raise TelnetError, "cannot establish telnet session"

   
""" Set parameters
    """

   
def _climgmt_params(self):

       
""" Debug level """
       
if self.env.has_key('DEBUG'):
           
self.DEBUG = int(self.env['DEBUG'])
       
else:
           
self.DEBUG = 0

       
""" Device prompt """
       
if self.env.has_key('PROMPT'):
           
self.prompt = self.env['PROMPT']
       
else:
           
self.prommpt = None

       
""" Jump server """
       
if self.env.has_key('JMPSERVER'):
           
self.jumpserver = self.env['JMPSERVER']
           
self.host = "localhost"
       
else:
           
self.jumpserver = None

       
""" The Telnet port maybe different because we are
            going through a jump server (ssh tunnel).
        """

       
if self.env.has_key('PORT'):
           
self.port = int(self.env['PORT'])
       
else:
           
self.port = 23    # default Telnet port

       
return 0

   
""" Issue a command to the Telnet device  
    """

   
def cmd(self, cmd, newprompt = None):

       
if newprompt == None:
            prompt
= self.prompt
       
else:
            prompt
= newprompt

       
self.session.write(cmd+'\n')

        response
= self.session.read_until(prompt,8)

       
if self.DEBUG >= 3: print response

        lines
= response.split('\n')
        lines
= map(lambda i: strip(strip(i,'\r')), lines)

       
return lines

   
""" Close telnet session (and ssh tunnel)  
    """

   
def close(self):

       
if self.DEBUG >= 3: print "closing Telnet session <%s,%d>" % \
               
(self.host, self.port)

       
""" Close Telnet session """
       
self.session.close()    # close telnet session

       
""" Check to see if tunnel exists (note: must
            find better way of check if tunnel exists)
        """

       
try:
            tunnel_exists
= self.tunnel
       
except AttributeError, e:
           
return -1
       
except NameError, e:
           
return -1

       
if self.DEBUG >= 3: print "closing ssh tunnel <%s,%s>" % \
               
(self.jumpserver, self.jumpport)

       
""" Close ssh tunnel (if it exists) """
       
self.tunnel.close() # close tunnel

History