Skip to content

Commit 4cd5b63

Browse files
authored
Get exit status implementation and tests (#99)
* Added get_exit_status functionality and tests * Added get exit status with signal tests * Updated changelog
1 parent 6e4cb16 commit 4cd5b63

File tree

5 files changed

+1640
-1119
lines changed

5 files changed

+1640
-1119
lines changed

Changelog.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Changes
99

1010
* Added private key file formats to `ssh.key` and `ssh.key.Key.export_privkey_file_format` for exporting private key
1111
file with specified format - #96
12-
12+
* Added `ssh.channel.Channel.get_exit_status` implementation and tests.
1313

1414

1515
1.1.1

ci/integration_tests/test_channel.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,48 @@ def test_exit_code(self):
123123
status = chan.get_exit_status()
124124
self.assertEqual(status, 2)
125125

126+
def test_exit_state(self):
127+
self._auth()
128+
chan = self.session.channel_new()
129+
self.assertEqual(chan.open_session(), 0)
130+
self.assertEqual(chan.request_exec('exit 2'), 0)
131+
self.assertEqual(chan.send_eof(), 0)
132+
self.assertEqual(chan.close(), 0)
133+
exit_code, signal, pcore_dumped = chan.get_exit_state()
134+
self.assertEqual(exit_code, 2)
135+
136+
def test_exit_state_w_signal(self):
137+
self._auth()
138+
chan = self.session.channel_new()
139+
my_sig = 'TERM'
140+
chan.open_session()
141+
chan.request_exec('sleep 5 && exit 0')
142+
chan.send_eof()
143+
chan.request_send_signal(my_sig)
144+
chan.close()
145+
exit_code, signal, pcore_dumped = chan.get_exit_state()
146+
self.assertNotEqual(exit_code, 0)
147+
self.assertEqual(signal, bytes(my_sig, 'utf-8'))
148+
149+
def test_exit_state_w_signal_non_blocking(self):
150+
self._auth()
151+
chan = self.session.channel_new()
152+
my_sig = 'TERM'
153+
chan.open_session()
154+
chan.request_exec('sleep 5 && exit 0')
155+
chan.send_eof()
156+
chan.request_send_signal(my_sig)
157+
chan.close()
158+
self.session.set_blocking(0)
159+
exit_code, signal, pcore_dumped = chan.get_exit_state()
160+
while exit_code == SSH_AGAIN:
161+
self.assertEqual(signal, b"")
162+
self.assertFalse(pcore_dumped)
163+
wait_socket(self.session, self.sock)
164+
exit_code, signal, pcore_dumped = chan.get_exit_state()
165+
self.assertNotEqual(exit_code, 0)
166+
self.assertEqual(signal, bytes(my_sig, 'utf-8'))
167+
126168
def test_long_running_execute(self):
127169
self._auth()
128170
chan = self.session.channel_new()

ssh/c_ssh.pxd

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,10 @@ cdef extern from "libssh/libssh.h" nogil:
268268
int ssh_channel_change_pty_size(ssh_channel channel, int cols, int rows)
269269
int ssh_channel_close(ssh_channel channel)
270270
void ssh_channel_free(ssh_channel channel)
271+
int ssh_channel_get_exit_state(ssh_channel channel,
272+
uint32_t *pexit_code,
273+
char **pexit_signal,
274+
int *pcore_dumped)
271275
int ssh_channel_get_exit_status(ssh_channel channel)
272276
ssh_session ssh_channel_get_session(ssh_channel channel)
273277
int ssh_channel_is_closed(ssh_channel channel)

0 commit comments

Comments
 (0)