You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

187 lines
5.0 KiB
JavaScript

const express = require('express')
const { Routeros } = require("routeros-node");
const bodyparser = require('body-parser');
const app = express()
const routeros = new Routeros({
host: "203.83.6.82",
port: 8728,
user: "admin",
password: "HYPerLINk6",
});
var conn = null;
routeros.connect().then(s => {
conn = s;
});
app.use(bodyparser.json());
app.get('/api/kms-clients/:ip?', async function (req, res) {
var command = [
"/ip/firewall/address-list/print",
"?list=kms-allowed"
]
if (req.params.user) {
command.push(`?address=${req.params.user}`)
}
result = await conn.write(command);
res.json(result)
})
app.post('/api/kms-clients', async function (req, res) {
if (!req.body.address.match(/[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\/?[0-9]{0,2}/)) {
return res.status(400).json({ "Error": "Invalid IP Address" })
}
var command = [
"/ip/firewall/address-list/add",
"=list=kms-allowed",
`=address=${req.body.address}`,
`=comment=${req.body.comment}`,
]
if (req.params.user) {
command.push(`?address=${req.params.user}`)
}
result = await conn.write(command);
res.json(result)
})
app.get('/api/vpn-active/:user?', async function (req, res) {
var command = [
"/ppp/active/print"
]
if (req.params.user) {
command.push(`?name=${req.params.user}`)
}
result = await conn.write(command);
res.json(result)
})
app.delete('/api/vpn-active/:user', async function (req, res) {
var command = [
"/ppp/active/print",
`?name=${req.params.user}`
]
result = await conn.write(command);
var user = result.filter(i => { return i.name == req.params.user })
if (user.length !== 1) {
// return res.send(400).json({"Error": "User is not active"})
// nope
} else {
try {
console.log(user[0])
console.log(`=.id=${user[0]['.id']}`)
var command = [
"/ppp/active/remove",
`=.id=${user[".id"]}`
]
result = await conn.write(command);
} catch (e) {
console.error(e)
}
}
res.json(result)
})
app.get('/api/vpn-sessions/:user?', async function (req, res) {
// const conn = await routeros.connect();
var command = [
"/user-manager/session/print"
]
if (req.params.user) {
command.push(`?user=${req.params.user}`)
}
result = await conn.write(command);
res.json(result)
})
app.get('/api/vpn-users/:user?', async function (req, res) {
// const conn = await routeros.connect();
var command = [
"/user-manager/user/print"
]
if (req.params.user) {
command.push(`?name=${req.params.user}`)
}
var result = await conn.write(command);
const allowedFields = ['name', 'group', 'attributes', 'comment', '.id']
var users = [];
result.forEach(user => {
var userObject = {}
Object.keys(user).forEach(key => {
if (allowedFields.includes(key))
userObject[key] = user[key]
})
users.push(userObject);
})
res.json(users)
})
app.post('/api/vpn-users', (req, res) => {
// console.log(req.body);
const allowedFields = ['name', 'password', 'otp-secret', 'group', '.id']
var userObject = {};
Object.keys(req.body).forEach(k => {
if (allowedFields.includes(k))
userObject[k] = req.body[k]
})
res.send(userObject)
})
async function run() {
const routeros = new Routeros({
host: "203.83.6.82",
port: 8728,
user: "admin",
password: "HYPerLINk6",
});
try {
// connect to RouterOS
const conn = await routeros.connect();
// if connected successfully will return the connected instance/socket,
console.log("conn===>", conn);
// after that we can write the query
// const usersHotspot = await conn.write([
// "/user-manager/user/add",
// "=name=aaron",
// "=password=Falz1982",
// "=group=vpn"]);
const usersHotspot = await conn.write([
"/user-manager/session/print",
"?user=ben"
// "=name=aaron",
// "=password=Falz1982",
// "=group=vpn"
]);
console.log(usersHotspot);
} catch (error) {
// if it fails will return an error here
console.log("error===>", error);
} finally {
// dont forget to close connection
routeros.destroy();
// console.log(conn)
}
// return conn;
}
// run();
// console.log(conn)
function generateTOTPKey(length) {
const base32Characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
let key = '';
for (let i = 0; i < length; i++) {
const randomIndex = Math.floor(Math.random() * base32Characters.length);
key += base32Characters.charAt(randomIndex);
}
return key;
}
console.log(generateTOTPKey(32))
app.listen(3001)