From 384c5d2c02a744318808ee5cdcdc60d0c128d3d7 Mon Sep 17 00:00:00 2001 From: mariyachanniwala Date: Fri, 10 Aug 2018 20:21:56 +0000 Subject: [PATCH] Added Companion Recovery Server --- .companion.rc | 6 ++ br-webui/recovery-client/app.js | 68 +++++++++++++++++++++ br-webui/recovery-client/index.html | 30 ++++++++++ br-webui/recovery-client/styles.css | 93 +++++++++++++++++++++++++++++ br-webui/recovery-server.js | 79 ++++++++++++++++++++++++ scripts/start-recovery-server.sh | 4 ++ 6 files changed, 280 insertions(+) create mode 100644 br-webui/recovery-client/app.js create mode 100644 br-webui/recovery-client/index.html create mode 100644 br-webui/recovery-client/styles.css create mode 100644 br-webui/recovery-server.js create mode 100755 scripts/start-recovery-server.sh diff --git a/.companion.rc b/.companion.rc index 5bd3f70d..ac6e9a9d 100755 --- a/.companion.rc +++ b/.companion.rc @@ -13,6 +13,11 @@ for default_param_file in *; do done if [ ! -f /home/pi/.updating ]; then + sudo python $COMPANION_DIR/tools/PingEnumerator.py || true + if [ -d /dev/serial/ping ]; then + sudo -H -u pi screen -dm -S pingproxy python -m Ping/PingProxy --device $(ls -d /dev/serial/ping/* | head -1) + sudo -H -u pi screen -dm -S pingmav python $COMPANION_DIR/tools/Ping1DMavlinkDriver.py + fi sudo -H -u pi screen -dm -S mavproxy $COMPANION_DIR/tools/telem.py sudo -H -u pi screen -dm -S video $COMPANION_DIR/tools/streamer.py sudo -H -u pi screen -dm -S webui $COMPANION_DIR/scripts/start_webui.sh @@ -22,6 +27,7 @@ if [ ! -f /home/pi/.updating ]; then sudo -H -u pi screen -dm -S file-manager node --harmony $COMPANION_DIR/br-webui/node_modules/node-file-manager/lib/index.js -p 7777 -d / sudo -H -u pi screen -dm -S nmearx $COMPANION_DIR/tools/nmea-receiver.py sudo -H -u pi screen -dm -S wldriver $COMPANION_DIR/tools/underwater-gps.py --ip=192.168.2.94 --port=80 + sudo -H -u pi screen -dm -S recovery $COMPANION_DIR/scripts/start-recovery-server.sh else sudo -H -u pi echo 'UPDATE FAILED!' >> /home/pi/.update_log rm -f /home/pi/.updating diff --git a/br-webui/recovery-client/app.js b/br-webui/recovery-client/app.js new file mode 100644 index 00000000..0c7015e5 --- /dev/null +++ b/br-webui/recovery-client/app.js @@ -0,0 +1,68 @@ +var socket = io(); +var uploader = new SocketIOFileClient(socket); +var form = document.getElementById('form'); + +uploader.on('ready', function() { + console.log('SocketIOFile ready to go!'); +}); +uploader.on('loadstart', function() { + console.log('Loading file to browser before sending...'); +}); +uploader.on('progress', function(progress) { + console.log('Loaded ' + progress.loaded + ' / ' + progress.total); +}); +uploader.on('start', function(fileInfo) { + console.log('Start uploading', fileInfo); +}); +uploader.on('stream', function(fileInfo) { + console.log('Streaming... sent ' + fileInfo.sent + ' bytes.'); +}); +uploader.on('complete', function(fileInfo) { + console.log('Upload Complete', fileInfo); +}); +uploader.on('error', function(err) { + console.log('Error!', err); +}); +uploader.on('abort', function(fileInfo) { + console.log('Aborted: ', fileInfo); +}); + +form.onsubmit = function(ev) { + ev.preventDefault(); + + // Send File Element to upload + var fileEl = document.getElementById('file'); + // var uploadIds = uploader.upload(fileEl); + + // Or just pass file objects directly + var uploadIds = uploader.upload(fileEl.files); +}; + +function updateNew() { + console.log("Update button pressed"); +}; + +socket.on('terminal output', function(data) { + var terminalEl = document.getElementById("terminal-output"); + var html = terminalEl.innerHTML + data; + var autoscroll = terminalEl.scrollHeight - terminalEl.scrollTop + === terminalEl.clientHeight; + terminalEl.innerHTML = html.replace(/\n.*?\r/g, "\n"); + if (autoscroll) { + terminalEl.scrollTop = terminalEl.scrollHeight; + } +}); + +socket.on('terminal-output', function(data) { + var terminalEl = document.getElementById("terminal-output"); + var html = terminalEl.innerHTML + data; + var autoscroll = terminalEl.scrollHeight - terminalEl.scrollTop + === terminalEl.clientHeight; + //terminalEl.innerHTML = html; + terminalEl.innerHTML = html.replace(/\n.*?\r/g, "\n"); + if (autoscroll) { + terminalEl.scrollTop = terminalEl.scrollHeight; + } +}); + + diff --git a/br-webui/recovery-client/index.html b/br-webui/recovery-client/index.html new file mode 100644 index 00000000..f6ad0a18 --- /dev/null +++ b/br-webui/recovery-client/index.html @@ -0,0 +1,30 @@ + + + + Companion Recovery Server + + + +

Companion Recovery Server

+
+
+ Select an appropriate ".lrz" file to update Companion +

+
+
+ + +
+
+ +
+
+ +
+
+ + + + + + diff --git a/br-webui/recovery-client/styles.css b/br-webui/recovery-client/styles.css new file mode 100644 index 00000000..83fdb2ec --- /dev/null +++ b/br-webui/recovery-client/styles.css @@ -0,0 +1,93 @@ + + +html, body { + height: 100%; +} + +html { + padding-top: 85px; + padding-bottom: 90px; + display: table; + margin: auto; +} + +body { + border: medium solid grey; + margin-top: 100px; + margin-left: 600px; + margin-right: 600px; + margin-bottom: 100px; + border-radius: 10px; + display: table-cell; + vertical-align: middle; +} + +h1 { + font-family: verdana; + font-size: 1.5em; + text-align: center; + padding: 20px; + padding-top: 30px; +} + +hr { + text-align: center; + width: 80%; +} + +#First { + font-size: 14pt; + font-family: verdana; + color: #2699d0; + padding: 10px; + text-align: center; +} + +form { + padding: 20px; + text-align: center; + padding-bottom: 10px; +} + +textarea { + + font-family: verdana; + resize: vertical; + border-radius: 10px; +} + +#textarea1 { + margin-left: 30px; + margin-right: 30px; + padding-bottom: 30px; +} + +#submit-button { + border-radius: 5px; + background-color: #2699d0; + border: thin solid #2699d0; + color: #ffffff; + width: 80px; + height: 30px; +} + +#update-button { + border-radius: 5px; + background-color: #bbbbbb; + border: thin solid #bbbbbb; + color: #000000; + width: 80px; + height: 30px; +} + +#update-div { + padding-bottom: 20px; + text-align: center; +} + + + + + + + diff --git a/br-webui/recovery-server.js b/br-webui/recovery-server.js new file mode 100644 index 00000000..b103c10e --- /dev/null +++ b/br-webui/recovery-server.js @@ -0,0 +1,79 @@ +const express = require('express'); +const app = express(); +const SocketIOFile = require('socket.io-file'); + +var server = app.listen(3000, function() { + console.log("Server running successfully on Port:3000"); +}); +var io = require('socket.io')(server); + +app.get('/', (req, res, next) => { + return res.sendFile(__dirname + '/recovery-client/index.html'); +}); + +app.get('/app.js', (req, res, next) => { + return res.sendFile(__dirname + '/recovery-client/app.js'); +}); + +app.get('/socket.io.js', (req, res, next) => { + return res.sendFile(__dirname + '/node_modules/socket.io-client/dist/socket.io.js'); +}); + +app.get('/socket.io-file-client.js', (req, res, next) => { + return res.sendFile(__dirname + '/node_modules/socket.io-file-client/socket.io-file-client.js'); +}); + +app.get('/styles.css', (req,res,next) => { + return res.sendFile(__dirname + '/recovery-client/styles.css'); // redirect CSS bootstrap +}); + + +io.on('connection', function(socket) { + console.log('Socket connected.'); + + var count = 0; + var uploader = new SocketIOFile(socket, { + // uploadDir: { // multiple directories + // music: 'data/music', + // document: 'data/document' + // }, + uploadDir: '/mnt/Imagefile', // simple directory + // accepts: ['application/octet-stream'], // chrome and some of browsers checking mp3 as 'audio/mp3', not 'audio/mpeg' + // maxFileSize: 4294967296, // 4 GB. default is undefined(no limit) + chunkSize: 26214400, // default is 10240(1KB) 94371840 52428800 + transmissionDelay: 0, // delay of each transmission, higher value saves more cpu resources, lower upload speed. default is 0(no delay) + overwrite: false, // overwrite file if exists, default is true. + /*rename: function(filename) { + var split = filename.split('.'); // split filename by .(extension) + var fname = split[0]; // filename without extension + var ext = split[1]; + + return `${fname}_${count++}.${ext}`; + }*/ + }); + uploader.on('start', (fileInfo) => { + console.log('Start uploading'); + console.log(fileInfo); + socket.emit('terminal output', "\n" + "Start Uploading" + "\n" + "\n"); + socket.emit('terminal output', JSON.stringify(fileInfo, null, 2) + '\n' + '\n'); + }); + uploader.on('stream', (fileInfo) => { + console.log(`${fileInfo.wrote} / ${fileInfo.size} byte(s)`); + socket.emit('terminal-output', '\r' + "Progress --> " + Math.round(fileInfo.wrote / fileInfo.size * 100) + " %"); + }); + uploader.on('complete', (fileInfo) => { + console.log('Upload Complete.'); + console.log(fileInfo); + socket.emit('terminal output', "\n" + "\n" + "Upload Complete" + "\n"); + socket.emit('terminal output', '\n' + JSON.stringify(fileInfo, null, 2) + '\n'); + }); + uploader.on('error', (err) => { + console.log('Error!', err); + socket.emit('terminal output', "\n" + err + "\n"); + }); + uploader.on('abort', (fileInfo) => { + console.log('Aborted: ', fileInfo); + socket.emit('terminal output', "\n" + JSON.stringify(fileInfo, null, 2) + "\n"); + }); +}); + diff --git a/scripts/start-recovery-server.sh b/scripts/start-recovery-server.sh new file mode 100755 index 00000000..22256c4a --- /dev/null +++ b/scripts/start-recovery-server.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +cd /home/pi/companion/br-webui +node recovery-server.js