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),