def install_os_pkg()

in infrastructure-provisioning/src/general/lib/os/redhat/notebook_lib.py [0:0]


def install_os_pkg(requisites):
    status = list()
    error_parser = "Could not|No matching|Error:|failed|Requires:|Errno"
    new_pkgs_parser = "Dependency Installed:"
    try:
        print("Updating repositories and installing requested tools: {}".format(requisites))
        manage_pkg('update-minimal --security -y --skip-broken', 'remote', '')
        #datalab.fab.conn.sudo('export LC_ALL=C')
        for os_pkg in requisites:
            name, vers = os_pkg
            if vers != '' and vers !='N/A':
                version = vers
                os_pkg = "{}-{}".format(name, vers)
            else:
                version = 'N/A'
                os_pkg = name
            manage_pkg('-y install', 'remote', '{0} --nogpgcheck 2>&1 | tee /tmp/os_install_{2}.tmp; if ! grep -w -E  "({1})" '
                                               '/tmp/os_install_{2}.tmp >  /tmp/os_install_{2}.log; then  echo "no_error" > /tmp/os_install_{2}.log;fi'.format(os_pkg, error_parser, name))
            install_output = datalab.fab.conn.sudo('cat /tmp/os_install_{}.tmp'.format(name)).stdout
            err = datalab.fab.conn.sudo('cat /tmp/os_install_{}.log'.format(name)).stdout.replace('"', "'")
            datalab.fab.conn.sudo('cat /tmp/os_install_{0}.tmp | if ! grep -w -E -A 30 "({1})" /tmp/os_install_{0}.tmp > '
                 '/tmp/os_install_{0}.log; then echo "no_dependencies" > /tmp/os_install_{0}.log;fi'.format(name, new_pkgs_parser))
            dep = datalab.fab.conn.sudo('cat /tmp/os_install_{}.log'.format(name)).stdout
            if 'no_dependencies' in dep:
                dep = []
            else:
                dep = dep[len(new_pkgs_parser): dep.find("Complete!") - 1].replace('  ', '').strip().split('\r\n')
                for n, i in enumerate(dep):
                    i = i.split('.')[0]
                    datalab.fab.conn.sudo('yum info {0} 2>&1 | if ! grep Version > /tmp/os_install_{0}.log; then echo "" > /tmp/os_install_{0}.log;fi'.format(i))
                    dep[n] =sudo('cat /tmp/os_install_{}.log'.format(i)).replace('Version     : ', '{} v.'.format(i))
                dep = [i for i in dep if i]
            versions = []
            datalab.fab.conn.sudo(
                'yum list installed | if ! grep "{0}\." > /tmp/os_install_{0}.list; then echo "not_installed" > /tmp/os_install_{0}.list;fi'.format(
                    name))
            res = datalab.fab.conn.sudo('cat /tmp/os_install_{}.list '.format(name) + '| awk \'{print $1":"$2}\'').stdout.replace('\n', '')
            #res = datalab.fab.conn.sudo('python3 -c "import os,sys,yum; yb = yum.YumBase(); pl = yb.doPackageLists(); print [pkg.vr for pkg in pl.installed if pkg.name == \'{0}\']"'.format(name)).stdout.split('\r\n')[1]
            if "no_error" not in err:
                status_msg = 'installation_error'
            elif "not_installed" not in res:
                version = res.split(":")[1]
                status_msg = "installed"
            if 'No package {} available'.format(os_pkg) in install_output:
                versions = datalab.fab.conn.sudo('yum --showduplicates list ' + name + ' | expand | grep ' + name + ' | awk \'{print $2}\'').stdout.replace('\r\n', '')
                if versions and versions != 'Error: No matching Packages to list':
                    versions = versions.split(' ')
                    status_msg = 'invalid_version'
                    for n, i in enumerate(versions):
                        if ':' in i:
                            versions[n] = i.split(':')[1].split('-')[0]
                        else:
                            versions[n] = i.split('-')[0]
                else:
                    versions = []
                    status_msg = 'invalid_name'
            status.append({"group": "os_pkg", "name": name, "version": version, "status": status_msg,
                           "error_message": err, "add_pkgs": dep, "available_versions": versions})
        datalab.fab.conn.sudo('rm /tmp/*{}*'.format(name))
        return status
    except Exception as err:
        for os_pkg in requisites:
            name, vers = os_pkg
            status.append(
                {"group": "os_pkg", "name": name, "version": vers, "status": 'installation_error', "error_message": err})
        print("Failed to install OS packages: {}".format(requisites))
        return status