[PATCH rtems-tools v2] rtemstoolkit: add support for executing pipe command

Chris Johns chrisj at rtems.org
Wed Jun 21 00:36:42 UTC 2023


Hi,

I applied the patch and ran the unit tests and they passed however the change
has broken the execute class.

The FreeBSD host runs sysctl to detect the number of cores when options are
loaded and the `e.shell()` at the top of `freebsd.py` is failing with:

$ ./tester/rtems-test --help
s: /: Permission denied
rtems-test: [options] [args]
RTEMS Tools Project, 6 (60e793a17c38)

The issue is the `command` can be a string or it can be a list and your change
assumes the command provided is a string.

Splitting the command if a string helped but a further changed was needed if
there is only 1 process to run so the stdin and stdout are set correctly.

I have fixed the code and pushed it so please review for me.

Thanks
Chris

On 20/6/2023 12:32 pm, Muhammad Sulthan Mazaya wrote:
> added unit tests and shorten long lines.
> 
> ---
>  rtemstoolkit/execute.py | 43 ++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 38 insertions(+), 5 deletions(-)
> 
> diff --git a/rtemstoolkit/execute.py b/rtemstoolkit/execute.py
> index ed81589..9ec1cd7 100755
> --- a/rtemstoolkit/execute.py
> +++ b/rtemstoolkit/execute.py
> @@ -389,11 +389,38 @@ class execute(object):
>                      r, e = os.path.splitext(command[0])
>                      if e not in ['.exe', '.com', '.bat']:
>                          command[0] = command[0] + '.exe'
> -            proc = subprocess.Popen(command, shell = shell,
> -                                    cwd = cwd, env = env,
> -                                    stdin = stdin, stdout = stdout,
> -                                    stderr = stderr,
> -                                    close_fds = False)
> +                        
> +            pipe_commands = []
> +            current_command = []
> +            for cmd in command:
> +                if cmd == '|':
> +                    pipe_commands.append(current_command)
> +                    current_command = []
> +                else:
> +                    current_command.append(cmd)
> +            pipe_commands.append(current_command)
> +
> +            proc = None
> +            for i, cmd in enumerate(pipe_commands):
> +                if i == 0:
> +                    proc = subprocess.Popen(
> +                        cmd, shell=shell,
> +                        cwd=cwd, env=env,
> +                        stdin=stdin, stdout=subprocess.PIPE)
> +                elif i == len(pipe_commands) - 1:
> +                    proc = subprocess.Popen(
> +                        cmd, shell=shell,
> +                        cwd=cwd, env=env,
> +                        stdin=proc.stdout,
> +                        stdout=stdout, stderr=stderr,
> +                        close_fds=False)
> +                else:
> +                    proc = subprocess.Popen(
> +                        cmd, shell=shell,
> +                        cwd=cwd, env=env,
> +                        stdin=proc.stdout,
> +                        stdout=subprocess.PIPE)
> +
>              if not capture:
>                  return (0, proc)
>              if self.output is None:
> @@ -583,6 +610,10 @@ if __name__ == "__main__":
>              proc.stdin.close()
>              e.capture(proc)
>              del proc
> +        ec, proc = e.open(commands['open'])
> +        if ec == 0:
> +            e.capture(proc)
> +            del proc
>  
>      def capture_output(text):
>          print(text, end = '')
> @@ -601,6 +632,7 @@ if __name__ == "__main__":
>      commands['windows']['csubsts'] = [('netstat %0', ['-a']),
>                                        ('netstat %0 %1', ['-a', '-n'])]
>      commands['windows']['pipe'] = ('ftp', None, 'help\nquit')
> +    commands['windows']['open'] = ["echo",  "hello rtems", "|", "findstr", "rtems"]
>      commands['unix']['shell'] = ['pwd', 'ls -las', './xyz', sh_shell_test]
>      commands['unix']['spawn'] = ['ls', 'execute.pyc', ['ls', '-i']]
>      commands['unix']['cmd'] = [('date'), ('date', '-R'), ('date', ['-u', '+%d %D']),
> @@ -608,6 +640,7 @@ if __name__ == "__main__":
>      commands['unix']['csubsts'] = [('date %0 "+%d %D %S"', ['-u']),
>                                     ('date %0 %1', ['-u', '+%d %D %S'])]
>      commands['unix']['pipe'] = ('grep', 'hello', 'hello world')
> +    commands['unix']['open'] = ["echo", "hello world", "|", "cut", "-d ", "-f2"]
>  
>      print(arg_list('cmd a1 a2 "a3 is a string" a4'))
>      print(arg_list('cmd b1 b2 "b3 is a string a4'))


More information about the devel mailing list