def install_r_pkg()

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


def install_r_pkg(requisites):
    status = list()
    error_parser = "ERROR:|error:|Cannot|failed|Please run|requires|Error|Skipping|couldn't find"
    if os.environ['conf_resource'] == 'dataengine-service':
        ensure_dataengine_service_devtools()
    try:
        for r_pkg in requisites:
            name, vers = r_pkg
            version = vers
            if vers == 'N/A':
                vers = ''
            else:
                vers = '"{}"'.format(vers)
            if name == 'sparklyr':
                conn.run(
                    'sudo -i R -e \'devtools::install_version("{0}", version = {1}, repos = "http://cran.us.r-project.org", '
                    'dependencies = NA)\' 2>&1 | tee /tmp/install_{0}.tmp; if ! grep -w -E  "({2})" /tmp/install_{0}.tmp '
                    '> /tmp/install_{0}.log; then  echo "" > /tmp/install_{0}.log;fi'.format(name, vers, error_parser))
            else:
                conn.sudo(
                    'R -e \'devtools::install_version("{0}", version = {1}, repos = "https://cloud.r-project.org", '
                    'dependencies = NA)\' 2>&1 | tee /tmp/install_{0}.tmp; if ! grep -w -E "({2})" /tmp/install_{0}.tmp > '
                    '/tmp/install_{0}.log; then  echo "" > /tmp/install_{0}.log;fi'.format(name, vers, error_parser))
            dep = conn.sudo('grep "(NA.*->". /tmp/install_' + name + '.tmp | awk \'{print $1}\'').stdout.replace('\n',
                                                                                                                 ' ')
            dep_ver = conn.sudo('grep "(NA.*->". /tmp/install_' + name + '.tmp | awk \'{print $4}\'').stdout.replace(
                '\n', ' ').replace(')', '').split(' ')
            if dep == '':
                dep = []
            else:
                dep = dep.split(' ')
                for n, i in enumerate(dep):
                    if i == name:
                        dep[n] = ''
                    else:
                        dep[n] = '{} v.{}'.format(dep[n], dep_ver[n])
                dep = [i for i in dep if i]
            conn.sudo('hostname')
            err = conn.sudo('cat /tmp/install_{0}.log'.format(name)).stdout.replace('"', "'").replace('\n', '')
            conn.sudo(
                'R -e \'installed.packages()[,c(3:4)]\' | if ! grep -w {0} > /tmp/install_{0}.list; then  echo "" > /tmp/install_{0}.list;fi'.format(
                    name))
            res = conn.sudo('cat /tmp/install_{0}.list'.format(name)).stdout.replace('\n', '')
            if err:
                status_msg = 'installation_error'
                if 'couldn\'t find package \'{}\''.format(name) in err:
                    status_msg = 'invalid_name'
            elif res:
                ansi_escape = re.compile(r'\x1b[^m]*m')
                version = ansi_escape.sub('', res).split("\n")[0].split('"')[1]
                status_msg = 'installed'
            if 'Error in download_version_url(package, version, repos, type) :' in err or 'Error in parse_deps(paste(spec,' in err:
                conn.sudo('R -e \'install.packages("versions", repos="https://cloud.r-project.org", dep=TRUE)\'')
                versions = conn.sudo('R -e \'library(versions); available.versions("' + name + '")\' 2>&1 | grep -A 50 '
                                                                                               '\'date available\' | awk \'{print $2}\'').stdout.strip().replace(
                    '\n', ' ')[5:].split(' ')
                if versions != ['']:
                    status_msg = 'invalid_version'
                else:
                    versions = []
            else:
                versions = []
            status.append(
                {"group": "r_pkg", "name": name, "version": version, "status": status_msg, "error_message": err,
                 "available_versions": versions, "add_pkgs": dep})
        conn.sudo('rm /tmp/*{}*'.format(name))
        return status
    except Exception as err:
        for r_pkg in requisites:
            name, vers = r_pkg
            status.append(
                {"group": "r_pkg", "name": name, "version": vers, "status": 'installation_error', "error_message": err})
        logging.error("Failed to install R packages:", err)
        traceback.print_exc()
        return status