Hot fix for version 2.28

This commit is contained in:
Russel Yasol
2025-08-24 18:13:37 +08:00
parent 752fce41b4
commit 8e99618f2a
157 changed files with 1609 additions and 478 deletions

View File

@@ -1,5 +1,5 @@
Package: sdxpinn-quecmanager-beta
Version: 2.2.7
Version: 2.2.8
Architecture: aarch64_cortex-a53
Maintainer: Russel Yasol dr-dolomite@github.com Cameron Thompson iamromulan@github.com Christopher Landwehr clndwhr@github.com
Source: github.com/iamromulan

View File

@@ -43,6 +43,19 @@ start_service() {
procd_close_instance
echo "QCAINFO Interpreter started"
# Start ping daemon
echo "Starting Ping Daemon..."
procd_open_instance
procd_set_param command /www/cgi-bin/services/ping_daemon.sh
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
echo "Ping Daemon started"
# Memory daemon is now managed dynamically by memory_settings.sh
# It will be added/removed from this file automatically based on user configuration
echo "All QuecManager services Started"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
self.__BUILD_MANIFEST=function(r,e,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:32,errorRate:1e-4,numBits:614,numHashes:14,bitArray:[0,1,1,1,0,r,0,e,e,r,r,e,e,r,r,e,r,r,e,e,e,r,r,e,r,r,e,e,r,r,r,r,r,e,r,e,r,r,r,r,e,e,r,e,r,r,e,r,e,r,r,e,e,e,r,e,e,e,e,r,e,e,r,r,r,e,e,e,e,e,r,r,r,r,r,r,e,r,e,r,r,r,e,r,e,r,e,e,r,r,r,e,e,r,r,e,e,r,r,r,r,e,e,r,r,r,r,e,r,e,r,r,e,r,r,e,r,r,r,r,r,e,e,r,r,e,e,e,e,e,r,r,e,r,e,r,r,r,r,e,e,e,e,e,r,r,r,e,r,e,e,e,r,r,r,r,r,e,e,e,e,r,e,e,e,e,e,r,r,e,e,e,e,e,r,e,e,e,r,r,e,e,r,r,e,r,e,e,r,e,r,e,e,e,e,r,r,e,r,e,e,e,e,r,e,r,e,r,r,r,r,e,e,e,e,r,r,r,e,e,r,r,e,r,e,r,e,r,r,r,e,r,r,e,e,e,e,e,e,e,r,r,e,r,e,r,e,e,e,e,r,e,r,r,r,e,r,e,e,r,e,r,r,e,e,r,r,r,r,e,e,e,e,e,r,e,r,r,e,e,r,e,r,e,r,r,e,e,e,r,e,r,e,r,r,e,e,r,e,r,r,r,r,e,r,e,r,e,r,e,e,e,e,e,e,e,r,r,e,r,r,e,e,e,e,r,r,r,e,e,e,e,e,e,e,e,e,r,e,e,r,e,r,r,r,r,r,r,e,r,e,e,e,e,r,r,r,r,r,e,r,e,r,r,e,r,r,r,r,e,e,e,r,r,e,r,r,r,e,r,r,e,e,e,r,r,r,e,e,e,e,e,e,r,e,r,r,r,r,e,e,e,r,r,r,e,e,e,r,r,e,r,r,e,r,r,e,e,r,r,e,r,e,r,e,e,r,r,e,e,r,r,r,e,e,r,r,r,r,r,e,e,r,e,r,e,r,e,e,e,r,r,e,e,r,r,r,e,r,e,e,r,r,e,r,r,r,r,r,r,e,r,e,e,r,r,e,e,r,r,r,e,r,r,r,r,r,r,r,r,e,r,r,e,r,r,e,e,r,r,e,r,r,e,e,r,r,r,e,e,r,r,r,e,r,r,e,r,r,r,r,e,e,e,r,r,r,e,e,r,e,e,r,r,r,r,e,e,r,r,e,r,e,r,e,e,r,e,r,r,e,r,r,e,e,r,r,r,e,r,r,r,e,r,e,r,e,r,r,r,e,r,e,r,r,r,r,e,e,r,e,e,e,r,r,r,e,r,e,r,e,r,e,e,r,e,r,e,r,r,r,r,e,r,r,e,r,r,e,e,e,r,e,r]},__routerFilterDynamic:{numItems:e,errorRate:1e-4,numBits:e,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-8219f0da6c3b58d9.js"],sortedPages:["/_app","/_error"]}}(1,0,0),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();

View File

@@ -1 +0,0 @@
self.__BUILD_MANIFEST=function(r,e,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:30,errorRate:1e-4,numBits:576,numHashes:14,bitArray:[1,1,0,0,0,1,e,r,r,e,r,r,e,r,e,r,r,e,r,r,e,e,e,e,e,e,r,r,r,e,e,r,r,e,e,e,e,e,e,r,e,e,e,r,e,e,e,e,e,e,r,r,r,e,e,e,e,r,r,r,r,r,e,r,r,r,e,r,r,e,r,r,r,e,r,r,e,e,r,r,e,e,r,e,e,r,r,e,e,e,e,e,r,e,e,e,e,e,e,r,e,r,r,r,r,r,r,e,r,r,r,r,r,r,r,r,r,e,r,e,r,r,e,r,e,r,r,e,e,e,e,e,e,e,r,r,r,e,r,r,r,r,r,r,e,r,r,r,e,e,r,r,e,e,r,e,e,e,r,e,r,r,e,e,r,r,e,e,r,r,r,r,r,r,e,r,r,e,r,r,e,r,e,r,r,e,r,r,e,r,r,e,r,r,e,e,r,r,r,e,e,r,e,r,e,e,e,e,e,e,e,e,e,e,e,e,e,r,r,e,e,r,e,e,e,r,e,e,e,r,r,e,r,r,r,r,r,e,e,r,e,e,r,r,r,e,r,e,e,r,r,e,e,e,r,r,e,r,e,e,r,e,r,r,r,e,r,e,e,r,r,r,r,r,e,e,r,e,r,r,r,e,e,e,r,r,r,r,r,e,r,e,r,e,e,r,e,r,r,e,e,r,r,e,e,e,e,r,r,r,r,r,r,r,e,e,r,e,r,e,r,r,e,r,r,e,r,r,e,e,e,r,e,r,e,e,e,e,r,e,e,e,r,r,r,r,r,r,r,r,r,r,e,r,e,r,e,r,e,e,r,e,r,e,e,r,e,e,e,e,r,e,r,e,r,r,r,e,r,r,r,r,r,e,e,e,e,e,r,r,r,r,r,e,e,e,e,e,r,e,e,r,e,r,r,r,e,e,r,r,e,r,r,e,e,r,r,r,r,e,r,e,r,e,r,r,e,e,e,r,r,r,r,e,e,e,r,e,r,r,e,e,e,e,e,e,e,r,r,r,r,r,e,e,r,e,e,r,r,r,e,r,r,e,r,r,e,e,r,r,r,e,r,r,r,r,r,r,e,e,e,r,r,r,r,r,r,r,r,e,r,r,r,r,e,e,r,e,e,r,e,r,e,r,e,r,r,r,e,e,r,e,e,e,r,e,r,r,e,e,r,r,e,e,e,e,r,r,r,e,r,e,r,e,e,r,r,r,e,r,r,e,r,e,e,e,e,r,e,e,r,r,e,e,r,r,e,r,r,r,e,e,e,r,e,r,r,r,e,e,r,e,r,r,r,r]},__routerFilterDynamic:{numItems:e,errorRate:1e-4,numBits:e,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-8219f0da6c3b58d9.js"],sortedPages:["/_app","/_error"]}}(1,0,0),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();

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

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 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9548],{1112:(e,s,_)=>{Promise.resolve().then(_.bind(_,76592))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,1258,4687,3746,9464,3494,564,6592,191,6035,7358],()=>s(1112)),_N_E=e.O()}]);
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9548],{1112:(e,s,_)=>{Promise.resolve().then(_.bind(_,76592))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,7780,8885,3746,9464,3494,564,6592,191,6035,7358],()=>s(1112)),_N_E=e.O()}]);

View File

@@ -1 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4277],{88728:(t,e,s)=>{Promise.resolve().then(s.bind(s,74627))},74627:(t,e,s)=>{"use strict";s.r(e),s.d(e,{default:()=>i});var a=s(20475);s(20107);var d=s(16118),n=s(9477),r=s.n(n);let i=t=>{let{children:e}=t,s=(0,d.usePathname)();return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"mx-auto grid w-full max-w-6xl gap-2",children:(0,a.jsx)("h1",{className:"text-3xl font-semibold",children:"Advanced Settings"})}),(0,a.jsxs)("div",{className:"mx-auto grid w-full max-w-6xl items-start gap-6 md:grid-cols-[180px_1fr] lg:grid-cols-[250px_1fr]",children:[(0,a.jsxs)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:[(0,a.jsx)(r(),{href:"/dashboard/advanced-settings/connectivity",className:"".concat("/dashboard/advanced-settings/connectivity/"===s?"font-semibold text-primary":"text-sm"),children:"Connectivity"}),(0,a.jsx)(r(),{href:"/dashboard/advanced-settings/ttl-settings",className:"".concat("/dashboard/advanced-settings/ttl-settings/"===s?"font-semibold text-primary":"text-sm"),children:"TTL Settings"}),(0,a.jsx)(r(),{href:"/dashboard/advanced-settings/mtu",className:"".concat("/dashboard/advanced-settings/mtu/"===s?"font-semibold text-primary":"text-sm"),children:"MTU Settings"}),(0,a.jsx)(r(),{href:"/dashboard/advanced-settings/at-terminal",className:"".concat("/dashboard/advanced-settings/at-terminal/"===s?"font-semibold text-primary":"text-sm"),children:"AT Terminal"})]}),e]})]})}}},t=>{var e=e=>t(t.s=e);t.O(0,[1318,191,6035,7358],()=>e(88728)),_N_E=t.O()}]);
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4277],{88728:(t,e,s)=>{Promise.resolve().then(s.bind(s,74627))},74627:(t,e,s)=>{"use strict";s.r(e),s.d(e,{default:()=>i});var a=s(20475);s(20107);var n=s(16118),d=s(9477),r=s.n(d);let i=t=>{let{children:e}=t,s=(0,n.usePathname)();return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"mx-auto grid w-full max-w-6xl gap-2",children:(0,a.jsx)("h1",{className:"text-3xl font-semibold",children:"Advanced Settings"})}),(0,a.jsxs)("div",{className:"mx-auto grid w-full max-w-6xl items-start gap-6 md:grid-cols-[180px_1fr] lg:grid-cols-[250px_1fr]",children:[(0,a.jsxs)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:[(0,a.jsx)(r(),{href:"/dashboard/advanced-settings/connectivity",className:"".concat("/dashboard/advanced-settings/connectivity/"===s?"font-semibold text-primary":"text-sm"),children:"Connectivity"}),(0,a.jsx)(r(),{href:"/dashboard/advanced-settings/ttl-settings",className:"".concat("/dashboard/advanced-settings/ttl-settings/"===s?"font-semibold text-primary":"text-sm"),children:"TTL Settings"}),(0,a.jsx)(r(),{href:"/dashboard/advanced-settings/mtu",className:"".concat("/dashboard/advanced-settings/mtu/"===s?"font-semibold text-primary":"text-sm"),children:"MTU Settings"}),(0,a.jsx)(r(),{href:"/dashboard/advanced-settings/at-terminal",className:"".concat("/dashboard/advanced-settings/at-terminal/"===s?"font-semibold text-primary":"text-sm"),children:"AT Terminal"})]}),e]})]})}},16118:(t,e,s)=>{"use strict";var a=s(65834);s.o(a,"usePathname")&&s.d(e,{usePathname:function(){return a.usePathname}}),s.o(a,"useRouter")&&s.d(e,{useRouter:function(){return a.useRouter}})}},t=>{var e=e=>t(t.s=e);t.O(0,[9477,191,6035,7358],()=>e(88728)),_N_E=t.O()}]);

View File

@@ -1 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5226],{28151:(e,s,_)=>{Promise.resolve().then(_.bind(_,76592))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,1258,4687,3746,9464,3494,564,6592,191,6035,7358],()=>s(28151)),_N_E=e.O()}]);
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5226],{28151:(e,s,_)=>{Promise.resolve().then(_.bind(_,76592))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,7780,8885,3746,9464,3494,564,6592,191,6035,7358],()=>s(28151)),_N_E=e.O()}]);

View File

@@ -1 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5665],{63881:(e,s,_)=>{Promise.resolve().then(_.bind(_,87133))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,1258,4687,3746,9464,3494,2487,1209,191,6035,7358],()=>s(63881)),_N_E=e.O()}]);
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5665],{63881:(e,s,_)=>{Promise.resolve().then(_.bind(_,87133))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,7780,8885,3746,9464,3494,2487,1209,191,6035,7358],()=>s(63881)),_N_E=e.O()}]);

View File

