From 506047ca5c7487facd8b8374c0b435da45cb3f60 Mon Sep 17 00:00:00 2001 From: Untriex Programming Date: Thu, 15 Apr 2021 14:56:49 +0200 Subject: [PATCH] update --- server/engine.py | 13 +-- server/files/PQ.apk | 0 server/files/sample.pdf | 198 ++++++++++++++++++++++++++++++++++++++++ server/files/test.png | Bin 0 -> 77476 bytes server/filesystem.json | 6 +- server/log.txt | 160 +++++++++++++++++++++++++++++++- server/main.py | 44 +++++---- server/settings.json | 4 +- server/system.py | 23 ++--- server/test.py | 24 ----- 10 files changed, 404 insertions(+), 68 deletions(-) create mode 100644 server/files/PQ.apk create mode 100644 server/files/sample.pdf create mode 100644 server/files/test.png diff --git a/server/engine.py b/server/engine.py index 83f986d..53bbb57 100644 --- a/server/engine.py +++ b/server/engine.py @@ -22,21 +22,21 @@ class Log: if self.print_error: print(f"{datetime.now()} -> ERROR: {error}") if self.save_error: - with open("log.txt", "a") as file: + with open("log.txt", "a", encoding='utf-8') as file: file.write(f"\n{datetime.now()} -> ERROR: {error}") def warning(self, warning): if self.print_warning: print(f"{datetime.now()} -> Warning: {warning}") if self.save_warning: - with open("log.txt", "a") as file: + with open("log.txt", "a", encoding='utf-8') as file: file.write(f"\n{datetime.now()} -> Warning: {warning}") def message(self, message): if self.print_messages: print(f"{datetime.now()} -> message: {message}") if self.save_messages: - with open("log.txt", "a") as file: + with open("log.txt", "a", encoding='utf-8') as file: file.write(f"\n{datetime.now()} -> message: {message}") def debug(self, debug): @@ -46,7 +46,7 @@ class Log: class Update: def __init__(self): - with open("version.json", "r") as f: # loading settings + with open("version.json", "r", encoding='utf-8') as f: # loading settings version = json.load(f) self.url = "https://raw.githubusercontent.com/UntriexTv/test_directory/main/ver.json" self.version = version["version"] @@ -88,7 +88,7 @@ class Scan: self.errors.append("Filesystem is missing") else: try: - with open("filesystem.json", "r") as f: + with open("filesystem.json", "r", encoding='utf-8') as f: filesystem = json.load(f) except: self.state_list["error"].append("filesystem") @@ -120,5 +120,6 @@ class Scan: def fix_version(self): - subprocess.check_output(["python3", "system.py", "update"]) + o = subprocess.check_output(["python3", "system.py", "update"]) + print(o) diff --git a/server/files/PQ.apk b/server/files/PQ.apk new file mode 100644 index 0000000..e69de29 diff --git a/server/files/sample.pdf b/server/files/sample.pdf new file mode 100644 index 0000000..dbf091d --- /dev/null +++ b/server/files/sample.pdf @@ -0,0 +1,198 @@ +%PDF-1.3 +%âãÏÓ + +1 0 obj +<< +/Type /Catalog +/Outlines 2 0 R +/Pages 3 0 R +>> +endobj + +2 0 obj +<< +/Type /Outlines +/Count 0 +>> +endobj + +3 0 obj +<< +/Type /Pages +/Count 2 +/Kids [ 4 0 R 6 0 R ] +>> +endobj + +4 0 obj +<< +/Type /Page +/Parent 3 0 R +/Resources << +/Font << +/F1 9 0 R +>> +/ProcSet 8 0 R +>> +/MediaBox [0 0 612.0000 792.0000] +/Contents 5 0 R +>> +endobj + +5 0 obj +<< /Length 1074 >> +stream +2 J +BT +0 0 0 rg +/F1 0027 Tf +57.3750 722.2800 Td +( A Simple PDF File ) Tj +ET +BT +/F1 0010 Tf +69.2500 688.6080 Td +( This is a small demonstration .pdf file - ) Tj +ET +BT +/F1 0010 Tf +69.2500 664.7040 Td +( just for use in the Virtual Mechanics tutorials. More text. And more ) Tj +ET +BT +/F1 0010 Tf +69.2500 652.7520 Td +( text. And more text. And more text. And more text. ) Tj +ET +BT +/F1 0010 Tf +69.2500 628.8480 Td +( And more text. And more text. And more text. And more text. And more ) Tj +ET +BT +/F1 0010 Tf +69.2500 616.8960 Td +( text. And more text. Boring, zzzzz. And more text. And more text. And ) Tj +ET +BT +/F1 0010 Tf +69.2500 604.9440 Td +( more text. And more text. And more text. And more text. And more text. ) Tj +ET +BT +/F1 0010 Tf +69.2500 592.9920 Td +( And more text. And more text. ) Tj +ET +BT +/F1 0010 Tf +69.2500 569.0880 Td +( And more text. And more text. And more text. And more text. And more ) Tj +ET +BT +/F1 0010 Tf +69.2500 557.1360 Td +( text. And more text. And more text. Even more. Continued on page 2 ...) Tj +ET +endstream +endobj + +6 0 obj +<< +/Type /Page +/Parent 3 0 R +/Resources << +/Font << +/F1 9 0 R +>> +/ProcSet 8 0 R +>> +/MediaBox [0 0 612.0000 792.0000] +/Contents 7 0 R +>> +endobj + +7 0 obj +<< /Length 676 >> +stream +2 J +BT +0 0 0 rg +/F1 0027 Tf +57.3750 722.2800 Td +( Simple PDF File 2 ) Tj +ET +BT +/F1 0010 Tf +69.2500 688.6080 Td +( ...continued from page 1. Yet more text. And more text. And more text. ) Tj +ET +BT +/F1 0010 Tf +69.2500 676.6560 Td +( And more text. And more text. And more text. And more text. And more ) Tj +ET +BT +/F1 0010 Tf +69.2500 664.7040 Td +( text. Oh, how boring typing this stuff. But not as boring as watching ) Tj +ET +BT +/F1 0010 Tf +69.2500 652.7520 Td +( paint dry. And more text. And more text. And more text. And more text. ) Tj +ET +BT +/F1 0010 Tf +69.2500 640.8000 Td +( Boring. More, a little more text. The end, and just as well. ) Tj +ET +endstream +endobj + +8 0 obj +[/PDF /Text] +endobj + +9 0 obj +<< +/Type /Font +/Subtype /Type1 +/Name /F1 +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +>> +endobj + +10 0 obj +<< +/Creator (Rave \(http://www.nevrona.com/rave\)) +/Producer (Nevrona Designs) +/CreationDate (D:20060301072826) +>> +endobj + +xref +0 11 +0000000000 65535 f +0000000019 00000 n +0000000093 00000 n +0000000147 00000 n +0000000222 00000 n +0000000390 00000 n +0000001522 00000 n +0000001690 00000 n +0000002423 00000 n +0000002456 00000 n +0000002574 00000 n + +trailer +<< +/Size 11 +/Root 1 0 R +/Info 10 0 R +>> + +startxref +2714 +%%EOF diff --git a/server/files/test.png b/server/files/test.png new file mode 100644 index 0000000000000000000000000000000000000000..33446e13aa8c0c62163f408e3b1442607b4ae438 GIT binary patch literal 77476 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

