Merge branch 'development-SDXPINN' into SDXPINN

This commit is contained in:
Cameron Thompson
2025-01-18 23:24:04 -05:00
133 changed files with 1577 additions and 863 deletions

View File

@@ -1 +0,0 @@
/etc/quecManager.conf

View File

@@ -1,7 +1,7 @@
Package: sdxpinn-quecmanager-beta
Version: 1.1.0-6
Version: 1.1.1
Architecture: aarch64_cortex-a53
Maintainer: Russel Yasol dr-dolomite@github.com Cameron Thompson iamromulan@github.com
Description: A custom web UI desgined to run alongside luci for Quectel RM55x modems
Depends: libc uhttpd sdxpinn-mount-fix atinout jq ookla-speedtest
Conflicts: sdxpinn-quecmanager
Depends: sdxpinn-mount-fix, libc, coreutils-timeout, uhttpd, sms-tool, jq, ookla-speedtest
Conflicts: sdxpinn-quecmanager

View File

@@ -39,6 +39,9 @@ for SCRIPT in $SCRIPTS; do
fi
done
service quecmanager-services stop
service quecmanager-services disable
echo "Cleanup complete."
exit 0

View File

@@ -1,23 +1,37 @@
#!/bin/sh /etc/rc.common
START=49
STOP=10
USE_PROCD=1
start_service() {
echo "Starting QuecManager services"
echo "Executed"
echo "Starting Signal Metrics Logger"
# Start Signal Metrics Logger
# Run clear_logs.sh once without procd management, with a timeout
echo "Clearing QuecManager Logs"
timeout 5 /www/cgi-bin/services/clear_logs.sh
if [ $? -eq 124 ]; then
echo "clear_logs.sh timed out after 5 seconds"
else
echo "Log Cleaner complete"
fi
# Start the continuously running services
echo "Starting AT Command Queue Processor..."
procd_open_instance
procd_set_param command /www/cgi-bin/services/log_signal_metrics.sh
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param command /www/cgi-bin/services/at_queue_processor.sh
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
echo "Signal Metrics Logger Running"
echo "All QuecManager services Running"
echo "AT Queue Processor Started"
echo "Starting Signal Metrics Logger..."
procd_open_instance
procd_set_param command /www/cgi-bin/services/log_signal_metrics.sh
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
echo "Signal Metrics Logger started"
echo "All QuecManager services Started"
}
stop_service() {

View File

@@ -1,4 +0,0 @@
AT_port = dev/smd11
AT_port_custom = dev/smd7
data_refresh_rate = 5000
# end of config (don't remove this line)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

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

View File

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

View File

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

View File

@@ -0,0 +1 @@
self.__BUILD_MANIFEST=function(r,e,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:20,errorRate:1e-4,numBits:384,numHashes:14,bitArray:[1,0,0,0,1,1,e,r,r,r,r,e,e,r,e,e,r,r,r,e,e,e,e,e,r,r,e,e,r,e,e,r,r,r,r,e,e,e,e,e,e,r,e,r,e,e,e,r,r,e,r,e,r,e,e,e,e,e,r,e,r,r,r,r,e,r,e,e,e,e,r,e,r,r,e,r,e,e,r,r,e,r,e,e,e,r,r,r,e,r,e,r,e,e,r,r,e,r,e,e,r,r,e,e,r,r,r,e,r,r,e,r,e,r,e,r,r,r,e,e,r,r,r,e,r,e,e,e,e,r,e,r,r,r,r,r,r,r,r,r,e,r,e,e,e,r,r,e,e,e,e,r,e,r,r,r,r,r,r,r,e,r,e,e,e,r,e,r,r,e,e,r,e,r,r,r,e,e,r,r,r,e,e,r,r,e,r,e,r,r,r,r,r,r,e,e,r,r,r,e,e,e,e,r,e,r,r,r,e,r,r,r,e,r,e,r,r,r,r,r,e,r,e,e,e,r,e,e,r,e,e,e,r,r,r,r,r,e,e,r,e,e,e,e,r,e,r,r,e,r,r,e,e,r,e,e,r,r,r,e,r,e,r,r,r,e,r,e,e,r,r,e,r,e,r,e,r,r,r,e,r,e,r,r,r,r,e,e,e,e,r,r,e,e,r,r,r,e,r,e,r,r,e,r,e,r,r,r,e,e,r,e,r,r,r,r,r,e,r,e,r,r,r,r,e,e,e,r,r,r,e,r,r,r,r,r,e,e,r,r,e,e,e,r,r,e,r,r,r,e,r,r,e,r,e,r,r,e,e,e,e,e,r,e,e,r,e,e,r,e,r,r,e,r,e,r,e,e,r,r,r,e,r,e]},__routerFilterDynamic:{numItems:e,errorRate:1e-4,numBits:e,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-f347b70a71a8047b.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

View File

@@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7040,9188],{44833:()=>{}},_=>{var e=e=>_(_.s=e);_.O(0,[191,6035,7358],()=>e(44833)),_N_E=_.O()}]);

View File

@@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3075],{43946:(e,a,s)=>{Promise.resolve().then(s.bind(s,31753))},31753:(e,a,s)=>{"use strict";s.r(a),s.d(a,{default:()=>d});var t=s(20475);s(20107);var r=s(16118),l=s(9477),n=s.n(l);let d=e=>{let{children:a}=e,s=(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/quecwatch",className:"".concat("/dashboard/experimental/quecwatch/"===s?"font-semibold text-primary":"text-sm"),children:"QuecWatch"}),(0,t.jsx)(n(),{href:"/dashboard/experimental/keep-alive",className:"".concat("/dashboard/experimental/keep-alive/"===s?"font-semibold text-primary":"text-sm"),children:"Keep Alive"})]}),a]})]})}},16118:(e,a,s)=>{"use strict";var t=s(65834);s.o(t,"usePathname")&&s.d(a,{usePathname:function(){return t.usePathname}}),s.o(t,"useRouter")&&s.d(a,{useRouter:function(){return t.useRouter}})}},e=>{var a=a=>e(e.s=a);e.O(0,[9477,191,6035,7358],()=>a(43946)),_N_E=e.O()}]);

View File

@@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7040,9188],{44833:()=>{}},_=>{var e=e=>_(_.s=e);_.O(0,[191,6035,7358],()=>e(44833)),_N_E=_.O()}]);

View File

@@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7040],{44833:()=>{}},_=>{var e=e=>_(_.s=e);_.O(0,[191,6035,7358],()=>e(44833)),_N_E=_.O()}]);

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5680],{78190:(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 r=t(20475);t(20107);var a=t(16118),n=t(9477),u=t.n(n);let d=e=>{let{children:s}=e,t=(0,a.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:"Settings"})}),(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.jsx)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:(0,r.jsx)(u(),{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 r=t(65834);t.o(r,"usePathname")&&t.d(s,{usePathname:function(){return r.usePathname}}),t.o(r,"useRouter")&&t.d(s,{useRouter:function(){return r.useRouter}})}},e=>{var s=s=>e(e.s=s);e.O(0,[9477,191,6035,7358],()=>s(78190)),_N_E=e.O()}]);

View File

@@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5680],{55809:(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 r=t(20475);t(20107);var a=t(16118),n=t(9477),u=t.n(n);let d=e=>{let{children:s}=e,t=(0,a.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:"Settings"})}),(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.jsx)("nav",{className:"grid gap-4 text-sm text-muted-foreground","x-chunk":"dashboard-04-chunk-0",children:(0,r.jsx)(u(),{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 r=t(65834);t.o(r,"usePathname")&&t.d(s,{usePathname:function(){return r.usePathname}}),t.o(r,"useRouter")&&t.d(s,{useRouter:function(){return r.useRouter}})}},e=>{var s=s=>e(e.s=s);e.O(0,[9477,191,6035,7358],()=>s(55809)),_N_E=e.O()}]);

View File

@@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5680],{55809:(e,s,t)=>{Promise.resolve().then(t.bind(t,36994))},36994:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>l});var a=t(20475);t(20107);var r=t(16118),n=t(9477),d=t.n(n);let l=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)(d(),{href:"/dashboard/settings/general",className:"".concat("/dashboard/settings/general/"===t?"font-semibold text-primary":"text-sm"),children:"General"}),(0,a.jsx)(d(),{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(55809)),_N_E=e.O()}]);

View File

@@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5680],{78190:(e,s,t)=>{Promise.resolve().then(t.bind(t,36994))},36994:(e,s,t)=>{"use strict";t.r(s),t.d(s,{default:()=>l});var a=t(20475);t(20107);var r=t(16118),n=t(9477),d=t.n(n);let l=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)(d(),{href:"/dashboard/settings/general",className:"".concat("/dashboard/settings/general/"===t?"font-semibold text-primary":"text-sm"),children:"General"}),(0,a.jsx)(d(),{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(78190)),_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

View File

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

View File

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

View File

@@ -0,0 +1,74 @@
#!/bin/sh
# CGI header
echo "Content-type: application/json"
echo ""
# Queue file
QUEUE_FILE="/tmp/at_pipe.txt"
RESULT_FILE="/tmp/at_results.json"
LOG_FILE="/var/log/at_commands.log"
# Create queue file if it doesn't exist
touch "${QUEUE_FILE}"
# Function to log messages
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "${LOG_FILE}"
}
# Function to generate random ID
generate_random_id() {
# Combine multiple sources of randomness
local timestamp=$(date +%s%N)
local random1=$(head -c 4 /dev/urandom | xxd -p)
local random2=$(echo $$ $RANDOM | md5sum | head -c 8)
echo "${timestamp}-${random1}-${random2}"
}
# Function to escape special characters for JSON
escape_json() {
echo "$1" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g'
}
# Function to decode URL
decode_url() {
local encoded="$1"
# First handle percent-encoded characters
printf '%b' "${encoded}" | sed -e 's/%\([0-9A-Fa-f][0-9A-Fa-f]\)/\\x\1/g' | xargs -0 echo -e |
# Then handle plus signs separately (preserve them for AT commands)
sed 's/[+]/%2B/g' | sed 's/%2B/+/g'
}
# Get command from query string
QUERY_STRING="${QUERY_STRING:-}"
RAW_COMMAND=$(echo "${QUERY_STRING}" | sed 's/^command=//')
if [ -n "${RAW_COMMAND}" ]; then
# Decode URL-encoded command with fixed plus sign handling
AT_COMMAND=$(decode_url "${RAW_COMMAND}")
# Generate unique random ID
CMD_ID=$(generate_random_id)
# Create timestamp
TIMESTAMP=$(date '+%H:%M:%S')
# Escape command for JSON
ESCAPED_COMMAND=$(escape_json "${AT_COMMAND}")
# Create JSON entry for queue (all in one line)
QUEUE_ENTRY=$(printf '{"id":"%s","timestamp":"%s","command":"%s","status":"pending"}\n' \
"${CMD_ID}" "${TIMESTAMP}" "${ESCAPED_COMMAND}")
# Add to queue file
echo "${QUEUE_ENTRY}" >> "${QUEUE_FILE}"
log_message "Queued command: ${AT_COMMAND} with ID: ${CMD_ID}"
# Return immediate response
printf '{"status":"queued","message":"Command has been queued","command":"%s","id":"%s","queued_at":"%s"}\n' \
"${ESCAPED_COMMAND}" "${CMD_ID}" "${TIMESTAMP}"
else
# Return error response
printf '{"status":"error","message":"No command provided","timestamp":"%s"}\n' "$(date '+%H:%M:%S')"
exit 1
fi

View File

@@ -0,0 +1,97 @@
#!/bin/sh
echo "Content-type: application/json"
echo "Access-Control-Allow-Origin: *"
echo "Access-Control-Allow-Methods: GET, POST, OPTIONS"
echo "Access-Control-Allow-Headers: Content-Type"
echo ""
# Configuration
RESULT_FILE="/tmp/at_results.json"
LOG_FILE="/var/log/at_commands.log"
# Function to log messages
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "${LOG_FILE}"
}
# Function to return error response
send_error() {
local message="$1"
jq -n \
--arg msg "${message}" \
--arg time "$(date '+%H:%M:%S')" \
'{
status: "error",
message: $msg,
timestamp: $time
}'
exit 1
}
# Parse query parameters
eval $(echo "${QUERY_STRING}" | tr '&' '\n' | sed 's/\([^=]*\)=\([^=]*\)/\1="\2"/')
# Check if results file exists
if [ ! -f "${RESULT_FILE}" ]; then
send_error "No results found"
fi
# Validate results file contains valid JSON
if ! cat "${RESULT_FILE}" | jq . >/dev/null 2>&1; then
log_message "Invalid JSON in results file"
send_error "Invalid results data"
fi
# Handle different query types
case "${action}" in
"get_by_id")
# Fetch specific result by ID
if [ -z "${id}" ]; then
send_error "No ID provided"
fi
result=$(cat "${RESULT_FILE}" | jq --arg id "${id}" '. | map(select(.id == $id)) | .[0]')
if [ "${result}" = "null" ]; then
send_error "No result found for ID: ${id}"
else
echo "${result}"
fi
;;
"get_latest")
# Fetch the most recent N results (default to 10)
limit=${limit:-10}
cat "${RESULT_FILE}" | jq --arg limit "${limit}" 'reverse | limit(($limit|tonumber); .)'
;;
"get_by_status")
# Fetch results by status
if [ -z "${status}" ]; then
send_error "No status provided"
fi
cat "${RESULT_FILE}" | jq --arg status "${status}" '. | map(select(.status == $status))'
;;
"clear")
# Clear all results (optional)
if [ "${confirm}" = "true" ]; then
echo "[]" > "${RESULT_FILE}"
jq -n \
--arg time "$(date '+%H:%M:%S')" \
'{
status: "success",
message: "Results cleared",
timestamp: $time
}'
else
send_error "Confirmation required to clear results"
fi
;;
*)
# Default: return all results
cat "${RESULT_FILE}"
;;
esac