@@ -1 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[347],{38302:(s,e,t)=>{Promise.resolve().then(t.bind(t,83593))},83593:(s,e,t)=>{"use strict";t.r(e),t.d(e,{default:()=>r});var a=t(20475);t(20107);var l=t(16118),n=t(9477),i=t.n(n);let r=s=>{let{children:e}=s,t=(0,l.usePathname)();return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"mx-auto grid w-full max-w-6xl gap-2",children:(0,a.jsx)("h1",{className:"text-3xl font-semibold",children:"Cellular Settings"})}),(0,a.jsxs)("div",{className:"mx-auto grid w-full max-w-6xl items-start gap-6 md:grid-cols-[180px_1fr] lg:grid-cols-[250px_1fr]",children:[(0,a.jsxs)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:[(0,a.jsx)(i(),{href:"/dashboard/cell-settings/basic-settings",className:"".concat("/dashboard/cell-settings/basic-settings/"===t?"font-semibold text-primary":"text-sm"),children:"Basic Settings"}),(0,a.jsx)(i(),{href:"/dashboard/cell-settings/band-locking",className:"".concat("/dashboard/cell-settings/band-locking/"===t?"font-semibold text-primary":"text-sm"),children:"Band Locking"}),(0,a.jsx)(i(),{href:"/dashboard/cell-settings/cell-locking",className:"".concat("/dashboard/cell-settings/cell-locking/"===t?"font-semibold text-primary":"text-sm"),children:"Cellular Locking"}),(0,a.jsx)(i(),{href:"/dashboard/cell-settings/imei-mangling",className:"".concat("/dashboard/cell-settings/imei-mangling/"===t?"font-semibold text-primary":"text-sm"),children:"IMEI Mangling"}),(0,a.jsx)(i(),{href:"/dashboard/cell-settings/sms",className:"".concat("/dashboard/cell-settings/sms/"===t?"font-semibold text-primary":"text-sm"),children:"SMS Inbox"})]}),e]})]})}}},s=>{var e=e=>s(s.s=e);s.O(0,[1318,191,6035,7358],()=>e(38302)),_N_E=s.O()}]);
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[347],{38302:(s,e,t)=>{Promise.resolve().then(t.bind(t,83593))},83593:(s,e,t)=>{"use strict";t.r(e),t.d(e,{default:()=>i});var a=t(20475);t(20107);var l=t(16118),n=t(9477),r=t.n(n);let i=s=>{let{children:e}=s,t=(0,l.usePathname)();return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"mx-auto grid w-full max-w-6xl gap-2",children:(0,a.jsx)("h1",{className:"text-3xl font-semibold",children:"Cellular Settings"})}),(0,a.jsxs)("div",{className:"mx-auto grid w-full max-w-6xl items-start gap-6 md:grid-cols-[180px_1fr] lg:grid-cols-[250px_1fr]",children:[(0,a.jsxs)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:[(0,a.jsx)(r(),{href:"/dashboard/cell-settings/basic-settings",className:"".concat("/dashboard/cell-settings/basic-settings/"===t?"font-semibold text-primary":"text-sm"),children:"Basic Settings"}),(0,a.jsx)(r(),{href:"/dashboard/cell-settings/band-locking",className:"".concat("/dashboard/cell-settings/band-locking/"===t?"font-semibold text-primary":"text-sm"),children:"Band Locking"}),(0,a.jsx)(r(),{href:"/dashboard/cell-settings/cell-locking",className:"".concat("/dashboard/cell-settings/cell-locking/"===t?"font-semibold text-primary":"text-sm"),children:"Cellular Locking"}),(0,a.jsx)(r(),{href:"/dashboard/cell-settings/imei-mangling",className:"".concat("/dashboard/cell-settings/imei-mangling/"===t?"font-semibold text-primary":"text-sm"),children:"IMEI Mangling"}),(0,a.jsx)(r(),{href:"/dashboard/cell-settings/sms",className:"".concat("/dashboard/cell-settings/sms/"===t?"font-semibold text-primary":"text-sm"),children:"SMS Inbox"})]}),e]})]})}},16118:(s,e,t)=>{"use strict";var a=t(65834);t.o(a,"usePathname")&&t.d(e,{usePathname:function(){return a.usePathname}}),t.o(a,"useRouter")&&t.d(e,{useRouter:function(){return a.useRouter}})}},s=>{var e=e=>s(s.s=e);s.O(0,[9477,191,6035,7358],()=>e(38302)),_N_E=s.O()}]);

View File

@@ -1 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4808],{38448:(e,s,_)=>{Promise.resolve().then(_.bind(_,87133))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,1258,4687,3746,9464,3494,2487,1209,191,6035,7358],()=>s(38448)),_N_E=e.O()}]);
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4808],{38448:(e,s,_)=>{Promise.resolve().then(_.bind(_,87133))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,7780,8885,3746,9464,3494,2487,1209,191,6035,7358],()=>s(38448)),_N_E=e.O()}]);

View File

@@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8248],{43421:(e,s,a)=>{Promise.resolve().then(a.bind(a,14938))},14938:(e,s,a)=>{"use strict";a.r(s),a.d(s,{default:()=>o});var r=a(20475);a(20107);var t=a(16118),c=a(9477),l=a.n(c);let o=e=>{let{children:s}=e,a=(0,t.usePathname)();return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"mx-auto grid w-full max-w-6xl gap-2",children:(0,r.jsx)("h1",{className:"text-3xl font-semibold",children:"Custom Features"})}),(0,r.jsxs)("div",{className:"mx-auto grid w-full max-w-6xl items-start gap-6 md:grid-cols-[180px_1fr] lg:grid-cols-[250px_1fr]",children:[(0,r.jsxs)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:[(0,r.jsx)(l(),{href:"/dashboard/custom-features/quecwatch",className:"".concat("/dashboard/custom-features/quecwatch"===a?"font-semibold text-primary":"text-sm"),children:"QuecWatch"}),(0,r.jsx)(l(),{href:"/dashboard/custom-features/quecprofiles",className:"".concat("/dashboard/custom-features/quecprofiles"===a?"font-semibold text-primary":"text-sm"),children:"QuecProfiles"}),(0,r.jsx)(l(),{href:"/dashboard/custom-features/cell-scanner",className:"".concat("/dashboard/custom-features/cell-scanner"===a?"font-semibold text-primary":"text-sm"),children:"Cell Scanner"}),(0,r.jsx)(l(),{href:"/dashboard/custom-features/frequency-calculator",className:"".concat("/dashboard/custom-features/frequency-calculator"===a?"font-semibold text-primary":"text-sm"),children:"Frequency Calculator"})]}),s]})]})}}},e=>{var s=s=>e(e.s=s);e.O(0,[1318,191,6035,7358],()=>s(43421)),_N_E=e.O()}]);

View File

@@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8248],{43421:(e,s,a)=>{Promise.resolve().then(a.bind(a,14938))},14938:(e,s,a)=>{"use strict";a.r(s),a.d(s,{default:()=>l});var t=a(20475);a(20107);var r=a(16118),c=a(9477),u=a.n(c);let l=e=>{let{children:s}=e,a=(0,r.usePathname)();return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"mx-auto grid w-full max-w-6xl gap-2",children:(0,t.jsx)("h1",{className:"text-3xl font-semibold",children:"Custom Features"})}),(0,t.jsxs)("div",{className:"mx-auto grid w-full max-w-6xl items-start gap-6 md:grid-cols-[180px_1fr] lg:grid-cols-[250px_1fr]",children:[(0,t.jsxs)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:[(0,t.jsx)(u(),{href:"/dashboard/custom-features/quecwatch",className:"".concat("/dashboard/custom-features/quecwatch"===a?"font-semibold text-primary":"text-sm"),children:"QuecWatch"}),(0,t.jsx)(u(),{href:"/dashboard/custom-features/quecprofiles",className:"".concat("/dashboard/custom-features/quecprofiles"===a?"font-semibold text-primary":"text-sm"),children:"QuecProfiles"}),(0,t.jsx)(u(),{href:"/dashboard/custom-features/cell-scanner",className:"".concat("/dashboard/custom-features/cell-scanner"===a?"font-semibold text-primary":"text-sm"),children:"Cell Scanner"}),(0,t.jsx)(u(),{href:"/dashboard/custom-features/frequency-calculator",className:"".concat("/dashboard/custom-features/frequency-calculator"===a?"font-semibold text-primary":"text-sm"),children:"Frequency Calculator"})]}),s]})]})}},16118:(e,s,a)=>{"use strict";var t=a(65834);a.o(t,"usePathname")&&a.d(s,{usePathname:function(){return t.usePathname}}),a.o(t,"useRouter")&&a.d(s,{useRouter:function(){return t.useRouter}})}},e=>{var s=s=>e(e.s=s);e.O(0,[9477,191,6035,7358],()=>s(43421)),_N_E=e.O()}]);

View File

@@ -1 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2687],{81328:(e,s,_)=>{Promise.resolve().then(_.bind(_,31917))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,1258,4687,3746,9464,3494,3048,1917,191,6035,7358],()=>s(81328)),_N_E=e.O()}]);
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2687],{81328:(e,s,_)=>{Promise.resolve().then(_.bind(_,31917))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,7780,8885,3746,9464,3494,3048,1917,191,6035,7358],()=>s(81328)),_N_E=e.O()}]);

View File

@@ -1 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8321],{84521:(e,s,_)=>{Promise.resolve().then(_.bind(_,31917))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,1258,4687,3746,9464,3494,3048,1917,191,6035,7358],()=>s(84521)),_N_E=e.O()}]);
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8321],{84521:(e,s,_)=>{Promise.resolve().then(_.bind(_,31917))}},e=>{var s=s=>e(e.s=s);e.O(0,[9980,7780,8885,3746,9464,3494,3048,1917,191,6035,7358],()=>s(84521)),_N_E=e.O()}]);

View File

@@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3075],{87390:(e,s,a)=>{Promise.resolve().then(a.bind(a,31753))},31753:(e,s,a)=>{"use strict";a.r(s),a.d(s,{default:()=>d});var t=a(20475);a(20107);var r=a(16118),l=a(9477),n=a.n(l);let d=e=>{let{children:s}=e,a=(0,r.usePathname)();return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"mx-auto grid w-full max-w-6xl gap-2",children:(0,t.jsx)("h1",{className:"text-3xl font-semibold",children:"Experimental"})}),(0,t.jsxs)("div",{className:"mx-auto grid w-full max-w-6xl items-start gap-6 md:grid-cols-[180px_1fr] lg:grid-cols-[250px_1fr]",children:[(0,t.jsxs)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:[(0,t.jsx)(n(),{href:"/dashboard/experimental/network-insights",className:"".concat("/dashboard/experimental/network-insights/"===a?"font-semibold text-primary":"text-sm"),children:"Network Insights"}),(0,t.jsx)(n(),{href:"/dashboard/experimental/keep-alive",className:"".concat("/dashboard/experimental/keep-alive/"===a?"font-semibold text-primary":"text-sm"),children:"Keep Alive"}),(0,t.jsx)(n(),{href:"/dashboard/experimental/scheduled-reboot",className:"".concat("/dashboard/experimental/scheduled-reboot/"===a?"font-semibold text-primary":"text-sm"),children:"Scheduled Reboot"})]}),s]})]})}},16118:(e,s,a)=>{"use strict";var t=a(65834);a.o(t,"usePathname")&&a.d(s,{usePathname:function(){return t.usePathname}}),a.o(t,"useRouter")&&a.d(s,{useRouter:function(){return t.useRouter}})}},e=>{var s=s=>e(e.s=s);e.O(0,[9477,191,6035,7358],()=>s(87390)),_N_E=e.O()}]);

View File

@@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3075],{87390:(e,a,s)=>{Promise.resolve().then(s.bind(s,31753))},31753:(e,a,s)=>{"use strict";s.r(a),s.d(a,{default:()=>i});var r=s(20475);s(20107);var t=s(16118),l=s(9477),d=s.n(l);let i=e=>{let{children:a}=e,s=(0,t.usePathname)();return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"mx-auto grid w-full max-w-6xl gap-2",children:(0,r.jsx)("h1",{className:"text-3xl font-semibold",children:"Experimental"})}),(0,r.jsxs)("div",{className:"mx-auto grid w-full max-w-6xl items-start gap-6 md:grid-cols-[180px_1fr] lg:grid-cols-[250px_1fr]",children:[(0,r.jsxs)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:[(0,r.jsx)(d(),{href:"/dashboard/experimental/network-insights",className:"".concat("/dashboard/experimental/network-insights/"===s?"font-semibold text-primary":"text-sm"),children:"Network Insights"}),(0,r.jsx)(d(),{href:"/dashboard/experimental/keep-alive",className:"".concat("/dashboard/experimental/keep-alive/"===s?"font-semibold text-primary":"text-sm"),children:"Keep Alive"}),(0,r.jsx)(d(),{href:"/dashboard/experimental/scheduled-reboot",className:"".concat("/dashboard/experimental/scheduled-reboot/"===s?"font-semibold text-primary":"text-sm"),children:"Scheduled Reboot"})]}),a]})]})}}},e=>{var a=a=>e(e.s=a);e.O(0,[1318,191,6035,7358],()=>a(87390)),_N_E=e.O()}]);

View File

@@ -1 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7417],{27609:(e,s,_)=>{Promise.resolve().then(_.bind(_,13099))}},e=>{var s=s=>e(e.s=s);e.O(0,[1258,3099,191,6035,7358],()=>s(27609)),_N_E=e.O()}]);
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7417],{27609:(e,s,_)=>{Promise.resolve().then(_.bind(_,13099))}},e=>{var s=s=>e(e.s=s);e.O(0,[7780,3099,191,6035,7358],()=>s(27609)),_N_E=e.O()}]);

View File

@@ -1 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7040],{6912:(e,s,_)=>{Promise.resolve().then(_.bind(_,13099))}},e=>{var s=s=>e(e.s=s);e.O(0,[1258,3099,191,6035,7358],()=>s(6912)),_N_E=e.O()}]);
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7040],{6912:(e,s,_)=>{Promise.resolve().then(_.bind(_,13099))}},e=>{var s=s=>e(e.s=s);e.O(0,[7780,3099,191,6035,7358],()=>s(6912)),_N_E=e.O()}]);

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5680],{89797:(e,s,t)=>{Promise.resolve().then(t.bind(t,36994))},36994:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>d});var a=t(20475);t(20107);var r=t(16118),n=t(9477),i=t.n(n);let d=e=>{let{children:s}=e,t=(0,r.usePathname)();return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"mx-auto grid w-full max-w-6xl gap-2",children:(0,a.jsx)("h1",{className:"text-3xl font-semibold",children:"Settings"})}),(0,a.jsxs)("div",{className:"mx-auto grid w-full max-w-6xl items-start gap-6 md:grid-cols-[180px_1fr] lg:grid-cols-[250px_1fr]",children:[(0,a.jsxs)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:[(0,a.jsx)(i(),{href:"/dashboard/settings/personalization",className:"".concat("/dashboard/settings/personalization/"===t?"font-semibold text-primary":"text-sm"),children:"Personalization"}),(0,a.jsx)(i(),{href:"/dashboard/settings/security",className:"".concat("/dashboard/settings/security/"===t?"font-semibold text-primary":"text-sm"),children:"Security"})]}),s]})]})}},16118:(e,s,t)=>{"use strict";var a=t(65834);t.o(a,"usePathname")&&t.d(s,{usePathname:function(){return a.usePathname}}),t.o(a,"useRouter")&&t.d(s,{useRouter:function(){return a.useRouter}})}},e=>{var s=s=>e(e.s=s);e.O(0,[9477,191,6035,7358],()=>s(89797)),_N_E=e.O()}]);

View File

