blob: cef632827e2660e475081dc392175eaed57420c0 [file] [log] [blame]
Michael Walshc3b512e2017-02-20 15:59:01 -06001#!/usr/bin/env python
2
3r"""
4This module provides command execution functions such as cmd_fnc and cmd_fnc_u.
5"""
6
7import sys
8import subprocess
9
10robot_env = 1
11try:
Michael Walshc3b512e2017-02-20 15:59:01 -060012 from robot.libraries.BuiltIn import BuiltIn
13except ImportError:
14 robot_env = 0
15import gen_print as gp
16import gen_valid as gv
17import gen_misc as gm
Michael Walshafc53a22017-04-12 15:52:28 -050018if robot_env:
19 import gen_robot_print as grp
Michael Walshc3b512e2017-02-20 15:59:01 -060020
21
22###############################################################################
23def cmd_fnc(cmd_buf,
24 quiet=None,
25 test_mode=None,
Michael Walshafc53a22017-04-12 15:52:28 -050026 debug=0,
Michael Walshc3b512e2017-02-20 15:59:01 -060027 print_output=1,
28 show_err=1):
29
30 r"""
31 Run the given command in a shell and return the shell return code.
32
33 Description of arguments:
34 cmd_buf The command string to be run in a shell.
35 quiet Indicates whether this function should run
36 the pissuing()
37 function prints an "Issuing: <cmd string>" to stdout.
38 test_mode If test_mode is set, this function will
39 not actually run
40 the command.
41 debug If debug is set, this function will print
42 extra debug info.
43 print_output If this is set, this function will print
44 the stdout/stderr
45 generated by the shell command.
46 show_err If show_err is set, this function will
47 print a standardized
48 error report if the shell command returns non-zero.
49 """
50
51 quiet = int(gm.global_default(quiet, 0))
52 test_mode = int(gm.global_default(test_mode, 0))
Michael Walshc3b512e2017-02-20 15:59:01 -060053
54 if debug:
Michael Walshafc53a22017-04-12 15:52:28 -050055 gp.print_vars(cmd_buf, quiet, test_mode, debug)
Michael Walshc3b512e2017-02-20 15:59:01 -060056
57 err_msg = gv.svalid_value(cmd_buf)
58 if err_msg != "":
59 raise ValueError(err_msg)
60
61 if not quiet:
Michael Walshafc53a22017-04-12 15:52:28 -050062 gp.pissuing(cmd_buf, test_mode)
Michael Walshc3b512e2017-02-20 15:59:01 -060063
64 if test_mode:
65 return 0, ""
66
67 sub_proc = subprocess.Popen(cmd_buf,
68 bufsize=1,
69 shell=True,
70 stdout=subprocess.PIPE,
71 stderr=subprocess.STDOUT)
72 out_buf = ""
73 for line in sub_proc.stdout:
74 out_buf += line
75 if not print_output:
76 continue
77 if robot_env:
78 grp.rprint(line)
79 else:
80 sys.stdout.write(line)
81 if print_output and not robot_env:
82 sys.stdout.flush()
83 sub_proc.communicate()
84 shell_rc = sub_proc.returncode
85 if shell_rc != 0 and show_err:
86 if robot_env:
87 grp.rprint_error_report("The prior command failed.\n" +
88 gp.sprint_var(shell_rc, 1))
89 else:
90 gp.print_error_report("The prior command failed.\n" +
91 gp.sprint_var(shell_rc, 1))
92
93 return shell_rc, out_buf
94
95###############################################################################
96
97
98###############################################################################
99def cmd_fnc_u(cmd_buf,
100 quiet=None,
101 debug=None,
102 print_output=1,
103 show_err=1):
104
105 r"""
106 Call cmd_fnc with test_mode=0. See cmd_fnc (above) for details.
107
108 Note the "u" in "cmd_fnc_u" stands for "unconditional".
109 """
110
111 return cmd_fnc(cmd_buf, test_mode=0, quiet=quiet, debug=debug,
112 print_output=print_output, show_err=show_err)
113
114###############################################################################