diff --git a/client/src/pages/Routers.tsx b/client/src/pages/Routers.tsx index 8149651..32c8ea2 100644 --- a/client/src/pages/Routers.tsx +++ b/client/src/pages/Routers.tsx @@ -48,7 +48,7 @@ export default function Routers() { defaultValues: { name: "", ipAddress: "", - apiPort: 8728, + apiPort: 443, username: "", password: "", enabled: true, @@ -240,18 +240,18 @@ export default function Routers() { name="apiPort" render={({ field }) => ( - Porta API + Porta REST API field.onChange(parseInt(e.target.value))} data-testid="input-port" /> - Porta API MikroTik (default: 8728 per API, 8729 per API-SSL) + Porta REST API MikroTik (443 HTTPS o 80 HTTP) @@ -482,16 +482,19 @@ export default function Routers() { name="apiPort" render={({ field }) => ( - Porta API + Porta REST API field.onChange(parseInt(e.target.value))} data-testid="input-edit-port" /> + + Porta REST API MikroTik (443 HTTPS o 80 HTTP) + )} diff --git a/server/routes.ts b/server/routes.ts index 9b0f3b9..2931f26 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -60,33 +60,54 @@ export async function registerRoutes(app: Express): Promise { return res.status(404).json({ error: "Router not found" }); } - // Test connessione TCP/HTTP al router - const testUrl = `http://${router.ipAddress}:${router.apiPort}`; + // Test connessione REST API MikroTik + // Usa HTTPS per porta 443, HTTP per altre + const protocol = router.apiPort === 443 ? 'https' : 'http'; + const testUrl = `${protocol}://${router.ipAddress}:${router.apiPort}/rest/system/resource`; try { - // Timeout di 5 secondi per il test + // Timeout di 10 secondi per il test const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), 5000); + const timeoutId = setTimeout(() => controller.abort(), 10000); const response = await fetch(testUrl, { method: 'GET', signal: controller.signal, headers: { 'Authorization': 'Basic ' + Buffer.from(`${router.username}:${router.password}`).toString('base64') - } + }, + // Ignora errori certificato SSL self-signed (comune in MikroTik) + // @ts-ignore - Node.js fetch options + rejectUnauthorized: false }); clearTimeout(timeoutId); - // Aggiorna lastSync direttamente (non in InsertRouter schema) - await db.update(routers).set({ lastSync: new Date() }).where(eq(routers.id, router.id)); - - res.json({ - success: true, - message: `Router ${router.name} raggiungibile (HTTP ${response.status})`, - status: response.status, - statusText: response.statusText - }); + // Verifica status: 200 = OK, 401 = credenziali errate ma raggiungibile + if (response.status === 200) { + // Successo! Aggiorna lastSync + await db.update(routers).set({ lastSync: new Date() }).where(eq(routers.id, router.id)); + + res.json({ + success: true, + message: `Router ${router.name} connesso con successo! REST API funzionante.`, + status: response.status + }); + } else if (response.status === 401 || response.status === 403) { + // Router raggiungibile ma credenziali errate + res.status(401).json({ + error: "Autenticazione fallita", + message: `Router raggiungibile ma le credenziali sono errate. Verifica username e password.`, + status: response.status + }); + } else { + // Altro errore HTTP + res.status(response.status).json({ + error: `Errore HTTP ${response.status}`, + message: `Il router risponde ma con stato ${response.status}: ${response.statusText}`, + status: response.status + }); + } } catch (fetchError: any) { console.error('[Router TEST] Connection failed:', fetchError.message); diff --git a/shared/schema.ts b/shared/schema.ts index 0c711a6..f565c45 100644 --- a/shared/schema.ts +++ b/shared/schema.ts @@ -8,7 +8,7 @@ export const routers = pgTable("routers", { id: varchar("id").primaryKey().default(sql`gen_random_uuid()`), name: text("name").notNull(), ipAddress: text("ip_address").notNull().unique(), - apiPort: integer("api_port").notNull().default(8728), + apiPort: integer("api_port").notNull().default(443), username: text("username").notNull(), password: text("password").notNull(), enabled: boolean("enabled").notNull().default(true),