summaryrefslogtreecommitdiff
path: root/instances.py
blob: 6f97563c07af70a71b692c0cd67ccdd1caab78e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# importing the global modules
import pexpect
import os
import os.path
import re
import time
import sys
import psutil
import requests
import urllib.request
import base64
import simplejson as json

from datetime import datetime
from django.template.loader import render_to_string, get_template
from django.core.mail import EmailMultiAlternatives
# importing the local variables
from R_on_Cloud.settings import PROJECT_DIR
from R_on_Cloud.config import (BIN, API_URL, TEMP_DIR)


def execute_code(code, user_id, R_file_id):
    # Check for system commands

    system_commands = re.compile(
        r'unix\(.*\)|unix_g\(.*\)|unix_w\(.*\)|'
        r'unix_x\(.*\)|unix_s\(.*\)|host|newfun'
        r'|execstr|ascii|mputl|dir\(\)|'
        r'system\(.*\)|system.call\(.*\)'
    )
    if system_commands.search(code):
        return {
            'output': 'System Commands are not allowed',
        }

    code = re.sub(r"View\(", "print(", code)

    body = {
        'code': code,
        'user_id': user_id,
        'R_file_id': R_file_id,
    }
    headers = {
        "Content-Type": "application/json",
        "Accept": "application/json",
    }
    jsondata = json.dumps(body)
    if not os.path.exists(TEMP_DIR):
        os.makedirs(TEMP_DIR)
    result = requests.post(API_URL, json=jsondata, headers=headers)
    output = result.json()
    output_data = json.loads(json.dumps(output['data']))
    output_error = json.loads(json.dumps(output['error']))
    plot_exist = json.loads(json.dumps(output['is_plot']))
    plot_path_req = json.loads(json.dumps(output['plot_path_req']))

    data = {
        'output': output_data,
        'error': output_error,
        'plot_exist': plot_exist,
        'plot_path': plot_path_req,
    }
    return data


def trim(output):
    output = [line for line in output.split('\n') if line.strip() != '']
    output = '\n'.join(output)
    return output