Update Mikrotik router connection settings and remove redundant tests
Removes the connection testing functionality and updates the default API port to 8729 for Mikrotik routers. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 7a657272-55ba-4a79-9a2e-f1ed9bc7a528 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 54ecaeb2-ec77-4629-8d8d-e3bc4f663bec Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/449cf7c4-c97a-45ae-8234-e5c5b8d6a84f/7a657272-55ba-4a79-9a2e-f1ed9bc7a528/31VdIyL
This commit is contained in:
parent
81d3617b6b
commit
7eb0991cb5
@ -24,7 +24,7 @@ import {
|
||||
} from "@/components/ui/form";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import { Switch } from "@/components/ui/switch";
|
||||
import { Server, Plus, Trash2, Edit, Wifi, WifiOff } from "lucide-react";
|
||||
import { Server, Plus, Trash2, Edit } from "lucide-react";
|
||||
import { format } from "date-fns";
|
||||
import { useForm } from "react-hook-form";
|
||||
import { zodResolver } from "@hookform/resolvers/zod";
|
||||
@ -37,7 +37,6 @@ export default function Routers() {
|
||||
const [addDialogOpen, setAddDialogOpen] = useState(false);
|
||||
const [editDialogOpen, setEditDialogOpen] = useState(false);
|
||||
const [editingRouter, setEditingRouter] = useState<Router | null>(null);
|
||||
const [testingRouterId, setTestingRouterId] = useState<string | null>(null);
|
||||
|
||||
const { data: routers, isLoading } = useQuery<Router[]>({
|
||||
queryKey: ["/api/routers"],
|
||||
@ -48,7 +47,7 @@ export default function Routers() {
|
||||
defaultValues: {
|
||||
name: "",
|
||||
ipAddress: "",
|
||||
apiPort: 443,
|
||||
apiPort: 8729,
|
||||
username: "",
|
||||
password: "",
|
||||
enabled: true,
|
||||
@ -124,28 +123,6 @@ export default function Routers() {
|
||||
},
|
||||
});
|
||||
|
||||
const testConnectionMutation = useMutation({
|
||||
mutationFn: async (id: string) => {
|
||||
const response = await apiRequest("POST", `/api/routers/${id}/test`);
|
||||
return response;
|
||||
},
|
||||
onSuccess: (data: any) => {
|
||||
toast({
|
||||
title: "Connessione riuscita",
|
||||
description: data.message || "Il router è raggiungibile e le credenziali sono corrette",
|
||||
});
|
||||
setTestingRouterId(null);
|
||||
},
|
||||
onError: (error: any) => {
|
||||
toast({
|
||||
title: "Connessione fallita",
|
||||
description: error.message || "Impossibile connettersi al router. Verifica IP, porta e credenziali.",
|
||||
variant: "destructive",
|
||||
});
|
||||
setTestingRouterId(null);
|
||||
},
|
||||
});
|
||||
|
||||
const handleAddSubmit = (data: InsertRouter) => {
|
||||
addMutation.mutate(data);
|
||||
};
|
||||
@ -169,11 +146,6 @@ export default function Routers() {
|
||||
setEditDialogOpen(true);
|
||||
};
|
||||
|
||||
const handleTestConnection = (id: string) => {
|
||||
setTestingRouterId(id);
|
||||
testConnectionMutation.mutate(id);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-6 p-6" data-testid="page-routers">
|
||||
<div className="flex items-center justify-between">
|
||||
@ -195,7 +167,7 @@ export default function Routers() {
|
||||
<DialogHeader>
|
||||
<DialogTitle>Aggiungi Router MikroTik</DialogTitle>
|
||||
<DialogDescription>
|
||||
Configura un nuovo router MikroTik per il sistema IDS. Assicurati che l'API REST sia abilitata.
|
||||
Configura un nuovo router MikroTik per il sistema IDS. Assicurati che l'API RouterOS (porta 8729/8728) sia abilitata.
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
|
||||
@ -240,18 +212,18 @@ export default function Routers() {
|
||||
name="apiPort"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>Porta REST API</FormLabel>
|
||||
<FormLabel>Porta API</FormLabel>
|
||||
<FormControl>
|
||||
<Input
|
||||
type="number"
|
||||
placeholder="443"
|
||||
placeholder="8729"
|
||||
{...field}
|
||||
onChange={(e) => field.onChange(parseInt(e.target.value))}
|
||||
data-testid="input-port"
|
||||
/>
|
||||
</FormControl>
|
||||
<FormDescription>
|
||||
Porta REST API MikroTik (443 HTTPS o 80 HTTP)
|
||||
Porta RouterOS API MikroTik (8729 per API-SSL, 8728 per API)
|
||||
</FormDescription>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
@ -396,24 +368,11 @@ export default function Routers() {
|
||||
variant="outline"
|
||||
size="sm"
|
||||
className="flex-1"
|
||||
onClick={() => handleTestConnection(router.id)}
|
||||
disabled={testingRouterId === router.id}
|
||||
data-testid={`button-test-${router.id}`}
|
||||
>
|
||||
{testingRouterId === router.id ? (
|
||||
<WifiOff className="h-4 w-4 mr-2 animate-pulse" />
|
||||
) : (
|
||||
<Wifi className="h-4 w-4 mr-2" />
|
||||
)}
|
||||
{testingRouterId === router.id ? "Test..." : "Test"}
|
||||
</Button>
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
onClick={() => handleEdit(router)}
|
||||
data-testid={`button-edit-${router.id}`}
|
||||
>
|
||||
<Edit className="h-4 w-4" />
|
||||
<Edit className="h-4 w-4 mr-2" />
|
||||
Modifica
|
||||
</Button>
|
||||
<Button
|
||||
variant="outline"
|
||||
@ -482,18 +441,18 @@ export default function Routers() {
|
||||
name="apiPort"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>Porta REST API</FormLabel>
|
||||
<FormLabel>Porta API</FormLabel>
|
||||
<FormControl>
|
||||
<Input
|
||||
type="number"
|
||||
placeholder="443"
|
||||
placeholder="8729"
|
||||
{...field}
|
||||
onChange={(e) => field.onChange(parseInt(e.target.value))}
|
||||
data-testid="input-edit-port"
|
||||
/>
|
||||
</FormControl>
|
||||
<FormDescription>
|
||||
Porta REST API MikroTik (443 HTTPS o 80 HTTP)
|
||||
Porta RouterOS API MikroTik (8729 per API-SSL, 8728 per API)
|
||||
</FormDescription>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
|
||||
@ -53,88 +53,6 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
||||
}
|
||||
});
|
||||
|
||||
app.post("/api/routers/:id/test", async (req, res) => {
|
||||
try {
|
||||
const router = await storage.getRouterById(req.params.id);
|
||||
if (!router) {
|
||||
return res.status(404).json({ error: "Router not found" });
|
||||
}
|
||||
|
||||
// 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 10 secondi per il test
|
||||
const controller = new AbortController();
|
||||
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);
|
||||
|
||||
// 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);
|
||||
|
||||
// Differenzia gli errori
|
||||
if (fetchError.name === 'AbortError') {
|
||||
res.status(408).json({
|
||||
error: "Timeout: Il router non risponde entro 5 secondi",
|
||||
message: `Impossibile connettersi a ${router.ipAddress}:${router.apiPort}. Verifica che il router sia acceso e raggiungibile.`
|
||||
});
|
||||
} else if (fetchError.code === 'ECONNREFUSED') {
|
||||
res.status(503).json({
|
||||
error: "Connessione rifiutata",
|
||||
message: `Il router a ${router.ipAddress}:${router.apiPort} rifiuta la connessione. Verifica che l'API REST sia abilitata.`
|
||||
});
|
||||
} else {
|
||||
res.status(503).json({
|
||||
error: "Errore di connessione",
|
||||
message: `${fetchError.message}. Verifica IP, porta e firewall.`
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[Router TEST] Error:', error);
|
||||
res.status(500).json({ error: "Failed to test router connection" });
|
||||
}
|
||||
});
|
||||
|
||||
// Network Logs
|
||||
app.get("/api/logs", async (req, res) => {
|
||||
try {
|
||||
|
||||
@ -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(443),
|
||||
apiPort: integer("api_port").notNull().default(8729),
|
||||
username: text("username").notNull(),
|
||||
password: text("password").notNull(),
|
||||
enabled: boolean("enabled").notNull().default(true),
|
||||
|
||||
Loading…
Reference in New Issue
Block a user