On demand import functionality, held together with ductape and bubblegum.

This commit is contained in:
th3r00t
2020-09-02 17:42:08 -04:00
parent 938ef39821
commit 85fa88dcb0
6 changed files with 91 additions and 99 deletions

View File

@@ -1,3 +1,13 @@
async function WebSocketInterface(host) {
let socket = new WebSocket(host)
socket.onopen = function(e) { console.log('Connected') }
socket.onmessage = function (rcvd){
rx_msg(rcvd.data)
}}
async function rx_msg(rcvd) { console.log('msg :: '+rcvd) }
async function tx_msg(socket, msg) { socket.send(msg) }
$(document).ready(function(){
function customlog(outstream) {
/* Gather my variables and output them */
@@ -171,16 +181,9 @@ $(document).ready(function(){
$('#pop_over_0').dialog("open");
});
$(document).on('click', '.logout-btn', function(){window.location.href = '/logout'});
//Web Socket Call
$(document).on('click', '.import-btn', async function(){
$.ajax({
type: "GET", url: "/live", data: {hook: 'import_books'},
success: function (response) {
},
error: function (response) {
customlog(["Failure", response]);
}
});
let connection = await ImportBooks(server);
popover.html('<div id="psout" class="container">');
let psout = $('#psout')
psout.append('<div class="rox"><div class="col import_status">Importing Books</div></div>')
@@ -192,6 +195,16 @@ $(document).ready(function(){
value: false
});
$(".progressbar").append("</div>")
$.ajax({
type: "GET", url: "/live", data: {hook: 'import_books'},
success: async function (response,sock) {
customlog(["Backend Reports websocket server READY"])
$('.progressbar').progressbar({ value: true })
},
error: function (response) {
customlog(["Failure", response.data]);
}
});
});
$('#coll_button').on('click', function(){
var isopen = $('#pop_over_0').dialog("isOpen");
@@ -285,59 +298,3 @@ function resize_search(win_width){
$('.search_string').val("Search");
}
}
function OpenSocket(address) {
return new Promise(resolve => {
const connection = new WebSocket(address);
connection.onopen = function(e){
console.log('--[ Connection Established ]')
ping(connection)
};
connection.onmessage = function(rcvd){
sock_rx(rcvd)
};
resolve(connection);
});
}
function ImportBooks(address) {
return new Promise(resolve => {
const connection = new WebSocket(address);
connection.onopen = function(e){
sock_tx(connection,'importBooks')
};
connection.onmessage = function(rcvd){
sock_rx(rcvd)
};
resolve(connection);
});
}
async function PyshelfServer(address){
console.log("--[ Starting Connection ]")
return await OpenSocket(address)
}
function sock_rx(rcvd) {
if (rcvd.data == 'pong') { pong(rcvd) }
else if (rcvd.data == 'complete') {
$('.progressbar').progressbar("option", "value", "True");
$('.import_status').html('Import Complete')
console.log(rcvd.data)
}
else { console.log("<<[rx] :"+rcvd.data) }
}
function sock_tx(connection, msg) {
connection.send(msg);
}
function sock_status(connection) {
let buffered = connection.bufferedAmmount;
let ready = connection.readyState;
return [buffered, ready];
}
function ping(connection) {
connection.send('ping');
console.log("[ping]>>");
}
function pong(rcvd) {
console.log("<<["+rcvd+"]")
}

View File

@@ -7,6 +7,7 @@ import time
from base64 import b64decode, b64encode
from pathlib import Path
import websockets
from backend.lib.config import Config
from backend.lib.pyShelf import Server
from django.conf import settings
@@ -384,7 +385,7 @@ def collections_list():
return list(set(collection_key))
def live(request, **kwargs):
async def live(request, **kwargs):
"""
Respond to live requests. Primarily used as a response object for Ajax calls
:param GET['hook']: collection_listing, book_details, register
@@ -411,33 +412,53 @@ def live(request, **kwargs):
return JsonResponse({"data": html})
elif hook == "import_books":
"""TODO: Spawn websocket server"""
breakpoint()
###################################################
# async def responder(socket): #
# await catalogue.import_books(socket=socket) #
# return JsonResponse({"data": None}) #
# pass #
# asyncio.run(responder(None)) #
###################################################
def test_connection(host):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(host)
s.sendall(b"ping")
data = s.recv(1024)
return data
_test_count = 0
await Server(Path.absolute(Path.cwd().parent)).start()
await asyncio.sleep(1)
async def test_connection(host, counter):
async with websockets.connect(f'ws://{host[0]}:{host[1]}') as _s:
await _s.send("ping")
data = await _s.recv()
counter = counter + 1
if data == "pong":
return True
else:
return False
async def runImport(host):
async with websockets.connect(f'ws://{host[0]}:{host[1]}') as _s:
await _s.send("importBooks")
data = await _s.recv()
if data == "complete":
return JsonResponse({"data": data})
else:
return False
_host = ("127.0.0.1", 1337)
_test_count = 0
try:
_server_response = test_connection(_host)
if await test_connection(_host, _test_count):
config.logger.info("Connection Successful")
await runImport(_host)
return JsonResponse({"data": "Response sent"}, status=200)
except ConnectionRefusedError as e:
config.logger.info(e)
if e.errno == 111:
request.server = Server(Path.absolute(Path.cwd().parent)).start()
await Server(Path.absolute(Path.cwd().parent)).start()
if await test_connection(_host, _test_count):
return JsonResponse({"data": "Response sent"}, status=200)
elif not await test_connection(_host, _test_count) & _test_count >=4:
await Server(Path.absolute(Path.cwd().parent)).start()
await test_connection(_host, _test_count)
else:
return JsonResponse({"data": "Websocket Failed Testing"}, status=401)
else: return JsonResponse(err_txt, status=404)
return JsonResponse({"data": "Response sent"}, status=200)
def book_details(book):
return {
'title': book.title,