From b77af3041a3f5dd1909b0eb046370baed445a45a Mon Sep 17 00:00:00 2001 From: Lau Josefsen Date: Thu, 11 Apr 2024 12:34:16 +0200 Subject: [PATCH] Log user if user header is set and fix for indefinite connections --- .env | 2 ++ bun.lockb | Bin 153995 -> 153995 bytes src/pages/api/hello.ts | 13 --------- src/pages/api/kill.ts | 18 ++++++++---- src/pages/instance/[identifier]/index.tsx | 32 ++++++++++++++-------- 5 files changed, 34 insertions(+), 31 deletions(-) delete mode 100644 src/pages/api/hello.ts diff --git a/.env b/.env index 6c40fb1..a50cac9 100644 --- a/.env +++ b/.env @@ -7,3 +7,5 @@ CEGO_TEST_DB_HOST=127.0.0.1 CEGO_TEST_DB_PORT=3306 CEGO_TEST_DB_USER=root CEGO_TEST_DB_DATABASE=testdb + +USER_HEADER=remote-user diff --git a/bun.lockb b/bun.lockb index 06c814260f189d672dd110c780a8d6a074a8d9e0..ac544f5580ad990914184926e8448d04df91567f 100755 GIT binary patch delta 3240 zcmciBNvsof0LSqbp94>!J{Ft4C=Jo)2ni0z(kLeN)??$T-Ws{|*cd|^52o>8dLe1R z!qjy{#c{7FSX`?j)O~zz<6af9?sda)L96|J|A7ed^kO7=pWn>4GedbT8+VRx+&R8u z?dEvAk=cCl$U62hd$o#-1I#s4Jd7~EMa9P<7PhLi&~kNL#5N|HDkbb-@*0&gb}@ae zN(BS7uT!aFh|cvYHSA&L29-MYF?*wmiv!GgDjr6dze&Z%Ar`i&w9vX)$3<*o;ue(> zb})IXN*TMD-mX%?0PWjUsu-fL#2u#I`^y8u!orkRO;Br>`oOI2bkNX;$ejO z2UUC=Vxg_lLTk5#QeVu;RTDmCn3=5due_A%R0 zadCjTCsaI)F#n{Ak3%dxrP4xckB*Dj#>CSqCG22wuSyxanBJ#S!2s>9N)8e` z4>QlI)Ul7*=TuxAVD5Pp4?5YS_cfYbtf@WA=3w7YCSoL&d`g^P!55LoB?h(n9Mk9T%~UiMLfs*umsG zDrM|q`dyU@257&hQpFIR_f=}x!%R=5j(yC2pyJ{Hb04aB7-9Y+6(5IK*ssz;>th`k zv5koXDkbb-@)MOZb}`*osbGNirz%wp(fLfJhCR%Du2RQ7X1`Ezae%omRXmI^|CNf5 zLo9r)(n4#X<07^(@r_CeJDB`drHoxnf2UHx0PXKpsu-g4gGvp1m^r9Y$3A9%RB>^D zxk$ys2=hOw_&CJE&nhjne$jCe+nD%OrGyGaWNYi&!?(HItrA zte6SR*mH5ZnbDRp6EIyKh3{M7iO z=0&UHQ=IJ@oi($RC~0X{?`I zapdWjE}Lp@nEdyr9=XB1wfVfA?Wg_i#$~*)<@BRoSWH~An0Ov1SLwt}tvlwqhyN7| zxM*+ssK*?B@pwCr8@4auh6zp%nv0LMqksp zvDlUSFN?({M%&n&T53L!Rq>_z@3Q=uPh@KM6|3X(E}0!Ku69;AYjh($ delta 5780 zcmeI#X^azP9LMpQ6$h4Mr~(spmvJ?uuW$luXyTE^#H26#vPNGtuIn~gvO9}g)5L_d zys>Xcs<_fo)QXDr!ja2@*Wdx;T~V=KSP@~o>s=MJ`uu*+h9C*ZBD)adzWDr~e!J7@ zOpn=JzOjAz#`blKR;bEIWW^Q20u5;N7L+1w(AWq{i8g8cR+KVr(Zos=muf|QnPclnkxX z@KY#RTBFv}D0y0^k!Mf}G@wxrrAQkzwiTsBn>79`N}0B3;yDzTYR_Yxq!p^afRdsf zHMXJH)TicllnkxXu#b|ZHEO+xlBabVc?qRJ0~&o9rAQkz_6kagHfj7-lrnA6#A_%n z)n3OsNh?&ZqNJ!tjWQi$EN`_Wx_)U~7tx@YOlsv7|$lE9d8qnxYlp<}=*gGgC z+NALsN}0B3;$0M%YVTp4q!p^akCLJuH9kPGsZY%hQ8Khj!@E$jv_`FuQ1Y}+BXyJl z4QTXZlp<}=*lv^(ZPNHBC}rBBi9IMT)jq{KNh?&}i;|)qHTI#{)Td^ElA%=^{tP8c zYt;H2B~R-#@&!tP1~mF5N|82b>?@QKZPNJHC}rBBiEmI`sx`1q(hAkTMM+VQ8sDMV z)Tie6C>dI%;U7@4v_`ETQS!7-BR`=OXh5SsqZDa_#+oQ4+NAMcP|CDL6ThOkRQnC< zB&|?=KT3*v)Hr}*Q=gi@qhx56hW|jx(i*i|D0y0^kv~xiG=M9kDlF0lbYdz;Nsgu* z@ixY?94$E#r!l&6Xp?v=DMv*P{dC5Z9G)D8#%Rmo%VADt%*audBRqvMD@RQZtDP|~ zM_rD{RK|iFfgI6kj72#ba>S-HmgH#45ud?WmZK#{LT7a4&}Q;hQjUrodWbP4hbM<| z2BR&9FNb+1V@8gu9N}4vSvhKQShE@Pa@57>QsmD?iP41^m$kKRICyL1ym=j}=3F;N z?KpqEsM8f?S?@r^8(hjTHVGWy(u?-&F$#HBv=53uF3&k1Txlo+ZQ-YAQx7jv4pR&JGQKpF(*6Expw&|KHwgI8ubh! zAHe-faQ_Km<_$fA19(xd>9?)H#c5}&sh;g@GsWXiB;piz;S_hNpoCHgWz>&W=a-d!;-L<8Z{zs(Ip~yLz7ZZuy`8%sB}4 z^bQT%;xly9#fs97OVsWK;uY?k|4-MxBVH6w%{y|3U#jId?~uJn9DBF8Na6Arj^Gp?SDV--J}Zyr$(Z2t>t6D4W@ diff --git a/src/pages/api/hello.ts b/src/pages/api/hello.ts deleted file mode 100644 index 96f00a0..0000000 --- a/src/pages/api/hello.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type { NextApiRequest, NextApiResponse } from 'next' - -type Data = { - name: string -} - -export default function handler( - req: NextApiRequest, - res: NextApiResponse -) { - res.status(200).json({ name: 'John Doe' }) -} diff --git a/src/pages/api/kill.ts b/src/pages/api/kill.ts index 6c235a0..3abc550 100644 --- a/src/pages/api/kill.ts +++ b/src/pages/api/kill.ts @@ -1,5 +1,3 @@ -// Given the id in post body, kill the mysql process with that id - import { NextApiRequest, NextApiResponse } from 'next' import { getConfig } from '@/lib/config' import mysql from 'mysql2/promise' @@ -25,10 +23,18 @@ export default async function handler( } // Kill the mysql process with the id - // Use the id to kill the mysql process - // res.status(200).json({ name: 'John Doe' }); - const conn = await mysql.createConnection(dbConfig) - await conn.query(`KILL ?`, [id]) + let conn: mysql.Connection | null = null + try { + conn = await mysql.createConnection(dbConfig) + await conn.query(`KILL ?`, [id]) + if(process.env.USER_HEADER) { + const user = req.headers[process.env.USER_HEADER]; + console.log(`User ${user} killed process ${id} on instance ${instance}`) + } + } + finally { + conn?.end() + } res.status(200).json({ id }) } else { res.setHeader('Allow', ['POST']) diff --git a/src/pages/instance/[identifier]/index.tsx b/src/pages/instance/[identifier]/index.tsx index f091cb7..af5f2bf 100644 --- a/src/pages/instance/[identifier]/index.tsx +++ b/src/pages/instance/[identifier]/index.tsx @@ -115,18 +115,26 @@ export const getServerSideProps = (async (context) => { } } - // Fetch data from external API - const conn = await mysql.createConnection(instance) + let conn: mysql.Connection | null = null - const [processListResult] = await conn.query('SHOW PROCESSLIST;') - const processList: Process[] = processListResult as Process[] - const [innoDbStatusResult] = await conn.query( - 'SHOW ENGINE INNODB STATUS;' - ) + let processList: Process[] = [] + let innoDbStatusString = ''; + + try { + conn = await mysql.createConnection(instance) + const [processListResult] = await conn.query('SHOW PROCESSLIST;') + processList = processListResult as Process[] + const [innoDbStatusResult] = await conn.query( + 'SHOW ENGINE INNODB STATUS;' + ) + + const innoDbStatusString = innoDbStatusResult[0]['Status'] as string + } + finally { + conn?.end() + } - const innoDbStatusString = innoDbStatusResult[0]['Status'] as string - // Convert the status string - const innoDbStatus = parseInnoDbStatus(innoDbStatusString as string) + const innoDbStatus = parseInnoDbStatus(innoDbStatusString); const processListWithTransaction: ProcessWithTransaction[] = processList.map((process) => { @@ -139,10 +147,10 @@ export const getServerSideProps = (async (context) => { // Order by transaction.activeTime desc, then by process.Time desc processListWithTransaction.sort((a, b) => { - if (a.transaction && !b.transaction) { + if (a.transaction && !b.transaction && a.transaction.activeTime > 10) { return -1 } - if (!a.transaction && b.transaction) { + if (!a.transaction && b.transaction && b.transaction.activeTime > 10) { return 1 } if (a.transaction && b.transaction) {