mirror of
				https://gitlab.com/MrFry/mrfrys-node-server
				synced 2025-04-01 20:24:18 +02:00 
			
		
		
		
	Merge branch 'master' of gitlab.com:MrFry/mrfrys-node-server
This commit is contained in:
		| @@ -4,5 +4,6 @@ dist | |||||||
| stats | stats | ||||||
| data | data | ||||||
| publicDirs | publicDirs | ||||||
|  | nextStatic | ||||||
| devel | devel | ||||||
| .git | .git | ||||||
|   | |||||||
| @@ -1,7 +1,9 @@ | |||||||
| #!/bin/bash | #!/bin/bash | ||||||
|  |  | ||||||
| hr() { | hr() { | ||||||
|   printf '\033[0;32m%*s\033[0m\n' "$(tput cols)" '' | tr ' ' '=' |   if [ -t 0 ]; then | ||||||
|  |     printf '\033[0;32m%*s\033[0m\n' "$(tput cols)" '' | tr ' ' '=' | ||||||
|  |   fi | ||||||
| } | } | ||||||
|  |  | ||||||
| log() { | log() { | ||||||
| @@ -80,16 +82,14 @@ touch publicDirs/qminingPublic/version | |||||||
| touch publicDirs/qminingPublic/motd | touch publicDirs/qminingPublic/motd | ||||||
|  |  | ||||||
| if [ -z "$(ls -A ./data/dbs)" ]; then | if [ -z "$(ls -A ./data/dbs)" ]; then | ||||||
|  |   log "Making DB-s" | ||||||
|   pushd src/standaloneUtils |   pushd src/standaloneUtils | ||||||
|   NS_LOGLEVEL=2 node dbSetup.js |   NS_LOGLEVEL=2 node dbSetup.js | ||||||
|   mv *.db ../../data/dbs |   mv *.db ../../data/dbs | ||||||
|   popd |   popd | ||||||
| fi | fi | ||||||
|  |  | ||||||
|  | log "Disabling next telemetry" | ||||||
| npx --yes next telemetry disable | npx --yes next telemetry disable | ||||||
|  |  | ||||||
| hr | log "Done!" | ||||||
| echo "Done!" |  | ||||||
| echo "npm start {loglevel}" |  | ||||||
| echo "To start server" |  | ||||||
| hr |  | ||||||
|   | |||||||
| @@ -21,14 +21,18 @@ elif [ "$1" == "stop" ]; then | |||||||
|   docker stop $(getContainerId) |   docker stop $(getContainerId) | ||||||
| elif [ "$1" == "start" ]; then | elif [ "$1" == "start" ]; then | ||||||
|   # --entrypoint bash \ |   # --entrypoint bash \ | ||||||
|   docker start -i $(getContainerId) |   scripts/setup.sh | ||||||
|  |   docker start $(getContainerId) | ||||||
| elif [ "$1" == "run" ]; then | elif [ "$1" == "run" ]; then | ||||||
|   # --entrypoint bash \ |   # --entrypoint bash \ | ||||||
|   docker run -it \ |   scripts/setup.sh | ||||||
|     -p 8080:80 \ |  | ||||||
|     --mount src="$(pwd)/stats",target=/server/stats,type=bind \ |   docker run \ | ||||||
|     --mount src="$(pwd)/data",target=/server/data,type=bind \ |     --network host \ | ||||||
|     --mount src="$(pwd)/publicDirs",target=/server/publicDirs,type=bind \ |     --mount src="$(pwd)/stats",target="/server/stats",type=bind \ | ||||||
|  |     --mount src="$(pwd)/data",target="/server/data",type=bind \ | ||||||
|  |     --mount src="$(pwd)/publicDirs",target="/server/publicDirs",type=bind \ | ||||||
|  |     --mount src="/etc/letsencrypt",target="/etc/letsencrypt",type=bind \ | ||||||
|     qminer/mrfrys-node-server |     qminer/mrfrys-node-server | ||||||
| elif [ "$1" == "bash" ]; then | elif [ "$1" == "bash" ]; then | ||||||
|   docker exec -it $(getContainerId) /bin/bash |   docker exec -it $(getContainerId) /bin/bash | ||||||
|   | |||||||
| @@ -74,7 +74,8 @@ const filterFromDailyStats = [ | |||||||
|   '.xml', |   '.xml', | ||||||
|   '.aspx', |   '.aspx', | ||||||
|   '/questionDbs/', |   '/questionDbs/', | ||||||
|   '/chatFiles/' |   '/chatFiles/', | ||||||
|  |   'rss' | ||||||
| ] | ] | ||||||
|  |  | ||||||
| // ----------------------------------------------------------------- | // ----------------------------------------------------------------- | ||||||
| @@ -291,165 +292,180 @@ function pCols(cols, rowTitles, colorNames, firstRowColor) { | |||||||
|  |  | ||||||
| // ------------------------------------------------------------------------------ | // ------------------------------------------------------------------------------ | ||||||
| printHeader('Daily stats') | printHeader('Daily stats') | ||||||
|  | try { | ||||||
| const dailyStats = readJSON(`${dir}stats/vstats`) |   const dailyStats = readJSON(`${dir}stats/vstats`) | ||||||
| function preProcessDailyStats(obj) { |   function preProcessDailyStats(obj) { | ||||||
|   const formatted = Object.keys(obj).reduce((acc, key) => { |     const formatted = Object.keys(obj).reduce((acc, key) => { | ||||||
|     const includes = filterFromDailyStats.some((keyword) => { |       const includes = filterFromDailyStats.some((keyword) => { | ||||||
|       return key.toLowerCase().includes(keyword.toLowerCase()) |         return key.toLowerCase().includes(keyword.toLowerCase()) | ||||||
|     }) |  | ||||||
|     if (!includes) { |  | ||||||
|       acc.push({ name: key.replace(/\.html/g, ''), val: obj[key] }) |  | ||||||
|     } |  | ||||||
|     return acc |  | ||||||
|   }, []) |  | ||||||
|  |  | ||||||
|   const merged = formatted.reduce((acc, x) => { |  | ||||||
|     const index = acc.findIndex((y) => { |  | ||||||
|       return x.name === y.name |  | ||||||
|     }) |  | ||||||
|  |  | ||||||
|     if (index !== -1) { |  | ||||||
|       acc = acc.map((z, i) => { |  | ||||||
|         if (i === index) { |  | ||||||
|           return { |  | ||||||
|             ...x, |  | ||||||
|             val: z.val + x.val, |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|         return z |  | ||||||
|       }) |       }) | ||||||
|     } else { |       if (!includes) { | ||||||
|       acc.push(x) |         acc.push({ name: key.replace(/\.html/g, ''), val: obj[key] }) | ||||||
|     } |       } | ||||||
|  |       return acc | ||||||
|  |     }, []) | ||||||
|  |  | ||||||
|     return acc |     const merged = formatted.reduce((acc, x) => { | ||||||
|   }, []) |       const index = acc.findIndex((y) => { | ||||||
|  |         return x.name === y.name | ||||||
|  |       }) | ||||||
|  |  | ||||||
|   return merged.sort((a, b) => { |       if (index !== -1) { | ||||||
|     if (a.name > b.name) { |         acc = acc.map((z, i) => { | ||||||
|       return 1 |           if (i === index) { | ||||||
|     } else if (a.name < b.name) { |             return { | ||||||
|       return -1 |               ...x, | ||||||
|     } else { |               val: z.val + x.val, | ||||||
|       return 0 |             } | ||||||
|     } |           } | ||||||
|   }) |           return z | ||||||
|  |         }) | ||||||
|  |       } else { | ||||||
|  |         acc.push(x) | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       return acc | ||||||
|  |     }, []) | ||||||
|  |  | ||||||
|  |     return merged.sort((a, b) => { | ||||||
|  |       if (a.name > b.name) { | ||||||
|  |         return 1 | ||||||
|  |       } else if (a.name < b.name) { | ||||||
|  |         return -1 | ||||||
|  |       } else { | ||||||
|  |         return 0 | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |   function getDailyStat(day) { | ||||||
|  |     return preProcessDailyStats(dailyStats[getDayIndex(day)]) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   pCols( | ||||||
|  |     [ | ||||||
|  |       ...[...Array(colsToPrint).keys()].map((x) => { | ||||||
|  |         return getDailyStat(-x) | ||||||
|  |       }), | ||||||
|  |     ], | ||||||
|  |     null, | ||||||
|  |     true | ||||||
|  |   ) | ||||||
|  | } catch (e) { | ||||||
|  |   console.error(e) | ||||||
| } | } | ||||||
| function getDailyStat(day) { |  | ||||||
|   return preProcessDailyStats(dailyStats[getDayIndex(day)]) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| pCols( |  | ||||||
|   [ |  | ||||||
|     ...[...Array(colsToPrint).keys()].map((x) => { |  | ||||||
|       return getDailyStat(-x) |  | ||||||
|     }), |  | ||||||
|   ], |  | ||||||
|   null, |  | ||||||
|   true |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // ------------------------------------------------------------------------------ | // ------------------------------------------------------------------------------ | ||||||
| printHeader('User id test solving') | printHeader('User id test solving') | ||||||
| const userIdTestSolving = readJSON(`${dir}stats/idvstats`) | try { | ||||||
| function preProcessUIdTestSolving(obj, minLength) { |   const userIdTestSolving = readJSON(`${dir}stats/idvstats`) | ||||||
|   if (!obj) { |   function preProcessUIdTestSolving(obj, minLength) { | ||||||
|     return '0' |     if (!obj) { | ||||||
|  |       return '0' | ||||||
|  |     } | ||||||
|  |     if (minLength) { | ||||||
|  |       return Object.keys(obj) | ||||||
|  |         .filter((key) => { | ||||||
|  |           return obj[key] > minLength | ||||||
|  |         }) | ||||||
|  |         .length.toString() | ||||||
|  |     } else { | ||||||
|  |       return Object.keys(obj).length.toString() | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|   if (minLength) { |   function getUserIdTestSolving(day) { | ||||||
|     return Object.keys(obj) |     return [ | ||||||
|       .filter((key) => { |       getDayName(day), | ||||||
|         return obj[key] > minLength |       preProcessUIdTestSolving(userIdTestSolving[getDayIndex(day)]), | ||||||
|       }) |     ] | ||||||
|       .length.toString() |  | ||||||
|   } else { |  | ||||||
|     return Object.keys(obj).length.toString() |  | ||||||
|   } |   } | ||||||
| } |  | ||||||
| function getUserIdTestSolving(day) { |  | ||||||
|   return [ |  | ||||||
|     getDayName(day), |  | ||||||
|     preProcessUIdTestSolving(userIdTestSolving[getDayIndex(day)]), |  | ||||||
|   ] |  | ||||||
| } |  | ||||||
|  |  | ||||||
| pCols( |   pCols( | ||||||
|   [ |     [ | ||||||
|     ...[...Array(colsToPrint).keys()].map((x) => { |       ...[...Array(colsToPrint).keys()].map((x) => { | ||||||
|       return getUserIdTestSolving(-x) |         return getUserIdTestSolving(-x) | ||||||
|     }), |       }), | ||||||
|   ], |     ], | ||||||
|   null, |     null, | ||||||
|   false, |     false, | ||||||
|   'green' |     'green' | ||||||
| ) |   ) | ||||||
|  | } catch(e) { | ||||||
|  |   console.error(e) | ||||||
|  | } | ||||||
|  |  | ||||||
| // ------------------------------------------------------------------------------ | // ------------------------------------------------------------------------------ | ||||||
| printHeader('User id requests') | printHeader('User id requests') | ||||||
| const clientIdTestSolving = readJSON(`${dir}stats/uvstats`) | try { | ||||||
| function getUserIdRequests(day) { |   const clientIdTestSolving = readJSON(`${dir}stats/uvstats`) | ||||||
|   return [ |   function getUserIdRequests(day) { | ||||||
|     getDayName(day), |     return [ | ||||||
|     preProcessUIdTestSolving(clientIdTestSolving[getDayIndex(day)]), |       getDayName(day), | ||||||
|     preProcessUIdTestSolving(clientIdTestSolving[getDayIndex(day)], 5), |       preProcessUIdTestSolving(clientIdTestSolving[getDayIndex(day)]), | ||||||
|   ] |       preProcessUIdTestSolving(clientIdTestSolving[getDayIndex(day)], 5), | ||||||
| } |     ] | ||||||
|  |   } | ||||||
|  |  | ||||||
| pCols( |   pCols( | ||||||
|   [ |     [ | ||||||
|     ...[...Array(colsToPrint).keys()].map((x) => { |       ...[...Array(colsToPrint).keys()].map((x) => { | ||||||
|       return getUserIdRequests(-x) |         return getUserIdRequests(-x) | ||||||
|     }), |       }), | ||||||
|   ], |     ], | ||||||
|   ['', 'All', 'More than 5'], |     ['', 'All', 'More than 5'], | ||||||
|   false, |     false, | ||||||
|   'green' |     'green' | ||||||
| ) |   ) | ||||||
|  |  | ||||||
| // ------------------------------------------------------------------------------ |   // ------------------------------------------------------------------------------ | ||||||
| printHeader('Daily data count') |   printHeader('Daily data count') | ||||||
| const dailyDataCount = readFile(`${dir}stats/dailyDataCount`) |   const dailyDataCount = readFile(`${dir}stats/dailyDataCount`) | ||||||
| function getDailyDataCount(count) { |   function getDailyDataCount(count) { | ||||||
|   return [...Array(count).keys()].map((x) => { |     return [...Array(count).keys()].map((x) => { | ||||||
|     return JSON.parse(head(tail(dailyDataCount, x + 1), 1)) |       return JSON.parse(head(tail(dailyDataCount, x + 1), 1)) | ||||||
|   }) |     }) | ||||||
| } |   } | ||||||
|  |  | ||||||
| printLastDataCount(getDailyDataCount(colsToPrint)) |   printLastDataCount(getDailyDataCount(colsToPrint)) | ||||||
|  |  | ||||||
| function printLastDataCount(data) { |   function printLastDataCount(data) { | ||||||
|   const res = [...Array(colsToPrint).keys()].map((x) => { |     const res = [...Array(colsToPrint).keys()].map((x) => { | ||||||
|     return [getDayName(-x)] |       return [getDayName(-x)] | ||||||
|   }) |     }) | ||||||
|   data.forEach((dataCount, i) => { |     data.forEach((dataCount, i) => { | ||||||
|     res[i].push(dataCount.userCount.toString()) |       res[i].push(dataCount.userCount.toString()) | ||||||
|     res[i].push(dataCount.subjectCount.toString()) |       res[i].push(dataCount.subjectCount.toString()) | ||||||
|     res[i].push(dataCount.questionCount.toString()) |       res[i].push(dataCount.questionCount.toString()) | ||||||
|   }) |     }) | ||||||
|  |  | ||||||
|   pCols(res, ['', 'Users', 'Subjects', 'Questions'], false, 'green') |     pCols(res, ['', 'Users', 'Subjects', 'Questions'], false, 'green') | ||||||
|  |   } | ||||||
|  | } catch(e) { | ||||||
|  |   console.error(e) | ||||||
| } | } | ||||||
| // ------------------------------------------------------------------------------ | // ------------------------------------------------------------------------------ | ||||||
| printHeader('Daily script install / update check count') | printHeader('Daily script install / update check count') | ||||||
| function getDailyScriptStat(day) { | try { | ||||||
|   const log = |   function getDailyScriptStat(day) { | ||||||
|     !day || day === 0 |     const log = | ||||||
|       ? readFile(`${dir}stats/vlogs/log`) |       !day || day === 0 | ||||||
|       : readFile(`${dir}stats/vlogs/${getDayIndex(day)}`) |         ? readFile(`${dir}stats/vlogs/log`) | ||||||
|  |         : readFile(`${dir}stats/vlogs/${getDayIndex(day)}`) | ||||||
|  |  | ||||||
|   if (!log) { |     if (!log) { | ||||||
|     return [getDayName(day), 0, 0] |       return [getDayName(day), 0, 0] | ||||||
|  |     } | ||||||
|  |     return [ | ||||||
|  |       getDayName(day), | ||||||
|  |       countLinesMatching(log, '?install').toString(), | ||||||
|  |       countLinesMatching(log, '?up').toString(), | ||||||
|  |     ] | ||||||
|   } |   } | ||||||
|   return [ |  | ||||||
|     getDayName(day), |   const installs = [...Array(colsToPrint).keys()].map((x) => { | ||||||
|     countLinesMatching(log, '?install').toString(), |     return getDailyScriptStat(-x) | ||||||
|     countLinesMatching(log, '?up').toString(), |   }) | ||||||
|   ] |  | ||||||
|  |   pCols(installs, ['', 'Installs', 'Updates'], false, 'green') | ||||||
|  | } catch(e) { | ||||||
|  |   console.error(e) | ||||||
| } | } | ||||||
|  |  | ||||||
| const installs = [...Array(colsToPrint).keys()].map((x) => { |  | ||||||
|   return getDailyScriptStat(-x) |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| pCols(installs, ['', 'Installs', 'Updates'], false, 'green') |  | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| #!/bin/bash | #!/bin/bash | ||||||
|  |  | ||||||
| scripts/make.sh | scripts/make.sh | ||||||
| npm run start | npm run start > /dev/null | ||||||
|   | |||||||
| @@ -24,8 +24,8 @@ console.log('Current working directory: ' + process.cwd()) | |||||||
| const startHTTPS = true | const startHTTPS = true | ||||||
| const isRoot = process.getuid && process.getuid() === 0 | const isRoot = process.getuid && process.getuid() === 0 | ||||||
|  |  | ||||||
| const port = isRoot ? 80 : 8080 | const port = 8080 | ||||||
| const httpsport = isRoot ? 443 : 5001 | const httpsport = 5001 | ||||||
|  |  | ||||||
| // import os from 'os' | // import os from 'os' | ||||||
| // os.setPriority(10) | // os.setPriority(10) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user