View File

@@ -1,20 +1,23 @@
#!/bin/sh
# Parse POST data
# Parse POST data (using busybox compatible method)
read -r QUERY_STRING
# Function to urldecode
# Function to urldecode (busybox compatible version)
urldecode() {
echo -e "$(echo "$1" | sed 's/+/ /g;s/%\([0-9A-F][0-9A-F]\)/\\x\1/g')"
local value="$1"
value="${value//+/ }"
value="${value//%/\\x}"
printf '%b' "$value"
}
# Extract values from POST data
iccidProfile1=$(echo "$QUERY_STRING" | grep -o 'iccidProfile1=[^&]*' | cut -d= -f2)
apnProfile1=$(echo "$QUERY_STRING" | grep -o 'apnProfile1=[^&]*' | cut -d= -f2)
pdpType1=$(echo "$QUERY_STRING" | grep -o 'pdpType1=[^&]*' | cut -d= -f2)
iccidProfile2=$(echo "$QUERY_STRING" | grep -o 'iccidProfile2=[^&]*' | cut -d= -f2)
apnProfile2=$(echo "$QUERY_STRING" | grep -o 'apnProfile2=[^&]*' | cut -d= -f2)
pdpType2=$(echo "$QUERY_STRING" | grep -o 'pdpType2=[^&]*' | cut -d= -f2)
iccidProfile1=$(echo "$QUERY_STRING" | sed -n 's/.*iccidProfile1=\([^&]*\).*/\1/p' | tr -d "'")
apnProfile1=$(echo "$QUERY_STRING" | sed -n 's/.*apnProfile1=\([^&]*\).*/\1/p' | tr -d "'")
pdpType1=$(echo "$QUERY_STRING" | sed -n 's/.*pdpType1=\([^&]*\).*/\1/p' | tr -d "'")
iccidProfile2=$(echo "$QUERY_STRING" | sed -n 's/.*iccidProfile2=\([^&]*\).*/\1/p' | tr -d "'")
apnProfile2=$(echo "$QUERY_STRING" | sed -n 's/.*apnProfile2=\([^&]*\).*/\1/p' | tr -d "'")
pdpType2=$(echo "$QUERY_STRING" | sed -n 's/.*pdpType2=\([^&]*\).*/\1/p' | tr -d "'")
# URL decode the values
iccidProfile1=$(urldecode "$iccidProfile1")
@@ -33,141 +36,230 @@ if [ -z "$iccidProfile1" ] || [ -z "$apnProfile1" ] || [ -z "$pdpType1" ]; then
exit 1
fi
if [ ! -d /etc/quecmanager/apn_profile ]; then
mkdir -p /etc/quecmanager/apn_profile
fi
# Create directory with proper permissions
mkdir -p /etc/quecmanager/apn_profile
chmod 755 /etc/quecmanager/apn_profile
# Create a configuration file to store APN profiles (as plain text)
cat > /etc/quecmanager/apn_profile/apn_config.txt << EOF
iccidProfile1=$iccidProfile1
apnProfile1=$apnProfile1
pdpType1=$pdpType1
# Create a configuration file to store APN profiles (with proper permissions)
cat > /etc/quecmanager/apn_profile/apn_config.txt <<EOF
iccidProfile1=${iccidProfile1}
apnProfile1=${apnProfile1}
pdpType1=${pdpType1}
EOF
# Add second profile only if ICCID is provided
if [ -n "$iccidProfile2" ]; then
cat >> /etc/quecmanager/apn_profile/apn_config.txt << EOF
iccidProfile2=$iccidProfile2
apnProfile2=$apnProfile2
pdpType2=$pdpType2
cat >> /etc/quecmanager/apn_profile/apn_config.txt <<EOF
iccidProfile2=${iccidProfile2}
apnProfile2=${apnProfile2}
pdpType2=${pdpType2}
EOF
fi
chmod 644 /etc/quecmanager/apn_profile/apn_config.txt
# Create the apnProfiles.sh script
cat > /etc/quecmanager/apn_profile/apnProfiles.sh << 'EOF'
# Create the apnProfiles.sh script with proper locking mechanism and logging
cat > /etc/quecmanager/apn_profile/apnProfiles.sh <<'EOF'
#!/bin/sh
# Function to read config values
get_config_value() {
local key=$1
grep "^${key}=" /etc/quecmanager/apn_profile/apn_config.txt | cut -d'=' -f2
# Define file paths
QUEUE_FILE="/tmp/at_pipe.txt"
LOG_FILE="/tmp/apn_profiles.log"
[ ! -f "${QUEUE_FILE}" ] && touch "${QUEUE_FILE}"
# Enhanced logging function with debug level
log_message() {
local level="$1"
local message="$2"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "${timestamp} - [${level}] ${message}" >> "$LOG_FILE"
logger -t apn_profiles "${level}: ${message}"
}
# Read configuration
iccidProfile1=$(get_config_value "iccidProfile1")
apnProfile1=$(get_config_value "apnProfile1")
pdpType1=$(get_config_value "pdpType1")
iccidProfile2=$(get_config_value "iccidProfile2")
apnProfile2=$(get_config_value "apnProfile2")
pdpType2=$(get_config_value "pdpType2")
# Check for stale entries and clean them
check_and_clean_stale() {
local command_type="$1"
local wait_count=0
while [ $wait_count -lt 6 ]; do
if grep -q "\"command\":\"${command_type}\"" "$QUEUE_FILE"; then
log_message "DEBUG" "Waiting for ${command_type} to clear (attempt ${wait_count})"
sleep 1
wait_count=$((wait_count + 1))
else
return 0
fi
done
log_message "WARN" "Removing stale ${command_type} entry after ${wait_count}s"
sed -i "/\"command\":\"${command_type}\"/d" "$QUEUE_FILE"
return 0
}
# Debug logging
DEBUG_LOG="/tmp/debug.log"
echo "Starting script at $(date)" > "$DEBUG_LOG"
# Simplified lock handling with debug
handle_lock() {
log_message "DEBUG" "Checking queue file status before lock"
if [ -f "$QUEUE_FILE" ]; then
log_message "DEBUG" "Current queue content: $(cat $QUEUE_FILE)"
else
log_message "DEBUG" "Queue file does not exist, creating it"
touch "$QUEUE_FILE"
fi
check_and_clean_stale "FETCH_LOCK"
log_message "DEBUG" "Adding AT_COMMAND entry to queue"
printf '{"command":"AT_COMMAND","pid":"%s","timestamp":"%s"}\n' \
"$$" \
"$(date '+%H:%M:%S')" >> "$QUEUE_FILE"
check_and_clean_stale "AT_COMMAND"
}
CONFIG_FILE="/etc/quecManager.conf"
# Check config file
if [ ! -f "$CONFIG_FILE" ]; then
echo "Config file not found: $CONFIG_FILE" >> "$DEBUG_LOG"
echo '{"error": "Config file not found"}'
exit 1
fi
# Execute AT command without timeout dependency
execute_at_command() {
local command="$1"
local result=""
log_message "DEBUG" "Executing AT command: ${command}"
handle_lock
# Execute command and capture all output
result=$(sms_tool at "$command" -t 4 2>&1)
local status=$?
log_message "DEBUG" "Removing our entry from queue"
sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE"
if [ $status -ne 0 ]; then
log_message "ERROR" "Command failed with status $status: $command"
log_message "ERROR" "Command output: $result"
return 1
fi
log_message "DEBUG" "Command successful. Output: $result"
echo "$result"
return 0
}
# Get AT_PORT with debug logging
AT_PORT=$(head -n 1 "$CONFIG_FILE" | cut -d'=' -f2 | tr -d ' \n\r' | sed 's|^dev/||')
echo "Raw config line: $(head -n 1 "$CONFIG_FILE")" >> "$DEBUG_LOG"
echo "Extracted AT_PORT: '$AT_PORT'" >> "$DEBUG_LOG"
# List available devices for debugging
ls -l /dev/smd* >> "$DEBUG_LOG" 2>&1
if [ -z "$AT_PORT" ]; then
echo "AT_PORT is empty" >> "$DEBUG_LOG"
echo '{"error": "Failed to read AT_PORT from config"}'
exit 1
fi
# Check if AT_PORT exists
if [ ! -c "/dev/$AT_PORT" ]; then
echo "AT_PORT device not found: /dev/$AT_PORT" >> "$DEBUG_LOG"
echo "Available smd devices:" >> "$DEBUG_LOG"
ls -l /dev/smd* >> "$DEBUG_LOG" 2>&1
echo '{"error": "AT_PORT device not found"}'
exit 1
fi
# Function to get current ICCID
# Get current ICCID with enhanced debug
get_current_iccid() {
local input_file="/tmp/inputICCID.txt"
local output_file="/tmp/outputICCID.txt"
local result
local retry_count=0
local max_retries=3
echo "AT+ICCID" > "$input_file"
atinout "$input_file" "/dev/$AT_PORT" "$output_file"
log_message "INFO" "Attempting to get current ICCID"
iccid=$(cat "$output_file" | grep "+ICCID:" | cut -d' ' -f2)
while [ $retry_count -lt $max_retries ]; do
log_message "DEBUG" "ICCID attempt ${retry_count}"
result=$(execute_at_command "AT+ICCID")
local cmd_status=$?
log_message "DEBUG" "AT+ICCID command returned status: ${cmd_status}"
log_message "DEBUG" "AT+ICCID raw output: ${result}"
if [ $cmd_status -eq 0 ] && echo "$result" | grep -q "+ICCID:"; then
local iccid=$(echo "$result" | grep "+ICCID:" | cut -d' ' -f2 | tr -d '[:space:]')
log_message "INFO" "Retrieved current ICCID: ${iccid}"
echo "${iccid}"
return 0
else
log_message "WARN" "Attempt ${retry_count} failed to get valid ICCID"
log_message "WARN" "Result: ${result}"
fi
retry_count=$((retry_count + 1))
if [ $retry_count -lt $max_retries ]; then
log_message "INFO" "Waiting 2 seconds before retry"
sleep 2
fi
done
rm -f "$input_file" "$output_file"
echo "$iccid"
log_message "ERROR" "Failed to get ICCID after $max_retries attempts"
return 1
}
# Function to set APN
# Set APN with modified error handling - removed strict OK check
set_apn() {
local pdp_type="$1"
local apn="$2"
local input_file="/tmp/inputAPN.txt"
local output_file="/tmp/outputAPN.txt"
local result
local retry_count=0
local max_retries=3
echo "AT+CGDCONT=1,\"$pdp_type\",\"$apn\";+COPS=2;+COPS=0" > "$input_file"
atinout "$input_file" "/dev/$AT_PORT" "$output_file"
local result=$(cat "$output_file")
rm -f "$input_file" "$output_file"
if echo "$result" | grep -q "OK"; then
return 0
else
if [ -z "$pdp_type" ] || [ -z "$apn" ]; then
log_message "ERROR" "Invalid PDP type or APN"
return 1
fi
while [ $retry_count -lt $max_retries ]; do
result=$(execute_at_command "AT+CGDCONT=1,\"$pdp_type\",\"$apn\";+COPS=2;+COPS=0")
if [ $? -eq 0 ]; then
log_message "INFO" "Successfully set APN: $apn with PDP type: $pdp_type"
return 0
fi
retry_count=$((retry_count + 1))
[ $retry_count -lt $max_retries ] && sleep 2
done
log_message "ERROR" "Failed to set APN: $apn after $max_retries attempts"
return 1
}
# Get current ICCID
current_iccid=$(get_current_iccid)
success=false
# Check ICCID against profile 1 (required)
if [ "$current_iccid" = "$iccidProfile1" ]; then
if set_apn "$pdpType1" "$apnProfile1"; then
success=true
fi
# Check ICCID against profile 2 (optional)
elif [ -n "$iccidProfile2" ] && [ "$current_iccid" = "$iccidProfile2" ]; then
if set_apn "$pdpType2" "$apnProfile2"; then
success=true
fi
# Load configuration
if [ -f /etc/quecmanager/apn_profile/apn_config.txt ]; then
. /etc/quecmanager/apn_profile/apn_config.txt
log_message "INFO" "Loaded configuration - Profile1 ICCID: ${iccidProfile1}, Profile2 ICCID: ${iccidProfile2:-none}"
else
log_message "ERROR" "Configuration file not found"
echo "Configuration file not found" > /tmp/apn_result.txt
exit 1
fi
if [ "$success" = "true" ]; then
echo "APN set successfully" > /tmp/apn_result.txt
# Get current ICCID and trim any whitespace
current_iccid=$(get_current_iccid | tr -d '[:space:]')
if [ $? -ne 0 ]; then
log_message "ERROR" "Failed to get current ICCID"
echo "Failed to get current ICCID" > /tmp/apn_result.txt
exit 1
fi
# Trim any whitespace from profile ICCIDs
iccidProfile1=$(echo "${iccidProfile1}" | tr -d '[:space:]')
[ -n "$iccidProfile2" ] && iccidProfile2=$(echo "${iccidProfile2}" | tr -d '[:space:]')
# Log the comparison values
log_message "INFO" "Comparing ICCIDs:"
log_message "INFO" "Current ICCID: ${current_iccid}"
log_message "INFO" "Profile1 ICCID: ${iccidProfile1}"
[ -n "$iccidProfile2" ] && log_message "INFO" "Profile2 ICCID: ${iccidProfile2}"
# Match ICCID and apply corresponding profile
if [ "${current_iccid}" = "${iccidProfile1}" ]; then
log_message "INFO" "Matched with Profile1, applying settings..."
if set_apn "$pdpType1" "$apnProfile1"; then
echo "APN set successfully" > /tmp/apn_result.txt
else
echo "Failed to set APN" > /tmp/apn_result.txt
fi
elif [ -n "$iccidProfile2" ] && [ "${current_iccid}" = "${iccidProfile2}" ]; then
log_message "INFO" "Matched with Profile2, applying settings..."
if set_apn "$pdpType2" "$apnProfile2"; then
echo "APN set successfully" > /tmp/apn_result.txt
else
echo "Failed to set APN" > /tmp/apn_result.txt
fi
else
echo "Failed to set APN" > /tmp/apn_result.txt
log_message "WARN" "No matching ICCID profile found"
echo "No matching ICCID profile found" > /tmp/apn_result.txt
fi
EOF
# Make the script executable
chmod +x /etc/quecmanager/apn_profile/apnProfiles.sh
chmod 755 /etc/quecmanager/apn_profile/apnProfiles.sh
# Add to rc.local if not already present
if ! grep -q "/etc/quecmanager/apn_profile/apnProfiles.sh" /etc/rc.local; then
if ! grep -q "^[^#]*\/etc\/quecmanager\/apn_profile\/apnProfiles.sh" /etc/rc.local; then
sed -i '/^exit 0/i /etc/quecmanager/apn_profile/apnProfiles.sh' /etc/rc.local
fi
@@ -178,12 +270,23 @@ fi
if [ -f /tmp/apn_result.txt ]; then
result=$(cat /tmp/apn_result.txt)
rm -f /tmp/apn_result.txt
if [ "$result" = "APN set successfully" ]; then
echo '{"status": "success", "message": "APN profiles saved and applied successfully"}'
else
echo '{"status": "error", "message": "APN profiles saved but failed to apply"}'
fi
case "$result" in
"APN set successfully")
echo '{"status": "success", "message": "APN profiles saved and applied successfully"}'
;;
"No matching ICCID profile found")
echo '{"status": "warning", "message": "APN profiles saved but no matching ICCID found"}'
;;
"Configuration file not found")
echo '{"status": "error", "message": "Configuration file not found"}'
;;
"Failed to get current ICCID")
echo '{"status": "error", "message": "Failed to get current ICCID"}'
;;
*)
echo '{"status": "error", "message": "APN profiles saved but failed to apply"}'
;;
esac
else
echo '{"status": "error", "message": "Something went wrong while processing APN profiles"}'
fi

