channel operations raise an exception on error now instead of returning a bool
This commit is contained in:
parent
581103665b
commit
de1e072c73
|
@ -129,8 +129,9 @@ class Channel (object):
|
||||||
@type width: int
|
@type width: int
|
||||||
@param height: height (in characters) of the terminal screen
|
@param height: height (in characters) of the terminal screen
|
||||||
@type height: int
|
@type height: int
|
||||||
@return: C{True} if the operation succeeded; C{False} if not.
|
|
||||||
@rtype: bool
|
@raise SSHException: if the request was rejected or the channel was
|
||||||
|
closed
|
||||||
"""
|
"""
|
||||||
if self.closed or self.eof_received or self.eof_sent or not self.active:
|
if self.closed or self.eof_received or self.eof_sent or not self.active:
|
||||||
raise SSHException('Channel is not open')
|
raise SSHException('Channel is not open')
|
||||||
|
@ -147,7 +148,7 @@ class Channel (object):
|
||||||
m.add_string('')
|
m.add_string('')
|
||||||
self.event.clear()
|
self.event.clear()
|
||||||
self.transport._send_user_message(m)
|
self.transport._send_user_message(m)
|
||||||
return self._wait_for_event()
|
self._wait_for_event()
|
||||||
|
|
||||||
def invoke_shell(self):
|
def invoke_shell(self):
|
||||||
"""
|
"""
|
||||||
|
@ -162,8 +163,8 @@ class Channel (object):
|
||||||
When the shell exits, the channel will be closed and can't be reused.
|
When the shell exits, the channel will be closed and can't be reused.
|
||||||
You must open a new channel if you wish to open another shell.
|
You must open a new channel if you wish to open another shell.
|
||||||
|
|
||||||
@return: C{True} if the operation succeeded; C{False} if not.
|
@raise SSHException: if the request was rejected or the channel was
|
||||||
@rtype: bool
|
closed
|
||||||
"""
|
"""
|
||||||
if self.closed or self.eof_received or self.eof_sent or not self.active:
|
if self.closed or self.eof_received or self.eof_sent or not self.active:
|
||||||
raise SSHException('Channel is not open')
|
raise SSHException('Channel is not open')
|
||||||
|
@ -174,7 +175,7 @@ class Channel (object):
|
||||||
m.add_boolean(1)
|
m.add_boolean(1)
|
||||||
self.event.clear()
|
self.event.clear()
|
||||||
self.transport._send_user_message(m)
|
self.transport._send_user_message(m)
|
||||||
return self._wait_for_event()
|
self._wait_for_event()
|
||||||
|
|
||||||
def exec_command(self, command):
|
def exec_command(self, command):
|
||||||
"""
|
"""
|
||||||
|
@ -188,8 +189,9 @@ class Channel (object):
|
||||||
|
|
||||||
@param command: a shell command to execute.
|
@param command: a shell command to execute.
|
||||||
@type command: str
|
@type command: str
|
||||||
@return: C{True} if the operation succeeded; C{False} if not.
|
|
||||||
@rtype: bool
|
@raise SSHException: if the request was rejected or the channel was
|
||||||
|
closed
|
||||||
"""
|
"""
|
||||||
if self.closed or self.eof_received or self.eof_sent or not self.active:
|
if self.closed or self.eof_received or self.eof_sent or not self.active:
|
||||||
raise SSHException('Channel is not open')
|
raise SSHException('Channel is not open')
|
||||||
|
@ -201,7 +203,7 @@ class Channel (object):
|
||||||
m.add_string(command)
|
m.add_string(command)
|
||||||
self.event.clear()
|
self.event.clear()
|
||||||
self.transport._send_user_message(m)
|
self.transport._send_user_message(m)
|
||||||
return self._wait_for_event()
|
self._wait_for_event()
|
||||||
|
|
||||||
def invoke_subsystem(self, subsystem):
|
def invoke_subsystem(self, subsystem):
|
||||||
"""
|
"""
|
||||||
|
@ -214,8 +216,9 @@ class Channel (object):
|
||||||
|
|
||||||
@param subsystem: name of the subsystem being requested.
|
@param subsystem: name of the subsystem being requested.
|
||||||
@type subsystem: str
|
@type subsystem: str
|
||||||
@return: C{True} if the operation succeeded; C{False} if not.
|
|
||||||
@rtype: bool
|
@raise SSHException: if the request was rejected or the channel was
|
||||||
|
closed
|
||||||
"""
|
"""
|
||||||
if self.closed or self.eof_received or self.eof_sent or not self.active:
|
if self.closed or self.eof_received or self.eof_sent or not self.active:
|
||||||
raise SSHException('Channel is not open')
|
raise SSHException('Channel is not open')
|
||||||
|
@ -227,7 +230,7 @@ class Channel (object):
|
||||||
m.add_string(subsystem)
|
m.add_string(subsystem)
|
||||||
self.event.clear()
|
self.event.clear()
|
||||||
self.transport._send_user_message(m)
|
self.transport._send_user_message(m)
|
||||||
return self._wait_for_event()
|
self._wait_for_event()
|
||||||
|
|
||||||
def resize_pty(self, width=80, height=24):
|
def resize_pty(self, width=80, height=24):
|
||||||
"""
|
"""
|
||||||
|
@ -238,8 +241,9 @@ class Channel (object):
|
||||||
@type width: int
|
@type width: int
|
||||||
@param height: new height (in characters) of the terminal screen
|
@param height: new height (in characters) of the terminal screen
|
||||||
@type height: int
|
@type height: int
|
||||||
@return: C{True} if the operation succeeded; C{False} if not.
|
|
||||||
@rtype: bool
|
@raise SSHException: if the request was rejected or the channel was
|
||||||
|
closed
|
||||||
"""
|
"""
|
||||||
if self.closed or self.eof_received or self.eof_sent or not self.active:
|
if self.closed or self.eof_received or self.eof_sent or not self.active:
|
||||||
raise SSHException('Channel is not open')
|
raise SSHException('Channel is not open')
|
||||||
|
@ -946,10 +950,13 @@ class Channel (object):
|
||||||
while True:
|
while True:
|
||||||
self.event.wait(0.1)
|
self.event.wait(0.1)
|
||||||
if self.event.isSet():
|
if self.event.isSet():
|
||||||
break
|
return
|
||||||
if self.closed:
|
if self.closed:
|
||||||
return False
|
e = self.transport.get_exception()
|
||||||
return True
|
if e is None:
|
||||||
|
e = SSHException('Channel closed.')
|
||||||
|
raise e
|
||||||
|
return
|
||||||
|
|
||||||
def _set_closed(self):
|
def _set_closed(self):
|
||||||
# you are holding the lock.
|
# you are holding the lock.
|
||||||
|
|
|
@ -93,8 +93,7 @@ class SFTPClient (BaseSFTP):
|
||||||
chan = t.open_session()
|
chan = t.open_session()
|
||||||
if chan is None:
|
if chan is None:
|
||||||
return None
|
return None
|
||||||
if not chan.invoke_subsystem('sftp'):
|
chan.invoke_subsystem('sftp')
|
||||||
raise SFTPError('Failed to invoke sftp subsystem')
|
|
||||||
return cls(chan)
|
return cls(chan)
|
||||||
from_transport = classmethod(from_transport)
|
from_transport = classmethod(from_transport)
|
||||||
|
|
||||||
|
|
|
@ -353,10 +353,14 @@ class TransportTest (unittest.TestCase):
|
||||||
|
|
||||||
chan = self.tc.open_session()
|
chan = self.tc.open_session()
|
||||||
schan = self.ts.accept(1.0)
|
schan = self.ts.accept(1.0)
|
||||||
self.assert_(not chan.exec_command('no'))
|
try:
|
||||||
|
chan.exec_command('no')
|
||||||
|
self.assert_(False)
|
||||||
|
except SSHException, x:
|
||||||
|
pass
|
||||||
|
|
||||||
chan = self.tc.open_session()
|
chan = self.tc.open_session()
|
||||||
self.assert_(chan.exec_command('yes'))
|
chan.exec_command('yes')
|
||||||
schan = self.ts.accept(1.0)
|
schan = self.ts.accept(1.0)
|
||||||
schan.send('Hello there.\n')
|
schan.send('Hello there.\n')
|
||||||
schan.send_stderr('This is on stderr.\n')
|
schan.send_stderr('This is on stderr.\n')
|
||||||
|
@ -371,7 +375,7 @@ class TransportTest (unittest.TestCase):
|
||||||
|
|
||||||
# now try it with combined stdout/stderr
|
# now try it with combined stdout/stderr
|
||||||
chan = self.tc.open_session()
|
chan = self.tc.open_session()
|
||||||
self.assert_(chan.exec_command('yes'))
|
chan.exec_command('yes')
|
||||||
schan = self.ts.accept(1.0)
|
schan = self.ts.accept(1.0)
|
||||||
schan.send('Hello there.\n')
|
schan.send('Hello there.\n')
|
||||||
schan.send_stderr('This is on stderr.\n')
|
schan.send_stderr('This is on stderr.\n')
|
||||||
|
@ -402,7 +406,7 @@ class TransportTest (unittest.TestCase):
|
||||||
self.assert_(self.ts.is_active())
|
self.assert_(self.ts.is_active())
|
||||||
|
|
||||||
chan = self.tc.open_session()
|
chan = self.tc.open_session()
|
||||||
self.assert_(chan.invoke_shell())
|
chan.invoke_shell()
|
||||||
schan = self.ts.accept(1.0)
|
schan = self.ts.accept(1.0)
|
||||||
chan.send('communist j. cat\n')
|
chan.send('communist j. cat\n')
|
||||||
f = schan.makefile()
|
f = schan.makefile()
|
||||||
|
@ -454,7 +458,7 @@ class TransportTest (unittest.TestCase):
|
||||||
|
|
||||||
chan = self.tc.open_session()
|
chan = self.tc.open_session()
|
||||||
schan = self.ts.accept(1.0)
|
schan = self.ts.accept(1.0)
|
||||||
self.assert_(chan.exec_command('yes'))
|
chan.exec_command('yes')
|
||||||
schan.send('Hello there.\n')
|
schan.send('Hello there.\n')
|
||||||
# trigger an EOF
|
# trigger an EOF
|
||||||
schan.shutdown_read()
|
schan.shutdown_read()
|
||||||
|
@ -487,7 +491,7 @@ class TransportTest (unittest.TestCase):
|
||||||
self.assert_(self.ts.is_active())
|
self.assert_(self.ts.is_active())
|
||||||
|
|
||||||
chan = self.tc.open_session()
|
chan = self.tc.open_session()
|
||||||
self.assert_(chan.invoke_shell())
|
chan.invoke_shell()
|
||||||
schan = self.ts.accept(1.0)
|
schan = self.ts.accept(1.0)
|
||||||
|
|
||||||
# nothing should be ready
|
# nothing should be ready
|
||||||
|
@ -550,7 +554,7 @@ class TransportTest (unittest.TestCase):
|
||||||
self.tc.packetizer.REKEY_BYTES = 16384
|
self.tc.packetizer.REKEY_BYTES = 16384
|
||||||
|
|
||||||
chan = self.tc.open_session()
|
chan = self.tc.open_session()
|
||||||
self.assert_(chan.exec_command('yes'))
|
chan.exec_command('yes')
|
||||||
schan = self.ts.accept(1.0)
|
schan = self.ts.accept(1.0)
|
||||||
|
|
||||||
self.assertEquals(self.tc.H, self.tc.session_id)
|
self.assertEquals(self.tc.H, self.tc.session_id)
|
||||||
|
@ -586,7 +590,7 @@ class TransportTest (unittest.TestCase):
|
||||||
self.assert_(self.ts.is_active())
|
self.assert_(self.ts.is_active())
|
||||||
|
|
||||||
chan = self.tc.open_session()
|
chan = self.tc.open_session()
|
||||||
self.assert_(chan.exec_command('yes'))
|
chan.exec_command('yes')
|
||||||
schan = self.ts.accept(1.0)
|
schan = self.ts.accept(1.0)
|
||||||
|
|
||||||
bytes = self.tc.packetizer._Packetizer__sent_bytes
|
bytes = self.tc.packetizer._Packetizer__sent_bytes
|
||||||
|
|
Loading…
Reference in New Issue