Merge pull request #75 from dr-dolomite/QuecManager

QuecManager Home for RM551E
This commit is contained in:
Cameron Thompson
2024-10-02 08:27:26 -04:00
committed by GitHub
18 changed files with 3942 additions and 727 deletions

268
www/about.html Normal file
View File

@@ -0,0 +1,268 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<!-- Logo -->
<link rel="logo" href="favicon.ico" />
<link rel="stylesheet" href="css/bulma/bulma.scss">
<link rel="stylesheet" href="css/bulma/css/bulma.min.css">
<link rel="stylesheet" href="css/bulma/css/bulma.css">
<link rel="stylesheet" href="css/custom.css">
<!-- Font awesome icons -->
<script src="https://kit.fontawesome.com/b0caedfab3.js" crossorigin="anonymous"></script>
<script src="js/styles/nav-burger.js"></script>
<script src="js/styles/toggle-theme.js"></script>
<script defer src="/js/auth/auth.js"></script>
<script>
(function () {
const savedTheme = localStorage.getItem('theme') || 'theme-dark';
document.documentElement.classList.add(savedTheme);
})();
</script>
<title>QuecManager</title>
</head>
<body class="body-margin">
<nav class="navbar is-transparent">
<div class="navbar-brand">
<a class="navbar-item" href="/">
<img src="/assets/logo.png" alt="Logo" />
<span class="title">QuecManager</span>
</a>
<a
role="button"
class="navbar-burger"
aria-label="menu"
aria-expanded="false"
data-target="navMenu"
>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
<div id="navMenu" class="navbar-menu">
<div class="navbar-start ml-6">
<a class="navbar-item" href="/"> Home </a>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link"> Cellular </a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/bandlock.html"> Band Locking </a>
<a class="navbar-item" href="/cell-locking.html">Cell Locking</a>
<a class="navbar-item" href="/cell-scanner.html">Cell Scanner</a>
<a class="navbar-item" href="/cell-settings.html"
>Cell Settings</a
>
<a class="navbar-item" href="/cell-sms.html"> Cell SMS </a>
</div>
</div>
<a class="navbar-item" href="/advance-settings.html"> Advance </a>
<a class="navbar-item has-text-weight-bold" href="/about.html"> About </a>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="buttons is-flex-direction-column-mobile">
<p class="control is-expanded-mobile">
<a
href="#"
class="button is-link is-outlined is-fullwidth-mobile"
>
<span class="icon">
<i class="fas fa-arrows-rotate"></i>
</span>
<span>Restart Connection</span>
</a>
</p>
<div class="is-flex is-mobile is-align-items-center">
<p class="control">
<a href="#" class="button is-warning is-outlined">
<span class="icon">
<i class="fas fa-power-off"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
>
<span class="icon">
<i class="fas fa-sun"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
id="logoutButton"
>
<span class="icon">
<i class="fas fa-right-from-bracket"></i>
</span>
</a>
</p>
</div>
</div>
</div>
</div>
</div>
</nav>
<div class="column-margin">
<div class="fixed-grid has-2-cols has-1-cols-mobile">
<div class="grid">
<div class="cell">
<div class="card">
<div class="card-header">
<div class="card-header-title">
Device Information
</div>
</div>
<div class="card-content">
<table class="table is-fullwidth is-borderless">
<tbody>
<tr>
<td>Modem Manufacturer</td>
<th>Quectel</th>
</tr>
<tr>
<td>Modem Model Name</td>
<th>RM520N-GL</th>
</tr>
<tr>
<td>Firmware Version</td>
<th>RM520NGLAA123</th>
</tr>
<tr>
<td>Phone Number</td>
<th>+639938931024</th>
</tr>
<tr>
<td>IMSI</td>
<th>123456789</th>
</tr>
<tr>
<td>ICCID</td>
<th>123456789</th>
</tr>
<tr>
<td>IMEI</td>
<th>
<div class="field has-addons is-hidden-mobile">
<div class="control">
<input class="input has-text-weight-semibold" type="text"
placeholder="IMEI Here">
</div>
<div class="control">
<button class="button is-link">
Change
</button>
</div>
</div>
<span class="is-block-mobile is-hidden">
123456789123
</span>
</th>
</tr>
<tr>
<td>LAN GATEWAY</td>
<th>192.168.225.1</th>
</tr>
<tr>
<td>WWAN IPv4</td>
<th>38.0.101.76</th>
</tr>
<tr>
<td>WWAN IPv6</td>
<th style="word-break: break-all;">
5be8:dde9:7f0b:d5a7:bd01:b3be:9c69:573b
</th>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="cell">
<div class="card">
<div class="card-header">
<div class="card-header-title">
About Us
</div>
</div>
<div class="card-content">
<div class="content">
<p class="title">
QuecManager
</p>
<p class="subtitle mt-2">
Simple Admin began as part of the RGMII toolkit, offering users a basic GUI.
However, with our fork and continued development, it has evolved to include more
advanced features, making "simple" no longer an ideal name for the dashboard.
Despite this shift, we remain committed to providing advanced functionality while
maintaining an intuitive and user-friendly GUI.
</p>
<p class="subtitle mt-6 has-text-weight-bold">
Thanks to
</p>
<ul class="has-text-weight-semibold">
<li>
RGMII Toolkit and Documentation
<a href="https://github.com/iamromulan" target="_blank">iamromulan</a>
</li>
<li>
Simple Admin 2.0 and QuecManager
<a href="https://github.com/dr-dolomite" target="_blank">dr-dolomite</a>
</li>
<li>
SMS Feature
<a href="https://github.com/snjzb" target="_blank">snjzb</a>
</li>
<li>
Original Simple Admin
<a href="https://github.com/aesthernr" target="_blank">aesthernr</a>
</li>
<li>
Original Socat Bridge
<a href="https://github.com/natecarlson" target="_blank">natecarlson</a>
</li>
<li>
Initial Original Simple Admin Fixes
<a href="https://github.com/rbflurry/" target="_blank">rbflurry</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="content has-text-centered">
<p>
<strong> <a href="https://github.com/iamromulan/quectel-rgmii-toolkit.git">QuecManager</a></strong>
version 1.0. All rights reserved.
</p>
</div>
</footer>
</body>
</html>

View File

