diff --git a/backend/routeHandler.routes.ts b/backend/routeHandler.routes.ts index 1e85ffd..a3ccb50 100644 --- a/backend/routeHandler.routes.ts +++ b/backend/routeHandler.routes.ts @@ -10,6 +10,7 @@ import { setupOCPRoutes } from "./ocp/ocp.routes.js"; import { setupOpendockRoutes } from "./opendock/opendock.routes.js"; import { setupProdSqlRoutes } from "./prodSql/prodSql.routes.js"; import { setupSystemRoutes } from "./system/system.routes.js"; +import { setupTCPRoutes } from "./tcpServer/tcp.routes.js"; import { setupUtilsRoutes } from "./utils/utils.routes.js"; export const setupRoutes = (baseUrl: string, app: Express) => { @@ -24,4 +25,5 @@ export const setupRoutes = (baseUrl: string, app: Express) => { setupOpendockRoutes(baseUrl, app); setupNotificationRoutes(baseUrl, app); setupOCPRoutes(baseUrl, app); + setupTCPRoutes(baseUrl, app); }; diff --git a/backend/system/stats.route.ts b/backend/system/stats.route.ts index 10e0f85..9aa923f 100644 --- a/backend/system/stats.route.ts +++ b/backend/system/stats.route.ts @@ -1,9 +1,12 @@ import { Router } from "express"; +import { connected as gpSql } from "../gpSql/gpSqlConnection.controller.js"; +import { connected as prodSql } from "../prodSql/prodSqlConnection.controller.js"; import { prodQuery } from "../prodSql/prodSqlQuery.controller.js"; import { type SqlQuery, sqlQuerySelector, } from "../prodSql/prodSqlQuerySelector.utils.js"; +import { isServerRunning } from "../tcpServer/tcp.server.js"; const router = Router(); @@ -25,6 +28,9 @@ router.get("/", async (_, res) => { : [], eomFGPkgSheetVersion: 1, // this is the excel file version when we have a change to the macro we want to grab this masterMacroFile: 1, + tcpServerOnline: isServerRunning, + sqlServerConnected: prodSql, + gpServerConnected: gpSql, }); }); diff --git a/backend/tcpServer/tcp.routes.ts b/backend/tcpServer/tcp.routes.ts new file mode 100644 index 0000000..0761a6d --- /dev/null +++ b/backend/tcpServer/tcp.routes.ts @@ -0,0 +1,14 @@ +import type { Express } from "express"; +import { requireAuth } from "../middleware/auth.middleware.js"; +import restart from "./tcpRestart.route.js"; +import start from "./tcpStart.route.js"; +import stop from "./tcpStop.route.js"; + +export const setupTCPRoutes = (baseUrl: string, app: Express) => { + //stats will be like this as we dont need to change this + app.use(`${baseUrl}/api/tcp/start`, requireAuth, start); + app.use(`${baseUrl}/api/tcp/stop`, requireAuth, stop); + app.use(`${baseUrl}/api/tcp/restart`, requireAuth, restart); + + // all other system should be under /api/system/* +}; diff --git a/backend/tcpServer/tcp.server.ts b/backend/tcpServer/tcp.server.ts index 32b4c38..18f9652 100644 --- a/backend/tcpServer/tcp.server.ts +++ b/backend/tcpServer/tcp.server.ts @@ -3,13 +3,14 @@ import { eq } from "drizzle-orm"; import { db } from "../db/db.controller.js"; import { printerData } from "../db/schema/printers.schema.js"; import { createLogger } from "../logger/logger.controller.js"; +import { delay } from "../utils/delay.utils.js"; import { returnFunc } from "../utils/returnHelper.utils.js"; import { tryCatch } from "../utils/trycatch.utils.js"; import { type PrinterData, printerListen } from "./tcp.printerListener.js"; let tcpServer: net.Server; const tcpSockets: Set = new Set(); -//let isServerRunning = false; +export let isServerRunning = false; const port = parseInt(process.env.TCP_PORT ?? "2222", 10); @@ -39,9 +40,8 @@ const parseTcpAlert = (input: string) => { name, }; }; - -export const startTCPServer = () => { - const log = createLogger({ module: "tcp", submodule: "create_server" }); +const log = createLogger({ module: "tcp", submodule: "create_server" }); +export const startTCPServer = async () => { tcpServer = net.createServer(async (socket) => { tcpSockets.add(socket); socket.on("data", async (data: Buffer) => { @@ -103,7 +103,7 @@ export const startTCPServer = () => { log.info({}, `TCP Server listening on port ${port}`); }); - //isServerRunning = true; + isServerRunning = true; return returnFunc({ success: true, level: "info", @@ -115,3 +115,66 @@ export const startTCPServer = () => { room: "", }); }; + +export const stopTCPServer = async () => { + if (!isServerRunning) + return { success: false, message: "Server is not running" }; + for (const socket of tcpSockets) { + socket.destroy(); + } + tcpSockets.clear(); + tcpServer.close(() => { + log.info({}, "TCP Server stopped"); + }); + isServerRunning = false; + return returnFunc({ + success: true, + level: "info", + module: "tcp", + subModule: "create_server", + message: "TCP server stopped.", + data: [], + notify: false, + room: "", + }); +}; + +export const restartTCPServer = async () => { + if (!isServerRunning) { + startTCPServer(); + return returnFunc({ + success: false, + level: "warn", + module: "tcp", + subModule: "create_server", + message: "Server is not running will try to start it", + data: [], + notify: false, + room: "", + }); + } else { + for (const socket of tcpSockets) { + socket.destroy(); + } + tcpSockets.clear(); + tcpServer.close(() => { + log.info({}, "TCP Server stopped"); + }); + isServerRunning = false; + + await delay(1500); + + startTCPServer(); + } + + return returnFunc({ + success: true, + level: "info", + module: "tcp", + subModule: "create_server", + message: "TCP server has been restarted.", + data: [], + notify: false, + room: "", + }); +}; diff --git a/backend/tcpServer/tcpRestart.route.ts b/backend/tcpServer/tcpRestart.route.ts new file mode 100644 index 0000000..52b6b48 --- /dev/null +++ b/backend/tcpServer/tcpRestart.route.ts @@ -0,0 +1,19 @@ +import { Router } from "express"; +import { apiReturn } from "../utils/returnHelper.utils.js"; +import { restartTCPServer } from "./tcp.server.js"; + +const r = Router(); + +r.post("/restart", async (_, res) => { + const connect = await restartTCPServer(); + apiReturn(res, { + success: connect.success, + level: connect.success ? "info" : "error", + module: "tcp", + subModule: "post", + message: "TCP Server has been restarted", + data: connect.data, + status: connect.success ? 200 : 400, + }); +}); +export default r; diff --git a/backend/tcpServer/tcpStart.route.ts b/backend/tcpServer/tcpStart.route.ts new file mode 100644 index 0000000..4a062f3 --- /dev/null +++ b/backend/tcpServer/tcpStart.route.ts @@ -0,0 +1,20 @@ +import { Router } from "express"; +import { apiReturn } from "../utils/returnHelper.utils.js"; +import { startTCPServer } from "./tcp.server.js"; + +const r = Router(); + +r.post("/start", async (_, res) => { + const connect = await startTCPServer(); + apiReturn(res, { + success: connect.success, + level: connect.success ? "info" : "error", + module: "routes", + subModule: "prodSql", + message: connect.message, + data: connect.data, + status: connect.success ? 200 : 400, + }); +}); + +export default r; diff --git a/backend/tcpServer/tcpStop.route.ts b/backend/tcpServer/tcpStop.route.ts new file mode 100644 index 0000000..1346c71 --- /dev/null +++ b/backend/tcpServer/tcpStop.route.ts @@ -0,0 +1,20 @@ +import { Router } from "express"; +import { apiReturn } from "../utils/returnHelper.utils.js"; +import { stopTCPServer } from "./tcp.server.js"; + +const r = Router(); + +r.post("/stop", async (_, res) => { + const connect = await stopTCPServer(); + apiReturn(res, { + success: connect.success, + level: connect.success ? "info" : "error", + module: "routes", + subModule: "prodSql", + message: connect.message, + data: [], + status: connect.success ? 200 : 400, + }); +}); + +export default r; diff --git a/backend/utils/returnHelper.utils.ts b/backend/utils/returnHelper.utils.ts index d3dfca7..339e72b 100644 --- a/backend/utils/returnHelper.utils.ts +++ b/backend/utils/returnHelper.utils.ts @@ -38,7 +38,7 @@ interface Data { | "gpChecks" | "prodEndpoint" | "create_server"; - level: "info" | "error" | "debug" | "fatal"; + level: "info" | "error" | "debug" | "fatal" | "warn"; message: string; room?: string; data?: T; diff --git a/brunoApi/environments/lstv3.bru b/brunoApi/environments/lstv3.bru index 671cac1..b05fb6c 100644 --- a/brunoApi/environments/lstv3.bru +++ b/brunoApi/environments/lstv3.bru @@ -1,5 +1,5 @@ vars { - url: http://uslim1vms006:3100/lst + url: http://localhost:3000/lst readerIp: 10.44.14.215 } vars:secret [