diff --git a/.gitignore b/.gitignore index ce5b35d..9cfcd7c 100644 --- a/.gitignore +++ b/.gitignore @@ -18,14 +18,12 @@ viwsession/ testfilemanager/ README-update -!./src-local/community/config/ +!./src-local/community/config/README !./src-local/community/custom/ !./src-local/community/README -./src-local/community/ -src-local/community/rootapostolos@swarmlab.io_mytest1_microservice-ipterm/ -src-local/community/rootapostolos@swarmlab.io_ansibletest_microservice-alpine313/ -src-local/community/cse242017102@uniwa.gr_test_microservice-nodejs/ -src-local/builders/bento-swarmlab/ +src-local/community/* +src-local/community/config/* +src-local/builders/bento-swarmlab/* swarmlabdoc.js swarmlabdoc.asciidoc_config diff --git a/run.yml b/run.yml index b625cf2..6d0fa14 100644 --- a/run.yml +++ b/run.yml @@ -121,6 +121,28 @@ services: - ${nodepath}/src-local/instance:/instance - ${nodepath}/src-local/community:/community + swarmlabsidecarserver: + image: hub.swarmlab.io:5480/hybrid-nginx:latest + user: docker + #privileged: true + container_name: swarmlab-sidecar-agent + entrypoint: ["/usr/bin/sec_bootstrap", "role=masterservice", "sec_master_service_name=masterservice", "sec_worker_service_name=workerservice"] + environment: + - NODENAME={{.Node.Hostname}} + - NODEID={{.Node.ID}} + ports: + - "3384:80" + volumes: + - ${nodepath}/src-local/instance:/data/www/instance + - ${nodepath}/src-local/community:/data/www/community + - ${nodepath}/src-local/myconfig/sec_bootstrap:/usr/bin/sec_bootstrap + - ${nodepath}/src-local/myconfig/nginx.conf:/etc/nginx/nginx.conf + - ${nodepath}/src-local/myconfig/default.conf:/etc/nginx/conf.d/default.conf +# - ${nodepath}/src-local/myconfig/supervisord.conf:/etc/supervisor/supervisord.conf + - /etc/localtime:/etc/localtime:ro + networks: + hybrid-net: + networks: hybrid-net: diff --git a/src-local/community/config/cse242017102-test.js b/src-local/community/config/cse242017102-test.js deleted file mode 100644 index 615725f..0000000 --- a/src-local/community/config/cse242017102-test.js +++ /dev/null @@ -1,17 +0,0 @@ -{ - "servicedata": { - "service": "test", - "baseservice": "microservice-nodejs", - "user": "cse242017102@uniwa.gr", - "port1": "", - "url1": "", - "name1": "", - "port2": "", - "url2": "", - "name2": "", - "port3": "", - "url3": "", - "name3": "" - }, - "baseservicedata": {"name":"microservice-nodejs","custom":"true","customostext":"Base OS: alpine:3.13","customos":"apk add --no-cache net-tools ","customshtext":"It is executed after all the normal builds","customsh":" #!/bin/sh","app":false,"url":"http","port":"80/tcp","ttyd":true,"ttydport":"3787/tcp","ttydurl":"http"} -} \ No newline at end of file diff --git a/src-local/community/config/rootapostolos-ansibletest.js b/src-local/community/config/rootapostolos-ansibletest.js deleted file mode 100644 index e620224..0000000 --- a/src-local/community/config/rootapostolos-ansibletest.js +++ /dev/null @@ -1,17 +0,0 @@ -{ - "servicedata": { - "service": "ansibletest", - "baseservice": "microservice-alpine313", - "user": "rootapostolos@swarmlab.io", - "port1": "", - "url1": "", - "name1": "", - "port2": "", - "url2": "", - "name2": "", - "port3": "", - "url3": "", - "name3": "" - }, - "baseservicedata": {"name":"microservice-alpine313","large":"no","custom":"true","customostext":"Base OS: alpine3.13","customos":"apk add --no-cache net-tools ","customshtext":"It is executed after all the normal builds","customsh":" #!/bin/sh","app":false,"url":"http","port":"80/tcp","ttyd":true,"ttydport":"3787/tcp","ttydurl":"http"} -} \ No newline at end of file diff --git a/src-local/community/config/rootapostolos-mytest1.js b/src-local/community/config/rootapostolos-mytest1.js deleted file mode 100644 index ef570d8..0000000 --- a/src-local/community/config/rootapostolos-mytest1.js +++ /dev/null @@ -1,17 +0,0 @@ -{ - "servicedata": { - "service": "mytest1", - "baseservice": "microservice-ipterm", - "user": "rootapostolos@swarmlab.io", - "port1": "8081", - "url1": "http", - "name1": "n1", - "port2": "8082", - "url2": "http", - "name2": "n2", - "port3": "8083", - "url3": "https", - "name3": "n3" - }, - "baseservicedata": {"name":"microservice-ipterm","custom":"true","customostext":"Base OS: debian:jessie ","customos":"apt-get update && apt-get install -y --no-install-recommends net-tools","customshtext":"It is executed after all the normal builds","customsh":" #!/bin/sh","app":false,"url":"http","port":"80/tcp","ttyd":true,"ttydport":"3787/tcp","ttydurl":"http"} -} \ No newline at end of file diff --git a/src-local/llo/new.js b/src-local/llo/new.js index 01ac7b0..60d3217 100644 --- a/src-local/llo/new.js +++ b/src-local/llo/new.js @@ -1653,9 +1653,6 @@ app.get('/rungui', (req, res, next) => { var runpath = `./instance/${RES.instance}/${RES.instance}` var runpathfile = `./instance/${RES.instance}/${RES.instance}/run-gui.sh` - //console.log(runpath) - //console.log(showexec) - var buildoutdir = `${runpath}/logs/build-out.log` var builderrdir = `${runpath}/logs/build-out.log` //const buildout = fs.openSync(buildoutdir, 'a'); @@ -1726,6 +1723,94 @@ try { }); +app.get('/runguicustom', (req, res, next) => { + var RES = new Object(); + RES.instance = req.query["instance"] + RES.exec = req.query["exec"] + RES.imageid = req.query["id"] + RES.error = false + RES.error_msg = "ok" + RES.error_msg0 = "" + RES.data = "All_services_are_running"; + var showexec = `./run-gui.sh` + //var runpath = `./instance/${RES.instance}/${RES.instance}` + var runpath = `./${RES.instance}` + var runpathfile = `${runpath}/run-gui.sh` + + var buildoutdir = `${runpath}/logs/build-out.log` + var builderrdir = `${runpath}/logs/build-out.log` + //const buildout = fs.openSync(buildoutdir, 'a'); + //const builderr = fs.openSync(builderrdir, 'a'); +try { + const buildout = fs.openSync(buildoutdir, 'a'); + const builderr = fs.openSync(builderrdir, 'a'); + var runexec = `xhost +local:docker + docker exec -e DISPLAY=\$DISPLAY ${RES.imageid} ${RES.exec} + +` + const extrapackagestext = fs.writeFileSync(runpathfile, runexec, {encoding:'utf8'}); + var buildimage = `echo "EXEC PID: $$"; ${showexec}` + //var buildimage = `echo "EXEC PID: $$"; docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix microservice-firefox /bin/sh -c "firefox"` + const run_buildimage = spawn(buildimage, { + detached: true, + shell: true, + stdio: [ 'ignore', buildout, builderr ], + cwd: runpath + }); + + var n = {} + n.pid = run_buildimage.pid + io.emit('build_set_buildpid', n); + + n.data = 'start ...' + io.emit('message_out', n); + + n.data = 'i am trying to automatically start the application' + io.emit('message_out', n); + + n.data = 'If this fails, try:' + io.emit('message_out', n); + + var buildtmpexec = "" + buildtmpexec = fs.readFileSync(runpathfile, {encoding:'utf8', flag:'r'}); + + //var buildtmpexec = `docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix microservice-firefox /bin/sh -c "firefox"` + + n.data = buildtmpexec + io.emit('message_out', n); + + run_buildimage.on('exit', (data) => { + //console.log('exit '+data); + var n = {} + n.data = 'exit!' + io.emit('message_close', n); + }); + run_buildimage.on('close', (data) => { + //console.log('close '+data); + var n = {} + n.data = 'close!' + io.emit('message_close', n); + + n.name = `${RES.instance}` + n.dir = `${runpath}` + io.emit('message_close_build', n); + RES.error = false + RES.error_msg = 'no' + RES.data = 'no' + res.json(RES) + }); + console.log(run_buildimage.pid); + run_buildimage.unref(); +} catch (error) { + console.log('Error:', error); + RES.error = true + RES.error_msg = error + RES.data = 'no' + res.json(RES) +} + +}); + app.get('/runeditor', (req, res, next) => { var RES = new Object(); var mypath1 = process.cwd() @@ -2136,6 +2221,38 @@ app.get('/getcustom', (req, res, next) => { } }); +app.get('/getlog4gui', (req, res, next) => { + var RES = new Object(); + var mypath1 = process.cwd() + var runuser = process.env.USER || "" + RES.instance = req.query["instance"] + RES.error = false + RES.error_msg = "ok" + var instancedir = `${mypath1}/${RES.instance}` + console.log(instancedir) + if (fs.existsSync(instancedir)) { + try { + const log = fs.readFileSync(instancedir, {encoding:'utf8', flag:'r'}); + RES.error = false + RES.error_msg = 'ok' + RES.log = log + res.json(RES) + } catch (error) { + RES.error = true + RES.error_msg = error + RES.data = 'no' + RES.log = 'no' + res.json(RES) + } + }else{ + RES.error = false + RES.error_msg = 'nodir' + RES.data = 'no' + RES.log = 'no' + res.json(RES) + } +}); + app.get('/getcustomuser', (req, res, next) => { var RES = new Object(); var mypath1 = process.cwd() @@ -3832,6 +3949,18 @@ TEST=${value.baseservice} //console.log('value2 '+JSON.stringify(ENV_service_file_os)) var service_up = '/bin/bash ../install/usr/share/swarmlab.io/sec/swarmlab-sec up size='+service_size + + const comment_clearall = /\s\bclear_all\b(?!.*\()/g; + // /\bclear_all\b(?!.*\()/g; + var myservicecustom_buildfile = `./community/${value.user}_${value.service}_${value.baseservice}/install/usr/share/swarmlab.io/sec/swarmlab-sec` + var changeclearall = fs.readFileSync(myservicecustom_buildfile, 'utf8') + if (changeclearall.match(comment_clearall)) { + var changeclearall_tmp = changeclearall.replace(comment_clearall, ' #clear_all\necho ""') + fs.writeFileSync(myservicecustom_buildfile, changeclearall_tmp ,{encoding:'utf8',flag:'w'}); + } + + + child[0] = spawn(service_up, { shell: true, cwd: services_path, diff --git a/src-local/myconfig/default.conf b/src-local/myconfig/default.conf new file mode 100755 index 0000000..1072e80 --- /dev/null +++ b/src-local/myconfig/default.conf @@ -0,0 +1,44 @@ +server { + listen 80; + server_name localhost; + + #charset koi8-r; + #access_log /var/log/nginx/log/host.access.log main; + + location / { + root /data/www; + index index.html index.htm; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /data/www; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} +} diff --git a/src-local/myconfig/nginx.conf b/src-local/myconfig/nginx.conf new file mode 100755 index 0000000..95505c2 --- /dev/null +++ b/src-local/myconfig/nginx.conf @@ -0,0 +1,29 @@ +user www-data; +worker_processes 1; + +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '[$time_local] $remote_user:$remote_addr "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout 65; + + #gzip on; + + include /etc/nginx/conf.d/*.conf; +} diff --git a/src-local/myconfig/sec_bootstrap b/src-local/myconfig/sec_bootstrap new file mode 100755 index 0000000..c37862f --- /dev/null +++ b/src-local/myconfig/sec_bootstrap @@ -0,0 +1,77 @@ +#!/bin/sh + +ROLE="undefined" +MPI_MASTER_SERVICE_NAME="sec_masterservice" +MPI_WORKER_SERVICE_NAME="sec_workerservice" +HOSTNAMES="/etc/nethosts" + +####################### +# ARGUMENTS PARSER + +while [ "$1" != "" ]; +do + PARAM=$(echo "$1" | awk -F= '{print $1}') + VALUE=$(echo "$1" | awk -F= '{print $2}') + + case $PARAM in + role) + [ "$VALUE" ] && ROLE=$VALUE + ;; + + sec_master_service_name) + [ "$VALUE" ] && MPI_MASTER_SERVICE_NAME=$VALUE + ;; + + sec_worker_service_name) + [ "$VALUE" ] && MPI_WORKER_SERVICE_NAME=$VALUE + ;; + *) + echo "ERROR: unknown parameter \"$PARAM\"" + exit 1 + ;; + esac + shift +done + + + +cat > /etc/opt/service_names <<- EOF +MPI_MASTER_SERVICE_NAME=${MPI_MASTER_SERVICE_NAME} +MPI_WORKER_SERVICE_NAME=${MPI_WORKER_SERVICE_NAME} +EOF + +case $ROLE in + "masterservice") + + # Auto update default host file in background and dumb all output + auto_update_hosts "${HOSTNAMES}" > /dev/null 2>&1 & + #/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf + #ttyd -p 3787 bash & + /usr/sbin/nginx + sleep 1 + /usr/sbin/nginx + tail -f /dev/null + # Start ssh server + #/usr/sbin/sshd -D + ;; + + + "workerservice") + + # Start ssh server in background + #/usr/sbin/sshd -D & + + # Keep trying to connect to master node and stay there indefinitely so that master node can see + # the connected hosts that are ready for MPI work + #while sleep 1 + #do + # shellcheck disable=SC2086 + # ssh -T -o "StrictHostKeyChecking no" \ + # -i "${USER_HOME}/.ssh/id_rsa" \ + # ${USER}@${MPI_MASTER_SERVICE_NAME} \ + tail -f /dev/null + #done + ;; + *) + echo 'role argument only accepts "masterservice" or "workerservice"' +esac diff --git a/src/components/mynetwork/AdhocView.vue b/src/components/mynetwork/AdhocView.vue index 61389d5..b6fe7ec 100644 --- a/src/components/mynetwork/AdhocView.vue +++ b/src/components/mynetwork/AdhocView.vue @@ -458,6 +458,7 @@ export default { }) // from runLLO this.$root.$on('hybrid_log_in', (log) => { + console.log(log) //this.code += log.data //this.code += "\n" //console.log(" form socket log "+JSON.stringify(this.code)) diff --git a/src/components/mynetwork/availablemicroservices.vue b/src/components/mynetwork/availablemicroservices.vue index 7fceb4c..83ccd47 100644 --- a/src/components/mynetwork/availablemicroservices.vue +++ b/src/components/mynetwork/availablemicroservices.vue @@ -34,6 +34,13 @@