@@ -19,7 +19,7 @@
crossorigin="anonymous" crossorigin="anonymous"
></script> ></script>
<script src="js/styles/nav-state.js"></script> <script src="js/styles/nav-burger.js"></script>
<script src="js/styles/toggle-theme.js"></script> <script src="js/styles/toggle-theme.js"></script>
<script defer src="/js/auth/auth.js"></script> <script defer src="/js/auth/auth.js"></script>
<script src="/js/handle-at-input.js"></script> <script src="/js/handle-at-input.js"></script>
@@ -41,79 +41,83 @@
<img src="/assets/logo.png" alt="Logo" /> <img src="/assets/logo.png" alt="Logo" />
<span class="title">QuecManager</span> <span class="title">QuecManager</span>
</a> </a>
<div <a
class="navbar-burger js-burger" role="button"
data-target="navbarExampleTransparentExample" class="navbar-burger"
aria-label="menu"
aria-expanded="false"
data-target="navMenu"
> >
<span></span> <span aria-hidden="true"></span>
<span></span> <span aria-hidden="true"></span>
<span></span> <span aria-hidden="true"></span>
<span></span> <span aria-hidden="true"></span>
</div> </a>
</div> </div>
<div id="navbarExampleTransparentExample" class="navbar-menu"> <div id="navMenu" class="navbar-menu">
<div class="navbar-start ml-6"> <div class="navbar-start ml-6">
<a class="navbar-item" href="/"> Home </a> <a class="navbar-item" href="/"> Home </a>
<div class="navbar-item has-dropdown is-hoverable"> <div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link"> Cellular </a> <a class="navbar-link"> Cellular </a>
<div class="navbar-dropdown is-boxed"> <div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/bandlock.html"> Band Locking </a> <a class="navbar-item" href="/bandlock.html"> Band Locking </a>
<a class="navbar-item" href="/cell-locking.html"> <a class="navbar-item" href="/cell-locking.html">Cell Locking</a>
Cell Locking <a class="navbar-item" href="/cell-scanner.html">Cell Scanner</a>
</a> <a class="navbar-item" href="/cell-settings.html"
<a class="navbar-item" href="/cell-scanner.html"> >Cell Settings</a
Cell Scanner >
</a>
<a class="navbar-item" href="/cell-settings.html">
Cell Settings
</a>
<a class="navbar-item" href="/cell-sms.html"> Cell SMS </a> <a class="navbar-item" href="/cell-sms.html"> Cell SMS </a>
</div> </div>
</div> </div>
<a class="navbar-item" href="/advance-settings.html"> Advance </a> <a class="navbar-item has-text-weight-bold" href="/advance-settings.html"> Advance </a>
<a class="navbar-item" href="/about.html"> About </a> <a class="navbar-item" href="/about.html"> About </a>
</div> </div>
<div class="navbar-end"> <div class="navbar-end">
<div class="navbar-item"> <div class="navbar-item">
<div class="field is-grouped"> <div class="buttons is-flex-direction-column-mobile">
<p class="control"> <p class="control is-expanded-mobile">
<a href="#" class="button is-link is-outlined"> <a
href="#"
class="button is-link is-outlined is-fullwidth-mobile"
>
<span class="icon"> <span class="icon">
<i class="fas fa-arrows-rotate"></i> <i class="fas fa-arrows-rotate"></i>
</span> </span>
<span>Restart Connection</span> <span>Restart Connection</span>
</a> </a>
</p> </p>
<p class="control"> <div class="is-flex is-mobile is-align-items-center">
<a href="#" class="button is-warning is-outlined"> <p class="control">
<span class="icon"> <a href="#" class="button is-warning is-outlined">
<i class="fas fa-power-off"></i> <span class="icon">
</span> <i class="fas fa-power-off"></i>
</a> </span>
</p> </a>
<p class="control"> </p>
<a <p class="control ml-2 is-mobile">
href="#" <a
class="button is-warning is-outlined js-theme-toggle" href="#"
> class="button is-warning is-outlined js-theme-toggle"
<span class="icon"> >
<i class="fas fa-sun"></i> <span class="icon">
</span> <i class="fas fa-sun"></i>
</a> </span>
</p> </a>
<p class="control"> </p>
<a <p class="control ml-2 is-mobile">
href="#" <a
class="button is-warning is-outlined js-theme-toggle" href="#"
id="logoutButton" class="button is-warning is-outlined js-theme-toggle"
> id="logoutButton"
<span class="icon"> >
<i class="fas fa-right-from-bracket"></i> <span class="icon">
</span> <i class="fas fa-right-from-bracket"></i>
</a> </span>
</p> </a>
</p>
</div>
</div> </div>
</div> </div>
</div> </div>

278
www/bandlock.html Normal file
View File

@@ -0,0 +1,278 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<!-- Logo -->
<link rel="simpleadmin-logo" href="favicon.ico" />
<link rel="stylesheet" href="css/bulma/bulma.scss">
<link rel="stylesheet" href="css/bulma/css/bulma.min.css">
<link rel="stylesheet" href="css/bulma/css/bulma.css">
<link rel="stylesheet" href="css/custom.css">
<!-- Font awesome icons -->
<script src="https://kit.fontawesome.com/b0caedfab3.js" crossorigin="anonymous"></script>
<script src="js/styles/nav-burger.js"></script>
<script src="js/styles/toggle-theme.js"></script>
<script defer src="/js/auth/auth.js"></script>
<script>
(function () {
const savedTheme = localStorage.getItem('theme') || 'theme-dark';
document.documentElement.classList.add(savedTheme);
})();
</script>
<title>QuecManager</title>
</head>
<body class="body-margin">
<nav class="navbar is-transparent">
<div class="navbar-brand">
<a class="navbar-item" href="/">
<img src="/assets/logo.png" alt="Logo" />
<span class="title">QuecManager</span>
</a>
<a
role="button"
class="navbar-burger"
aria-label="menu"
aria-expanded="false"
data-target="navMenu"
>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
<div id="navMenu" class="navbar-menu">
<div class="navbar-start ml-6">
<a class="navbar-item" href="/"> Home </a>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link"> Cellular </a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/bandlock.html"> Band Locking </a>
<a class="navbar-item" href="/cell-locking.html">Cell Locking</a>
<a class="navbar-item" href="/cell-scanner.html">Cell Scanner</a>
<a class="navbar-item" href="/cell-settings.html"
>Cell Settings</a
>
<a class="navbar-item" href="/cell-sms.html"> Cell SMS </a>
</div>
</div>
<a class="navbar-item" href="/advance-settings.html"> Advance </a>
<a class="navbar-item" href="/about.html"> About </a>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="buttons is-flex-direction-column-mobile">
<p class="control is-expanded-mobile">
<a
href="#"
class="button is-link is-outlined is-fullwidth-mobile"
>
<span class="icon">
<i class="fas fa-arrows-rotate"></i>
</span>
<span>Restart Connection</span>
</a>
</p>
<div class="is-flex is-mobile is-align-items-center">
<p class="control">
<a href="#" class="button is-warning is-outlined">
<span class="icon">
<i class="fas fa-power-off"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
>
<span class="icon">
<i class="fas fa-sun"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
id="logoutButton"
>
<span class="icon">
<i class="fas fa-right-from-bracket"></i>
</span>
</a>
</p>
</div>
</div>
</div>
</div>
</div>
</nav>
<div class="column-margin">
<div class="fixed-grid has-2-cols has-1-cols-mobile">
<div class="grid is-gap-5">
<div class="cell is-col-span-2 is-col-span-1-mobile">
<div class="card">
<div class="card-header">
<div class="card-header-title">
4G LTE Band Locking
</div>
</div>
<div class="card-content">
<div class="fixed-grid has-5-cols has-3-cols-mobile">
<div class="grid" id="lte_bands">
<!-- write each lte band cell here -->
</div>
</div>
</div>
<div class="card-footer">
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Lock LTE Bands
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Uncheck All
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Reset
</a>
</div>
</div>
</div>
<div class="cell">
<div class="card">
<div class="card-header">
<div class="card-header-title">
5G-NR NSA Band Locking
</div>
</div>
<div class="card-content">
<div class="fixed-grid has-5-cols has-3-cols-mobile">
<div class="grid" id="nsa_bands">
<!-- write each nsa band cell here -->
</div>
</div>
</div>
<div class="card-footer">
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Lock NSA Bands
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Uncheck All
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Reset
</a>
</div>
</div>
</div>
<div class="cell">
<div class="card">
<div class="card-header">
<div class="card-header-title">
5G-NR SA Band Locking
</div>
</div>
<div class="card-content">
<div class="fixed-grid has-5-cols has-3-cols-mobile">
<div class="grid" id="sa_bands">
<!-- write each SA band cell here -->
</div>
</div>
</div>
<div class="card-footer">
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Lock SA Bands
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Uncheck All
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Reset
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="content">
<div class="fixed-grid has-2-cols has-1-cols-mobile">
<div class="grid">
<div class="cell">
<div class="icon-text">
<span class="icon has-text-info">
<i class="fas fa-info-circle"></i>
</span>
<span>Information</span>
</div>
<p class="block has-text-weight-semibold">
If problem persists after locking bands, please reboot the modem.
</p>
</div>
<div class="cell">
<div class="icon-text">
<span class="icon has-text-info">
<i class="fas fa-info-circle"></i>
</span>
<span>Current Active Bands</span>
</div>
<p class="block has-text-weight-semibold">
Band 1 / Band 3 / NR Band 41
</p>
</div>
</div>
</div>
</div>
</footer>
</body>
<script>
var lte_bands = "1:2:3:4:5:7:8:12:13:14:18:19:20:25:26:28:29:30:32:34:38:39:40:41:42:43:46:48:66:71";
var nsa_bands = "1:2:3:5:7:8:12:20:25:28:38:40:41:48:66:71:77:78:79";
var sa_bands = "1:2:3:5:7:8:12:20:25:28:38:40:41:48:66:71:77:78:79";
function populateBands(bandsString, targetId) {
var bandsArray = bandsString.split(":");
var html = "";
for (var i = 0; i < bandsArray.length; i++) {
html += '<div class="cell"><label class="checkbox"><input type="checkbox" /> B' + bandsArray[i] + '</label></div>';
}
// Inject the generated HTML into the target element
document.querySelector(targetId).innerHTML = html;
}
// Populate the bands in their respective grids
populateBands(lte_bands, '#lte_bands');
populateBands(nsa_bands, '#nsa_bands');
populateBands(sa_bands, '#sa_bands');
</script>
</html>