@@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5680],{89797:(s,e,a)=>{Promise.resolve().then(a.bind(a,36994))},36994:(s,e,a)=>{"use strict";a.r(e),a.d(e,{default:()=>n});var t=a(20475);a(20107);var r=a(16118),i=a(9477),l=a.n(i);let n=s=>{let{children:e}=s,a=(0,r.usePathname)();return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{className:"mx-auto grid w-full max-w-6xl gap-2",children:(0,t.jsx)("h1",{className:"text-3xl font-semibold",children:"Settings"})}),(0,t.jsxs)("div",{className:"mx-auto grid w-full max-w-6xl items-start gap-6 md:grid-cols-[180px_1fr] lg:grid-cols-[250px_1fr]",children:[(0,t.jsxs)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:[(0,t.jsx)(l(),{href:"/dashboard/settings/personalization",className:"".concat("/dashboard/settings/personalization/"===a?"font-semibold text-primary":"text-sm"),children:"Personalization"}),(0,t.jsx)(l(),{href:"/dashboard/settings/security",className:"".concat("/dashboard/settings/security/"===a?"font-semibold text-primary":"text-sm"),children:"Security"})]}),e]})]})}}},s=>{var e=e=>s(s.s=e);s.O(0,[1318,191,6035,7358],()=>e(89797)),_N_E=s.O()}]);

View File

@@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[161,3567],{97372:(r,e,a)=>{Promise.resolve().then(a.bind(a,76554)),Promise.resolve().then(a.t.bind(a,9477,23))},76554:(r,e,a)=>{"use strict";a.d(e,{Separator:()=>l});var t=a(20475),i=a(20107),n=a(88853),o=a(22250);let l=i.forwardRef((r,e)=>{let{className:a,orientation:i="horizontal",decorative:l=!0,...s}=r;return(0,t.jsx)(n.b,{ref:e,decorative:l,orientation:i,className:(0,o.cn)("shrink-0 bg-border","horizontal"===i?"h-[1px] w-full":"h-full w-[1px]",a),...s})});l.displayName=n.b.displayName},22250:(r,e,a)=>{"use strict";a.d(e,{cn:()=>n});var t=a(64901),i=a(868);function n(){for(var r=arguments.length,e=Array(r),a=0;a<r;a++)e[a]=arguments[a];return(0,i.QP)((0,t.$)(e))}},34544:(r,e,a)=>{"use strict";a.d(e,{hO:()=>s,sG:()=>l});var t=a(20107),i=a(25642),n=a(61837),o=a(20475),l=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","span","svg","ul"].reduce((r,e)=>{let a=t.forwardRef((r,a)=>{let{asChild:t,...i}=r,l=t?n.DX:e;return"undefined"!=typeof window&&(window[Symbol.for("radix-ui")]=!0),(0,o.jsx)(l,{...i,ref:a})});return a.displayName=`Primitive.${e}`,{...r,[e]:a}},{});function s(r,e){r&&i.flushSync(()=>r.dispatchEvent(e))}},88853:(r,e,a)=>{"use strict";a.d(e,{b:()=>d});var t=a(20107),i=a(34544),n=a(20475),o="horizontal",l=["horizontal","vertical"],s=t.forwardRef((r,e)=>{let{decorative:a,orientation:t=o,...s}=r,d=l.includes(t)?t:o;return(0,n.jsx)(i.sG.div,{"data-orientation":d,...a?{role:"none"}:{"aria-orientation":"vertical"===d?d:void 0,role:"separator"},...s,ref:e})});s.displayName="Separator";var d=s}},r=>{var e=e=>r(r.s=e);r.O(0,[7780,9477,191,6035,7358],()=>e(97372)),_N_E=r.O()}]);

View File

@@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[161,3567],{97372:(r,e,a)=>{Promise.resolve().then(a.bind(a,76554)),Promise.resolve().then(a.t.bind(a,9477,23))},76554:(r,e,a)=>{"use strict";a.d(e,{Separator:()=>l});var t=a(20475),i=a(20107),n=a(88853),o=a(22250);let l=i.forwardRef((r,e)=>{let{className:a,orientation:i="horizontal",decorative:l=!0,...s}=r;return(0,t.jsx)(n.b,{ref:e,decorative:l,orientation:i,className:(0,o.cn)("shrink-0 bg-border","horizontal"===i?"h-[1px] w-full":"h-full w-[1px]",a),...s})});l.displayName=n.b.displayName},22250:(r,e,a)=>{"use strict";a.d(e,{cn:()=>n});var t=a(64901),i=a(868);function n(){for(var r=arguments.length,e=Array(r),a=0;a<r;a++)e[a]=arguments[a];return(0,i.QP)((0,t.$)(e))}},34544:(r,e,a)=>{"use strict";a.d(e,{hO:()=>s,sG:()=>l});var t=a(20107),i=a(25642),n=a(61837),o=a(20475),l=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","span","svg","ul"].reduce((r,e)=>{let a=t.forwardRef((r,a)=>{let{asChild:t,...i}=r,l=t?n.DX:e;return"undefined"!=typeof window&&(window[Symbol.for("radix-ui")]=!0),(0,o.jsx)(l,{...i,ref:a})});return a.displayName=`Primitive.${e}`,{...r,[e]:a}},{});function s(r,e){r&&i.flushSync(()=>r.dispatchEvent(e))}},88853:(r,e,a)=>{"use strict";a.d(e,{b:()=>d});var t=a(20107),i=a(34544),n=a(20475),o="horizontal",l=["horizontal","vertical"],s=t.forwardRef((r,e)=>{let{decorative:a,orientation:t=o,...s}=r,d=l.includes(t)?t:o;return(0,n.jsx)(i.sG.div,{"data-orientation":d,...a?{role:"none"}:{"aria-orientation":"vertical"===d?d:void 0,role:"separator"},...s,ref:e})});s.displayName="Separator";var d=s}},r=>{var e=e=>r(r.s=e);r.O(0,[7780,9477,191,6035,7358],()=>e(97372)),_N_E=r.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

View File

@@ -1,5 +1,8 @@
#!/bin/sh
# Ethernet Hardware Details Fetch Script
# Provides ethernet interface information using ethtool
# Set common headers
echo "Content-Type: application/json"
echo "Access-Control-Allow-Origin: *"
@@ -57,13 +60,6 @@ cleanup() {
# Set trap for cleanup
trap cleanup EXIT INT TERM
# Function to get memory information
get_memory_info() {
free_output=$(free -b)
memory_info=$(echo "$free_output" | awk '/Mem:/ {print "{\"total\": " $2 ", \"used\": " $3 ", \"available\": " $7 "}"}')
echo "$memory_info"
}
# Function to get ethernet information
get_ethernet_info() {
interface=${1:-eth0}
@@ -93,27 +89,13 @@ get_ethernet_info() {
# Acquire lock before proceeding
acquire_lock
# Parse query string for type and interface
type=$(echo "$QUERY_STRING" | sed -n 's/.*type=\([^&]*\).*/\1/p')
# Parse query string for interface parameter
interface=$(echo "$QUERY_STRING" | sed -n 's/.*interface=\([^&]*\).*/\1/p')
# Default interface if not specified
[ -z "$interface" ] && interface="eth0"
# Convert type to lowercase using tr
type=$(echo "$type" | tr '[:upper:]' '[:lower:]')
# Check type parameter and call appropriate function
case "$type" in
"memory")
get_memory_info
;;
"eth")
get_ethernet_info "$interface"
;;
*)
error_response "Invalid type. Use 'memory' or 'eth'"
;;
esac
# Get ethernet information for the specified interface
get_ethernet_info "$interface"
# Lock will be automatically released by the cleanup trap

View File

@@ -6,6 +6,15 @@
echo "Content-Type: application/json"
echo ""
# Check for internet connectivity by pinging 8.8.8.8 twice
ping -c 2 8.8.8.8 >/dev/null 2>&1
# If ping fails, return error immediately
if [ $? -ne 0 ]; then
echo '{"error": "Failed to fetch public IP"}'
exit 1
fi
# Fetch public IP using multiple fallback methods
PUBLIC_IP=$(
curl -s https://api.ipify.org 2>/dev/null || \

View File

@@ -0,0 +1,121 @@
#!/bin/sh
# Memory Data Fetch Script
# Returns current memory usage data from the memory daemon
# Handle OPTIONS request first
if [ "${REQUEST_METHOD:-GET}" = "OPTIONS" ]; then
echo "Content-Type: text/plain"
echo "Access-Control-Allow-Origin: *"
echo "Access-Control-Allow-Methods: GET, OPTIONS"
echo "Access-Control-Allow-Headers: Content-Type"
echo "Access-Control-Max-Age: 86400"
echo ""
exit 0
fi
# Set content type and CORS headers
echo "Content-Type: application/json"
echo "Access-Control-Allow-Origin: *"
echo "Access-Control-Allow-Methods: GET, OPTIONS"
echo "Access-Control-Allow-Headers: Content-Type"
echo ""
# Configuration paths
MEMORY_JSON="/tmp/quecmanager/memory.json"
CONFIG_FILE="/etc/quecmanager/settings/memory_settings.conf"
FALLBACK_CONFIG_FILE="/tmp/quecmanager/settings/memory_settings.conf"
# Check if memory monitoring is enabled
is_memory_enabled() {
local config_to_read=""
if [ -f "$CONFIG_FILE" ]; then
config_to_read="$CONFIG_FILE"
elif [ -f "$FALLBACK_CONFIG_FILE" ]; then
config_to_read="$FALLBACK_CONFIG_FILE"
fi
if [ -n "$config_to_read" ]; then
local enabled_val=$(grep "^MEMORY_ENABLED=" "$config_to_read" 2>/dev/null | tail -n1 | cut -d'=' -f2 | tr -d '"')
case "$enabled_val" in
true|1|on|yes|enabled) return 0 ;;
*) return 1 ;;
esac
fi
return 1 # Default to disabled
}
# Check if memory daemon is running
is_memory_daemon_running() {
pgrep -f "memory_daemon.sh" >/dev/null 2>&1
}
# Handle GET request only
if [ "${REQUEST_METHOD:-GET}" != "GET" ]; then
echo "{\"status\":\"error\",\"code\":\"METHOD_NOT_ALLOWED\",\"message\":\"Only GET method is supported\"}"
exit 1
fi
# Check if memory monitoring is enabled
if ! is_memory_enabled; then
echo "{\"status\":\"error\",\"code\":\"MEMORY_DISABLED\",\"message\":\"Memory monitoring is disabled. Enable it in settings to view memory data.\"}"
exit 1
fi
# Check if daemon is running
if ! is_memory_daemon_running; then
echo "{\"status\":\"error\",\"code\":\"DAEMON_NOT_RUNNING\",\"message\":\"Memory daemon is not running. Check memory settings.\"}"
exit 1
fi
# Check if memory data file exists and is recent (within last 30 seconds)
if [ ! -f "$MEMORY_JSON" ]; then
echo "{\"status\":\"error\",\"code\":\"NO_DATA\",\"message\":\"Memory data file not found. Memory daemon may be starting up.\"}"
exit 1
fi
# Check if file is recent (modified within last 30 seconds)
# Get current time and file modification time
current_time=$(date +%s)
file_time=$(stat -c %Y "$MEMORY_JSON" 2>/dev/null)
if [ -z "$file_time" ]; then
echo "{\"status\":\"error\",\"code\":\"STAT_ERROR\",\"message\":\"Cannot determine file modification time.\"}"
exit 1
fi
# Check if file is older than 30 seconds
time_diff=$((current_time - file_time))
if [ "$time_diff" -gt 30 ]; then
echo "{\"status\":\"error\",\"code\":\"STALE_DATA\",\"message\":\"Memory data is stale (${time_diff}s old). Memory daemon may have stopped.\"}"
exit 1
fi
# Read and validate the memory data
if [ -r "$MEMORY_JSON" ]; then
memory_content=$(cat "$MEMORY_JSON" 2>/dev/null)
# Basic validation - check if it looks like valid JSON with required fields
if echo "$memory_content" | grep -q '"total"' && echo "$memory_content" | grep -q '"used"' && echo "$memory_content" | grep -q '"available"'; then
# Extract the data part and ensure it's properly formatted
total=$(echo "$memory_content" | sed -n 's/.*"total"[[:space:]]*:[[:space:]]*\([0-9][0-9]*\).*/\1/p')
used=$(echo "$memory_content" | sed -n 's/.*"used"[[:space:]]*:[[:space:]]*\([0-9][0-9]*\).*/\1/p')
available=$(echo "$memory_content" | sed -n 's/.*"available"[[:space:]]*:[[:space:]]*\([0-9][0-9]*\).*/\1/p')
# Validate that we got valid numbers
if [ -n "$total" ] && [ -n "$used" ] && [ -n "$available" ] && \
[ "$total" -gt 0 ] && [ "$used" -ge 0 ] && [ "$available" -ge 0 ]; then
# Return properly formatted response
echo "{\"status\":\"success\",\"data\":{\"total\":$total,\"used\":$used,\"available\":$available}}"
else
echo "{\"status\":\"error\",\"code\":\"INVALID_DATA\",\"message\":\"Memory data contains invalid values.\"}"
exit 1
fi
else
echo "{\"status\":\"error\",\"code\":\"INVALID_FORMAT\",\"message\":\"Memory data file has invalid format.\"}"
exit 1
fi
else
echo "{\"status\":\"error\",\"code\":\"READ_ERROR\",\"message\":\"Cannot read memory data file.\"}"
exit 1
fi

View File

@@ -0,0 +1,78 @@
#!/bin/sh
# Memory Service Fetch Script
# Returns current memory configuration and status
# Handle OPTIONS request first
if [ "${REQUEST_METHOD:-GET}" = "OPTIONS" ]; then
echo "Content-Type: text/plain"
echo "Access-Control-Allow-Origin: *"
echo "Access-Control-Allow-Methods: GET, OPTIONS"
echo "Access-Control-Allow-Headers: Content-Type"
echo "Access-Control-Max-Age: 86400"
echo ""
exit 0
fi
# Set content type and CORS headers
echo "Content-Type: application/json"
echo "Access-Control-Allow-Origin: *"
echo "Access-Control-Allow-Methods: GET, OPTIONS"
echo "Access-Control-Allow-Headers: Content-Type"
echo ""
# Configuration paths
CONFIG_FILE="/etc/quecmanager/settings/memory_settings.conf"
FALLBACK_CONFIG_FILE="/tmp/quecmanager/settings/memory_settings.conf"
# Get current configuration
get_config() {
# Defaults
ENABLED="false"
INTERVAL="1"
# Try primary config first, then fallback
local config_to_read=""
if [ -f "$CONFIG_FILE" ]; then
config_to_read="$CONFIG_FILE"
elif [ -f "$FALLBACK_CONFIG_FILE" ]; then
config_to_read="$FALLBACK_CONFIG_FILE"
fi
if [ -n "$config_to_read" ]; then
local enabled_val=$(grep "^MEMORY_ENABLED=" "$config_to_read" 2>/dev/null | tail -n1 | cut -d'=' -f2 | tr -d '"')
local interval_val=$(grep "^MEMORY_INTERVAL=" "$config_to_read" 2>/dev/null | tail -n1 | cut -d'=' -f2)
case "$enabled_val" in
true|1|on|yes|enabled) ENABLED="true" ;;
*) ENABLED="false" ;;
esac
if echo "$interval_val" | grep -qE '^[0-9]+$' && [ "$interval_val" -ge 1 ] && [ "$interval_val" -le 10 ]; then
INTERVAL="$interval_val"
fi
fi
}
# Check if memory daemon is running
is_memory_daemon_running() {
pgrep -f "memory_daemon.sh" >/dev/null 2>&1
}
# Handle GET request only
if [ "${REQUEST_METHOD:-GET}" != "GET" ]; then
echo "{\"status\":\"error\",\"code\":\"METHOD_NOT_ALLOWED\",\"message\":\"Only GET method is supported\"}"
exit 1
fi
# Get current configuration
get_config
# Check daemon status
running="false"
if is_memory_daemon_running; then
running="true"
fi
# Return configuration and status
echo "{\"status\":\"success\",\"data\":{\"enabled\":$ENABLED,\"interval\":$INTERVAL,\"running\":$running}}"

View File

@@ -0,0 +1,86 @@
#!/bin/sh
# Fetch Ping Result (relocated under /home/ping)
# OpenWrt/BusyBox compatible version
# Handle OPTIONS first
if [ "${REQUEST_METHOD:-GET}" = "OPTIONS" ]; then
echo "Content-Type: application/json"
echo "Access-Control-Allow-Origin: *"
echo "Access-Control-Allow-Methods: GET, OPTIONS"
echo "Access-Control-Allow-Headers: Content-Type"
echo ""
exit 0
fi
# Set headers for other requests
echo "Content-Type: application/json"
echo "Access-Control-Allow-Origin: *"
echo "Access-Control-Allow-Methods: GET, OPTIONS"
echo "Access-Control-Allow-Headers: Content-Type"
echo ""
# Configuration
OUT_JSON="/tmp/quecmanager/ping_latency.json"
CONFIG_FILE="/etc/quecmanager/settings/ping_settings.conf"
[ -f "$CONFIG_FILE" ] || CONFIG_FILE="/tmp/quecmanager/settings/ping_settings.conf"
# Get enabled setting
get_enabled() {
local enabled="true"
if [ -f "$CONFIG_FILE" ]; then
val=$(grep -E "^PING_ENABLED=" "$CONFIG_FILE" 2>/dev/null | tail -n1 | cut -d'=' -f2 | tr -d '\r' || echo "")
case "${val:-}" in
true|1|on|yes|enabled) enabled="true" ;;
false|0|off|no|disabled) enabled="false" ;;
esac
fi
echo "$enabled"
}
# Get interval setting
get_interval() {
local interval="5"
if [ -f "$CONFIG_FILE" ]; then
val=$(grep -E "^PING_INTERVAL=" "$CONFIG_FILE" 2>/dev/null | tail -n1 | cut -d'=' -f2 | tr -d '\r' || echo "")
if [ -n "$val" ] && echo "$val" | grep -qE '^[0-9]+$'; then
interval="$val"
fi
fi
echo "$interval"
}
# Get host setting
get_host() {
local host="8.8.8.8"
if [ -f "$CONFIG_FILE" ]; then
val=$(grep -E "^PING_HOST=" "$CONFIG_FILE" 2>/dev/null | tail -n1 | cut -d'=' -f2 | tr -d '\r' || echo "")
if [ -n "$val" ]; then
host="$val"
fi
fi
echo "$host"
}
# Get config values
ENABLED=$(get_enabled)
INTERVAL=$(get_interval)
HOST=$(get_host)
# Check if daemon JSON exists and is readable
if [ -f "$OUT_JSON" ] && [ -r "$OUT_JSON" ]; then
# Read the daemon output
PING_DATA=$(cat "$OUT_JSON" 2>/dev/null || echo "")
if [ -n "$PING_DATA" ]; then
# Simple approach: just wrap the daemon data with our response format
echo "{\"status\":\"success\",\"data\":$PING_DATA,\"config\":{\"enabled\":$ENABLED,\"interval\":$INTERVAL,\"host\":\"$HOST\"}}"
else
# JSON file exists but is empty/unreadable
echo "{\"status\":\"error\",\"message\":\"Ping data file exists but is empty or unreadable\"}"
fi
else
# Fallback: return default structure when daemon file doesn't exist
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date +"%Y-%m-%dT%H:%M:%SZ")
echo "{\"status\":\"success\",\"data\":{\"timestamp\":\"$TIMESTAMP\",\"host\":\"$HOST\",\"latency\":null,\"ok\":false},\"config\":{\"enabled\":$ENABLED,\"interval\":$INTERVAL,\"host\":\"$HOST\"}}"
fi

