diff --git a/fri/Dockerfile b/fri/Dockerfile
new file mode 100644
index 0000000..ad37113
--- /dev/null
+++ b/fri/Dockerfile
@@ -0,0 +1,9 @@
+FROM centos/python-36-centos7
+COPY requirements.txt /tmp/requirements.txt
+RUN pip install -r /tmp/requirements.txt
+WORKDIR /fri
+COPY server /fri
+USER root
+RUN useradd fri && chown -R fri /fri
+USER fri
+CMD ["gunicorn", "--timeout=180", "--workers=4", "--bind=0.0.0.0:8080", "--access-logfile=-", "main:app"]
\ No newline at end of file
diff --git a/fri/README.md b/fri/README.md
new file mode 100644
index 0000000..e0bae61
--- /dev/null
+++ b/fri/README.md
@@ -0,0 +1,133 @@
+# The Control-Core FRI for Closed-Loop Neuromodulation Control Systems
+
+The Control-Core File Receiving Interface (FRI) is built with is Python-3.10. It is the core component that makes the distributed executions a reality in the Control-Core framework.
+
+
+# Building FRI Container
+
+Connect to the Server VM, assuming x.x.x.x to be the IP address of your server.
+````
+$ ssh -i "controlcore.pem" ubuntu@x.x.x.x
+````
+Perform Git clone if this is the first time you are configuring the Server
+````
+$ git clone git@github.com/ControlCore-Project/concore.git
+````
+
+First build the Docker Container of the FRI.
+````
+$ git pull
+
+$ sudo docker build -t fri .
+````
+
+# Running Control-Core FRI with Kong as containers
+
+If you are already running FRI, make sure to stop and clear existing FRI container as it is likely conflict with the port. If there is Kong gateway running in default ports, stop and clear it too.
+````
+$ docker stop fri
+$ docker rm fri
+$ docker stop kong
+$ docker rm kong
+````
+
+Start and configure Cassandra container for Kong API.
+````
+$ docker run -d --name kong-database \
+ -p 9042:9042 \
+ cassandra:3
+
+
+$ docker run --rm \
+ --link kong-database:kong-database \
+ -e "KONG_DATABASE=cassandra" \
+ -e "KONG_PG_HOST=kong-database" \
+ -e "KONG_PG_USER=kong" \
+ -e "KONG_PG_PASSWORD=kong" \
+ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
+ kong kong migrations bootstrap
+````
+
+Start Kong
+````
+$ docker run -d --name kong \
+ --link kong-database:kong-database \
+ -e "KONG_DATABASE=cassandra" \
+ -e "KONG_PG_HOST=kong-database" \
+ -e "KONG_PG_PASSWORD=kong" \
+ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
+ -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
+ -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
+ -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
+ -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
+ -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
+ -p 80:8000 \
+ -p 8443:8443 \
+ -p 8001:8001 \
+ -p 8444:8444 \
+ kong
+````
+
+Start FRI container
+````
+$ nohup sudo docker run --name fri -p 8090:8081 fri > controlcore.out &
+````
+
+Delete if there is a previously configured Kong service. If not, skip this step. First you need to find the ID-VALUE for the route with a GET command before deleting the route and service.
+````
+$ curl -X GET "http://localhost:8001/services/fri/routes"
+````
+Use the ID output from above to issue the delete command as below (issue this only if you have a previous conflicting service definiton in kong. Otherwise, skip this step):
+````
+$ curl -X DELETE "http://localhost:8001/services/fri/routes/ID-VALUE"
+
+$ curl -X DELETE "http://localhost:8001/services/fri/"
+````
+
+Define Kong Service and Route.
+
+First Configure a Kong service, replacing the variable "private-ip" with the private IP address of your server below.
+````
+$ curl -i -X POST --url http://localhost:8001/services/ --data 'name=fri' --data 'url=http://private-ip:8090'
+````
+Then configure route to the service
+````
+$ curl -i -X POST --url http://localhost:8001/services/fri/routes --data 'paths=/'
+````
+
+Now, controlcore.org is routed through the Kong APIs.
+
+
+# Troubleshooting the FRI
+
+Connect to the Server VM
+````
+$ ssh -i "controlcore.pem" ubuntu@x.x.x.x
+````
+Check the Server logs.
+````
+$ tail -f controlcore.out
+````
+or
+````
+$ sudo docker logs fri -f
+````
+Find the FRI docker container
+````
+$ sudo docker ps
+````
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+dfdd3b3d3308 fri "python main.py" 38 minutes ago Up 38 minutes 0.0.0.0:80->80/tcp fri
+
+Access the container
+````
+$ sudo docker exec -it dfdd /bin/bash
+````
+
+
+
+# Citing the CONTROL-CORE FRI
+
+If you use the CONTROL-CORE FRI in your research, please cite the below paper:
+
+* Kathiravelu, P., Arnold, M., Fleischer, J., Yao, Y., Awasthi, S., Goel, A. K., Branen, A., Sarikhani, P., Kumar, G., Kothare, M. V., and Mahmoudi, B. **CONTROL-CORE: A Framework for Simulation and Design of Closed-Loop Peripheral Neuromodulation Control Systems**. In IEEE Access. March 2022. https://doi.org/10.1109/ACCESS.2022.3161471
diff --git a/fri/example.py b/fri/example.py
new file mode 100644
index 0000000..e78d17c
--- /dev/null
+++ b/fri/example.py
@@ -0,0 +1 @@
+print("Concore/fri")
\ No newline at end of file
diff --git a/fri/requirements.txt b/fri/requirements.txt
new file mode 100644
index 0000000..82d3ede
--- /dev/null
+++ b/fri/requirements.txt
@@ -0,0 +1,2 @@
+Flask
+gunicorn==20.1.0
\ No newline at end of file
diff --git a/fri/server/main.py b/fri/server/main.py
new file mode 100644
index 0000000..27519da
--- /dev/null
+++ b/fri/server/main.py
@@ -0,0 +1,164 @@
+from flask import Flask, request, jsonify, send_file, send_from_directory
+from werkzeug.utils import secure_filename
+import os
+from subprocess import call
+from pathlib import Path
+
+
+app = Flask(__name__)
+app.secret_key = "secret key"
+
+# To upload multiple file. For example, /upload/test?apikey=xyz
+@app.route('/upload/
', methods=['POST'])
+def upload(dir):
+ apikey = request.args.get('apikey')
+ dirname = dir + "_" + apikey
+
+ if 'files[]' not in request.files:
+ resp = jsonify({'message': 'No file in the request'})
+ resp.status_code = 400
+ return resp
+
+ files = request.files.getlist('files[]')
+
+ errors = {}
+ success = False
+
+ if not os.path.exists(secure_filename(dirname)):
+ os.makedirs(secure_filename(dirname))
+
+ for file in files:
+ if file:
+ filename = secure_filename(file.filename)
+ file.save(secure_filename(dirname)+"/"+filename)
+ success = True
+
+ if success and errors:
+ errors['message'] = 'File(s) successfully uploaded'
+ resp = jsonify(errors)
+ resp.status_code = 500
+ return resp
+ if success:
+ resp = jsonify({'message': 'Files successfully uploaded'})
+ resp.status_code = 201
+ return resp
+ else:
+ resp = jsonify(errors)
+ resp.status_code = 500
+ return resp
+
+# To execute any python file. For example, /execute/test?apikey=xyz
+@app.route('/execute/', methods=['POST'])
+def execute(dir):
+ apikey = request.args.get('apikey')
+ dirname = dir + "_" + apikey
+
+ if 'file' not in request.files:
+ resp = jsonify({'message': 'No file in the request'})
+ resp.status_code = 400
+ return resp
+
+ file = request.files['file']
+
+ if file.filename == '':
+ resp = jsonify({'message': 'No file selected for Executing'})
+ resp.status_code = 400
+ return resp
+
+ errors = {}
+ success = False
+
+ if not os.path.exists(secure_filename(dirname)):
+ os.makedirs(secure_filename(dirname))
+
+ if file:
+ filename = secure_filename(file.filename)
+ file.save(secure_filename(dirname)+"/"+filename)
+ output_filename = filename + ".out"
+ file_path = secure_filename(dirname) + "/"+filename
+ outputfile_path = secure_filename(dirname)+"/"+output_filename
+ f = open(outputfile_path, "w")
+ call(["nohup", "python3", file_path], stdout=f)
+ success = True
+
+ if success:
+ resp = jsonify({'message': 'Files successfully executed'})
+ resp.status_code = 201
+ return resp
+ else:
+ resp = jsonify(errors)
+ resp.status_code = 500
+ return resp
+
+# to download /build/?fetch=. For example, /build/test?fetch=sample1
+@app.route('/build/', methods=['POST'])
+def build(dir):
+ graphml_file = request.args.get('fetch')
+ makestudy_dir = dir+ "/" + graphml_file #for makestudy
+ cur_path = os.getcwd()
+ concore_path = os.path.abspath(os.path.join(cur_path, '../../'))
+ dir_path = os.path.abspath(os.path.join(concore_path, graphml_file)) #path for ./build
+ if not os.path.exists(secure_filename(dir_path)):
+ p1 = call(["./makestudy", makestudy_dir], cwd=concore_path)
+ if(p1 == 0):
+ resp = jsonify({'message': 'Directory successfully created'})
+ resp.status_code = 201
+ else:
+ resp = jsonify({'message': 'There is an Error'})
+ resp.status_code = 500
+ call(["./build"], cwd=dir_path)
+ return resp
+
+
+@app.route('/debug/', methods=['POST'])
+def debug(dir):
+ cur_path = os.getcwd()
+ concore_path = os.path.abspath(os.path.join(cur_path, '../../'))
+ dir_path = os.path.abspath(os.path.join(concore_path, dir))
+ p1 = call(["./debug"], cwd=dir_path)
+ if(p1 == 0):
+ resp = jsonify({'message': 'Close the pop window after obtaing result'})
+ resp.status_code = 201
+ return resp
+ else:
+ resp = jsonify({'message': 'There is an Error'})
+ resp.status_code = 500
+ return resp
+
+
+
+# to download /download/?fetch=. For example, /download/test?fetch=example.py.out&apikey=xyz
+@app.route('/download/', methods=['POST', 'GET'])
+def download(dir):
+ download_file = request.args.get('fetch')
+ apikey = request.args.get('apikey')
+ dirname = dir + "_" + apikey
+
+ if not os.path.exists(secure_filename(dirname)):
+ resp = jsonify({'message': 'Directory not found'})
+ resp.status_code = 400
+ return resp
+
+ try:
+ return send_from_directory(secure_filename(dirname), download_file, as_attachment=True)
+ except:
+ resp = jsonify({'message': 'file not found'})
+ resp.status_code = 400
+ return resp
+
+@app.route('/destroy/', methods=['POST'])
+def destroy(dir):
+ cur_path = os.getcwd()
+ concore_path = os.path.abspath(os.path.join(cur_path, '../../'))
+ p1 = call(["./destroy", dir], cwd=concore_path)
+ if(p1 == 0):
+ resp = jsonify({'message': 'Successfuly deleted Dirctory'})
+ resp.status_code = 201
+ return resp
+ else:
+ resp = jsonify({'message': 'There is an Error'})
+ resp.status_code = 500
+ return resp
+
+if __name__ == "__main__":
+ app.run(host="0.0.0.0")
diff --git a/fri/service_config.sh b/fri/service_config.sh
new file mode 100644
index 0000000..7be2144
--- /dev/null
+++ b/fri/service_config.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+SERVICES=('upload' 'execute' 'download')
+for service in "${SERVICES[@]}"
+do
+ name="name="$service
+ path="paths=/"$service
+ service_path="url=http://private-ip:8090/"$service
+ route_path="http://localhost:8001/services/"$service"/routes"
+ plugin_path="http://localhost:8001/services/"$service"/plugins"
+ echo "Name is, $name"
+ echo "Path is, $path"
+ echo "Service path is, $service_path"
+ echo "Route path is, $route_path"
+ echo "Plugin path is, $plugin_path"
+ echo "Creating Service, $service..."
+ curl -i -X POST --url http://localhost:8001/services/ --data $name --data $service_path
+ echo "Creating route for $service..."
+ curl -i -X POST --url $route_path --data $path
+ echo "Creating apikey-based authentication for $service..."
+ curl -X POST $plugin_path --data "name=key-auth" --data "config.key_names=apikey"
+done
\ No newline at end of file
diff --git a/fri/test.py b/fri/test.py
new file mode 100644
index 0000000..4717aea
--- /dev/null
+++ b/fri/test.py
@@ -0,0 +1,48 @@
+import requests
+import os
+import urllib.request
+
+# function to test upload() method.
+def upload():
+ url = "http://127.0.0.1:5000/upload/test?apikey=xyz"
+
+ path = os.path.abspath("example.py")
+
+ payload={}
+ files=[
+ ('files[]',('example.py',open(path,'rb'),'application/octet-stream'))
+ ]
+ headers = {}
+
+ response = requests.request("POST", url, headers=headers, data=payload, files=files)
+
+ print(response.text)
+
+
+# # *******
+
+# function to test execute() method.
+def execute():
+ url = "http://127.0.0.1:5000/execute/test?apikey=xyz"
+
+ path = os.path.abspath("example.py")
+
+ payload={}
+ files=[
+ ('file',('example.py',open(path,'rb'),'application/octet-stream'))
+ ]
+ headers = {}
+
+ response = requests.request("POST", url, headers=headers, data=payload, files=files)
+
+ print(response.text)
+
+# function to test download() method.
+def download():
+ url = "http://127.0.0.1:5000/download/test?fetch=f1.txt&apikey=xyz"
+ urllib.request.urlretrieve(url, "f1.txt")
+
+upload()
+execute()
+download()
+
diff --git a/mkconcore.py b/mkconcore.py
index 40aa885..302e600 100644
--- a/mkconcore.py
+++ b/mkconcore.py
@@ -10,11 +10,11 @@
GRAPHML_FILE = sys.argv[1]
TRIMMED_LOGS = True
CONCOREPATH = "."
-CPPWIN = "g++" #Windows C++ 6/22/21
-CPPEXE = "g++" #Ubuntu/macOS C++ 6/22/21
-VWIN = "iverilog" #Windows verilog 6/25/21
-VEXE = "iverilog" #Ubuntu/macOS verilog 6/25/21
-CPPEXE = "g++" #Ubuntu/macOS C++ 6/22/21
+CPPWIN = "g++" #Windows C++ 6/22/21
+CPPEXE = "g++" #Ubuntu/macOS C++ 6/22/21
+VWIN = "iverilog" #Windows verilog 6/25/21
+VEXE = "iverilog" #Ubuntu/macOS verilog 6/25/21
+CPPEXE = "g++" #Ubuntu/macOS C++ 6/22/21
PYTHONEXE = "python3" #Ubuntu/macOS python 3
PYTHONWIN = "python" #Windows python 3
MATLABEXE = "matlab" #Ubuntu/macOS matlab
@@ -22,26 +22,26 @@
OCTAVEEXE = "octave" #Ubuntu/macOS octave
OCTAVEWIN = "octave" #Windows octave
M_IS_OCTAVE = False #treat .m as octave
-MCRPATH = "~/MATLAB/R2021a" #path to local Ubunta Matlab Compiler Runtime
+MCRPATH = "~/MATLAB/R2021a" #path to local Ubunta Matlab Compiler Runtime
DOCKEREXE = "sudo docker"#assume simple docker install
DOCKEREPO = "markgarnold"#where pulls come from 3/28/21
INDIRNAME = ":/in"
OUTDIRNAME = ":/out"
-
-if os.path.exists(CONCOREPATH+"/concore.octave"):
- M_IS_OCTAVE = True #treat .m as octave 9/27/21
-
-if os.path.exists(CONCOREPATH+"/concore.mcr"): # 11/12/21
- MCRPATH = open(CONCOREPATH+"/concore.mcr", "r").readline().strip() #path to local Ubunta Matlab Compiler Runtime
-
-if os.path.exists(CONCOREPATH+"/concore.sudo"): # 12/04/21
- DOCKEREXE = open(CONCOREPATH+"/concore.sudo", "r").readline().strip() #to omit sudo in docker
-
-if os.path.exists(CONCOREPATH+"/concore.repo"): # 12/04/21
- DOCKEREPO = open(CONCOREPATH+"/concore.repo", "r").readline().strip() #docker id for repo
-
-
+
+if os.path.exists(CONCOREPATH+"/concore.octave"):
+ M_IS_OCTAVE = True #treat .m as octave 9/27/21
+
+if os.path.exists(CONCOREPATH+"/concore.mcr"): # 11/12/21
+ MCRPATH = open(CONCOREPATH+"/concore.mcr", "r").readline().strip() #path to local Ubunta Matlab Compiler Runtime
+
+if os.path.exists(CONCOREPATH+"/concore.sudo"): # 12/04/21
+ DOCKEREXE = open(CONCOREPATH+"/concore.sudo", "r").readline().strip() #to omit sudo in docker
+
+if os.path.exists(CONCOREPATH+"/concore.repo"): # 12/04/21
+ DOCKEREPO = open(CONCOREPATH+"/concore.repo", "r").readline().strip() #docker id for repo
+
+
prefixedgenode = ""
sourcedir = sys.argv[2]
outdir = sys.argv[3]
@@ -61,13 +61,13 @@
if not (concoretype in ["posix","windows","docker","macos","ubuntu"]):
print(" type must be posix (macos or ubuntu), windows, or docker")
quit()
-ubuntu = False #6/24/21
-if concoretype == "ubuntu":
- concoretype = "posix"
- ubuntu = True
-if concoretype == "macos":
- concoretype = "posix"
-
+ubuntu = False #6/24/21
+if concoretype == "ubuntu":
+ concoretype = "posix"
+ ubuntu = True
+if concoretype == "macos":
+ concoretype = "posix"
+
if os.path.exists(outdir):
print(outdir+" already exists")
print("if intended, remove or rename "+outdir+" first")
@@ -82,16 +82,16 @@
fdebug = open("debug.bat", "w")
fstop = open("stop.bat", "w") #3/27/21
fclear = open("clear.bat", "w")
- fmaxtime = open("maxtime.bat", "w") # 9/12/21
- funlock = open("unlock.bat", "w") # 12/4/21
+ fmaxtime = open("maxtime.bat", "w") # 9/12/21
+ funlock = open("unlock.bat", "w") # 12/4/21
else:
fbuild = open("build","w")
frun = open("run", "w")
fdebug = open("debug", "w")
fstop = open("stop", "w") #3/27/21
fclear = open("clear", "w")
- fmaxtime = open("maxtime", "w") # 9/12/21
- funlock = open("unlock", "w") # 12/4/21
+ fmaxtime = open("maxtime", "w") # 9/12/21
+ funlock = open("unlock", "w") # 12/4/21
os.mkdir("src")
os.chdir("..")
@@ -101,9 +101,9 @@
print("source directory: "+sourcedir)
print("output directory: "+outdir)
print("control core type: "+concoretype)
-print("treat .m as octave:"+str(M_IS_OCTAVE))
-print("MCR path: "+MCRPATH)
-print("Docker repository: "+DOCKEREPO)
+print("treat .m as octave:"+str(M_IS_OCTAVE))
+print("MCR path: "+MCRPATH)
+print("Docker repository: "+DOCKEREPO)
# Output in a preferred format.
if TRIMMED_LOGS:
@@ -238,7 +238,7 @@
fcopy.write(fsource.read())
fsource.close()
-#copy proper concore.hpp into /src 6/22/21
+#copy proper concore.hpp into /src 6/22/21
try:
if concoretype=="docker":
fsource = open(CONCOREPATH+"/concoredocker.hpp")
@@ -251,7 +251,7 @@
fcopy.write(fsource.read())
fsource.close()
-#copy proper concore.v into /src 6/25/21
+#copy proper concore.v into /src 6/25/21
try:
if concoretype=="docker":
fsource = open(CONCOREPATH+"/concoredocker.v")
@@ -276,7 +276,7 @@
os.chmod(outdir+"/src/mkcompile",stat.S_IRWXU)
#copy concore*.m into /src 4/2/21
-try: #maxtime in matlab 11/22/21
+try: #maxtime in matlab 11/22/21
fsource = open(CONCOREPATH+"/concore_default_maxtime.m")
except:
print(CONCOREPATH+" is not correct path to concore")
@@ -493,85 +493,85 @@
containername,sourcecode = nodes_dict[node].split(':')
if len(sourcecode)!=0:
dockername = sourcecode.split(".")[0] #3/28/21
- writeedges = volswr[i]
- while writeedges.find(":") != -1:
+ writeedges = volswr[i]
+ while writeedges.find(":") != -1:
fclear.write(DOCKEREXE+' volume rm ' +writeedges.split(":")[0].split("-v")[1]+"\n")
- writeedges = writeedges[writeedges.find(":")+1:]
+ writeedges = writeedges[writeedges.find(":")+1:]
i=i+1
fclear.close()
-
- fmaxtime.write('echo "$1" >concore.maxtime\n')
- fmaxtime.write('echo "FROM alpine:3.8" > Dockerfile\n')
- fmaxtime.write('sudo docker build -t docker-concore .\n')
- fmaxtime.write('sudo docker run --name=concore')
- # -v VCZ:/VCZ -v VPZ:/VPZ
+
+ fmaxtime.write('echo "$1" >concore.maxtime\n')
+ fmaxtime.write('echo "FROM alpine:3.8" > Dockerfile\n')
+ fmaxtime.write('sudo docker build -t docker-concore .\n')
+ fmaxtime.write('sudo docker run --name=concore')
+ # -v VCZ:/VCZ -v VPZ:/VPZ
i=0 # 9/12/21
for node in nodes_dict:
containername,sourcecode = nodes_dict[node].split(':')
if len(sourcecode)!=0:
dockername = sourcecode.split(".")[0] #3/28/21
- writeedges = volswr[i]
- while writeedges.find(":") != -1:
- fmaxtime.write(' -v ')
+ writeedges = volswr[i]
+ while writeedges.find(":") != -1:
+ fmaxtime.write(' -v ')
fmaxtime.write(writeedges.split(":")[0].split("-v ")[1]+":/")
fmaxtime.write(writeedges.split(":")[0].split("-v ")[1])
- writeedges = writeedges[writeedges.find(":")+1:]
+ writeedges = writeedges[writeedges.find(":")+1:]
i=i+1
- fmaxtime.write(' docker-concore >/dev/null &\n')
- fmaxtime.write('sleep 3\n') # 12/6/21
- fmaxtime.write('echo "copying concore.maxtime=$1"\n')
+ fmaxtime.write(' docker-concore >/dev/null &\n')
+ fmaxtime.write('sleep 3\n') # 12/6/21
+ fmaxtime.write('echo "copying concore.maxtime=$1"\n')
i=0 # 9/12/21
for node in nodes_dict:
containername,sourcecode = nodes_dict[node].split(':')
if len(sourcecode)!=0:
dockername = sourcecode.split(".")[0] #3/28/21
- writeedges = volswr[i]
- while writeedges.find(":") != -1:
- fmaxtime.write('sudo docker cp concore.maxtime concore:/')
+ writeedges = volswr[i]
+ while writeedges.find(":") != -1:
+ fmaxtime.write('sudo docker cp concore.maxtime concore:/')
fmaxtime.write(writeedges.split(":")[0].split("-v ")[1]+"/concore.maxtime\n")
- writeedges = writeedges[writeedges.find(":")+1:]
+ writeedges = writeedges[writeedges.find(":")+1:]
i=i+1
- fmaxtime.write('sudo docker stop concore \n')
- fmaxtime.write('sudo docker rm concore\n')
- fmaxtime.write('sudo docker rmi docker-concore\n')
- fmaxtime.write('rm Dockerfile\n')
- fmaxtime.write('rm concore.maxtime\n')
+ fmaxtime.write('sudo docker stop concore \n')
+ fmaxtime.write('sudo docker rm concore\n')
+ fmaxtime.write('sudo docker rmi docker-concore\n')
+ fmaxtime.write('rm Dockerfile\n')
+ fmaxtime.write('rm concore.maxtime\n')
fmaxtime.close()
- funlock.write('echo "FROM alpine:3.8" > Dockerfile\n')
- funlock.write('sudo docker build -t docker-concore .\n')
- funlock.write('sudo docker run --name=concore')
- # -v VCZ:/VCZ -v VPZ:/VPZ
+ funlock.write('echo "FROM alpine:3.8" > Dockerfile\n')
+ funlock.write('sudo docker build -t docker-concore .\n')
+ funlock.write('sudo docker run --name=concore')
+ # -v VCZ:/VCZ -v VPZ:/VPZ
i=0 # 9/12/21
for node in nodes_dict:
containername,sourcecode = nodes_dict[node].split(':')
if len(sourcecode)!=0:
dockername = sourcecode.split(".")[0] #3/28/21
- writeedges = volswr[i]
- while writeedges.find(":") != -1:
- funlock.write(' -v ')
+ writeedges = volswr[i]
+ while writeedges.find(":") != -1:
+ funlock.write(' -v ')
funlock.write(writeedges.split(":")[0].split("-v ")[1]+":/")
funlock.write(writeedges.split(":")[0].split("-v ")[1])
- writeedges = writeedges[writeedges.find(":")+1:]
+ writeedges = writeedges[writeedges.find(":")+1:]
i=i+1
- funlock.write(' docker-concore >/dev/null &\n')
- funlock.write('sleep 1\n')
- funlock.write('echo "copying concore.apikey"\n')
+ funlock.write(' docker-concore >/dev/null &\n')
+ funlock.write('sleep 1\n')
+ funlock.write('echo "copying concore.apikey"\n')
i=0 # 9/12/21
for node in nodes_dict:
containername,sourcecode = nodes_dict[node].split(':')
if len(sourcecode)!=0:
dockername = sourcecode.split(".")[0] #3/28/21
- writeedges = volswr[i]
- while writeedges.find(":") != -1:
- funlock.write('sudo docker cp ~/concore.apikey concore:/')
+ writeedges = volswr[i]
+ while writeedges.find(":") != -1:
+ funlock.write('sudo docker cp ~/concore.apikey concore:/')
funlock.write(writeedges.split(":")[0].split("-v ")[1]+"/concore.apikey\n")
- writeedges = writeedges[writeedges.find(":")+1:]
+ writeedges = writeedges[writeedges.find(":")+1:]
i=i+1
- funlock.write('sudo docker stop concore \n')
- funlock.write('sudo docker rm concore\n')
- funlock.write('sudo docker rmi docker-concore\n')
- funlock.write('rm Dockerfile\n')
+ funlock.write('sudo docker stop concore \n')
+ funlock.write('sudo docker rm concore\n')
+ funlock.write('sudo docker rmi docker-concore\n')
+ funlock.write('rm Dockerfile\n')
funlock.close()
@@ -595,6 +595,9 @@
#remaining code deals only with posix or windows
#copy sourcefiles from ./src into corresponding directories
+if concoretype=="posix":
+ fbuild.write('#!/bin/bash' + "\n")
+
for node in nodes_dict:
containername,sourcecode = nodes_dict[node].split(':')
if len(sourcecode)!=0:
@@ -607,9 +610,11 @@
fbuild.write("copy .\\src\\"+sourcecode+" .\\"+containername+"\\"+sourcecode+"\n")
if langext == "py":
fbuild.write("copy .\\src\\concore.py .\\" + containername + "\\concore.py\n")
- elif langext == "cpp":
# 6/22/21
+ elif langext == "cpp":
+ # 6/22/21
fbuild.write("copy .\\src\\concore.hpp .\\" + containername + "\\concore.hpp\n")
- elif langext == "v":
# 6/25/21
+ elif langext == "v":
+ # 6/25/21
fbuild.write("copy .\\src\\concore.v .\\" + containername + "\\concore.v\n")
elif langext == "m": # 4/2/21
fbuild.write("copy .\\src\\concore_*.m .\\" + containername + "\\\n")
@@ -676,6 +681,9 @@
i=i+1
#start running source in associated dirs (run and debug scripts)
+if concoretype=="posix":
+ fdebug.write('#!/bin/bash' + "\n")
+
i=0
for node in nodes_dict:
containername,sourcecode = nodes_dict[node].split(':')
@@ -719,54 +727,54 @@
else:
if langext=="py":
frun.write('(cd '+containername+";"+PYTHONEXE+" "+sourcecode+" >concoreout.txt&echo $!>concorepid)&\n")
- if ubuntu:
+ if ubuntu:
fdebug.write('concorewd=`pwd`\n')
fdebug.write('xterm -e bash -c "cd $concorewd/'+containername+";"+PYTHONEXE+" "+sourcecode+';bash"&\n')
- else:
+ else:
fdebug.write('concorewd=`pwd`\n')
fdebug.write('osascript -e "tell application \\"Terminal\\" to do script \\"cd $concorewd/'+containername+";"+PYTHONEXE+" "+sourcecode+'\\""\n')
elif langext=="cpp": # 6/22/21
frun.write('(cd '+containername+";"+CPPEXE+" "+sourcecode+";./a.out >concoreout.txt&echo $!>concorepid)&\n")
- if ubuntu:
+ if ubuntu:
fdebug.write('concorewd=`pwd`\n')
fdebug.write('xterm -e bash -c "cd $concorewd/'+containername+";"+CPPEXE+" "+sourcecode+';./a.out;bash"&\n')
- else:
+ else:
fdebug.write('concorewd=`pwd`\n')
fdebug.write('osascript -e "tell application \\"Terminal\\" to do script \\"cd $concorewd/'+containername+";"+CPPEXE+" "+sourcecode+';./a.out\\""\n')
elif langext=="v": # 6/25/21
frun.write('(cd '+containername+";"+VEXE+" "+sourcecode+";./a.out >concoreout.txt&echo $!>concorepid)&\n")
- if ubuntu:
+ if ubuntu:
fdebug.write('concorewd=`pwd`\n')
fdebug.write('xterm -e bash -c "cd $concorewd/'+containername+";"+VEXE+" "+sourcecode+';./a.out;bash"&\n')
- else:
+ else:
fdebug.write('concorewd=`pwd`\n')
fdebug.write('osascript -e "tell application \\"Terminal\\" to do script \\"cd $concorewd/'+containername+";"+VEXE+" "+sourcecode+';vvp a.out\\""\n')
elif langext=="sh": # 5/19/21
frun.write('(cd '+containername+";./"+sourcecode+" "+ MCRPATH + " >concoreout.txt&echo $!>concorepid)&\n")
- if ubuntu:
+ if ubuntu:
fdebug.write('concorewd=`pwd`\n')
fdebug.write('xterm -e bash -c "cd $concorewd/'+containername+";./"+sourcecode+' '+MCRPATH+';bash"&\n')
- else: # 11/23/21 MCRPATH
+ else: # 11/23/21 MCRPATH
fdebug.write('concorewd=`pwd`\n')
fdebug.write('osascript -e "tell application \\"Terminal\\" to do script \\"cd $concorewd/'+containername+";./"+sourcecode+' '+MCRPATH+'\\""\n')
elif langext=="m": #3/23/21
if M_IS_OCTAVE:
frun.write('(cd '+containername+";"+ OCTAVEEXE+' -qf --eval run\\(\\'+"'"+sourcecode+"\\'"+'\\)'+" >concoreout.txt&echo $!>concorepid)&\n")
- if ubuntu:
+ if ubuntu:
fdebug.write('concorewd=`pwd`\n')
fdebug.write('xterm -e bash -c "cd $concorewd/'+containername+";"+OCTAVEEXE+' -qf --eval run\\(\\'+"'"+sourcecode+"\\'"+'\\);bash"&'+"\n")
- else:
+ else:
fdebug.write('concorewd=`pwd`\n')
fdebug.write('osascript -e "tell application \\"Terminal\\" to do script \\"cd $concorewd/'+containername+";"+OCTAVEEXE+' -qf --eval run\\\\\\(\\\\\\'+"'"+sourcecode+"\\\\\\'"+'\\\\\\)\\""'+"\n")
else: # 4/2/21
- frun.write('(cd '
+ frun.write('(cd '
+containername+";"+ MATLABEXE+' -batch run\\(\\'+"'"+sourcecode+"\\'"+'\\)'+" >concoreout.txt&echo $!>concorepid)&\n")
- if ubuntu:
+ if ubuntu:
fdebug.write('concorewd=`pwd`\n')
- fdebug.write('xterm -e bash -c "cd $concorewd/' +containername+";"+ MATLABEXE+' -batch run\\(\\'+"'"+sourcecode+"\\'"+'\\);bash"&\n' )
- else:
+ fdebug.write('xterm -e bash -c "cd $concorewd/' +containername+";"+ MATLABEXE+' -batch run\\(\\'+"'"+sourcecode+"\\'"+'\\);bash"&\n' )
+ else:
fdebug.write('concorewd=`pwd`\n')
- fdebug.write('osascript -e "tell application \\"Terminal\\" to do script \\"cd $concorewd/' +containername+";"+ MATLABEXE+' -batch run\\\\\\(\\\\\\'+"'"+sourcecode+"\\\\\\'"+'\\\\\\)\\""\n' )
+ fdebug.write('osascript -e "tell application \\"Terminal\\" to do script \\"cd $concorewd/' +containername+";"+ MATLABEXE+' -batch run\\\\\\(\\\\\\'+"'"+sourcecode+"\\\\\\'"+'\\\\\\)\\""\n' )
i=0 # 3/30/21
for node in nodes_dict:
@@ -787,13 +795,13 @@
containername,sourcecode = nodes_dict[node].split(':')
if len(sourcecode)!=0:
dockername = sourcecode.split(".")[0] #3/28/21
- writeedges = volswr[i]
- while writeedges.find(":") != -1:
+ writeedges = volswr[i]
+ while writeedges.find(":") != -1:
if concoretype=="windows":
fclear.write('del /Q' + writeedges.split(":")[0].split("-v")[1]+ "\\*\n")
else:
fclear.write('rm ' + writeedges.split(":")[0].split("-v")[1]+ "/*\n")
- writeedges = writeedges[writeedges.find(":")+1:]
+ writeedges = writeedges[writeedges.find(":")+1:]
i=i+1
fclear.close()
@@ -802,13 +810,13 @@
containername,sourcecode = nodes_dict[node].split(':')
if len(sourcecode)!=0:
dockername = sourcecode.split(".")[0] #3/28/21
- writeedges = volswr[i]
- while writeedges.find(":") != -1:
+ writeedges = volswr[i]
+ while writeedges.find(":") != -1:
if concoretype=="windows":
fmaxtime.write('echo %1 >' + writeedges.split(":")[0].split("-v")[1]+ "\\concore.maxtime\n")
else:
fmaxtime.write('echo "$1" >' + writeedges.split(":")[0].split("-v")[1]+ "/concore.maxtime\n")
- writeedges = writeedges[writeedges.find(":")+1:]
+ writeedges = writeedges[writeedges.find(":")+1:]
i=i+1
fmaxtime.close()
@@ -817,13 +825,13 @@
containername,sourcecode = nodes_dict[node].split(':')
if len(sourcecode)!=0:
dockername = sourcecode.split(".")[0] #3/28/21
- writeedges = volswr[i]
- while writeedges.find(":") != -1:
+ writeedges = volswr[i]
+ while writeedges.find(":") != -1:
if concoretype=="windows":
funlock.write('copy %HOMEDRIVE%%HOMEPATH%\concore.apikey' + writeedges.split(":")[0].split("-v")[1]+ "\\concore.apikey\n")
else:
funlock.write('cp ~/concore.apikey ' + writeedges.split(":")[0].split("-v")[1]+ "/concore.apikey\n")
- writeedges = writeedges[writeedges.find(":")+1:]
+ writeedges = writeedges[writeedges.find(":")+1:]
i=i+1
funlock.close()