356
www/cell-locking.html Normal file
View File

@@ -0,0 +1,356 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<!-- Logo -->
<link rel="simpleadmin-logo" href="favicon.ico" />
<link rel="stylesheet" href="css/bulma/bulma.scss">
<link rel="stylesheet" href="css/bulma/css/bulma.min.css">
<link rel="stylesheet" href="css/bulma/css/bulma.css">
<link rel="stylesheet" href="css/custom.css">
<!-- Font awesome icons -->
<script src="https://kit.fontawesome.com/b0caedfab3.js" crossorigin="anonymous"></script>
<script src="js/styles/nav-burger.js"></script>
<script src="js/styles/toggle-theme.js"></script>
<script defer src="/js/auth/auth.js"></script>
<script>
(function () {
const savedTheme = localStorage.getItem('theme') || 'theme-dark';
document.documentElement.classList.add(savedTheme);
})();
</script>
<title>QuecManager</title>
</head>
<body class="body-margin">
<nav class="navbar is-transparent">
<div class="navbar-brand">
<a class="navbar-item" href="/">
<img src="/assets/logo.png" alt="Logo" />
<span class="title">QuecManager</span>
</a>
<a
role="button"
class="navbar-burger"
aria-label="menu"
aria-expanded="false"
data-target="navMenu"
>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
<div id="navMenu" class="navbar-menu">
<div class="navbar-start ml-6">
<a class="navbar-item" href="/"> Home </a>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link"> Cellular </a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/bandlock.html"> Band Locking </a>
<a class="navbar-item" href="/cell-locking.html">Cell Locking</a>
<a class="navbar-item" href="/cell-scanner.html">Cell Scanner</a>
<a class="navbar-item" href="/cell-settings.html"
>Cell Settings</a
>
<a class="navbar-item" href="/cell-sms.html"> Cell SMS </a>
</div>
</div>
<a class="navbar-item" href="/advance-settings.html"> Advance </a>
<a class="navbar-item" href="/about.html"> About </a>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="buttons is-flex-direction-column-mobile">
<p class="control is-expanded-mobile">
<a
href="#"
class="button is-link is-outlined is-fullwidth-mobile"
>
<span class="icon">
<i class="fas fa-arrows-rotate"></i>
</span>
<span>Restart Connection</span>
</a>
</p>
<div class="is-flex is-mobile is-align-items-center">
<p class="control">
<a href="#" class="button is-warning is-outlined">
<span class="icon">
<i class="fas fa-power-off"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
>
<span class="icon">
<i class="fas fa-sun"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
id="logoutButton"
>
<span class="icon">
<i class="fas fa-right-from-bracket"></i>
</span>
</a>
</p>
</div>
</div>
</div>
</div>
</div>
</nav>
<div class="column-margin">
<div class="fixed-grid has-2-cols has-1-cols-mobile">
<div class="grid is-gap-5">
<div class="cell">
<div class="card">
<div class="card-header">
<div class="card-header-title">
4G LTE Cell Locking
</div>
</div>
<div class="card-content">
<div class="fixed-grid has-2-cols">
<div class="grid">
<!-- Entry 1 Start -->
<div class="cell">
<div class="field">
<label class="label">EARFCN 1</label>
<div class="control has-icons-left">
<input class="input" type="email" placeholder="EARFCN">
<span class="icon is-left">
<i class="fas fa-bolt"></i>
</span>
</div>
</div>
</div>
<div class="cell">
<div class="field">
<label class="label">PCI 1</label>
<div class="control has-icons-left">
<input class="input" type="email" placeholder="PCI">
<span class="icon is-left">
<i class="fa-solid fa-signal"></i>
</span>
</div>
</div>
</div>
<!-- Entry 1 End -->
<!-- Entry 2 Start -->
<div class="cell">
<div class="field">
<label class="label">EARFCN 2</label>
<div class="control has-icons-left">
<input class="input" type="email" placeholder="EARFCN">
<span class="icon is-left">
<i class="fas fa-bolt"></i>
</span>
</div>
</div>
</div>
<div class="cell">
<div class="field">
<label class="label">PCI 2</label>
<div class="control has-icons-left">
<input class="input" type="email" placeholder="PCI">
<span class="icon is-left">
<i class="fa-solid fa-signal"></i>
</span>
</div>
</div>
</div>
<!-- Entry 2 End -->
<!-- Entry 3 Start -->
<div class="cell">
<div class="field">
<label class="label">EARFCN 3</label>
<div class="control has-icons-left">
<input class="input" type="email" placeholder="EARFCN">
<span class="icon is-left">
<i class="fas fa-bolt"></i>
</span>
</div>
</div>
</div>
<div class="cell">
<div class="field">
<label class="label">PCI 3</label>
<div class="control has-icons-left">
<input class="input" type="email" placeholder="PCI">
<span class="icon is-left">
<i class="fa-solid fa-signal"></i>
</span>
</div>
</div>
</div>
<!-- Entry 3 End -->
</div>
</div>
</div>
<div class="card-footer">
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Lock LTE Cells
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Reset
</a>
</div>
</div>
</div>
<div class="cell">
<div class="card">
<div class="card-header">
<div class="card-header-title">
5G-NR SA Cell Locking
</div>
</div>
<div class="card-content">
<div class="fixed-grid has-2-cols">
<div class="grid">
<!-- Entry 1 Start -->
<div class="cell">
<div class="field">
<label class="label">NR ARFCN</label>
<div class="control has-icons-left">
<input class="input" type="email" placeholder="NR-ARFCN">
<span class="icon is-left">
<i class="fas fa-bolt"></i>
</span>
</div>
</div>
</div>
<div class="cell">
<div class="field">
<label class="label">NR PCI</label>
<div class="control has-icons-left">
<input class="input" type="email" placeholder="NR PCI">
<span class="icon is-left">
<i class="fa-solid fa-signal"></i>
</span>
</div>
</div>
</div>
<!-- Entry 1 End -->
<!-- Entry 2 Start -->
<div class="cell">
<div class="field">
<label class="label">SCS</label>
<div class="control has-icons-left">
<span class="select">
<select>
<option selected>Select SCS</option>
<option>15 kHz</option>
<option>30 kHz</option>
<option>60 kHz</option>
<option>120 kHz</option>
<option>240 kHz</option>
</select>
</span>
<span class="icon is-left">
<i class="fas fa-bolt"></i>
</span>
</div>
</div>
</div>
<div class="cell">
<div class="field">
<label class="label">NR Band</label>
<div class="control has-icons-left">
<input class="input" type="email" placeholder="NR Band">
<span class="icon is-left">
<i class="fa-solid fa-signal"></i>
</span>
</div>
</div>
</div>
<!-- Entry 2 End -->
</div>
</div>
</div>
<div class="card-footer">
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Lock SA Cells
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Reset
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="content">
<div class="fixed-grid has-2-cols has-1-cols-mobile">
<div class="grid">
<div class="cell">
<div class="icon-text">
<span class="icon has-text-info">
<i class="fas fa-info-circle"></i>
</span>
<span>Information</span>
</div>
<p class="block has-text-weight-semibold">
Cell locking is an advance feature and may cause network interruptions. <br />
Cell locking will also only work with the main band (PCC) if you are using carrier
aggregation.
<br />
Proceed with caution.
</p>
</div>
<div class="cell">
<div class="icon-text">
<span class="icon has-text-info">
<i class="fas fa-info-circle"></i>
</span>
<span>Current Active Locked Cells</span>
</div>
<p class="block has-text-weight-semibold">
150/69, 1350/70, 1350/71
</p>
</div>
</div>
</div>
</div>
</footer>
</body>
</html>

