diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 64d8d8ef1..402f5b15e 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,4 +1,4 @@
-**(when sending your PR, only remove this line. Do not remove any lines below. Check all the relevant items before sending your PR)**
+**(Please remove this line only before submitting your PR. Ensure that all relevant items are checked before submission.)**
## Describe your changes
@@ -8,10 +8,10 @@ Briefly describe the changes you made and their purpose.
Mention the issue number(s) this PR addresses (e.g., #123).
-## Please ensure all items are checked off before requesting a review:
+## Please ensure all items are checked off before requesting a review. "Checked off" means you need to add an "x" character between brackets so they turn into checkmarks.
-- [ ] I deployed the application locally.
-- [ ] I have performed a self-review and testing of my code.
+- [ ] (Do not skip this or your PR will be closed) I deployed the application locally.
+- [ ] (Do not skip this or your PR will be closed) I have performed a self-review and testing of my code.
- [ ] I have included the issue # in the PR.
- [ ] I have labelled the PR correctly.
- [ ] The issue I am working on is assigned to me.
diff --git a/Client/package-lock.json b/Client/package-lock.json
index f58aa9d46..7d2a2427c 100644
--- a/Client/package-lock.json
+++ b/Client/package-lock.json
@@ -15,9 +15,9 @@
"@mui/lab": "6.0.0-beta.24",
"@mui/material": "6.4.1",
"@mui/x-charts": "^7.5.1",
- "@mui/x-data-grid": "7.24.0",
- "@mui/x-date-pickers": "7.24.0",
- "@reduxjs/toolkit": "2.5.0",
+ "@mui/x-data-grid": "7.24.1",
+ "@mui/x-date-pickers": "7.24.1",
+ "@reduxjs/toolkit": "2.5.1",
"axios": "^1.7.4",
"dayjs": "1.11.13",
"joi": "17.13.3",
@@ -1390,15 +1390,15 @@
"license": "MIT"
},
"node_modules/@mui/x-charts": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@mui/x-charts/-/x-charts-7.24.0.tgz",
- "integrity": "sha512-X/zN0GxPHJC24QckFrtEbIK0HYoGwZgpNC5CV9cvRGvHphDFuNZk9xg9fJwIg1i3PPZHXRO3E+L/ee6fJ9ufhw==",
+ "version": "7.24.1",
+ "resolved": "https://registry.npmjs.org/@mui/x-charts/-/x-charts-7.24.1.tgz",
+ "integrity": "sha512-OdTS/nXaANPe4AoUFIDD4LlID8kK/00q+uqVOCkVClEvFQeAkj3pBaghdS4hY7rVqsCgsm+yOStQVJa9G2MR+Q==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.25.7",
"@mui/utils": "^5.16.6 || ^6.0.0",
"@mui/x-charts-vendor": "7.20.0",
- "@mui/x-internals": "7.24.0",
+ "@mui/x-internals": "7.24.1",
"@react-spring/rafz": "^9.7.5",
"@react-spring/web": "^9.7.5",
"clsx": "^2.1.1",
@@ -1448,14 +1448,14 @@
}
},
"node_modules/@mui/x-data-grid": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-7.24.0.tgz",
- "integrity": "sha512-goYTKDp+e+dXw7E+WndWUhWXTjX3aTqN8W2dCKhXnmE9Gu8dFwG6Azl7GK9l2m5YHGuqYmpWqcSG9etLdwYaVg==",
+ "version": "7.24.1",
+ "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-7.24.1.tgz",
+ "integrity": "sha512-4sYTbMwsDotuTd2Cwa2JGTPXPWQs8RGJvocAKnIsNOzNdZNMrikE//HO35snriK8s4dauAApY7RVbeisjpVT+A==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.25.7",
"@mui/utils": "^5.16.6 || ^6.0.0",
- "@mui/x-internals": "7.24.0",
+ "@mui/x-internals": "7.24.1",
"clsx": "^2.1.1",
"prop-types": "^15.8.1",
"reselect": "^5.1.1"
@@ -1485,14 +1485,14 @@
}
},
"node_modules/@mui/x-date-pickers": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.24.0.tgz",
- "integrity": "sha512-oBM9Yp2H3tJ7qoHB4APQJYxZG4rz6JD4CwLzbzD9o3r+E1HGpGSLhwK3rDEz9VEjbOq8893Z2TGYLLWoyjeFXQ==",
+ "version": "7.24.1",
+ "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.24.1.tgz",
+ "integrity": "sha512-ykQugMQHuQKBk3kViW/r0PpubtHQOlrd54bgbdafgTMCeM2VpXvv4zimzOu5IGnM6wEN8hupC7EXZbkrT6x46w==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.25.7",
"@mui/utils": "^5.16.6 || ^6.0.0",
- "@mui/x-internals": "7.24.0",
+ "@mui/x-internals": "7.24.1",
"@types/react-transition-group": "^4.4.11",
"clsx": "^2.1.1",
"prop-types": "^15.8.1",
@@ -1551,9 +1551,9 @@
}
},
"node_modules/@mui/x-internals": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.24.0.tgz",
- "integrity": "sha512-lYa/XLltxNMY8YAFDopIHrXda2EAoqMCilyGMuPMz+WTG+b+StlUKqtj8cgFPQ/sa5dQ2fR7R3KJdjLREKUrlQ==",
+ "version": "7.24.1",
+ "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.24.1.tgz",
+ "integrity": "sha512-9BvJzpLJnS9BDphvkiv6v0QOLxbnu8jhwcexFjtCQ2ZyxtVuVsWzGZ2npT9sGOil7+eaFDmWnJtea/tgrPvSwQ==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.25.7",
@@ -1691,9 +1691,9 @@
}
},
"node_modules/@reduxjs/toolkit": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.5.0.tgz",
- "integrity": "sha512-awNe2oTodsZ6LmRqmkFhtb/KH03hUhxOamEQy411m3Njj3BbFvoBovxo4Q1cBWnV1ErprVj9MlF0UPXkng0eyg==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.5.1.tgz",
+ "integrity": "sha512-UHhy3p0oUpdhnSxyDjaRDYaw8Xra75UiLbCiRozVPHjfDwNYkh0TsVm/1OmTW8Md+iDAJmYPWUKMvsMc2GtpNg==",
"license": "MIT",
"dependencies": {
"immer": "^10.0.3",
diff --git a/Client/package.json b/Client/package.json
index 247e1fe72..1e2647a03 100644
--- a/Client/package.json
+++ b/Client/package.json
@@ -18,9 +18,9 @@
"@mui/lab": "6.0.0-beta.24",
"@mui/material": "6.4.1",
"@mui/x-charts": "^7.5.1",
- "@mui/x-data-grid": "7.24.0",
- "@mui/x-date-pickers": "7.24.0",
- "@reduxjs/toolkit": "2.5.0",
+ "@mui/x-data-grid": "7.24.1",
+ "@mui/x-date-pickers": "7.24.1",
+ "@reduxjs/toolkit": "2.5.1",
"axios": "^1.7.4",
"dayjs": "1.11.13",
"joi": "17.13.3",
diff --git a/Client/src/Pages/Infrastructure/Details/index.jsx b/Client/src/Pages/Infrastructure/Details/index.jsx
index 5da921e30..cb408b9f2 100644
--- a/Client/src/Pages/Infrastructure/Details/index.jsx
+++ b/Client/src/Pages/Infrastructure/Details/index.jsx
@@ -625,8 +625,7 @@ const InfrastructureDetails = () => {
(
-
-
-
+
),
},
];
const monitorsAsRows = monitors.map((monitor) => {
const processor =
- ((monitor.checks[0]?.cpu?.usage_frequency ?? 0) / 1000).toFixed(2) + " GHz";
+ ((monitor.checks[0]?.cpu?.frequency ?? 0) / 1000).toFixed(2) + " GHz";
const cpu = (monitor?.checks[0]?.cpu.usage_percent ?? 0) * 100;
const mem = (monitor?.checks[0]?.memory.usage_percent ?? 0) * 100;
const disk = (monitor?.checks[0]?.disk[0]?.usage_percent ?? 0) * 100;
@@ -158,14 +156,12 @@ function Infrastructure() {
const uptimePercentage = ((monitor?.uptimePercentage ?? 0) * 100)
.toFixed(2)
.toString();
- const percentageColor =
- monitor.uptimePercentage < 0.25
- ? theme.palette.error.main
- : monitor.uptimePercentage < 0.5
- ? theme.palette.percentage.uptimeFair
- : monitor.uptimePercentage < 0.75
- ? theme.palette.percentage.uptimeGood
- : theme.palette.success.lowContrast;
+ const percentageColor = monitor.uptimePercentage < 0.25
+ ? theme.palette.error.main
+ : monitor.uptimePercentage < 0.5
+ ? theme.palette.warning.main
+ : theme.palette.success.main;
+
return {
id: monitor._id,
name: monitor.name,
@@ -243,7 +239,7 @@ function Infrastructure() {
backgroundColor={theme.palette.tertiary.main}
sx={{
padding: ".25em .75em",
- borderRadius: "50%",
+ borderRadius: "10000px",
fontSize: "12px",
fontWeight: 500,
}}
diff --git a/Client/src/Pages/PageSpeed/index.jsx b/Client/src/Pages/PageSpeed/index.jsx
index c15ed5296..c3d37e2c0 100644
--- a/Client/src/Pages/PageSpeed/index.jsx
+++ b/Client/src/Pages/PageSpeed/index.jsx
@@ -106,9 +106,15 @@ const PageSpeed = () => {
component="span"
className="current-monitors-counter"
color={theme.palette.primary.contrastText}
- border={1}
- borderColor={theme.palette.primary.lowContrast}
+ border={2}
+ borderColor={theme.palette.accent.main}
backgroundColor={theme.palette.tertiary.main}
+ sx={{
+ padding: ".25em .75em",
+ borderRadius: "10000px",
+ fontSize: "12px",
+ fontWeight: 500,
+ }}
>
{summary?.totalMonitors ?? 0}
diff --git a/Client/src/Pages/Uptime/CreateUptime/index.jsx b/Client/src/Pages/Uptime/CreateUptime/index.jsx
index 762d8e764..9086c87af 100644
--- a/Client/src/Pages/Uptime/CreateUptime/index.jsx
+++ b/Client/src/Pages/Uptime/CreateUptime/index.jsx
@@ -235,53 +235,6 @@ const CreateMonitor = () => {
monitor
-
-
-
- General settings
-
- Here you can select the URL of the host, together with the type of monitor.
-
-
-
- : null
- }
- label={monitorTypeMaps[monitor.type].label || "URL to monitor"}
- https={https}
- placeholder={monitorTypeMaps[monitor.type].placeholder || ""}
- value={monitor.url}
- onChange={(event) => handleChange(event, "url")}
- error={errors["url"] ? true : false}
- helperText={errors["url"]}
- />
- handleChange(event, "port")}
- error={errors["port"] ? true : false}
- helperText={errors["port"]}
- hidden={monitor.type !== "port"}
- />
- handleChange(event, "name")}
- error={errors["name"] ? true : false}
- helperText={errors["name"]}
- />
-
-
Checks to perform
@@ -363,6 +316,52 @@ const CreateMonitor = () => {
)}
+
+
+ General settings
+
+ Here you can select the URL of the host, together with the type of monitor.
+
+
+
+ : null
+ }
+ label={monitorTypeMaps[monitor.type].label || "URL to monitor"}
+ https={https}
+ placeholder={monitorTypeMaps[monitor.type].placeholder || ""}
+ value={monitor.url}
+ onChange={(event) => handleChange(event, "url")}
+ error={errors["url"] ? true : false}
+ helperText={errors["url"]}
+ />
+ handleChange(event, "port")}
+ error={errors["port"] ? true : false}
+ helperText={errors["port"]}
+ hidden={monitor.type !== "port"}
+ />
+ handleChange(event, "name")}
+ error={errors["name"] ? true : false}
+ helperText={errors["name"]}
+ />
+
+
Incident notifications
diff --git a/Client/src/Utils/NetworkServiceProvider.jsx b/Client/src/Utils/NetworkServiceProvider.jsx
index 9fb65f1ca..684152e69 100644
--- a/Client/src/Utils/NetworkServiceProvider.jsx
+++ b/Client/src/Utils/NetworkServiceProvider.jsx
@@ -1,14 +1,15 @@
import { useDispatch } from "react-redux";
import { useNavigate } from "react-router";
import { setNetworkService } from "./NetworkService";
-import NetworkService from "./NetworkService";
+import NetworkService, { networkService } from "./NetworkService";
import { store } from "../store";
const NetworkServiceProvider = ({ children }) => {
const dispatch = useDispatch();
const navigate = useNavigate();
- const networkService = new NetworkService(store, dispatch, navigate);
- setNetworkService(networkService);
+ if (!networkService) {
+ setNetworkService(new NetworkService(store, dispatch, navigate));
+ }
return children;
};
diff --git a/README.md b/README.md
index c37adfc6a..3dd59ef8f 100644
--- a/README.md
+++ b/README.md
@@ -51,13 +51,13 @@ If you have any questions, suggestions or comments, please use our [Discord chan
- Docker monitoring
- Ping monitoring
- SSL monitoring
+- Port monitoring
- Incidents at a glance
- E-mail notifications
- Scheduled maintenance
**Short term roadmap:**
-- Port monitoring (**complete**, waiting to be deployed to stable version) https://github.com/bluewave-labs/Checkmate/issues/1476
- Global (distributed) uptime checking on Solana network (**in progress**) https://github.com/bluewave-labs/Checkmate/issues/1593
- Status pages (**in progress**) https://github.com/bluewave-labs/Checkmate/issues/1131
- Translations (i18n) (**in progress**)
diff --git a/Server/package-lock.json b/Server/package-lock.json
index 67399c8a1..d5a5ea747 100644
--- a/Server/package-lock.json
+++ b/Server/package-lock.json
@@ -11,7 +11,7 @@
"dependencies": {
"axios": "^1.7.2",
"bcrypt": "5.1.1",
- "bullmq": "5.35.1",
+ "bullmq": "5.37.0",
"cors": "^2.8.5",
"dockerode": "4.0.4",
"dotenv": "^16.4.5",
@@ -324,9 +324,9 @@
"dev": true
},
"node_modules/@eslint/js": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz",
- "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==",
+ "version": "9.19.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz",
+ "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1748,9 +1748,9 @@
}
},
"node_modules/bullmq": {
- "version": "5.35.1",
- "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.35.1.tgz",
- "integrity": "sha512-LnzqisWyF4V8KhgFnK7iaJdQn9Q61EdHdCT6sVTzA3jZr6CHxw/OBmBZhzA8Xq4bsvsmvdjr8pmGftC78aWgXQ==",
+ "version": "5.37.0",
+ "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.37.0.tgz",
+ "integrity": "sha512-h/wf979+9uROyYpB8oTE44Py6JERCluCSd+ZFpCZlPsYh+wxAkqrfHsHHHKBgsNJp9odWLIY4SG+280EXzXiCQ==",
"license": "MIT",
"dependencies": {
"cron-parser": "^4.9.0",
@@ -3071,9 +3071,9 @@
}
},
"node_modules/eslint": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz",
- "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==",
+ "version": "9.19.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz",
+ "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3082,7 +3082,7 @@
"@eslint/config-array": "^0.19.0",
"@eslint/core": "^0.10.0",
"@eslint/eslintrc": "^3.2.0",
- "@eslint/js": "9.18.0",
+ "@eslint/js": "9.19.0",
"@eslint/plugin-kit": "^0.2.5",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
diff --git a/Server/package.json b/Server/package.json
index 873f8ce67..9d92a2010 100644
--- a/Server/package.json
+++ b/Server/package.json
@@ -18,7 +18,7 @@
"dependencies": {
"axios": "^1.7.2",
"bcrypt": "5.1.1",
- "bullmq": "5.35.1",
+ "bullmq": "5.37.0",
"cors": "^2.8.5",
"dockerode": "4.0.4",
"dotenv": "^16.4.5",