View File

@@ -1,38 +0,0 @@
#!/bin/sh
# handle_sms.sh - CGI script to handle SMS web requests
# Content type declaration for CGI
echo "Content-type: application/json"
echo ""
# Check if atinout and jq are installed
if ! command -v atinout &> /dev/null || ! command -v jq &> /dev/null; then
echo '{"error": "Required tools (atinout or jq) are not installed"}'
exit 1
fi
# Check if the device exists
if [ ! -c "/dev/smd7" ]; then
echo '{"error": "Device /dev/smd7 not found"}'
exit 1
fi
# # Fetch all SMS messages and update the JSON file
# Disabled until the atinout bug is fixed
# if ! echo "AT+CMGL=\"ALL\"" | atinout - /dev/smd7 - | jq -R -s '
# split("\n") |
# map(select(length > 0)) |
# map(
# select(startswith("+CMGL:") or (. != "OK" and . != "ERROR"))
# ) |
# {messages: .}
# ' > /tmp/sms_inbox.json; then
# echo '{"error": "Failed to fetch SMS messages"}'
# exit 1
# fi
# Return the contents of the JSON file
if [ -f "/tmp/sms_inbox.json" ]; then
cat /tmp/sms_inbox.json
else
echo '{"error": "SMS inbox file not found"}'
fi

View File