486
www/cell-scanner.html Normal file
View File

@@ -0,0 +1,486 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<!-- Logo -->
<link rel="simpleadmin-logo" href="favicon.ico" />
<link rel="stylesheet" href="css/bulma/bulma.scss">
<link rel="stylesheet" href="css/bulma/css/bulma.min.css">
<link rel="stylesheet" href="css/bulma/css/bulma.css">
<link rel="stylesheet" href="css/custom.css">
<!-- Font awesome icons -->
<script src="https://kit.fontawesome.com/b0caedfab3.js" crossorigin="anonymous"></script>
<script src="js/styles/nav-burger.js"></script>
<script src="js/styles/toggle-theme.js"></script>
<script defer src="/js/auth/auth.js"></script>
<script>
(function () {
const savedTheme = localStorage.getItem('theme') || 'theme-dark';
document.documentElement.classList.add(savedTheme);
})();
</script>
<title>QuecManager</title>
</head>
<body class="body-margin">
<nav class="navbar is-transparent">
<div class="navbar-brand">
<a class="navbar-item" href="/">
<img src="/assets/logo.png" alt="Logo" />
<span class="title">QuecManager</span>
</a>
<a
role="button"
class="navbar-burger"
aria-label="menu"
aria-expanded="false"
data-target="navMenu"
>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
<div id="navMenu" class="navbar-menu">
<div class="navbar-start ml-6">
<a class="navbar-item" href="/"> Home </a>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link"> Cellular </a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/bandlock.html"> Band Locking </a>
<a class="navbar-item" href="/cell-locking.html">Cell Locking</a>
<a class="navbar-item" href="/cell-scanner.html">Cell Scanner</a>
<a class="navbar-item" href="/cell-settings.html"
>Cell Settings</a
>
<a class="navbar-item" href="/cell-sms.html"> Cell SMS </a>
</div>
</div>
<a class="navbar-item" href="/advance-settings.html"> Advance </a>
<a class="navbar-item" href="/about.html"> About </a>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="buttons is-flex-direction-column-mobile">
<p class="control is-expanded-mobile">
<a
href="#"
class="button is-link is-outlined is-fullwidth-mobile"
>
<span class="icon">
<i class="fas fa-arrows-rotate"></i>
</span>
<span>Restart Connection</span>
</a>
</p>
<div class="is-flex is-mobile is-align-items-center">
<p class="control">
<a href="#" class="button is-warning is-outlined">
<span class="icon">
<i class="fas fa-power-off"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
>
<span class="icon">
<i class="fas fa-sun"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
id="logoutButton"
>
<span class="icon">
<i class="fas fa-right-from-bracket"></i>
</span>
</a>
</p>
</div>
</div>
</div>
</div>
</div>
</nav>
<div class="column-margin">
<div class="fixed-grid has-1-cols">
<div class="grid is-gap-5">
<div class="cell">
<div class="card">
<div class="card-header">
<p class="card-header-title">
Full Network Provider Cell Scanner
</p>
</div>
<div class="card-content">
<table class="table is-fullwidth">
<thead>
<tr>
<th>
Network Provider
</th>
<th>
Name
</th>
<th>
EARFCN
</th>
<th>
Bandwidth
</th>
<th>
Physical ID
</th>
<th class="is-hidden-mobile">
RSRP
</th>
<th class="is-hidden-mobile">
RSRQ
</th>
<th class="is-hidden-mobile">
SINR
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
Smart
</td>
<td>
B1
</td>
<td>
150
</td>
<td>
10
</td>
<td>
623
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -103 </span>
<span class="tag is-danger is-size-6 has-text-white"> Poor </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -103 </span>
<span class="tag is-danger is-size-6 has-text-white"> Poor </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -5 </span>
<span class="tag is-danger is-size-6 has-text-white"> Poor </span>
</div>
</td>
</tr>
<tr>
<td>
DITO
</td>
<td>
B2
</td>
<td>
150
</td>
<td>
10
</td>
<td>
623
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -90 </span>
<span class="tag is-warning is-size-6 has-text-white"> Medium </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -90 </span>
<span class="tag is-warning is-size-6 has-text-white"> Medium </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> 10 </span>
<span class="tag is-warning is-size-6 has-text-white"> Medium </span>
</div>
</td>
</tr>
<tr>
<td>
Globe
</td>
<td>
B3
</td>
<td>
150
</td>
<td>
10
</td>
<td>
623
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -65 </span>
<span class="tag is-success is-size-6 has-text-white"> Strong </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -65 </span>
<span class="tag is-success is-size-6 has-text-white"> Strong </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> 30 </span>
<span class="tag is-success is-size-6 has-text-white"> Strong </span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="card-footer">
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Start Full Scan
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Reset
</a>
</div>
</div>
</div>
<div class="cell">
<div class="card">
<div class="card-header">
<div class="card-header-title">
Full Neighbour Cell Scanner
</div>
</div>
<div class="card-content">
<table class="table is-fullwidth">
<thead>
<tr>
<th>
Name
</th>
<th>
EARFCN
</th>
<th>
Bandwidth
</th>
<th>
Physical ID
</th>
<th class="is-hidden-mobile">
RSRP
</th>
<th class="is-hidden-mobile">
RSRQ
</th>
<th class="is-hidden-mobile">
SINR
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
B1
</td>
<td>
150
</td>
<td>
10
</td>
<td>
623
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -103 </span>
<span class="tag is-danger is-size-6 has-text-white"> Poor </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -103 </span>
<span class="tag is-danger is-size-6 has-text-white"> Poor </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -5 </span>
<span class="tag is-danger is-size-6 has-text-white"> Poor </span>
</div>
</td>
</tr>
<tr>
<td>
B2
</td>
<td>
150
</td>
<td>
10
</td>
<td>
623
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -90 </span>
<span class="tag is-warning is-size-6 has-text-white"> Medium </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -90 </span>
<span class="tag is-warning is-size-6 has-text-white"> Medium </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> 10 </span>
<span class="tag is-warning is-size-6 has-text-white"> Medium </span>
</div>
</td>
</tr>
<tr>
<td>
B3
</td>
<td>
150
</td>
<td>
10
</td>
<td>
623
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -65 </span>
<span class="tag is-success is-size-6 has-text-white"> Strong </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> -65 </span>
<span class="tag is-success is-size-6 has-text-white"> Strong </span>
</div>
</td>
<td class="is-hidden-mobile">
<div class="tags has-addons">
<span class="tag is-size-6"> 30 </span>
<span class="tag is-success is-size-6 has-text-white"> Strong </span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="card-footer">
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Start Neighbourcell Scan
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Reset
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="content">
<div class="fixed-grid has-2-cols has-1-cols-mobile">
<div class="grid">
<div class="cell">
<div class="icon-text">
<span class="icon has-text-info">
<i class="fas fa-info-circle"></i>
</span>
<span>Information</span>
</div>
<p class="block has-text-weight-semibold">
Full Network Provider Cell Scanner will scan all of the cells in your area even from other
network providers.
<br />
The NR-5G scan will only display SA bands available in your area.
<br />
Scanning will take a few minutes so please wait patiently.
<br />
If problem persists after scanning, please reboot the modem.
</p>
</div>
<div class="cell">
<div class="icon-text">
<span class="icon has-text-info">
<i class="fas fa-info-circle"></i>
</span>
<span>Information</span>
</div>
<p class="block has-text-weight-semibold">
Full Neighbour Cell Scanner will only scan the bands of your active network provider.
<br />
The NR-5G scan result is based on your current active 5G network mode.
<br />
If problem persists after scanning, please reboot the modem.
</p>
</div>
</div>
</div>
</div>
</footer>
</body>
</html>

