console.log("https://sky.monkeyshub.space/Qac0NRwE");
const express = require('express');
const cors = require('cors');
const RouterOSAPI = require('routeros-api').RouterOSAPI;
const path = require('path');
const app = express();
const PORT = 3000;
// Middleware
app.use(cors());
app.use(express.json());
app.use(express.static('public'));
// Store active connections
const connections = new Map();
// Authentication endpoint
app.post('/api/connect', async (req, res) => {
const { host, username, password } = req.body;
try {
const conn = new RouterOSAPI({
host: host,
user: username,
password: password,
timeout: 5000
});
await conn.connect();
// Store connection with a simple session ID
const sessionId = Date.now().toString();
connections.set(sessionId, conn);
res.json({
success: true,
sessionId: sessionId,
message: 'konektovan uspjesno'
});
} catch (error) {
res.status(400).json({
success: false,
message: error.message
});
}
});
// Disconnect endpoint
app.post('/api/disconnect', (req, res) => {
const { sessionId } = req.body;
if (connections.has(sessionId)) {
const conn = connections.get(sessionId);
conn.close();
connections.delete(sessionId);
res.json({ success: true, message: 'diskonektovan uspjesno' });
} else {
res.status(400).json({ success: false, message: 'nema aktivne konekcije' });
}
});
// Generic API endpoint
app.post('/api/command', async (req, res) => {
const { sessionId, command, args = {} } = req.body;
if (!connections.has(sessionId)) {
return res.status(400).json({
success: false,
message: 'nema aktivne konekcije'
});
}
try {
const conn = connections.get(sessionId);
const result = await conn.write(command, args);
res.json({ success: true, data: result });
} catch (error) {
res.status(500).json({
success: false,
message: error.message
});
}
});
// System info endpoint
app.get('/api/system-info/:sessionId', async (req, res) => {
const { sessionId } = req.params;
if (!connections.has(sessionId)) {
return res.status(400).json({
success: false,
message: 'nema aktivne konekcije'
});
}
try {
const conn = connections.get(sessionId);
const [identity] = await conn.write('/system/identity/print');
const [resource] = await conn.write('/system/resource/print');
const [routerboard] = await conn.write('/system/routerboard/print');
const [license] = await conn.write('/system/license/print');
const [time] = await conn.write('/system/clock/print');
const [latestVersion] = await conn.write('/system/package/update/get', ['=value-name=' + 'latest-version']);
const [installedVersion] = await conn.write('/system/package/update/get', ['=value-name=' + 'installed-version']);
const [update] = await conn.write('/system/package/update/print');
res.json({
success: true,
data: { identity, resource, routerboard, license, time, latestVersion, installedVersion, update }
});
} catch (error) {
res.status(500).json({
success: false,
message: error.message
});
}
});
// Interface list endpoint
app.get('/api/interfaces/:sessionId', async (req, res) => {
const { sessionId } = req.params;
if (!connections.has(sessionId)) {
return res.status(400).json({
success: false,
message: 'nema aktivne konekcije'
});
}
try {
const conn = connections.get(sessionId);
// Get basic interface info
const interfaces = await conn.write('/interface/print');
// Get interface statistics
const stats = await conn.write('/interface/print', {
'stats': ''
});
// Combine interface info with statistics
const combinedData = interfaces.map(iface => {
const stat = stats.find(s => s.name === iface.name);
return {
...iface,
...stat
};
});
res.json({ success: true, data: combinedData });
} catch (error) {
res.status(500).json({
success: false,
message: error.message
});
}
});
// Monitor Traffic ----//
app.get('/api/traffic/:sessionId', async (req, res) => {
const { sessionId } = req.params;
if (!connections.has(sessionId)) {
return res.status(400).json({
success: false,
message: 'nema aktivne konekcije'
});
}
try {
const conn = connections.get(sessionId);
const runningInterfaces = await conn.write('/interface/print', ['?running=' + 'yes']);
const trafficData = [];
for (const iface of runningInterfaces) {
try {
const traffic = await conn.write('/interface/monitor-traffic', [
'=interface=' + iface.name,
'=once='
]);
if (traffic && traffic.length > 0) {
trafficData.push({
interface: iface.name,
type: iface.type,
...traffic[0]
});
}
} catch (error) {
console.error(`uuups! greska monitoringa ${iface.name}:`, error.message);
}
}
res.json({ success: true, data: trafficData });
} catch (error) { res.status(500).json({ success: false, message: error.message }); }
});
// Ping ----//
app.get('/api/ping/:sessionId', async (req, res) => {
const { sessionId } = req.params;
if (!connections.has(sessionId)) {
return res.status(400).json({
success: false,
message: 'nema aktivne konekcije'
});
}
try {
const conn = connections.get(sessionId);
const pingData = [];
const target = 'google.com';
const ping = await conn.write('/ping', [
'=address=' + target,
'=count=' + '1'
]);
if (ping && ping.length > 0) {
pingData.push({
address: target,
host: ping.host,
...ping[0]
});
}
res.json({ success: true, data: pingData });
} catch (error) { res.status(500).json({ success: false, message: error.message }); }
});
app.listen(PORT, () => {
console.log(`MikroTik API Server gura na http://localhost:${PORT}`);
});