v1.0
This commit is contained in:
122
index.ts
122
index.ts
@@ -1,16 +1,27 @@
|
||||
import { serve } from "bun";
|
||||
import { serve } from 'bun';
|
||||
import { RouterOSAPI } from 'node-routeros';
|
||||
import cfg from "./config.json";
|
||||
import cfg from './config.json';
|
||||
|
||||
let api = new RouterOSAPI({
|
||||
host: cfg.host,
|
||||
user: cfg.user,
|
||||
password: cfg.password
|
||||
});
|
||||
let haslogin = cfg.login;
|
||||
|
||||
const maincidr = cfg.maincidr;
|
||||
const proxycidr = cfg.proxycidr;
|
||||
|
||||
let haslogin = cfg.login;
|
||||
type Device = {
|
||||
'id': string,
|
||||
'address': string,
|
||||
'mac': string,
|
||||
'status': string,
|
||||
'host': string,
|
||||
'comment': string
|
||||
}
|
||||
let list: Device[] = [];
|
||||
|
||||
if (haslogin) {
|
||||
if (!await connectAPI()) {
|
||||
haslogin = false;
|
||||
@@ -18,17 +29,17 @@ if (haslogin) {
|
||||
}
|
||||
|
||||
const server = serve({
|
||||
port: 3000, async fetch(request) {
|
||||
port: cfg.port, async fetch(request) {
|
||||
const url = new URL(request.url);
|
||||
if (url.pathname === "/") {
|
||||
let file = haslogin ? Bun.file("./index.html") : Bun.file("./login.html");
|
||||
if (url.pathname === '/') {
|
||||
let file = haslogin ? Bun.file('./index.html') : Bun.file('./login.html');
|
||||
return new Response(file);
|
||||
}
|
||||
|
||||
if (url.pathname === "/core/login/") {
|
||||
if (url.pathname === '/core/login/') {
|
||||
let data = await request.json();
|
||||
if (data.user === "" || data.password === "" || data.host === "") {
|
||||
return new Response("参数错误", { status: 400 });
|
||||
if (data.user === '' || data.password === '' || data.host === '') {
|
||||
return new Response('参数缺失', { status: 400 });
|
||||
}
|
||||
api = new RouterOSAPI({
|
||||
host: data.host,
|
||||
@@ -37,71 +48,109 @@ const server = serve({
|
||||
});
|
||||
if (await connectAPI()) {
|
||||
writeConfig(data.host, data.user, data.password, data.main, data.proxy);
|
||||
console.log("配置文件已更新");
|
||||
return new Response("登入成功");
|
||||
console.log('配置文件已更新');
|
||||
return new Response('登入成功');
|
||||
} else {
|
||||
return new Response("ROS登入失败", { status: 400 });
|
||||
return new Response('ROS登入失败', { status: 400 });
|
||||
}
|
||||
}
|
||||
|
||||
if (url.pathname === "/core/get/") {
|
||||
if (!haslogin) return new Response("ROS配置未设置", { status: 401 });
|
||||
if (url.pathname === '/core/get/') {
|
||||
if (!haslogin) return new Response('ROS配置未设置', { status: 401 });
|
||||
return new Response(JSON.stringify(await getDHCPList()));
|
||||
}
|
||||
|
||||
if (url.pathname === "/core/switch/") {
|
||||
if (!haslogin) return new Response("ROS配置未设置", { status: 401 });
|
||||
if (url.pathname === '/core/switch/') {
|
||||
if (!haslogin) return new Response('ROS配置未设置', { status: 401 });
|
||||
let data = await request.json();
|
||||
let id = data.id;
|
||||
let mac = data.mac;
|
||||
let group = data.group;
|
||||
if ((id === "" && mac === "") || group === "") {
|
||||
return new Response("400 Bad Request", { status: 400 });
|
||||
if ((id === '' && mac === '')) {
|
||||
return new Response('参数缺失', { status: 401 });
|
||||
}
|
||||
let isExists: boolean = false;
|
||||
let addr = '';
|
||||
for (let i in list) {
|
||||
if (list[i].id === id || list[i].mac === mac) {
|
||||
id = list[i].id;
|
||||
addr = list[i].address;
|
||||
isExists = true;
|
||||
}
|
||||
}
|
||||
if ((!isExists)) {
|
||||
return new Response('设备不存在', { status: 401 });
|
||||
}
|
||||
if (group !== 'main' && group !== 'proxy') {
|
||||
return new Response('group错误', { status: 401 });
|
||||
}
|
||||
if (await switchNetgate(id, addr, group)) {
|
||||
return new Response('登入成功');
|
||||
} else {
|
||||
return new Response('切换失败', { status: 401 });
|
||||
}
|
||||
switchNetgate('*458',group);
|
||||
}
|
||||
|
||||
if (url.pathname === "/core/logout/") {
|
||||
if (url.pathname === '/core/logout/') {
|
||||
cleanConfig();
|
||||
return new Response("已登出");
|
||||
return new Response('已登出');
|
||||
}
|
||||
|
||||
return new Response("Page not found", { status: 404 });
|
||||
return new Response('Page not found', { status: 404 });
|
||||
}
|
||||
});
|
||||
console.log(`Listening on http://localhost:${server.port} ...`);
|
||||
console.log(`前端已开启: http://localhost:${server.port} ...`);
|
||||
|
||||
async function connectAPI() {
|
||||
try {
|
||||
await api.connect();
|
||||
console.log("API登入成功");
|
||||
console.log('API登入成功');
|
||||
return true;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
console.log("API登入失败");
|
||||
console.log('API登入失败');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async function getDHCPList() {
|
||||
const result = await api.write('/ip/dhcp-server/lease/print');
|
||||
let list = [];
|
||||
list = [];
|
||||
for (let eq in result) {
|
||||
list.push({
|
||||
'id': result[eq]['.id'],
|
||||
'address': result[eq]['address'],
|
||||
'mac-address': result[eq]['mac-address'],
|
||||
'mac': result[eq]['mac-address'],
|
||||
'status': result[eq]['status'],
|
||||
'host-name': result[eq]['host-name'],
|
||||
'host': result[eq]['host-name'],
|
||||
'comment': result[eq]['comment'],
|
||||
});
|
||||
}
|
||||
console.log(list);
|
||||
return list;
|
||||
}
|
||||
|
||||
async function switchNetgate(id:string,group:string) {
|
||||
const result = await api.write('/ip/dhcp-server/lease/set',['=.id='+id,'=address='+(group==='proxy'?'10.225.1.100':'10.225.0.100')]);
|
||||
async function switchNetgate(id: string, addr: string, group: string) {
|
||||
try {
|
||||
let mask = Number.parseInt(maincidr.split('/')[1]);
|
||||
let targetcidr = (group === 'proxy' ? proxycidr : maincidr).split('/')[0].split('.');
|
||||
let address = addr.split('.');
|
||||
let num = 2;
|
||||
if (mask == 16) {
|
||||
num = 1;
|
||||
} else if (mask == 8) {
|
||||
num = 0;
|
||||
}
|
||||
for (let i = 0; i <= num; i++) {
|
||||
address[i] = targetcidr[i];
|
||||
}
|
||||
console.log('原IP' + addr + '切换至' + address.join('.'));
|
||||
|
||||
const result = await api.write('/ip/dhcp-server/lease/set', ['=.id=' + id, '=address=' + address.join('.')]);
|
||||
return true;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async function writeConfig(host: string, user: string, password: string, mcidr: string, pcidr: string) {
|
||||
@@ -113,11 +162,16 @@ async function writeConfig(host: string, user: string, password: string, mcidr:
|
||||
cfg.proxycidr = pcidr;
|
||||
|
||||
haslogin = true;
|
||||
await Bun.write("./config.json", JSON.stringify(cfg));
|
||||
await Bun.write('./config.json', JSON.stringify(cfg));
|
||||
}
|
||||
|
||||
async function cleanConfig() {
|
||||
cfg.login = false;
|
||||
haslogin = false;
|
||||
await Bun.write("./config.json", JSON.stringify(cfg));
|
||||
cfg.login = false;
|
||||
cfg.host = "";
|
||||
cfg.user = "";
|
||||
cfg.password = "";
|
||||
cfg.maincidr = "";
|
||||
cfg.proxycidr = "";
|
||||
await Bun.write('./config.json', JSON.stringify(cfg));
|
||||
}
|
||||
Reference in New Issue
Block a user