@@ -1,18 +1,21 @@
#!/bin/sh
# Parse POST data
# Parse POST data (using busybox compatible method)
read -r QUERY_STRING
# Function to urldecode
# Function to urldecode (busybox compatible version)
urldecode() {
echo -e "$(echo "$1" | sed 's/+/ /g;s/%\([0-9A-F][0-9A-F]\)/\\x\1/g')"
local value="$1"
value="${value//+/ }"
value="${value//%/\\x}"
printf '%b' "$value"
}
# Extract values from POST data
iccidProfile1=$(echo "$QUERY_STRING" | grep -o 'iccidProfile1=[^&]*' | cut -d= -f2)
imeiProfile1=$(echo "$QUERY_STRING" | grep -o 'imeiProfile1=[^&]*' | cut -d= -f2)
iccidProfile2=$(echo "$QUERY_STRING" | grep -o 'iccidProfile2=[^&]*' | cut -d= -f2)
imeiProfile2=$(echo "$QUERY_STRING" | grep -o 'imeiProfile2=[^&]*' | cut -d= -f2)
iccidProfile1=$(echo "$QUERY_STRING" | sed -n 's/.*iccidProfile1=\([^&]*\).*/\1/p' | tr -d "'")
imeiProfile1=$(echo "$QUERY_STRING" | sed -n 's/.*imeiProfile1=\([^&]*\).*/\1/p' | tr -d "'")
iccidProfile2=$(echo "$QUERY_STRING" | sed -n 's/.*iccidProfile2=\([^&]*\).*/\1/p' | tr -d "'")
imeiProfile2=$(echo "$QUERY_STRING" | sed -n 's/.*imeiProfile2=\([^&]*\).*/\1/p' | tr -d "'")
# URL decode the values
iccidProfile1=$(urldecode "$iccidProfile1")
@@ -29,165 +32,271 @@ if [ -z "$iccidProfile1" ] || [ -z "$imeiProfile1" ]; then
exit 1
fi
# Check the directory if it exists, if not create it
if [ ! -d /etc/quecmanager/imei_profile ]; then
mkdir -p /etc/quecmanager/imei_profile
fi
# Create directory with proper permissions
mkdir -p /etc/quecmanager/imei_profile
chmod 755 /etc/quecmanager/imei_profile
# Create a configuration file to store IMEI profiles
cat >/etc/quecmanager/imei_profile/imei_config.txt <<EOF
iccidProfile1=$iccidProfile1
imeiProfile1=$imeiProfile1
cat > /etc/quecmanager/imei_profile/imei_config.txt <<EOF
iccidProfile1=${iccidProfile1}
imeiProfile1=${imeiProfile1}
EOF
# Add second profile only if ICCID is provided
if [ -n "$iccidProfile2" ]; then
cat >>/etc/quecmanager/imei_profile/imei_config.txt <<EOF
iccidProfile2=$iccidProfile2
imeiProfile2=$imeiProfile2
cat >> /etc/quecmanager/imei_profile/imei_config.txt <<EOF
iccidProfile2=${iccidProfile2}
imeiProfile2=${imeiProfile2}
EOF
fi
chmod 644 /etc/quecmanager/imei_profile/imei_config.txt
# Create the imeiProfiles.sh script
cat >/etc/quecmanager/imei_profile/imeiProfiles.sh <<'EOF'
# Create the imeiProfiles.sh script with proper locking mechanism and logging
cat > /etc/quecmanager/imei_profile/imeiProfiles.sh <<'EOF'
#!/bin/sh
# Function to read config values
get_config_value() {
local key=$1
grep "^${key}=" /etc/quecmanager/imei_profile/imei_config.txt | cut -d'=' -f2
# Define file paths
QUEUE_FILE="/tmp/at_pipe.txt"
LOG_FILE="/tmp/imei_profiles.log"
[ ! -f "${QUEUE_FILE}" ] && touch "${QUEUE_FILE}"
# Enhanced logging function with debug level
log_message() {
local level="$1"
local message="$2"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "${timestamp} - [${level}] ${message}" >> "$LOG_FILE"
logger -t imei_profiles "${level}: ${message}"
}
# Read configuration
iccidProfile1=$(get_config_value "iccidProfile1")
imeiProfile1=$(get_config_value "imeiProfile1")
iccidProfile2=$(get_config_value "iccidProfile2")
imeiProfile2=$(get_config_value "imeiProfile2")
# Debug logging
DEBUG_LOG="/tmp/debug.log"
echo "Starting IMEI profile script at $(date)" > "$DEBUG_LOG"
CONFIG_FILE="/etc/quecManager.conf"
# Check config file
if [ ! -f "$CONFIG_FILE" ]; then
echo "Config file not found: $CONFIG_FILE" >> "$DEBUG_LOG"
echo '{"error": "Config file not found"}'
exit 1
fi
# Get AT_PORT with debug logging
AT_PORT=$(head -n 1 "$CONFIG_FILE" | cut -d'=' -f2 | tr -d ' \n\r' | sed 's|^dev/||')
echo "Raw config line: $(head -n 1 "$CONFIG_FILE")" >> "$DEBUG_LOG"
echo "Extracted AT_PORT: '$AT_PORT'" >> "$DEBUG_LOG"
if [ -z "$AT_PORT" ]; then
echo "AT_PORT is empty" >> "$DEBUG_LOG"
echo '{"error": "Failed to read AT_PORT from config"}'
exit 1
fi
# Check if AT_PORT exists
if [ ! -c "/dev/$AT_PORT" ]; then
echo "AT_PORT device not found: /dev/$AT_PORT" >> "$DEBUG_LOG"
echo '{"error": "AT_PORT device not found"}'
exit 1
fi
# Function to get current ICCID
get_current_iccid() {
local input_file="/tmp/inputICCID.txt"
local output_file="/tmp/outputICCID.txt"
# Check for stale entries and clean them
check_and_clean_stale() {
local command_type="$1"
local wait_count=0
echo "AT+ICCID" > "$input_file"
atinout "$input_file" "/dev/$AT_PORT" "$output_file"
while [ $wait_count -lt 6 ]; do
if grep -q "\"command\":\"${command_type}\"" "$QUEUE_FILE"; then
log_message "DEBUG" "Waiting for ${command_type} to clear (attempt ${wait_count})"
sleep 1
wait_count=$((wait_count + 1))
else
return 0
fi
done
iccid=$(cat "$output_file" | grep "+ICCID:" | cut -d' ' -f2)
rm -f "$input_file" "$output_file"
echo "$iccid"
log_message "WARN" "Removing stale ${command_type} entry after ${wait_count}s"
sed -i "/\"command\":\"${command_type}\"/d" "$QUEUE_FILE"
return 0
}
# Function to get current IMEI
get_current_imei() {
local input_file="/tmp/inputCGSN.txt"
local output_file="/tmp/outputCGSN.txt"
echo "AT+CGSN" > "$input_file"
atinout "$input_file" "/dev/$AT_PORT" "$output_file"
# Extract IMEI from the response, removing any whitespace or newlines
imei=$(cat "$output_file" | grep -v "AT+CGSN" | grep -v "OK" | tr -d '\r\n[:space:]')
rm -f "$input_file" "$output_file"
echo "$imei"
}
# Function to set IMEI
set_imei() {
local imei="$1"
local input_file="/tmp/inputIMEI.txt"
local output_file="/tmp/outputIMEI.txt"
echo "AT+EGMR=1,7,\"$imei\";+QPOWD=1" > "$input_file"
atinout "$input_file" "/dev/$AT_PORT" "$output_file"
local result=$(cat "$output_file")
rm -f "$input_file" "$output_file"
if echo "$result" | grep -q "OK"; then
return 0
# Simplified lock handling with debug
handle_lock() {
log_message "DEBUG" "Checking queue file status before lock"
if [ -f "$QUEUE_FILE" ]; then
log_message "DEBUG" "Current queue content: $(cat $QUEUE_FILE)"
else
log_message "DEBUG" "Queue file does not exist, creating it"
touch "$QUEUE_FILE"
fi
check_and_clean_stale "FETCH_LOCK"
log_message "DEBUG" "Adding AT_COMMAND entry to queue"
printf '{"command":"AT_COMMAND","pid":"%s","timestamp":"%s"}\n' \
"$$" \
"$(date '+%H:%M:%S')" >> "$QUEUE_FILE"
check_and_clean_stale "AT_COMMAND"
}
# Execute AT command without timeout dependency
execute_at_command() {
local command="$1"
local result=""
log_message "DEBUG" "Executing AT command: ${command}"
handle_lock
# Execute command and capture all output
result=$(sms_tool at "$command" -t 4 2>&1)
local status=$?
log_message "DEBUG" "Removing our entry from queue"
sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE"
if [ $status -ne 0 ]; then
log_message "ERROR" "Command failed with status $status: $command"
log_message "ERROR" "Command output: $result"
return 1
fi
log_message "DEBUG" "Command successful. Output: $result"
echo "$result"
return 0
}
# Get current ICCID with enhanced debug
get_current_iccid() {
local result
local retry_count=0
local max_retries=3
log_message "INFO" "Attempting to get current ICCID"
while [ $retry_count -lt $max_retries ]; do
log_message "DEBUG" "ICCID attempt ${retry_count}"
result=$(execute_at_command "AT+ICCID")
local cmd_status=$?
log_message "DEBUG" "AT+ICCID command returned status: ${cmd_status}"
log_message "DEBUG" "AT+ICCID raw output: ${result}"
if [ $cmd_status -eq 0 ] && echo "$result" | grep -q "+ICCID:"; then
local iccid=$(echo "$result" | grep "+ICCID:" | cut -d' ' -f2 | tr -d '[:space:]')
log_message "INFO" "Retrieved current ICCID: ${iccid}"
echo "${iccid}"
return 0
else
log_message "WARN" "Attempt ${retry_count} failed to get valid ICCID"
log_message "WARN" "Result: ${result}"
fi
retry_count=$((retry_count + 1))
if [ $retry_count -lt $max_retries ]; then
log_message "INFO" "Waiting 2 seconds before retry"
sleep 2
fi
done
log_message "ERROR" "Failed to get ICCID after $max_retries attempts"
return 1
}
# Get current IMEI with enhanced debug
get_current_imei() {
local result
local retry_count=0
local max_retries=3
log_message "INFO" "Attempting to get current IMEI"
while [ $retry_count -lt $max_retries ]; do
log_message "DEBUG" "IMEI attempt ${retry_count}"
result=$(execute_at_command "AT+CGSN")
local cmd_status=$?
log_message "DEBUG" "AT+CGSN command returned status: ${cmd_status}"
log_message "DEBUG" "AT+CGSN raw output: ${result}"
if [ $cmd_status -eq 0 ]; then
local imei=$(echo "$result" | grep -v "AT+CGSN" | grep -v "OK" | tr -d '\r\n[:space:]')
if [ -n "$imei" ]; then
log_message "INFO" "Retrieved current IMEI: ${imei}"
echo "${imei}"
return 0
fi
fi
log_message "WARN" "Attempt ${retry_count} failed to get valid IMEI"
retry_count=$((retry_count + 1))
[ $retry_count -lt $max_retries ] && sleep 2
done
log_message "ERROR" "Failed to get IMEI after $max_retries attempts"
return 1
}
# Set IMEI with enhanced debug
set_imei() {
local imei="$1"
local retry_count=0
local max_retries=3
log_message "INFO" "Attempting to set IMEI: ${imei}"
while [ $retry_count -lt $max_retries ]; do
log_message "DEBUG" "IMEI set attempt ${retry_count}"
result=$(execute_at_command "AT+EGMR=1,7,\"$imei\";+QPOWD=1")
local cmd_status=$?
log_message "DEBUG" "AT+EGMR command returned status: ${cmd_status}"
log_message "DEBUG" "AT+EGMR raw output: ${result}"
if [ $cmd_status -eq 0 ] && echo "$result" | grep -q "OK"; then
log_message "INFO" "Successfully set IMEI: ${imei}"
return 0
fi
retry_count=$((retry_count + 1))
[ $retry_count -lt $max_retries ] && sleep 2
done
log_message "ERROR" "Failed to set IMEI after $max_retries attempts"
return 1
}
# Load configuration
if [ -f /etc/quecmanager/imei_profile/imei_config.txt ]; then
. /etc/quecmanager/imei_profile/imei_config.txt
log_message "INFO" "Loaded configuration - Profile1 ICCID: ${iccidProfile1}, IMEI: ${imeiProfile1}"
[ -n "$iccidProfile2" ] && log_message "INFO" "Profile2 ICCID: ${iccidProfile2}, IMEI: ${imeiProfile2}"
else
log_message "ERROR" "Configuration file not found"
echo "Configuration file not found" > /tmp/imei_result.txt
exit 1
fi
# Get current ICCID and IMEI
current_iccid=$(get_current_iccid)
current_imei=$(get_current_imei)
success=false
echo "Current ICCID: $current_iccid" >> "$DEBUG_LOG"
echo "Current IMEI: $current_imei" >> "$DEBUG_LOG"
echo "Profile 1 - ICCID: $iccidProfile1, IMEI: $imeiProfile1" >> "$DEBUG_LOG"
echo "Profile 2 - ICCID: $iccidProfile2, IMEI: $imeiProfile2" >> "$DEBUG_LOG"
# Check ICCID against profile 1 (required)
if [ "$current_iccid" = "$iccidProfile1" ]; then
if [ "$current_imei" != "$imeiProfile1" ]; then
echo "ICCID matches profile 1, but IMEI needs updating" >> "$DEBUG_LOG"
if set_imei "$imeiProfile1"; then
success=true
fi
else
echo "ICCID and IMEI already match profile 1, no action needed" >> "$DEBUG_LOG"
success=true
fi
# Check ICCID against profile 2 (optional)
elif [ -n "$iccidProfile2" ] && [ "$current_iccid" = "$iccidProfile2" ]; then
if [ "$current_imei" != "$imeiProfile2" ]; then
echo "ICCID matches profile 2, but IMEI needs updating" >> "$DEBUG_LOG"
if set_imei "$imeiProfile2"; then
success=true
fi
else
echo "ICCID and IMEI already match profile 2, no action needed" >> "$DEBUG_LOG"
success=true
fi
if [ $? -ne 0 ]; then
log_message "ERROR" "Failed to get current ICCID or IMEI"
echo "Failed to get current ICCID or IMEI" > /tmp/imei_result.txt
exit 1
fi
if [ "$success" = "true" ]; then
echo "IMEI check/update completed successfully" > /tmp/imei_result.txt
log_message "INFO" "Current ICCID: ${current_iccid}"
log_message "INFO" "Current IMEI: ${current_imei}"
# Match ICCID and apply corresponding profile
if [ "${current_iccid}" = "${iccidProfile1}" ]; then
log_message "INFO" "Matched with Profile1"
if [ "${current_imei}" != "${imeiProfile1}" ]; then
log_message "INFO" "IMEI needs updating for Profile1"
if set_imei "${imeiProfile1}"; then
echo "IMEI set successfully" > /tmp/imei_result.txt
else
echo "Failed to set IMEI" > /tmp/imei_result.txt
fi
else
log_message "INFO" "IMEI already matches Profile1"
echo "IMEI already correct" > /tmp/imei_result.txt
fi
elif [ -n "${iccidProfile2}" ] && [ "${current_iccid}" = "${iccidProfile2}" ]; then
log_message "INFO" "Matched with Profile2"
if [ "${current_imei}" != "${imeiProfile2}" ]; then
log_message "INFO" "IMEI needs updating for Profile2"
if set_imei "${imeiProfile2}"; then
echo "IMEI set successfully" > /tmp/imei_result.txt
else
echo "Failed to set IMEI" > /tmp/imei_result.txt
fi
else
log_message "INFO" "IMEI already matches Profile2"
echo "IMEI already correct" > /tmp/imei_result.txt
fi
else
echo "Failed to check/update IMEI" > /tmp/imei_result.txt
log_message "WARN" "No matching ICCID profile found"
echo "No matching ICCID profile found" > /tmp/imei_result.txt
fi
EOF
# Make the script executable
chmod +x /etc/quecmanager/imei_profile/imeiProfiles.sh
chmod 755 /etc/quecmanager/imei_profile/imeiProfiles.sh
# Add to rc.local if not already present
if ! grep -q "/etc/quecmanager/imei_profile/imeiProfiles.sh" /etc/rc.local; then
if ! grep -q "^[^#]*\/etc\/quecmanager\/imei_profile\/imeiProfiles.sh" /etc/rc.local; then
sed -i '/^exit 0/i /etc/quecmanager/imei_profile/imeiProfiles.sh' /etc/rc.local
fi
@@ -199,11 +308,26 @@ if [ -f /tmp/imei_result.txt ]; then
result=$(cat /tmp/imei_result.txt)
rm -f /tmp/imei_result.txt
if [ "$result" = "IMEI set successfully" ]; then
echo '{"status": "success", "message": "IMEI profiles saved and applied successfully"}'
else
echo '{"status": "error", "message": "IMEI profiles saved but failed to apply"}'
fi
case "$result" in
"IMEI set successfully")
echo '{"status": "success", "message": "IMEI profiles saved and applied successfully"}'
;;
"IMEI already correct")
echo '{"status": "success", "message": "IMEI profiles saved, no changes needed"}'
;;
"No matching ICCID profile found")
echo '{"status": "warning", "message": "IMEI profiles saved but no matching ICCID found"}'
;;
"Configuration file not found")
echo '{"status": "error", "message": "Configuration file not found"}'
;;
"Failed to get current ICCID or IMEI")
echo '{"status": "error", "message": "Failed to get current ICCID or IMEI"}'
;;
*)
echo '{"status": "error", "message": "IMEI profiles saved but failed to apply"}'
;;
esac
else
echo '{"status": "error", "message": "Something went wrong while processing IMEI profiles"}'
fi
fi

View File

@@ -0,0 +1,50 @@
#!/bin/sh
# Set content type
printf "Content-Type: application/json\n\n"
# URL decode function
urldecode() {
echo "$*" | sed 's/+/ /g;s/%\([0-9A-F][0-9A-F]\)/\\\\x\1/g' | xargs -0 printf '%b'
}
# Extract indexes from query string
query=$(echo "$QUERY_STRING" | grep -o 'indexes=[^&]*' | cut -d= -f2)
indexes=$(urldecode "$query")
# Function to output JSON response
send_json() {
printf '{"status":"%s","message":"%s"}\n' "$1" "$2"
}
# Validate input
if [ -z "$indexes" ]; then
send_json "error" "No indexes provided"
exit 0
fi
# Initialize counters
success=0
failure=0
# Process each index
echo "$indexes" | tr ',' '\n' | while read -r index; do
if [ -n "$index" ] && [ "$index" -eq "$index" ] 2>/dev/null; then
if sms_tool delete "$index" 2>/dev/null; then
success=$((success + 1))
else
failure=$((failure + 1))
fi
fi
done
# Send response
if [ $success -gt 0 ]; then
if [ $failure -eq 0 ]; then
send_json "success" "Successfully deleted $success message(s)"
else
send_json "partial" "Deleted $success message(s), failed to delete $failure message(s)"
fi
else
send_json "error" "Failed to delete messages"
fi

View File

@@ -0,0 +1,10 @@
#!/bin/sh
printf "Content-type: application/json\r\n\r\n"
# Execute the command and return the JSON response
if command -v sms_tool > /dev/null 2>&1; then
sms_tool -j recv
else
printf '{"error": "sms_tool not found"}\n'
fi

View File

@@ -0,0 +1,57 @@
#!/bin/sh
echo "Content-Type: application/json"
echo "Cache-Control: no-cache"
echo ""
# Function to URL decode the string
urldecode() {
local url_encoded="${1//+/ }"
printf '%b' "${url_encoded//%/\\x}"
}
# Function to escape JSON string
escape_json() {
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g; s/\r/\\r/g; s/\t/\\t/g'
}
# Read POST data
read -r QUERY_STRING
# Extract phone and message from POST data
phone=$(echo "$QUERY_STRING" | grep -o 'phone=[^&]*' | cut -d= -f2)
message=$(echo "$QUERY_STRING" | grep -o 'message=[^&]*' | cut -d= -f2)
# URL decode the message
decoded_message=$(urldecode "$message")
# Validate inputs
if [ -z "$phone" ] || [ -z "$message" ]; then
echo '{"success":false,"error":"Phone number and message are required"}'
exit 0
fi
# Validate phone number (only numbers allowed)
if ! echo "$phone" | grep -q '^[0-9]\+$'; then
echo '{"success":false,"error":"Invalid phone number format"}'
exit 0
fi
# Try to send SMS and capture output
result=$(sms_tool send "$phone" "$decoded_message" 2>&1)
escaped_result=$(escape_json "$result")
# Check if SMS was sent successfully by looking for "sms sent sucessfully"
if echo "$result" | grep -q "sms sent sucessfully"; then
# Extract the message ID if present
message_id=$(echo "$result" | grep -o '[0-9]*$')
echo "{\"success\":true,\"message\":\"SMS sent successfully\",\"messageId\":\"$message_id\",\"raw\":\"$escaped_result\"}"
elif echo "$result" | grep -q "sms not sent, code 350"; then
# Kill any hanging sms_tool process
pkill -f "sms_tool send"
echo '{"success":false,"error":"No prepaid credit available"}'
else
# Kill any hanging sms_tool process
pkill -f "sms_tool send"
echo "{\"success\":false,\"error\":\"Failed to send SMS\",\"raw\":\"$escaped_result\"}"
fi

View File

