Merging beta 1.1.1-4 release candidate
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
Package: sdxpinn-quecmanager-beta
|
||||
Version: 1.1.1-3
|
||||
Version: 1.1.1-4
|
||||
Architecture: aarch64_cortex-a53
|
||||
Maintainer: Russel Yasol dr-dolomite@github.com Cameron Thompson iamromulan@github.com
|
||||
Source: github.com/iamromulan
|
||||
|
||||
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: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: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.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
|
||||
@@ -1 +0,0 @@
|
||||
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.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
|
||||
@@ -1 +0,0 @@
|
||||
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.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
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([[5014],{41126:(e,r,a)=>{Promise.resolve().then(a.bind(a,79192))},79192:(e,r,a)=>{"use strict";a.r(r),a.d(r,{default:()=>s});var t=a(20475),l=a(72167);let s=()=>(0,t.jsx)("div",{className:"grid gap-5",children:(0,t.jsxs)(l.Zp,{children:[(0,t.jsxs)(l.aR,{children:[(0,t.jsx)(l.ZB,{children:"Full Network Cell Scan"}),(0,t.jsx)(l.BT,{children:"Scan all the of the available cells in the network including other network providers."})]}),(0,t.jsx)(l.Wu,{children:"Under Construction"})]})})},72167:(e,r,a)=>{"use strict";a.d(r,{BT:()=>i,Wu:()=>o,ZB:()=>c,Zp:()=>d,aR:()=>n,wL:()=>f});var t=a(20475),l=a(20107),s=a(22250);let d=l.forwardRef((e,r)=>{let{className:a,...l}=e;return(0,t.jsx)("div",{ref:r,className:(0,s.cn)("rounded-xl border bg-card text-card-foreground shadow",a),...l})});d.displayName="Card";let n=l.forwardRef((e,r)=>{let{className:a,...l}=e;return(0,t.jsx)("div",{ref:r,className:(0,s.cn)("flex flex-col space-y-1.5 p-6",a),...l})});n.displayName="CardHeader";let c=l.forwardRef((e,r)=>{let{className:a,...l}=e;return(0,t.jsx)("h3",{ref:r,className:(0,s.cn)("font-semibold leading-none tracking-tight",a),...l})});c.displayName="CardTitle";let i=l.forwardRef((e,r)=>{let{className:a,...l}=e;return(0,t.jsx)("p",{ref:r,className:(0,s.cn)("text-sm text-muted-foreground",a),...l})});i.displayName="CardDescription";let o=l.forwardRef((e,r)=>{let{className:a,...l}=e;return(0,t.jsx)("div",{ref:r,className:(0,s.cn)("p-6 pt-0",a),...l})});o.displayName="CardContent";let f=l.forwardRef((e,r)=>{let{className:a,...l}=e;return(0,t.jsx)("div",{ref:r,className:(0,s.cn)("flex items-center p-6 pt-0",a),...l})});f.displayName="CardFooter"},22250:(e,r,a)=>{"use strict";a.d(r,{cn:()=>s});var t=a(64901),l=a(868);function s(){for(var e=arguments.length,r=Array(e),a=0;a<e;a++)r[a]=arguments[a];return(0,l.QP)((0,t.$)(r))}}},e=>{var r=r=>e(e.s=r);e.O(0,[4736,191,6035,7358],()=>r(41126)),_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.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()}]);
|
||||
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
@@ -0,0 +1 @@
|
||||
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5293],{23080:(e,r,t)=>{Promise.resolve().then(t.bind(t,69835))},69835:(e,r,t)=>{"use strict";t.r(r),t.d(r,{default:()=>s});var l=t(20475),n=t(20107);let a=[[[1,1,1,1]],[[1,1],[1,1]],[[1,1,1],[0,1,0]],[[1,1,1],[1,0,0]],[[1,1,1],[0,0,1]],[[1,1,0],[0,1,1]],[[0,1,1],[1,1,0]]],c=["#00f0f0","#f0f000","#a000f0","#f0a000","#0000f0","#00f000","#f00000"],s=()=>{let[e,r]=(0,n.useState)(()=>Array.from({length:20},()=>Array(10).fill(null))),[t,s]=(0,n.useState)([]),[u,f]=(0,n.useState)({x:0,y:0}),[i,o]=(0,n.useState)(""),[x,d]=(0,n.useState)(0),[h,y]=(0,n.useState)(0),[m,g]=(0,n.useState)(!1),[p,v]=(0,n.useState)(!1),b=(0,n.useRef)(u),k=(0,n.useRef)(t),w=(0,n.useRef)(e),C=(0,n.useRef)(i),S=(0,n.useRef)(p),j=(0,n.useCallback)(()=>Math.max(1e3-100*Math.floor(x/2e3),100),[x]);(0,n.useEffect)(()=>{b.current=u},[u]),(0,n.useEffect)(()=>{k.current=t},[t]),(0,n.useEffect)(()=>{w.current=e},[e]),(0,n.useEffect)(()=>{C.current=i},[i]),(0,n.useEffect)(()=>{S.current=p},[p]),(0,n.useEffect)(()=>{let e=localStorage.getItem("tetrisHighScore");e&&y(parseInt(e))},[]),(0,n.useEffect)(()=>{m&&x>h&&(y(x),localStorage.setItem("tetrisHighScore",x.toString()))},[m,x,h]);let E=(0,n.useCallback)(()=>{let e=Math.floor(Math.random()*a.length),r=a[e];s(r),o(c[e]),f({x:Math.floor(5-r[0].length/2),y:0}),v(!1)},[]),N=(0,n.useCallback)((e,r)=>{for(let t=0;t<r.length;t++)for(let l=0;l<r[t].length;l++)if(r[t][l]){let r=e.x+l,n=e.y+t;if(r<0||r>=10||n>=20||n>=0&&w.current[n][r])return!0}return!1},[]),R=(0,n.useCallback)(e=>{let r=e.filter(e=>e.some(e=>!e)),t=20-r.length;return t>0?(d(x+100*t),[...Array(t).fill(null).map(()=>Array(10).fill(null)),...r]):e},[x]),A=(0,n.useCallback)(()=>{if(S.current)return;let e=w.current.map(e=>[...e]),t=!1;if(b.current.y<=0&&N(b.current,k.current)){g(!0);return}for(let r=0;r<k.current.length;r++)for(let l=0;l<k.current[r].length;l++)if(k.current[r][l]){let n=b.current.y+r;if(n<0){t=!0;break}e[n][b.current.x+l]=C.current}if(t){g(!0);return}r(R(e)),v(!0),E()},[R,E]),M=(0,n.useCallback)(()=>{if(m||S.current)return;let e={x:b.current.x,y:b.current.y+1};if(N(e,k.current)){A();return}f(e)},[m,N,A]),_=(0,n.useCallback)(()=>{if(S.current)return;let e=k.current[0].map((e,r)=>k.current.map(e=>e[e.length-1-r]));for(let r of[{x:0,y:0},{x:-1,y:0},{x:1,y:0},{x:-2,y:0},{x:2,y:0}]){let t={x:b.current.x+r.x,y:b.current.y+r.y};if(!N(t,e)){f(t),s(e);return}}},[N]),D=(0,n.useCallback)(()=>{if(S.current)return;let e=b.current.y;for(;e<20&&!N({x:b.current.x,y:e+1},k.current);)e++;f({x:b.current.x,y:e}),setTimeout(()=>A(),0)},[N,A]),I=(0,n.useCallback)(()=>{r(Array.from({length:20},()=>Array(10).fill(null))),d(0),g(!1),v(!1),E()},[E]),H=(0,n.useCallback)(e=>{if("r"===e.key.toLowerCase()&&e.ctrlKey){e.preventDefault(),I();return}if(!m&&!S.current)switch(e.key){case"ArrowLeft":{let e={x:b.current.x-1,y:b.current.y};N(e,k.current)||f(e);break}case"ArrowRight":{let e={x:b.current.x+1,y:b.current.y};N(e,k.current)||f(e);break}case"ArrowDown":M();break;case"ArrowUp":_();break;case" ":e.preventDefault(),D()}},[m,N,M,_,D,I]);return(0,n.useEffect)(()=>{E()},[E]),(0,n.useEffect)(()=>{if(m)return;let e=setInterval(M,j());return()=>clearInterval(e)},[M,m,j]),(0,n.useEffect)(()=>(window.addEventListener("keydown",H),()=>window.removeEventListener("keydown",H)),[H]),(0,l.jsxs)("div",{className:"min-h-screen bg-gray-900 flex flex-col items-center justify-center p-4",children:[(0,l.jsxs)("div",{className:"mb-4 space-y-2 text-center",children:[(0,l.jsxs)("div",{className:"text-2xl font-bold text-white",children:["Score: ",x]}),(0,l.jsxs)("div",{className:"text-xl font-bold text-yellow-500",children:["High Score: ",h]}),(0,l.jsxs)("div",{className:"text-sm text-gray-400",children:["Speed: ",Math.round(1e3/j()),"x"]})]}),(0,l.jsx)("div",{className:"bg-gray-800 p-2 rounded-lg shadow-lg",children:(0,l.jsx)("div",{className:"grid gap-px bg-gray-700",style:{gridTemplateRows:"repeat(".concat(20,", minmax(0, 1fr))"),gridTemplateColumns:"repeat(".concat(10,", minmax(0, 1fr))"),width:"".concat(240,"px"),height:"".concat(480,"px")},children:e.map((e,r)=>e.map((e,n)=>{var a,c;let s=r>=u.y&&r<u.y+t.length&&n>=u.x&&n<u.x+(null===(a=t[0])||void 0===a?void 0:a.length)&&(null===(c=t[r-u.y])||void 0===c?void 0:c[n-u.x]);return(0,l.jsx)("div",{className:"transition-colors duration-100",style:{backgroundColor:s?i:e||"#1F2937"}},"".concat(r,"-").concat(n))}))})}),m&&(0,l.jsx)("div",{className:"mt-4 text-xl font-bold text-red-500",children:"Game Over! Press Ctrl+R to play again."}),(0,l.jsxs)("div",{className:"mt-4 text-white text-center",children:[(0,l.jsx)("p",{children:"Controls:"}),(0,l.jsx)("p",{children:"← → : Move"}),(0,l.jsx)("p",{children:"↑ : Rotate"}),(0,l.jsx)("p",{children:"↓ : Soft Drop"}),(0,l.jsx)("p",{children:"Space : Hard Drop"}),(0,l.jsx)("p",{children:"Ctrl+R : Restart"})]})]})}}},e=>{var r=r=>e(e.s=r);e.O(0,[191,6035,7358],()=>r(23080)),_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:()=>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()}]);
|
||||
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.__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.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
|
||||
@@ -1 +0,0 @@
|
||||
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.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
|
||||
@@ -1 +0,0 @@
|
||||
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.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
|
||||
@@ -0,0 +1 @@
|
||||
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,r,r,r,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,e,e,e,r,r,e,e,r,r,r,r,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,r,r,e,r,r,r,e,e,e,e,r,e,e,e,r,e,e,r,e,r,r,e,e,e,e,r,e,e,r,e,r,r,e,r,e,r,r,e,e,r,e,e,e,r,r,e,r,r,e,e,e,e,r,r,e,r,e,e,e,r,e,r,r,e,r,e,r,r,r,e,e,r,r,r,e,e,e,r,e,e,r,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,e,e,e,e,r,e,r,r,r,r,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,r,r,r,e,r,e,e,e,e,r,r,r,e,r,e,e,r,e,r,r,r,e,r,r,e,r,e,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,e,r,e,r,e,e,r,e,e,e,e,r,r,e,r,r,r,r,e,r,e,e,r,r,e,e,e,e,e,e,r,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,97 +0,0 @@
|
||||
#!/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,78 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Function to URL-decode the input
|
||||
urldecode() {
|
||||
local data="$1"
|
||||
echo -e "$(echo "$data" | sed 's/+/ /g;s/%\(..\)/\\x\1/g;')"
|
||||
}
|
||||
|
||||
# Set content-type for JSON response
|
||||
echo "Content-type: application/json"
|
||||
echo ""
|
||||
|
||||
# Read the input from POST data
|
||||
read INPUT_DATA
|
||||
|
||||
# Extract the command from the input data (format: command=AT+COMMAND)
|
||||
RAW_COMMAND=$(echo "$INPUT_DATA" | sed 's/command=//g')
|
||||
|
||||
# URL-decode the command
|
||||
COMMAND=$(urldecode "$RAW_COMMAND")
|
||||
|
||||
# Define unique input/output files and AT port
|
||||
INPUT_FILE="/tmp/custom_input_$$.txt"
|
||||
OUTPUT_FILE="/tmp/custom_output_$$.txt"
|
||||
|
||||
# Debug logging
|
||||
DEBUG_LOG="/tmp/debug.log"
|
||||
echo "Starting at_handler 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"
|
||||
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
|
||||
|
||||
# Write the command directly to the input file
|
||||
echo "$COMMAND" > "$INPUT_FILE"
|
||||
|
||||
# Run the command using atinout
|
||||
atinout "$INPUT_FILE" "/dev/$AT_PORT" "$OUTPUT_FILE"
|
||||
|
||||
# Read the output from output.txt
|
||||
OUTPUT=$(cat "$OUTPUT_FILE")
|
||||
|
||||
# Escape special characters (like newlines and double quotes) for JSON compatibility
|
||||
ESCAPED_OUTPUT=$(echo "$OUTPUT" | sed ':a;N;$!ba;s/\n/\\n/g; s/"/\\"/g')
|
||||
|
||||
# Escape double quotes in the command for JSON compatibility
|
||||
ESCAPED_COMMAND=$(echo "$COMMAND" | sed 's/"/\\"/g')
|
||||
|
||||
# Create the JSON response
|
||||
JSON_RESPONSE=$(printf "{\"command\":\"%s\",\"output\":\"%s\"}" "$ESCAPED_COMMAND" "$ESCAPED_OUTPUT")
|
||||
|
||||
# Return the output as a valid JSON response
|
||||
echo "$JSON_RESPONSE"
|
||||
|
||||
# Clean up temporary files
|
||||
rm "$INPUT_FILE" "$OUTPUT_FILE"
|
||||
@@ -1,126 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Set content-type for JSON response
|
||||
echo "Content-type: application/json"
|
||||
echo ""
|
||||
|
||||
# Configuration
|
||||
QUEUE_FILE="/tmp/at_pipe.txt"
|
||||
CELL_SCAN_KEYWORD="CELL_SCAN"
|
||||
MAX_SCAN_TIME=180 # 3 minutes maximum scan time
|
||||
LOCK_WAIT_TIME=6 # Maximum seconds to wait for lock
|
||||
|
||||
# Function to output error in JSON format
|
||||
output_error() {
|
||||
printf '{"status":"error","error":"%s","output":""}\n' "$1"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Function to create and verify queue entry
|
||||
create_queue_entry() {
|
||||
local TIMESTAMP=$(date +%s)
|
||||
local entry=$(printf '{"id":"%s","timestamp":"%s","command":"%s","status":"scanning","pid":"%s","start_time":"%s","priority":"high"}\n' \
|
||||
"${CELL_SCAN_KEYWORD}" \
|
||||
"$(date '+%H:%M:%S')" \
|
||||
"${CELL_SCAN_KEYWORD}" \
|
||||
"$$" \
|
||||
"$TIMESTAMP")
|
||||
|
||||
echo "$entry" >> "$QUEUE_FILE"
|
||||
|
||||
# Verify our entry was written
|
||||
if grep -q "\"pid\":\"$$\".*\"start_time\":\"$TIMESTAMP\"" "$QUEUE_FILE"; then
|
||||
logger -t cell_scan "Queue entry created successfully"
|
||||
return 0
|
||||
else
|
||||
logger -t cell_scan "Failed to create queue entry"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Remove our entry from the queue
|
||||
remove_queue_entry() {
|
||||
sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE"
|
||||
logger -t cell_scan "Removed entry for PID $$"
|
||||
}
|
||||
|
||||
# Escape special characters for JSON string
|
||||
escape_json() {
|
||||
printf '%s' "$1" | awk '
|
||||
BEGIN { RS="\n"; ORS="\\n" }
|
||||
{
|
||||
gsub(/\\/, "\\\\")
|
||||
gsub(/"/, "\\\"")
|
||||
gsub(/\r/, "")
|
||||
print
|
||||
}' | sed 's/\\n$//'
|
||||
}
|
||||
|
||||
# Execute cell scan with proper timeout handling
|
||||
execute_cell_scan() {
|
||||
local tmp_output=$(mktemp)
|
||||
local scan_pid
|
||||
|
||||
# Start scan in background
|
||||
(sms_tool at "AT+QSCAN=3,1" -t $MAX_SCAN_TIME > "$tmp_output" 2>/dev/null) &
|
||||
scan_pid=$!
|
||||
logger -t cell_scan "Started QSCAN with PID: $scan_pid"
|
||||
|
||||
# Wait for scan to complete or timeout
|
||||
local wait_time=0
|
||||
while [ $wait_time -lt $MAX_SCAN_TIME ]; do
|
||||
if ! kill -0 $scan_pid 2>/dev/null; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
wait_time=$((wait_time + 1))
|
||||
done
|
||||
|
||||
# Check if we need to kill the scan
|
||||
if [ $wait_time -ge $MAX_SCAN_TIME ]; then
|
||||
kill $scan_pid 2>/dev/null
|
||||
wait $scan_pid 2>/dev/null
|
||||
logger -t cell_scan "Scan timed out after $MAX_SCAN_TIME seconds"
|
||||
output_error "Scan timed out"
|
||||
fi
|
||||
|
||||
logger -t cell_scan "Scan completed in $wait_time seconds"
|
||||
|
||||
# Process and output results
|
||||
if [ -s "$tmp_output" ]; then
|
||||
local escaped_output=$(escape_json "$(cat "$tmp_output")")
|
||||
printf '{"status":"success","output":"%s"}\n' "$escaped_output"
|
||||
else
|
||||
output_error "No scan results"
|
||||
fi
|
||||
|
||||
rm -f "$tmp_output"
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
# Set global timeout
|
||||
( sleep $MAX_SCAN_TIME; kill -TERM $$ 2>/dev/null ) &
|
||||
TIMEOUT_PID=$!
|
||||
|
||||
# Ensure queue file exists
|
||||
touch "$QUEUE_FILE"
|
||||
|
||||
# Create queue entry
|
||||
if ! create_queue_entry; then
|
||||
output_error "Failed to create queue entry"
|
||||
fi
|
||||
|
||||
# Register cleanup handler
|
||||
trap 'remove_queue_entry; kill $TIMEOUT_PID 2>/dev/null; exit' INT TERM EXIT
|
||||
|
||||
# Execute scan and output results
|
||||
execute_cell_scan
|
||||
|
||||
# Cleanup
|
||||
kill $TIMEOUT_PID 2>/dev/null
|
||||
remove_queue_entry
|
||||
}
|
||||
|
||||
# Start main execution
|
||||
main
|
||||
@@ -0,0 +1,200 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Set content-type for JSON response
|
||||
echo "Content-type: application/json"
|
||||
echo ""
|
||||
|
||||
# Define file paths and configuration
|
||||
QUEUE_FILE="/tmp/at_pipe.txt"
|
||||
TEMP_FILE="/tmp/network_info_output.txt"
|
||||
LOG_FILE="/var/log/network_info.log"
|
||||
LOCK_KEYWORD="AT_COMMAND_LOCK"
|
||||
MAX_WAIT=6
|
||||
COMMAND_TIMEOUT=4
|
||||
|
||||
# Function to log messages
|
||||
log_message() {
|
||||
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "${LOG_FILE}"
|
||||
logger -t network_info "$1"
|
||||
}
|
||||
|
||||
# Function to output JSON error
|
||||
output_error() {
|
||||
printf '{"status":"error","message":"%s","timestamp":"%s"}\n' "$1" "$(date '+%H:%M:%S')"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Function to clean and add lock
|
||||
add_clean_lock() {
|
||||
local TIMESTAMP=$(date +%s)
|
||||
local WAIT_START=$(date +%s)
|
||||
|
||||
while true; do
|
||||
local CURRENT_TIME=$(date +%s)
|
||||
|
||||
if [ $((CURRENT_TIME - WAIT_START)) -ge $MAX_WAIT ]; then
|
||||
sed -i "/${LOCK_KEYWORD}/d" "$QUEUE_FILE"
|
||||
log_message "Removed existing lock after $MAX_WAIT seconds timeout"
|
||||
fi
|
||||
|
||||
printf '{"id":"%s","timestamp":"%s","command":"%s","status":"lock","pid":"%s","start_time":"%s","priority":"high"}\n' \
|
||||
"${LOCK_KEYWORD}" \
|
||||
"$(date '+%H:%M:%S')" \
|
||||
"${LOCK_KEYWORD}" \
|
||||
"$$" \
|
||||
"$TIMESTAMP" >> "$QUEUE_FILE"
|
||||
|
||||
if grep -q "\"pid\":\"$$\".*\"start_time\":\"$TIMESTAMP\"" "$QUEUE_FILE"; then
|
||||
log_message "Lock created by PID $$ at $TIMESTAMP"
|
||||
trap 'remove_lock; exit' INT TERM EXIT
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ $((CURRENT_TIME - WAIT_START)) -lt $MAX_WAIT ]; then
|
||||
sleep 1
|
||||
else
|
||||
log_message "Failed to acquire lock after $MAX_WAIT seconds"
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Function to remove lock
|
||||
remove_lock() {
|
||||
sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE"
|
||||
log_message "Lock removed by PID $$"
|
||||
}
|
||||
|
||||
# Function to execute AT command 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=$(timeout $COMMAND_TIMEOUT sms_tool at "$CMD" -D 2>&1)
|
||||
local EXIT_CODE=$?
|
||||
|
||||
if [ $EXIT_CODE -eq 0 ]; then
|
||||
if echo "$OUTPUT" | grep -q "CME ERROR"; then
|
||||
RETRY_COUNT=$((RETRY_COUNT + 1))
|
||||
[ $RETRY_COUNT -lt $MAX_RETRIES ] && sleep 1
|
||||
continue
|
||||
fi
|
||||
echo "$OUTPUT"
|
||||
return 0
|
||||
fi
|
||||
|
||||
RETRY_COUNT=$((RETRY_COUNT + 1))
|
||||
[ $RETRY_COUNT -lt $MAX_RETRIES ] && sleep 1
|
||||
done
|
||||
|
||||
log_message "Command failed after $MAX_RETRIES attempts: $CMD"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Function to check network mode
|
||||
check_network_mode() {
|
||||
local OUTPUT=$(execute_at_command "AT+QENG=\"servingcell\"")
|
||||
echo "$OUTPUT" > "$TEMP_FILE"
|
||||
|
||||
# Check for both LTE and NR5G-NSA (NSA mode)
|
||||
if echo "$OUTPUT" | grep -q "\"LTE\"" && echo "$OUTPUT" | grep -q "\"NR5G-NSA\""; then
|
||||
echo "NRLTE"
|
||||
# Check for LTE only
|
||||
elif echo "$OUTPUT" | grep -q "\"LTE\""; then
|
||||
echo "LTE"
|
||||
# Check for NR5G-SA
|
||||
elif echo "$OUTPUT" | grep -q "\"NR5G-SA\""; then
|
||||
echo "NR5G"
|
||||
else
|
||||
echo "UNKNOWN"
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to check NR5G measurement info setting
|
||||
check_nr5g_meas_info() {
|
||||
local OUTPUT=$(execute_at_command "AT+QNWCFG=\"nr5g_meas_info\"")
|
||||
if echo "$OUTPUT" | grep -q "\"nr5g_meas_info\",1"; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to escape JSON string
|
||||
escape_json_string() {
|
||||
echo "$1" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g' | tr -d '\n' | sed 's/\r//g'
|
||||
}
|
||||
|
||||
# Function to parse and format output as JSON
|
||||
format_output_json() {
|
||||
local MODE="$1"
|
||||
local NEIGHBOR_OUTPUT="$2"
|
||||
local MEAS_OUTPUT="$3"
|
||||
|
||||
# Basic JSON structure
|
||||
printf '{"status":"success","timestamp":"%s","mode":"%s","data":{' "$(date '+%H:%M:%S')" "$MODE"
|
||||
|
||||
# Add neighbor cell info if available
|
||||
if [ -n "$NEIGHBOR_OUTPUT" ]; then
|
||||
printf '"neighborCells":"%s"' "$(escape_json_string "$NEIGHBOR_OUTPUT")"
|
||||
fi
|
||||
|
||||
# Add measurement info if available
|
||||
if [ -n "$MEAS_OUTPUT" ]; then
|
||||
[ -n "$NEIGHBOR_OUTPUT" ] && printf ','
|
||||
printf '"meas":"%s"' "$(escape_json_string "$MEAS_OUTPUT")"
|
||||
fi
|
||||
|
||||
printf '}}\n'
|
||||
}
|
||||
|
||||
# Main execution
|
||||
{
|
||||
if ! add_clean_lock; then
|
||||
output_error "Failed to acquire lock for command processing"
|
||||
fi
|
||||
|
||||
# Check network mode
|
||||
NETWORK_MODE=$(check_network_mode)
|
||||
log_message "Detected network mode: $NETWORK_MODE"
|
||||
|
||||
SERVING_OUTPUT=""
|
||||
MEAS_OUTPUT=""
|
||||
|
||||
case "$NETWORK_MODE" in
|
||||
"NRLTE")
|
||||
SERVING_OUTPUT=$(execute_at_command "AT+QENG=\"neighbourcell\"")
|
||||
if ! check_nr5g_meas_info; then
|
||||
MEAS_OUTPUT=$(execute_at_command "AT+QNWCFG=\"nr5g_meas_info\",1;+QNWCFG=\"nr5g_meas_info\"")
|
||||
else
|
||||
MEAS_OUTPUT=$(execute_at_command "AT+QNWCFG=\"nr5g_meas_info\"")
|
||||
fi
|
||||
;;
|
||||
"LTE")
|
||||
SERVING_OUTPUT=$(execute_at_command "AT+QENG=\"neighbourcell\"")
|
||||
;;
|
||||
"NR5G")
|
||||
if ! check_nr5g_meas_info; then
|
||||
MEAS_OUTPUT=$(execute_at_command "AT+QNWCFG=\"nr5g_meas_info\",1;+QNWCFG=\"nr5g_meas_info\"")
|
||||
else
|
||||
MEAS_OUTPUT=$(execute_at_command "AT+QNWCFG=\"nr5g_meas_info\"")
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
output_error "Unknown or unsupported network mode"
|
||||
;;
|
||||
esac
|
||||
|
||||
format_output_json "$NETWORK_MODE" "$SERVING_OUTPUT" "$MEAS_OUTPUT"
|
||||
remove_lock
|
||||
rm -f "$TEMP_FILE"
|
||||
|
||||
} || {
|
||||
# Error handler
|
||||
remove_lock
|
||||
rm -f "$TEMP_FILE"
|
||||
output_error "Internal error occurred"
|
||||
}
|
||||
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