fetch("/set?latency=" + document.getElementById("latencyRange").value + "&ploss=" + document.getElementById("plossRange").value + "&throughput=" + document.getElementById("tpRange").value);
}
+ async function checkForUpdates() {
+ const updateAvailable = await fetch("/checkupdate");\r
+ if (await updateAvailable.text() == "0") {\r
+ document.getElementById("updateStatus").innerHTML = "Up to date.";\r
+ } else {\r
+ document.getElementById("updateStatus").innerHTML = "An update is available.";\r
+ document.getElementById("updateButton").style.display = "";\r
+ }\r
+ }
+
+ async function runUpdate() {
+ document.getElementById("updateStatus").innerHTML = "Updating...";
+ document.getElementById("updateButton").style.display = "none";
+ const updateAvailable = await fetch("/runupdate");\r
+ location.reload();\r
+ }
+
function loadPresets() {
let innerhtml = "";
for (type in presets) {
</head>
<body onload="loadPresets();">
<select id="preset" onchange="changePreset();">
-
</select>
-<div class="slidecontainer">
- Latency<br />
- <input type="range" min="0" max="1000" style="width:400px;" value="0" class="slider" id="latencyRange" oninput="document.getElementById('latency').innerHTML = this.value;"> <span id="latency">0</span> ms
-</div>
-<div class="slidecontainer">
- Packet Loss<br />
- <input type="range" min="0" max="95" style="width:400px;" value="0" class="slider" id="plossRange" oninput="document.getElementById('ploss').innerHTML = this.value;"> <span id="ploss">0</span> %
-</div>
-<div class="slidecontainer">
- Throughput Limitation (0 for unlimited)<br />
- <input type="range" min="0" max="20000" style="width:400px;" value="0" class="slider" id="tpRange" oninput="document.getElementById('tp').innerHTML = this.value;"> <span id="tp">0</span> kb/s
-</div>
-<button onclick="saveSettings();">Save Settings</button>
+ <div class="slidecontainer">
+ Latency<br />
+ <input type="range" min="0" max="1000" style="width:400px;" value="0" class="slider" id="latencyRange" oninput="document.getElementById('latency').innerHTML = this.value;"> <span id="latency">0</span> ms
+ </div>
+ <div class="slidecontainer">
+ Packet Loss<br />
+ <input type="range" min="0" max="95" style="width:400px;" value="0" class="slider" id="plossRange" oninput="document.getElementById('ploss').innerHTML = this.value;"> <span id="ploss">0</span> %
+ </div>
+ <div class="slidecontainer">
+ Throughput Limitation (0 for unlimited)<br />
+ <input type="range" min="0" max="20000" style="width:400px;" value="0" class="slider" id="tpRange" oninput="document.getElementById('tp').innerHTML = this.value;"> <span id="tp">0</span> kb/s
+ </div>
+ <button onclick="saveSettings();">Save Settings</button>
+ <button onclick="checkForUpdates();">Check for Updates</button>
+ <div id="updateStatus"></div>
+ <button onclick="runUpdate();" style="display:none;" id="updateButton">Update PiThrottler</button>
</body>
</html>
\ No newline at end of file
const app = (req, res) => {
console.log(new Date(), req.url);
+ if (req.url.startsWith("/checkupdate")) {
+ res.statusCode = 200;
+ res.setHeader('Content-Type', 'text/plain');
+ res.setHeader('Access-Control-Allow-Origin', '*');
+
+ exec('git ls-remote -q origin master', function (error, stdout, stderr) {
+ let remoteRevision = stdout.substring(0, 40);
+ exec('git rev-parse HEAD', function (error, stdout, stderr) {
+ console.log(remoteRevision);
+ console.log(stdout);
+ if (remoteRevision != stdout) {
+ res.end("1");\r
+ } else {
+ res.end("0");\r
+ }
+ });
+ });
+ return;
+ }
+
+ if (req.url.startsWith("/runupdate")) {
+ res.statusCode = 200;
+ res.setHeader('Content-Type', 'text/plain');
+ res.setHeader('Access-Control-Allow-Origin', '*');
+
+ exec('./install.sh', function (error, stdout, stderr) {
+ res.end("Done");\r
+ });
+ return;
+ }
+
if (req.url.startsWith("/set")) {
let searchParams = new URL("http://localhost:2121" + req.url).searchParams;