70 lines
2.4 KiB
JavaScript
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;
|