@@ -91,13 +91,91 @@ generate_monitoring_script() {
# Load configuration
. /etc/quecmanager/quecwatch/quecwatch.conf
# Log directory
LOG_DIR="/tmp/log/quecwatch"
mkdir -p "${LOG_DIR}"
# Define file paths
QUEUE_FILE="/tmp/at_pipe.txt"
LOG_FILE="/tmp/log/quecwatch/quecwatch.log"
[ ! -f "${QUEUE_FILE}" ] && touch "${QUEUE_FILE}"
# Function to log events
log_event() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "${LOG_DIR}/quecwatch.log"
# Enhanced logging function with debug level
log_message() {
local level="$1"
local message="$2"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "${timestamp} - [${level}] ${message}" >> "$LOG_FILE"
logger -t quecwatch "${level}: ${message}"
}
# Check for stale entries and clean them
check_and_clean_stale() {
local command_type="$1"
local wait_count=0
while [ $wait_count -lt 6 ]; do
if grep -q "\"command\":\"${command_type}\"" "$QUEUE_FILE"; then
log_message "DEBUG" "Waiting for ${command_type} to clear (attempt ${wait_count})"
sleep 1
wait_count=$((wait_count + 1))
else
return 0
fi
done
log_message "WARN" "Removing stale ${command_type} entry after ${wait_count}s"
sed -i "/\"command\":\"${command_type}\"/d" "$QUEUE_FILE"
return 0
}
# Handle lock with debug logging
handle_lock() {
log_message "DEBUG" "Checking queue file status before lock"
if [ -f "$QUEUE_FILE" ]; then
log_message "DEBUG" "Current queue content: $(cat $QUEUE_FILE)"
else
log_message "DEBUG" "Queue file does not exist, creating it"
touch "$QUEUE_FILE"
fi
check_and_clean_stale "FETCH_LOCK"
log_message "DEBUG" "Adding AT_COMMAND entry to queue"
printf '{"command":"AT_COMMAND","pid":"%s","timestamp":"%s"}\n' \
"$$" \
"$(date '+%H:%M:%S')" >> "$QUEUE_FILE"
check_and_clean_stale "AT_COMMAND"
}
# Execute AT command with enhanced error handling
execute_at_command() {
local command="$1"
local result=""
local retry_count=0
local max_retries=3
log_message "DEBUG" "Executing AT command: ${command}"
while [ $retry_count -lt $max_retries ]; do
handle_lock
result=$(sms_tool at "$command" -t 4 2>&1)
local status=$?
log_message "DEBUG" "Removing our entry from queue"
sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE"
if [ $status -eq 0 ] && [ -n "$result" ]; then
log_message "DEBUG" "Command successful. Output: $result"
echo "$result"
return 0
fi
log_message "WARN" "Command failed (attempt $((retry_count + 1))): $result"
retry_count=$((retry_count + 1))
[ $retry_count -lt $max_retries ] && sleep 2
done
log_message "ERROR" "Command failed after $max_retries attempts: $command"
return 1
}
# Function to update retry count in config
@@ -108,30 +186,47 @@ update_retry_count() {
. /etc/quecmanager/quecwatch/quecwatch.conf
}
# Function to get current SIM slot
# Function to get current SIM slot with enhanced error handling
get_current_sim() {
echo AT+QUIMSLOT? | atinout - /dev/smd11 /tmp/log/quecwatch/current_sim.txt
grep "+QUIMSLOT:" /tmp/log/quecwatch/current_sim.txt | awk '{print $2}'
local output
local retry_count=0
local max_retries=3
while [ $retry_count -lt $max_retries ]; do
output=$(execute_at_command "AT+QUIMSLOT?")
if [ $? -eq 0 ] && echo "$output" | grep -q "+QUIMSLOT:"; then
echo "$output" | grep "+QUIMSLOT:" | awk '{print $2}'
return 0
fi
retry_count=$((retry_count + 1))
[ $retry_count -lt $max_retries ] && sleep 2
done
log_message "ERROR" "Failed to get current SIM slot after $max_retries attempts"
return 1
}
# Function to switch SIM card
# Function to switch SIM card with enhanced error handling
switch_sim_card() {
log_event "Attempting to switch SIM card"
log_message "INFO" "Attempting to switch SIM card"
# Get current SIM slot
current_sim_slot=$(get_current_sim)
if [ $? -ne 0 ]; then
log_message "ERROR" "Failed to get current SIM slot"
return 1
fi # Changed from } to fi
# Toggle between SIM slots (assuming 2 SIM slots)
if [ "${current_sim_slot}" = "1" ]; then
new_sim_slot=2
else
new_sim_slot=1
# Toggle between SIM slots
new_sim_slot=$((current_sim_slot % 2 + 1))
log_message "INFO" "Switching from SIM slot ${current_sim_slot} to SIM slot ${new_sim_slot}"
if ! execute_at_command "AT+QUIMSLOT=${new_sim_slot}"; then
log_message "ERROR" "Failed to switch to SIM slot ${new_sim_slot}"
return 1
fi
log_event "Switching from SIM slot ${current_sim_slot} to SIM slot ${new_sim_slot}"
echo "AT+QUIMSLOT=${new_sim_slot}" | atinout - /dev/smd11 -
sleep 10 # Give more time for SIM switch and network registration
sleep 10 # Allow time for SIM switch and network registration
return 0
}
@@ -146,16 +241,25 @@ perform_connection_recovery() {
local recovery_attempted=0
local recovery_successful=0
# Try Connection Refresh if enabled
if [ "${CONNECTION_REFRESH}" = "true" ] && [ "${retry_trigger}" -eq 1 ] && [ "${REFRESH_COUNT}" -gt 0 ]; then
log_event "Attempting connection refresh"
echo AT+COPS=2 | atinout - /dev/smd11 -
log_message "INFO" "Attempting connection refresh"
if ! execute_at_command "AT+COPS=2"; then
log_message "ERROR" "Failed to detach from network"
return 1
fi
sleep 2
echo AT+COPS=0 | atinout - /dev/smd11 -
if ! execute_at_command "AT+COPS=0"; then
log_message "ERROR" "Failed to reattach to network"
return 1
fi # <-- Changed from } to fi
sleep 5
if check_internet; then
log_event "Connection refresh successful"
log_message "INFO" "Connection refresh successful"
recovery_successful=1
return 0
fi
@@ -168,110 +272,101 @@ perform_connection_recovery() {
[ ${recovery_successful} -eq 1 ] && return 0 || return 1
}
# Store initial SIM slot only if auto SIM failover is enabled
# Store initial SIM slot
initial_sim_slot=""
if [ "${AUTO_SIM_FAILOVER}" = "true" ]; then
initial_sim_slot=$(get_current_sim)
log_event "Auto SIM failover enabled. Initial SIM slot: ${initial_sim_slot}"
if [ $? -eq 0 ]; then
log_message "INFO" "Auto SIM failover enabled. Initial SIM slot: ${initial_sim_slot}"
else
log_message "ERROR" "Failed to get initial SIM slot"
fi
fi
# Main loop
# Main monitoring loop
failure_count=0
retry_trigger=0
sim_failover_interval=0
while true; do
# Check internet connectivity
if ! check_internet; then
failure_count=$((failure_count + 1))
log_event "Ping failed. Failure count: ${failure_count}"
log_message "INFO" "Ping failed. Failure count: ${failure_count}"
# Check if failure threshold is reached
if [ ${failure_count} -ge ${PING_FAILURES} ]; then
failure_count=0
retry_trigger=$((retry_trigger + 1))
update_retry_count ${retry_trigger}
log_event "Failure threshold reached. Retry trigger: ${retry_trigger}"
log_message "INFO" "Failure threshold reached. Retry trigger: ${retry_trigger}"
# Check if retry threshold is reached
if [ ${retry_trigger} -ge ${MAX_RETRIES} ]; then
# Only attempt SIM failover if enabled
if [ "${AUTO_SIM_FAILOVER}" = "true" ]; then
log_event "Max retries exhausted. Auto SIM failover is enabled. Attempting SIM failover."
switch_sim_card
if check_internet; then
log_event "SIM failover successful"
log_message "INFO" "Max retries exhausted. Attempting SIM failover."
if switch_sim_card && check_internet; then
log_message "INFO" "SIM failover successful"
retry_trigger=0
failure_count=0
update_retry_count 0
else
log_event "SIM failover failed. Performing system reboot."
log_message "ERROR" "SIM failover failed. Performing system reboot."
reboot
fi
else
# If auto SIM failover is not enabled, follow original behavior
log_event "Max retries exhausted. Auto SIM failover is disabled. Removing QuecWatch."
log_message "INFO" "Max retries exhausted. Auto SIM failover disabled. Removing QuecWatch."
sed -i '\|/etc/quecmanager/quecwatch/quecwatch.sh|d' /etc/rc.local
reboot
exit 0
fi
else
# Attempt connection recovery
if perform_connection_recovery; then
retry_trigger=0
failure_count=0
update_retry_count 0
else
log_event "Recovery failed. Performing system reboot."
log_message "ERROR" "Recovery failed. Performing system reboot."
reboot
fi
fi
fi
else
# Reset failure count and retry trigger if connection is good
failure_count=0
retry_trigger=0
update_retry_count 0
log_event "Modem is connected to the internet"
log_message "INFO" "Modem is connected to the internet"
# Only check SIM schedule if auto SIM failover is enabled
if [ "${AUTO_SIM_FAILOVER}" = "true" ] && [ "${SIM_FAILOVER_SCHEDULE}" -gt 0 ]; then
current_sim_slot=$(get_current_sim)
# Only proceed with schedule check if we're on the backup SIM
if [ -n "${initial_sim_slot}" ] && [ "${current_sim_slot}" != "${initial_sim_slot}" ]; then
sim_failover_interval=$((sim_failover_interval + 1))
# Check if schedule interval has passed
if [ $((sim_failover_interval * PING_INTERVAL)) -ge $((SIM_FAILOVER_SCHEDULE * 60)) ]; then
log_event "Scheduled check: Attempting to switch back to initial SIM ${initial_sim_slot}"
log_message "INFO" "Scheduled check: Attempting to switch back to initial SIM ${initial_sim_slot}"
# Switch to initial SIM
echo "AT+QUIMSLOT=${initial_sim_slot}" | atinout - /dev/smd11 -
sleep 10
# Check if initial SIM works
if check_internet; then
log_event "Initial SIM restored successfully"
retry_trigger=0
failure_count=0
update_retry_count 0
else
log_event "Initial SIM still not working. Switching back to backup SIM."
echo "AT+QUIMSLOT=${current_sim_slot}" | atinout - /dev/smd11 -
if execute_at_command "AT+QUIMSLOT=${initial_sim_slot}"; then
sleep 10
if check_internet; then
log_message "INFO" "Initial SIM restored successfully"
retry_trigger=0
failure_count=0
update_retry_count 0
else
log_message "WARN" "Initial SIM still not working. Switching back to backup SIM."
execute_at_command "AT+QUIMSLOT=${current_sim_slot}"
sleep 10
fi
else
log_message "ERROR" "Failed to switch to initial SIM"
fi
# Reset interval counter
sim_failover_interval=0
fi
fi
fi
fi
# Wait for specified interval before next check
sleep ${PING_INTERVAL}
done
EOL
@@ -284,13 +379,9 @@ EOL
# Enable QuecWatch
enable_quecwatch() {
# Initialize configuration
initialize_config
# Generate monitoring script
generate_monitoring_script
# Add to rc.local if not already present
if ! grep -q "${QUECWATCH_SCRIPT}" "${RCLOCAL}"; then
[ -f "${RCLOCAL}" ] || touch "${RCLOCAL}"
chmod +x "${RCLOCAL}"

View File

@@ -4,119 +4,179 @@
echo "Content-type: application/json"
echo ""
# Define file paths and configuration
QUEUE_FILE="/tmp/at_pipe.txt"
LOCK_KEYWORD="FETCH_DATA_LOCK"
MAX_WAIT=6 # Maximum seconds to wait for lock
# Function to output error in JSON format
output_error() {
echo "{\"error\": \"$1\"}"
printf '{"error": "%s"}\n' "$1"
exit 1
}
# Function to clean and add lock with simplified timeout logic
add_clean_lock() {
local TIMESTAMP=$(date +%s)
local WAIT_START=$(date +%s)
while true; do
local CURRENT_TIME=$(date +%s)
# After MAX_WAIT seconds, forcibly remove any existing lock
if [ $((CURRENT_TIME - WAIT_START)) -ge $MAX_WAIT ]; then
# Remove any existing lock entries regardless of owner
sed -i "/${LOCK_KEYWORD}/d" "$QUEUE_FILE"
logger -t at_commands "Removed existing lock after $MAX_WAIT seconds timeout"
fi
# Add our lock entry
printf '{"id":"%s","timestamp":"%s","command":"%s","status":"lock","pid":"%s","start_time":"%s"}\n' \
"${LOCK_KEYWORD}" \
"$(date '+%H:%M:%S')" \
"${LOCK_KEYWORD}" \
"$$" \
"$TIMESTAMP" >> "$QUEUE_FILE"
# Verify our lock was written
if grep -q "\"pid\":\"$$\".*\"start_time\":\"$TIMESTAMP\"" "$QUEUE_FILE"; then
logger -t at_commands "Lock created by PID $$ at $TIMESTAMP"
# Register cleanup handler
trap 'remove_lock; exit' INT TERM EXIT
return 0
fi
# If we haven't exceeded MAX_WAIT, sleep and try again
if [ $((CURRENT_TIME - WAIT_START)) -lt $MAX_WAIT ]; then
sleep 1
else
logger -t at_commands "Failed to acquire lock after $MAX_WAIT seconds"
return 1
fi
done
}
# Simple remove lock function that only removes our entry
remove_lock() {
sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE"
logger -t at_commands "Lock removed by PID $$"
}
# Improved JSON string escaping function
escape_json() {
printf '%s' "$1" | awk '
BEGIN { RS="\n"; ORS="\\n" }
{
gsub(/\\/, "\\\\")
gsub(/"/, "\\\"")
gsub(/\r/, "")
gsub(/\t/, "\\t")
gsub(/\f/, "\\f")
gsub(/\b/, "\\b")
print
}
' | sed 's/\\n$//'
}
# Enhanced AT command execution with retries
execute_at_command() {
local CMD="$1"
local RETRY_COUNT=0
local MAX_RETRIES=3
local OUTPUT=""
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
OUTPUT=$(sms_tool at "$CMD" -t 4 2>/dev/null)
if [ $? -eq 0 ] && [ -n "$OUTPUT" ]; then
echo "$OUTPUT"
return 0
fi
RETRY_COUNT=$((RETRY_COUNT + 1))
[ $RETRY_COUNT -lt $MAX_RETRIES ] && sleep 1
done
logger -t at_commands "Command failed after $MAX_RETRIES attempts: $CMD"
return 1
}
# Enhanced command processing function
process_commands() {
local commands="$1"
local first=1
# Start JSON array
printf '['
# Process each command
for cmd in $commands; do
# Add comma separator if not first item
[ $first -eq 0 ] && printf ','
first=0
# Execute command with retries
OUTPUT=$(execute_at_command "$cmd")
local CMD_STATUS=$?
# Properly escape both command and output for JSON
ESCAPED_CMD=$(escape_json "$cmd")
ESCAPED_OUTPUT=$(escape_json "$OUTPUT")
# Format JSON object with proper escaping
if [ $CMD_STATUS -eq 0 ]; then
printf '{"command":"%s","response":"%s","status":"success"}' \
"${ESCAPED_CMD}" \
"${ESCAPED_OUTPUT}"
else
printf '{"command":"%s","response":"Command failed","status":"error"}' \
"${ESCAPED_CMD}"
fi
done
# Close JSON array
printf ']\n'
}
# Main process wrapper with automatic lock handling
main_with_clean_lock() {
# Set timeout for the entire script
( sleep 60; kill -TERM $$ 2>/dev/null ) &
TIMEOUT_PID=$!
if ! add_clean_lock; then
output_error "Failed to acquire lock for command processing"
kill $TIMEOUT_PID 2>/dev/null
exit 1
fi
# Process commands
process_commands "$COMMANDS"
# Clean up
remove_lock
kill $TIMEOUT_PID 2>/dev/null
}
# Define command sets
define_command_sets() {
COMMAND_SET_1='AT+QUIMSLOT? AT+CNUM AT+COPS? AT+CIMI AT+ICCID AT+CGSN AT+CPIN? AT+CGDCONT? AT+CREG? AT+CFUN? AT+QENG="servingcell" AT+QTEMP AT+CGCONTRDP AT+QCAINFO AT+QRSRP AT+QMAP="WWAN" AT+C5GREG=2;+C5GREG? AT+CGREG=2;+CGREG? AT+QRSRQ AT+QSINR'
COMMAND_SET_2='AT+CGDCONT? AT+CGCONTRDP AT+QNWPREFCFG="mode_pref" AT+QNWPREFCFG="nr5g_disable_mode" AT+QUIMSLOT?'
COMMAND_SET_3='AT+CGMI AT+CGMM AT+QGMR AT+CNUM AT+CIMI AT+ICCID AT+CGSN AT+QMAP="LANIP" AT+QMAP="WWAN" AT+QGETCAPABILITY'
COMMAND_SET_4='AT+QMAP="MPDN_RULE" AT+QMAP="DHCPV4DNS" AT+QCFG="usbnet"'
COMMAND_SET_5='AT+QRSRP AT+QRSRQ AT+QSINR AT+QCAINFO AT+QSPN'
COMMAND_SET_6='AT+CEREG=2;+CEREG? AT+C5GREG=2;+C5GREG? AT+CPIN? AT+CGDCONT? AT+CGCONTRDP AT+QMAP="WWAN" AT+QRSRP AT+QTEMP AT+QNETRC?'
COMMAND_SET_7='AT+QNWPREFCFG="policy_band" AT+QNWPREFCFG="lte_band";+QNWPREFCFG="nsa_nr5g_band";+QNWPREFCFG="nr5g_band"'
}
# Define the lock file
LOCK_FILE="/tmp/home_data.lock"
# Acquire the lock (wait if needed)
exec 200>$LOCK_FILE
flock -x 200 || output_error "Unable to acquire lock"
# Temporary files for input/output and AT port
INPUT_FILE="/tmp/input_$$.txt"
OUTPUT_FILE="/tmp/output_$$.txt"
# Debug logging
DEBUG_LOG="/tmp/debug.log"
echo "Starting script at $(date)" > "$DEBUG_LOG"
CONFIG_FILE="/etc/quecManager.conf"
# Check config file
if [ ! -f "$CONFIG_FILE" ]; then
echo "Config file not found: $CONFIG_FILE" >> "$DEBUG_LOG"
output_error "Config file not found"
fi
# Get AT_PORT with debug logging
AT_PORT=$(head -n 1 "$CONFIG_FILE" | cut -d'=' -f2 | tr -d ' \n\r' | sed 's|^dev/||')
echo "Raw config line: $(head -n 1 "$CONFIG_FILE")" >> "$DEBUG_LOG"
echo "Extracted AT_PORT: '$AT_PORT'" >> "$DEBUG_LOG"
if [ -z "$AT_PORT" ]; then
echo "AT_PORT is empty" >> "$DEBUG_LOG"
output_error "Failed to read AT_PORT from config"
fi
# Check if AT_PORT exists
if [ ! -c "/dev/$AT_PORT" ]; then
echo "AT_PORT device not found: /dev/$AT_PORT" >> "$DEBUG_LOG"
echo "Available smd devices:" >> "$DEBUG_LOG"
ls -l /dev/smd* >> "$DEBUG_LOG" 2>&1
output_error "AT_PORT device not found"
fi
# Function to escape JSON strings (handling quotes and newlines)
escape_json() {
echo "$1" | sed ':a;N;$!ba;s/\n/\\n/g; s/"/\\"/g'
}
# Function to process AT commands
process_commands() {
local commands="$1"
local json_response="["
for cmd in $commands; do
echo "Processing command: $cmd" >> "$DEBUG_LOG"
# Write the command to the input file
echo "$cmd" > "$INPUT_FILE"
# Run the command using atinout with full path to device
if ! atinout "$INPUT_FILE" "/dev/$AT_PORT" "$OUTPUT_FILE" 2>> "$DEBUG_LOG"; then
echo "Command failed: $cmd" >> "$DEBUG_LOG"
OUTPUT="Error executing command"
elif [ ! -f "$OUTPUT_FILE" ]; then
echo "Output file not created for command: $cmd" >> "$DEBUG_LOG"
OUTPUT="No output file"
else
OUTPUT=$(cat "$OUTPUT_FILE" 2>> "$DEBUG_LOG" || echo "Error reading output")
echo "Command output: $OUTPUT" >> "$DEBUG_LOG"
fi
# Escape special characters for JSON
ESCAPED_OUTPUT=$(escape_json "$OUTPUT")
# Append the response
json_response="${json_response}{\"response\":\"$ESCAPED_OUTPUT\"},"
done
# Remove the trailing comma and close the JSON array
if [ "${json_response: -1}" = "," ]; then
json_response="${json_response%,}]"
else
json_response="${json_response}]"
fi
echo "$json_response"
COMMAND_SET_8='AT+QNWLOCK="common/4g" AT+QNWLOCK="common/5g" AT+QNWLOCK="save_ctrl"'
}
# Main execution
define_command_sets
# Get command set from query string
COMMAND_SET=$(echo "$QUERY_STRING" | grep -o 'set=[1-7]' | cut -d'=' -f2)
# Get command set from query string with validation
COMMAND_SET=$(echo "$QUERY_STRING" | grep -o 'set=[1-8]' | cut -d'=' -f2 | tr -cd '0-9')
if [ -z "$COMMAND_SET" ] || [ "$COMMAND_SET" -lt 1 ] || [ "$COMMAND_SET" -gt 8 ]; then
COMMAND_SET=1 # Default to set 1 if invalid or no set specified
fi
# Select the appropriate command set
case "$COMMAND_SET" in
@@ -127,18 +187,8 @@ case "$COMMAND_SET" in
5) COMMANDS="$COMMAND_SET_5";;
6) COMMANDS="$COMMAND_SET_6";;
7) COMMANDS="$COMMAND_SET_7";;
*) COMMANDS="$COMMAND_SET_1";; # Default to set 1 if no valid set specified
8) COMMANDS="$COMMAND_SET_8";;
esac
# Process the selected commands and output the response
JSON_RESPONSE=$(process_commands "$COMMANDS")
echo "$JSON_RESPONSE" >> "$DEBUG_LOG"
echo "$JSON_RESPONSE"
# Clean up temporary files
rm -f "$INPUT_FILE" "$OUTPUT_FILE"
# Release the lock
flock -u 200
echo "Script completed at $(date)" >> "$DEBUG_LOG"
# Execute main process with clean lock handling
main_with_clean_lock

