mirror of
https://github.com/dec0dOS/zero-ui.git
synced 2025-07-30 03:29:11 -07:00
commit
1e84548dd9
15 changed files with 2220 additions and 2597 deletions
786
.yarn/releases/yarn-3.2.1.cjs
vendored
786
.yarn/releases/yarn-3.2.1.cjs
vendored
File diff suppressed because one or more lines are too long
783
.yarn/releases/yarn-3.2.3.cjs
vendored
Executable file
783
.yarn/releases/yarn-3.2.3.cjs
vendored
Executable file
File diff suppressed because one or more lines are too long
10
.yarnrc.yml
10
.yarnrc.yml
|
@ -1,11 +1,11 @@
|
||||||
|
logFilters:
|
||||||
|
- code: YN0013
|
||||||
|
level: discard
|
||||||
|
|
||||||
nodeLinker: node-modules
|
nodeLinker: node-modules
|
||||||
|
|
||||||
plugins:
|
plugins:
|
||||||
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
|
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
|
||||||
spec: "@yarnpkg/plugin-interactive-tools"
|
spec: "@yarnpkg/plugin-interactive-tools"
|
||||||
|
|
||||||
yarnPath: .yarn/releases/yarn-3.2.1.cjs
|
yarnPath: .yarn/releases/yarn-3.2.3.cjs
|
||||||
|
|
||||||
logFilters:
|
|
||||||
- code: YN0013
|
|
||||||
level: discard
|
|
||||||
|
|
|
@ -4,9 +4,11 @@ const logger = require("morgan");
|
||||||
const compression = require("compression");
|
const compression = require("compression");
|
||||||
const bearerToken = require("express-bearer-token");
|
const bearerToken = require("express-bearer-token");
|
||||||
const helmet = require("helmet");
|
const helmet = require("helmet");
|
||||||
|
const cron = require("node-cron");
|
||||||
|
|
||||||
const db = require("./utils/db");
|
const db = require("./utils/db");
|
||||||
const initAdmin = require("./utils/init-admin");
|
const initAdmin = require("./utils/init-admin");
|
||||||
|
const pingAll = require("./utils/ping");
|
||||||
|
|
||||||
const authRoutes = require("./routes/auth");
|
const authRoutes = require("./routes/auth");
|
||||||
const networkRoutes = require("./routes/network");
|
const networkRoutes = require("./routes/network");
|
||||||
|
@ -21,11 +23,15 @@ app.use(express.urlencoded({ extended: false }));
|
||||||
if (process.env.ZU_DISABLE_AUTH !== "true") {
|
if (process.env.ZU_DISABLE_AUTH !== "true") {
|
||||||
app.use(
|
app.use(
|
||||||
bearerToken({
|
bearerToken({
|
||||||
headerKey: "Bearer",
|
headerKey: "token",
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV === "production") {
|
||||||
|
console.debug = function () {};
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
process.env.NODE_ENV === "production" &&
|
process.env.NODE_ENV === "production" &&
|
||||||
process.env.ZU_SECURE_HEADERS !== "false"
|
process.env.ZU_SECURE_HEADERS !== "false"
|
||||||
|
@ -54,6 +60,18 @@ initAdmin().then(function (admin) {
|
||||||
db.defaults({ users: [admin], networks: [] }).write();
|
db.defaults({ users: [admin], networks: [] }).write();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (process.env.ZU_LAST_SEEN_FETCH !== "false") {
|
||||||
|
let schedule = process.env.ZU_LAST_SEEN_SCHEDULE || "*/5 * * * *";
|
||||||
|
cron.schedule(schedule, () => {
|
||||||
|
console.debug("Running scheduled job");
|
||||||
|
const networks = db.get("networks").value();
|
||||||
|
networks.forEach((network) => {
|
||||||
|
console.debug("Processing " + network.id);
|
||||||
|
pingAll(network);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const routerAPI = express.Router();
|
const routerAPI = express.Router();
|
||||||
const routerController = express.Router();
|
const routerController = express.Router();
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"lowdb": "^1.0.0",
|
"lowdb": "^1.0.0",
|
||||||
"morgan": "~1.10.0",
|
"morgan": "~1.10.0",
|
||||||
|
"node-cron": "^3.0.2",
|
||||||
"pbkdf2-wrapper": "^1.3.4"
|
"pbkdf2-wrapper": "^1.3.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,13 +25,14 @@ async function getMemberAdditionalData(data) {
|
||||||
network.defaults({ members: [] }).get("members").write();
|
network.defaults({ members: [] }).get("members").write();
|
||||||
// END MIGRATION SECTION
|
// END MIGRATION SECTION
|
||||||
|
|
||||||
const additionalData = db
|
const member = db
|
||||||
.get("networks")
|
.get("networks")
|
||||||
.find({ id: data.nwid })
|
.find({ id: data.nwid })
|
||||||
.get("members")
|
.get("members")
|
||||||
.find({ id: data.id })
|
.find({ id: data.id });
|
||||||
.get("additionalConfig")
|
|
||||||
.value();
|
const additionalData = member.get("additionalConfig").value();
|
||||||
|
const lastOnline = member.get("lastOnline").value() || 0;
|
||||||
|
|
||||||
const peer = await getPeer(data.id);
|
const peer = await getPeer(data.id);
|
||||||
let peerData = {};
|
let peerData = {};
|
||||||
|
@ -57,11 +58,11 @@ async function getMemberAdditionalData(data) {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: data.nwid + "-" + data.id,
|
id: data.nwid + "-" + data.id,
|
||||||
type: "Member",
|
clock: new Date().getTime(),
|
||||||
clock: Math.floor(new Date().getTime() / 1000),
|
|
||||||
networkId: data.nwid,
|
networkId: data.nwid,
|
||||||
nodeId: data.id,
|
nodeId: data.id,
|
||||||
controllerId: ZT_ADDRESS,
|
controllerId: ZT_ADDRESS,
|
||||||
|
lastOnline: lastOnline,
|
||||||
...additionalData,
|
...additionalData,
|
||||||
...peerData,
|
...peerData,
|
||||||
config: data,
|
config: data,
|
||||||
|
|
|
@ -23,8 +23,7 @@ async function getNetworkAdditionalData(data) {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: data.id,
|
id: data.id,
|
||||||
type: "Network",
|
clock: new Date().getTime(),
|
||||||
clock: Math.floor(new Date().getTime() / 1000),
|
|
||||||
...additionalData.value(),
|
...additionalData.value(),
|
||||||
config: data,
|
config: data,
|
||||||
};
|
};
|
||||||
|
|
29
backend/utils/ping.js
Normal file
29
backend/utils/ping.js
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
const api = require("./controller-api");
|
||||||
|
const db = require("./db");
|
||||||
|
|
||||||
|
async function pingAll(network) {
|
||||||
|
await Promise.all(
|
||||||
|
network.members.map(async (member) => {
|
||||||
|
console.debug("Processing " + member.id);
|
||||||
|
api
|
||||||
|
.get("peer/" + member.id)
|
||||||
|
.then(async function () {
|
||||||
|
// write lastOneline field in db
|
||||||
|
db.get("networks")
|
||||||
|
.filter({ id: network.id })
|
||||||
|
.map("members")
|
||||||
|
.first()
|
||||||
|
.filter({ id: member.id })
|
||||||
|
.first()
|
||||||
|
.set("lastOnline", new Date().getTime())
|
||||||
|
.write();
|
||||||
|
})
|
||||||
|
.catch(function (err) {
|
||||||
|
console.debug("Couldn't fetch", member.id);
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = pingAll;
|
|
@ -5,6 +5,8 @@ module.exports = async function () {
|
||||||
const res = await api.get("status");
|
const res = await api.get("status");
|
||||||
return res.data.address;
|
return res.data.address;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(
|
||||||
|
"Couldn't connect to the controller on " + err.config.baseURL
|
||||||
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
"@uiw/react-codemirror": "^3.1.0",
|
"@uiw/react-codemirror": "^3.1.0",
|
||||||
"axios": "^0.27.2",
|
"axios": "^0.27.2",
|
||||||
"codemirror": "^5.62.3",
|
"codemirror": "^5.62.3",
|
||||||
|
"date-fns": "^2.29.2",
|
||||||
"history": "^5.3.0",
|
"history": "^5.3.0",
|
||||||
"ipaddr.js": "^2.0.1",
|
"ipaddr.js": "^2.0.1",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
|
|
|
@ -14,6 +14,7 @@ import DataTable from "react-data-table-component";
|
||||||
import { useParams } from "react-router-dom";
|
import { useParams } from "react-router-dom";
|
||||||
import API from "utils/API";
|
import API from "utils/API";
|
||||||
import { parseValue, replaceValue, setValue } from "utils/ChangeHelper";
|
import { parseValue, replaceValue, setValue } from "utils/ChangeHelper";
|
||||||
|
import { formatDistance } from "date-fns";
|
||||||
import AddMember from "./components/AddMember";
|
import AddMember from "./components/AddMember";
|
||||||
import DeleteMember from "./components/DeleteMember";
|
import DeleteMember from "./components/DeleteMember";
|
||||||
import ManagedIP from "./components/ManagedIP";
|
import ManagedIP from "./components/ManagedIP";
|
||||||
|
@ -98,40 +99,40 @@ function NetworkMembers({ network }) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "status",
|
id: "status",
|
||||||
name: "Peer status",
|
name: "Last Seen",
|
||||||
minWidth: "100px",
|
minWidth: "100px",
|
||||||
cell: (row) =>
|
cell: (row) =>
|
||||||
row.online === 0 ? (
|
row.online === 1 ? (
|
||||||
<Typography color="error">OFFLINE</Typography>
|
<Typography style={{ color: "#008000" }}>{"ONLINE"}</Typography>
|
||||||
) : row.online === 1 ? (
|
) : row.controllerId === row.config.address ? (
|
||||||
<Typography style={{ color: "#008000" }}>
|
<Typography style={{ color: "#c5e31e" }}>{"CONTROLLER"}</Typography>
|
||||||
{"ONLINE (v" +
|
) : row.online === 0 ? (
|
||||||
row.config.vMajor +
|
<Typography color="error">
|
||||||
"." +
|
{row.lastOnline !== 0
|
||||||
row.config.vMinor +
|
? formatDistance(row.lastOnline, row.clock, {
|
||||||
"." +
|
includeSeconds: false,
|
||||||
row.config.vRev +
|
addSuffix: true,
|
||||||
")"}
|
})
|
||||||
|
: "OFFLINE"}
|
||||||
</Typography>
|
</Typography>
|
||||||
) : (
|
) : (
|
||||||
<Typography style={{ color: "#f1c232" }}>
|
<Typography style={{ color: "#f1c232" }}>{"RELAYED"}</Typography>
|
||||||
{"RELAYED (v" +
|
|
||||||
row.config.vMajor +
|
|
||||||
"." +
|
|
||||||
row.config.vMinor +
|
|
||||||
"." +
|
|
||||||
row.config.vRev +
|
|
||||||
")"}
|
|
||||||
</Typography>
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "physicalip",
|
id: "physicalip",
|
||||||
name: "Physical IP / Latency",
|
name: "Version / Physical IP / Latency",
|
||||||
minWidth: "220px",
|
minWidth: "220px",
|
||||||
cell: (row) =>
|
cell: (row) =>
|
||||||
row.online === 1 ? (
|
row.online === 1 ? (
|
||||||
<p>
|
<p>
|
||||||
|
{"v" +
|
||||||
|
row.config.vMajor +
|
||||||
|
"." +
|
||||||
|
row.config.vMinor +
|
||||||
|
"." +
|
||||||
|
row.config.vRev}
|
||||||
|
<br />
|
||||||
{row.physicalAddress + "/" + row.physicalPort}
|
{row.physicalAddress + "/" + row.physicalPort}
|
||||||
<br />
|
<br />
|
||||||
{"(" + row.latency + " ms)"}
|
{"(" + row.latency + " ms)"}
|
||||||
|
@ -181,7 +182,7 @@ function NetworkMembers({ network }) {
|
||||||
spacing={0}
|
spacing={0}
|
||||||
direction="column"
|
direction="column"
|
||||||
alignItems="center"
|
alignItems="center"
|
||||||
justify="center"
|
justifyContent="center"
|
||||||
style={{
|
style={{
|
||||||
minHeight: "50vh",
|
minHeight: "50vh",
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -69,8 +69,8 @@ function NetworkSettings({ network, setNetwork }) {
|
||||||
value={network["description"]}
|
value={network["description"]}
|
||||||
onChange={handleChange("description")}
|
onChange={handleChange("description")}
|
||||||
multiline
|
multiline
|
||||||
rows={2}
|
minRows={2}
|
||||||
rowsMax={Infinity}
|
maxRows={Infinity}
|
||||||
label="Description"
|
label="Description"
|
||||||
variant="filled"
|
variant="filled"
|
||||||
InputLabelProps={{
|
InputLabelProps={{
|
||||||
|
|
|
@ -10,6 +10,6 @@ export default axios.create({
|
||||||
localStorage.getItem("disableAuth") === "true"
|
localStorage.getItem("disableAuth") === "true"
|
||||||
? {}
|
? {}
|
||||||
: {
|
: {
|
||||||
Authorization: `Bearer ${JSON.parse(localStorage.getItem("token"))}`,
|
Authorization: `token ${JSON.parse(localStorage.getItem("token"))}`,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
15
package.json
15
package.json
|
@ -8,6 +8,7 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"postinstall": "husky install",
|
"postinstall": "husky install",
|
||||||
"upgradeDeps": "yarn upgrade-interactive",
|
"upgradeDeps": "yarn upgrade-interactive",
|
||||||
|
"upgradeYarn": "yarn set version latest",
|
||||||
"cleanDeps": "cd frontend && rimraf node_modules && cd ../backend && rimraf node_modules && cd .. && rimraf node_modules",
|
"cleanDeps": "cd frontend && rimraf node_modules && cd ../backend && rimraf node_modules && cd .. && rimraf node_modules",
|
||||||
"lint": "yarn prettier --write .",
|
"lint": "yarn prettier --write .",
|
||||||
"dev": "concurrently \"cd frontend && cross-env FAST_REFRESH=true yarn start\" \"cd backend && cross-env NODE_ENV=development ZU_DEFAULT_USERNAME=admin ZU_DEFAULT_PASSWORD=zero-ui nodemon ./bin/www --ignore data/db.json\"",
|
"dev": "concurrently \"cd frontend && cross-env FAST_REFRESH=true yarn start\" \"cd backend && cross-env NODE_ENV=development ZU_DEFAULT_USERNAME=admin ZU_DEFAULT_PASSWORD=zero-ui nodemon ./bin/www --ignore data/db.json\"",
|
||||||
|
@ -17,15 +18,15 @@
|
||||||
"commit": "yarn git-cz"
|
"commit": "yarn git-cz"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^17.0.2",
|
"@commitlint/cli": "^17.0.3",
|
||||||
"@commitlint/config-conventional": "^17.0.2",
|
"@commitlint/config-conventional": "^17.0.3",
|
||||||
"commitizen": "^4.2.4",
|
"commitizen": "^4.2.5",
|
||||||
"concurrently": "^7.2.2",
|
"concurrently": "^7.3.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"cz-conventional-changelog": "^3.3.0",
|
"cz-conventional-changelog": "^3.3.0",
|
||||||
"husky": "^8.0.1",
|
"husky": "^8.0.1",
|
||||||
"lint-staged": "^13.0.2",
|
"lint-staged": "^13.0.3",
|
||||||
"nodemon": "^2.0.16",
|
"nodemon": "^2.0.19",
|
||||||
"prettier": "^2.7.1",
|
"prettier": "^2.7.1",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"standard-version": "^9.5.0"
|
"standard-version": "^9.5.0"
|
||||||
|
@ -51,5 +52,5 @@
|
||||||
"yarn prettier --write"
|
"yarn prettier --write"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@3.2.1"
|
"packageManager": "yarn@3.2.3"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue