mt-api

Run Settings
LanguageJavaScript
Language Version
Run Command
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}`); });
Editor Settings
Theme
Key bindings
Full width
Lines