View File

@@ -0,0 +1,10 @@
#!/bin/sh
echo "Content-Type: application/json"
echo "Cache-Control: no-cache, no-store, must-revalidate"
echo "Pragma: no-cache"
echo "Expires: 0"
echo ""
# Basic response indicating the server is up
echo '{"alive": true}'

View File

@@ -5,4 +5,4 @@ echo "Content-Type: application/json"
echo
# Read the JSON file and get only the last entry using jq
jq 'last' /tmp/signal_graphs/data_usage.json
jq 'last' /www/signal_graphs/data_usage.json

View File

@@ -0,0 +1,169 @@
#!/bin/sh
QUEUE_FILE="/tmp/at_pipe.txt"
RESULT_FILE="/tmp/at_results.json"
LOG_FILE="/var/log/at_commands.log"
# Define all lock keywords
FETCH_LOCK_KEYWORD="FETCH_DATA_LOCK"
SIGNAL_LOCK_KEYWORD="SIGNAL_METRICS_LOCK"
# Combine keywords for pattern matching
ALL_LOCK_KEYWORDS="${FETCH_LOCK_KEYWORD}\\|${SIGNAL_LOCK_KEYWORD}"
# Create or clear necessary files
touch "${QUEUE_FILE}"
[ ! -f "${RESULT_FILE}" ] && echo '[]' > "${RESULT_FILE}"
# Log messages to the log file
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "${LOG_FILE}"
}
# Escape special characters for JSON
escape_json() {
echo "$1" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g'
}
# Function to check if any lock is present
is_system_locked() {
grep -q "\"command\":\"\\(${ALL_LOCK_KEYWORDS}\\)\"" "${QUEUE_FILE}"
return $?
}
# Process a single command
process_command() {
local command="$1"
local timestamp="$2"
local cmd_id="$3"
log_message "Processing command: ${command} (ID: ${cmd_id})"
# Check if sms_tool exists and is executable
if ! which sms_tool >/dev/null 2>&1; then
log_message "Error: sms_tool not found in PATH"
result="sms_tool not found"
exit_code=1
else
# Execute the AT command using sms_tool
result=$(sms_tool at "${command}" 2>&1)
exit_code=$?
log_message "Command output: ${result}"
log_message "Exit code: ${exit_code}"
fi
# Escape the command and result for JSON
escaped_command=$(escape_json "${command}")
escaped_result=$(echo "${result}" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g' | tr -d '\r')
# Generate the result JSON
if [ ${exit_code} -eq 0 ]; then
log_message "Command successful: ${command}"
RESULT_JSON=$(printf '{"id":"%s","status":"success","command":"%s","response":"%s","queued_at":"%s","executed_at":"%s"}' \
"${cmd_id}" "${escaped_command}" "${escaped_result}" "${timestamp}" "$(date '+%H:%M:%S')")
else
log_message "Command failed: ${command}"
RESULT_JSON=$(printf '{"id":"%s","status":"error","command":"%s","error":"%s","queued_at":"%s","executed_at":"%s"}' \
"${cmd_id}" "${escaped_command}" "${escaped_result}" "${timestamp}" "$(date '+%H:%M:%S')")
fi
# Update the results file safely
if ! current_results=$(cat "${RESULT_FILE}" 2>/dev/null); then
log_message "Error reading results file, initializing new one"
echo '[]' > "${RESULT_FILE}"
current_results='[]'
fi
# Append the result JSON to the results file
if ! echo "${current_results}" | jq --argjson new "${RESULT_JSON}" '. + [$new]' > "${RESULT_FILE}.tmp"; then
log_message "Error updating results file"
return 1
fi
mv "${RESULT_FILE}.tmp" "${RESULT_FILE}"
log_message "Successfully updated results file"
return ${exit_code}
}
# Check if an entry is a lock entry
is_lock_entry() {
local line="$1"
echo "${line}" | grep -q "\"command\":\"\\(${ALL_LOCK_KEYWORDS}\\)\""
return $?
}
# Process pending commands in the queue
process_pending_commands() {
while true; do
# Check if any lock is present
if is_system_locked; then
local lock_type=$(grep -o "\"command\":\"[^\"]*\"" "${QUEUE_FILE}" | grep "${ALL_LOCK_KEYWORDS}")
log_message "System is locked: ${lock_type}, waiting..."
sleep 0.5
continue
fi
# Read the first line from the queue
line=$(head -n 1 "${QUEUE_FILE}" 2>/dev/null)
if [ -n "${line}" ]; then
log_message "Processing queue entry: ${line}"
# Skip processing if it's a lock entry
if is_lock_entry "${line}"; then
log_message "Found lock entry, skipping"
sed -i '1d' "${QUEUE_FILE}"
continue
fi
# Validate JSON before processing
if ! echo "${line}" | jq empty 2>/dev/null; then
log_message "Invalid JSON in queue, skipping line"
sed -i '1d' "${QUEUE_FILE}"
continue
fi
# Parse the command, timestamp, and ID from the JSON entry
command=$(echo "${line}" | jq -r '.command // empty')
timestamp=$(echo "${line}" | jq -r '.timestamp // empty')
cmd_id=$(echo "${line}" | jq -r '.id // empty')
if [ -z "${command}" ] || [ -z "${timestamp}" ] || [ -z "${cmd_id}" ]; then
log_message "Missing required fields in JSON, skipping"
sed -i '1d' "${QUEUE_FILE}"
continue
fi
# Process the command
process_command "${command}" "${timestamp}" "${cmd_id}"
# Remove the processed line from the queue
sed -i '1d' "${QUEUE_FILE}"
# Add a small delay between commands
sleep 0.1
else
# No commands in queue, wait briefly before checking again
sleep 0.5
break
fi
done
}
# Main queue monitoring loop
process_queue() {
log_message "Starting queue processor with multiple lock support"
while true; do
# Process any pending commands
process_pending_commands
# Wait for changes to the queue file
inotifywait -q -e modify,create "${QUEUE_FILE}" >/dev/null 2>&1
# Small delay to allow file to stabilize
sleep 0.1
done
}
# Start processing the queue
log_message "Queue processor started with file monitoring and multiple lock support"
process_queue

View File

@@ -0,0 +1,32 @@
#!/bin/sh
# Script path
SCRIPT_PATH=$(readlink -f "$0")
# Fix the spacing in the cron line to ensure exactly 5 fields
CRON_LINE="0 0 * * * $SCRIPT_PATH"
# Install crontab if not already present
if ! crontab -l | grep -Fq "$SCRIPT_PATH"; then
# Get existing crontab - ensuring clean formatting
(crontab -l 2>/dev/null | grep -v "$SCRIPT_PATH" || true; echo "$CRON_LINE") | crontab -
if [ $? -eq 0 ]; then
logger -t log_cleanup "Successfully installed crontab job"
else
logger -t log_cleanup "Failed to install crontab job"
exit 1
fi
fi
# Clean specified log files using echo redirection
echo "" > /tmp/apn_profiles.log
echo "" > /tmp/imei_profiles.log
echo "" > /var/log/at_commands.log
# Add error handling
if [ $? -ne 0 ]; then
logger -t log_cleanup "Failed to clean one or more log files"
exit 1
fi
logger -t log_cleanup "Successfully cleaned log files"

View File

@@ -3,66 +3,83 @@
# Configuration
LOGDIR="/www/signal_graphs"
MAX_ENTRIES=10
INTERVAL=15
QSCAN_FILE="$LOGDIR/qscan.json"
LOCK_FILE="/tmp/signal_logging.lock"
INTERVAL=60
QUEUE_FILE="/tmp/at_pipe.txt"
FETCH_LOCK_KEYWORD="FETCH_LOCK"
PAUSE_FILE="/tmp/signal_logging.pause"
# Ensure the directory exists
mkdir -p "$LOGDIR"
# Modified clean_atinout_output function - less aggressive cleaning
clean_atinout_output() {
# Keep everything between the command and OK, including the actual response
sed '1d' | sed '/^OK$/d' | tr -d '\r' | grep -v '^$' | head -n1
# Check for stale entries and clean them
check_and_clean_stale() {
local command_type="$1" # Either "FETCH_LOCK" or "AT_COMMAND"
local wait_count=0
while [ $wait_count -lt 6 ]; do
# Check if our type of entry exists
if grep -q "\"command\":\"${command_type}\"" "$QUEUE_FILE"; then
sleep 1
wait_count=$((wait_count + 1))
else
# Entry is gone, we can proceed
return 0
fi
done
# If we get here, entry is stale - remove it
logger -t signal_metrics "Removing stale ${command_type} entry after ${wait_count}s"
sed -i "/\"command\":\"${command_type}\"/d" "$QUEUE_FILE"
return 0
}
# Function to perform cell scan and output JSON response for CGI
perform_cell_scan() {
# Print CGI headers first
printf "Content-Type: application/json\n\n"
# Simplified lock handling
handle_lock() {
# First check and clean any FETCH_LOCK entries
check_and_clean_stale "FETCH_LOCK"
# Create pause file to stop continuous logging
touch "$PAUSE_FILE"
# Add our own entry
printf '{"command":"AT_COMMAND","pid":"%s","timestamp":"%s"}\n' \
"$$" \
"$(date '+%H:%M:%S')" >>"$QUEUE_FILE"
# Wait for any ongoing logging to complete
sleep 2
# Perform cell scan sequence
echo "AT+COPS=2" | atinout - /dev/smd7 -
sleep 2
# Run QSCAN and save output to temporary file
echo "AT+QSCAN=3,1" | atinout - /dev/smd7 "$QSCAN_OUT"
sleep 2
# Process QSCAN output and convert to JSON
if [ -f "$QSCAN_OUT" ]; then
# Extract the relevant part and convert to JSON format
sed -n '2,/^OK$/p' < "$QSCAN_OUT" | sed '$d' | tr -d '\r' | \
jq -R -s 'split("\n") | map(select(length > 0))' > "$QSCAN_FILE"
fi
# Re-enable network registration
echo "AT+COPS=0" | atinout - /dev/smd7 -
sleep 2
# Clean up temporary file
rm -f "$QSCAN_OUT"
# Remove pause file to resume logging
rm -f "$PAUSE_FILE"
# Return QSCAN results as JSON
if [ -f "$QSCAN_FILE" ]; then
printf '{"status":"success","data":%s}\n' "$(cat "$QSCAN_FILE")"
else
printf '{"status":"error","message":"No scan results available"}\n'
fi
# Then check and clean our own entry if it gets stuck
check_and_clean_stale "AT_COMMAND"
}
# Clean output function
clean_output() {
local output=""
read -r line
while read -r line; do
case "$line" in
"OK" | "")
continue
;;
*)
if [ -n "$output" ]; then
output="$output\\n$line"
else
output="$line"
fi
;;
esac
done
echo "$output"
}
# Function to log signal metric
# Execute AT command
execute_at_command() {
local COMMAND="$1"
handle_lock
local OUTPUT=$(sms_tool at "$COMMAND" -t 4 2>/dev/null | clean_output)
sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE" # Remove our entry
echo "$OUTPUT"
}
# Log signal metric
log_signal_metric() {
[ -f "$PAUSE_FILE" ] && return
@@ -70,109 +87,44 @@ log_signal_metric() {
local FILENAME="$2"
local LOGFILE="$LOGDIR/$FILENAME"
# Ensure log directory exists
mkdir -p "$(dirname "$LOGFILE")"
# Get current timestamp
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
local TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
local SIGNAL_OUTPUT=$(execute_at_command "$COMMAND")
# Add debug logging
logger -t signal_metrics "Running command: $COMMAND"
[ ! -s "$LOGFILE" ] && echo "[]" >"$LOGFILE"
# Run the AT command and capture its output, then clean it
SIGNAL_OUTPUT=$(echo "$COMMAND" | atinout - /dev/smd7 - | clean_atinout_output)
# Log the raw output for debugging
logger -t signal_metrics "Raw output for $COMMAND: $SIGNAL_OUTPUT"
# Ensure the file exists and is a valid JSON array
[ ! -s "$LOGFILE" ] && echo "[]" > "$LOGFILE"
# Use jq to update the JSON file
jq --arg dt "$TIMESTAMP" \
--arg out "$SIGNAL_OUTPUT" \
'. + [{"datetime": $dt, "output": $out}] | .[-'"$MAX_ENTRIES"':]' \
"$LOGFILE" > "${LOGFILE}.tmp" && mv "${LOGFILE}.tmp" "$LOGFILE"
}
# Function to log data usage
log_data_usage() {
[ -f "$PAUSE_FILE" ] && return
local LOGFILE="$LOGDIR/data_usage.json"
# Ensure log directory exists
mkdir -p "$(dirname "$LOGFILE")"
# Get current timestamp
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
# Run the AT command and capture its output
DATA_OUTPUT=$(echo "AT+QGDCNT?;+QGDNRCNT?" | atinout - /dev/smd7 - | clean_atinout_output)
# Ensure the file exists and is a valid JSON array
[ ! -s "$LOGFILE" ] && echo "[]" > "$LOGFILE"
# Use jq to update the JSON file
jq --arg dt "$TIMESTAMP" \
--arg out "$DATA_OUTPUT" \
'. + [{"datetime": $dt, "output": $out}] | .[-'"$MAX_ENTRIES"':]' \
"$LOGFILE" > "${LOGFILE}.tmp" && mv "${LOGFILE}.tmp" "$LOGFILE"
}
# Main CGI request handler
handle_cgi_request() {
# Get query string from REQUEST_URI or QUERY_STRING
local QUERY=""
if [ -n "$REQUEST_URI" ]; then
QUERY=$(echo "$REQUEST_URI" | grep -o '[?&]request=[^&]*' | cut -d= -f2)
elif [ -n "$QUERY_STRING" ]; then
QUERY=$(echo "$QUERY_STRING" | grep -o 'request=[^&]*' | cut -d= -f2)
if [ -n "$SIGNAL_OUTPUT" ]; then
local TEMP_FILE="${LOGFILE}.tmp.$$"
if jq --arg dt "$TIMESTAMP" \
--arg out "$SIGNAL_OUTPUT" \
'. + [{"datetime": $dt, "output": $out}] | .[-'"$MAX_ENTRIES"':]' \
"$LOGFILE" >"$TEMP_FILE"; then
mv "$TEMP_FILE" "$LOGFILE"
else
rm -f "$TEMP_FILE"
return 1
fi
fi
case "$QUERY" in
"cellScan")
perform_cell_scan
;;
*)
printf "Content-Type: application/json\n\n"
printf '{"status":"error","message":"Invalid request"}\n'
;;
esac
}
# Function to start continuous logging
# Main continuous logging function
start_continuous_logging() {
# Check if another instance is running
if [ -f "$LOCK_FILE" ]; then
logger -t signal_metrics "Another instance is already running"
exit 1
fi
# Create lock file
touch "$LOCK_FILE"
# Cleanup on exit
trap 'rm -f "$LOCK_FILE" "$PAUSE_FILE"; exit 0' INT TERM
# Log start to system log
logger -t signal_metrics "Starting continuous signal metrics logging"
# Continuous logging loop
sleep 20
logger -t signal_metrics "Starting continuous signal metrics logging (PID: $$)"
trap 'logger -t signal_metrics "Stopping signal metrics logging"; exit 0' INT TERM
while true; do
if [ ! -f "$PAUSE_FILE" ]; then
log_signal_metric "AT+QRSRP" "rsrp.json"
log_signal_metric "AT+QRSRQ" "rsrq.json"
log_signal_metric "AT+QSINR" "sinr.json"
log_data_usage
log_signal_metric "AT+QGDCNT?;+QGDNRCNT?" "data_usage.json"
fi
sleep "$INTERVAL"
done
}
# Check if script is being run as CGI or directly
if [ -n "$REQUEST_URI" ] || [ -n "$QUERY_STRING" ]; then
handle_cgi_request
else
start_continuous_logging
fi
# Start the continuous logging
start_continuous_logging

