Skip to content

Commit

Permalink
Poll ncat tunnel pid (#15056)
Browse files Browse the repository at this point in the history
when checking the pid right after ncat startup
it could happen that no pid was found despite ncat being started.
Polling solves this problem

(cherry picked from commit e918739)
  • Loading branch information
dosas authored and web-flow committed Jun 5, 2024
1 parent 9d3d758 commit 23d8048
Showing 1 changed file with 36 additions and 16 deletions.
52 changes: 36 additions & 16 deletions robottelo/host_helpers/satellite_mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import re

import requests
from wait_for import TimedOutError, wait_for

from robottelo.cli.proxy import CapsuleTunnelError
from robottelo.config import settings
Expand Down Expand Up @@ -278,26 +279,45 @@ def default_url_on_new_port(self, oldport, newport):
:rtype: str
"""
pre_ncat_procs = self.execute('pgrep ncat').stdout.splitlines()
with self.session.shell() as channel:
# if ncat isn't backgrounded, it prevents the channel from closing
command = f'ncat -kl -p {newport} -c "ncat {self.hostname} {oldport}" &'
logger.debug(f'Creating tunnel: {command}')
channel.send(command)

def check_ncat_startup(pre_ncat_procs):
post_ncat_procs = self.execute('pgrep ncat').stdout.splitlines()
ncat_pid = set(post_ncat_procs).difference(set(pre_ncat_procs))
if not len(ncat_pid):
err = channel.get_exit_signal()
logger.debug(f'Tunnel failed: {err}')
# Something failed, so raise an exception.
raise CapsuleTunnelError(f'Starting ncat failed: {err}')
if len(ncat_pid):
return ncat_pid

return None

def start_ncat():
pre_ncat_procs = self.execute('pgrep ncat').stdout.splitlines()
with self.session.shell() as channel:
# if ncat isn't backgrounded, it prevents the channel from closing
command = f'ncat -kl -p {newport} -c "ncat {self.hostname} {oldport}" &'
logger.debug(f'Creating tunnel: {command}')
channel.send(command)

try:
return wait_for(
check_ncat_startup,
func_args=[pre_ncat_procs],
fail_condition=None,
timeout=5,
delay=0.5,
)[0]
except TimedOutError as e:
err = channel.get_exit_signal()
logger.debug(f'Tunnel failed: {err}')
# Something failed, so raise an exception.
raise CapsuleTunnelError(f'Starting ncat failed: {err}') from e

ncat_pid = start_ncat()
try:
forward_url = f'https://{self.hostname}:{newport}'
logger.debug(f'Yielding capsule forward port url: {forward_url}')
try:
yield forward_url
finally:
logger.debug(f'Killing ncat pid: {ncat_pid}')
self.execute(f'kill {ncat_pid.pop()}')
yield forward_url
finally:
logger.debug(f'Killing ncat pid: {ncat_pid}')
self.execute(f'kill {ncat_pid.pop()}')

def validate_pulp_filepath(
self,
Expand Down

0 comments on commit 23d8048

Please sign in to comment.