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