View File

@@ -1,38 +0,0 @@
#!/bin/sh
# Set the content type to JSON
echo "Content-Type: application/json"
echo ""
# Configuration file path
CONFIG_FILE="/etc/quecManager.conf"
# Check if the config file exists
if [ ! -f "$CONFIG_FILE" ]; then
echo '{"error": "Configuration file not found"}'
exit 1
fi
# Initialize variables
AT_PORT=""
AT_PORT_CUSTOM=""
DATA_REFRESH_RATE=""
# Read the config file line by line and extract values
while IFS='=' read -r key value; do
# Remove leading/trailing whitespace
key=$(echo "$key" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
value=$(echo "$value" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
case "$key" in
"AT_port") AT_PORT="$value" ;;
"AT_port_custom") AT_PORT_CUSTOM="$value" ;;
"data_refresh_rate") DATA_REFRESH_RATE="$value" ;;
esac
done <"$CONFIG_FILE"
# Output JSON
echo "{"
echo " \"AT_port\": \"$AT_PORT\","
echo " \"AT_port_custom\": \"$AT_PORT_CUSTOM\","
echo " \"data_refresh_rate\": $DATA_REFRESH_RATE"
echo "}"

File diff suppressed because one or more lines are too long

View File

@@ -1,19 +1,19 @@
1:"$Sreact.fragment"
2:I[74347,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"TooltipProvider"]
2:I[74347,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"TooltipProvider"]
4:I[24900,[],""]
5:I[81570,[],""]
6:I[50549,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"Toaster"]
6:I[50549,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"Toaster"]
7:I[92907,[],"ClientSegmentRoot"]
8:I[92646,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","9477","static/chunks/9477-215fa25b7251af44.js","1827","static/chunks/1827-82545ba38805ede6.js","9700","static/chunks/9700-86092c9639feaee7.js","1954","static/chunks/app/dashboard/layout-45da124109079a73.js"],"default"]
8:I[92646,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","9477","static/chunks/9477-215fa25b7251af44.js","1827","static/chunks/1827-82545ba38805ede6.js","9700","static/chunks/9700-86092c9639feaee7.js","1954","static/chunks/app/dashboard/layout-8f8ea3318c43ee1e.js"],"default"]
a:I[5329,[],"ClientPageRoot"]
b:I[51228,["7780","static/chunks/7780-304b82dcfd6e5323.js","4568","static/chunks/4568-33274c67a634d54a.js","6655","static/chunks/app/dashboard/about/page-520d9525bc8dea45.js"],"default"]
b:I[51228,["7780","static/chunks/7780-304b82dcfd6e5323.js","4568","static/chunks/4568-33274c67a634d54a.js","6655","static/chunks/app/dashboard/about/page-114fb5f8ed454b46.js"],"default"]
e:I[99165,[],"OutletBoundary"]
10:I[99165,[],"MetadataBoundary"]
12:I[99165,[],"ViewportBoundary"]
14:I[25339,[],""]
:HL["/_next/static/css/d7b5a13fd94a9770.css","style"]
0:{"P":null,"b":"3sS6s8RpqGaUEcUSpMyo1","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/d7b5a13fd94a9770.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":" font-euclid antialiased","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","q9rgvNx02Vqa9v9IrrDWI",{"children":[["$","$L10",null,{"children":"$L11"}],["$","$L12",null,{"children":"$L13"}],null]}]]}],false]],"m":"$undefined","G":["$14","$undefined"],"s":false,"S":true}
0:{"P":null,"b":"7RYcPVWw-k7y4DjFMox82","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/d7b5a13fd94a9770.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":" font-euclid antialiased","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","NvGehI-c3Jq9RWEBRAAP-",{"children":[["$","$L10",null,{"children":"$L11"}],["$","$L12",null,{"children":"$L13"}],null]}]]}],false]],"m":"$undefined","G":["$14","$undefined"],"s":false,"S":true}
9:{}
c:{}
d:{}

