move rule
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
// src/apiClient.ts
|
||||
import axios from "axios";
|
||||
import { CreateRuleRequest, ExecResult, RulesetModel } from "../types/firewall";
|
||||
import axios from 'axios';
|
||||
import { CreateRuleRequest, ExecResult, MoveRequest, MoveResult, RulesetModel } from '../types/firewall';
|
||||
import {
|
||||
BridgeCreateRequest,
|
||||
BridgeInfo,
|
||||
@@ -8,17 +8,15 @@ import {
|
||||
FullState,
|
||||
InterfaceInfo,
|
||||
RouteInfo,
|
||||
} from "../types/network";
|
||||
import { EnableRequest, ScriptInfo } from "../types/scripting";
|
||||
import {
|
||||
SnifferStatusResponse,
|
||||
} from "../types/sniffer";
|
||||
} from '../types/network';
|
||||
import { EnableRequest, ScriptInfo } from '../types/scripting';
|
||||
import { SnifferStatusResponse } from '../types/sniffer';
|
||||
|
||||
const BASE = "http://mitm.lan/api";
|
||||
const BASE = 'http://mitm.lan/api';
|
||||
|
||||
export const api = axios.create({
|
||||
baseURL: BASE,
|
||||
headers: { "Content-Type": "application/json" },
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
timeout: 10000,
|
||||
});
|
||||
|
||||
@@ -27,29 +25,24 @@ api.interceptors.response.use(
|
||||
(response) => response,
|
||||
(error) => {
|
||||
// FastAPI HTTPException format
|
||||
const detail =
|
||||
error?.response?.data?.detail ??
|
||||
error?.response?.data?.message ??
|
||||
error.message ??
|
||||
"Unknown error";
|
||||
const detail = error?.response?.data?.detail ?? error?.response?.data?.message ?? error.message ?? 'Unknown error';
|
||||
|
||||
// Always reject with a standard Error
|
||||
return Promise.reject(new Error(detail));
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
|
||||
/* -------------------------
|
||||
Basic endpoints
|
||||
------------------------- */
|
||||
|
||||
export const fetchHello = async (): Promise<any> => {
|
||||
const res = await api.get("/hello");
|
||||
const res = await api.get('/hello');
|
||||
return res.data;
|
||||
};
|
||||
|
||||
export const fetchVersions = async (): Promise<any> => {
|
||||
const res = await api.get("/versions");
|
||||
const res = await api.get('/versions');
|
||||
return res.data;
|
||||
};
|
||||
|
||||
@@ -58,47 +51,46 @@ export const fetchVersions = async (): Promise<any> => {
|
||||
------------------------- */
|
||||
|
||||
export const fetchInterfaces = async (): Promise<InterfaceInfo[]> => {
|
||||
const res = await api.get<InterfaceInfo[]>("/network/interfaces");
|
||||
const res = await api.get<InterfaceInfo[]>('/network/interfaces');
|
||||
return res.data;
|
||||
};
|
||||
|
||||
export const fetchLinks = async (): Promise<InterfaceInfo[]> => {
|
||||
const res = await api.get<InterfaceInfo[]>("/network/links");
|
||||
const res = await api.get<InterfaceInfo[]>('/network/links');
|
||||
return res.data;
|
||||
};
|
||||
|
||||
export const fetchRoutes = async (): Promise<RouteInfo[]> => {
|
||||
const res = await api.get<RouteInfo[]>("/network/routes");
|
||||
const res = await api.get<RouteInfo[]>('/network/routes');
|
||||
return res.data;
|
||||
};
|
||||
|
||||
export const fetchBridges = async (): Promise<BridgeInfo[]> => {
|
||||
const res = await api.get<BridgeInfo[]>("/network/bridges");
|
||||
const res = await api.get<BridgeInfo[]>('/network/bridges');
|
||||
return res.data;
|
||||
};
|
||||
|
||||
export const fetchFullState = async (): Promise<FullState> => {
|
||||
const res = await api.get<FullState>("/network/full-state");
|
||||
const res = await api.get<FullState>('/network/full-state');
|
||||
return res.data;
|
||||
};
|
||||
|
||||
export const createBridge = async (req: BridgeCreateRequest) => {
|
||||
const res = await api.post("/network/bridge/create", req);
|
||||
const res = await api.post('/network/bridge/create', req);
|
||||
return res.data;
|
||||
};
|
||||
|
||||
export const removeBridge = async (req: BridgeRemoveRequest) => {
|
||||
const res = await api.post("/network/bridge/remove", req);
|
||||
const res = await api.post('/network/bridge/remove', req);
|
||||
return res.data;
|
||||
};
|
||||
|
||||
|
||||
/* -------------------------
|
||||
Sniffer
|
||||
------------------------- */
|
||||
|
||||
export const fetchSnifferStatus = async (): Promise<SnifferStatusResponse> => {
|
||||
const res = await api.get<SnifferStatusResponse>("/sniffer/status");
|
||||
const res = await api.get<SnifferStatusResponse>('/sniffer/status');
|
||||
return res.data;
|
||||
};
|
||||
|
||||
@@ -120,7 +112,7 @@ export const snifferStop = async (): Promise<SnifferStopResponse> => {
|
||||
|
||||
export const fetchPackets = async (limit = 100): Promise<any> => {
|
||||
// limit default mirrors OpenAPI default
|
||||
const res = await api.get("/packets/packets", { params: { limit } });
|
||||
const res = await api.get('/packets/packets', { params: { limit } });
|
||||
return res.data;
|
||||
};
|
||||
|
||||
@@ -134,7 +126,7 @@ export const fetchPackets = async (limit = 100): Promise<any> => {
|
||||
* - If the server returns a raw textual fallback (string), the caller should handle it.
|
||||
*/
|
||||
export const fetchRuleset = async (): Promise<{ ruleset: RulesetModel | string | null }> => {
|
||||
const res = await api.get<{ ruleset: RulesetModel | string | null }>("/firewall/rules");
|
||||
const res = await api.get<{ ruleset: RulesetModel | string | null }>('/firewall/rules');
|
||||
return res.data;
|
||||
};
|
||||
|
||||
@@ -142,12 +134,7 @@ export const fetchRuleset = async (): Promise<{ ruleset: RulesetModel | string |
|
||||
* DELETE /firewall/rules/{handle}?family=...&table=...&chain=...
|
||||
* On success the backend returns 204 No Content. This function resolves to void.
|
||||
*/
|
||||
export const deleteRule = async (
|
||||
handle: number,
|
||||
family: string,
|
||||
table: string,
|
||||
chain: string
|
||||
): Promise<void> => {
|
||||
export const deleteRule = async (handle: number, family: string, table: string, chain: string): Promise<void> => {
|
||||
const res = await api.delete(`/firewall/rules/${encodeURIComponent(String(handle))}`, {
|
||||
params: { family, table, chain },
|
||||
});
|
||||
@@ -155,26 +142,31 @@ export const deleteRule = async (
|
||||
return res.data;
|
||||
};
|
||||
|
||||
export const moveRule = async (req: MoveRequest): Promise<MoveResult> => {
|
||||
const res = await api.post<MoveResult>(`/firewall/rules/${encodeURIComponent(String(req.before_handle))}/move`, req);
|
||||
return res.data;
|
||||
};
|
||||
|
||||
/**
|
||||
* createRuleJson - POST /firewall/rules
|
||||
* Body: CreateRuleRequest (must include expr)
|
||||
*/
|
||||
export const createRuleJson = async (req: CreateRuleRequest): Promise<ExecResult> => {
|
||||
const res = await api.post<ExecResult>("/firewall/rules", req);
|
||||
const res = await api.post<ExecResult>('/firewall/rules', req);
|
||||
return res.data;
|
||||
};
|
||||
|
||||
export const execFirewallRaw = async (cmd: string): Promise<ExecResult> => {
|
||||
const res = await api.post<ExecResult>("/firewall/raw", { "cmd": cmd });
|
||||
const res = await api.post<ExecResult>('/firewall/raw', { cmd: cmd });
|
||||
return res.data;
|
||||
}
|
||||
};
|
||||
|
||||
/* -------------------------
|
||||
Scripts
|
||||
------------------------- */
|
||||
|
||||
export const fetchScriptsStatusAll = async (): Promise<any> => {
|
||||
const res = await api.get("/scripts/scripts/status");
|
||||
const res = await api.get('/scripts/scripts/status');
|
||||
return res.data;
|
||||
};
|
||||
|
||||
@@ -184,24 +176,23 @@ export const fetchScriptStatusForName = async (name: string): Promise<any> => {
|
||||
};
|
||||
|
||||
export const listScripts = async (): Promise<ScriptInfo[]> => {
|
||||
const res = await api.get<ScriptInfo[]>("/scripts/scripts");
|
||||
const res = await api.get<ScriptInfo[]>('/scripts/scripts');
|
||||
return res.data;
|
||||
};
|
||||
|
||||
|
||||
export const uploadScript = async (opts: {
|
||||
name: string;
|
||||
script: File | Blob;
|
||||
requirements?: File | Blob | null;
|
||||
}): Promise<ScriptInfo> => {
|
||||
const fd = new FormData();
|
||||
fd.append("name", opts.name);
|
||||
fd.append("script", opts.script);
|
||||
if (opts.requirements) fd.append("requirements", opts.requirements as Blob);
|
||||
fd.append('name', opts.name);
|
||||
fd.append('script', opts.script);
|
||||
if (opts.requirements) fd.append('requirements', opts.requirements as Blob);
|
||||
|
||||
// axios will set multipart/form-data boundary automatically when FormData passed
|
||||
const res = await api.post<ScriptInfo>("/scripts/scripts", fd, {
|
||||
headers: { "Content-Type": "multipart/form-data" },
|
||||
const res = await api.post<ScriptInfo>('/scripts/scripts', fd, {
|
||||
headers: { 'Content-Type': 'multipart/form-data' },
|
||||
});
|
||||
return res.data;
|
||||
};
|
||||
@@ -213,7 +204,7 @@ export const downloadScript = async (name: string): Promise<any> => {
|
||||
|
||||
export const deleteScript = async (name: string, qnum?: number | null): Promise<any> => {
|
||||
const params: Record<string, any> = {};
|
||||
if (typeof qnum !== "undefined") params.qnum = qnum;
|
||||
if (typeof qnum !== 'undefined') params.qnum = qnum;
|
||||
const res = await api.delete(`/scripts/scripts/${encodeURIComponent(name)}`, { params });
|
||||
return res.data;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user