gr-vJlsCJu)r-S7z}(;!0J>( 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

  • v6fPC9pMq)~Sn!beS7U|Bg(Q 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 literal 0 HcmV?d00001 diff --git a/server/filesystem.json b/server/filesystem.json index bb938b7..780816d 100644 --- a/server/filesystem.json +++ b/server/filesystem.json @@ -1,12 +1,12 @@ { "ID": 0, - "location": "izba", + "location": "49.14178021389778,18.353783098441415", "description": { "title": "legionrpi", "description_s": "krátky popis, ktorý bude zobrazený iba v náhladovom okne", "description_l": "dlhší popis zariadenia, ktorý bude zobrazený po otvorení", - "photo_s": "mala_fotka.png", - "photo_b": "velka fotka.png" + "photo_s": "test.jpg", + "photo_b": "test.png" }, "files": [ { diff --git a/server/log.txt b/server/log.txt index 66ecc27..98dfe6e 100644 --- a/server/log.txt +++ b/server/log.txt @@ -1,3 +1,159 @@ -2021-03-15 10:13:26.660898 -> Warning: 192.168.1.232 disconnected/is not available -2021-03-15 11:23:33.589998 -> Warning: 192.168.1.231 disconnected/is not available \ No newline at end of file +2021-03-21 12:33:11.947538 -> Warning: 192.168.1.232 disconnected/is not available +2021-03-24 09:47:07.677185 -> Warning: 192.168.1.232 disconnected/is not available +2021-03-24 10:51:12.802174 -> Warning: 192.168.1.232 disconnected/is not available +2021-03-24 10:51:12.804164 -> Warning: 192.168.1.231 disconnected/is not available +2021-03-24 12:20:17.717820 -> Warning: 192.168.1.231 disconnected/is not available +2021-03-24 12:20:18.728113 -> Warning: 192.168.1.232 disconnected/is not available +2021-04-06 17:47:36.579990 -> Warning: 192.168.1.232 disconnected/is not available +2021-04-06 18:01:09.637683 -> Warning: 192.168.1.232 disconnected/is not available +2021-04-06 18:06:27.367910 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + + Response from server: {"detail":"Not Found"} +2021-04-06 18:09:14.702582 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: {"detail":"Not Found"} +2021-04-06 18:09:44.558742 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: {"detail":"Not Found"} +2021-04-06 18:11:19.482976 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: {"detail":"Not Found"} +2021-04-06 18:21:00.445053 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: Internal Server Error +2021-04-06 18:21:00.468768 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: Internal Server Error +2021-04-06 18:26:26.230043 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "Version not found.\n" +2021-04-06 18:26:26.765624 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "Version not found.\n" +2021-04-06 18:26:46.326513 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "Version not found.\n" +2021-04-06 18:26:46.857832 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "Version not found.\n" +2021-04-06 18:27:17.853160 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "Version not found.\n" +2021-04-06 18:27:18.393648 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "Version not found.\n" +2021-04-06 18:28:32.760504 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "Version not found.\n" +2021-04-06 18:28:33.303332 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "Version not found.\n" +2021-04-06 18:28:47.795564 -> Warning: 192.168.1.232 disconnected/is not available +2021-04-06 18:29:38.864951 -> Warning: 192.168.1.232 disconnected/is not available +2021-04-06 18:30:21.991616 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "Download succefull\nExtracting update\nupdate to 0.6 was succefull.\n" +2021-04-06 18:30:22.828559 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "Download succefull\nExtracting update\nupdate to 0.6 was succefull.\n" +2021-04-06 18:38:39.034010 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version {'version': '0.6', 'id': 4, 'url': 'https://raw.githubusercontent.com/UntriexTv/test_directory/main/ver.json'} to 0.6 was sucesfull\n" +2021-04-06 18:38:39.846078 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version {'version': '0.6', 'id': 4, 'url': 'https://raw.githubusercontent.com/UntriexTv/test_directory/main/ver.json'} to 0.6 was sucesfull\n" +2021-04-06 18:38:43.579251 -> Warning: 192.168.1.231 disconnected/is not available +2021-04-06 18:41:20.200515 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version {'0.1': {'change_list': 'this is only initial release for testing purpose', 'id': 2}, '0.5': {'change_list': 'fist working release', 'id': 3}, '0.6': {'change_list': 'normal update', 'id': 4}} to 0.6 was sucesfull\n" +2021-04-06 18:41:21.012333 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version {'0.1': {'change_list': 'this is only initial release for testing purpose', 'id': 2}, '0.5': {'change_list': 'fist working release', 'id': 3}, '0.6': {'change_list': 'normal update', 'id': 4}} to 0.6 was sucesfull\n" +2021-04-06 18:43:14.079603 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:43:14.908686 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:44:45.325212 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: {"detail":"Not Found"} +2021-04-06 18:44:45.334610 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: {"detail":"Not Found"} +2021-04-06 18:44:51.128403 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: {"detail":"Not Found"} +2021-04-06 18:44:51.135988 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: {"detail":"Not Found"} +2021-04-06 18:45:13.073433 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:45:13.894493 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:46:42.900283 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:46:43.720053 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:47:20.543756 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:47:21.533385 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:48:44.524464 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:48:45.362610 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:49:28.460321 -> Warning: 192.168.1.232 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:49:29.387142 -> Warning: 192.168.1.231 failed to update. Manual update may be needed for proper working of network. + Response from server: "SUCCESS\nUpdate from version 0.6 to 0.6 was sucesfull\n" +2021-04-06 18:52:52.010837 -> Warning: 192.168.1.231 disconnected/is not available +2021-04-06 18:53:06.029220 -> Warning: 192.168.1.232 disconnected/is not available +2021-04-06 19:52:34.214066 -> Warning: Device Address(host='10.42.0.238', port=18381) is creating new sensor data. + SENSOR: ['vlhkost', '40'] +2021-04-06 20:58:51.194511 -> Warning: Address(host='10.42.0.238', port=11244) created new sensor. + SENSOR: name='Teplota' value='18' +2021-04-06 20:58:52.311838 -> Warning: Address(host='10.42.0.238', port=8118) created new sensor. + SENSOR: name='Vlhkost' value='52' +2021-04-06 21:00:22.844916 -> Warning: Address(host='10.42.0.238', port=9199) created new sensor. + SENSOR: name='Teplota' value='27' +2021-04-06 21:00:23.915833 -> Warning: Address(host='10.42.0.238', port=15482) created new sensor. + SENSOR: name='Vlhkost' value='95' +2021-04-06 21:01:04.874694 -> Warning: Address(host='10.42.0.238', port=4606) created new sensor. + SENSOR: name='Teplota' value='24' +2021-04-06 21:01:06.020948 -> Warning: Address(host='10.42.0.238', port=16111) created new sensor. + SENSOR: name='Vlhkost' value='95' +2021-04-06 21:02:56.676046 -> Warning: Address(host='10.42.0.238', port=1280) created new sensor. + SENSOR: name='Teplota' value='20' +2021-04-06 21:02:57.773619 -> Warning: Address(host='10.42.0.238', port=12034) created new sensor. + SENSOR: name='Vlhkost' value='91' +2021-04-07 14:07:15.258217 -> Warning: Address(host='10.42.0.238', port=32353) created new sensor. + SENSOR: name='Teplota' value='19' +2021-04-07 14:07:16.454490 -> Warning: Address(host='10.42.0.238', port=19858) created new sensor. + SENSOR: name='Vlhkost' value='46' +2021-04-07 14:17:42.961164 -> Warning: Address(host='10.42.0.238', port=4696) created new sensor. + SENSOR: name='Teplota' value='20' +2021-04-07 14:17:44.114338 -> Warning: Address(host='10.42.0.238', port=4387) created new sensor. + SENSOR: name='Vlhkost' value='42' +2021-04-07 14:18:25.886229 -> Warning: 192.168.1.232 disconnected/is not available +2021-04-07 14:22:13.260725 -> ERROR: Sensor data download from 1 failed. + ERROR: 1 is not in list +2021-04-07 14:22:42.995956 -> ERROR: Sensor data download from 1 failed. + ERROR: 1 is not in list +2021-04-07 17:06:13.637610 -> ERROR: Sensor data download from 25 failed. + ERROR: 25 is not in list +2021-04-07 17:16:09.500542 -> Warning: test on server 192.168.1.231 is changed. +2021-04-07 17:24:05.379288 -> Warning: Address(host='10.42.0.238', port=25175) created new sensor. + SENSOR: name='Teplota' value='20' +2021-04-07 17:24:06.475344 -> Warning: Address(host='10.42.0.238', port=5919) created new sensor. + SENSOR: name='Vlhkost' value='46' +2021-04-07 17:34:29.681729 -> Warning: Address(host='10.42.0.238', port=8767) created new sensor. + SENSOR: name='Teplota' value='20' +2021-04-07 17:34:30.857047 -> Warning: Address(host='10.42.0.238', port=19458) created new sensor. + SENSOR: name='Vlhkost' value='46' +2021-04-07 17:35:06.210117 -> Warning: Address(host='10.42.0.238', port=15677) created new sensor. + SENSOR: name='Teplota' value='20' +2021-04-07 17:35:07.332588 -> Warning: Address(host='10.42.0.238', port=27433) created new sensor. + SENSOR: name='Vlhkost' value='46' +2021-04-07 17:36:02.490752 -> Warning: Address(host='10.42.0.238', port=29010) created new sensor. + SENSOR: name='Teplota' value='20' +2021-04-07 17:36:03.561727 -> Warning: Address(host='10.42.0.238', port=26279) created new sensor. + SENSOR: name='Vlhkost' value='46' +2021-04-07 17:39:30.650731 -> Warning: Address(host='10.42.0.238', port=26716) created new sensor. + SENSOR: name='Teplota' value='20' +2021-04-07 17:39:31.746802 -> Warning: Address(host='10.42.0.238', port=11238) created new sensor. + SENSOR: name='Vlhkost' value='46' +2021-04-07 19:03:34.951363 -> Warning: Address(host='10.42.0.238', port=19388) created new sensor. + SENSOR: name='Teplota' value='20' +2021-04-07 19:03:36.076556 -> Warning: Address(host='10.42.0.238', port=24582) created new sensor. + SENSOR: name='Vlhkost' value='46' +2021-04-07 20:03:53.809025 -> Warning: Address(host='10.42.0.238', port=30182) created new sensor. + SENSOR: name='Vlhkost' value='46' +2021-04-14 12:55:05.505789 -> ERROR: Sensor data download from 1 failed. + ERROR: 1 is not in list +2021-04-14 13:04:30.181791 -> Warning: Address(host='192.168.1.99', port=54888) created new sensor. + SENSOR: name='sensor1' value='test' +2021-04-14 13:04:36.780037 -> Warning: Address(host='192.168.1.99', port=54904) created new sensor. + SENSOR: name='sensor2' value='1234' +2021-04-14 13:06:59.405575 -> Warning: Address(host='192.168.1.99', port=54974) created new sensor. + SENSOR: name='sensor2' value='1234' +2021-04-14 14:09:58.696666 -> Warning: Address(host='192.168.1.99', port=58182) created new sensor. + SENSOR: name='sensor1' value='test' +2021-04-14 14:10:06.190377 -> Warning: Address(host='192.168.1.99', port=58192) created new sensor. + SENSOR: name='sensor2' value='123456789' \ No newline at end of file diff --git a/server/main.py b/server/main.py index 3b93f78..57a6551 100644 --- a/server/main.py +++ b/server/main.py @@ -1,14 +1,13 @@ import hashlib import json import os -import sys import threading import time import engine import requests import uuid import subprocess -from fastapi import FastAPI, Request +from fastapi import FastAPI, Request, File, UploadFile from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse from pydantic import BaseModel @@ -18,12 +17,12 @@ check.check_to_go() if check.state_list["error"]: for error in check.errors: print(error) - sys.exit() + check.fix_version() -with open("settings.json", "r") as f: # loading settings +with open("settings.json", "r", encoding='utf-8') as f: # loading settings settings = json.load(f) -with open("filesystem.json", "r") as f: # loading filesystem +with open("filesystem.json", "r", encoding='utf-8') as f: # loading filesystem filesystem = json.load(f) IP = settings["IP"] @@ -54,7 +53,7 @@ time_to_heartbeat_offline = settings[ heartbeat_table = settings["heartbeat_table"] sensors = {} -messages = [] +messages = [] # {user: "", timestamp: time.Time(), message: ""} heartbeat_table["ID"].append(ID) heartbeat_table["IP"].append(IP) @@ -163,8 +162,12 @@ def get_file(IDx: int, file: str, request: Request): log.error(f"{request.client} tried to access file ({file}) on id {IDx} that does not exist.") return f"ERROR: {file} does not exist." log.message(f"Downloaded {file} from {server_ip}") - with open(f"cache/{IDx}/{file}", "wb") as save: - save.write(bytes(r.content)) + if ".txt" in file: + with open(f"cache/{IDx}/{file}", "wb", encoding='utf-8') as save: + save.write(bytes(r.content)) + else: + with open(f"cache/{IDx}/{file}", "wb") as save: + save.write(bytes(r.content)) return FileResponse(f"cache/{IDx}/{file}") @@ -222,32 +225,39 @@ def admin_get(command: str): state = subprocess.check_output(["python3", "system.py", "update", "-version", f"""{command.split("-")[1]}"""]) log.warning(state.decode("utf-8")) return state.decode("utf-8") - if command == "setting": + if command == "settings": return settings + if command == "filesystem": + return filesystem -@app.post("admin/post/{command}") -def admin_post(command: str, data): - pass +@app.post("/admin/upload_file") +async def create_upload_file(uploaded_file: UploadFile = File(...), patch: str = ""): + file_location = f"{patch}{uploaded_file.filename}" + with open(file_location, "wb+") as file_object: + file_object.write(uploaded_file.file.read()) + return {"info": f"file '{uploaded_file.filename}' saved at '{file_location}'"} # Todo upload of update file and settings @app.get("/messages/get") -def get_messages(m_from: int = 0, m_to: int = 10): - return messages[m_from:m_to] +def get_messages(timestamp): + for position, message in enumerate(reversed(messages)): + if message["timestamp"] == timestamp: + return reversed(messages)[:position] @app.get("/messages/reqister") def get_messages(): - return uuid.uuid4().hex[24:] + return [uuid.uuid4().hex[24:], messages[:9]] @app.post("/messages/post") def get_messages(m_sender: str = None, message: str = None): if m_sender and message: - messages.append({"sender": m_sender, "message": message}) + messages.append({"sender": m_sender, "message": message, "timestamp": time.time()}) return "successful" else: return "Empty message/sender" @@ -303,7 +313,7 @@ def mainloop(): log.message("Saving heartbeat table.") log.debug(f"Saving heartbeat table: {heartbeat_table}") settings["heartbeat_table"] = heartbeat_table - with open("settings.json", "w") as file: + with open("settings.json", "w", encoding='utf-8') as file: json.dump(settings, file, indent=2) time.sleep(1) diff --git a/server/settings.json b/server/settings.json index 2ae1bee..ef576d3 100644 --- a/server/settings.json +++ b/server/settings.json @@ -1,7 +1,7 @@ { "ID": 0, "IP": "192.168.1.99", - "location": "izba", + "location": "49.14178021389778,18.353783098441415", "time_to_heartbeat": 20, "time_to_heartbeat_offline": 25, "save_table": false, @@ -13,7 +13,7 @@ "print_warning": true, "save_message": false, "print_message": true, - "enable_debug": false + "enable_debug": true }, "heartbeat_table": { "ID": [], diff --git a/server/system.py b/server/system.py index 4b51e74..f5287fb 100644 --- a/server/system.py +++ b/server/system.py @@ -29,29 +29,24 @@ if command in ["u", "update"]: sys.exit() else: - version_download = 0 try: - with open("version.json", "r") as f: # loading settings + with open("version.json", "r", encoding='utf-8') as f: # loading settings version = json.load(f) except: - version = {"id": 0} + version = {"id": 0, "version": "recovery"} for ver, data in enumerate(server_version.values()): - if data["id"] > version["id"] and ver > version_download: + if data["id"] > version["id"]: version_download = list(server_version.keys())[ver] try: - with open("update.zip", "wb") as save: + with open("update.zip", "wb", encoding='utf-8') as save: save.write( bytes(requests.get( f"https://github.com/UntriexTv/test_directory/releases/download/{version_download}/update.zip").content)) except Exception as error: print(f"FAILED TO DOWNLOAD UPDATE. ERROR: {error}") sys.exit() - - if not os.path.isdir("update"): - os.mkdir("update") with zipfile.ZipFile("update.zip", "r") as zip_ref: - zip_ref.extractall("update") - os.rmdir("update") + zip_ref.extractall("") os.remove("update.zip") print("SUCCESS") print(f"""Update from version {version["version"]} to {version_download} was sucesfull""") @@ -60,24 +55,24 @@ if command == "clean": if arguments[1] == "all": open("log.txt", "w").close() - with open("settings.json", "r") as file: + with open("settings.json", "r", encoding='utf-8') as file: settings = json.load(file) for line in settings["heartbeat_table"]: settings["heartbeat_table"][line] = [] - with open("settings.json", "w") as file: + with open("settings.json", "w", encoding='utf-8') as file: json.dump(settings, file, indent=2) if arguments[1] == "log": open("log.txt", "w").close() if arguments[1] == "heartbeat_table": - with open("settings.json", "r") as file: + with open("settings.json", "r", encoding='utf-8') as file: settings = json.load(file) for line in settings["heartbeat_table"]: settings["heartbeat_table"][line] = [] - with open("settings.json", "w") as file: + with open("settings.json", "w", encoding='utf-8') as file: json.dump(settings, file, indent=2) diff --git a/server/test.py b/server/test.py index 9410f45..e69de29 100644 --- a/server/test.py +++ b/server/test.py @@ -1,24 +0,0 @@ -import threading -import uuid -import time - -zoznam = [] -rovnake = 0 -run = True -start = time.time() - -def generate(): - global zoznam, rovnake, run - while run: - cache = uuid.uuid4().hex[24:] - if cache in zoznam: - rovnake += 1 - zoznam.append(cache) - pocet = len(zoznam) - print(f"{pocet} : {rovnake} rovnakých - {cache}") - if pocet > 50000: - break - - -generate() -print(f"process lasted {time.time()-start}") \ No newline at end of file