View File

@@ -1,20 +1,20 @@
1:"$Sreact.fragment"
2:I[74347,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"TooltipProvider"]
2:I[74347,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"TooltipProvider"]
4:I[24900,[],""]
5:I[81570,[],""]
6:I[50549,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"Toaster"]
6:I[50549,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"Toaster"]
7:I[92907,[],"ClientSegmentRoot"]
8:I[92646,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","9477","static/chunks/9477-215fa25b7251af44.js","1827","static/chunks/1827-82545ba38805ede6.js","9700","static/chunks/9700-86092c9639feaee7.js","1954","static/chunks/app/dashboard/layout-45da124109079a73.js"],"default"]
8:I[92646,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","9477","static/chunks/9477-215fa25b7251af44.js","1827","static/chunks/1827-82545ba38805ede6.js","9700","static/chunks/9700-86092c9639feaee7.js","1954","static/chunks/app/dashboard/layout-8f8ea3318c43ee1e.js"],"default"]
a:I[74627,["9477","static/chunks/9477-215fa25b7251af44.js","4277","static/chunks/app/dashboard/advanced-settings/layout-e0d745ff6aef0894.js"],"default"]
c:I[5329,[],"ClientPageRoot"]
d:I[59777,["7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","1827","static/chunks/1827-82545ba38805ede6.js","4568","static/chunks/4568-33274c67a634d54a.js","8757","static/chunks/app/dashboard/advanced-settings/at-terminal/page-2583519286a2eb9a.js"],"default"]
d:I[59777,["7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","1827","static/chunks/1827-82545ba38805ede6.js","4568","static/chunks/4568-33274c67a634d54a.js","8757","static/chunks/app/dashboard/advanced-settings/at-terminal/page-01c480ff996c12b4.js"],"default"]
10:I[99165,[],"OutletBoundary"]
12:I[99165,[],"MetadataBoundary"]
14:I[99165,[],"ViewportBoundary"]
16:I[25339,[],""]
:HL["/_next/static/css/d7b5a13fd94a9770.css","style"]
0:{"P":null,"b":"3sS6s8RpqGaUEcUSpMyo1","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/d7b5a13fd94a9770.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":" font-euclid antialiased","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","wtvvZMnzlRULgjyqAXd93",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
0:{"P":null,"b":"7RYcPVWw-k7y4DjFMox82","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/d7b5a13fd94a9770.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":" font-euclid antialiased","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","xa2zp_nRoBHQ_BxGaGRz4",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
9:{}
b:{}
e:{}

View File

@@ -1,20 +1,20 @@
1:"$Sreact.fragment"
2:I[74347,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"TooltipProvider"]
2:I[74347,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"TooltipProvider"]
4:I[24900,[],""]
5:I[81570,[],""]
6:I[50549,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"Toaster"]
6:I[50549,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"Toaster"]
7:I[92907,[],"ClientSegmentRoot"]
8:I[92646,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","9477","static/chunks/9477-215fa25b7251af44.js","1827","static/chunks/1827-82545ba38805ede6.js","9700","static/chunks/9700-86092c9639feaee7.js","1954","static/chunks/app/dashboard/layout-45da124109079a73.js"],"default"]
8:I[92646,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","9477","static/chunks/9477-215fa25b7251af44.js","1827","static/chunks/1827-82545ba38805ede6.js","9700","static/chunks/9700-86092c9639feaee7.js","1954","static/chunks/app/dashboard/layout-8f8ea3318c43ee1e.js"],"default"]
a:I[74627,["9477","static/chunks/9477-215fa25b7251af44.js","4277","static/chunks/app/dashboard/advanced-settings/layout-e0d745ff6aef0894.js"],"default"]
c:I[5329,[],"ClientPageRoot"]
d:I[39966,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","2301","static/chunks/2301-6b3dd604bace4c99.js","1827","static/chunks/1827-82545ba38805ede6.js","9548","static/chunks/app/dashboard/advanced-settings/connectivity/page-abf98f46650843ae.js"],"default"]
d:I[39966,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","1827","static/chunks/1827-82545ba38805ede6.js","1457","static/chunks/1457-e5968d4919dfc217.js","9548","static/chunks/app/dashboard/advanced-settings/connectivity/page-d9e4342adb8f6de9.js"],"default"]
10:I[99165,[],"OutletBoundary"]
12:I[99165,[],"MetadataBoundary"]
14:I[99165,[],"ViewportBoundary"]
16:I[25339,[],""]
:HL["/_next/static/css/d7b5a13fd94a9770.css","style"]
0:{"P":null,"b":"3sS6s8RpqGaUEcUSpMyo1","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/d7b5a13fd94a9770.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":" font-euclid antialiased","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","dyJXB0dinL9xAH1dyLVK1",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
0:{"P":null,"b":"7RYcPVWw-k7y4DjFMox82","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/d7b5a13fd94a9770.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":" font-euclid antialiased","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","biTnDvDlC3t_IKzO04i9C",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
9:{}
b:{}
e:{}

File diff suppressed because one or more lines are too long

View File

@@ -1,20 +1,20 @@
1:"$Sreact.fragment"
2:I[74347,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"TooltipProvider"]
2:I[74347,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"TooltipProvider"]
4:I[24900,[],""]
5:I[81570,[],""]
6:I[50549,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"Toaster"]
6:I[50549,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"Toaster"]
7:I[92907,[],"ClientSegmentRoot"]
8:I[92646,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","9477","static/chunks/9477-215fa25b7251af44.js","1827","static/chunks/1827-82545ba38805ede6.js","9700","static/chunks/9700-86092c9639feaee7.js","1954","static/chunks/app/dashboard/layout-45da124109079a73.js"],"default"]
8:I[92646,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","9477","static/chunks/9477-215fa25b7251af44.js","1827","static/chunks/1827-82545ba38805ede6.js","9700","static/chunks/9700-86092c9639feaee7.js","1954","static/chunks/app/dashboard/layout-8f8ea3318c43ee1e.js"],"default"]
a:I[74627,["9477","static/chunks/9477-215fa25b7251af44.js","4277","static/chunks/app/dashboard/advanced-settings/layout-e0d745ff6aef0894.js"],"default"]
c:I[5329,[],"ClientPageRoot"]
d:I[34819,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","3669","static/chunks/app/dashboard/advanced-settings/mtu/page-097f83c2ffe19e09.js"],"default"]
d:I[34819,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","3669","static/chunks/app/dashboard/advanced-settings/mtu/page-f979cfa999844875.js"],"default"]
10:I[99165,[],"OutletBoundary"]
12:I[99165,[],"MetadataBoundary"]
14:I[99165,[],"ViewportBoundary"]
16:I[25339,[],""]
:HL["/_next/static/css/d7b5a13fd94a9770.css","style"]
0:{"P":null,"b":"3sS6s8RpqGaUEcUSpMyo1","p":"","c":["","dashboard","advanced-settings","mtu",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["mtu",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/d7b5a13fd94a9770.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":" font-euclid antialiased","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":["mtu",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","mtu","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","PwR8VOB3xCWqvXYYS_OW8",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
0:{"P":null,"b":"7RYcPVWw-k7y4DjFMox82","p":"","c":["","dashboard","advanced-settings","mtu",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["mtu",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/d7b5a13fd94a9770.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":" font-euclid antialiased","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":["mtu",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","mtu","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","Ro4kmz4pkR1Gu8PD470v2",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
9:{}
b:{}
e:{}

View File

@@ -1,20 +1,20 @@
1:"$Sreact.fragment"
2:I[74347,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"TooltipProvider"]
2:I[74347,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"ThemeProvider"]
3:I[85014,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"TooltipProvider"]
4:I[24900,[],""]
5:I[81570,[],""]
6:I[50549,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-97b41eca533b7d6d.js"],"Toaster"]
6:I[50549,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","4673","static/chunks/4673-858d1306ab77aa0c.js","6366","static/chunks/6366-76e36dd86de59f39.js","7177","static/chunks/app/layout-684d7f009d1fccb6.js"],"Toaster"]
7:I[92907,[],"ClientSegmentRoot"]
8:I[92646,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","9477","static/chunks/9477-215fa25b7251af44.js","1827","static/chunks/1827-82545ba38805ede6.js","9700","static/chunks/9700-86092c9639feaee7.js","1954","static/chunks/app/dashboard/layout-45da124109079a73.js"],"default"]
8:I[92646,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","1617","static/chunks/1617-2875c5bbab102cf8.js","5011","static/chunks/5011-c111b606b30e72ad.js","4673","static/chunks/4673-858d1306ab77aa0c.js","9477","static/chunks/9477-215fa25b7251af44.js","1827","static/chunks/1827-82545ba38805ede6.js","9700","static/chunks/9700-86092c9639feaee7.js","1954","static/chunks/app/dashboard/layout-8f8ea3318c43ee1e.js"],"default"]
a:I[74627,["9477","static/chunks/9477-215fa25b7251af44.js","4277","static/chunks/app/dashboard/advanced-settings/layout-e0d745ff6aef0894.js"],"default"]
c:I[5329,[],"ClientPageRoot"]
d:I[83143,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","4481","static/chunks/app/dashboard/advanced-settings/ttl-settings/page-691f626e88357d00.js"],"default"]
d:I[83143,["9980","static/chunks/7b0cf0b7-70d5b0302880fc93.js","7780","static/chunks/7780-304b82dcfd6e5323.js","4481","static/chunks/app/dashboard/advanced-settings/ttl-settings/page-322f200a41d44135.js"],"default"]
10:I[99165,[],"OutletBoundary"]
12:I[99165,[],"MetadataBoundary"]
14:I[99165,[],"ViewportBoundary"]
16:I[25339,[],""]
:HL["/_next/static/css/d7b5a13fd94a9770.css","style"]
0:{"P":null,"b":"3sS6s8RpqGaUEcUSpMyo1","p":"","c":["","dashboard","advanced-settings","ttl-settings",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["ttl-settings",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/d7b5a13fd94a9770.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":" font-euclid antialiased","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":["ttl-settings",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","ttl-settings","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","rZGfhZOJM9yt-qvxfY7X7",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
0:{"P":null,"b":"7RYcPVWw-k7y4DjFMox82","p":"","c":["","dashboard","advanced-settings","ttl-settings",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["advanced-settings",{"children":["ttl-settings",{"children":["__PAGE__",{}]}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/d7b5a13fd94a9770.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":" font-euclid antialiased","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":["ttl-settings",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","advanced-settings","children","ttl-settings","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","s-MBvHMvY0z-U_0l58Xb6",{"children":[["$","$L12",null,{"children":"$L13"}],["$","$L14",null,{"children":"$L15"}],null]}]]}],false]],"m":"$undefined","G":["$16","$undefined"],"s":false,"S":true}
9:{}
b:{}
e:{}

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