Merge branch 'development-SDXPINN' into SDXPINN
This commit is contained in:
@@ -1 +0,0 @@
|
||||
/etc/quecManager.conf
|
||||
@@ -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
|
||||
|
||||
@@ -39,6 +39,9 @@ for SCRIPT in $SCRIPTS; do
|
||||
fi
|
||||
done
|
||||
|
||||
service quecmanager-services stop
|
||||
service quecmanager-services disable
|
||||
|
||||
echo "Cleanup complete."
|
||||
exit 0
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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();
|
||||
@@ -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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7040,9188],{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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[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()}]);
|
||||
@@ -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()}]);
|
||||
@@ -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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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()}]);
|
||||
@@ -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()}]);
|
||||
@@ -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()}]);
|
||||
@@ -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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
self.__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();
|
||||
@@ -1 +0,0 @@
|
||||
self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
|
||||
74
ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/at_command.sh
Executable file
74
ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/at_command.sh
Executable 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
|
||||
97
ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/at_results.sh
Executable file
97
ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/at_results.sh
Executable 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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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}"
|
||||
|
||||
@@ -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
|
||||
10
ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/heartbeat.sh
Executable file
10
ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/heartbeat.sh
Executable 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}'
|
||||
@@ -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
|
||||
@@ -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
|
||||
32
ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/clear_logs.sh
Executable file
32
ipk-source/sdxpinn-quecmanager-beta/root/www/cgi-bin/services/clear_logs.sh
Executable 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"
|
||||
@@ -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
|
||||
@@ -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
@@ -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:{}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -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:{}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -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
@@ -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:{}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -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:{}
|
||||
|
||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user