378
www/cell-settings.html Normal file
View File

@@ -0,0 +1,378 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<!-- Logo -->
<link rel="simpleadmin-logo" href="favicon.ico" />
<link rel="stylesheet" href="css/bulma/bulma.scss">
<link rel="stylesheet" href="css/bulma/css/bulma.min.css">
<link rel="stylesheet" href="css/bulma/css/bulma.css">
<link rel="stylesheet" href="css/custom.css">
<!-- Font awesome icons -->
<script src="https://kit.fontawesome.com/b0caedfab3.js" crossorigin="anonymous"></script>
<script src="js/styles/nav-burger.js"></script>
<script src="js/styles/toggle-theme.js"></script>
<script defer src="/js/auth/auth.js"></script>
<script>
(function () {
const savedTheme = localStorage.getItem('theme') || 'theme-dark';
document.documentElement.classList.add(savedTheme);
})();
</script>
<title>QuecManager</title>
</head>
<body class="body-margin">
<nav class="navbar is-transparent">
<div class="navbar-brand">
<a class="navbar-item" href="/">
<img src="/assets/logo.png" alt="Logo" />
<span class="title">QuecManager</span>
</a>
<a
role="button"
class="navbar-burger"
aria-label="menu"
aria-expanded="false"
data-target="navMenu"
>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
<div id="navMenu" class="navbar-menu">
<div class="navbar-start ml-6">
<a class="navbar-item" href="/"> Home </a>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link"> Cellular </a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/bandlock.html"> Band Locking </a>
<a class="navbar-item" href="/cell-locking.html">Cell Locking</a>
<a class="navbar-item" href="/cell-scanner.html">Cell Scanner</a>
<a class="navbar-item" href="/cell-settings.html"
>Cell Settings</a
>
<a class="navbar-item" href="/cell-sms.html"> Cell SMS </a>
</div>
</div>
<a class="navbar-item" href="/advance-settings.html"> Advance </a>
<a class="navbar-item" href="/about.html"> About </a>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="buttons is-flex-direction-column-mobile">
<p class="control is-expanded-mobile">
<a
href="#"
class="button is-link is-outlined is-fullwidth-mobile"
>
<span class="icon">
<i class="fas fa-arrows-rotate"></i>
</span>
<span>Restart Connection</span>
</a>
</p>
<div class="is-flex is-mobile is-align-items-center">
<p class="control">
<a href="#" class="button is-warning is-outlined">
<span class="icon">
<i class="fas fa-power-off"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
>
<span class="icon">
<i class="fas fa-sun"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
id="logoutButton"
>
<span class="icon">
<i class="fas fa-right-from-bracket"></i>
</span>
</a>
</p>
</div>
</div>
</div>
</div>
</div>
</nav>
<div class="column-margin">
<div class="fixed-grid has-2-cols has-1-cols-mobile">
<div class="grid">
<div class="cell">
<div class="card">
<div class="card-header">
<div class="card-header-title">
Basic Cellular Settings
</div>
</div>
<div class="card-content">
<div class="fixed-grid has-2-cols">
<div class="grid is-gap-5">
<div class="cell">
<div class="field">
<label class="label">Current APN</label>
<div class="control">
<input class="input" type="text" placeholder="Current APN Here">
</div>
<p class="help">Changing this will disable automatic APN.</p>
</div>
</div>
<div class="cell">
<div class="field">
<label class="label">APN PDP Type</label>
<p class="control has-icons-left">
<span class="select">
<select>
<option selected>Select APN PDP Type</option>
<option>IPv4 Only</option>
<option>IPv6 Only</option>
<option>IPv4 and IPv6</option>
<option>P2P Protocol</option>
</select>
</span>
<span class="icon is-small is-left">
<i class="fas fa-globe"></i>
</span>
</p>
</div>
</div>
<div class="cell">
<div class="field">
<label class="label">Preferred Network Mode</label>
<p class="control has-icons-left">
<span class="select">
<select>
<option selected>Select Preferred Network Mode</option>
<option>Automatic</option>
<option>LTE Only</option>
<option>5G SA Only</option>
<option>5G NSA Only</option>
</select>
</span>
<span class="icon is-small is-left">
<i class="fas fa-signal"></i>
</span>
</p>
</div>
</div>
<div class="cell">
<div class="field">
<label class="label">NR5G Mode Control</label>
<p class="control has-icons-left">
<span class="select">
<select>
<option selected>Select NR5G Mode Control</option>
<option>Enable NR5G SA and NSA</option>
<option>Enable SA Only</option>
<option>Enable NSA Only</option>
</select>
</span>
<span class="icon is-small is-left">
<i class="fas fa-podcast"></i>
</span>
</p>
</div>
</div>
</div>
</div>
</div>
<div class="card-footer">
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Save
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Reset
</a>
</div>
</div>
</div>
<div class="cell">
<div class="card">
<div class="card-header">
<div class="card-header-title">
APN and ICCID Based Locking
</div>
</div>
<div class="card-content">
<div class="fixed-grid has-1-cols">
<div class="grid is-gap-5">
<div class="cell">
<div class="fixed-grid has-2-cols">
<div class="grid is-gap-3">
<div class="cell">
<div class="field">
<label class="label">APN Profile 1</label>
<div class="control">
<input class="input" type="text" placeholder="APN Here">
</div>
<p class="help">This will override the current APN.</p>
</div>
</div>
<div class="cell">
<div class="field">
<label class="label">APN PDP Type</label>
<p class="control has-icons-left">
<span class="select">
<select>
<option selected>Select APN PDP Type</option>
<option>IPv4 Only</option>
<option>IPv6 Only</option>
<option>IPv4 and IPv6</option>
<option>P2P Protocol</option>
</select>
</span>
<span class="icon is-small is-left">
<i class="fas fa-globe"></i>
</span>
</p>
</div>
</div>
<div class="cell is-col-span-2">
<div class="field">
<label class="label">ICCID Profile 1</label>
<div class="control">
<input class="input" type="text" placeholder="ICCID Here">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="cell">
<div class="fixed-grid has-2-cols">
<div class="grid is-gap-3">
<div class="cell">
<div class="field">
<label class="label">APN Profile 2</label>
<div class="control">
<input class="input" type="text" placeholder="APN Here">
</div>
<p class="help">This will override the current APN.</p>
</div>
</div>
<div class="cell">
<div class="field">
<label class="label">APN PDP Type</label>
<p class="control has-icons-left">
<span class="select">
<select>
<option selected>Select APN PDP Type</option>
<option>IPv4 Only</option>
<option>IPv6 Only</option>
<option>IPv4 and IPv6</option>
<option>P2P Protocol</option>
</select>
</span>
<span class="icon is-small is-left">
<i class="fas fa-globe"></i>
</span>
</p>
</div>
</div>
<div class="cell is-col-span-2">
<div class="field">
<label class="label">ICCID Profile 2</label>
<div class="control">
<input class="input" type="text" placeholder="ICCID Here">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="card-footer">
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Save
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Reset
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="content">
<div class="fixed-grid has-2-cols has-1-cols-mobile">
<div class="grid">
<div class="cell">
<div class="icon-text">
<span class="icon has-text-info">
<i class="fas fa-info-circle"></i>
</span>
<span>Information</span>
</div>
<p class="block has-text-weight-semibold">
Changing APN disconnects and reconnects the network automatically.
<br />
If problem persists after changing settings, please reboot the modem.
<br />
Please use the settings with caution.
</p>
</div>
<div class="cell">
<div class="icon-text">
<span class="icon has-text-info">
<i class="fas fa-info-circle"></i>
</span>
<span>Information</span>
</div>
<p class="block has-text-weight-semibold">
APN and ICCID Based Locking will use a stored APN profile based on the current SIM's ICCID.
<br />
Currently experimental.
<br />
</p>
</div>
</div>
</div>
</div>
</footer>
</body>
</html>

