diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8f5d5df --- /dev/null +++ b/Dockerfile @@ -0,0 +1,62 @@ +#FROM alpine:3.11 +FROM node:alpine + +LABEL MAINTAINERS="Guillaume Scheibel , Damien DUPORTAL " + +# Installing package required for the runtime +# build/llo-base-images/asciidoctor-alpine/docker-asciidoctor +RUN apk add --no-cache \ + bash \ + curl \ + ca-certificates \ + findutils \ + font-bakoma-ttf \ + git \ + graphviz \ + inotify-tools \ + make \ + python3 \ + py3-pillow \ + py3-setuptools \ + tzdata \ + unzip \ + build-base \ + libxml2-dev \ + which + +# Installing Python dependencies for additional +# functionnalities +RUN apk add --no-cache --virtual .pythonmakedepends \ + build-base \ + python3-dev \ + py3-pip \ + && pip3 install --no-cache-dir \ + actdiag \ + pip install supervisor supervisor-stdout \ + 'blockdiag[pdf]' \ + nwdiag \ + seqdiag \ + && apk del -r --no-cache .pythonmakedepends + +RUN ln -s /usr/local/bin/node /usr/bin/node + +ADD supervisord.conf /etc/supervisor/supervisord.conf +ADD supervisord-iot.conf /etc/supervisor/conf.d/node-app.conf +ADD mpi_bootstrap /home/node +ADD startup.sh /home/node + +ADD ttyd /usr/bin +ADD ssl-ttyd /home/node/ssl-ttyd + +RUN mkdir -p /home/node/log \ +&& mkdir -p /home/node/crond \ +&& mkdir -p /home/node/run \ +&& chmod -R 755 /home/node \ +&& chown -R node.node /home/node + +WORKDIR /home/node +VOLUME /home/node + +EXPOSE 8080 8088 8084 3081 + +CMD ["/usr/bin/supervisord", "-c", "/home/node/startup.sh"] diff --git a/Dockerfile.build b/Dockerfile.build new file mode 100755 index 0000000..932ae6e --- /dev/null +++ b/Dockerfile.build @@ -0,0 +1,2 @@ +#!/bin/bash +docker build -f Dockerfile -t hub.swarmlab.io:5443/playground-nodejs-swarm . diff --git a/mpi_bootstrap b/mpi_bootstrap new file mode 100644 index 0000000..2621d16 --- /dev/null +++ b/mpi_bootstrap @@ -0,0 +1,72 @@ +#!/bin/sh + +ROLE="undefined" +MPI_MASTER_SERVICE_NAME="mpi2_master" +MPI_WORKER_SERVICE_NAME="mpi2_worker" + +####################### +# 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 + ;; + + mpi_master_service_name) + [ "$VALUE" ] && MPI_MASTER_SERVICE_NAME=$VALUE + ;; + + mpi_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 + "master") + + # Auto update default host file in background and dumb all output + auto_update_hosts "${HYDRA_HOST_FILE}" > /dev/null 2>&1 & + + /bin/bash /home/node/startup.sh + # Start ssh server + #/usr/sbin/sshd -D + ;; + + + "worker") + + # 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 "master" or "worker"' +esac diff --git a/ssl-ttyd/ca.crt b/ssl-ttyd/ca.crt new file mode 100644 index 0000000..54ce57c --- /dev/null +++ b/ssl-ttyd/ca.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIJAOCXdz+7wedQMA0GCSqGSIb3DQEBCwUAMGwxCzAJBgNV +BAYTAmdyMQ8wDQYDVQQIDAZhdHRpY2ExDzANBgNVBAcMBmF0aGVuczEOMAwGA1UE +CgwFc3dhcm0xETAPBgNVBAsMCHN3YXJtbGFiMRgwFgYDVQQDDA90dHkuc3dhcm1s +YWIuaW8wHhcNMjAwMzE3MTYyMzM3WhcNMzAwMzE1MTYyMzM3WjBsMQswCQYDVQQG +EwJncjEPMA0GA1UECAwGYXR0aWNhMQ8wDQYDVQQHDAZhdGhlbnMxDjAMBgNVBAoM +BXN3YXJtMREwDwYDVQQLDAhzd2FybWxhYjEYMBYGA1UEAwwPdHR5LnN3YXJtbGFi +LmlvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAycWkd5JDQNz8eJL7 +Py1r2V0GByMEnMJ40CZ1YG/FxCdjRI82jmKSzjEYLshY0yWZcYKmLvO3FAhKTQr0 +IkM0L/ocDAkpQZQzxwBORDeb09649U2IMAoDmzLx220JSYqMxNSibO4tzUKtkR16 +Vn/6X/+vLsWK0HVKLKOU/zMkLozlXnvitfOvQYREeStj3eS+At+klA9UofnCH3lK +a83yZ2nMS1MLITOLshePOr5BZ6kotXdH16hBKvQqSHPztof2ZCILXQwfKd3KLPRA +/Irz2aBFLKkczDLpBlr0yq8r340YOL1P5GWMApNrEAGIz8SRszGvRX9xJX3F50hT +QqfScwIDAQABo1AwTjAdBgNVHQ4EFgQUgs1c9ndtFr40m94/dX/ceMzrL2gwHwYD +VR0jBBgwFoAUgs1c9ndtFr40m94/dX/ceMzrL2gwDAYDVR0TBAUwAwEB/zANBgkq +hkiG9w0BAQsFAAOCAQEAngzEkQcn2XaOgfLZqn3/VG8OGcxAU4sMN5KwMQzL3sR+ +x6roGrjdE4B8t5HK68PE6mr/3i+vjcH3+di7qCK3RNM5UhvZEqRdRQAUCrDdsl7B +hM3nLVAPytgieT9Ul+Oq6WM4SNTPuVqpNa3VJ48FXl+DZh5P0Iqou5bnXi7/fC3+ +Y88k9dmPIvFBSVMcv5m08DIda8KVidCNdDRHSSVXd21ZBz0Xd0gwgWY3Gjl58a8T +rMNYUhJlQpjAbbeXSym0uXzB65zGpMPkpqfk3iFk6e/bvFR4n6pZ5OFH+Z2ke2al +kVC8K4DEpKfD0BgEmObebGQbFIv5lCHDvn0Nmp7gTQ== +-----END CERTIFICATE----- diff --git a/ssl-ttyd/ca.key b/ssl-ttyd/ca.key new file mode 100644 index 0000000..042fd0c --- /dev/null +++ b/ssl-ttyd/ca.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAycWkd5JDQNz8eJL7Py1r2V0GByMEnMJ40CZ1YG/FxCdjRI82 +jmKSzjEYLshY0yWZcYKmLvO3FAhKTQr0IkM0L/ocDAkpQZQzxwBORDeb09649U2I +MAoDmzLx220JSYqMxNSibO4tzUKtkR16Vn/6X/+vLsWK0HVKLKOU/zMkLozlXnvi +tfOvQYREeStj3eS+At+klA9UofnCH3lKa83yZ2nMS1MLITOLshePOr5BZ6kotXdH +16hBKvQqSHPztof2ZCILXQwfKd3KLPRA/Irz2aBFLKkczDLpBlr0yq8r340YOL1P +5GWMApNrEAGIz8SRszGvRX9xJX3F50hTQqfScwIDAQABAoIBAQCEFaQCunbYQVHt +RJrA0uUlF+ZYSa49SHl6GZMBHGpkbDxppy7ZquHbpPvltDWhk52NVy+e0OBqdrrd +EGyc+U1yktJFdsHRMklq3mJd+eFCoyyFOMoMWKHfuUvmjsxjnhVkzKW/lXPaSOoC +cz+g3Ip0yZZOkfa7W+zAqB1jqoDnDx7CQUmOG/DzFDzQCQJgV/G/EPM0SHT9zew+ +rBvOGOy0n0M7wbJz8JbXn2E/MFqqw0G7KJqT4zFlbzUoopNIcUSfLxX7ihVbX3Dc +WfoCwNsNqHT/kUeH8ouYTwCduPi1UHKcWlM+v2ONW5rCook7i22Zc403AXC4S0/7 ++naXkbeBAoGBAPSZv/wKatakOXcWTODgwOkbLGsDLRw6eb5YK7C7KxddUflPG64Q +kC6apGCC+aMnW21VTyTOtHSvuQi38lieSpJpfeLnn4q0ehZY0D+CEhk+LukpY85r +cN8haGxvP26rVKxZvFH6guAHShJa5ohWj64iaPxPrlCHoOPFHz8VqbaTAoGBANMs +60fmwUO9zkUSipN/Zkrkaf7CR//So77RvlDXsT5SkcrT/hcVzKa2Vxif0YsylG1S +2SJaDvD7+SfLiMddSaP9xQ2473ToaAJhcr7MPWk0of/MGO2n9PDNuEzfd3tWarZi +IYnrQQukOESb3m/Lgz3tBz36ZU3D5Zf3fjzY5AChAoGAPfdxjs2o0WXbdRL+OP5X +gPa0Ywvz8rHRw+ocb3KLcSjgKpPjBE8H5/afbB/iVHYVEHbLTRzc1K7r5oyLZe38 +IGl/Teu2HHKqd1zarSwrn5+ETOeCdHn9p1mUVdw9KrFXCy7UqcQYQd824b2Lp8Ce +N9RZ2onpNFeX5/w5dUbsrucCgYEAyKX/kDvjGjh4iwzI+sisKzDIvbVfr+U2jJLB +4BJxaKQPvsaawNiHsUfDjbQc58PRX+a+RXOIitT/sh4kAjnTRKxU1WsIqu5AFTL+ +UefB2fqWinQko3tYsozlNrWF030Su+SVtXQAQ81vYVEwksyuEOLsZKlMJA2kUzZn +je0PBsECgYBazM6AQPwA8N5baSztrKr8hZkSJrhAdSWIMPT2pCJMe5dso1RfAnFm +iehW7+Mzd8DZTeVm7id73pX6aY4YLjYmbkD9HT/1aZNYP1ESmdvz4++zqKrWEYQw +NbUuyK6tsWfjTOS02clrG6bZYHo/0Vteg1WrBsj5BZQ4LsVhtkvQWA== +-----END RSA PRIVATE KEY----- diff --git a/startup.sh b/startup.sh new file mode 100644 index 0000000..d775f26 --- /dev/null +++ b/startup.sh @@ -0,0 +1,123 @@ +#!/bin/bash + +# --------------------------- +# create scripts +# -------------------------- +if [ "$GIT_TUTOR" ] ; then + +REPO=${GIT_TUTOR##*/} +REPO=${REPO%.git} + +# --------------------------- +# start playground +# -------------------------- + +read -r -d '' VAR < /home/$USER/crond/playground-start.sh +chmod +x /home/$USER/crond/playground-start.sh + +read -r -d '' VAR < /home/$USER/crond/playground.config.js +chmod +x /home/$USER/crond/playground.config.js + +# --------------------------- +# sync playground +# -------------------------- +read -r -d '' VAR < /home/$USER/crond/playground-sync.sh +chmod +x /home/$USER/crond/playground-sync.sh + +# ***************************************************** +# ***************************************************** +# ELSE +# ***************************************************** +# ***************************************************** + +else + +# --------------------------- +# hello world! +# -------------------------- +read -r -d '' VAR < /home/$USER/crond/playground-start.sh +chmod +x /home/$USER/crond/playground-start.sh + +# --------------------------- +# NO sync playground +# -------------------------- +read -r -d '' VAR < /home/$USER/crond/playground-sync.sh +chmod +x /home/$USER/crond/playground-sync.sh + +fi + +read -r -d '' VAR < /home/$USER/crond/info + +chown -R $USER.$USER /home/$USER +chmod -R 755 /home/$USER + + +/home/$USER/crond/playground-start.sh +/home/$USER/crond/playground-sync.sh + +/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf diff --git a/supervisord-iot.conf b/supervisord-iot.conf new file mode 100644 index 0000000..085af49 --- /dev/null +++ b/supervisord-iot.conf @@ -0,0 +1,5 @@ +[program:ttyd] +command=bash -c 'sleep 5 && cd /home/node && sudo -u node ttyd --ssl --ssl-cert /home/node/ssl-ttyd/ca.crt --ssl-key /home/mode/ssl-ttyd/ca.key -c user:%(ENV_PASSWORD)s -p 8088 -u node bash' +stdout_logfile=/var/log/ttyd.log +autorestart=true + diff --git a/supervisord.conf b/supervisord.conf new file mode 100644 index 0000000..332bb82 --- /dev/null +++ b/supervisord.conf @@ -0,0 +1,46 @@ +[unix_http_server] +file=/var/run/supervisor.sock ; (the path to the socket file) +;chmod=0700 ; socket file mode (default 0700) +;chown=nobody:nogroup ; socket file uid:gid owner +;username=user ; (default is no username (open server)) +;password=123 ; (default is no password (open server)) + +[inet_http_server] ; inet (TCP) server disabled by default +port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface) +;username=user ; (default is no username (open server)) +;password=123 ; (default is no password (open server)) + +[supervisord] +logfile=/dev/null ; (main log file;default $CWD/supervisord.log) +logfile_maxbytes=0 ; (max main logfile bytes b4 rotation;default 50MB) +logfile_backups=0 ; (num of main logfile rotation backups;default 10) +loglevel=info ; (log level;default info; others: debug,warn,trace) +;pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) +nodaemon=true ; (start in foreground if true;default false) +minfds=1024 ; (min. avail startup file descriptors;default 1024) +minprocs=200 ; (min. avail process descriptors;default 200) +;umask=022 ; (process file creation umask;default 022) +;user=chrism ; (default is current user, required if root) +;identifier=supervisor ; (supervisord identifier, default is 'supervisor') +;directory=/tmp ; (default is not to cd during start) +;nocleanup=true ; (don't clean up tempfiles at start;default false) +;childlogdir=/tmp ; ('AUTO' child log dir, default $TEMP) +;environment=KEY="value" ; (key value pairs to add to environment) +;strip_ansi=false ; (strip ansi escape codes in logs; def. false) + +; the below section must remain in the config file for RPC +; (supervisorctl/web interface) to work, additional interfaces may be +; added by defining them in separate rpcinterface: sections +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///usr/local/var/run/supervisor.sock ; use a unix:// URL for a unix socket +;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket +;username=chris ; should be same as http_username if set +;password=123 ; should be same as http_password if set +;prompt=mysupervisor ; cmd line prompt (default "supervisor") +;history_file=~/.sc_history ; use readline history if available + +[include] +files = /etc/supervisor/conf.d/*.conf diff --git a/ttyd b/ttyd new file mode 100755 index 0000000..9924b33 Binary files /dev/null and b/ttyd differ