Add progress & test headers
This commit is contained in:
parent
e0ce5aa66a
commit
a6c906e5f5
3 changed files with 125 additions and 0 deletions
62
progress/progress.py
Normal file
62
progress/progress.py
Normal file
|
@ -0,0 +1,62 @@
|
|||
import datetime
|
||||
import re
|
||||
import subprocess
|
||||
|
||||
DISK_SIZE_GB = 5.44
|
||||
|
||||
|
||||
def sizeof_fmt(num: int, suffix: str = 'B') -> str:
|
||||
for unit in ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi']:
|
||||
if abs(num) < 1024.0:
|
||||
return "%3.1f %s%s" % (num, unit, suffix)
|
||||
num /= 1024.0
|
||||
return "%.1f%s%s" % (num, 'Yi', suffix)
|
||||
|
||||
|
||||
def time_fmt(_time):
|
||||
hours = int(_time / 3600)
|
||||
minutes = int((_time % 3600) / 60)
|
||||
seconds = _time % 60
|
||||
fmt = f"{hours}h {minutes}min {seconds}s"
|
||||
return fmt
|
||||
|
||||
|
||||
def main():
|
||||
subprocess.run(["sudo", "killall", "-SIGINFO", "dd"])
|
||||
print("Input last dd progress line")
|
||||
last_line = input("> ")
|
||||
regex = re.compile(
|
||||
r"^(?P<transferred>\d+) \w+ transferred in (?P<elapsed>\d+).\d+ secs \((?P<speed>\d+) \w+/sec\)$")
|
||||
results = regex.match(last_line).groupdict()
|
||||
|
||||
disk_size = DISK_SIZE_GB * 1024 * 1024 * 1024
|
||||
|
||||
transferred = int(results["transferred"])
|
||||
transferred_fmt = sizeof_fmt(transferred)
|
||||
speed = int(results["speed"])
|
||||
speed_fmt = sizeof_fmt(speed)
|
||||
remaining = disk_size - transferred
|
||||
remaining_fmt = sizeof_fmt(remaining)
|
||||
|
||||
eta = int(remaining / speed)
|
||||
eta_fmt = time_fmt(eta)
|
||||
elapsed = int(results["elapsed"])
|
||||
elapsed_fmt = time_fmt(elapsed)
|
||||
total = eta + elapsed
|
||||
total_fmt = time_fmt(total)
|
||||
|
||||
eta_absolute = datetime.datetime.now() + datetime.timedelta(seconds=eta)
|
||||
|
||||
percentage = transferred / disk_size * 100
|
||||
|
||||
print()
|
||||
print(f"{transferred_fmt} transferred over {DISK_SIZE_GB}GiB, or {percentage:.1f}%.")
|
||||
print(f"Transferring at {speed_fmt} per second.")
|
||||
print(f"Remaining : {remaining_fmt}")
|
||||
print(f"ETA : {eta_fmt} ({eta_absolute.ctime()}).")
|
||||
print(f"Elapsed : {elapsed_fmt}.")
|
||||
print(f"Estimated total time : {total_fmt}.")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
49
test_headers/app.py
Normal file
49
test_headers/app.py
Normal file
|
@ -0,0 +1,49 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Very simple HTTP server in python for logging requests
|
||||
Usage::
|
||||
./server.py [<port>]
|
||||
"""
|
||||
from http.server import BaseHTTPRequestHandler, HTTPServer
|
||||
import logging
|
||||
|
||||
class S(BaseHTTPRequestHandler):
|
||||
def _set_response(self):
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type', 'text/html')
|
||||
self.end_headers()
|
||||
|
||||
def do_GET(self):
|
||||
logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
|
||||
self._set_response()
|
||||
self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))
|
||||
|
||||
def do_POST(self):
|
||||
content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
|
||||
post_data = self.rfile.read(content_length) # <--- Gets the data itself
|
||||
logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n",
|
||||
str(self.path), str(self.headers), post_data.decode('utf-8'))
|
||||
|
||||
self._set_response()
|
||||
self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
|
||||
|
||||
def run(server_class=HTTPServer, handler_class=S, port=8080):
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
server_address = ('', port)
|
||||
httpd = server_class(server_address, handler_class)
|
||||
logging.info('Starting httpd...\n')
|
||||
try:
|
||||
httpd.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
httpd.server_close()
|
||||
logging.info('Stopping httpd...\n')
|
||||
|
||||
if __name__ == '__main__':
|
||||
from sys import argv
|
||||
|
||||
if len(argv) == 2:
|
||||
run(port=int(argv[1]))
|
||||
else:
|
||||
run()
|
||||
|
14
test_headers/docker-compose.yaml
Normal file
14
test_headers/docker-compose.yaml
Normal file
|
@ -0,0 +1,14 @@
|
|||
version: "2.4"
|
||||
services:
|
||||
app:
|
||||
image: python:3.9-slim
|
||||
command: python /app/app.py
|
||||
volumes:
|
||||
- ./:/app
|
||||
networks:
|
||||
- nginx-proxy-manager_default
|
||||
|
||||
networks:
|
||||
nginx-proxy-manager_default:
|
||||
external: true
|
||||
|
Loading…
Reference in a new issue