364
www/cell-sms.html Normal file
View File

@@ -0,0 +1,364 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<!-- Logo -->
<link rel="simpleadmin-logo" href="favicon.ico" />
<link rel="stylesheet" href="css/bulma/bulma.scss">
<link rel="stylesheet" href="css/bulma/css/bulma.min.css">
<link rel="stylesheet" href="css/bulma/css/bulma.css">
<link rel="stylesheet" href="css/custom.css">
<!-- Font awesome icons -->
<script src="https://kit.fontawesome.com/b0caedfab3.js" crossorigin="anonymous"></script>
<script src="js/styles/nav-burger.js"></script>
<script src="js/styles/toggle-theme.js"></script>
<script defer src="/js/auth/auth.js"></script>
<script>
(function () {
const savedTheme = localStorage.getItem('theme') || 'theme-dark';
document.documentElement.classList.add(savedTheme);
})();
</script>
<title>QuecManager</title>
</head>
<body class="body-margin">
<nav class="navbar is-transparent">
<div class="navbar-brand">
<a class="navbar-item" href="/">
<img src="/assets/logo.png" alt="Logo" />
<span class="title">QuecManager</span>
</a>
<a
role="button"
class="navbar-burger"
aria-label="menu"
aria-expanded="false"
data-target="navMenu"
>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
<div id="navMenu" class="navbar-menu">
<div class="navbar-start ml-6">
<a class="navbar-item" href="/"> Home </a>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link has-text-weight-bold"> Cellular </a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/bandlock.html"> Band Locking </a>
<a class="navbar-item" href="/cell-locking.html">Cell Locking</a>
<a class="navbar-item" href="/cell-scanner.html">Cell Scanner</a>
<a class="navbar-item" href="/cell-settings.html"
>Cell Settings</a
>
<a class="navbar-item" href="/cell-sms.html"> Cell SMS </a>
</div>
</div>
<a class="navbar-item" href="/advance-settings.html"> Advance </a>
<a class="navbar-item" href="/about.html"> About </a>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="buttons is-flex-direction-column-mobile">
<p class="control is-expanded-mobile">
<a
href="#"
class="button is-link is-outlined is-fullwidth-mobile"
>
<span class="icon">
<i class="fas fa-arrows-rotate"></i>
</span>
<span>Restart Connection</span>
</a>
</p>
<div class="is-flex is-mobile is-align-items-center">
<p class="control">
<a href="#" class="button is-warning is-outlined">
<span class="icon">
<i class="fas fa-power-off"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
>
<span class="icon">
<i class="fas fa-sun"></i>
</span>
</a>
</p>
<p class="control ml-2 is-mobile">
<a
href="#"
class="button is-warning is-outlined js-theme-toggle"
id="logoutButton"
>
<span class="icon">
<i class="fas fa-right-from-bracket"></i>
</span>
</a>
</p>
</div>
</div>
</div>
</div>
</div>
</nav>
<div class="column-margin">
<div class="fixed-grid has-1-cols">
<div class="grid is-gap-5">
<div class="cell">
<div class="card">
<div class="card-header">
<div class="card-header-title">
SMS Inbox
</div>
</div>
<div class="card-content">
<div class="fixed-grid has-1-cols" style="height: 450px; overflow-y: scroll;">
<div class="grid is-gap-4 is-fullwidth">
<div class="cell">
<div class="is-flex is-align-items-center">
<div class="checkbox mr-6">
<input type="checkbox">
</div>
<div class="is-flex is-flex-direction-column is-align-items-start">
<p class="has-text-weight-semibold">
Senders Name Here
</p>
<p>
2022-11-20 13:30:00
</p>
<p>
Message content here. Lorem ipsum dolor sit amet consectetur
adipisicing elit. Corrupti doloremque voluptatum velit repellendus
ipsum delectus blanditiis quis dolores. Maxime labore esse
laboriosam inventore error molestiae consequuntur quo, deleniti ea
nihil.
</p>
</div>
</div>
</div>
<div class="cell">
<div class="is-flex is-align-items-center">
<div class="checkbox mr-6">
<input type="checkbox">
</div>
<div class="is-flex is-flex-direction-column is-align-items-start">
<p class="has-text-weight-semibold">
Senders Name Here
</p>
<p>
2022-11-20 13:30:00
</p>
<p>
Message content here. Lorem ipsum dolor sit amet consectetur
adipisicing elit. Corrupti doloremque voluptatum velit repellendus
ipsum delectus blanditiis quis dolores. Maxime labore esse
laboriosam inventore error molestiae consequuntur quo, deleniti ea
nihil.
</p>
</div>
</div>
</div>
<div class="cell">
<div class="is-flex is-align-items-center">
<div class="checkbox mr-6">
<input type="checkbox">
</div>
<div class="is-flex is-flex-direction-column is-align-items-start">
<p class="has-text-weight-semibold">
Senders Name Here
</p>
<p>
2022-11-20 13:30:00
</p>
<p>
Message content here. Lorem ipsum dolor sit amet consectetur
adipisicing elit. Corrupti doloremque voluptatum velit repellendus
ipsum delectus blanditiis quis dolores. Maxime labore esse
laboriosam inventore error molestiae consequuntur quo, deleniti ea
nihil.
</p>
</div>
</div>
</div>
<div class="cell">
<div class="is-flex is-align-items-center">
<div class="checkbox mr-6">
<input type="checkbox">
</div>
<div class="is-flex is-flex-direction-column is-align-items-start">
<p class="has-text-weight-semibold">
Senders Name Here
</p>
<p>
2022-11-20 13:30:00
</p>
<p>
Message content here. Lorem ipsum dolor sit amet consectetur
adipisicing elit. Corrupti doloremque voluptatum velit repellendus
ipsum delectus blanditiis quis dolores. Maxime labore esse
laboriosam inventore error molestiae consequuntur quo, deleniti ea
nihil.
</p>
</div>
</div>
</div>
<div class="cell">
<div class="is-flex is-align-items-center">
<div class="checkbox mr-6">
<input type="checkbox">
</div>
<div class="is-flex is-flex-direction-column is-align-items-start">
<p class="has-text-weight-semibold">
Senders Name Here
</p>
<p>
2022-11-20 13:30:00
</p>
<p>
Message content here. Lorem ipsum dolor sit amet consectetur
adipisicing elit. Corrupti doloremque voluptatum velit repellendus
ipsum delectus blanditiis quis dolores. Maxime labore esse
laboriosam inventore error molestiae consequuntur quo, deleniti ea
nihil.
</p>
</div>
</div>
</div>
<div class="cell">
<div class="is-flex is-align-items-center">
<div class="checkbox mr-6">
<input type="checkbox">
</div>
<div class="is-flex is-flex-direction-column is-align-items-start">
<p class="has-text-weight-semibold">
Senders Name Here
</p>
<p>
2022-11-20 13:30:00
</p>
<p>
Message content here. Lorem ipsum dolor sit amet consectetur
adipisicing elit. Corrupti doloremque voluptatum velit repellendus
ipsum delectus blanditiis quis dolores. Maxime labore esse
laboriosam inventore error molestiae consequuntur quo, deleniti ea
nihil.
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="card-footer">
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Refresh
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Delete Selected
</a>
</div>
</div>
</div>
<div class="cell">
<div class="card">
<div class="card-header">
<div class="card-header-title">
Send SMS
</div>
</div>
<div class="card-content">
<div class="fixed-grid has-5-cols has-1-cols-mobile">
<div class="grid">
<div class="cell is-col-span-1">
<div class="field">
<label class="label">Receipient's Phone Number</label>
<div class="control has-icons-left">
<input class="input" type="text" placeholder="Input Phone Number">
<span class="icon is-small is-left">
<i class="fas fa-user"></i>
</span>
</div>
</div>
</div>
<div class="cell is-col-span-5 is-col-span-1-mobile">
<div class="field">
<label class="label">Message</label>
<div class="control">
<textarea class="textarea" placeholder="Textarea"></textarea>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="card-footer">
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Send SMS
</a>
<a href="#" class="card-footer-item has-text-link has-text-weight-semibold has-text-white">
Reset
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="content">
<div class="is-flex is-flex-direction-column is-align-items-center ">
<div class="has-text-centered">
<div class="icon-text">
<span class="icon has-text-info">
<i class="fas fa-info-circle"></i>
</span>
<span>Information</span>
</div>
<p class="block has-text-weight-semibold">
This is an experimental feature and may cause an error in some cases.
</p>
</div>
</div>
</div>
</footer>
</body>
</html>

