Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions sealos-complik-admin/web/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Navigate, Route, Routes } from "react-router-dom";
import { AppLayout } from "./components/AppLayout";
import { AutobanPolicyPage } from "./pages/AutobanPolicyPage";
import { BansPage } from "./pages/BansPage";
import { CommitmentsPage } from "./pages/CommitmentsPage";
import { ConfigsPage } from "./pages/ConfigsPage";
Expand All @@ -19,6 +20,7 @@ export default function App() {
<Route path="/namespaces/:namespace" element={<NamespaceDetailPage />} />
<Route path="/discovered-paths" element={<DiscoveredPathsPage />} />
<Route path="/violations" element={<ViolationsPage />} />
<Route path="/autoban" element={<AutobanPolicyPage />} />
<Route path="/configs" element={<ConfigsPage />} />
<Route path="/commitments" element={<CommitmentsPage />} />
<Route path="/bans" element={<BansPage />} />
Expand Down
2 changes: 2 additions & 0 deletions sealos-complik-admin/web/src/components/AppLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
FileText,
LayoutGrid,
Network,
ShieldAlert,
ShieldCheck,
} from "lucide-react";
import { NavLink, Outlet } from "react-router-dom";
Expand All @@ -16,6 +17,7 @@ const navItems = [
{ label: "命名空间详情", path: "/namespaces", icon: ShieldCheck },
{ label: "入口路径", path: "/discovered-paths", icon: Network },
{ label: "违规中心", path: "/violations", icon: AlertTriangle },
{ label: "自动封禁", path: "/autoban", icon: ShieldAlert },
{ label: "项目配置", path: "/configs", icon: FileCog },
{ label: "承诺书管理", path: "/commitments", icon: FileText },
{ label: "封禁记录", path: "/bans", icon: Ban },
Expand Down
5 changes: 5 additions & 0 deletions sealos-complik-admin/web/src/contexts/AppDataContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ const quickLinks: QuickLinkItem[] = [
description: "核对当前有效封禁,并补录新的封禁信息。",
targetPath: "/bans",
},
{
title: "配置自动封禁",
description: "维护自动封禁开关、触发来源和进程名规则。",
targetPath: "/autoban",
},
{
title: "维护项目配置",
description: "查看配置类型、描述和 JSON 内容。",
Expand Down
25 changes: 25 additions & 0 deletions sealos-complik-admin/web/src/lib/api.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { formatDateTime, toTimestamp } from "./utils";
import type {
AutobanPolicy,
BanRecord,
CommitmentRecord,
ConfigRecord,
Expand All @@ -20,6 +21,9 @@ import type {
ViolationRecord,
} from "../types";

export const AUTOBAN_POLICY_CONFIG_NAME = "autoban_policy";
export const AUTOBAN_POLICY_CONFIG_TYPE = "autoban_policy";

type ApiErrorPayload = {
message?: string;
error?: string;
Expand Down Expand Up @@ -428,6 +432,11 @@ export async function listConfigRecords() {
return data.map(toConfigRecord);
}

export async function listConfigRecordsByType(configType: string) {
const data = await request<ProjectConfigDto[]>(`/api/configs/type/${encodeURIComponent(configType)}`);
return data.map(toConfigRecord);
}

export async function listConfigRecordsPage(query: RecordListQuery): Promise<PaginatedRecords<ConfigRecord>> {
const data = await request<PaginatedDto<ProjectConfigDto>>(`/api/configs?${buildRecordListParams(query).toString()}`);
return toPaginatedRecords(data, toConfigRecord);
Expand Down Expand Up @@ -463,6 +472,22 @@ export async function updateConfigRecord(configName: string, input: UpdateConfig
});
}

export async function saveAutobanPolicy(policy: AutobanPolicy, existingConfigName?: string) {
const input = {
configName: AUTOBAN_POLICY_CONFIG_NAME,
configType: AUTOBAN_POLICY_CONFIG_TYPE,
description: "Admin automatic namespace ban policy",
value: JSON.stringify(policy),
};

if (existingConfigName) {
await updateConfigRecord(existingConfigName, input);
return;
}

await createConfigRecord(input);
}

export async function listCommitmentRecords() {
const data = await request<CommitmentDto[]>("/api/commitments");
return data.map(toCommitmentRecord);
Expand Down
Loading