| #!/usr/bin/env python | 
 |  | 
 | import gen_print as gp | 
 | import gen_cmd as gc | 
 | import collections | 
 |  | 
 | module_names = ['Selenium2Library', 'SeleniumLibrary', 'SSHLibrary', 'requests', | 
 |                 'XvfbRobot', 'robotremoteserver', 'redfish'] | 
 |  | 
 | import_versions = collections.OrderedDict() | 
 |  | 
 | for module_name in module_names: | 
 |     try: | 
 |         cmd_buf = "import " + module_name | 
 |         exec(cmd_buf) | 
 |         cmd_buf = "import_versions['" + module_name + "'] = " + module_name \ | 
 |                   + ".__version__" | 
 |         exec(cmd_buf) | 
 |     except ImportError: | 
 |         import_versions[module_name] = "Not installed" | 
 |  | 
 |  | 
 | def software_versions(): | 
 |     r""" | 
 |     Get the versions for several of the software packages used by | 
 |     openbmc-test-automation and return as a dictionary. | 
 |  | 
 |     Example call: | 
 |     ${software_versions}=  Software Versions | 
 |     Rprint Vars  software_versions | 
 |  | 
 |     Example output: | 
 |     software_versions: | 
 |       [python]:                                       Python 2.7.12 | 
 |       [robot]:                                        Robot Framework 3.1.2 (Python 3.6.8 on linux) | 
 |       [firefox]:                                      Mozilla Firefox 54.0 | 
 |       [google-chrome]:                                Not installed | 
 |       [Selenium2Library]:                             3.0.0 | 
 |       [SeleniumLibrary]:                              3.3.1 | 
 |       [SSHLibrary]:                                   3.3.0 | 
 |       [requests]:                                     2.22.0 | 
 |       [XvfbRobot]:                                    1.2.2 | 
 |       [robotremoteserver]:                            1.1 | 
 |       [redfish]:                                      2.1.1 | 
 |       [robotframework-angularjs]:                     0.0.10 | 
 |       [robotframework-scplibrary]:                    1.2.0 | 
 |       [robotframework-extendedselenium2library]:      0.9.1 | 
 |       [host OS]:                                      Ubuntu 16.04.6 LTS | 
 |     """ | 
 |  | 
 |     quiet = 1 | 
 |     versions = collections.OrderedDict() | 
 |     for package in ['python', 'robot', 'firefox', 'google-chrome']: | 
 |         # Note: "robot --version" returns 0x00000000000000fb. | 
 |         # Note: If package does not exist, 0x7f is returned. | 
 |         rc, version = gc.shell_cmd(package + " --version", | 
 |                                    valid_rcs=[0, 0x7f, 0xfb]) | 
 |         versions[package] = "Not installed" if rc == 0x7f else version.rstrip('\n') | 
 |  | 
 |     versions.update(import_versions) | 
 |  | 
 |     for package in ['robotframework-angularjs', 'robotframework-scplibrary', | 
 |                     'robotframework-extendedselenium2library']: | 
 |         rc, version = gc.shell_cmd("pip show " + package | 
 |                                    + " | grep Version | sed -re 's/.*: //g'") | 
 |         versions[package] = "Not installed" if not version else version.rstrip('\n') | 
 |  | 
 |     rc, version = gc.shell_cmd("lsb_release -d -s") | 
 |     versions["host OS"] = "Failed" if not version else version.rstrip('\n') | 
 |     return versions |