Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Multiboot pi + recovery or update partition #146

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .companion.rc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
4 changes: 4 additions & 0 deletions br-webui/_includes/header.liquid
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
function shutdown() {
socket.emit('shutdown');
}
function recovery() {
socket.emit('recovery');
}
socket.on('companion version', function(data) {
document.getElementById('companion version1').innerHTML = data;
console.log('got version in header')
Expand Down Expand Up @@ -52,6 +55,7 @@
<form class="navbar-form navbar-right">
<button onclick="reboot()" class="btn btn-primary btn-sm navbar-btn">Reboot</button>
<button onclick="shutdown()" class="btn btn-error btn-sm navbar-btn">Shutdown</button>
<button onclick="recovery()" class="btn btn-error btn-sm navbar-btn">Update</button>
</form>
</div><!--/.nav-collapse -->
</div>
Expand Down
6 changes: 6 additions & 0 deletions br-webui/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -1621,6 +1621,12 @@ io.on('connection', function(socket) {
logger.log(stdout + stderr);
});
});
socket.on('recovery', function(data) {
logger.log('recovery');
child_process.exec(home_dir+'/companion/scripts/rebootrecovery.sh', function (error, stdout, stderr) {
logger.log(stdout+stderr);
});
});

var uploader = new SocketIOFile(socket, {
// uploadDir: { // multiple directories
Expand Down
68 changes: 68 additions & 0 deletions br-webui/recovery-client/app.js
Original file line number Diff line number Diff line change
@@ -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;
}
});


30 changes: 30 additions & 0 deletions br-webui/recovery-client/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<html>
<head>
<meta charset="UTF-8">
<title>Companion Recovery Server</title>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<h1>Companion Recovery Server</h1>
<hr>
<div id="First">
Select an appropriate ".lrz" file to update Companion
</div><hr>
<div>
<form id="form">
<input type="file" id="file"/>
<input id= "submit-button" type="submit" class="button" value= "Upload" />
</form>
<div id="update-div">
<button id="update-button" onclick='updateNew()'> Update </button>
</div>
<div id="textarea1">
<textarea rows="30" cols="90" id="terminal-output" class="dynamic-parent-width" readonly></textarea>
</div>
</div>

<script src="socket.io.js"></script>
<script src="socket.io-file-client.js"></script>
<script src="app.js"></script>
</body>
</html>
93 changes: 93 additions & 0 deletions br-webui/recovery-client/styles.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<!-- CSS file for Companion Recovery Server -->

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;
}


<!-- Styles that are divs start with a # sign -->
<!-- Styles that are classes start with a . -->



79 changes: 79 additions & 0 deletions br-webui/recovery-server.js
Original file line number Diff line number Diff line change
@@ -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");
});
});

9 changes: 9 additions & 0 deletions scripts/rebootrecovery.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/bin/bash

#Replace the companion partition number with Recovery partition number in /boot/cmdline.txt
#Enables booting into the Recovery partition and accessing the Recovery server.

sudo -H -u root bash -c "sed -i -e 's/\-04/\-02/' /boot/cmdline.txt"

#Reboot into Recovery partition
sudo reboot now
4 changes: 4 additions & 0 deletions scripts/start-recovery-server.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/bash

cd /home/pi/companion/br-webui
node recovery-server.js