diff --git a/README.md b/README.md index 2b921fd..da6eaf2 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ +sudo ln -s /mnt/f/COM2014/server/uploads /uploads + docker container run -d -p 80:8080 -v /var/run/docker.sock:/var/run/docker.sock -v /uploads/:/app/uploads/ -v /output/:/app/output/ com2014-server diff --git a/docker-compose.yml b/docker-compose.yml index d9cfae9..264d6da 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,25 +1,22 @@ version: '3' services: - com2014: + tsp: image: com2014-server networks: - traefik-public deploy: labels: - "traefik.enable=true" - - "traefik.http.routers.com2014.rule=Host(`com2014.trustai.uk`)" - - "traefik.http.routers.com2014.entrypoints=web" - - "traefik.http.services.com2014.loadbalancer.server.port=80" + - "traefik.http.routers.tsp.rule=Host(`tsp.trustai.uk`)" + - "traefik.http.routers.tsp.entrypoints=web" + - "traefik.http.services.tsp.loadbalancer.server.port=8080" # TLS - - "traefik.http.routers.com2014s.rule=Host(`com2014.trustai.uk`)" - - "traefik.http.routers.com2014s.entrypoints=websecure" - - "traefik.http.routers.com2014s.tls.certresolver=myhttpchallenge" + - "traefik.http.routers.tsps.rule=Host(`tsp.trustai.uk`)" + - "traefik.http.routers.tsps.entrypoints=websecure" + - "traefik.http.routers.tsps.tls.certresolver=myhttpchallenge" # Redirect - - "traefik.http.routers.com2014.middlewares=https_redirect" + - "traefik.http.routers.tsp.middlewares=https_redirect" - "traefik.http.middlewares.https_redirect.redirectscheme.scheme=https" - placement: - constraints: - - node.role == worker networks: traefik-public: external: true \ No newline at end of file diff --git a/leaderboard.json.empty b/leaderboard.json.empty new file mode 100644 index 0000000..85bcf0b --- /dev/null +++ b/leaderboard.json.empty @@ -0,0 +1 @@ +{"ulysses16":[],"att48":[],"st70":[],"a280":[],"pcb442":[],"dsj1000":[]} \ No newline at end of file diff --git a/output/.gitignore b/output/.gitignore index 1c471ba..86d0cb2 100644 --- a/output/.gitignore +++ b/output/.gitignore @@ -1,8 +1,4 @@ -# .gitignore sample -################### - -# Ignore all files in this dir... +# Ignore everything in this directory * - -# ... except for this one. +# Except this file !.gitignore \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4bee87a..bf70d64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,960 +1,8 @@ { "name": "nodejs-express-multer-multipartfile-ajax-jquery-bootstrap", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "nodejs-express-multer-multipartfile-ajax-jquery-bootstrap", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "express": "^4.16.3", - "line-reader": "^0.4.0", - "multer": "^1.3.0", - "node-docker-api": "^1.1.22", - "readline-sync": "^1.4.10", - "socket.io": "^3.0.4", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/@types/component-emitter": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", - "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" - }, - "node_modules/@types/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==" - }, - "node_modules/@types/cors": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz", - "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg==" - }, - "node_modules/@types/node": { - "version": "14.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" - }, - "node_modules/accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dependencies": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/append-field": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz", - "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "dependencies": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==" - }, - "node_modules/busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "dependencies": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cors/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "dependencies": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/docker-modem": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-0.3.7.tgz", - "integrity": "sha1-P1ENCfXTNNwhNCKPkr00RnEiffQ=", - "dependencies": { - "debug": "^2.6.0", - "JSONStream": "0.10.0", - "readable-stream": "~1.0.26-4", - "split-ca": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/docker-modem/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/engine.io": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.0.5.tgz", - "integrity": "sha512-Ri+whTNr2PKklxQkfbGjwEo+kCBUM4Qxk4wtLqLrhH+b1up2NFL9g9pjYWiCV/oazwB0rArnvF/ZmZN2ab5Hpg==", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.1.0", - "engine.io-parser": "~4.0.0", - "ws": "^7.1.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", - "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", - "dependencies": { - "base64-arraybuffer": "0.1.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/engine.io/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "dependencies": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", - "qs": "6.5.1", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz", - "integrity": "sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA=", - "dependencies": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "index.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/line-reader": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.4.0.tgz", - "integrity": "sha1-F+RIGNoKwzVnW6MAlU+U72cOZv0=" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "bin": { - "mime": "cli.js" - } - }, - "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/multer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz", - "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=", - "dependencies": { - "append-field": "^0.1.0", - "busboy": "^0.2.11", - "concat-stream": "^1.5.0", - "mkdirp": "^0.5.1", - "object-assign": "^3.0.0", - "on-finished": "^2.3.0", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-docker-api": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/node-docker-api/-/node-docker-api-1.1.22.tgz", - "integrity": "sha1-IwMn79MJpuxzAr8/QEq3YAQKWAY=", - "dependencies": { - "docker-modem": "^0.3.1", - "memorystream": "^0.3.1" - } - }, - "node_modules/object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "node_modules/proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", - "dependencies": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.6.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "dependencies": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dependencies": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body/node_modules/setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - }, - "node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/readline-sync": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", - "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "node_modules/send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/socket.io": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.0.4.tgz", - "integrity": "sha512-Vj1jUoO75WGc9txWd311ZJJqS9Dr8QtNJJ7gk2r7dcM/yGe9sit7qOijQl3GAwhpBOz/W8CwkD7R6yob07nLbA==", - "dependencies": { - "@types/cookie": "^0.4.0", - "@types/cors": "^2.8.8", - "@types/node": "^14.14.7", - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.1.0", - "engine.io": "~4.0.0", - "socket.io-adapter": "~2.0.3", - "socket.io-parser": "~4.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.3.tgz", - "integrity": "sha512-2wo4EXgxOGSFueqvHAdnmi5JLZzWqMArjuP4nqC26AtLh5PoCPsaRbRdah2xhcwTAMooZfjYiNVNkkmmSMaxOQ==" - }, - "node_modules/socket.io-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.2.tgz", - "integrity": "sha512-Bs3IYHDivwf+bAAuW/8xwJgIiBNtlvnjYRc4PbXgniLmcP1BrakBoq/QhO24rgtgW7VZ7uAaswRGxutUnlAK7g==", - "dependencies": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", - "debug": "~4.1.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/socket.io-parser/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/socket.io/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/split-ca": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", - "integrity": "sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY=" - }, - "node_modules/statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "node_modules/type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ws": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", - "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "engines": { - "node": ">=0.4" - } - } - }, "dependencies": { "@types/component-emitter": { "version": "1.2.10", @@ -976,6 +24,15 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" }, + "JSONStream": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz", + "integrity": "sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA=", + "requires": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + } + }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -1164,8 +221,8 @@ "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-0.3.7.tgz", "integrity": "sha1-P1ENCfXTNNwhNCKPkr00RnEiffQ=", "requires": { - "debug": "^2.6.0", "JSONStream": "0.10.0", + "debug": "^2.6.0", "readable-stream": "~1.0.26-4", "split-ca": "^1.0.0" }, @@ -1342,15 +399,6 @@ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=" }, - "JSONStream": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz", - "integrity": "sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA=", - "requires": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - } - }, "line-reader": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.4.0.tgz", diff --git a/package.json b/package.json index ae03f5d..5703499 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,8 @@ "license": "ISC", "dependencies": { "express": "^4.16.3", - "line-reader": "^0.4.0", "multer": "^1.3.0", "node-docker-api": "^1.1.22", - "readline-sync": "^1.4.10", "socket.io": "^3.0.4", "strip-ansi": "^6.0.0" } diff --git a/resources/static/css/style.css b/resources/css/style.css similarity index 96% rename from resources/static/css/style.css rename to resources/css/style.css index 43281fb..3a532ac 100644 --- a/resources/static/css/style.css +++ b/resources/css/style.css @@ -143,14 +143,14 @@ body::after { margin-top: 10%; margin-left: 40%; width: 80%; - content:url("/static/img/exeter.png"); + content:url("/img/exeter.png"); } .russell { margin-top: 5%; margin-left: 40%; width: 80%; - content:url("/static/img/russell.png"); + content:url("/img/russell.png"); } #main-footer { diff --git a/resources/static/download-icon.png b/resources/download-icon.png similarity index 100% rename from resources/static/download-icon.png rename to resources/download-icon.png diff --git a/resources/static/graph-creator.css b/resources/graph-creator.css similarity index 100% rename from resources/static/graph-creator.css rename to resources/graph-creator.css diff --git a/resources/static/graph-creator.js b/resources/graph-creator.js similarity index 100% rename from resources/static/graph-creator.js rename to resources/graph-creator.js diff --git a/resources/static/img/exeter.png b/resources/img/exeter.png similarity index 100% rename from resources/static/img/exeter.png rename to resources/img/exeter.png diff --git a/resources/static/img/russell.png b/resources/img/russell.png similarity index 100% rename from resources/static/img/russell.png rename to resources/img/russell.png diff --git a/views/index.html b/resources/index.html similarity index 98% rename from views/index.html rename to resources/index.html index 8ba59f2..c58a168 100644 --- a/views/index.html +++ b/resources/index.html @@ -26,15 +26,15 @@ - - + + - - - + + + @@ -73,7 +73,7 @@
- +
diff --git a/resources/js/script.js b/resources/js/script.js new file mode 100644 index 0000000..ab66c3f --- /dev/null +++ b/resources/js/script.js @@ -0,0 +1,236 @@ +$( document ).ready( () => { + // warn the user when leaving + window.onbeforeunload = function(){ + return "Make sure to save your graph locally before leaving"; + }; + + $('body').scrollspy({ target: '#main-nav', offset: 130 }) + + $('#fullpage').fullpage({ + // anchors: ['underPage', 'gradPage', 'phdPage'], + sectionsColor: ['#ffffff', '#f8f8f8'], + autoScrolling: false, + css3: true, + fitToSection: false, + afterLoad: function(anchorLink, index) { + // history.pushState(null, null, ""); + // console.log(anchorLink); + } + }); + + // Initialize Console + ConsoleLogHTML.connect(document.getElementById("console")); // Redirect log messages + // ConsoleLogHTML.disconnect(); // Stop redirecting + + // Navbar click scroll + $(".navbar a").on('click', function(event) { + // Make sure this.hash has a value before overriding default behavior + if (this.hash !== "") { + // Prevent default anchor click behavior + event.preventDefault(); + + // Store hash + var hash = this.hash; + + // Using jQuery's animate() method to add smooth page scroll + // The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area + var offset = 0; + if (hash === "#home") + { + offset = -100; + } + else { + offset = -60; + } + $('html, body').animate({ + scrollTop: ($(hash).offset().top + offset) + }, 1000, function(){ + // Add hash (#) to URL when done scrolling (default click behavior) + // window.location.hash = hash; + }); + } + }); + + $('#submission_info').hide(); + + $('#ulysses16_submit').hide(); + $('#att48_submit').hide(); + $('#st70_submit').hide(); + $('#a280_submit').hide(); + $('#pcb442_submit').hide(); + $('#dsj1000_submit').hide(); + + $( "#ulysses16_submit" ).click(function() { + upload_leaderboard('ulysses16'); + $('#ulysses16_submit').removeClass('btn-primary'); + $('#ulysses16_submit').text('Submitted'); + $('#ulysses16_submit').prop('disabled', true); + }); + + $( "#att48_submit" ).click(function() { + upload_leaderboard('att48'); + $('#att48_submit').removeClass('btn-primary'); + $('#att48_submit').text('Submitted'); + $('#att48_submit').prop('disabled', true); + }); + + $( "#st70_submit" ).click(function() { + upload_leaderboard('st70'); + $('#st70_submit').removeClass('btn-primary'); + $('#st70_submit').text('Submitted'); + $('#st70_submit').prop('disabled', true); + }); + + $( "#a280_submit" ).click(function() { + upload_leaderboard('a280'); + $('#a280_submit').removeClass('btn-primary'); + $('#a280_submit').text('Submitted'); + $('#a280_submit').prop('disabled', true); + }); + + $( "#pcb442_submit" ).click(function() { + upload_leaderboard('pcb442'); + $('#pcb442_submit').removeClass('btn-primary'); + $('#pcb442_submit').text('Submitted'); + $('#pcb442_submit').prop('disabled', true); + }); + + $( "#dsj1000_submit" ).click(function() { + upload_leaderboard('dsj1000'); + $('#dsj1000_submit').removeClass('btn-primary'); + $('#dsj1000_submit').text('Submitted'); + $('#dsj1000_submit').prop('disabled', true); + }); + + // Initialize file uploader + // initialize with defaults + // $("#uploadfile").fileinput(); + + // with plugin options + $("#uploadfile").fileinput({ + // theme: "fa", + 'theme': 'fas', + showUpload:false, + previewFileType:'py', + maxFileCount: 1, + allowedFileExtensions: ["py"] + }); + + var url = window.location; + + // GET REQUEST + $("#btnGetFiles").click( (event) => { + event.preventDefault(); + ajaxGet(); + }); + + // DO GET + function ajaxGet(){ + $.ajax({ + type : "GET", + url : "/api/files/getall", + success: (data) => { + // clear old data + $("#listFiles").html(""); + // render list of files + $("#listFiles").append(''); + }, + error : (err) => { + $("#listFiles").html(err.responseText); + } + }); + } + + // Upload File + $('#uploadfile').change(function(e){ + if(e.target.files[0]) + { + var fileName = e.target.files[0].name; + if(fileName !== "my_model.py") + { + alert('Please upload my_model.py'); + $('#btnSubmit').prop('disabled', true); + } + else + { + $('#btnSubmit').prop('disabled', false); + } + } + }); + + // Submit results + $("#btnSubmit").click((event) => { + // stop submit the form, we will post it manually. + event.preventDefault(); + doAjax(); + }); +}) + +function upload_leaderboard(name) { + obj = {} + obj.name = name; + data = {} + if(name === 'ulysses16') { + data.fitness = my_res.ulysses16.fitness; + } + else if (name === 'att48') { + data.fitness = my_res.att48.fitness; + } + else if (name === 'st70') { + data.fitness = my_res.st70.fitness; + } + else if (name === 'a280') { + data.fitness = my_res.a280.fitness; + } + else if (name === 'pcb442') { + data.fitness = my_res.pcb442.fitness; + } + else if (name === 'dsj1000') { + data.fitness = my_res.dsj1000.fitness; + } + data.name = $('#submit_name').val(); + data.desc = $('#submit_desc').val() + data.time = Date.now() + obj.data = data; + socket.emit('submit', obj); +} + +function doAjax() { + // Get form + var form = $('#fileUploadForm')[0]; + + var data = new FormData(form); + var file = data.get('uploadfile'); + + var renameFile =new File([file], window.id + '.py' ,{type:file.type}); + var formdata = new FormData(); + + formdata.append('uploadfile', renameFile); + + if(window.id) { + $.ajax({ + type: "POST", + enctype: 'multipart/form-data', + url: "/api/files/upload", + data: formdata, + processData: false, //prevent jQuery from automatically transforming the data into a query string + contentType: false, + cache: false, + success: (data) => { + console.log('Emit build request') + socket.emit('build', {}); + }, + error: (e) => { + $("#listFiles").text(e.responseText); + } + }); + } + else + { + alert('Failed to connect to server'); + } +} \ No newline at end of file diff --git a/resources/static/js/postrequest.js b/resources/js/socket_script.js similarity index 57% rename from resources/static/js/postrequest.js rename to resources/js/socket_script.js index de19042..4a283af 100644 --- a/resources/static/js/postrequest.js +++ b/resources/js/socket_script.js @@ -1,7 +1,3 @@ -// warn the user when leaving -window.onbeforeunload = function(){ - return "Make sure to save your graph locally before leaving"; -}; var my_res = {}; my_res.ulysses16 = {} @@ -20,28 +16,32 @@ my_res.dsj1000.fitness = -1; var socket = io(); +// User connected socket.on('connect', () => { $("#status").removeClass('badge-secondary'); $("#status").addClass('badge-primary'); window.id = socket.id - console.log('Session Id: ', socket.id); // an alphanumeric id... + console.log('Session Id: ', socket.id); }); +// User disconnected socket.on('disconnect', () => { $("#status").removeClass('badge-primary'); $("#status").addClass('badge-secondary'); $("#status").text('offline'); }); - +// Update online users socket.on('users_count', (clients) => { $("#status").text(clients + ' online'); }); +// Server running algorithms socket.on('start', () => { console.log('Building start'); }); +// Update Leaderboard Table socket.on('leaderboard', (obj) => { console.log(obj); $(".leaderboard-table").find("tr:not(:first):not(:last)").remove(); @@ -88,7 +88,8 @@ socket.on('leaderboard', (obj) => { }); -socket.on('update', (msg) => { +// Log info in console +socket.on('info', (msg) => { // var msg = msg.replace(/\x1b[[0-9;]*[a-zA-Z]/g, ''); msg = msg.replace(/[^\x20-\x7E]/g, '') if(msg[1] == '[') { @@ -97,130 +98,52 @@ socket.on('update', (msg) => { console.log(msg); }); +// Update personal result socket.on('result', (res) => { - // console.log(res) res = JSON.parse(res); $('#submission_info').show(); res.forEach(e => { if(e.name === "ulysses16.txt") { my_res.ulysses16.fitness = e.fitness $("#ulysses16_your").text(e.fitness); - $('#ulysses16_submit').show(); + if(e.fitness > 0) { + $('#ulysses16_submit').show(); + } } if(e.name === "att48.txt") { my_res.att48.fitness = e.fitness $("#att48_your").text(e.fitness); - $('#att48_submit').show(); + if(e.fitness > 0) { + $('#att48_submit').show(); + } } if(e.name === "st70.txt") { my_res.st70.fitness = e.fitness $("#st70_your").text(e.fitness) - $('#st70_submit').show(); + if(e.fitness > 0) { + $('#st70_submit').show(); + } } if(e.name === "a280.txt") { my_res.a280.fitness = e.fitness $("#a280_your").text(e.fitness) - $('#a280_submit').show(); + if(e.fitness > 0) { + $('#a280_submit').show(); + } } if(e.name === "pcb442.txt") { my_res.pcb442.fitness = e.fitness $("#pcb442_your").text(e.fitness) - $('#pcb442_submit').show(); + if(e.fitness > 0) { + $('#pcb442_submit').show(); + } } if(e.name === "dsj1000.txt") { my_res.dsj1000.fitness = e.fitness $("#dsj1000_your").text(e.fitness) - $('#dsj1000_submit').show(); - } - }); -}); - -$(document).ready( () => { - $("#btnSubmit").click((event) => { - //stop submit the form, we will post it manually. - event.preventDefault(); - doAjax(); - }); - - $('#uploadfile').change(function(e){ - if(e.target.files[0]) - { - var fileName = e.target.files[0].name; - if(fileName !== "my_model.py") - { - alert('Please upload my_model.py'); - $('#btnSubmit').prop('disabled', true); - } - else - { - $('#btnSubmit').prop('disabled', false); + if(e.fitness > 0) { + $('#dsj1000_submit').show(); } } }); }); - -function upload_loaderboard(name) { - obj = {} - obj.name = name; - data = {} - if(name === 'ulysses16') { - data.fitness = my_res.ulysses16.fitness; - } - else if (name === 'att48') { - data.fitness = my_res.att48.fitness; - } - else if (name === 'st70') { - data.fitness = my_res.st70.fitness; - } - else if (name === 'a280') { - data.fitness = my_res.a280.fitness; - } - else if (name === 'pcb442') { - data.fitness = my_res.pcb442.fitness; - } - else if (name === 'dsj1000') { - data.fitness = my_res.dsj1000.fitness; - } - data.name = $('#submit_name').val(); - data.desc = $('#submit_desc').val() - data.time = Date.now() - obj.data = data; - socket.emit('submit', obj); -} - -function doAjax() { - - // Get form - var form = $('#fileUploadForm')[0]; - - var data = new FormData(form); - var file = data.get('uploadfile'); - - var renameFile =new File([file], window.id + '.py' ,{type:file.type}); - var formdata = new FormData(); - formdata.append('uploadfile', renameFile); - // console.log(formdata.get('uploadfile')) - if(window.id) { - $.ajax({ - type: "POST", - enctype: 'multipart/form-data', - url: "/api/files/upload", - data: formdata, - processData: false, //prevent jQuery from automatically transforming the data into a query string - contentType: false, - cache: false, - success: (data) => { - // $("#listFiles").text(data); - console.log('Emit build request') - socket.emit('build', {}); - }, - error: (e) => { - $("#listFiles").text(e.responseText); - } - }); - } - else - { - alert('Failed to connect to server'); - } -} \ No newline at end of file diff --git a/resources/static/preview.html b/resources/preview.html similarity index 100% rename from resources/static/preview.html rename to resources/preview.html diff --git a/resources/static/index.html b/resources/static/index.html deleted file mode 100644 index 473424a..0000000 --- a/resources/static/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - Document - - -
-

Hello

-
- -
-
-
-
-
-

Leader

- - -
-
-
- - \ No newline at end of file diff --git a/resources/static/js/getrequest.js b/resources/static/js/getrequest.js deleted file mode 100644 index 3ed2612..0000000 --- a/resources/static/js/getrequest.js +++ /dev/null @@ -1,142 +0,0 @@ -$( document ).ready( () => { - - $('body').scrollspy({ target: '#main-nav', offset: 130 }) - - $('#fullpage').fullpage({ - // anchors: ['underPage', 'gradPage', 'phdPage'], - sectionsColor: ['#ffffff', '#f8f8f8'], - autoScrolling: false, - css3: true, - fitToSection: false, - afterLoad: function(anchorLink, index) { - // history.pushState(null, null, ""); - // console.log(anchorLink); - } - }); - - $(".navbar a").on('click', function(event) { - // Make sure this.hash has a value before overriding default behavior - if (this.hash !== "") { - // Prevent default anchor click behavior - event.preventDefault(); - - // Store hash - var hash = this.hash; - - // Using jQuery's animate() method to add smooth page scroll - // The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area - var offset = 0; - if (hash === "#home") - { - offset = -100; - } - else { - offset = -60; - } - $('html, body').animate({ - scrollTop: ($(hash).offset().top + offset) - }, 1000, function(){ - // Add hash (#) to URL when done scrolling (default click behavior) - // window.location.hash = hash; - }); - } - }); - - $('#submission_info').hide(); - $('#ulysses16_submit').hide(); - $('#att48_submit').hide(); - $('#st70_submit').hide(); - $('#a280_submit').hide(); - $('#pcb442_submit').hide(); - $('#dsj1000_submit').hide(); - - $( "#ulysses16_submit" ).click(function() { - upload_loaderboard('ulysses16'); - $('#ulysses16_submit').removeClass('btn-primary'); - $('#ulysses16_submit').text('Submitted'); - $('#ulysses16_submit').prop('disabled', true); - }); - - $( "#att48_submit" ).click(function() { - upload_loaderboard('att48'); - $('#att48_submit').removeClass('btn-primary'); - $('#att48_submit').text('Submitted'); - $('#att48_submit').prop('disabled', true); - }); - - $( "#st70_submit" ).click(function() { - upload_loaderboard('st70'); - $('#st70_submit').removeClass('btn-primary'); - $('#st70_submit').text('Submitted'); - $('#st70_submit').prop('disabled', true); - }); - - $( "#a280_submit" ).click(function() { - upload_loaderboard('a280'); - $('#a280_submit').removeClass('btn-primary'); - $('#a280_submit').text('Submitted'); - $('#a280_submit').prop('disabled', true); - }); - - $( "#pcb442_submit" ).click(function() { - upload_loaderboard('pcb442'); - $('#pcb442_submit').removeClass('btn-primary'); - $('#pcb442_submit').text('Submitted'); - $('#pcb442_submit').prop('disabled', true); - }); - - $( "#dsj1000_submit" ).click(function() { - upload_loaderboard('dsj1000'); - $('#dsj1000_submit').removeClass('btn-primary'); - $('#dsj1000_submit').text('Submitted'); - $('#dsj1000_submit').prop('disabled', true); - }); - - // initialize with defaults - // $("#uploadfile").fileinput(); - - // with plugin options - $("#uploadfile").fileinput({ - // theme: "fa", - 'theme': 'fas', - showUpload:false, - previewFileType:'py', - maxFileCount: 1, - allowedFileExtensions: ["py"] - }); - - ConsoleLogHTML.connect(document.getElementById("console")); // Redirect log messages - // ConsoleLogHTML.disconnect(); // Stop redirecting - - var url = window.location; - - // GET REQUEST - $("#btnGetFiles").click( (event) => { - event.preventDefault(); - ajaxGet(); - }); - - // DO GET - function ajaxGet(){ - $.ajax({ - type : "GET", - url : "/api/files/getall", - success: (data) => { - //clear old data - $("#listFiles").html(""); - - /* - render list of files - */ - $("#listFiles").append(''); - }, - error : (err) => { - $("#listFiles").html(err.responseText); - } - }); - } -}) \ No newline at end of file diff --git a/resources/static/themes/explorer-fas/theme.css b/resources/themes/explorer-fas/theme.css similarity index 100% rename from resources/static/themes/explorer-fas/theme.css rename to resources/themes/explorer-fas/theme.css diff --git a/resources/static/themes/explorer-fas/theme.js b/resources/themes/explorer-fas/theme.js similarity index 100% rename from resources/static/themes/explorer-fas/theme.js rename to resources/themes/explorer-fas/theme.js diff --git a/resources/static/themes/explorer-fas/theme.min.css b/resources/themes/explorer-fas/theme.min.css similarity index 100% rename from resources/static/themes/explorer-fas/theme.min.css rename to resources/themes/explorer-fas/theme.min.css diff --git a/resources/static/themes/explorer-fas/theme.min.js b/resources/themes/explorer-fas/theme.min.js similarity index 100% rename from resources/static/themes/explorer-fas/theme.min.js rename to resources/themes/explorer-fas/theme.min.js diff --git a/resources/static/themes/fas/theme.js b/resources/themes/fas/theme.js similarity index 100% rename from resources/static/themes/fas/theme.js rename to resources/themes/fas/theme.js diff --git a/resources/static/themes/fas/theme.min.js b/resources/themes/fas/theme.min.js similarity index 100% rename from resources/static/themes/fas/theme.min.js rename to resources/themes/fas/theme.min.js diff --git a/resources/static/thumbnail.png b/resources/thumbnail.png similarity index 100% rename from resources/static/thumbnail.png rename to resources/thumbnail.png diff --git a/resources/static/trash-icon.png b/resources/trash-icon.png similarity index 100% rename from resources/static/trash-icon.png rename to resources/trash-icon.png diff --git a/resources/static/upload-icon.png b/resources/upload-icon.png similarity index 100% rename from resources/static/upload-icon.png rename to resources/upload-icon.png diff --git a/server.js b/server.js index f147522..4f3c32c 100644 --- a/server.js +++ b/server.js @@ -1,28 +1,32 @@ const fs = require('fs') + +// Web Server var express = require('express') var app = express() var router = express.Router() + +// Upload Files var upload = require('./app/config/multer.config.js') - -const {Docker} = require('node-docker-api') -const { time } = require('console') -const lineReader = require('line-reader'); - -const docker = new Docker({ socketPath: '/var/run/docker.sock' }) -const stripAnsi = require('strip-ansi'); - -global.__basedir = __dirname +// Static Website app.use(express.static('resources')) var http = require('http').createServer(app) var io = require('socket.io')(http) + +// Docker Container +const {Docker} = require('node-docker-api') +const docker = new Docker({ socketPath: '/var/run/docker.sock' }) -var readlineSync = require('readline-sync'); +// Console Log +const stripAnsi = require('strip-ansi') -const path = require('path'); +// Set up directories +global.__basedir = __dirname +const path = require('path') current_path = process.cwd() +// Initialize Leaderboard var leaderboard = {} leaderboard.ulysses16 = [] leaderboard.att48 = [] @@ -31,7 +35,31 @@ leaderboard.a280 = [] leaderboard.pcb442 = [] leaderboard.dsj1000 = [] +var write_leaderboard = () => { + fs.writeFile('leaderboard.json', JSON.stringify(leaderboard), (err) => { + if (err) throw err + console.log('Data written to file') + }) +} + +// Read from JSON file first if exists +try { + if (fs.existsSync('leaderboard.json')) { + //file exists + console.log("Existed leaderboard") + leaderboard = require('./leaderboard.json') + console.log(leaderboard) + } + else { + write_leaderboard() + } +} +catch(err) { + console.error(err) +} + var update_leaderboard = (obj) => { + // Update each TSP entry if(obj.name === 'ulysses16') { leaderboard.ulysses16.push(obj.data) } @@ -50,6 +78,8 @@ var update_leaderboard = (obj) => { else if (obj.name === 'dsj1000') { leaderboard.dsj1000.push(obj.data) } + + // Only accept top 10 results leaderboard.ulysses16.sort(function(a, b){return a.fitness - b.fitness}) leaderboard.ulysses16 = leaderboard.ulysses16.slice(0,10) @@ -68,69 +98,45 @@ var update_leaderboard = (obj) => { leaderboard.dsj1000.sort(function(a, b){return a.fitness - b.fitness}) leaderboard.dsj1000 = leaderboard.dsj1000.slice(0,10) + // Write to json file write_leaderboard() } -var write_leaderboard = () => { - fs.writeFile('leaderboard.json', JSON.stringify(leaderboard), (err) => { - if (err) throw err; - console.log('Data written to file'); - }); -} - -try { - if (fs.existsSync('leaderboard.json')) { - //file exists - leaderboard = require('./leaderboard.json'); - console.log(leaderboard); - } - else { - write_leaderboard(); - } -} -catch(err) { - console.error(err) -} - -var res = []; - +// Get submission results var update_submission = (socket, sessionID) => { - console.log('check result') var output_dir = current_path.toString() + '/output/' + sessionID + '/' console.log(output_dir) if (output_dir.length != 0) { - res = [] - socket.emit('update', 'Got output') + var res = [] + socket.emit('info', 'Got output') + + // Read output dir fs.readdir(output_dir, (err, files) => { if (err) { - console.log(err); - return; - } - console.log('iterate') + console.log(err) + return + } + // Read each result in txt file files.forEach(file => { - console.log(file) - console.log(path.extname(file)) if (path.extname(file) === '.txt') { - var i = 0 + + // Result object var obj = {} obj.name = file - console.log(output_dir + file) try { // read contents of the file - const data = fs.readFileSync(output_dir + file, 'UTF-8'); + const data = fs.readFileSync(output_dir + file, 'UTF-8') // split the contents by new line - const lines = data.split(/\r?\n/); + const lines = data.split(/\r?\n/) - // print all lines lines.forEach((line) => { - console.log(line) i = i + 1 - // console.log(line) + // The first line is the fitness if(i == 1) { var fitness = parseFloat(line) if(fitness < 0) { @@ -140,11 +146,13 @@ var update_submission = (socket, sessionID) => { obj.fitness = fitness } } + // The second line is the path else if (i == 2) { + // Only read when there is no error if(obj.fitness > 0) { - solution_array = line.split(","); + solution_array = line.split(",") for(var j = 0; j < solution_array.length; j++) { - solution_array[i] = parseInt(solution_array[i], 10); + solution_array[i] = parseInt(solution_array[i], 10) } obj.solution = solution_array } @@ -152,21 +160,20 @@ var update_submission = (socket, sessionID) => { obj.solution = [] } } - }); + }) } catch (err) { - console.error(err); + console.error(err) } res.push(obj) } - }); - // console.log(res) + }) socket.emit('result', JSON.stringify(res)) - }); + }) } else { console.log('no result') } -}; +} var docker_build = (socket, sessionID) => { @@ -174,131 +181,117 @@ var docker_build = (socket, sessionID) => { socket.emit('start') fs.mkdir(current_path + '/output/' + sessionID.toString(), () => { - socket.emit('update', 'Output directort created.') - socket.emit('update', 'Test started, this may take a while.') + socket.emit('info', 'Output directort created.') + socket.emit('info', 'Test started, this may take a while.') }) - { - if (fs.existsSync(current_path.toString() + '/uploads/' + sessionID.toString() + '/requirements.txt')) - { - //file exists - docker.container.create({ - Image: 'com2014-tsp', - HostConfig: { - Binds: [ - '/uploads/' + sessionID.toString() + '/requirements.txt:/tsp/requirements.txt', - '/uploads/' + sessionID.toString() + '/my_model.py:/tsp/model/my_model.py', - "/output/" + sessionID.toString() + "/:/output/" - ] - } - }) - .then( (container) => { - container_id = container.data.Id - socket.emit('update','Container Id: ' + container_id) - return container.start() - }) - .then(container => container.logs({ - follow: true, - stdout: true, - stderr: true - })) - .then(stream => { - stream.on('data', info => socket.emit('update', new Buffer.from(info).toString('ascii'))) - stream.on('error', err => console.log(err)) - }) - .catch(error => console.log(error)) - } - else - { - docker.container.create({ - Image: 'com2014-tsp', - HostConfig: { - Binds: [ - '/uploads/' + sessionID.toString() + '/my_model.py:/tsp/model/my_model.py', - "/output/" + sessionID.toString() + "/:/output/" - ] - } - }) - .then( (container) => { - container_id = container.data.Id - socket.emit('update','Container Id: ' + container_id) - return container.start() - }) - .then(container => container.logs({ - follow: true, - stdout: true, - stderr: true - })) - .then(stream => { - stream.on('data', (info) => { - console.log(stripAnsi(new Buffer.from(info).toString())) - socket.emit('update', stripAnsi(new Buffer.from(info).toString('ascii'))) - }), - stream.on('error', err => console.log(err)) - }) - .catch(error => console.log(error)) - } - var intervalObj; - var timeoutObj; + docker.container.create({ + Image: 'com2014-tsp', + HostConfig: { + Binds: [ + '/uploads/' + sessionID.toString() + '/my_model.py:/tsp/model/my_model.py', + "/output/" + sessionID.toString() + "/:/output/" + ] + } + }) + .then( (container) => { + // Start container + container_id = container.data.Id + socket.emit('info','Container Id: ' + container_id) + return container.start() + }) + .then(container => container.logs({ + follow: true, + stdout: true, + stderr: true + })) + .then(stream => { + // Write container logs to client + stream.on('data', (info) => { + console.log(stripAnsi(new Buffer.from(info).toString())) + socket.emit('info', stripAnsi(new Buffer.from(info).toString('ascii'))) + }), + stream.on('error', (err) => { + console.log(err) + socket.emit('info', stripAnsi(new Buffer.from(err).toString('ascii'))) + }) + }) + .catch(error => console.log(error)) - intervalObj = setInterval(() => { - if(!finished) - { - docker.container.list({all:true}) - // Inspect - .then((containers) => { - containers.forEach(container => { - if(container.data.Id == container_id) { - socket.emit('update', 'Container Status: ' + container.data.State) - if(container.data.State === 'exited') - { - finished = true; - clearInterval(intervalObj); - clearTimeout(timeoutObj); - socket.emit('update', 'Test end') - update_submission(socket, sessionID); - } + // Check if container is still running + var intervalObj + + // Timeout (each container runs only for 60s at most) + var timeoutObj + + var finished = false + + // Check if container is still running + intervalObj = setInterval(() => { + if(!finished) + { + docker.container.list({all:true}) + .then((containers) => { + containers.forEach(container => { + if(container.data.Id == container_id) { + socket.emit('info', 'Container Status: ' + container.data.State) + if(container.data.State === 'exited') + { + // Finished Running + finished = true + clearInterval(intervalObj) + clearTimeout(timeoutObj) + socket.emit('info', 'Container exited') + // Get submission results + update_submission(socket, sessionID) } - }); + } }) - .catch(error => console.log(error)) - } - }, 2000); + }) + .catch(error => console.log(error)) + } + }, 2000) - var finished = false - // call the rest of the code and have it execute after 3 seconds - timeoutObj = setTimeout(() => { - console.log('end') - if(!finished) - { - clearInterval(intervalObj); - socket.emit('update', 'timeout') - } - }, 20000) - } + // Timeout (each container runs only for 60s at most) + timeoutObj = setTimeout(() => { + console.log('end') + if(!finished) + { + clearInterval(intervalObj) + socket.emit('info', 'timeout') + } + }, 60000) } var clients = 0 io.on('connection', (socket) => { + // New client connected const sessionID = socket.id console.log('[client][connection]', sessionID) + + // Update client number clients = clients + 1 io.sockets.emit('users_count', clients) - console.log(leaderboard) + + // Inform new client the leaderboard + // console.log(leaderboard) socket.emit('leaderboard', leaderboard) + // Client disconnected socket.on('disconnect', () => { clients = clients - 1 console.log('[client][disconnect]', sessionID) io.sockets.emit('users_count', clients) }) + // Client request a build socket.on('build', () => { console.log('[client][build]', sessionID) docker_build(socket, sessionID) }) + // Client submited a new result socket.on('submit', (obj) => { console.log('[client][submit]', sessionID) update_leaderboard(obj)