From 75d136abe60c19652871aa8aa656cece1bc45b15 Mon Sep 17 00:00:00 2001 From: nalbam Date: Sat, 17 Aug 2019 12:22:23 +0900 Subject: [PATCH] add --- .gitignore | 16 +++-- package.json | 30 +++++++++ report.sh | 24 ++++++++ server.js | 151 ++++++++++++++++++++++++++++++++++++++++++++++ views/favicon.ico | Bin 0 -> 4504 bytes views/index.ejs | 19 ++++++ 6 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 package.json create mode 100644 server.js create mode 100644 views/favicon.ico create mode 100644 views/index.ejs diff --git a/.gitignore b/.gitignore index ad4673bdb..e2414f403 100755 --- a/.gitignore +++ b/.gitignore @@ -14,15 +14,19 @@ $RECYCLE.BIN/ # Mac .DS_Store -# java -*.class -*.jar -*.war -*.ear +# nodejs +node_modules/ +package-lock.json +nohup.out -# maven +# python +__pycache__ +.pytest_cache + +# build target/ build/ +dist/ # eclipse .settings/ diff --git a/package.json b/package.json new file mode 100644 index 000000000..f6061ee9e --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "deepracer-league", + "version": "0.0.1", + "description": "Node.js deepracer-league", + "main": "server.js", + "dependencies": { + "ejs": "^2.6.1", + "express": "^4.16.4", + "redis": "^2.8.0", + "request": "^2.88.0", + "socket.io": "^2.1.1" + }, + "engine": { + "node": "*", + "npm": "*" + }, + "scripts": { + "build": "npm install -s", + "start": "node server.js" + }, + "repository": { + "type": "git", + "url": "http://github.com/nalbam/deepracer-league.git" + }, + "author": "Jungyoul Yu ", + "bugs": { + "url": "http://github.com/nalbam/deepracer-league/issues" + }, + "homepage": "http://github.com/nalbam/deepracer-league" +} diff --git a/report.sh b/report.sh index 2fa496e16..cf25491a7 100755 --- a/report.sh +++ b/report.sh @@ -232,6 +232,29 @@ _message() { fi } +_json() { + _command "_json" + + JSON=${SHELL_DIR}/cache/points.json + + echo "{\"deepracer\":[" > ${JSON} + + IDX=1 + while read LINE; do + ARR=(${LINE}) + + if [ "${IDX}" != "1" ]; then + echo "," >> ${JSON} + fi + + echo "{\"no\":${IDX},\"name\":\"${ARR[1]}\",\"point\":${ARR[0]}}" >> ${JSON} + + IDX=$(( ${IDX} + 1 )) + done < ${SHELL_DIR}/build/points.log + + echo "]}" >> ${JSON} +} + _git_push() { _command "_git_push" @@ -268,6 +291,7 @@ __main__() { _build _message + _json if [ ! -z ${CHANGED} ]; then _git_push diff --git a/server.js b/server.js new file mode 100644 index 000000000..44394baa3 --- /dev/null +++ b/server.js @@ -0,0 +1,151 @@ +'use strict'; + +const TRACER = process.env.TRACER || 'none'; + +// datadog tracer +if (TRACER === 'all' || TRACER === 'datadog') { + require('dd-trace').init({ + hostname: process.env.DD_AGENT_HOST, + port: process.env.DD_AGENT_PORT, + analytics: true + }) +} + +// newrelic tracer +if (TRACER === 'all' || TRACER === 'newrelic') { + require('newrelic'); +} + +const os = require('os'), + cors = require('cors'), + express = require('express'), + moment = require('moment-timezone'), + redis = require('redis'); + +// express +const app = express(); +app.set('view engine', 'ejs'); + +app.use(cors()); +app.use(express.json()); +app.use('/favicon.ico', express.static('views/favicon.ico')); +app.use('/counter.js', express.static('views/counter.js')); + +// env +const PORT = process.env.PORT || 3000; +const PROFILE = process.env.PROFILE || 'default'; +const REDIS_URL = process.env.REDIS_URL || `redis://sample-node-redis:6379`; +const MESSAGE = process.env.MESSAGE || PROFILE; +const IMAGE_TAG = process.env.IMAGE_TAG || 'v0.0.0'; + +// redis +const retry_strategy = function(options) { + if (options.error && (options.error.code === 'ECONNREFUSED' || options.error.code === 'NR_CLOSED')) { + // Try reconnecting after 5 seconds + console.error('The server refused the connection. Retrying connection...'); + return 5000; + } + if (options.total_retry_time > 1000 * 60 * 60) { + // End reconnecting after a specific timeout and flush all commands with an individual error + return new Error('Retry time exhausted'); + } + if (options.attempt > 50) { + // End reconnecting with built in error + return undefined; + } + // reconnect after + return Math.min(options.attempt * 100, 5000); +}; +const client = redis.createClient(REDIS_URL, {retry_strategy: retry_strategy}); +client.on('connect', () => { + console.log(`connected to redis: ${REDIS_URL}`); +}); +client.on('error', err => { + console.error(`${err}`); +}); + +app.get('/', function (req, res) { + // console.log(`${req.method} ${req.path}`); + let host = os.hostname(); + let date = moment().tz('Asia/Seoul').format(); + res.render('index.ejs', {host: host, date: date, message: MESSAGE, version: IMAGE_TAG}); +}); + +app.get('/stress', function (req, res) { + // console.log(`${req.method} ${req.path}`); + let sum = 0; + for (let i = 0; i < 1000000; i++) { + sum += Math.sqrt(i); + } + return res.status(200).json({sum : sum}); +}); + +app.get('/cache/:name', function (req, res) { + // console.log(`${req.method} ${req.path}`); + const name = req.params.name; + return client.get(`cache:${name}`, (err, result) => { + if (err) { + console.error(`${err}`); + return res.status(500).json({status:500, message:err.message,}); + } + return res.status(200).json(result == null ? {} : JSON.parse(result)); + }); +}); + +app.post('/cache/:name', function (req, res) { + // console.log(`${req.method} ${req.path}`); + const name = req.params.name; + const json = JSON.stringify(req.body); + //console.log(`req.body: ${json}`); + return client.set(`cache:${name}`, json, (err, result) => { + if (err) { + console.error(`${err}`); + return res.status(500).json({status:500, message:err.message,}); + } + return res.status(200).json(result == null ? {} : result); + }); +}); + +app.get('/counter/:name', function (req, res) { + // console.log(`${req.method} ${req.path}`); + const name = req.params.name; + return client.get(`counter:${name}`, (err, result) => { + res.setHeader('Content-Type', 'text/plain; charset=UTF-8'); + if (err) { + console.error(`${err}`); + return res.status(500).send(err.message); + } + return res.send(result == null ? '0' : result.toString()); + }); +}); + +app.post('/counter/:name', function (req, res) { + // console.log(`${req.method} ${req.path}`); + const name = req.params.name; + return client.incr(`counter:${name}`, (err, result) => { + res.setHeader('Content-Type', 'text/plain; charset=UTF-8'); + if (err) { + console.error(`${err}`); + return res.status(500).send(err.message); + } + return res.send(result == null ? '0' : result.toString()); + }); +}); + +app.delete('/counter/:name', function (req, res) { + // console.log(`${req.method} ${req.path}`); + const name = req.params.name; + return client.decr(`counter:${name}`, (err, result) => { + res.setHeader('Content-Type', 'text/plain; charset=UTF-8'); + if (err) { + console.error(`${err}`); + return res.status(500).send(err.message); + } + return res.send(result == null ? '0' : result.toString()); + }); +}); + +app.listen(PORT, function () { + console.log(`[${PROFILE}] Listening on port ${PORT}!`); + console.log(`connecting to redis: ${REDIS_URL}`); +}); diff --git a/views/favicon.ico b/views/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ae131335634870289f3f13cc581b9a3482e7dbef GIT binary patch literal 4504 zcmV;J5ohj+P)|6H7!-q zQq)jtTGd4iX|=|-D6J-@Qeqw&gd~KBp~RE~k^cTC`#bsWzWdyJ?tSmR7wP@h`rbEx zdpP^-v-dvdzPaY=Oqela#!%4U1D|_tFBmUR;}djzRZvmD+<+3uK96ORATZgSOvW_Y z_&nMaj`o0`?&RL^QzZMKdB~oXW~KO&UGQHr9^*FVkVVayv45ZNwcQ*QfNwwIH=KzqnG8d2KT$=*PilWCgp>0sNv9xn#MeaCD^dW< zf_*YB{ILYi$D6-QJWW{$8~}dXnpK02!S-BaU(?!a{guf$so!=4moo?GX^t<&s*hEm zIZLi6$P7lkv+3$lAaJ@ogC&y&S1n2>hD*&aR=dHX? zjDhC0bGp*33d_4rQEH-SW^jBYFO2-5bY(y}b3bz5DM5u8MDlmhkBW4M$yd5EkeB9y zE~XMcN(DQg9{7AAA9Nd}e6c^0(zkW3?E$VwPjHH^RRV@JT{_8@2R8$cO(c$0y&}b1 z4HZoAeNlpx_*P0OofT$FluSmy1CqH|_t}Y=c?}fEOGPV8$&`?$2Byg-LOH;K^&Y}gN)llqn zVu5dk+A3i!GTG>?3y6kBd}IbkA9lRh)74soV4J_fC$6oGzFJOR&*_I-Tt%`1p{PYk zcWRrBD2(TUi^$0pT*b<6kc|jDrlGL;Eq_d#lc=w~x+mx~h!ztc!RNR<9_iX*y9d7f zJ;05S+I?5uWpxyLHq#T?U6%@^utm}9PSi9m>Ur5>*a^jYv9byIP+~4G88?PmVYQOJ z_1$RnJm5ujdb%sjgX-6|ga6)-ynNR?l+g{goB zb$?U=#9SH0J%qeTq$?CdjuitPf#Zc>|5Si{ssP7}Q_cl=13>;SJs$(+D57S#f12@t);@Wczn>2=oi+;ZEld z2c-Uw)geV)Tz2M}^2u~KW@FwQT%fU6%Z9MKDIz*B*q@R<@M}jtrq`)Rhd}vj0@+u0 zC2Ryg#LE`!bQP?#uj>qb;a?1LMUOh4X4pHdyqM0A z6HJk!bBQ^|LwP@?nFr@Ytb(2t-;^Lz%$wR?4>L#e|&>yqj!%U`}BG2=AI3JfX zR;?7|L?WH2Ys05X##Fj^IOy2_RIsD)LlRsB_9~fZ4I1`>_f0m)JJjQ8yiSLv)blH8 z*N#^ouQdWo(kShiGw4u*Xv~6SNxeP_>AQx|pu8Q)dnoj}j#%|#W<@Y{^sCw)u0Jh? z2g$!Zs2gfLsPn-JpuQ{6rq?QzjS5Nvwi<3%y(r`o@btjHnJDz8M(bbYPts03=txvj zs%$7hw-0vhbp3uSsAuF`oaB%TJ<$)^AJi;o$H3w>qiGn5wiFmfS%oQNeeecQw?Jxh zmmgsjHi%@}pxGu3b|z3lf4H$hY&oGGS*s{Wj|x4XHcu3qfBRdymuZNOv~P~FhI)Wd=XW0gKT{ZR$r_XkfP&HKx5W+ zZ>9I8OM@o`-P(cHBbo#zIH$>uug_AEqkV5Q!5>P@y)JGCm5MBVGcYy8pGB}%3(A$O zqihDcSu?;{52rET5u6s*M!{5&}yhTkyLH1|hWr4PA2CD+;T zKS`wd47+v*l|VolSfjv6H@iW$jX?ORDOyagt87V-LZQ=K;X}<4ogL@?82)qTQ^mR% zvn?eZf<6Ig1#DwwR!~Y(rOyo|{?&}g-vcKG{cX^pflrZr6^G%`V9bXba>a8k72J%@ z>Y1dL(2U4Bu<&pz!d714c^4;jzEAQ#oy}XBM)Q>d1zB(YTt?(wAYV7fK*vJIL^=~~ zRvHo%14YT>r(W|l`iwD6(qjwbC|GZ>v!}6~#3x`2bVU=xK_M>t^3@7Tdfo)NM9(DM-$3#B8OYZv76W7r-kr(URQ#Do;<0UF%QifBn^dVy1oV+06qXd4tjV5 zK_BCN;gvB@p6Af58T7Y9M+IKnfDy#!S2XC`q}>DU9%%PKy9e4m(C&eD545@mD%L%% zF07ULS!-z@q^-0LGFAhZ2Uh^~Zz2`~7XW*MdS(9^I0e)$Qm9?y#0XzP9?cr9)`18v zZK&u0F2shQULd~JifYnFP6*cadFx%fjbil4O@f>i~jy1JI(RvSYAa~QB zm4!NKXSE5aJ9QCIccgYhG1YmKj#kEiFEz7cYUlz{G5KqXh|#7FuTSZE5nBc{O>GCZ zbaa-eh&p(EP+MM|BzDFi(YE*^@DwhXKlDRY4GmqO>hSU!F0M{9{RK4ME~LI!I|J0k znH}J5Dsd`!c?&D^I=MIJLcLN{MweZnq6&n&@&@dC6#4ug=&#};rH;#M9}k!97&=*Z zgYE=dDHZYFu9*Jd{@|Pfn!fb@d~r}SMkAo##%vo0G@2xi&twu$1y!+034AM|lb_x~ z%?TIhOxltC_dNPQFMyT`RI`(o`TqjTfW99%v5aHOeW=KF;G6*2%V-+1AoyU^ApL?e zdnpDzDY6xbqg&qjaRJn1esD3cAGk93PjF6vJJePhqOUB^0JY?nJP5Q8QZ5O)rO}mv z>GJoW-FMSKiHg_r#-2gqi{xdnX;ri+I48i!&DVL40b1sp>SRN4B++o^j_fE;P1f8z#~8%#i;Z2Rr3_Ev%x=q z^uH4Iq2vjn%oX5uR(ETVd&1i@3AQFweNbHY4kF#r6m)?K>qOAE8yfwF+O^l@8I3yU zQl}pb-U(at4#h|Ag5jY2byU+?FwzoHFD-&}6f_7r4!TmXjSO^CsP681@GiN^e=bO2 z`WXKmush)v3fC%0tDx+2#O|z&D|>tOHuCqKE@syaK0k{M1@evcu3&B_f&Q;e+1s+9 zybh^9B6<~2%X57>6~h-O^tp0=_zK?}+!oaTRlUY-&px zNPc0d-EI|-?E#cpDt0#Lba(=&LqemTpTKRdsZOKw3dkYi9muvVK2J!8&w>z*yzL}+ zF=#p(OkKvN%B60bp}z;r2T{t;=?0KXA9&RU5`PEm47i3Q4>g$RCj2)AKa1k@5FTJP zhu5^H5Bg^p(4s&;ftt`{g`T#y#WZymw|neVAm4|6Yfvw&)&jGY4b)%=%vqpbA(Vl? z;iOIM{a{ZQpi#9Dqw87e=m1@)Pr;of2Y3^D0I22l%HR!PSHeORrWKgB7|ppo?iozE>%d0IRejEZbW znxPJjr$@Qhy8G*->#%t`8T$FQqzNJHE-k!Wy8 zrs*&SU7&-&(XqkFTG9H!=1iqne>$L_I}R@uRpdlvhJhaP=LgDDydlAVitejEH}XXZ zzgntQqj>)yf7xs#&@sOD5JjN6@5l@<-m-jNM32vbvY0sX14Txr+qb zmQ8}+Vcfcx#s1{^89M(=i(O(_Zz?N}n#iF#jssVWoeN~GI!`XJsco9l&IJ1u`E;UQ zQ?l;*3#ikj&E!p9ASI$9J3#&fR@@b`1$ZBNJ7}w}Dez-KRp=Ee^d7WRfV#{_qKCkN zH4 + + + + + + AWS DeepRacer League + + + + + + + + + +