View File

@@ -19,19 +19,25 @@ RAW_COMMAND=$(echo "$INPUT_DATA" | sed 's/command=//g')
# URL-decode the command # URL-decode the command
COMMAND=$(urldecode "$RAW_COMMAND") COMMAND=$(urldecode "$RAW_COMMAND")
# Save the command input to at_input.txt # Save the command input to a unique at_input file
echo "$COMMAND" > /tmp/at_input.txt AT_INPUT_FILE="/tmp/at_input_$$.txt"
echo "$COMMAND" > "$AT_INPUT_FILE"
# Define the input/output files and AT port # Define unique input/output files and AT port
INPUT_FILE="/tmp/input.txt" INPUT_FILE="/tmp/input_$$.txt"
OUTPUT_FILE="/tmp/output.txt" OUTPUT_FILE="/tmp/output_$$.txt"
AT_PORT="/dev/smd11" AT_PORT="/dev/smd11"
# Copy the user input to the input file # Ensure exclusive access to the AT port to avoid overloading smd11
cp /tmp/at_input.txt "$INPUT_FILE" (
flock -x 200
# Run the command using atinout # Copy the user input to the input file
atinout "$INPUT_FILE" "$AT_PORT" "$OUTPUT_FILE" cp "$AT_INPUT_FILE" "$INPUT_FILE"
# Run the command using atinout
atinout "$INPUT_FILE" "$AT_PORT" "$OUTPUT_FILE"
) 200>/tmp/atinout.lock
# Read the output from output.txt # Read the output from output.txt
OUTPUT=$(cat "$OUTPUT_FILE") OUTPUT=$(cat "$OUTPUT_FILE")
@@ -49,4 +55,7 @@ JSON_RESPONSE=$(printf "{\"command\":\"%s\",\"output\":\"%s\"}" "$ESCAPED_COMMAN
echo "$JSON_RESPONSE" >> /tmp/cgi_debug.log echo "$JSON_RESPONSE" >> /tmp/cgi_debug.log
# Return the output as a valid JSON response # Return the output as a valid JSON response
echo "$JSON_RESPONSE" echo "$JSON_RESPONSE"
# Clean up temporary files
rm "$AT_INPUT_FILE" "$INPUT_FILE" "$OUTPUT_FILE"

45
www/cgi-bin/auth.sh Normal file
View File

@@ -0,0 +1,45 @@
#!/bin/sh
# Set Content-Type for CGI script
echo "Content-type: application/json"
echo ""
# Read POST data
read POST_DATA
# Extract the password from POST data (URL encoded)
USER="root"
INPUT_PASSWORD=$(echo "$POST_DATA" | sed -n 's/^.*password=\([^&]*\).*$/\1/p')
# URL-decode the password (replace + with space and decode %XX)
INPUT_PASSWORD=$(echo "$INPUT_PASSWORD" | sed 's/+/ /g;s/%\(..\)/\\x\1/g' | xargs -0 printf "%b")
# Log received password for debugging (remove in production)
echo "Received password: $INPUT_PASSWORD" >&2
# Extract the hashed password from /etc/shadow for the specified user
USER_SHADOW_ENTRY=$(grep "^$USER:" /etc/shadow)
if [ -z "$USER_SHADOW_ENTRY" ]; then
echo '{"state":"failed", "message":"User not found"}'
exit 1
fi
# Extract the password hash (it's the second field, colon-separated)
USER_HASH=$(echo "$USER_SHADOW_ENTRY" | cut -d: -f2)
# Extract the salt (MD5 uses the $1$ prefix followed by the salt)
SALT=$(echo "$USER_HASH" | cut -d'$' -f3)
# Generate a hash from the input password using the same salt
GENERATED_HASH=$(echo "$INPUT_PASSWORD" | openssl passwd -1 -salt "$SALT" -stdin)
# Log generated hash for debugging
echo "Generated hash: $GENERATED_HASH" >&2
# Compare the generated hash with the one in the shadow file
if [ "$GENERATED_HASH" = "$USER_HASH" ]; then
echo '{"state":"success", "hashed_password":"'"$GENERATED_HASH"'"}'
else
echo '{"state":"failed", "hashed_password":"'"$GENERATED_HASH"'"}'
fi

14
www/cgi-bin/check_net.sh Normal file
View File

@@ -0,0 +1,14 @@
#!/bin/sh
# Set the content type to JSON
echo "Content-Type: application/json"
echo ""
# Ping 8.8.8.8 and capture the result
if ping -c 1 8.8.8.8 > /dev/null 2>&1; then
# Ping was successful
echo '{"connection": "ACTIVE"}'
else
# Ping failed
echo '{"connection": "INACTIVE"}'
fi

66
www/cgi-bin/home_data.sh Normal file
View File

@@ -0,0 +1,66 @@
#!/bin/sh
# Set content-type for JSON response
echo "Content-type: application/json"
echo ""
# Define the lock file
LOCK_FILE="/tmp/home_data.lock"
# Acquire the lock (wait if needed)
exec 200>$LOCK_FILE
flock -x 200
# Temporary files for input/output and AT port
INPUT_FILE="/tmp/input_$$.txt"
OUTPUT_FILE="/tmp/output_$$.txt"
AT_PORT="/dev/smd11"
# Debug file path
DEBUG_FILE="/tmp/debug-json-result.txt"
# Function to escape JSON strings (handling quotes and newlines)
escape_json() {
# Escape newlines and double quotes
echo "$1" | sed ':a;N;$!ba;s/\n/\\n/g; s/"/\\"/g'
}
# Initialize JSON response array
JSON_RESPONSE="["
# List of AT commands to run, one by one
for COMMAND in "AT+QUIMSLOT?" "AT+CNUM" "AT+COPS?" "AT+CIMI" "AT+ICCID" "AT+CGSN" "AT+CPIN?" "AT+CGCONTRDP" "AT+CREG?" "AT+CFUN?" "AT+QENG=\"servingcell\"" "AT+QTEMP" "AT+CGCONTRDP" "AT+QCAINFO" "AT+QRSRP" 'AT+QMAP="WWAN"'; do
# Write the command to the input file
echo "$COMMAND" > "$INPUT_FILE"
# Run the command using atinout
atinout "$INPUT_FILE" "$AT_PORT" "$OUTPUT_FILE"
# Read the output from the output file
OUTPUT=$(cat "$OUTPUT_FILE")
# Escape special characters for JSON (escape only output)
ESCAPED_OUTPUT=$(escape_json "$OUTPUT")
# Append the response as an object to the JSON response array
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
# Write the JSON response to the debug file for troubleshooting
echo "$JSON_RESPONSE" > "$DEBUG_FILE"
# Return the output as a valid JSON response
echo "$JSON_RESPONSE"
# Clean up temporary files
rm "$INPUT_FILE" "$OUTPUT_FILE"
# Release the lock
flock -u 200

View File

@@ -0,0 +1,16 @@
#!/bin/sh
echo "Content-type: application/json"
echo ""
# Get RX and TX bytes from ifconfig eth0
data=$(ifconfig eth0 | grep "RX bytes")
# Extract download (RX) and upload (TX) values using awk
download=$(echo $data | awk '{print $2}' | cut -d':' -f2)
upload=$(echo $data | awk '{print $6}' | cut -d':' -f2)
# Return JSON response
echo "{"
echo " \"download\": \"$download\","
echo " \"upload\": \"$upload\""
echo "}"

View File

@@ -1,5 +1,13 @@
/* */ /* */
/* import Poppins font */
@import url('https://fonts.googleapis.com/css2?family=Euclid+Flex:wght@400;500;600;700&display=swap');
/* use Poppins everywhere */
* {
font-family: 'Poppins', sans-serif;
}
html { html {
visibility: hidden; visibility: hidden;
} }
@@ -27,12 +35,33 @@ html.theme-light {
border: 0; border: 0;
} }
/* .font-is-semibold { .cell {
font-weight: 600; display: grid;
} */ height: 100%;
}
/* .content-end { #handleRefreshClickButton {
display: flex; cursor: pointer;
justify-content: flex-end; }
align-items: center;
} */ #handleRefreshClickButton:disabled {
cursor: wait;
opacity: 0.7;
}
.fa-spin {
animation: fa-spin 2s infinite linear;
}
@keyframes fa-spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
#dataConnState .tag {
transition: all 0.3s ease-in-out;
}