View File

@@ -83,6 +83,7 @@ get_profiles() {
local nsa_nr5g_bands=$(uci -q get "quecprofiles.$idx.nsa_nr5g_bands" 2>/dev/null)
local network_type=$(uci -q get "quecprofiles.$idx.network_type" 2>/dev/null)
local ttl=$(uci -q get "quecprofiles.$idx.ttl" 2>/dev/null)
local mobile_provider=$(uci -q get "quecprofiles.$idx.mobile_provider" 2>/dev/null)
local paused=$(uci -q get "quecprofiles.$idx.paused" 2>/dev/null)
# Debug output
@@ -105,6 +106,7 @@ get_profiles() {
nsa_nr5g_bands=$(sanitize_for_json "${nsa_nr5g_bands:-""}")
network_type=$(sanitize_for_json "${network_type:-"LTE"}")
ttl=$(sanitize_for_json "${ttl:-0}")
mobile_provider=$(sanitize_for_json "${mobile_provider:-""}")
paused=$(sanitize_for_json "${paused:-0}")
# Create profile JSON
@@ -119,6 +121,7 @@ get_profiles() {
profile_json="${profile_json}\"nsa_nr5g_bands\":\"${nsa_nr5g_bands}\","
profile_json="${profile_json}\"network_type\":\"${network_type}\","
profile_json="${profile_json}\"ttl\":\"${ttl}\","
profile_json="${profile_json}\"mobile_provider\":\"${mobile_provider}\","
profile_json="${profile_json}\"paused\":\"${paused}\""
profile_json="${profile_json}}"

View File

@@ -136,6 +136,7 @@ create_profile() {
local nsa_nr5g_bands="$8"
local network_type="$9"
local ttl="${10}"
local mobile_provider="${11}"
# Generate a unique ID for the profile
local profile_id="profile_$(date +%s)_$(head -c 4 /dev/urandom | hexdump -e '"%x"')"
@@ -154,6 +155,7 @@ set quecprofiles.@profile[-1].nsa_nr5g_bands='$nsa_nr5g_bands'
set quecprofiles.@profile[-1].network_type='$network_type'
set quecprofiles.@profile[-1].ttl='$ttl'
set quecprofiles.@profile[-1].paused='0'
set quecprofiles.@profile[-1].mobile_provider='$mobile_provider'
commit quecprofiles
EOF
@@ -206,6 +208,7 @@ if [ "$REQUEST_METHOD" = "POST" ]; then
nsa_nr5g_bands=$(echo "$POST_DATA" | jsonfilter -e '@.nsa_nr5g_bands' 2>/dev/null)
network_type=$(echo "$POST_DATA" | jsonfilter -e '@.network_type' 2>/dev/null)
ttl=$(echo "$POST_DATA" | jsonfilter -e '@.ttl' 2>/dev/null)
mobile_provider=$(echo "$POST_DATA" | jsonfilter -e '@.mobile_provider' 2>/dev/null)
log_message "Parsed JSON data for profile: $name" "debug"
else
@@ -221,6 +224,7 @@ if [ "$REQUEST_METHOD" = "POST" ]; then
nsa_nr5g_bands=$(echo "$POST_DATA" | grep -o '"nsa_nr5g_bands":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"')
network_type=$(echo "$POST_DATA" | grep -o '"network_type":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"')
ttl=$(echo "$POST_DATA" | grep -o '"ttl":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"')
mobile_provider=$(echo "$POST_DATA" | grep -o '"mobile_provider":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"')
log_message "Basic parsing for profile: $name" "warn"
fi
@@ -240,6 +244,7 @@ else
nsa_nr5g_bands=$(echo "$QUERY_STRING" | grep -o 'nsa_nr5g_bands=[^&]*' | cut -d'=' -f2)
network_type=$(echo "$QUERY_STRING" | grep -o 'network_type=[^&]*' | cut -d'=' -f2)
ttl=$(echo "$QUERY_STRING" | grep -o 'ttl=[^&]*' | cut -d'=' -f2)
mobile_provider=$(echo "$QUERY_STRING" | grep -o 'mobile_provider=[^&]*' | cut -d'=' -f2)
# URL decode values
name=$(echo "$name" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
@@ -252,6 +257,7 @@ else
nsa_nr5g_bands=$(echo "$nsa_nr5g_bands" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
network_type=$(echo "$network_type" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
ttl=$(echo "$ttl" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
mobile_provider=$(echo "$mobile_provider" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
log_message "Using URL parameters" "warn"
fi
@@ -267,6 +273,7 @@ sa_nr5g_bands=$(sanitize "${sa_nr5g_bands:-}")
nsa_nr5g_bands=$(sanitize "${nsa_nr5g_bands:-}")
network_type=$(sanitize "${network_type:-LTE}")
ttl=$(sanitize "${ttl:-0}") # Default to 0 (disabled)
mobile_provider=$(sanitize "${mobile_provider:-Other}")
# Output debug info
log_message "Creating profile: $name, ICCID: $iccid, IMEI: $imei, APN: $apn" "debug"
@@ -340,14 +347,14 @@ elif [ $dup_status -eq 2 ]; then
fi
# Create the profile
if create_profile "$name" "$iccid" "$imei" "$apn" "$pdp_type" "$lte_bands" "$sa_nr5g_bands" "$nsa_nr5g_bands" "$network_type" "$ttl"; then
if create_profile "$name" "$iccid" "$imei" "$apn" "$pdp_type" "$lte_bands" "$sa_nr5g_bands" "$nsa_nr5g_bands" "$network_type" "$ttl" "$mobile_provider"; then
# Trigger immediate profile application
touch "/tmp/quecprofiles_check"
chmod 644 "/tmp/quecprofiles_check"
log_message "Triggered immediate profile check after creation" "info"
# Create profile data JSON for return - WITHOUT outer curly braces
profile_data="\"name\":\"$name\",\"iccid\":\"$iccid\",\"imei\":\"$imei\",\"apn\":\"$apn\",\"pdp_type\":\"$pdp_type\",\"lte_bands\":\"$lte_bands\",\"sa_nr5g_bands\":\"$sa_nr5g_bands\",\"nsa_nr5g_bands\":\"$nsa_nr5g_bands\",\"network_type\":\"$network_type\",\"ttl\":\"$ttl\""
profile_data="\"name\":\"$name\",\"iccid\":\"$iccid\",\"imei\":\"$imei\",\"apn\":\"$apn\",\"pdp_type\":\"$pdp_type\",\"lte_bands\":\"$lte_bands\",\"sa_nr5g_bands\":\"$sa_nr5g_bands\",\"nsa_nr5g_bands\":\"$nsa_nr5g_bands\",\"network_type\":\"$network_type\",\"ttl\":\"$ttl\",\"mobile_provider\":\"$mobile_provider\""
# Wrap the data field in curly braces inside output_json
output_json "success" "Profile created successfully" "{$profile_data}"

View File

@@ -171,6 +171,7 @@ update_profile() {
local nsa_nr5g_bands="$8"
local network_type="$9"
local ttl="${10}"
local mobile_provider="${11}"
# Update the profile in UCI config
uci -q batch <<EOF
@@ -183,6 +184,7 @@ set quecprofiles.$profile_index.sa_nr5g_bands='$sa_nr5g_bands'
set quecprofiles.$profile_index.nsa_nr5g_bands='$nsa_nr5g_bands'
set quecprofiles.$profile_index.network_type='$network_type'
set quecprofiles.$profile_index.ttl='$ttl'
set quecprofiles.$profile_index.mobile_provider='$mobile_provider'
commit quecprofiles
EOF
@@ -237,6 +239,7 @@ if [ "$REQUEST_METHOD" = "POST" ]; then
nsa_nr5g_bands=$(echo "$POST_DATA" | jsonfilter -e '@.nsa_nr5g_bands' 2>/dev/null)
network_type=$(echo "$POST_DATA" | jsonfilter -e '@.network_type' 2>/dev/null)
ttl=$(echo "$POST_DATA" | jsonfilter -e '@.ttl' 2>/dev/null)
mobile_provider=$(echo "$POST_DATA" | jsonfilter -e '@.mobile_provider' 2>/dev/null)
log_message "Parsed JSON data for profile: $name" "debug"
else
@@ -252,6 +255,7 @@ if [ "$REQUEST_METHOD" = "POST" ]; then
nsa_nr5g_bands=$(echo "$POST_DATA" | grep -o '"nsa_nr5g_bands":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"')
network_type=$(echo "$POST_DATA" | grep -o '"network_type":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"')
ttl=$(echo "$POST_DATA" | grep -o '"ttl":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"')
mobile_provider=$(echo "$POST_DATA" | grep -o '"mobile_provider":"[^"]*"' | head -1 | cut -d':' -f2 | tr -d '"')
log_message "Basic parsing for profile: $name" "warn"
fi
@@ -271,6 +275,7 @@ else
nsa_nr5g_bands=$(echo "$QUERY_STRING" | grep -o 'nsa_nr5g_bands=[^&]*' | cut -d'=' -f2)
network_type=$(echo "$QUERY_STRING" | grep -o 'network_type=[^&]*' | cut -d'=' -f2)
ttl=$(echo "$QUERY_STRING" | grep -o 'ttl=[^&]*' | cut -d'=' -f2)
mobile_provider=$(echo "$QUERY_STRING" | grep -o 'mobile_provider=[^&]*' | cut -d'=' -f2)
# URL decode values
iccid=$(echo "$iccid" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
@@ -283,6 +288,7 @@ else
nsa_nr5g_bands=$(echo "$nsa_nr5g_bands" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
network_type=$(echo "$network_type" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
ttl=$(echo "$ttl" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
mobile_provider=$(echo "$mobile_provider" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
log_message "Using URL parameters" "warn"
fi
@@ -298,6 +304,7 @@ sa_nr5g_bands=$(sanitize "${sa_nr5g_bands:-}")
nsa_nr5g_bands=$(sanitize "${nsa_nr5g_bands:-}")
network_type=$(sanitize "${network_type:-LTE}")
ttl=$(sanitize "${ttl:-0}") # Default to 0 (disabled)
mobile_provider=$(sanitize "${mobile_provider:-Other}")
# Output debug info
log_message "Editing profile: $name, ICCID: $iccid, IMEI: $imei, APN: $apn" "debug"
@@ -373,7 +380,7 @@ if check_duplicate_name "$name" "$iccid"; then
fi
# Update profile
if update_profile "$profile_index" "$name" "$imei" "$apn" "$pdp_type" "$lte_bands" "$nr5g_bands" "$network_type"; then
if update_profile "$profile_index" "$name" "$imei" "$apn" "$pdp_type" "$lte_bands" "$sa_nr5g_bands" "$nsa_nr5g_bands" "$network_type" "$ttl" "$mobile_provider"; then
# Trigger immediate profile application
touch "/tmp/quecprofiles_check"
chmod 644 "/tmp/quecprofiles_check"

View File

@@ -0,0 +1,301 @@
#!/bin/sh
# Memory Settings Configuration Script
# Manages memory service (enable/disable) and daemon settings with dynamic service management
# Handle OPTIONS request first
if [ "${REQUEST_METHOD:-GET}" = "OPTIONS" ]; then
echo "Content-Type: text/plain"
echo "Access-Control-Allow-Origin: *"
echo "Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS"
echo "Access-Control-Allow-Headers: Content-Type"
echo "Access-Control-Max-Age: 86400"
echo ""
exit 0
fi
# Set content type and CORS headers
echo "Content-Type: application/json"
echo "Access-Control-Allow-Origin: *"
echo "Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS"
echo "Access-Control-Allow-Headers: Content-Type"
echo ""
# Configuration paths
CONFIG_DIR="/etc/quecmanager/settings"
CONFIG_FILE="$CONFIG_DIR/memory_settings.conf"
FALLBACK_CONFIG_DIR="/tmp/quecmanager/settings"
FALLBACK_CONFIG_FILE="$FALLBACK_CONFIG_DIR/memory_settings.conf"
LOG_FILE="/tmp/memory_settings.log"
SERVICES_INIT="/etc/init.d/quecmanager_services"
# Logging function
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
# Error response function
send_error() {
local error_code="$1"
local error_message="$2"
log_message "ERROR: $error_message"
echo "{\"status\":\"error\",\"code\":\"$error_code\",\"message\":\"$error_message\"}"
exit 1
}
# Success response function
send_success() {
local message="$1"
local data="$2"
log_message "SUCCESS: $message"
if [ -n "$data" ]; then
echo "{\"status\":\"success\",\"message\":\"$message\",\"data\":$data}"
else
echo "{\"status\":\"success\",\"message\":\"$message\"}"
fi
}
# Get current configuration
get_config() {
# Defaults
ENABLED="false"
INTERVAL="1"
# Try primary config first, then fallback
local config_to_read=""
if [ -f "$CONFIG_FILE" ]; then
config_to_read="$CONFIG_FILE"
elif [ -f "$FALLBACK_CONFIG_FILE" ]; then
config_to_read="$FALLBACK_CONFIG_FILE"
fi
if [ -n "$config_to_read" ]; then
local enabled_val=$(grep "^MEMORY_ENABLED=" "$config_to_read" 2>/dev/null | tail -n1 | cut -d'=' -f2)
local interval_val=$(grep "^MEMORY_INTERVAL=" "$config_to_read" 2>/dev/null | tail -n1 | cut -d'=' -f2)
case "$enabled_val" in
true|1|on|yes|enabled) ENABLED="true" ;;
*) ENABLED="false" ;;
esac
if echo "$interval_val" | grep -qE '^[0-9]+$' && [ "$interval_val" -ge 1 ] && [ "$interval_val" -le 10 ]; then
INTERVAL="$interval_val"
fi
fi
}
# Save configuration
save_config() {
local enabled="$1"
local interval="$2"
# Try primary location first
if mkdir -p "$CONFIG_DIR" 2>/dev/null && [ -w "$CONFIG_DIR" ]; then
{
echo "MEMORY_ENABLED=$enabled"
echo "MEMORY_INTERVAL=$interval"
} > "$CONFIG_FILE" && chmod 644 "$CONFIG_FILE" 2>/dev/null
log_message "Saved config to primary location: enabled=$enabled, interval=$interval"
return 0
fi
# Fallback to tmp
mkdir -p "$FALLBACK_CONFIG_DIR" 2>/dev/null
{
echo "MEMORY_ENABLED=$enabled"
echo "MEMORY_INTERVAL=$interval"
} > "$FALLBACK_CONFIG_FILE" && chmod 644 "$FALLBACK_CONFIG_FILE" 2>/dev/null
log_message "Saved config to fallback location: enabled=$enabled, interval=$interval"
}
# Add memory daemon to services init script
add_memory_daemon_to_services() {
if [ ! -f "$SERVICES_INIT" ]; then
log_message "Services init file not found: $SERVICES_INIT"
return 1
fi
# Check if memory daemon is already present
if grep -q "memory_daemon.sh" "$SERVICES_INIT" 2>/dev/null; then
log_message "Memory daemon already present in services"
return 0
fi
# Create a temporary file with the memory daemon block
local temp_file="/tmp/services_temp_$$"
# Find the line before "echo \"All QuecManager services Started\"" and insert memory daemon
awk '
/echo "All QuecManager services Started"/ {
print " # Start memory daemon"
print " echo \"Starting Memory Daemon...\""
print " procd_open_instance"
print " procd_set_param command /www/cgi-bin/services/memory_daemon.sh"
print " procd_set_param respawn"
print " procd_set_param stdout 1"
print " procd_set_param stderr 1"
print " procd_close_instance"
print " echo \"Memory Daemon started\""
print ""
}
{ print }
' "$SERVICES_INIT" > "$temp_file"
if [ -s "$temp_file" ]; then
mv "$temp_file" "$SERVICES_INIT"
chmod +x "$SERVICES_INIT"
log_message "Added memory daemon to services init script"
return 0
else
rm -f "$temp_file"
log_message "Failed to add memory daemon to services"
return 1
fi
}
# Remove memory daemon from services init script
remove_memory_daemon_from_services() {
if [ ! -f "$SERVICES_INIT" ]; then
log_message "Services init file not found: $SERVICES_INIT"
return 1
fi
# Check if memory daemon is present
if ! grep -q "memory_daemon.sh" "$SERVICES_INIT" 2>/dev/null; then
log_message "Memory daemon not present in services"
return 0
fi
# Remove the memory daemon block (from "# Start memory daemon" to the empty line after)
local temp_file="/tmp/services_temp_$$"
awk '
/# Start memory daemon/ { skip=1; next }
skip && /^$/ { skip=0; next }
!skip { print }
' "$SERVICES_INIT" > "$temp_file"
if [ -s "$temp_file" ]; then
mv "$temp_file" "$SERVICES_INIT"
chmod +x "$SERVICES_INIT"
log_message "Removed memory daemon from services init script"
return 0
else
rm -f "$temp_file"
log_message "Failed to remove memory daemon from services"
return 1
fi
}
# Restart QuecManager services
restart_services() {
log_message "Restarting QuecManager services..."
# Stop services
if [ -x "$SERVICES_INIT" ]; then
"$SERVICES_INIT" stop >/dev/null 2>&1
sleep 2
"$SERVICES_INIT" start >/dev/null 2>&1
log_message "Services restarted successfully"
return 0
else
log_message "Cannot restart services - init script not found or not executable"
return 1
fi
}
# Check if memory daemon is running
is_memory_daemon_running() {
pgrep -f "memory_daemon.sh" >/dev/null 2>&1
}
# Handle POST request - Update memory setting
handle_post() {
log_message "POST request received"
local content_length=${CONTENT_LENGTH:-0}
if [ "$content_length" -eq 0 ]; then
send_error "NO_DATA" "No data provided"
fi
# Read POST data
local post_data=$(dd bs=$content_length count=1 2>/dev/null)
log_message "Received POST data: $post_data"
# Parse enabled and interval from JSON
local enabled=$(echo "$post_data" | sed -n 's/.*"enabled"[[:space:]]*:[[:space:]]*\([^,}]*\).*/\1/p' | tr -d ' "')
local interval=$(echo "$post_data" | sed -n 's/.*"interval"[[:space:]]*:[[:space:]]*\([0-9][0-9]*\).*/\1/p')
# Set defaults if not provided
[ -z "$enabled" ] && enabled="false"
[ -z "$interval" ] && interval="1"
# Validate input
case "$enabled" in
true|false) ;;
*) send_error "INVALID_SETTING" "Invalid enabled value. Must be true or false." ;;
esac
if ! echo "$interval" | grep -qE '^[0-9]+$' || [ "$interval" -lt 1 ] || [ "$interval" -gt 10 ]; then
send_error "INVALID_INTERVAL" "Interval must be a number between 1 and 10 seconds."
fi
# Get current config to compare
get_config
local prev_enabled="$ENABLED"
local prev_interval="$INTERVAL"
# Save new configuration
save_config "$enabled" "$interval"
# Handle service changes
if [ "$enabled" = "true" ]; then
# Enable memory daemon
add_memory_daemon_to_services
if [ "$prev_enabled" != "true" ] || [ "$prev_interval" != "$interval" ]; then
restart_services
fi
else
# Disable memory daemon
remove_memory_daemon_from_services
restart_services
fi
# Return current status
sleep 1 # Give services time to start/stop
local running="false"
if is_memory_daemon_running; then
running="true"
fi
send_success "Memory setting updated successfully" "{\"enabled\":$enabled,\"interval\":$interval,\"running\":$running}"
}
# Handle DELETE request - Reset to default
handle_delete() {
log_message "DELETE request received"
# Remove memory daemon from services and restart
remove_memory_daemon_from_services
restart_services
# Remove config files
rm -f "$CONFIG_FILE" "$FALLBACK_CONFIG_FILE" 2>/dev/null
send_success "Memory setting reset to default (disabled)" "{\"enabled\":false,\"interval\":1,\"running\":false,\"isDefault\":true}"
}
# Main execution
log_message "Memory settings script called with method: ${REQUEST_METHOD:-GET}"
case "${REQUEST_METHOD:-GET}" in
POST)
handle_post
;;
DELETE)
handle_delete
;;
*)
send_error "METHOD_NOT_ALLOWED" "HTTP method ${REQUEST_METHOD} not supported."
;;
esac

View File

@@ -1,11 +1,22 @@
#!/bin/sh
# Ping Settings Configuration Script
# Manages ping enable/disable preferences
# Manages ping service (enable/disable) and daemon settings
# Author: dr-dolomite
# Date: 2025-08-04
# Set content type and CORS headers
# Handle OPTIONS request first (before any headers)
if [ "${REQUEST_METHOD:-GET}" = "OPTIONS" ]; then
echo "Content-Type: text/plain"
echo "Access-Control-Allow-Origin: *"
echo "Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS"
echo "Access-Control-Allow-Headers: Content-Type"
echo "Access-Control-Max-Age: 86400"
echo ""
exit 0
fi
# Set content type and CORS headers for other requests
echo "Content-Type: application/json"
echo "Access-Control-Allow-Origin: *"
echo "Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS"
@@ -15,7 +26,12 @@ echo ""
# Configuration
CONFIG_DIR="/etc/quecmanager/settings"
CONFIG_FILE="$CONFIG_DIR/ping_settings.conf"
FALLBACK_CONFIG_DIR="/tmp/quecmanager/settings"
FALLBACK_CONFIG_FILE="$FALLBACK_CONFIG_DIR/ping_settings.conf"
LOG_FILE="/tmp/ping_settings.log"
PID_FILE="/tmp/quecmanager/ping_daemon.pid"
# Prefer the new services location, fall back to the legacy path for compatibility
DAEMON_RELATIVE_PATHS="/cgi-bin/services/ping_daemon.sh"
# Logging function
log_message() {
@@ -43,99 +59,176 @@ send_success() {
fi
}
# Ensure configuration directory exists
ensure_config_directory() {
if [ ! -d "$CONFIG_DIR" ]; then
log_message "Creating directory: $CONFIG_DIR"
mkdir -p "$CONFIG_DIR"
if [ $? -ne 0 ]; then
# Try to use a fallback location in /tmp
CONFIG_DIR="/tmp/quecmanager/settings"
CONFIG_FILE="$CONFIG_DIR/ping_settings.conf"
log_message "Fallback to alternative location: $CONFIG_DIR"
mkdir -p "$CONFIG_DIR"
if [ $? -ne 0 ]; then
send_error "DIRECTORY_ERROR" "Failed to create configuration directory"
fi
fi
chmod 755 "$CONFIG_DIR"
log_message "Created configuration directory: $CONFIG_DIR"
# Resolve config file for reading: prefer primary, then fallback
resolve_config_for_read() {
if [ -f "$CONFIG_FILE" ]; then
return 0
elif [ -f "$FALLBACK_CONFIG_FILE" ]; then
CONFIG_FILE="$FALLBACK_CONFIG_FILE"
CONFIG_DIR="$FALLBACK_CONFIG_DIR"
return 0
fi
# Default to primary path if none exist
return 0
}
# Determine daemon path (absolute) based on typical web root layouts
resolve_daemon_path() {
# Common locations where CGI/WWW is mounted
for rel in $DAEMON_RELATIVE_PATHS; do
for base in \
/www \
/; do
if [ -x "$base$rel" ]; then
echo "$base$rel"
return 0
fi
done
# Also try as-is if busybox httpd cwd matches web root
if [ -x "$rel" ]; then
echo "$rel"
return 0
fi
done
# Nothing found; return first candidate as a best-effort path
set -- $DAEMON_RELATIVE_PATHS
echo "$1"
}
daemon_running() {
if [ -f "$PID_FILE" ]; then
pid="$(cat "$PID_FILE" 2>/dev/null || true)"
if [ -n "${pid:-}" ] && kill -0 "$pid" 2>/dev/null; then
return 0
fi
fi
return 1
}
start_daemon() {
# Ensure /tmp/quecmanager exists for PID
[ -d "/tmp/quecmanager" ] || mkdir -p "/tmp/quecmanager"
if daemon_running; then
log_message "Daemon already running"
return 0
fi
local daemon_path
daemon_path="$(resolve_daemon_path)"
if [ ! -x "$daemon_path" ]; then
# Try to make it executable if present
if [ -f "$daemon_path" ]; then
chmod +x "$daemon_path" 2>/dev/null || true
fi
fi
if [ -x "$daemon_path" ]; then
nohup "$daemon_path" >/dev/null 2>&1 &
log_message "Started ping daemon: $daemon_path (pid $!)"
return 0
else
log_message "Daemon script not found or not executable: $daemon_path"
return 1
fi
}
stop_daemon() {
if daemon_running; then
pid="$(cat "$PID_FILE" 2>/dev/null || true)"
if [ -n "${pid:-}" ]; then
kill "$pid" 2>/dev/null || true
sleep 0.2
kill -9 "$pid" 2>/dev/null || true
fi
fi
rm -f "$PID_FILE" 2>/dev/null || true
}
# Get current ping setting
get_ping_setting() {
# If config file exists, read from it
get_config_values() {
# defaults
ENABLED="true"
HOST="8.8.8.8"
INTERVAL="5"
resolve_config_for_read
if [ -f "$CONFIG_FILE" ]; then
ping_enabled=$(grep "^PING_ENABLED=" "$CONFIG_FILE" | cut -d'=' -f2)
if [ -n "$ping_enabled" ]; then
if [ "$ping_enabled" = "true" ] || [ "$ping_enabled" = "1" ] || [ "$ping_enabled" = "on" ]; then
echo "true"
else
echo "false"
fi
return
val=$(grep -E "^PING_ENABLED=" "$CONFIG_FILE" | tail -n1 | cut -d'=' -f2)
if [ -n "${val:-}" ]; then
case "$val" in
true|1|on|yes|enabled) ENABLED="true" ;;
*) ENABLED="false" ;;
esac
fi
val=$(grep -E "^PING_HOST=" "$CONFIG_FILE" | tail -n1 | cut -d'=' -f2)
[ -n "${val:-}" ] && HOST="$val"
val=$(grep -E "^PING_INTERVAL=" "$CONFIG_FILE" | tail -n1 | cut -d'=' -f2)
if echo "${val:-}" | grep -qE '^[0-9]+$'; then
INTERVAL="$val"
fi
fi
# Default to enabled if no config exists
echo "true"
}
# Save ping setting to config file
save_ping_setting() {
save_config() {
local enabled="$1"
ensure_config_directory
local host="$2"
local interval="$3"
# Create or update config file
if [ -f "$CONFIG_FILE" ]; then
# Update existing file
sed -i "s/^PING_ENABLED=.*$/PING_ENABLED=$enabled/" "$CONFIG_FILE"
if [ $? -ne 0 ]; then
# If sed fails (e.g., no match), append the setting
echo "PING_ENABLED=$enabled" >> "$CONFIG_FILE"
# Try primary directory first
if mkdir -p "$CONFIG_DIR" 2>/dev/null; then
local tmp="$CONFIG_FILE.tmp.$$"
echo "PING_ENABLED=$enabled" > "$tmp" || rm -f "$tmp" || return 1
echo "PING_HOST=$host" >> "$tmp" || rm -f "$tmp" || return 1
echo "PING_INTERVAL=$interval" >> "$tmp" || rm -f "$tmp" || return 1
if mv -f "$tmp" "$CONFIG_FILE" 2>/dev/null; then
chmod 644 "$CONFIG_FILE" 2>/dev/null || true
log_message "Saved ping config (primary): enabled=$enabled host=$host interval=$interval"
return 0
fi
else
# Create new file
echo "PING_ENABLED=$enabled" > "$CONFIG_FILE"
fi
chmod 644 "$CONFIG_FILE"
log_message "Saved ping setting: $enabled"
# Fallback to /tmp
mkdir -p "$FALLBACK_CONFIG_DIR" 2>/dev/null || true
local tmp2="$FALLBACK_CONFIG_FILE.tmp.$$"
echo "PING_ENABLED=$enabled" > "$tmp2" || rm -f "$tmp2" || return 1
echo "PING_HOST=$host" >> "$tmp2" || rm -f "$tmp2" || return 1
echo "PING_INTERVAL=$interval" >> "$tmp2" || rm -f "$tmp2" || return 1
mv -f "$tmp2" "$FALLBACK_CONFIG_FILE" 2>/dev/null || return 1
chmod 644 "$FALLBACK_CONFIG_FILE" 2>/dev/null || true
# Point CONFIG_FILE to fallback for subsequent reads in this request
CONFIG_FILE="$FALLBACK_CONFIG_FILE"; CONFIG_DIR="$FALLBACK_CONFIG_DIR"
log_message "Saved ping config (fallback): enabled=$enabled host=$host interval=$interval"
}
# Delete ping configuration (reset to default)
delete_ping_setting() {
if [ -f "$CONFIG_FILE" ]; then
# Remove the PING_ENABLED line
sed -i '/^PING_ENABLED=/d' "$CONFIG_FILE"
log_message "Deleted ping configuration"
# If file is empty after deletion, remove it
if [ ! -s "$CONFIG_FILE" ]; then
rm -f "$CONFIG_FILE"
log_message "Removed empty config file"
local removed=1
for f in "$CONFIG_FILE" "$FALLBACK_CONFIG_FILE"; do
if [ -f "$f" ]; then
sed -i '/^PING_ENABLED=/d' "$f" 2>/dev/null || true
sed -i '/^PING_HOST=/d' "$f" 2>/dev/null || true
sed -i '/^PING_INTERVAL=/d' "$f" 2>/dev/null || true
log_message "Deleted ping configuration entries in $f"
[ -s "$f" ] || { rm -f "$f" 2>/dev/null || true; log_message "Removed empty config file $f"; }
removed=0
fi
return 0
else
return 1
fi
done
return $removed
}
# Handle GET request - Retrieve ping setting
handle_get() {
log_message "GET request received"
# Get current setting (from config or default)
local enabled=$(get_ping_setting)
# Check if it's from config or default
get_config_values
local running=false
if daemon_running; then running=true; fi
local is_default=true
if [ -f "$CONFIG_FILE" ] && grep -q "^PING_ENABLED=" "$CONFIG_FILE"; then
is_default=false
fi
send_success "Ping setting retrieved" "{\"enabled\":$enabled,\"isDefault\":$is_default}"
send_success "Ping configuration retrieved" "{\"enabled\":$ENABLED,\"host\":\"$HOST\",\"interval\":$INTERVAL,\"running\":$running,\"isDefault\":$is_default}"
}
# Handle POST request - Update ping setting
@@ -148,38 +241,58 @@ handle_post() {
local post_data=$(dd bs=$content_length count=1 2>/dev/null)
log_message "Received POST data: $post_data"
# Parse JSON to extract enabled value
local enabled=""
# Parse fields
local enabled host interval
enabled=$(echo "$post_data" | sed -n 's/.*"enabled"[[:space:]]*:[[:space:]]*\([^,}]*\).*/\1/p' | tr -d ' ' | sed 's/"//g')
host=$(echo "$post_data" | sed -n 's/.*"host"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')
interval=$(echo "$post_data" | sed -n 's/.*"interval"[[:space:]]*:[[:space:]]*\([0-9][0-9]*\).*/\1/p')
# Approach 1: Simple regex extraction for boolean
enabled=$(echo "$post_data" | sed -n 's/.*"enabled"[[:space:]]*:[[:space:]]*\([^,}]*\).*/\1/p' | tr -d ' ')
# Defaults when missing
[ -z "$enabled" ] && enabled="true"
[ -z "$host" ] && host="8.8.8.8"
[ -z "$interval" ] && interval="5"
# Approach 2: grep + cut extraction
if [ -z "$enabled" ]; then
enabled=$(echo "$post_data" | grep -o '"enabled":[^,}]*' | cut -d':' -f2 | tr -d ' ')
# Validate
case "$enabled" in
true|false) : ;;
*) send_error "INVALID_SETTING" "Invalid enabled value. Must be true or false." ;;
esac
if ! echo "$interval" | grep -qE '^[0-9]+$'; then
send_error "INVALID_INTERVAL" "Interval must be a number (seconds)."
fi
if [ "$interval" -lt 1 ] || [ "$interval" -gt 3600 ]; then
send_error "INVALID_INTERVAL" "Interval must be between 1 and 3600 seconds."
fi
# Approach 3: Look for true/false in the payload
if [ -z "$enabled" ]; then
if echo "$post_data" | grep -q '"enabled"[[:space:]]*:[[:space:]]*true'; then
enabled="true"
elif echo "$post_data" | grep -q '"enabled"[[:space:]]*:[[:space:]]*false'; then
enabled="false"
# Capture previous values to decide on restart
get_config_values
local prev_enabled="$ENABLED"
local prev_host="$HOST"
local prev_interval="$INTERVAL"
save_config "$enabled" "$host" "$interval" || send_error "WRITE_FAILED" "Failed to save configuration"
if [ "$enabled" = "true" ]; then
if daemon_running; then
# Restart only if effective parameters changed
if [ "$prev_host" != "$host" ] || [ "$prev_interval" != "$interval" ] || [ "$prev_enabled" != "$enabled" ]; then
log_message "Config change detected (host/interval/enabled). Restarting daemon."
stop_daemon
start_daemon || log_message "Failed to restart daemon"
else
log_message "No change requiring restart; daemon remains running"
fi
else
start_daemon || log_message "Failed to start daemon"
fi
fi
# Clean up the value (remove quotes if present)
enabled=$(echo "$enabled" | sed 's/"//g')
log_message "Received enabled: $enabled"
# Validate setting
if [ "$enabled" = "true" ] || [ "$enabled" = "false" ]; then
save_ping_setting "$enabled"
send_success "Ping setting updated successfully" "{\"enabled\":$enabled}"
else
send_error "INVALID_SETTING" "Invalid setting provided. Must be 'true' or 'false'."
stop_daemon
fi
get_config_values
local running=false
if daemon_running; then running=true; fi
send_success "Ping setting updated successfully" "{\"enabled\":$ENABLED,\"host\":\"$HOST\",\"interval\":$INTERVAL,\"running\":$running}"
else
send_error "NO_DATA" "No data provided"
fi
@@ -188,24 +301,15 @@ handle_post() {
# Handle DELETE request - Reset to default (delete configuration)
handle_delete() {
log_message "DELETE request received"
stop_daemon
if delete_ping_setting; then
# Default is enabled
send_success "Ping setting reset to default" "{\"enabled\":true,\"isDefault\":true}"
send_success "Ping setting reset to default" "{\"enabled\":true,\"isDefault\":true,\"running\":false}"
else
send_error "NOT_FOUND" "Ping setting configuration not found"
fi
}
# Handle OPTIONS request for CORS preflight
handle_options() {
log_message "OPTIONS request received"
echo "Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS"
echo "Access-Control-Allow-Headers: Content-Type"
echo "Access-Control-Max-Age: 86400"
exit 0
}
# Main execution
log_message "Ping settings script called with method: ${REQUEST_METHOD:-GET}"
@@ -220,9 +324,6 @@ case "${REQUEST_METHOD:-GET}" in
DELETE)
handle_delete
;;
OPTIONS)
handle_options
;;
*)
send_error "METHOD_NOT_ALLOWED" "HTTP method ${REQUEST_METHOD} not supported"
;;

View File

@@ -0,0 +1,198 @@
#!/bin/sh
# Memory Daemon - Monitors system memory usage and writes to JSON file
# This daemon only runs when memory monitoring is enabled via settings
set -eu
# Ensure PATH for OpenWrt/BusyBox
export PATH="/usr/sbin:/usr/bin:/sbin:/bin:$PATH"
# Configuration
TMP_DIR="/tmp/quecmanager"
OUT_JSON="$TMP_DIR/memory.json"
PID_FILE="$TMP_DIR/memory_daemon.pid"
LOG_FILE="$TMP_DIR/memory_daemon.log"
CONFIG_FILE="/etc/quecmanager/settings/memory_settings.conf"
[ -f "$CONFIG_FILE" ] || CONFIG_FILE="/tmp/quecmanager/settings/memory_settings.conf"
DEFAULT_INTERVAL=1
# Ensure temp directory exists
ensure_tmp_dir() {
[ -d "$TMP_DIR" ] || mkdir -p "$TMP_DIR" || exit 1
}
# Logging function
log() {
printf '%s - %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" >> "$LOG_FILE" 2>/dev/null || true
}
# Check if this daemon instance is already running
daemon_is_running() {
if [ -f "$PID_FILE" ]; then
pid="$(cat "$PID_FILE" 2>/dev/null || true)"
if [ -n "${pid:-}" ] && kill -0 "$pid" 2>/dev/null; then
# Verify it's actually our daemon by checking process cmdline
if [ -r "/proc/$pid/cmdline" ] && grep -q "memory_daemon.sh" "/proc/$pid/cmdline" 2>/dev/null; then
return 0
else
# PID file is stale, remove it
rm -f "$PID_FILE" 2>/dev/null || true
fi
fi
fi
return 1
}
# Write our PID to file
write_pid() {
echo "$$" > "$PID_FILE"
}
# Cleanup function
cleanup() {
rm -f "$PID_FILE" 2>/dev/null || true
log "Memory daemon stopped"
}
# Create default config if none exists
create_default_config() {
local primary_config="/etc/quecmanager/settings/memory_settings.conf"
local fallback_config="/tmp/quecmanager/settings/memory_settings.conf"
if [ ! -f "$primary_config" ] && [ ! -f "$fallback_config" ]; then
log "No config file found, creating default configuration"
# Try primary location first
if mkdir -p "/etc/quecmanager/settings" 2>/dev/null; then
{
echo "MEMORY_ENABLED=false"
echo "MEMORY_INTERVAL=1"
} > "$primary_config" 2>/dev/null && {
chmod 644 "$primary_config" 2>/dev/null || true
CONFIG_FILE="$primary_config"
log "Created default config at $primary_config"
return 0
}
fi
# Fallback to tmp location
mkdir -p "/tmp/quecmanager/settings" 2>/dev/null || true
{
echo "MEMORY_ENABLED=false"
echo "MEMORY_INTERVAL=1"
} > "$fallback_config" && {
chmod 644 "$fallback_config" 2>/dev/null || true
CONFIG_FILE="$fallback_config"
log "Created default config at $fallback_config"
return 0
}
log "Failed to create default config file"
return 1
fi
}
# Read configuration from file
read_config() {
ENABLED="false"
INTERVAL="$DEFAULT_INTERVAL"
if [ -f "$CONFIG_FILE" ]; then
MEMORY_ENABLED=$(grep -E "^MEMORY_ENABLED=" "$CONFIG_FILE" 2>/dev/null | tail -n1 | cut -d'=' -f2 | tr -d '\r' | tr -d '"')
MEMORY_INTERVAL=$(grep -E "^MEMORY_INTERVAL=" "$CONFIG_FILE" 2>/dev/null | tail -n1 | cut -d'=' -f2 | tr -d '\r')
case "${MEMORY_ENABLED:-}" in
true|1|on|yes|enabled) ENABLED="true" ;;
*) ENABLED="false" ;;
esac
if echo "${MEMORY_INTERVAL:-}" | grep -qE '^[0-9]+$'; then
if [ "$MEMORY_INTERVAL" -ge 1 ] && [ "$MEMORY_INTERVAL" -le 10 ]; then
INTERVAL="$MEMORY_INTERVAL"
fi
fi
fi
}
# Write JSON data atomically
write_json_atomic() {
local json_data="$1"
local tmpfile="$(mktemp "$TMP_DIR/memory.XXXXXX" 2>/dev/null || echo "$TMP_DIR/memory.tmp.$$")"
if [ -n "$tmpfile" ] && printf '%s' "$json_data" > "$tmpfile" 2>/dev/null; then
mv "$tmpfile" "$OUT_JSON" 2>/dev/null || {
# Fallback if move fails
printf '%s' "$json_data" > "$OUT_JSON" 2>/dev/null || true
rm -f "$tmpfile" 2>/dev/null || true
}
else
# Direct write fallback
printf '%s' "$json_data" > "$OUT_JSON" 2>/dev/null || true
rm -f "$tmpfile" 2>/dev/null || true
fi
}
# Main execution starts here
ensure_tmp_dir
log "Starting memory daemon (PID: $$)"
# Check if already running
if daemon_is_running; then
log "Memory daemon already running, exiting"
exit 0
fi
# Create default config if needed
create_default_config
# Set up signal handlers
trap cleanup EXIT INT TERM
write_pid
# Main monitoring loop
while true; do
read_config
# Exit if disabled
if [ "$ENABLED" != "true" ]; then
log "Memory monitoring disabled in config, exiting"
exit 0
fi
# Get current timestamp
ts="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
# Get memory information using /proc/meminfo (most reliable method)
if [ -r "/proc/meminfo" ]; then
# Extract values from /proc/meminfo (values are in kB)
TOTAL_KB=$(grep "^MemTotal:" /proc/meminfo 2>/dev/null | awk '{print $2}' || echo "0")
AVAIL_KB=$(grep "^MemAvailable:" /proc/meminfo 2>/dev/null | awk '{print $2}' || echo "0")
FREE_KB=$(grep "^MemFree:" /proc/meminfo 2>/dev/null | awk '{print $2}' || echo "0")
# If MemAvailable is not available (older kernels), estimate it
if [ "$AVAIL_KB" = "0" ]; then
CACHED_KB=$(grep "^Cached:" /proc/meminfo 2>/dev/null | awk '{print $2}' || echo "0")
BUFFERS_KB=$(grep "^Buffers:" /proc/meminfo 2>/dev/null | awk '{print $2}' || echo "0")
AVAIL_KB=$((FREE_KB + CACHED_KB + BUFFERS_KB))
fi
# Convert to bytes (multiply by 1024)
TOTAL_BYTES=$((TOTAL_KB * 1024))
AVAIL_BYTES=$((AVAIL_KB * 1024))
USED_BYTES=$((TOTAL_BYTES - AVAIL_BYTES))
json="{\"total\": $TOTAL_BYTES, \"used\": $USED_BYTES, \"available\": $AVAIL_BYTES, \"timestamp\": \"$ts\"}"
else
# Fallback if /proc/meminfo is not available
log "Warning: /proc/meminfo not readable, using error response"
json="{\"total\": 0, \"used\": 0, \"available\": 0, \"timestamp\": \"$ts\", \"error\": \"meminfo_unavailable\"}"
fi
# Write the JSON data
write_json_atomic "$json"
log "Updated memory data: total=${TOTAL_KB:-0}KB, used=${USED_BYTES:-0}B, available=${AVAIL_KB:-0}KB"
# Sleep for the configured interval
sleep "$INTERVAL"
done

View File

@@ -0,0 +1,134 @@
#!/bin/sh
set -eu
# Ensure PATH for OpenWrt/BusyBox
export PATH="/usr/sbin:/usr/bin:/sbin:/bin:$PATH"
TMP_DIR="/tmp/quecmanager"
OUT_JSON="$TMP_DIR/ping_latency.json"
PID_FILE="$TMP_DIR/ping_daemon.pid"
LOG_FILE="$TMP_DIR/ping_daemon.log"
CONFIG_FILE="/etc/quecmanager/settings/ping_settings.conf"
[ -f "$CONFIG_FILE" ] || CONFIG_FILE="/tmp/quecmanager/settings/ping_settings.conf"
DEFAULT_HOST="8.8.8.8"
DEFAULT_INTERVAL=5
ensure_tmp_dir() { [ -d "$TMP_DIR" ] || mkdir -p "$TMP_DIR" || exit 1; }
log() {
printf '%s - %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" >> "$LOG_FILE" 2>/dev/null || true
}
daemon_is_running() {
if [ -f "$PID_FILE" ]; then
pid="$(cat "$PID_FILE" 2>/dev/null || true)"
if [ -n "${pid:-}" ] && kill -0 "$pid" 2>/dev/null; then
# Avoid false positive if PID reused
if [ -r "/proc/$pid/cmdline" ] && grep -q "ping_daemon.sh" "/proc/$pid/cmdline" 2>/dev/null; then
return 0
else
rm -f "$PID_FILE" 2>/dev/null || true
fi
fi
fi
return 1
}
write_pid() { echo "$$" > "$PID_FILE"; }
cleanup() { rm -f "$PID_FILE" 2>/dev/null || true; }
read_config() {
ENABLED="true"; HOST="$DEFAULT_HOST"; INTERVAL="$DEFAULT_INTERVAL"
if [ -f "$CONFIG_FILE" ]; then
PING_ENABLED=$(grep -E "^PING_ENABLED=" "$CONFIG_FILE" | tail -n1 | cut -d'=' -f2 | tr -d '\r') || true
PING_HOST=$(grep -E "^PING_HOST=" "$CONFIG_FILE" | tail -n1 | cut -d'=' -f2 | tr -d '\r') || true
PING_INTERVAL=$(grep -E "^PING_INTERVAL=" "$CONFIG_FILE" | tail -n1 | cut -d'=' -f2 | tr -d '\r') || true
case "${PING_ENABLED:-}" in true|1|on|yes|enabled) ENABLED=true ;; *) ENABLED=false ;; esac
[ -n "${PING_HOST:-}" ] && HOST="$PING_HOST"
if echo "${PING_INTERVAL:-}" | grep -qE '^[0-9]+$'; then
if [ "$PING_INTERVAL" -ge 1 ] && [ "$PING_INTERVAL" -le 3600 ]; then
INTERVAL="$PING_INTERVAL"
fi
fi
fi
}
# Create default config if none exists
create_default_config() {
local primary_config="/etc/quecmanager/settings/ping_settings.conf"
local fallback_config="/tmp/quecmanager/settings/ping_settings.conf"
# Check if either config exists
if [ -f "$primary_config" ] || [ -f "$fallback_config" ]; then
return 0
fi
# Try to create in primary location first
if mkdir -p "/etc/quecmanager/settings" 2>/dev/null; then
{
echo "PING_ENABLED=true"
echo "PING_HOST=$DEFAULT_HOST"
echo "PING_INTERVAL=$DEFAULT_INTERVAL"
} > "$primary_config" 2>/dev/null && {
chmod 644 "$primary_config" 2>/dev/null || true
CONFIG_FILE="$primary_config"
log "Created default config at $primary_config"
return 0
}
fi
# Fallback to tmp location
mkdir -p "/tmp/quecmanager/settings" 2>/dev/null || true
{
echo "PING_ENABLED=true"
echo "PING_HOST=$DEFAULT_HOST"
echo "PING_INTERVAL=$DEFAULT_INTERVAL"
} > "$fallback_config" && {
chmod 644 "$fallback_config" 2>/dev/null || true
CONFIG_FILE="$fallback_config"
log "Created default config at $fallback_config"
return 0
}
log "Failed to create default config file"
return 1
}
write_json_atomic() {
tmpfile="$(mktemp "$TMP_DIR/ping_latency.XXXXXX" 2>/dev/null || true)"
if [ -n "${tmpfile:-}" ] && [ -w "$TMP_DIR" ]; then
printf '%s' "$1" > "$tmpfile" 2>/dev/null || true
mv -f "$tmpfile" "$OUT_JSON" 2>/dev/null || printf '%s' "$1" > "$OUT_JSON"
else
printf '%s' "$1" > "$OUT_JSON"
fi
}
ensure_tmp_dir
log "Starting ping daemon"
if daemon_is_running; then log "Already running"; exit 0; fi
# Create default config if none exists
create_default_config
trap cleanup EXIT INT TERM
write_pid
while true; do
read_config
if [ "$ENABLED" != "true" ]; then log "Disabled in config"; exit 0; fi
ts="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
PING_BIN="$(command -v ping || echo /bin/ping)"
output="$("$PING_BIN" -c 1 -w 2 "$HOST" 2>/dev/null || true)"
if echo "$output" | grep -q "time="; then
latency_ms="$(echo "$output" | grep -o 'time=[0-9.]*' | head -n1 | cut -d'=' -f2 | cut -d'.' -f1)"; [ -z "$latency_ms" ] && latency_ms=0
json="{\"timestamp\":\"$ts\",\"host\":\"$HOST\",\"latency\":$latency_ms,\"ok\":true}"
else
json="{\"timestamp\":\"$ts\",\"host\":\"$HOST\",\"latency\":null,\"ok\":false}"
fi
write_json_atomic "$json"
log "Wrote: $json"
sleep "$INTERVAL"
done

View File

@@ -607,6 +607,7 @@ apply_profile_settings() {
local current_nsa_nr5g_bands="${14}"
local current_imei="${15}"
local iccid="${16}"
local mobile_provider="${17}"
# Set TTL to 0 (disabled) if not specified
ttl="${ttl:-0}"
@@ -619,6 +620,7 @@ apply_profile_settings() {
log_message "- APN: $apn ($pdp_type)" "info"
log_message "- IMEI: $imei" "info"
log_message "- TTL: $ttl" "info"
log_message "- Mobile Provider: $mobile_provider" "info"
# Check if any changes are needed using improved comparison
local needs_apn_change=0
@@ -630,6 +632,7 @@ apply_profile_settings() {
local needs_ttl_change=0
local changes_needed=0
local requires_reboot=0
local change_for_reboot=""
# Use normalized comparison
compare_values "$current_apn" "$apn" "apn" && needs_apn_change=1 && changes_needed=1
@@ -804,6 +807,7 @@ apply_profile_settings() {
if [ $? -eq 0 ]; then
changes_made=1
requires_reboot=1
change_for_reboot="IMEI"
log_message "IMEI changed successfully to $imei (device will reboot)" "info"
update_track "rebooting" "IMEI changed, device will reboot" "$profile_name" "95"
else
@@ -813,9 +817,56 @@ apply_profile_settings() {
fi
fi
# Apply unique rule setup for Verizon, but also handle "Other" Mobile Providers because of MPDN_rule shenanigans
# Probably requires reboot
output_check=$(execute_at_command "AT+QMAP=\"mpdn_rule\"")
sleep 1 # Short delay to ensure command is processed
qmap_rule0=$(echo "$output_check" | grep '+QMAP: "MPDN_rule",0,')
qmap_ippt_rule0=$(echo "$qmap_rule0" | cut -d',' -f5)
if [ $apply_success -eq 1 ] && [ -n "$mobile_provider" ]; then
if [ "$mobile_provider" = "Verizon" ]; then
# If Verizon, data call should be set to rule 3, AT+QMAP="mpdn_rule",0,3,0,0,1
if echo "$qmap_rule0" | awk -F',' '{exit !($2==0 && $3==3 && $6==1)}'; then
log_message "Verizon rule already set correctly, no changes needed" "info"
else
log_message "Setting Verizon data call mpdn_rule to 3" "info"
update_track "applying" "Setting Verizon data call rule to 3" "$profile_name" "100"
verizon_cmd="AT+QMAP=\"mpdn_rule\",0,3,0,$qmap_ippt_rule0,1"
execute_at_command "$verizon_cmd" 10 "$token_id" >/dev/null
sleep 1 # Short delay to ensure command is processed
fi
elif [ "$mobile_provider" = "Other" ]; then
# Check if MPDN_rule 0 is already set to all zeros
if echo "$qmap_rule0" | awk -F',' '{exit !($2==0 && $3==0 && $6==0)}'; then
log_message "Default rule already set correctly, no changes needed" "info"
else
log_message "Setting to default mpdn_rule and releasing" "info"
update_track "applying" "Setting Default data call mpdn_rule to 0" "$profile_name" "100"
def_cmd1="AT+QMAP=\"mpdn_rule\",0"
execute_at_command "$def_cmd1" 10 "$token_id"
sleep 1 # Short delay to ensure command is processed
def_cmd2="AT+QMAP=\"mpdn_rule\",0,1,0,$qmap_ippt_rule0,1"
execute_at_command "$def_cmd2" 10 "$token_id"
sleep 1 # Short delay to ensure command is processed
if [ "$qmap_ippt_rule0" = "0" ]; then
log_message "IPPT is disabled for rule, release the MPDN_rule" "info"
def_cmd3="AT+QMAP=\"mpdn_rule\",0"
execute_at_command "$def_cmd3" 10 "$token_id"
sleep 1 # Short delay to ensure command is processed
if [ "$(cat /sys/devices/soc0/machine)" = "SDXPINN" ]; then
requires_reboot=1
change_for_reboot="MPDN_rule"
update_track "rebooting" "MPDN_rule released, device will reboot" "$profile_name" "105"
fi
else
log_message "IPPT is enabled for rule0 not releasing MPDN_rule, no reboot needed: IPPT Value $qmap_ippt_rule0" "info"
fi
fi
fi
fi
# Release token
release_token "$token_id"
# Mark profile as applied if changes were made
if [ $changes_made -eq 1 ]; then
mark_profile_applied "$iccid" "$profile_name"
@@ -824,7 +875,7 @@ apply_profile_settings() {
# If IMEI was changed, need to reboot
if [ $requires_reboot -eq 1 ]; then
log_message "IMEI change requires reboot, scheduling reboot..." "info"
update_track "rebooting" "Device is rebooting to apply IMEI change" "$profile_name" "100"
update_track "rebooting" "Device is rebooting to apply $change_for_reboot change" "$profile_name" "100"
sleep 2
reboot &
return 0
@@ -913,6 +964,7 @@ check_profile() {
local pdp_type=$(uci -q get quecprofiles.$profile_index.pdp_type)
local imei=$(uci -q get quecprofiles.$profile_index.imei)
local ttl=$(uci -q get quecprofiles.$profile_index.ttl)
local mobile_provider=$(uci -q get quecprofiles.$profile_index.mobile_provider)
# Check if profile is paused
local paused=$(uci -q get quecprofiles.$profile_index.paused)
@@ -982,7 +1034,7 @@ check_profile() {
# Apply profile settings with the new parameters
apply_profile_settings "$profile_name" "$network_type" "$lte_bands" "$sa_nr5g_bands" "$nsa_nr5g_bands" \
"$apn" "$pdp_type" "$imei" "$ttl" "$current_apn" "$current_mode" "$current_lte_bands" \
"$current_sa_nr5g_bands" "$current_nsa_nr5g_bands" "$current_imei" "$current_iccid"
"$current_sa_nr5g_bands" "$current_nsa_nr5g_bands" "$current_imei" "$current_iccid" "$mobile_provider"
return $?
else
log_message "Automatic profile switching is disabled, not applying profile" "info"

File diff suppressed because one or more lines are too long

View File

@@ -1,19 +1,19 @@
1:"$Sreact.fragment"
2:I[74347,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ea531924681188d0.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ea531924681188d0.js"],"TooltipProvider"]
2:I[74347,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ddd6481449252af3.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ddd6481449252af3.js"],"TooltipProvider"]
4:I[24900,[],""]
5:I[81570,[],""]
6:I[62825,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ea531924681188d0.js"],"Toaster"]
6:I[62825,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ddd6481449252af3.js"],"Toaster"]
7:I[92907,[],"ClientSegmentRoot"]
8:I[63231,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","9464","static/chunks/9464-54895f8e78c474f0.js","1318","static/chunks/1318-767d278b8ca60a2b.js","564","static/chunks/564-bce78b0f1af68d0a.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7536","static/chunks/7536-99552f97cdce7493.js","6223","static/chunks/6223-985db5887dec3c8a.js","1954","static/chunks/app/dashboard/layout-e6a263e9e7db526a.js"],"default"]
8:I[63231,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","9464","static/chunks/9464-54895f8e78c474f0.js","9477","static/chunks/9477-4478381adb29cdff.js","564","static/chunks/564-bce78b0f1af68d0a.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","9873","static/chunks/9873-1f9f7420ad1929d8.js","6223","static/chunks/6223-985db5887dec3c8a.js","1954","static/chunks/app/dashboard/layout-e1e7681e45955939.js"],"default"]
a:I[5329,[],"ClientPageRoot"]
b:I[51228,["1258","static/chunks/1258-d8581095ee7eff72.js","467","static/chunks/467-150cb05a6a0d0e15.js","6655","static/chunks/app/dashboard/about/page-e020f586172ca1f4.js"],"default"]
b:I[51228,["7780","static/chunks/7780-f325b2d7864a75f9.js","467","static/chunks/467-150cb05a6a0d0e15.js","6655","static/chunks/app/dashboard/about/page-eb54f6bca93f2fd0.js"],"default"]
e:I[99165,[],"OutletBoundary"]
10:I[99165,[],"MetadataBoundary"]
12:I[99165,[],"ViewportBoundary"]
14:I[25339,[],""]
:HL["/_next/static/css/42cb6b63b4b8c16d.css","style"]
0:{"P":null,"b":"UNoHHimC1xZOO6l4nPvt9","p":"","c":["","dashboard","about",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["about",{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/42cb6b63b4b8c16d.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["about",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","about","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$La",null,{"Component":"$b","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@c","$@d"]}],null,["$","$Le",null,{"children":"$Lf"}]]}],{},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","_r5o_KuozOC2p_owZG1S0",{"children":[["$","$L10",null,{"children":"$L11"}],["$","$L12",null,{"children":"$L13"}],null]}]]}],false]],"m":"$undefined","G":["$14","$undefined"],"s":false,"S":true}
:HL["/_next/static/css/8b72a0de6df072c2.css","style"]
0:{"P":null,"b":"-jpS2zZVMbOmrH9iSxw3X","p":"","c":["","dashboard","about",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["about",{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/8b72a0de6df072c2.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["about",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","about","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$La",null,{"Component":"$b","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@c","$@d"]}],null,["$","$Le",null,{"children":"$Lf"}]]}],{},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","eujqB8E8NE-n5so9mCRsB",{"children":[["$","$L10",null,{"children":"$L11"}],["$","$L12",null,{"children":"$L13"}],null]}]]}],false]],"m":"$undefined","G":["$14","$undefined"],"s":false,"S":true}
9:{}
c:{}
d:{}

View File

@@ -1,20 +1,20 @@
1:"$Sreact.fragment"
2:I[74347,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ea531924681188d0.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ea531924681188d0.js"],"TooltipProvider"]
2:I[74347,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ddd6481449252af3.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ddd6481449252af3.js"],"TooltipProvider"]
4:I[24900,[],""]
5:I[81570,[],""]
6:I[62825,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ea531924681188d0.js"],"Toaster"]
6:I[62825,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ddd6481449252af3.js"],"Toaster"]
7:I[92907,[],"ClientSegmentRoot"]
8:I[63231,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","9464","static/chunks/9464-54895f8e78c474f0.js","1318","static/chunks/1318-767d278b8ca60a2b.js","564","static/chunks/564-bce78b0f1af68d0a.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7536","static/chunks/7536-99552f97cdce7493.js","6223","static/chunks/6223-985db5887dec3c8a.js","1954","static/chunks/app/dashboard/layout-e6a263e9e7db526a.js"],"default"]
a:I[74627,["1318","static/chunks/1318-767d278b8ca60a2b.js","4277","static/chunks/app/dashboard/advanced-settings/layout-acf9549d02163872.js"],"default"]
8:I[63231,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","9464","static/chunks/9464-54895f8e78c474f0.js","9477","static/chunks/9477-4478381adb29cdff.js","564","static/chunks/564-bce78b0f1af68d0a.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","9873","static/chunks/9873-1f9f7420ad1929d8.js","6223","static/chunks/6223-985db5887dec3c8a.js","1954","static/chunks/app/dashboard/layout-e1e7681e45955939.js"],"default"]
a:I[74627,["9477","static/chunks/9477-4478381adb29cdff.js","4277","static/chunks/app/dashboard/advanced-settings/layout-072beb7f889526aa.js"],"default"]
c:I[5329,[],"ClientPageRoot"]
d:I[30233,["1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","9464","static/chunks/9464-54895f8e78c474f0.js","467","static/chunks/467-150cb05a6a0d0e15.js","564","static/chunks/564-bce78b0f1af68d0a.js","8757","static/chunks/app/dashboard/advanced-settings/at-terminal/page-f034a452a8e8f506.js"],"default"]
d:I[30233,["7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","9464","static/chunks/9464-54895f8e78c474f0.js","467","static/chunks/467-150cb05a6a0d0e15.js","564","static/chunks/564-bce78b0f1af68d0a.js","8757","static/chunks/app/dashboard/advanced-settings/at-terminal/page-e325f400037645e7.js"],"default"]
10:I[99165,[],"OutletBoundary"]
12:I[99165,[],"MetadataBoundary"]
14:I[99165,[],"ViewportBoundary"]
16:I[25339,[],""]
:HL["/_next/static/css/42cb6b63b4b8c16d.css","style"]
0:{"P":null,"b":"UNoHHimC1xZOO6l4nPvt9","p":"","c":["","dashboard","advanced-settings","at-terminal",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["at-terminal",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/42cb6b63b4b8c16d.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["at-terminal",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","at-terminal","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","v8S-fo3KAtj4D5iEfVeqK",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
:HL["/_next/static/css/8b72a0de6df072c2.css","style"]
0:{"P":null,"b":"-jpS2zZVMbOmrH9iSxw3X","p":"","c":["","dashboard","advanced-settings","at-terminal",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["at-terminal",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/8b72a0de6df072c2.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["at-terminal",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","at-terminal","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","JKVyrYYDDYSXOP_zNcq4X",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
9:{}
b:{}
e:{}

View File

@@ -1,20 +1,20 @@
1:"$Sreact.fragment"
2:I[74347,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ea531924681188d0.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ea531924681188d0.js"],"TooltipProvider"]
2:I[74347,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ddd6481449252af3.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ddd6481449252af3.js"],"TooltipProvider"]
4:I[24900,[],""]
5:I[81570,[],""]
6:I[62825,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ea531924681188d0.js"],"Toaster"]
6:I[62825,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","3048","static/chunks/3048-9766c902a7fac6d2.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7177","static/chunks/app/layout-ddd6481449252af3.js"],"Toaster"]
7:I[92907,[],"ClientSegmentRoot"]
8:I[63231,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","9464","static/chunks/9464-54895f8e78c474f0.js","1318","static/chunks/1318-767d278b8ca60a2b.js","564","static/chunks/564-bce78b0f1af68d0a.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","7536","static/chunks/7536-99552f97cdce7493.js","6223","static/chunks/6223-985db5887dec3c8a.js","1954","static/chunks/app/dashboard/layout-e6a263e9e7db526a.js"],"default"]
a:I[74627,["1318","static/chunks/1318-767d278b8ca60a2b.js","4277","static/chunks/app/dashboard/advanced-settings/layout-acf9549d02163872.js"],"default"]
8:I[63231,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","9464","static/chunks/9464-54895f8e78c474f0.js","9477","static/chunks/9477-4478381adb29cdff.js","564","static/chunks/564-bce78b0f1af68d0a.js","2682","static/chunks/2682-7f9e5e2a8bb2f859.js","9873","static/chunks/9873-1f9f7420ad1929d8.js","6223","static/chunks/6223-985db5887dec3c8a.js","1954","static/chunks/app/dashboard/layout-e1e7681e45955939.js"],"default"]
a:I[74627,["9477","static/chunks/9477-4478381adb29cdff.js","4277","static/chunks/app/dashboard/advanced-settings/layout-072beb7f889526aa.js"],"default"]
c:I[5329,[],"ClientPageRoot"]
d:I[76592,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","1258","static/chunks/1258-d8581095ee7eff72.js","4687","static/chunks/4687-e0eed5cfe3a696d9.js","3746","static/chunks/3746-654c7d406af2e140.js","9464","static/chunks/9464-54895f8e78c474f0.js","3494","static/chunks/3494-d763154adf622bee.js","564","static/chunks/564-bce78b0f1af68d0a.js","6592","static/chunks/6592-ed8803c28c183efa.js","9548","static/chunks/app/dashboard/advanced-settings/connectivity/page-6152b94dd5abd007.js"],"default"]
d:I[76592,["9980","static/chunks/7b0cf0b7-b5dde770929b7ab9.js","7780","static/chunks/7780-f325b2d7864a75f9.js","8885","static/chunks/8885-ae45735eaa57e8dd.js","3746","static/chunks/3746-654c7d406af2e140.js","9464","static/chunks/9464-54895f8e78c474f0.js","3494","static/chunks/3494-d763154adf622bee.js","564","static/chunks/564-bce78b0f1af68d0a.js","6592","static/chunks/6592-c00d205b3afea358.js","9548","static/chunks/app/dashboard/advanced-settings/connectivity/page-b6af3e3a1c9b8f1a.js"],"default"]
10:I[99165,[],"OutletBoundary"]
12:I[99165,[],"MetadataBoundary"]
14:I[99165,[],"ViewportBoundary"]
16:I[25339,[],""]
:HL["/_next/static/css/42cb6b63b4b8c16d.css","style"]
0:{"P":null,"b":"UNoHHimC1xZOO6l4nPvt9","p":"","c":["","dashboard","advanced-settings","connectivity",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["connectivity",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/42cb6b63b4b8c16d.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["connectivity",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","connectivity","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","rl9A_CaBwADdM0cfYpmi_",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
:HL["/_next/static/css/8b72a0de6df072c2.css","style"]
0:{"P":null,"b":"-jpS2zZVMbOmrH9iSxw3X","p":"","c":["","dashboard","advanced-settings","connectivity",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["connectivity",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/8b72a0de6df072c2.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"antialiased __className_9dae3d","children":[["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[],[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$L6",null,{}]]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["advanced-settings",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$a","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promise":"$@b"}]]}],{"children":["connectivity",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","connectivity","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$Lc",null,{"Component":"$d","searchParams":{},"params":"$0:f:0:1:2:children:1:props:children:1:props:params","promises":["$@e","$@f"]}],null,["$","$L10",null,{"children":"$L11"}]]}],{},null,false]},null,false]},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,["$","$1","zQq1dqY36TFSkVio7047a",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
9:{}
b:{}
e:{}

Some files were not shown because too many files have changed in this diff Show More