ArmoHotspot/backend/dist/routes/deviceRoutes.js
Gökhan ÖZARSLAN fe09b726e3 kurulum5
2026-08-16 20:28:17 +03:00

70 lines
2.4 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = require("express");
const client_1 = require("@prisma/client");
const VpnService_1 = require("../services/VpnService");
const router = (0, express_1.Router)();
const prisma = new client_1.PrismaClient();
const vpnService = new VpnService_1.VpnService();
// Helper to generate a VPN IP for a new device
async function getNextVpnIp() {
const baseIp = '10.10.0.';
// Find the highest VPN IP currently in use
const lastDevice = await prisma.device.findFirst({
where: { vpnIp: { startsWith: baseIp } },
orderBy: { vpnIp: 'desc' }
});
if (!lastDevice || !lastDevice.vpnIp) {
return `${baseIp}1`; // Start with 10.10.0.1
}
const lastOctet = parseInt(lastDevice.vpnIp.split('.')[3], 10);
if (lastOctet >= 254) {
throw new Error('VPN IP pool exhausted in this subnet');
}
return `${baseIp}${lastOctet + 1}`;
}
// Get all devices
router.get('/', async (req, res) => {
try {
const devices = await prisma.device.findMany({ include: { tenant: true } });
res.json(devices);
}
catch (error) {
res.status(500).json({ error: 'Internal server error' });
}
});
// Create device for a tenant
router.post('/', async (req, res) => {
try {
const { tenantId, name, macAddress, opnsenseUrl, apiKey, apiSecret } = req.body;
// Automatically generate the VPN IP for this customer device
const nextVpnIp = await getNextVpnIp();
const newDevice = await prisma.device.create({
data: {
tenantId,
name,
macAddress,
vpnIp: nextVpnIp,
opnsenseUrl,
apiKey,
apiSecret
},
});
// Trigger OpenVPN config generation via SSH to the VPN Server (10.0.1.150)
try {
await vpnService.generateDeviceVpnConfig(macAddress, nextVpnIp);
console.log(`Successfully generated VPN config for ${macAddress} at ${nextVpnIp}`);
}
catch (vpnErr) {
console.error('Failed to generate VPN config:', vpnErr);
// We don't fail the API request entirely, but log the error
}
res.status(201).json(newDevice);
}
catch (error) {
console.error(error);
res.status(500).json({ error: 'Internal server error' });
}
});
exports.default = router;