BIN
www/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -1,93 +1,108 @@
document.addEventListener('DOMContentLoaded', () => { document.addEventListener("DOMContentLoaded", () => {
// Function to generate a random token // Function to generate a random token
function generateAuthToken(length = 32) { function generateAuthToken(length = 32) {
const charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; const charset =
let token = ''; "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for (let i = 0; i < length; i++) { let token = "";
const randomIndex = Math.floor(Math.random() * charset.length); for (let i = 0; i < length; i++) {
token += charset[randomIndex]; const randomIndex = Math.floor(Math.random() * charset.length);
} token += charset[randomIndex];
return token; }
return token;
} }
// Initially hide the body to prevent content from flashing // Initially hide the body to prevent content from flashing
document.body.style.display = 'none'; document.body.style.display = "none";
// Check if the user is already logged in // Check if the user is already logged in
const authToken = localStorage.getItem('authToken'); const authToken = localStorage.getItem("authToken");
// Define which pages should be protected // Define which pages should be protected
const protectedPages = [ const protectedPages = [
'/home.html', "/home.html",
'advance-settings.html', "advance-settings.html",
'/bandlock.html', "/bandlock.html",
'/cell-locking.html', "/cell-locking.html",
'/cell-scanner.html', "/cell-scanner.html",
'/cell-settings.html', "/cell-settings.html",
'/cell-sms.html', "/cell-sms.html",
'/about.html', // Add all the protected HTML pages here "/about.html", // Add all the protected HTML pages here
]; ];
const currentPage = window.location.pathname; const currentPage = window.location.pathname;
// If the user is not logged in and tries to access a protected page, redirect to login // If the user is not logged in and tries to access a protected page, redirect to login
if (!authToken && protectedPages.includes(currentPage)) { if (!authToken && protectedPages.includes(currentPage)) {
window.location.href = 'index.html'; window.location.href = "index.html";
} else { } else {
// Show the page if authentication is successful or not required // Show the page if authentication is successful or not required
document.body.style.display = ''; document.body.style.display = "";
} }
// If the user is logged in and tries to access the login page, redirect to home // If the user is logged in and tries to access the login page, redirect to home
if (authToken && currentPage.includes('index.html')) { if (authToken && currentPage.includes("index.html")) {
window.location.href = 'home.html'; window.location.href = "home.html";
} }
// Login form logic (only for login page) // Login form logic (only for login page)
const loginForm = document.getElementById('loginForm'); const loginForm = document.getElementById("loginForm");
if (loginForm) { if (loginForm) {
loginForm.addEventListener('submit', (e) => { loginForm.addEventListener("submit", async (e) => {
e.preventDefault(); e.preventDefault();
const username = document.getElementById('username').value; const username = document.getElementById("username").value;
const password = document.getElementById('password').value; const password = document.getElementById("password").value;
const errorElement = document.getElementById('error'); const errorElement = document.getElementById("error");
const validUsername = 'admin'; // Hardcoded credentials for demo purposes try {
const validPassword = 'password123'; const formData = new URLSearchParams();
formData.append("username", username);
// Authenticate user formData.append("password", encodeURIComponent(password)); // URL-encode the password
if (username === validUsername && password === validPassword) {
// Generate a random token const response = await fetch("/cgi-bin/auth.sh", {
const newToken = generateAuthToken(); method: "POST",
localStorage.setItem('authToken', newToken); // Store the generated token body: formData,
headers: {
// Redirect to home after successful login "Content-Type": "application/x-www-form-urlencoded",
window.location.href = 'home.html'; },
} else { });
errorElement.textContent = 'Invalid username or password';
} const result = await response.json(); // Parse JSON response
});
} if (result.state === "success") {
const newToken = generateAuthToken();
// Logout button logic (only for pages that have the logout button) localStorage.setItem("authToken", newToken); // Store the token
const logoutButton = document.getElementById('logoutButton'); window.location.href = "home.html"; // Redirect on success
if (logoutButton) { } else {
logoutButton.addEventListener('click', () => { document.getElementById("error").textContent =
localStorage.removeItem('authToken'); // Remove token "Invalid username or password";
window.location.href = 'index.html'; // Redirect to login console.log("Invalid username or password");
}); }
} } catch (error) {
// Handle any errors (e.g., network issues)
// Fix for the issue of being redirected to login every time the Home button is clicked errorElement.textContent = "An error occurred. Please try again later.";
document.querySelectorAll('.navbar-item').forEach(el => {
if (el.textContent.includes('Home')) {
el.addEventListener('click', e => {
if (localStorage.getItem('authToken')) {
e.preventDefault();
window.location.href = 'home.html';
}
});
} }
});
}
// Logout button logic (only for pages that have the logout button)
const logoutButton = document.getElementById("logoutButton");
if (logoutButton) {
logoutButton.addEventListener("click", () => {
localStorage.removeItem("authToken"); // Remove token
window.location.href = "index.html"; // Redirect to login
});
}
// Fix for the issue of being redirected to login every time the Home button is clicked
document.querySelectorAll(".navbar-item").forEach((el) => {
if (el.textContent.includes("Home")) {
el.addEventListener("click", (e) => {
if (localStorage.getItem("authToken")) {
e.preventDefault();
window.location.href = "home.html";
}
});
}
}); });
}); });

1047
www/js/home/main.js Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,20 +1,17 @@
document.addEventListener("DOMContentLoaded", () => { document.addEventListener('DOMContentLoaded', () => {
// Get all "navbar-burger" elements // Get all "navbar-burger" elements
const $navbarBurgers = Array.prototype.slice.call( const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
document.querySelectorAll(".navbar-burger"),
0
);
// Add a click event on each of them // Add a click event on each of them
$navbarBurgers.forEach((el) => { $navbarBurgers.forEach(el => {
el.addEventListener("click", () => { el.addEventListener('click', () => {
// Get the target from the "data-target" attribute // Get the target from the "data-target" attribute
const target = el.dataset.target; const target = el.dataset.target;
const $target = document.getElementById(target); const $target = document.getElementById(target);
// Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu" // Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
el.classList.toggle("is-active"); el.classList.toggle('is-active');
$target.classList.toggle("is-active"); $target.classList.toggle('is-active');
}); });
}); });
}); });