1#!/usr/bin/env python3
2
3r"""
4This module provides many valuable bmc ssh functions such as bmc_execute_command.
5"""
6
7import os
8import gen_valid as gv
9import gen_robot_ssh as grs
10from robot.libraries.BuiltIn import BuiltIn
11
12
13def bmc_execute_command(cmd_buf,
14                        print_out=0,
15                        print_err=0,
16                        ignore_err=0,
17                        fork=0,
18                        quiet=None,
19                        test_mode=None,
20                        time_out=None):
21    r"""
22    Run the given command in an BMC SSH session and return the stdout, stderr and the return code.
23
24    This function will obtain the global values for OPENBMC_HOST, OPENBMC_USERNAME, etc.
25
26    Description of arguments:
27    cmd_buf                         The command string to be run in an SSH session.
28    print_out                       If this is set, this function will print the stdout/stderr generated by
29                                    the shell command.
30    print_err                       If show_err is set, this function will print a standardized error report
31                                    if the shell command returns non-zero.
32    ignore_err                      Indicates that errors encountered on the sshlib.execute_command are to be
33                                    ignored.
34    fork                            Indicates that sshlib.start is to be used rather than
35                                    sshlib.execute_command.
36    quiet                           Indicates whether this function should run the pissuing() function prints
37                                    an "Issuing: <cmd string>" to stdout.  This defaults to the global quiet
38                                    value.
39    test_mode                       If test_mode is set, this function will not actually run the command.
40                                    This defaults to the global test_mode value.
41    time_out                        The amount of time to allow for the execution of cmd_buf.  A value of
42                                    None means that there is no limit to how long the command may take.
43    """
44
45    # Get global BMC variable values.
46    openbmc_host = BuiltIn().get_variable_value("${OPENBMC_HOST}", default="")
47    ssh_port = BuiltIn().get_variable_value("${SSH_PORT}", default="22")
48    openbmc_username = BuiltIn().get_variable_value("${OPENBMC_USERNAME}",
49                                                    default="")
50    openbmc_password = BuiltIn().get_variable_value("${OPENBMC_PASSWORD}",
51                                                    default="")
52
53    if not gv.valid_value(openbmc_host):
54        return "", "", 1
55    if not gv.valid_value(openbmc_username):
56        return "", "", 1
57    if not gv.valid_value(openbmc_password):
58        return "", "", 1
59    if not gv.valid_value(ssh_port):
60        return "", "", 1
61
62    open_connection_args = {'host': openbmc_host, 'alias': 'bmc_connection',
63                            'timeout': '25.0', 'prompt': '# ', 'port': ssh_port}
64    login_args = {'username': openbmc_username, 'password': openbmc_password}
65
66    openbmc_user_type = os.environ.get('USER_TYPE', "") or \
67        BuiltIn().get_variable_value("${USER_TYPE}", default="")
68    if openbmc_user_type == 'sudo':
69        cmd_buf = 'sudo -i ' + cmd_buf
70    return grs.execute_ssh_command(cmd_buf, open_connection_args, login_args,
71                                   print_out, print_err, ignore_err, fork,
72                                   quiet, test_mode, time_out)
73
74
75def os_execute_command(cmd_buf,
76                       print_out=0,
77                       print_err=0,
78                       ignore_err=0,
79                       fork=0,
80                       quiet=None,
81                       test_mode=None,
82                       time_out=None,
83                       os_host="",
84                       os_username="",
85                       os_password=""):
86    r"""
87    Run the given command in an OS SSH session and return the stdout, stderr and the return code.
88
89    This function will obtain the global values for OS_HOST, OS_USERNAME, etc.
90
91    Description of arguments:
92    cmd_buf                         The command string to be run in an SSH session.
93    print_out                       If this is set, this function will print the stdout/stderr generated by
94                                    the shell command.
95    print_err                       If show_err is set, this function will print a standardized error report
96                                    if the shell command returns non-zero.
97    ignore_err                      Indicates that errors encountered on the sshlib.execute_command are to be
98                                    ignored.
99    fork                            Indicates that sshlib.start is to be used rather than
100                                    sshlib.execute_command.
101    quiet                           Indicates whether this function should run the pissuing() function prints
102                                    an "Issuing: <cmd string>" to stdout.  This defaults to the global quiet
103                                    value.
104    test_mode                       If test_mode is set, this function will not actually run the command.
105                                    This defaults to the global test_mode value.
106    time_out                        The amount of time to allow for the execution of cmd_buf.  A value of
107                                    None means that there is no limit to how long the command may take.
108    """
109
110    # Get global OS variable values.
111    if os_host == "":
112        os_host = BuiltIn().get_variable_value("${OS_HOST}", default="")
113    if os_username == "":
114        os_username = BuiltIn().get_variable_value("${OS_USERNAME}", default="")
115    if os_password == "":
116        os_password = BuiltIn().get_variable_value("${OS_PASSWORD}", default="")
117
118    if not gv.valid_value(os_host):
119        return "", "", 1
120    if not gv.valid_value(os_username):
121        return "", "", 1
122    if not gv.valid_value(os_password):
123        return "", "", 1
124
125    open_connection_args = {'host': os_host, 'alias': 'os_connection'}
126    login_args = {'username': os_username, 'password': os_password}
127
128    return grs.execute_ssh_command(cmd_buf, open_connection_args, login_args,
129                                   print_out, print_err, ignore_err, fork,
130                                   quiet, test_mode, time_out)
131
132
133def xcat_execute_command(cmd_buf,
134                         print_out=0,
135                         print_err=0,
136                         ignore_err=0,
137                         fork=0,
138                         quiet=None,
139                         test_mode=None):
140    r"""
141    Run the given command in an XCAT SSH session and return the stdout, stderr and the return code.
142
143    This function will obtain the global values for XCAT_HOST, XCAT_USERNAME, etc.
144
145    Description of arguments:
146    cmd_buf                         The command string to be run in an SSH session.
147    print_out                       If this is set, this function will print the stdout/stderr generated by
148                                    the shell command.
149    print_err                       If show_err is set, this function will print a standardized error report
150                                    if the shell command returns non-zero.
151    ignore_err                      Indicates that errors encountered on the sshlib.execute_command are to be
152                                    ignored.
153    fork                            Indicates that sshlib.start is to be used rather than
154                                    sshlib.execute_command.
155    quiet                           Indicates whether this function should run the pissuing() function prints
156                                    an "Issuing: <cmd string>" to stdout.  This defaults to the global quiet
157                                    value.
158    test_mode                       If test_mode is set, this function will not actually run the command.
159                                    This defaults to the global test_mode value.
160    """
161
162    # Get global XCAT variable values.
163    xcat_host = BuiltIn().get_variable_value("${XCAT_HOST}", default="")
164    xcat_username = BuiltIn().get_variable_value("${XCAT_USERNAME}",
165                                                 default="")
166    xcat_password = BuiltIn().get_variable_value("${XCAT_PASSWORD}",
167                                                 default="")
168    xcat_port = BuiltIn().get_variable_value("${XCAT_PORT}",
169                                             default="22")
170
171    if not gv.valid_value(xcat_host):
172        return "", "", 1
173    if not gv.valid_value(xcat_username):
174        return "", "", 1
175    if not gv.valid_value(xcat_password):
176        return "", "", 1
177    if not gv.valid_value(xcat_port):
178        return "", "", 1
179
180    open_connection_args = {'host': xcat_host, 'alias': 'xcat_connection',
181                            'port': xcat_port}
182    login_args = {'username': xcat_username, 'password': xcat_password}
183
184    return grs.execute_ssh_command(cmd_buf, open_connection_args, login_args,
185                                   print_out, print_err, ignore_err, fork,
186                                   quiet, test_mode)
187
188
189def device_write(cmd_buf,
190                 print_out=0,
191                 quiet=None,
192                 test_mode=None):
193    r"""
194    Write the given command in a device SSH session and return the stdout, stderr and the return code.
195
196    This function is useful for writing to a switch.
197
198    This function will obtain the global values for DEVICE_HOST, DEVICE_USERNAME, etc.
199
200    Description of arguments:
201    cmd_buf                         The command string to be run in an SSH session.
202    print_out                       If this is set, this function will print the stdout/stderr generated by
203                                    the shell command.
204    print_err                       If show_err is set, this function will print a standardized error report
205                                    if the shell command returns non-zero.
206    ignore_err                      Indicates that errors encountered on the sshlib.execute_command are to be
207                                    ignored.
208    fork                            Indicates that sshlib.start is to be used rather than
209                                    sshlib.execute_command.
210    quiet                           Indicates whether this function should run the pissuing() function prints
211                                    an "Issuing: <cmd string>" to stdout.  This defaults to the global quiet
212                                    value.
213    test_mode                       If test_mode is set, this function will not actually run the command.
214                                    This defaults to the global test_mode value.
215    """
216
217    # Get global DEVICE variable values.
218    device_host = BuiltIn().get_variable_value("${DEVICE_HOST}", default="")
219    device_username = BuiltIn().get_variable_value("${DEVICE_USERNAME}",
220                                                   default="")
221    device_password = BuiltIn().get_variable_value("${DEVICE_PASSWORD}",
222                                                   default="")
223    device_port = BuiltIn().get_variable_value("${DEVICE_PORT}",
224                                               default="22")
225
226    if not gv.valid_value(device_host):
227        return "", "", 1
228    if not gv.valid_value(device_username):
229        return "", "", 1
230    if not gv.valid_value(device_password):
231        return "", "", 1
232    if not gv.valid_value(device_port):
233        return "", "", 1
234
235    open_connection_args = {'host': device_host, 'alias': 'device_connection',
236                            'port': device_port}
237    login_args = {'username': device_username, 'password': device_password}
238
239    return grs.execute_ssh_command(cmd_buf, open_connection_args, login_args,
240                                   print_out, print_err=0, ignore_err=1,
241                                   fork=0, quiet=quiet, test_mode=test_mode)
242