Hot fix for version 2.28
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
Package: sdxpinn-quecmanager-beta
|
Package: sdxpinn-quecmanager-beta
|
||||||
Version: 2.2.7
|
Version: 2.2.8
|
||||||
Architecture: aarch64_cortex-a53
|
Architecture: aarch64_cortex-a53
|
||||||
Maintainer: Russel Yasol dr-dolomite@github.com Cameron Thompson iamromulan@github.com Christopher Landwehr clndwhr@github.com
|
Maintainer: Russel Yasol dr-dolomite@github.com Cameron Thompson iamromulan@github.com Christopher Landwehr clndwhr@github.com
|
||||||
Source: github.com/iamromulan
|
Source: github.com/iamromulan
|
||||||
|
|||||||
@@ -43,6 +43,19 @@ start_service() {
|
|||||||
procd_close_instance
|
procd_close_instance
|
||||||
echo "QCAINFO Interpreter started"
|
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"
|
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
@@ -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();
|
||||||
@@ -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
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
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
@@ -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()}]);
|
||||||
@@ -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()}]);
|
||||||
File diff suppressed because one or more lines are too long
@@ -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()}]);
|
||||||
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
@@ -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()}]);
|
||||||
File diff suppressed because one or more lines are too long
@@ -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()}]);
|
||||||
@@ -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()}]);
|
||||||
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
@@ -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()}]);
|
|
||||||
@@ -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()}]);
|
||||||
@@ -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()}]);
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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()}]);
|
||||||
File diff suppressed because one or more lines are too long
@@ -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()}]);
|
||||||
@@ -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()}]);
|
|
||||||
@@ -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()}]);
|
||||||
@@ -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
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
@@ -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()}]);
|
||||||
@@ -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()}]);
|
|
||||||
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
@@ -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()}]);
|
||||||
@@ -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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,5 +1,8 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Ethernet Hardware Details Fetch Script
|
||||||
|
# Provides ethernet interface information using ethtool
|
||||||
|
|
||||||
# Set common headers
|
# Set common headers
|
||||||
echo "Content-Type: application/json"
|
echo "Content-Type: application/json"
|
||||||
echo "Access-Control-Allow-Origin: *"
|
echo "Access-Control-Allow-Origin: *"
|
||||||
@@ -57,13 +60,6 @@ cleanup() {
|
|||||||
# Set trap for cleanup
|
# Set trap for cleanup
|
||||||
trap cleanup EXIT INT TERM
|
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
|
# Function to get ethernet information
|
||||||
get_ethernet_info() {
|
get_ethernet_info() {
|
||||||
interface=${1:-eth0}
|
interface=${1:-eth0}
|
||||||
@@ -93,27 +89,13 @@ get_ethernet_info() {
|
|||||||
# Acquire lock before proceeding
|
# Acquire lock before proceeding
|
||||||
acquire_lock
|
acquire_lock
|
||||||
|
|
||||||
# Parse query string for type and interface
|
# Parse query string for interface parameter
|
||||||
type=$(echo "$QUERY_STRING" | sed -n 's/.*type=\([^&]*\).*/\1/p')
|
|
||||||
interface=$(echo "$QUERY_STRING" | sed -n 's/.*interface=\([^&]*\).*/\1/p')
|
interface=$(echo "$QUERY_STRING" | sed -n 's/.*interface=\([^&]*\).*/\1/p')
|
||||||
|
|
||||||
# Default interface if not specified
|
# Default interface if not specified
|
||||||
[ -z "$interface" ] && interface="eth0"
|
[ -z "$interface" ] && interface="eth0"
|
||||||
|
|
||||||
# Convert type to lowercase using tr
|
# Get ethernet information for the specified interface
|
||||||
type=$(echo "$type" | tr '[:upper:]' '[:lower:]')
|
get_ethernet_info "$interface"
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
# Lock will be automatically released by the cleanup trap
|
# Lock will be automatically released by the cleanup trap
|
||||||
@@ -6,6 +6,15 @@
|
|||||||
echo "Content-Type: application/json"
|
echo "Content-Type: application/json"
|
||||||
echo ""
|
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
|
# Fetch public IP using multiple fallback methods
|
||||||
PUBLIC_IP=$(
|
PUBLIC_IP=$(
|
||||||
curl -s https://api.ipify.org 2>/dev/null || \
|
curl -s https://api.ipify.org 2>/dev/null || \
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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}}"
|
||||||
@@ -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
|
||||||
@@ -83,6 +83,7 @@ get_profiles() {
|
|||||||
local nsa_nr5g_bands=$(uci -q get "quecprofiles.$idx.nsa_nr5g_bands" 2>/dev/null)
|
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 network_type=$(uci -q get "quecprofiles.$idx.network_type" 2>/dev/null)
|
||||||
local ttl=$(uci -q get "quecprofiles.$idx.ttl" 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)
|
local paused=$(uci -q get "quecprofiles.$idx.paused" 2>/dev/null)
|
||||||
|
|
||||||
# Debug output
|
# Debug output
|
||||||
@@ -105,6 +106,7 @@ get_profiles() {
|
|||||||
nsa_nr5g_bands=$(sanitize_for_json "${nsa_nr5g_bands:-""}")
|
nsa_nr5g_bands=$(sanitize_for_json "${nsa_nr5g_bands:-""}")
|
||||||
network_type=$(sanitize_for_json "${network_type:-"LTE"}")
|
network_type=$(sanitize_for_json "${network_type:-"LTE"}")
|
||||||
ttl=$(sanitize_for_json "${ttl:-0}")
|
ttl=$(sanitize_for_json "${ttl:-0}")
|
||||||
|
mobile_provider=$(sanitize_for_json "${mobile_provider:-""}")
|
||||||
paused=$(sanitize_for_json "${paused:-0}")
|
paused=$(sanitize_for_json "${paused:-0}")
|
||||||
|
|
||||||
# Create profile JSON
|
# Create profile JSON
|
||||||
@@ -119,6 +121,7 @@ get_profiles() {
|
|||||||
profile_json="${profile_json}\"nsa_nr5g_bands\":\"${nsa_nr5g_bands}\","
|
profile_json="${profile_json}\"nsa_nr5g_bands\":\"${nsa_nr5g_bands}\","
|
||||||
profile_json="${profile_json}\"network_type\":\"${network_type}\","
|
profile_json="${profile_json}\"network_type\":\"${network_type}\","
|
||||||
profile_json="${profile_json}\"ttl\":\"${ttl}\","
|
profile_json="${profile_json}\"ttl\":\"${ttl}\","
|
||||||
|
profile_json="${profile_json}\"mobile_provider\":\"${mobile_provider}\","
|
||||||
profile_json="${profile_json}\"paused\":\"${paused}\""
|
profile_json="${profile_json}\"paused\":\"${paused}\""
|
||||||
profile_json="${profile_json}}"
|
profile_json="${profile_json}}"
|
||||||
|
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ create_profile() {
|
|||||||
local nsa_nr5g_bands="$8"
|
local nsa_nr5g_bands="$8"
|
||||||
local network_type="$9"
|
local network_type="$9"
|
||||||
local ttl="${10}"
|
local ttl="${10}"
|
||||||
|
local mobile_provider="${11}"
|
||||||
|
|
||||||
# Generate a unique ID for the profile
|
# Generate a unique ID for the profile
|
||||||
local profile_id="profile_$(date +%s)_$(head -c 4 /dev/urandom | hexdump -e '"%x"')"
|
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].network_type='$network_type'
|
||||||
set quecprofiles.@profile[-1].ttl='$ttl'
|
set quecprofiles.@profile[-1].ttl='$ttl'
|
||||||
set quecprofiles.@profile[-1].paused='0'
|
set quecprofiles.@profile[-1].paused='0'
|
||||||
|
set quecprofiles.@profile[-1].mobile_provider='$mobile_provider'
|
||||||
commit quecprofiles
|
commit quecprofiles
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
@@ -206,6 +208,7 @@ if [ "$REQUEST_METHOD" = "POST" ]; then
|
|||||||
nsa_nr5g_bands=$(echo "$POST_DATA" | jsonfilter -e '@.nsa_nr5g_bands' 2>/dev/null)
|
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)
|
network_type=$(echo "$POST_DATA" | jsonfilter -e '@.network_type' 2>/dev/null)
|
||||||
ttl=$(echo "$POST_DATA" | jsonfilter -e '@.ttl' 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"
|
log_message "Parsed JSON data for profile: $name" "debug"
|
||||||
else
|
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 '"')
|
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 '"')
|
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 '"')
|
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"
|
log_message "Basic parsing for profile: $name" "warn"
|
||||||
fi
|
fi
|
||||||
@@ -240,6 +244,7 @@ else
|
|||||||
nsa_nr5g_bands=$(echo "$QUERY_STRING" | grep -o 'nsa_nr5g_bands=[^&]*' | cut -d'=' -f2)
|
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)
|
network_type=$(echo "$QUERY_STRING" | grep -o 'network_type=[^&]*' | cut -d'=' -f2)
|
||||||
ttl=$(echo "$QUERY_STRING" | grep -o 'ttl=[^&]*' | 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
|
# URL decode values
|
||||||
name=$(echo "$name" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
|
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")
|
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")
|
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")
|
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"
|
log_message "Using URL parameters" "warn"
|
||||||
fi
|
fi
|
||||||
@@ -267,6 +273,7 @@ sa_nr5g_bands=$(sanitize "${sa_nr5g_bands:-}")
|
|||||||
nsa_nr5g_bands=$(sanitize "${nsa_nr5g_bands:-}")
|
nsa_nr5g_bands=$(sanitize "${nsa_nr5g_bands:-}")
|
||||||
network_type=$(sanitize "${network_type:-LTE}")
|
network_type=$(sanitize "${network_type:-LTE}")
|
||||||
ttl=$(sanitize "${ttl:-0}") # Default to 0 (disabled)
|
ttl=$(sanitize "${ttl:-0}") # Default to 0 (disabled)
|
||||||
|
mobile_provider=$(sanitize "${mobile_provider:-Other}")
|
||||||
|
|
||||||
# Output debug info
|
# Output debug info
|
||||||
log_message "Creating profile: $name, ICCID: $iccid, IMEI: $imei, APN: $apn" "debug"
|
log_message "Creating profile: $name, ICCID: $iccid, IMEI: $imei, APN: $apn" "debug"
|
||||||
@@ -340,14 +347,14 @@ elif [ $dup_status -eq 2 ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Create the profile
|
# 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
|
# Trigger immediate profile application
|
||||||
touch "/tmp/quecprofiles_check"
|
touch "/tmp/quecprofiles_check"
|
||||||
chmod 644 "/tmp/quecprofiles_check"
|
chmod 644 "/tmp/quecprofiles_check"
|
||||||
log_message "Triggered immediate profile check after creation" "info"
|
log_message "Triggered immediate profile check after creation" "info"
|
||||||
|
|
||||||
# Create profile data JSON for return - WITHOUT outer curly braces
|
# 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
|
# Wrap the data field in curly braces inside output_json
|
||||||
output_json "success" "Profile created successfully" "{$profile_data}"
|
output_json "success" "Profile created successfully" "{$profile_data}"
|
||||||
|
|||||||
@@ -171,6 +171,7 @@ update_profile() {
|
|||||||
local nsa_nr5g_bands="$8"
|
local nsa_nr5g_bands="$8"
|
||||||
local network_type="$9"
|
local network_type="$9"
|
||||||
local ttl="${10}"
|
local ttl="${10}"
|
||||||
|
local mobile_provider="${11}"
|
||||||
|
|
||||||
# Update the profile in UCI config
|
# Update the profile in UCI config
|
||||||
uci -q batch <<EOF
|
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.nsa_nr5g_bands='$nsa_nr5g_bands'
|
||||||
set quecprofiles.$profile_index.network_type='$network_type'
|
set quecprofiles.$profile_index.network_type='$network_type'
|
||||||
set quecprofiles.$profile_index.ttl='$ttl'
|
set quecprofiles.$profile_index.ttl='$ttl'
|
||||||
|
set quecprofiles.$profile_index.mobile_provider='$mobile_provider'
|
||||||
commit quecprofiles
|
commit quecprofiles
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
@@ -237,6 +239,7 @@ if [ "$REQUEST_METHOD" = "POST" ]; then
|
|||||||
nsa_nr5g_bands=$(echo "$POST_DATA" | jsonfilter -e '@.nsa_nr5g_bands' 2>/dev/null)
|
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)
|
network_type=$(echo "$POST_DATA" | jsonfilter -e '@.network_type' 2>/dev/null)
|
||||||
ttl=$(echo "$POST_DATA" | jsonfilter -e '@.ttl' 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"
|
log_message "Parsed JSON data for profile: $name" "debug"
|
||||||
else
|
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 '"')
|
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 '"')
|
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 '"')
|
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"
|
log_message "Basic parsing for profile: $name" "warn"
|
||||||
fi
|
fi
|
||||||
@@ -271,6 +275,7 @@ else
|
|||||||
nsa_nr5g_bands=$(echo "$QUERY_STRING" | grep -o 'nsa_nr5g_bands=[^&]*' | cut -d'=' -f2)
|
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)
|
network_type=$(echo "$QUERY_STRING" | grep -o 'network_type=[^&]*' | cut -d'=' -f2)
|
||||||
ttl=$(echo "$QUERY_STRING" | grep -o 'ttl=[^&]*' | 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
|
# URL decode values
|
||||||
iccid=$(echo "$iccid" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;' | xargs -0 printf "%b")
|
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")
|
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")
|
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")
|
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"
|
log_message "Using URL parameters" "warn"
|
||||||
fi
|
fi
|
||||||
@@ -298,6 +304,7 @@ sa_nr5g_bands=$(sanitize "${sa_nr5g_bands:-}")
|
|||||||
nsa_nr5g_bands=$(sanitize "${nsa_nr5g_bands:-}")
|
nsa_nr5g_bands=$(sanitize "${nsa_nr5g_bands:-}")
|
||||||
network_type=$(sanitize "${network_type:-LTE}")
|
network_type=$(sanitize "${network_type:-LTE}")
|
||||||
ttl=$(sanitize "${ttl:-0}") # Default to 0 (disabled)
|
ttl=$(sanitize "${ttl:-0}") # Default to 0 (disabled)
|
||||||
|
mobile_provider=$(sanitize "${mobile_provider:-Other}")
|
||||||
|
|
||||||
# Output debug info
|
# Output debug info
|
||||||
log_message "Editing profile: $name, ICCID: $iccid, IMEI: $imei, APN: $apn" "debug"
|
log_message "Editing profile: $name, ICCID: $iccid, IMEI: $imei, APN: $apn" "debug"
|
||||||
@@ -373,7 +380,7 @@ if check_duplicate_name "$name" "$iccid"; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Update profile
|
# 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
|
# Trigger immediate profile application
|
||||||
touch "/tmp/quecprofiles_check"
|
touch "/tmp/quecprofiles_check"
|
||||||
chmod 644 "/tmp/quecprofiles_check"
|
chmod 644 "/tmp/quecprofiles_check"
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -1,11 +1,22 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# Ping Settings Configuration Script
|
# Ping Settings Configuration Script
|
||||||
# Manages ping enable/disable preferences
|
# Manages ping service (enable/disable) and daemon settings
|
||||||
# Author: dr-dolomite
|
# Author: dr-dolomite
|
||||||
# Date: 2025-08-04
|
# 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 "Content-Type: application/json"
|
||||||
echo "Access-Control-Allow-Origin: *"
|
echo "Access-Control-Allow-Origin: *"
|
||||||
echo "Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS"
|
echo "Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS"
|
||||||
@@ -15,7 +26,12 @@ echo ""
|
|||||||
# Configuration
|
# Configuration
|
||||||
CONFIG_DIR="/etc/quecmanager/settings"
|
CONFIG_DIR="/etc/quecmanager/settings"
|
||||||
CONFIG_FILE="$CONFIG_DIR/ping_settings.conf"
|
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"
|
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
|
# Logging function
|
||||||
log_message() {
|
log_message() {
|
||||||
@@ -43,99 +59,176 @@ send_success() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ensure configuration directory exists
|
# Resolve config file for reading: prefer primary, then fallback
|
||||||
ensure_config_directory() {
|
resolve_config_for_read() {
|
||||||
if [ ! -d "$CONFIG_DIR" ]; then
|
if [ -f "$CONFIG_FILE" ]; then
|
||||||
log_message "Creating directory: $CONFIG_DIR"
|
return 0
|
||||||
mkdir -p "$CONFIG_DIR"
|
elif [ -f "$FALLBACK_CONFIG_FILE" ]; then
|
||||||
if [ $? -ne 0 ]; then
|
CONFIG_FILE="$FALLBACK_CONFIG_FILE"
|
||||||
# Try to use a fallback location in /tmp
|
CONFIG_DIR="$FALLBACK_CONFIG_DIR"
|
||||||
CONFIG_DIR="/tmp/quecmanager/settings"
|
return 0
|
||||||
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"
|
|
||||||
fi
|
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 current ping setting
|
||||||
get_ping_setting() {
|
get_config_values() {
|
||||||
# If config file exists, read from it
|
# defaults
|
||||||
|
ENABLED="true"
|
||||||
|
HOST="8.8.8.8"
|
||||||
|
INTERVAL="5"
|
||||||
|
|
||||||
|
resolve_config_for_read
|
||||||
if [ -f "$CONFIG_FILE" ]; then
|
if [ -f "$CONFIG_FILE" ]; then
|
||||||
ping_enabled=$(grep "^PING_ENABLED=" "$CONFIG_FILE" | cut -d'=' -f2)
|
val=$(grep -E "^PING_ENABLED=" "$CONFIG_FILE" | tail -n1 | cut -d'=' -f2)
|
||||||
if [ -n "$ping_enabled" ]; then
|
if [ -n "${val:-}" ]; then
|
||||||
if [ "$ping_enabled" = "true" ] || [ "$ping_enabled" = "1" ] || [ "$ping_enabled" = "on" ]; then
|
case "$val" in
|
||||||
echo "true"
|
true|1|on|yes|enabled) ENABLED="true" ;;
|
||||||
else
|
*) ENABLED="false" ;;
|
||||||
echo "false"
|
esac
|
||||||
fi
|
fi
|
||||||
return
|
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
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Default to enabled if no config exists
|
|
||||||
echo "true"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Save ping setting to config file
|
# Save ping setting to config file
|
||||||
save_ping_setting() {
|
save_config() {
|
||||||
local enabled="$1"
|
local enabled="$1"
|
||||||
ensure_config_directory
|
local host="$2"
|
||||||
|
local interval="$3"
|
||||||
|
|
||||||
# Create or update config file
|
# Try primary directory first
|
||||||
if [ -f "$CONFIG_FILE" ]; then
|
if mkdir -p "$CONFIG_DIR" 2>/dev/null; then
|
||||||
# Update existing file
|
local tmp="$CONFIG_FILE.tmp.$$"
|
||||||
sed -i "s/^PING_ENABLED=.*$/PING_ENABLED=$enabled/" "$CONFIG_FILE"
|
echo "PING_ENABLED=$enabled" > "$tmp" || rm -f "$tmp" || return 1
|
||||||
if [ $? -ne 0 ]; then
|
echo "PING_HOST=$host" >> "$tmp" || rm -f "$tmp" || return 1
|
||||||
# If sed fails (e.g., no match), append the setting
|
echo "PING_INTERVAL=$interval" >> "$tmp" || rm -f "$tmp" || return 1
|
||||||
echo "PING_ENABLED=$enabled" >> "$CONFIG_FILE"
|
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
|
fi
|
||||||
else
|
|
||||||
# Create new file
|
|
||||||
echo "PING_ENABLED=$enabled" > "$CONFIG_FILE"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
chmod 644 "$CONFIG_FILE"
|
# Fallback to /tmp
|
||||||
log_message "Saved ping setting: $enabled"
|
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 configuration (reset to default)
|
||||||
delete_ping_setting() {
|
delete_ping_setting() {
|
||||||
if [ -f "$CONFIG_FILE" ]; then
|
local removed=1
|
||||||
# Remove the PING_ENABLED line
|
for f in "$CONFIG_FILE" "$FALLBACK_CONFIG_FILE"; do
|
||||||
sed -i '/^PING_ENABLED=/d' "$CONFIG_FILE"
|
if [ -f "$f" ]; then
|
||||||
log_message "Deleted ping configuration"
|
sed -i '/^PING_ENABLED=/d' "$f" 2>/dev/null || true
|
||||||
|
sed -i '/^PING_HOST=/d' "$f" 2>/dev/null || true
|
||||||
# If file is empty after deletion, remove it
|
sed -i '/^PING_INTERVAL=/d' "$f" 2>/dev/null || true
|
||||||
if [ ! -s "$CONFIG_FILE" ]; then
|
log_message "Deleted ping configuration entries in $f"
|
||||||
rm -f "$CONFIG_FILE"
|
[ -s "$f" ] || { rm -f "$f" 2>/dev/null || true; log_message "Removed empty config file $f"; }
|
||||||
log_message "Removed empty config file"
|
removed=0
|
||||||
fi
|
fi
|
||||||
return 0
|
done
|
||||||
else
|
return $removed
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Handle GET request - Retrieve ping setting
|
# Handle GET request - Retrieve ping setting
|
||||||
handle_get() {
|
handle_get() {
|
||||||
log_message "GET request received"
|
log_message "GET request received"
|
||||||
|
get_config_values
|
||||||
# Get current setting (from config or default)
|
local running=false
|
||||||
local enabled=$(get_ping_setting)
|
if daemon_running; then running=true; fi
|
||||||
|
|
||||||
# Check if it's from config or default
|
|
||||||
local is_default=true
|
local is_default=true
|
||||||
if [ -f "$CONFIG_FILE" ] && grep -q "^PING_ENABLED=" "$CONFIG_FILE"; then
|
if [ -f "$CONFIG_FILE" ] && grep -q "^PING_ENABLED=" "$CONFIG_FILE"; then
|
||||||
is_default=false
|
is_default=false
|
||||||
fi
|
fi
|
||||||
|
send_success "Ping configuration retrieved" "{\"enabled\":$ENABLED,\"host\":\"$HOST\",\"interval\":$INTERVAL,\"running\":$running,\"isDefault\":$is_default}"
|
||||||
send_success "Ping setting retrieved" "{\"enabled\":$enabled,\"isDefault\":$is_default}"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Handle POST request - Update ping setting
|
# Handle POST request - Update ping setting
|
||||||
@@ -148,38 +241,58 @@ handle_post() {
|
|||||||
local post_data=$(dd bs=$content_length count=1 2>/dev/null)
|
local post_data=$(dd bs=$content_length count=1 2>/dev/null)
|
||||||
log_message "Received POST data: $post_data"
|
log_message "Received POST data: $post_data"
|
||||||
|
|
||||||
# Parse JSON to extract enabled value
|
# Parse fields
|
||||||
local enabled=""
|
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
|
# Defaults when missing
|
||||||
enabled=$(echo "$post_data" | sed -n 's/.*"enabled"[[:space:]]*:[[:space:]]*\([^,}]*\).*/\1/p' | tr -d ' ')
|
[ -z "$enabled" ] && enabled="true"
|
||||||
|
[ -z "$host" ] && host="8.8.8.8"
|
||||||
|
[ -z "$interval" ] && interval="5"
|
||||||
|
|
||||||
# Approach 2: grep + cut extraction
|
# Validate
|
||||||
if [ -z "$enabled" ]; then
|
case "$enabled" in
|
||||||
enabled=$(echo "$post_data" | grep -o '"enabled":[^,}]*' | cut -d':' -f2 | tr -d ' ')
|
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
|
fi
|
||||||
|
|
||||||
# Approach 3: Look for true/false in the payload
|
# Capture previous values to decide on restart
|
||||||
if [ -z "$enabled" ]; then
|
get_config_values
|
||||||
if echo "$post_data" | grep -q '"enabled"[[:space:]]*:[[:space:]]*true'; then
|
local prev_enabled="$ENABLED"
|
||||||
enabled="true"
|
local prev_host="$HOST"
|
||||||
elif echo "$post_data" | grep -q '"enabled"[[:space:]]*:[[:space:]]*false'; then
|
local prev_interval="$INTERVAL"
|
||||||
enabled="false"
|
|
||||||
|
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
|
||||||
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
|
else
|
||||||
send_error "INVALID_SETTING" "Invalid setting provided. Must be 'true' or 'false'."
|
stop_daemon
|
||||||
fi
|
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
|
else
|
||||||
send_error "NO_DATA" "No data provided"
|
send_error "NO_DATA" "No data provided"
|
||||||
fi
|
fi
|
||||||
@@ -188,24 +301,15 @@ handle_post() {
|
|||||||
# Handle DELETE request - Reset to default (delete configuration)
|
# Handle DELETE request - Reset to default (delete configuration)
|
||||||
handle_delete() {
|
handle_delete() {
|
||||||
log_message "DELETE request received"
|
log_message "DELETE request received"
|
||||||
|
stop_daemon
|
||||||
if delete_ping_setting; then
|
if delete_ping_setting; then
|
||||||
# Default is enabled
|
# 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
|
else
|
||||||
send_error "NOT_FOUND" "Ping setting configuration not found"
|
send_error "NOT_FOUND" "Ping setting configuration not found"
|
||||||
fi
|
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
|
# Main execution
|
||||||
log_message "Ping settings script called with method: ${REQUEST_METHOD:-GET}"
|
log_message "Ping settings script called with method: ${REQUEST_METHOD:-GET}"
|
||||||
|
|
||||||
@@ -220,9 +324,6 @@ case "${REQUEST_METHOD:-GET}" in
|
|||||||
DELETE)
|
DELETE)
|
||||||
handle_delete
|
handle_delete
|
||||||
;;
|
;;
|
||||||
OPTIONS)
|
|
||||||
handle_options
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
send_error "METHOD_NOT_ALLOWED" "HTTP method ${REQUEST_METHOD} not supported"
|
send_error "METHOD_NOT_ALLOWED" "HTTP method ${REQUEST_METHOD} not supported"
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -607,6 +607,7 @@ apply_profile_settings() {
|
|||||||
local current_nsa_nr5g_bands="${14}"
|
local current_nsa_nr5g_bands="${14}"
|
||||||
local current_imei="${15}"
|
local current_imei="${15}"
|
||||||
local iccid="${16}"
|
local iccid="${16}"
|
||||||
|
local mobile_provider="${17}"
|
||||||
|
|
||||||
# Set TTL to 0 (disabled) if not specified
|
# Set TTL to 0 (disabled) if not specified
|
||||||
ttl="${ttl:-0}"
|
ttl="${ttl:-0}"
|
||||||
@@ -619,6 +620,7 @@ apply_profile_settings() {
|
|||||||
log_message "- APN: $apn ($pdp_type)" "info"
|
log_message "- APN: $apn ($pdp_type)" "info"
|
||||||
log_message "- IMEI: $imei" "info"
|
log_message "- IMEI: $imei" "info"
|
||||||
log_message "- TTL: $ttl" "info"
|
log_message "- TTL: $ttl" "info"
|
||||||
|
log_message "- Mobile Provider: $mobile_provider" "info"
|
||||||
|
|
||||||
# Check if any changes are needed using improved comparison
|
# Check if any changes are needed using improved comparison
|
||||||
local needs_apn_change=0
|
local needs_apn_change=0
|
||||||
@@ -630,6 +632,7 @@ apply_profile_settings() {
|
|||||||
local needs_ttl_change=0
|
local needs_ttl_change=0
|
||||||
local changes_needed=0
|
local changes_needed=0
|
||||||
local requires_reboot=0
|
local requires_reboot=0
|
||||||
|
local change_for_reboot=""
|
||||||
|
|
||||||
# Use normalized comparison
|
# Use normalized comparison
|
||||||
compare_values "$current_apn" "$apn" "apn" && needs_apn_change=1 && changes_needed=1
|
compare_values "$current_apn" "$apn" "apn" && needs_apn_change=1 && changes_needed=1
|
||||||
@@ -804,6 +807,7 @@ apply_profile_settings() {
|
|||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
changes_made=1
|
changes_made=1
|
||||||
requires_reboot=1
|
requires_reboot=1
|
||||||
|
change_for_reboot="IMEI"
|
||||||
log_message "IMEI changed successfully to $imei (device will reboot)" "info"
|
log_message "IMEI changed successfully to $imei (device will reboot)" "info"
|
||||||
update_track "rebooting" "IMEI changed, device will reboot" "$profile_name" "95"
|
update_track "rebooting" "IMEI changed, device will reboot" "$profile_name" "95"
|
||||||
else
|
else
|
||||||
@@ -813,9 +817,56 @@ apply_profile_settings() {
|
|||||||
fi
|
fi
|
||||||
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
|
||||||
release_token "$token_id"
|
release_token "$token_id"
|
||||||
|
|
||||||
# Mark profile as applied if changes were made
|
# Mark profile as applied if changes were made
|
||||||
if [ $changes_made -eq 1 ]; then
|
if [ $changes_made -eq 1 ]; then
|
||||||
mark_profile_applied "$iccid" "$profile_name"
|
mark_profile_applied "$iccid" "$profile_name"
|
||||||
@@ -824,7 +875,7 @@ apply_profile_settings() {
|
|||||||
# If IMEI was changed, need to reboot
|
# If IMEI was changed, need to reboot
|
||||||
if [ $requires_reboot -eq 1 ]; then
|
if [ $requires_reboot -eq 1 ]; then
|
||||||
log_message "IMEI change requires reboot, scheduling reboot..." "info"
|
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
|
sleep 2
|
||||||
reboot &
|
reboot &
|
||||||
return 0
|
return 0
|
||||||
@@ -913,6 +964,7 @@ check_profile() {
|
|||||||
local pdp_type=$(uci -q get quecprofiles.$profile_index.pdp_type)
|
local pdp_type=$(uci -q get quecprofiles.$profile_index.pdp_type)
|
||||||
local imei=$(uci -q get quecprofiles.$profile_index.imei)
|
local imei=$(uci -q get quecprofiles.$profile_index.imei)
|
||||||
local ttl=$(uci -q get quecprofiles.$profile_index.ttl)
|
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
|
# Check if profile is paused
|
||||||
local paused=$(uci -q get quecprofiles.$profile_index.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 with the new parameters
|
||||||
apply_profile_settings "$profile_name" "$network_type" "$lte_bands" "$sa_nr5g_bands" "$nsa_nr5g_bands" \
|
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" \
|
"$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 $?
|
return $?
|
||||||
else
|
else
|
||||||
log_message "Automatic profile switching is disabled, not applying profile" "info"
|
log_message "Automatic profile switching is disabled, not applying profile" "info"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,19 +1,19 @@
|
|||||||
1:"$Sreact.fragment"
|
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"]
|
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","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"]
|
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,[],""]
|
4:I[24900,[],""]
|
||||||
5:I[81570,[],""]
|
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"]
|
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"]
|
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"]
|
e:I[99165,[],"OutletBoundary"]
|
||||||
10:I[99165,[],"MetadataBoundary"]
|
10:I[99165,[],"MetadataBoundary"]
|
||||||
12:I[99165,[],"ViewportBoundary"]
|
12:I[99165,[],"ViewportBoundary"]
|
||||||
14:I[25339,[],""]
|
14:I[25339,[],""]
|
||||||
:HL["/_next/static/css/42cb6b63b4b8c16d.css","style"]
|
:HL["/_next/static/css/8b72a0de6df072c2.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}
|
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:{}
|
9:{}
|
||||||
c:{}
|
c:{}
|
||||||
d:{}
|
d:{}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,20 +1,20 @@
|
|||||||
1:"$Sreact.fragment"
|
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"]
|
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","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"]
|
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,[],""]
|
4:I[24900,[],""]
|
||||||
5:I[81570,[],""]
|
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"]
|
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[74627,["1318","static/chunks/1318-767d278b8ca60a2b.js","4277","static/chunks/app/dashboard/advanced-settings/layout-acf9549d02163872.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"]
|
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"]
|
10:I[99165,[],"OutletBoundary"]
|
||||||
12:I[99165,[],"MetadataBoundary"]
|
12:I[99165,[],"MetadataBoundary"]
|
||||||
14:I[99165,[],"ViewportBoundary"]
|
14:I[99165,[],"ViewportBoundary"]
|
||||||
16:I[25339,[],""]
|
16:I[25339,[],""]
|
||||||
:HL["/_next/static/css/42cb6b63b4b8c16d.css","style"]
|
:HL["/_next/static/css/8b72a0de6df072c2.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}
|
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:{}
|
9:{}
|
||||||
b:{}
|
b:{}
|
||||||
e:{}
|
e:{}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,20 +1,20 @@
|
|||||||
1:"$Sreact.fragment"
|
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"]
|
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","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"]
|
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,[],""]
|
4:I[24900,[],""]
|
||||||
5:I[81570,[],""]
|
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"]
|
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[74627,["1318","static/chunks/1318-767d278b8ca60a2b.js","4277","static/chunks/app/dashboard/advanced-settings/layout-acf9549d02163872.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"]
|
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"]
|
10:I[99165,[],"OutletBoundary"]
|
||||||
12:I[99165,[],"MetadataBoundary"]
|
12:I[99165,[],"MetadataBoundary"]
|
||||||
14:I[99165,[],"ViewportBoundary"]
|
14:I[99165,[],"ViewportBoundary"]
|
||||||
16:I[25339,[],""]
|
16:I[25339,[],""]
|
||||||
:HL["/_next/static/css/42cb6b63b4b8c16d.css","style"]
|
:HL["/_next/static/css/8b72a0de6df072c2.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}
|
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:{}
|
9:{}
|
||||||
b:{}
|
b:{}
|
||||||
e:{}
|
e:{}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user