feat: Remove frontend files, replace with auto build and copy into project dir (#4)

This commit is contained in:
DaLaw2 2025-08-30 19:22:20 +08:00 committed by GitHub
parent 3c912bb2d4
commit 688314da66
36 changed files with 183 additions and 151 deletions

View File

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 132 KiB

View File

Before

Width:  |  Height:  |  Size: 194 KiB

After

Width:  |  Height:  |  Size: 194 KiB

View File

Before

Width:  |  Height:  |  Size: 161 KiB

After

Width:  |  Height:  |  Size: 161 KiB

View File

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 130 KiB

2
.gitignore vendored
View File

@ -10,3 +10,5 @@ target/
.idea
logs
.env
net-guardia/static/web

11
Cargo.lock generated
View File

@ -703,6 +703,12 @@ dependencies = [
"syn",
]
[[package]]
name = "dotenvy"
version = "0.15.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
[[package]]
name = "encoding_rs"
version = "0.8.35"
@ -741,7 +747,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
dependencies = [
"libc",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -1204,6 +1210,7 @@ dependencies = [
"aya",
"aya-log",
"cargo_metadata",
"dotenvy",
"libc",
"mime_guess",
"net-guardia-common",
@ -1597,7 +1604,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]

View File

@ -13,21 +13,21 @@
## 🧩 功能模組
### 📊 儀表板總覽 (Dashboard)
![儀表板介面](./github/dashboard.png)
![儀表板介面](.github/images/dashboard.png)
- 即時網路流量監控與視覺化統計
- 近期流量大小統計與趨勢圖
### 📈 詳細流量統計 (Statistics)
![流量統計介面](./github/statistics.png)
![流量統計介面](.github/images/statistics.png)
- 各 IP 位址詳細流量使用情況
### 🔒 網路存取控制 (Access Control)
![存取控制介面](./github/accessControl.png)
![存取控制介面](.github/images/accessControl.png)
- IPv4/IPv6 黑白名單管理
- 精確的連接埠層級存取控制
### 🤖 AI 攻擊偵測 (AI Detection)
![AI 攻擊偵測介面](./github/aiDetection.png)
![AI 攻擊偵測介面](.github/images/aiDetection.png)
- 基於 AI 的攻擊偵測引擎
## ✨ 系統特色

View File

@ -28,6 +28,7 @@ tracing-subscriber = { version = "0.3.20", features = ["env-filter"] }
[build-dependencies]
cargo_metadata = { workspace = true }
dotenvy = "0.15.7"
[[bin]]
name = "net-guardia"

View File

@ -4,13 +4,13 @@ use std::{
path::PathBuf,
process::{Child, Command, Stdio},
};
use std::time::SystemTime;
use cargo_metadata::{Artifact, CompilerMessage, Message, Metadata, MetadataCommand, Package, Target, TargetKind};
fn main() {
build_ingress_ebpf();
build_egress_ebpf();
build_frontend();
}
/// This crate has a runtime dependency on artifacts produced by the `net-guardia-ingress-ebpf` crate.
@ -138,8 +138,8 @@ fn build_ingress_ebpf() {
for (name, binary) in executables {
let dst = out_dir.join(name);
let _: u64 = fs::copy(&binary, &dst)
.unwrap_or_else(|err| panic!("failed to copy {binary:?} to {dst:?}: {err}"));
let _: u64 =
fs::copy(&binary, &dst).unwrap_or_else(|err| panic!("failed to copy {binary:?} to {dst:?}: {err}"));
}
} else {
let Package { targets, .. } = ebpf_package;
@ -250,10 +250,10 @@ fn build_egress_ebpf() {
#[allow(clippy::collapsible_match)]
match message.expect("valid JSON") {
Message::CompilerArtifact(Artifact {
executable,
target: Target { name, .. },
..
}) => {
executable,
target: Target { name, .. },
..
}) => {
if let Some(executable) = executable {
executables.push((name, executable.into_std_path_buf()));
}
@ -279,8 +279,8 @@ fn build_egress_ebpf() {
for (name, binary) in executables {
let dst = out_dir.join(name);
let _: u64 = fs::copy(&binary, &dst)
.unwrap_or_else(|err| panic!("failed to copy {binary:?} to {dst:?}: {err}"));
let _: u64 =
fs::copy(&binary, &dst).unwrap_or_else(|err| panic!("failed to copy {binary:?} to {dst:?}: {err}"));
}
} else {
let Package { targets, .. } = ebpf_package;
@ -293,3 +293,160 @@ fn build_egress_ebpf() {
}
}
}
fn build_frontend() {
let _ = dotenvy::dotenv();
let Some(frontend_dir) = env::var_os("FRONTEND_DIR") else {
panic!("FRONTEND_DIR environment variable is required but not set");
};
let project_root = env::var("CARGO_MANIFEST_DIR").unwrap();
let static_dir = PathBuf::from(project_root).join("static").join("web");
let frontend_dir = PathBuf::from(frontend_dir);
if !frontend_dir.exists() {
panic!("Frontend directory {:?} does not exist", frontend_dir);
}
println!("cargo:rerun-if-changed={}", frontend_dir.join("src").display());
println!("cargo:rerun-if-changed={}", frontend_dir.join("public").display());
println!("cargo:rerun-if-changed={}", frontend_dir.join("package.json").display());
println!("cargo:rerun-if-changed={}", frontend_dir.join("package-lock.json").display());
println!("cargo:rerun-if-changed={}", frontend_dir.join("next.config.js").display());
println!("cargo:rerun-if-changed={}", frontend_dir.join("tailwind.config.js").display());
println!("cargo:rerun-if-changed={}", frontend_dir.join("postcss.config.js").display());
println!("cargo:rerun-if-changed={}", frontend_dir.join("tsconfig.json").display());
let out_dir = frontend_dir.join("out");
let need_build = needs_frontend_rebuild(&frontend_dir, &out_dir, &static_dir);
if !need_build {
return;
}
let mut cmd = Command::new("npm");
cmd.arg("install").current_dir(&frontend_dir);
let status = cmd
.status()
.unwrap_or_else(|err| panic!("failed to run npm install: {err}"));
if !status.success() {
panic!("npm install failed with exit code: {:?}", status.code());
}
let mut cmd = Command::new("npx");
cmd.args(["next", "build"]).current_dir(&frontend_dir);
let status = cmd
.status()
.unwrap_or_else(|err| panic!("failed to run next build: {err}"));
if !status.success() {
panic!("next build failed with exit code: {:?}", status.code());
}
if static_dir.exists() {
fs::remove_dir_all(&static_dir).unwrap_or_else(|err| panic!("failed to remove {:?}: {err}", static_dir));
}
fs::create_dir_all(&static_dir).unwrap_or_else(|err| panic!("failed to create {:?}: {err}", static_dir));
copy_dir_all(&out_dir, &static_dir).unwrap_or_else(|err| panic!("failed to copy frontend build: {err}"));
}
fn needs_frontend_rebuild(frontend_dir: &PathBuf, out_dir: &PathBuf, static_dir: &PathBuf) -> bool {
if !out_dir.exists() {
return true;
}
if !static_dir.exists() {
return true;
}
let out_modified = match fs::metadata(out_dir).and_then(|m| m.modified()) {
Ok(time) => time,
Err(_) => {
return true;
}
};
let static_modified = match fs::metadata(static_dir).and_then(|m| m.modified()) {
Ok(time) => time,
Err(_) => {
return true;
}
};
let essential_items = [
"src",
"public",
"package.json",
"next.config.js",
"tailwind.config.js",
"postcss.config.js",
"tsconfig.json",
"package-lock.json",
];
for item_name in essential_items {
let item_path = frontend_dir.join(item_name);
if !item_path.exists() {
continue;
}
let item_modified = match get_dir_last_modified(&item_path) {
Some(time) => time,
None => continue,
};
if item_modified > out_modified {
return true;
}
}
if out_modified > static_modified {
return true;
}
false
}
fn get_dir_last_modified(path: &PathBuf) -> Option<SystemTime> {
if path.is_file() {
return fs::metadata(path).and_then(|m| m.modified()).ok();
}
if path.is_dir() {
let mut latest = fs::metadata(path).and_then(|m| m.modified()).ok()?;
if let Ok(entries) = fs::read_dir(path) {
for entry in entries.flatten() {
if let Some(modified) = get_dir_last_modified(&entry.path()) {
if modified > latest {
latest = modified;
}
}
}
}
return Some(latest);
}
None
}
fn copy_dir_all(src: &PathBuf, dst: &PathBuf) -> std::io::Result<()> {
for entry in fs::read_dir(src)? {
let entry = entry?;
let file_type = entry.file_type()?;
let src_path = entry.path();
let dst_path = dst.join(entry.file_name());
if file_type.is_dir() {
fs::create_dir_all(&dst_path)?;
copy_dir_all(&src_path, &dst_path)?;
} else {
fs::copy(&src_path, &dst_path)?;
}
}
Ok(())
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,9 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[597],{5096:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var i=n(7876),r=n(4232),s=n(7328),a=n.n(s),o=n(6463),l=n(8230),c=n.n(l),d=n(9099),h=n(6848),p=n(1772),u=n(1041);let x=[{href:"/",icon:u.v02,label:"Home"},{href:"/dashboard",icon:u.xiI,label:"Dashboard"},{href:"/statistics",icon:u.$Fj,label:"Statistics"},{href:"/access-control",icon:u.imB,label:"Access Control"},{href:"/detection",icon:u.UBk,label:"Detection"}],m=e=>{let{children:t}=e,n=(0,d.useRouter)(),[s,a]=(0,r.useState)(!1),o=e=>"/"===e?"/"===n.pathname:n.pathname.startsWith(e),l={expanded:{x:0,opacity:1},collapsed:{x:-10,opacity:0}};return(0,i.jsxs)("div",{className:"flex min-h-screen bg-gray-100",children:[(0,i.jsxs)(h.P.aside,{className:"fixed top-0 left-0 h-screen bg-gradient-to-br from-slate-800 to-slate-700 text-white flex flex-col shadow-lg z-50 overflow-hidden",initial:"expanded",animate:s?"collapsed":"expanded",variants:{expanded:{width:"240px"},collapsed:{width:"80px"}},transition:{duration:.3,ease:"easeInOut"},children:[(0,i.jsxs)("div",{className:"flex items-center justify-between p-4 border-b border-white/10 min-h-[70px]",children:[!s&&(0,i.jsx)(c(),{href:"/",className:"no-underline text-inherit",children:(0,i.jsx)(h.P.h1,{className:"text-2xl font-bold text-blue-400 m-0 whitespace-nowrap",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.3},children:"NetGuardia"})}),(0,i.jsx)("button",{onClick:()=>{a(!s)},className:"bg-transparent border-none text-white cursor-pointer p-2 rounded-md flex items-center justify-center w-10 h-10 hover:bg-white/10 transition-colors duration-200",children:(0,i.jsx)(p.g,{icon:u.ckx})})]}),(0,i.jsx)("nav",{className:"flex-1 py-4 flex flex-col gap-2",children:x.map(e=>(0,i.jsxs)(c(),{href:e.href,className:"\n flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg\n ".concat(s?"px-2 py-2 justify-center h-12 w-12":"px-4 py-3","\n ").concat(o(e.href)?"bg-blue-600 text-white shadow-lg shadow-blue-600/30":"text-slate-300 hover:bg-white/10 hover:text-white","\n "),children:[(0,i.jsx)("div",{className:"flex items-center justify-center flex-shrink-0 w-6 h-6",children:(0,i.jsx)(p.g,{icon:e.icon,className:"text-lg"})}),!s&&(0,i.jsx)(h.P.span,{className:"font-medium whitespace-nowrap overflow-hidden ml-3",variants:l,initial:"expanded",animate:s?"collapsed":"expanded",transition:{duration:.2},children:e.label})]},e.href))})]}),(0,i.jsx)("div",{className:"flex-1 flex flex-col transition-all duration-300 ".concat(s?"ml-20":"ml-60"),children:(0,i.jsx)("section",{className:"flex-1 p-8",children:(0,i.jsx)("div",{className:"max-w-full mx-auto",children:t})})})]})},f=e=>{let{children:t,title:n="NetGuardia",description:r="NetGuardia"}=e,s="".concat(o.hX,"/logo.png");return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(a(),{children:[(0,i.jsx)("title",{children:n}),(0,i.jsx)("meta",{name:"description",content:r}),(0,i.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),(0,i.jsx)("link",{rel:"icon",href:"/favicon.ico"}),(0,i.jsx)("meta",{property:"og:type",content:"website"}),(0,i.jsx)("meta",{property:"og:title",content:n}),(0,i.jsx)("meta",{property:"og:description",content:r}),(0,i.jsx)("meta",{property:"og:url",content:o.hX}),(0,i.jsx)("meta",{property:"og:image",content:s}),(0,i.jsx)("meta",{property:"og:image:width",content:"200"}),(0,i.jsx)("meta",{property:"og:image:height",content:"200"}),(0,i.jsx)("meta",{property:"og:image:alt",content:"NetGuardia"}),(0,i.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,i.jsx)("meta",{name:"twitter:title",content:n}),(0,i.jsx)("meta",{name:"twitter:description",content:r}),(0,i.jsx)("meta",{name:"twitter:image",content:s})]}),(0,i.jsx)(m,{children:t})]})}},7212:(e,t,n)=>{"use strict";n.d(t,{N:()=>j});var i=n(7876),r=n(4232),s=n(5048),a=n(1200),o=n(181),l=n(3866),c=n(7990),d=n(9751);class h extends r.Component{getSnapshotBeforeUpdate(e){let t=this.props.childRef.current;if(t&&e.isPresent&&!this.props.isPresent){let e=t.offsetParent,n=(0,c.s)(e)&&e.offsetWidth||0,i=this.props.sizeRef.current;i.height=t.offsetHeight||0,i.width=t.offsetWidth||0,i.top=t.offsetTop,i.left=t.offsetLeft,i.right=n-i.width-i.left}return null}componentDidUpdate(){}render(){return this.props.children}}function p({children:e,isPresent:t,anchorX:n,root:s}){let a=(0,r.useId)(),o=(0,r.useRef)(null),l=(0,r.useRef)({width:0,height:0,top:0,left:0,right:0}),{nonce:c}=(0,r.useContext)(d.Q);return(0,r.useInsertionEffect)(()=>{let{width:e,height:i,top:r,left:d,right:h}=l.current;if(t||!o.current||!e||!i)return;let p="left"===n?`left: ${d}`:`right: ${h}`;o.current.dataset.motionPopId=a;let u=document.createElement("style");c&&(u.nonce=c);let x=s??document.head;return x.appendChild(u),u.sheet&&u.sheet.insertRule(`
[data-motion-pop-id="${a}"] {
position: absolute !important;
width: ${e}px !important;
height: ${i}px !important;
${p}px !important;
top: ${r}px !important;
}
`),()=>{x.contains(u)&&x.removeChild(u)}},[t]),(0,i.jsx)(h,{isPresent:t,childRef:o,sizeRef:l,children:r.cloneElement(e,{ref:o})})}let u=({children:e,initial:t,isPresent:n,onExitComplete:s,custom:o,presenceAffectsLayout:c,mode:d,anchorX:h,root:u})=>{let m=(0,a.M)(x),f=(0,r.useId)(),g=!0,j=(0,r.useMemo)(()=>(g=!1,{id:f,initial:t,isPresent:n,custom:o,onExitComplete:e=>{for(let t of(m.set(e,!0),m.values()))if(!t)return;s&&s()},register:e=>(m.set(e,!1),()=>m.delete(e))}),[n,m,s]);return c&&g&&(j={...j}),(0,r.useMemo)(()=>{m.forEach((e,t)=>m.set(t,!1))},[n]),r.useEffect(()=>{n||m.size||!s||s()},[n]),"popLayout"===d&&(e=(0,i.jsx)(p,{isPresent:n,anchorX:h,root:u,children:e})),(0,i.jsx)(l.t.Provider,{value:j,children:e})};function x(){return new Map}var m=n(3885);let f=e=>e.key||"";function g(e){let t=[];return r.Children.forEach(e,e=>{(0,r.isValidElement)(e)&&t.push(e)}),t}let j=({children:e,custom:t,initial:n=!0,onExitComplete:l,presenceAffectsLayout:c=!0,mode:d="sync",propagate:h=!1,anchorX:p="left",root:x})=>{let[j,w]=(0,m.xQ)(h),b=(0,r.useMemo)(()=>g(e),[e]),y=h&&!j?[]:b.map(f),v=(0,r.useRef)(!0),N=(0,r.useRef)(b),E=(0,a.M)(()=>new Map),[C,P]=(0,r.useState)(b),[k,R]=(0,r.useState)(b);(0,o.E)(()=>{v.current=!1,N.current=b;for(let e=0;e<k.length;e++){let t=f(k[e]);y.includes(t)?E.delete(t):!0!==E.get(t)&&E.set(t,!1)}},[k,y.length,y.join("-")]);let $=[];if(b!==C){let e=[...b];for(let t=0;t<k.length;t++){let n=k[t],i=f(n);y.includes(i)||(e.splice(t,0,n),$.push(n))}return"wait"===d&&$.length&&(e=$),R(g(e)),P(b),null}let{forceRender:M}=(0,r.useContext)(s.L);return(0,i.jsx)(i.Fragment,{children:k.map(e=>{let r=f(e),s=(!h||!!j)&&(b===k||y.includes(r));return(0,i.jsx)(u,{isPresent:s,initial:(!v.current||!!n)&&void 0,custom:t,presenceAffectsLayout:c,mode:d,root:x,onExitComplete:s?void 0:()=>{if(!E.has(r))return;E.set(r,!0);let e=!0;E.forEach(t=>{t||(e=!1)}),e&&(M?.(),R(N.current),h&&w?.(),l&&l())},anchorX:p,children:e},r)})})}},9099:(e,t,n)=>{e.exports=n(8253)}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[731],{2164:(_,n,e)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/_error",function(){return e(4100)}])}},_=>{var n=n=>_(_.s=n);_.O(0,[636,593,792],()=>n(2164)),_N_E=_.O()}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
(()=>{"use strict";var e={},r={};function t(o){var n=r[o];if(void 0!==n)return n.exports;var i=r[o]={exports:{}},l=!0;try{e[o](i,i.exports,t),l=!1}finally{l&&delete r[o]}return i.exports}t.m=e,(()=>{var e=[];t.O=(r,o,n,i)=>{if(o){i=i||0;for(var l=e.length;l>0&&e[l-1][2]>i;l--)e[l]=e[l-1];e[l]=[o,n,i];return}for(var a=1/0,l=0;l<e.length;l++){for(var[o,n,i]=e[l],u=!0,f=0;f<o.length;f++)(!1&i||a>=i)&&Object.keys(t.O).every(e=>t.O[e](o[f]))?o.splice(f--,1):(u=!1,i<a&&(a=i));if(u){e.splice(l--,1);var s=n();void 0!==s&&(r=s)}}return r}})(),t.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return t.d(r,{a:r}),r},t.d=(e,r)=>{for(var o in r)t.o(r,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/_next/",(()=>{var e={68:0};t.O.j=r=>0===e[r];var r=(r,o)=>{var n,i,[l,a,u]=o,f=0;if(l.some(r=>0!==e[r])){for(n in a)t.o(a,n)&&(t.m[n]=a[n]);if(u)var s=u(t)}for(r&&r(o);f<l.length;f++)i=l[f],t.o(e,i)&&e[i]&&e[i][0](),e[i]=0;return t.O(s)},o=self.webpackChunk_N_E=self.webpackChunk_N_E||[];o.forEach(r.bind(null,0)),o.push=r.bind(null,o.push.bind(o))})()})();

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
self.__BUILD_MANIFEST=function(s,t,a,e,c,r){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:null,bitArray:[]},__routerFilterDynamic:{numItems:t,errorRate:1e-4,numBits:t,numHashes:null,bitArray:[]},"/":[s,"static/chunks/pages/index-20fac084227e433f.js"],"/404":[s,"static/chunks/pages/404-88ca1a114c255c82.js"],"/_error":["static/chunks/pages/_error-41608b100cc61246.js"],"/access-control":[s,c,"static/chunks/pages/access-control-02dfbb4c16554211.js"],"/dashboard":[s,r,"static/chunks/335-efb20d23e9c8fbdc.js","static/chunks/pages/dashboard-79264065de788f0d.js"],"/detection":[s,c,"static/chunks/pages/detection-58f841797f6fb8cf.js"],"/statistics":[s,r,"static/chunks/pages/statistics-2ac73b87bd720929.js"],sortedPages:["/","/404","/_app","/_error","/access-control","/dashboard","/detection","/statistics"]}}("static/chunks/182-f7d7e0bcbc4935b2.js",0,1e-4,null,"static/chunks/597-536a1ec6d7dc1ed9.js","static/chunks/620-cfbe65d7a4660b89.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();

View File

@ -1 +0,0 @@
self.__SSG_MANIFEST=new Set,self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB();

File diff suppressed because one or more lines are too long

View File

@ -1,21 +0,0 @@
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width, initial-scale=1" data-next-head=""/><title data-next-head="">NetGuardia</title><meta name="description" content="NetGuardia" data-next-head=""/><link rel="icon" href="/favicon.ico" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta property="og:title" content="NetGuardia" data-next-head=""/><meta property="og:description" content="NetGuardia" data-next-head=""/><meta property="og:url" content="http://140.130.34.65:59182" data-next-head=""/><meta property="og:image" content="http://140.130.34.65:59182/logo.png" data-next-head=""/><meta property="og:image:width" content="200" data-next-head=""/><meta property="og:image:height" content="200" data-next-head=""/><meta property="og:image:alt" content="NetGuardia" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="NetGuardia" data-next-head=""/><meta name="twitter:description" content="NetGuardia" data-next-head=""/><meta name="twitter:image" content="http://140.130.34.65:59182/logo.png" data-next-head=""/><link rel="preload" href="/_next/static/css/d0ec348c2f7ab2b9.css" as="style"/><link rel="stylesheet" href="/_next/static/css/d0ec348c2f7ab2b9.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8cac0b4b405cede1.js" defer=""></script><script src="/_next/static/chunks/framework-8241368a3aa58199.js" defer=""></script><script src="/_next/static/chunks/main-8b597568282ddf7d.js" defer=""></script><script src="/_next/static/chunks/pages/_app-3847060648a79052.js" defer=""></script><script src="/_next/static/chunks/182-f7d7e0bcbc4935b2.js" defer=""></script><script src="/_next/static/chunks/620-cfbe65d7a4660b89.js" defer=""></script><script src="/_next/static/chunks/335-efb20d23e9c8fbdc.js" defer=""></script><script src="/_next/static/chunks/pages/dashboard-79264065de788f0d.js" defer=""></script><script src="/_next/static/wASj1qj7ED75Mpwihahbt/_buildManifest.js" defer=""></script><script src="/_next/static/wASj1qj7ED75Mpwihahbt/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="flex min-h-screen bg-gray-100"><aside class="fixed top-0 left-0 h-screen bg-gradient-to-br from-slate-800 to-slate-700 text-white flex flex-col shadow-lg z-50 overflow-hidden" style="width:240px"><div class="flex items-center justify-between p-4 border-b border-white/10 min-h-[70px]"><a class="no-underline text-inherit" href="/"><h1 class="text-2xl font-bold text-blue-400 m-0 whitespace-nowrap" style="opacity:0">NetGuardia</h1></a><button class="bg-transparent border-none text-white cursor-pointer p-2 rounded-md flex items-center justify-center w-10 h-10 hover:bg-white/10 transition-colors duration-200"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="bars" class="svg-inline--fa fa-bars " role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M0 96C0 78.3 14.3 64 32 64l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 128C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 288c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32L32 448c-17.7 0-32-14.3-32-32s14.3-32 32-32l384 0c17.7 0 32 14.3 32 32z"></path></svg></button></div><nav class="flex-1 py-4 flex flex-col gap-2"><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="house" class="svg-inline--fa fa-house text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="currentColor" d="M575.8 255.5c0 18-15 32.1-32 32.1l-32 0 .7 160.2c0 2.7-.2 5.4-.5 8.1l0 16.2c0 22.1-17.9 40-40 40l-16 0c-1.1 0-2.2 0-3.3-.1c-1.4 .1-2.8 .1-4.2 .1L416 512l-24 0c-22.1 0-40-17.9-40-40l0-24 0-64c0-17.7-14.3-32-32-32l-64 0c-17.7 0-32 14.3-32 32l0 64 0 24c0 22.1-17.9 40-40 40l-24 0-31.9 0c-1.5 0-3-.1-4.5-.2c-1.2 .1-2.4 .2-3.6 .2l-16 0c-22.1 0-40-17.9-40-40l0-112c0-.9 0-1.9 .1-2.8l0-69.7-32 0c-18 0-32-14-32-32.1c0-9 3-17 10-24L266.4 8c7-7 15-8 22-8s15 2 21 7L564.8 231.5c8 7 12 15 11 24z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Home</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
bg-blue-600 text-white shadow-lg shadow-blue-600/30
" href="/dashboard"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="gauge-high" class="svg-inline--fa fa-gauge-high text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256zM288 96a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zM256 416c35.3 0 64-28.7 64-64c0-17.4-6.9-33.1-18.1-44.6L366 161.7c5.3-12.1-.2-26.3-12.3-31.6s-26.3 .2-31.6 12.3L257.9 288c-.6 0-1.3 0-1.9 0c-35.3 0-64 28.7-64 64s28.7 64 64 64zM176 144a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zM96 288a32 32 0 1 0 0-64 32 32 0 1 0 0 64zm352-32a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Dashboard</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/statistics"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="chart-bar" class="svg-inline--fa fa-chart-bar text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 32c17.7 0 32 14.3 32 32l0 336c0 8.8 7.2 16 16 16l400 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L80 480c-44.2 0-80-35.8-80-80L0 64C0 46.3 14.3 32 32 32zm96 96c0-17.7 14.3-32 32-32l192 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-192 0c-17.7 0-32-14.3-32-32zm32 64l128 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 96l256 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-256 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Statistics</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/access-control"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="shield-halved" class="svg-inline--fa fa-shield-halved text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 0c4.6 0 9.2 1 13.4 2.9L457.7 82.8c22 9.3 38.4 31 38.3 57.2c-.5 99.2-41.3 280.7-213.6 363.2c-16.7 8-36.1 8-52.8 0C57.3 420.7 16.5 239.2 16 140c-.1-26.2 16.3-47.9 38.3-57.2L242.7 2.9C246.8 1 251.4 0 256 0zm0 66.8l0 378.1C394 378 431.1 230.1 432 141.4L256 66.8s0 0 0 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Access Control</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/detection"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="robot" class="svg-inline--fa fa-robot text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M320 0c17.7 0 32 14.3 32 32l0 64 120 0c39.8 0 72 32.2 72 72l0 272c0 39.8-32.2 72-72 72l-304 0c-39.8 0-72-32.2-72-72l0-272c0-39.8 32.2-72 72-72l120 0 0-64c0-17.7 14.3-32 32-32zM208 384c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zm96 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zm96 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zM264 256a40 40 0 1 0 -80 0 40 40 0 1 0 80 0zm152 40a40 40 0 1 0 0-80 40 40 0 1 0 0 80zM48 224l16 0 0 192-16 0c-26.5 0-48-21.5-48-48l0-96c0-26.5 21.5-48 48-48zm544 0c26.5 0 48 21.5 48 48l0 96c0 26.5-21.5 48-48 48l-16 0 0-192 16 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Detection</span></a></nav></aside><div class="flex-1 flex flex-col transition-all duration-300 ml-60"><section class="flex-1 p-8"><div class="max-w-full mx-auto"><div class="flex items-center justify-center w-full h-full min-h-[calc(100vh-4rem)]"><div class="flex flex-col items-center space-y-4"><div class="flex justify-center items-center"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600"></div></div></div></div></div></section></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/dashboard","query":{},"buildId":"wASj1qj7ED75Mpwihahbt","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>

View File

@ -1,21 +0,0 @@
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width, initial-scale=1" data-next-head=""/><title data-next-head="">NetGuardia</title><meta name="description" content="NetGuardia" data-next-head=""/><link rel="icon" href="/favicon.ico" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta property="og:title" content="NetGuardia" data-next-head=""/><meta property="og:description" content="NetGuardia" data-next-head=""/><meta property="og:url" content="http://140.130.34.65:59182" data-next-head=""/><meta property="og:image" content="http://140.130.34.65:59182/logo.png" data-next-head=""/><meta property="og:image:width" content="200" data-next-head=""/><meta property="og:image:height" content="200" data-next-head=""/><meta property="og:image:alt" content="NetGuardia" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="NetGuardia" data-next-head=""/><meta name="twitter:description" content="NetGuardia" data-next-head=""/><meta name="twitter:image" content="http://140.130.34.65:59182/logo.png" data-next-head=""/><link rel="preload" href="/_next/static/css/d0ec348c2f7ab2b9.css" as="style"/><link rel="stylesheet" href="/_next/static/css/d0ec348c2f7ab2b9.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8cac0b4b405cede1.js" defer=""></script><script src="/_next/static/chunks/framework-8241368a3aa58199.js" defer=""></script><script src="/_next/static/chunks/main-8b597568282ddf7d.js" defer=""></script><script src="/_next/static/chunks/pages/_app-3847060648a79052.js" defer=""></script><script src="/_next/static/chunks/182-f7d7e0bcbc4935b2.js" defer=""></script><script src="/_next/static/chunks/597-536a1ec6d7dc1ed9.js" defer=""></script><script src="/_next/static/chunks/pages/detection-58f841797f6fb8cf.js" defer=""></script><script src="/_next/static/wASj1qj7ED75Mpwihahbt/_buildManifest.js" defer=""></script><script src="/_next/static/wASj1qj7ED75Mpwihahbt/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="flex min-h-screen bg-gray-100"><aside class="fixed top-0 left-0 h-screen bg-gradient-to-br from-slate-800 to-slate-700 text-white flex flex-col shadow-lg z-50 overflow-hidden" style="width:240px"><div class="flex items-center justify-between p-4 border-b border-white/10 min-h-[70px]"><a class="no-underline text-inherit" href="/"><h1 class="text-2xl font-bold text-blue-400 m-0 whitespace-nowrap" style="opacity:0">NetGuardia</h1></a><button class="bg-transparent border-none text-white cursor-pointer p-2 rounded-md flex items-center justify-center w-10 h-10 hover:bg-white/10 transition-colors duration-200"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="bars" class="svg-inline--fa fa-bars " role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M0 96C0 78.3 14.3 64 32 64l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 128C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 288c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32L32 448c-17.7 0-32-14.3-32-32s14.3-32 32-32l384 0c17.7 0 32 14.3 32 32z"></path></svg></button></div><nav class="flex-1 py-4 flex flex-col gap-2"><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="house" class="svg-inline--fa fa-house text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="currentColor" d="M575.8 255.5c0 18-15 32.1-32 32.1l-32 0 .7 160.2c0 2.7-.2 5.4-.5 8.1l0 16.2c0 22.1-17.9 40-40 40l-16 0c-1.1 0-2.2 0-3.3-.1c-1.4 .1-2.8 .1-4.2 .1L416 512l-24 0c-22.1 0-40-17.9-40-40l0-24 0-64c0-17.7-14.3-32-32-32l-64 0c-17.7 0-32 14.3-32 32l0 64 0 24c0 22.1-17.9 40-40 40l-24 0-31.9 0c-1.5 0-3-.1-4.5-.2c-1.2 .1-2.4 .2-3.6 .2l-16 0c-22.1 0-40-17.9-40-40l0-112c0-.9 0-1.9 .1-2.8l0-69.7-32 0c-18 0-32-14-32-32.1c0-9 3-17 10-24L266.4 8c7-7 15-8 22-8s15 2 21 7L564.8 231.5c8 7 12 15 11 24z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Home</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/dashboard"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="gauge-high" class="svg-inline--fa fa-gauge-high text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256zM288 96a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zM256 416c35.3 0 64-28.7 64-64c0-17.4-6.9-33.1-18.1-44.6L366 161.7c5.3-12.1-.2-26.3-12.3-31.6s-26.3 .2-31.6 12.3L257.9 288c-.6 0-1.3 0-1.9 0c-35.3 0-64 28.7-64 64s28.7 64 64 64zM176 144a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zM96 288a32 32 0 1 0 0-64 32 32 0 1 0 0 64zm352-32a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Dashboard</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/statistics"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="chart-bar" class="svg-inline--fa fa-chart-bar text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 32c17.7 0 32 14.3 32 32l0 336c0 8.8 7.2 16 16 16l400 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L80 480c-44.2 0-80-35.8-80-80L0 64C0 46.3 14.3 32 32 32zm96 96c0-17.7 14.3-32 32-32l192 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-192 0c-17.7 0-32-14.3-32-32zm32 64l128 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 96l256 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-256 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Statistics</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/access-control"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="shield-halved" class="svg-inline--fa fa-shield-halved text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 0c4.6 0 9.2 1 13.4 2.9L457.7 82.8c22 9.3 38.4 31 38.3 57.2c-.5 99.2-41.3 280.7-213.6 363.2c-16.7 8-36.1 8-52.8 0C57.3 420.7 16.5 239.2 16 140c-.1-26.2 16.3-47.9 38.3-57.2L242.7 2.9C246.8 1 251.4 0 256 0zm0 66.8l0 378.1C394 378 431.1 230.1 432 141.4L256 66.8s0 0 0 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Access Control</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
bg-blue-600 text-white shadow-lg shadow-blue-600/30
" href="/detection"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="robot" class="svg-inline--fa fa-robot text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M320 0c17.7 0 32 14.3 32 32l0 64 120 0c39.8 0 72 32.2 72 72l0 272c0 39.8-32.2 72-72 72l-304 0c-39.8 0-72-32.2-72-72l0-272c0-39.8 32.2-72 72-72l120 0 0-64c0-17.7 14.3-32 32-32zM208 384c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zm96 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zm96 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zM264 256a40 40 0 1 0 -80 0 40 40 0 1 0 80 0zm152 40a40 40 0 1 0 0-80 40 40 0 1 0 0 80zM48 224l16 0 0 192-16 0c-26.5 0-48-21.5-48-48l0-96c0-26.5 21.5-48 48-48zm544 0c26.5 0 48 21.5 48 48l0 96c0 26.5-21.5 48-48 48l-16 0 0-192 16 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Detection</span></a></nav></aside><div class="flex-1 flex flex-col transition-all duration-300 ml-60"><section class="flex-1 p-8"><div class="max-w-full mx-auto"><div class="flex items-center justify-center w-full h-full min-h-[calc(100vh-4rem)]"><div class="flex flex-col items-center space-y-4"><div class="flex justify-center items-center"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600"></div></div></div></div></div></section></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/detection","query":{},"buildId":"wASj1qj7ED75Mpwihahbt","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

View File

@ -1,21 +0,0 @@
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width, initial-scale=1" data-next-head=""/><title data-next-head="">NetGuardia</title><meta name="description" content="NetGuardia" data-next-head=""/><link rel="icon" href="/favicon.ico" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta property="og:title" content="NetGuardia" data-next-head=""/><meta property="og:description" content="NetGuardia" data-next-head=""/><meta property="og:url" content="http://140.130.34.65:59182" data-next-head=""/><meta property="og:image" content="http://140.130.34.65:59182/logo.png" data-next-head=""/><meta property="og:image:width" content="200" data-next-head=""/><meta property="og:image:height" content="200" data-next-head=""/><meta property="og:image:alt" content="NetGuardia" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="NetGuardia" data-next-head=""/><meta name="twitter:description" content="NetGuardia" data-next-head=""/><meta name="twitter:image" content="http://140.130.34.65:59182/logo.png" data-next-head=""/><link rel="preload" href="/_next/static/css/d0ec348c2f7ab2b9.css" as="style"/><link rel="stylesheet" href="/_next/static/css/d0ec348c2f7ab2b9.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8cac0b4b405cede1.js" defer=""></script><script src="/_next/static/chunks/framework-8241368a3aa58199.js" defer=""></script><script src="/_next/static/chunks/main-8b597568282ddf7d.js" defer=""></script><script src="/_next/static/chunks/pages/_app-3847060648a79052.js" defer=""></script><script src="/_next/static/chunks/182-f7d7e0bcbc4935b2.js" defer=""></script><script src="/_next/static/chunks/pages/index-20fac084227e433f.js" defer=""></script><script src="/_next/static/wASj1qj7ED75Mpwihahbt/_buildManifest.js" defer=""></script><script src="/_next/static/wASj1qj7ED75Mpwihahbt/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="flex min-h-screen bg-gray-100"><aside class="fixed top-0 left-0 h-screen bg-gradient-to-br from-slate-800 to-slate-700 text-white flex flex-col shadow-lg z-50 overflow-hidden" style="width:240px"><div class="flex items-center justify-between p-4 border-b border-white/10 min-h-[70px]"><a class="no-underline text-inherit" href="/"><h1 class="text-2xl font-bold text-blue-400 m-0 whitespace-nowrap" style="opacity:0">NetGuardia</h1></a><button class="bg-transparent border-none text-white cursor-pointer p-2 rounded-md flex items-center justify-center w-10 h-10 hover:bg-white/10 transition-colors duration-200"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="bars" class="svg-inline--fa fa-bars " role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M0 96C0 78.3 14.3 64 32 64l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 128C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 288c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32L32 448c-17.7 0-32-14.3-32-32s14.3-32 32-32l384 0c17.7 0 32 14.3 32 32z"></path></svg></button></div><nav class="flex-1 py-4 flex flex-col gap-2"><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
bg-blue-600 text-white shadow-lg shadow-blue-600/30
" href="/"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="house" class="svg-inline--fa fa-house text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="currentColor" d="M575.8 255.5c0 18-15 32.1-32 32.1l-32 0 .7 160.2c0 2.7-.2 5.4-.5 8.1l0 16.2c0 22.1-17.9 40-40 40l-16 0c-1.1 0-2.2 0-3.3-.1c-1.4 .1-2.8 .1-4.2 .1L416 512l-24 0c-22.1 0-40-17.9-40-40l0-24 0-64c0-17.7-14.3-32-32-32l-64 0c-17.7 0-32 14.3-32 32l0 64 0 24c0 22.1-17.9 40-40 40l-24 0-31.9 0c-1.5 0-3-.1-4.5-.2c-1.2 .1-2.4 .2-3.6 .2l-16 0c-22.1 0-40-17.9-40-40l0-112c0-.9 0-1.9 .1-2.8l0-69.7-32 0c-18 0-32-14-32-32.1c0-9 3-17 10-24L266.4 8c7-7 15-8 22-8s15 2 21 7L564.8 231.5c8 7 12 15 11 24z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Home</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/dashboard"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="gauge-high" class="svg-inline--fa fa-gauge-high text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256zM288 96a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zM256 416c35.3 0 64-28.7 64-64c0-17.4-6.9-33.1-18.1-44.6L366 161.7c5.3-12.1-.2-26.3-12.3-31.6s-26.3 .2-31.6 12.3L257.9 288c-.6 0-1.3 0-1.9 0c-35.3 0-64 28.7-64 64s28.7 64 64 64zM176 144a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zM96 288a32 32 0 1 0 0-64 32 32 0 1 0 0 64zm352-32a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Dashboard</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/statistics"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="chart-bar" class="svg-inline--fa fa-chart-bar text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 32c17.7 0 32 14.3 32 32l0 336c0 8.8 7.2 16 16 16l400 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L80 480c-44.2 0-80-35.8-80-80L0 64C0 46.3 14.3 32 32 32zm96 96c0-17.7 14.3-32 32-32l192 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-192 0c-17.7 0-32-14.3-32-32zm32 64l128 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 96l256 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-256 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Statistics</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/access-control"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="shield-halved" class="svg-inline--fa fa-shield-halved text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 0c4.6 0 9.2 1 13.4 2.9L457.7 82.8c22 9.3 38.4 31 38.3 57.2c-.5 99.2-41.3 280.7-213.6 363.2c-16.7 8-36.1 8-52.8 0C57.3 420.7 16.5 239.2 16 140c-.1-26.2 16.3-47.9 38.3-57.2L242.7 2.9C246.8 1 251.4 0 256 0zm0 66.8l0 378.1C394 378 431.1 230.1 432 141.4L256 66.8s0 0 0 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Access Control</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/detection"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="robot" class="svg-inline--fa fa-robot text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M320 0c17.7 0 32 14.3 32 32l0 64 120 0c39.8 0 72 32.2 72 72l0 272c0 39.8-32.2 72-72 72l-304 0c-39.8 0-72-32.2-72-72l0-272c0-39.8 32.2-72 72-72l120 0 0-64c0-17.7 14.3-32 32-32zM208 384c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zm96 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zm96 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zM264 256a40 40 0 1 0 -80 0 40 40 0 1 0 80 0zm152 40a40 40 0 1 0 0-80 40 40 0 1 0 0 80zM48 224l16 0 0 192-16 0c-26.5 0-48-21.5-48-48l0-96c0-26.5 21.5-48 48-48zm544 0c26.5 0 48 21.5 48 48l0 96c0 26.5-21.5 48-48 48l-16 0 0-192 16 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Detection</span></a></nav></aside><div class="flex-1 flex flex-col transition-all duration-300 ml-60"><section class="flex-1 p-8"><div class="max-w-full mx-auto"><div class="flex items-center justify-center w-full h-full min-h-[calc(100vh-4rem)]"><div class="flex flex-col items-center space-y-4"><div class="flex justify-center items-center"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600"></div></div></div></div></div></section></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/","query":{},"buildId":"wASj1qj7ED75Mpwihahbt","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>

View File

@ -1,21 +0,0 @@
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width, initial-scale=1" data-next-head=""/><title data-next-head="">NetGuardia</title><meta name="description" content="NetGuardia" data-next-head=""/><link rel="icon" href="/favicon.ico" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta property="og:title" content="NetGuardia" data-next-head=""/><meta property="og:description" content="NetGuardia" data-next-head=""/><meta property="og:url" content="http://140.130.34.65:59182" data-next-head=""/><meta property="og:image" content="http://140.130.34.65:59182/logo.png" data-next-head=""/><meta property="og:image:width" content="200" data-next-head=""/><meta property="og:image:height" content="200" data-next-head=""/><meta property="og:image:alt" content="NetGuardia" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="NetGuardia" data-next-head=""/><meta name="twitter:description" content="NetGuardia" data-next-head=""/><meta name="twitter:image" content="http://140.130.34.65:59182/logo.png" data-next-head=""/><link rel="preload" href="/_next/static/css/d0ec348c2f7ab2b9.css" as="style"/><link rel="stylesheet" href="/_next/static/css/d0ec348c2f7ab2b9.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8cac0b4b405cede1.js" defer=""></script><script src="/_next/static/chunks/framework-8241368a3aa58199.js" defer=""></script><script src="/_next/static/chunks/main-8b597568282ddf7d.js" defer=""></script><script src="/_next/static/chunks/pages/_app-3847060648a79052.js" defer=""></script><script src="/_next/static/chunks/182-f7d7e0bcbc4935b2.js" defer=""></script><script src="/_next/static/chunks/620-cfbe65d7a4660b89.js" defer=""></script><script src="/_next/static/chunks/pages/statistics-2ac73b87bd720929.js" defer=""></script><script src="/_next/static/wASj1qj7ED75Mpwihahbt/_buildManifest.js" defer=""></script><script src="/_next/static/wASj1qj7ED75Mpwihahbt/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="flex min-h-screen bg-gray-100"><aside class="fixed top-0 left-0 h-screen bg-gradient-to-br from-slate-800 to-slate-700 text-white flex flex-col shadow-lg z-50 overflow-hidden" style="width:240px"><div class="flex items-center justify-between p-4 border-b border-white/10 min-h-[70px]"><a class="no-underline text-inherit" href="/"><h1 class="text-2xl font-bold text-blue-400 m-0 whitespace-nowrap" style="opacity:0">NetGuardia</h1></a><button class="bg-transparent border-none text-white cursor-pointer p-2 rounded-md flex items-center justify-center w-10 h-10 hover:bg-white/10 transition-colors duration-200"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="bars" class="svg-inline--fa fa-bars " role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M0 96C0 78.3 14.3 64 32 64l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 128C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 288c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32L32 448c-17.7 0-32-14.3-32-32s14.3-32 32-32l384 0c17.7 0 32 14.3 32 32z"></path></svg></button></div><nav class="flex-1 py-4 flex flex-col gap-2"><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="house" class="svg-inline--fa fa-house text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="currentColor" d="M575.8 255.5c0 18-15 32.1-32 32.1l-32 0 .7 160.2c0 2.7-.2 5.4-.5 8.1l0 16.2c0 22.1-17.9 40-40 40l-16 0c-1.1 0-2.2 0-3.3-.1c-1.4 .1-2.8 .1-4.2 .1L416 512l-24 0c-22.1 0-40-17.9-40-40l0-24 0-64c0-17.7-14.3-32-32-32l-64 0c-17.7 0-32 14.3-32 32l0 64 0 24c0 22.1-17.9 40-40 40l-24 0-31.9 0c-1.5 0-3-.1-4.5-.2c-1.2 .1-2.4 .2-3.6 .2l-16 0c-22.1 0-40-17.9-40-40l0-112c0-.9 0-1.9 .1-2.8l0-69.7-32 0c-18 0-32-14-32-32.1c0-9 3-17 10-24L266.4 8c7-7 15-8 22-8s15 2 21 7L564.8 231.5c8 7 12 15 11 24z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Home</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/dashboard"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="gauge-high" class="svg-inline--fa fa-gauge-high text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256zM288 96a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zM256 416c35.3 0 64-28.7 64-64c0-17.4-6.9-33.1-18.1-44.6L366 161.7c5.3-12.1-.2-26.3-12.3-31.6s-26.3 .2-31.6 12.3L257.9 288c-.6 0-1.3 0-1.9 0c-35.3 0-64 28.7-64 64s28.7 64 64 64zM176 144a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zM96 288a32 32 0 1 0 0-64 32 32 0 1 0 0 64zm352-32a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Dashboard</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
bg-blue-600 text-white shadow-lg shadow-blue-600/30
" href="/statistics"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="chart-bar" class="svg-inline--fa fa-chart-bar text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 32c17.7 0 32 14.3 32 32l0 336c0 8.8 7.2 16 16 16l400 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L80 480c-44.2 0-80-35.8-80-80L0 64C0 46.3 14.3 32 32 32zm96 96c0-17.7 14.3-32 32-32l192 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-192 0c-17.7 0-32-14.3-32-32zm32 64l128 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 96l256 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-256 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Statistics</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/access-control"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="shield-halved" class="svg-inline--fa fa-shield-halved text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 0c4.6 0 9.2 1 13.4 2.9L457.7 82.8c22 9.3 38.4 31 38.3 57.2c-.5 99.2-41.3 280.7-213.6 363.2c-16.7 8-36.1 8-52.8 0C57.3 420.7 16.5 239.2 16 140c-.1-26.2 16.3-47.9 38.3-57.2L242.7 2.9C246.8 1 251.4 0 256 0zm0 66.8l0 378.1C394 378 431.1 230.1 432 141.4L256 66.8s0 0 0 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Access Control</span></a><a class="
flex items-center no-underline transition-all duration-200 relative mx-2 rounded-lg
px-4 py-3
text-slate-300 hover:bg-white/10 hover:text-white
" href="/detection"><div class="flex items-center justify-center flex-shrink-0 w-6 h-6"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="robot" class="svg-inline--fa fa-robot text-lg" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M320 0c17.7 0 32 14.3 32 32l0 64 120 0c39.8 0 72 32.2 72 72l0 272c0 39.8-32.2 72-72 72l-304 0c-39.8 0-72-32.2-72-72l0-272c0-39.8 32.2-72 72-72l120 0 0-64c0-17.7 14.3-32 32-32zM208 384c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zm96 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zm96 0c-8.8 0-16 7.2-16 16s7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0zM264 256a40 40 0 1 0 -80 0 40 40 0 1 0 80 0zm152 40a40 40 0 1 0 0-80 40 40 0 1 0 0 80zM48 224l16 0 0 192-16 0c-26.5 0-48-21.5-48-48l0-96c0-26.5 21.5-48 48-48zm544 0c26.5 0 48 21.5 48 48l0 96c0 26.5-21.5 48-48 48l-16 0 0-192 16 0z"></path></svg></div><span class="font-medium whitespace-nowrap overflow-hidden ml-3" style="opacity:1;transform:none">Detection</span></a></nav></aside><div class="flex-1 flex flex-col transition-all duration-300 ml-60"><section class="flex-1 p-8"><div class="max-w-full mx-auto"><div class="flex items-center justify-center w-full h-full min-h-[calc(100vh-4rem)]"><div class="flex flex-col items-center space-y-4"><div class="flex justify-center items-center"><div class="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600"></div></div></div></div></div></section></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/statistics","query":{},"buildId":"wASj1qj7ED75Mpwihahbt","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>