From ea0767a2200a96b822a2ca9c08654ec7222d0821 Mon Sep 17 00:00:00 2001 From: localhorst Date: Tue, 22 Nov 2022 20:10:45 +0100 Subject: [PATCH] added qr code and capacity text --- layouter.py | 87 +++++++++++++++++++++++++++++++++------------------- output.png | Bin 2717 -> 5514 bytes 2 files changed, 55 insertions(+), 32 deletions(-) diff --git a/layouter.py b/layouter.py index 4f78fbe..fe3d5cd 100644 --- a/layouter.py +++ b/layouter.py @@ -4,6 +4,9 @@ """ Author: Hendrik Schutter, localhorst@mosad.xyz Date of creation: 2022/11/16 Date of last modification: 2022/11/16 + + pip install qrcode + """ import re @@ -13,18 +16,20 @@ import time import subprocess import shlex import shutil -from dataclasses import dataclass +import dataclasses import glob import PIL from PIL import Image from PIL import ImageFont from PIL import ImageDraw import datetime +import json +import qrcode -rehddversion="bV0.2.2" # read this from rehdd process -@dataclass + +@dataclasses.dataclass class DriveData: drive_index: int drive_state: str #none, deleted, shredded @@ -38,7 +43,7 @@ class DriveData: shred_timestamp: int #unix timestamp shred_duration: int #in seconds -@dataclass +@dataclasses.dataclass class DriveDataPrintable: modelfamiliy: str #max lenght 25 modelname: str #max lenght 25 @@ -50,9 +55,20 @@ class DriveDataPrintable: shred_timestamp: str #max lenght 25, human-readable shred_duration: str #max lenght 25, human-readable +@dataclasses.dataclass +class ReHddInfo: + link: str + version: str + +@dataclasses.dataclass +class DriveDataJson: + drive: DriveData + rehdd: ReHddInfo + +rehdd_info = ReHddInfo("https://git.mosad.xyz/localhorst/reHDD", "bV0.2.2") # read this from rehdd process temp_drive = DriveData(drive_index=0, drive_state="shredded", modelfamiliy="Toshiba 2.5\\ HDD MK..65GSSX",\ - modelname="TOSHIBA MK3265GSDX", capacity=343597383680, serialnumber="70fFr-_/ tefrtg", power_on_hours=7074,\ + modelname="TOSHIBA MK3265GSDX", capacity=343597383680, serialnumber="YG6742U56UDRL", power_on_hours=7074,\ power_cycle=4792, smart_error_count=1, shred_timestamp=1647937421, shred_duration=81718) @@ -99,28 +115,30 @@ def format_to_printable(drive): cut_string(30, datetime.datetime.utcfromtimestamp(drive.shred_timestamp).strftime('%Y-%m-%d %H:%M:%S')),\ cut_string(30, str(datetime.timedelta(seconds = drive.shred_duration)))) -def draw_text(drawable, printable_data, text_y_offset): +def draw_text(drawable, printable_data, text_x_offset): font_file = get_font_path() font_size = 20 - text_x_offset = 10 - text_x_offset_increment = 25 + text_y_offset = 15 + text_y_offset_increment = 25 - drawable.text((text_y_offset, text_x_offset), "Familiy: " + printable_data.modelfamiliy,(0),font=ImageFont.truetype(font_file, font_size)) - text_x_offset += text_x_offset_increment - drawable.text((text_y_offset, text_x_offset), "Model: " + printable_data.modelname,(0),font=ImageFont.truetype(font_file, font_size)) - text_x_offset += text_x_offset_increment - drawable.text((text_y_offset, text_x_offset), "Serial: " + printable_data.serialnumber,(0),font=ImageFont.truetype(font_file, font_size)) - text_x_offset += text_x_offset_increment - drawable.text((text_y_offset, text_x_offset), "Hours: " + printable_data.power_on_hours,(0),font=ImageFont.truetype(font_file, font_size)) - text_x_offset += text_x_offset_increment - drawable.text((text_y_offset, text_x_offset), "Cycles: " + printable_data.power_cycle,(0),font=ImageFont.truetype(font_file, font_size)) - text_x_offset += text_x_offset_increment - drawable.text((text_y_offset, text_x_offset), "Errors: " + printable_data.smart_error_count,(0),font=ImageFont.truetype(font_file, font_size)) - text_x_offset += text_x_offset_increment - drawable.text((text_y_offset, text_x_offset), "Shred on: " + printable_data.shred_timestamp,(0),font=ImageFont.truetype(font_file, font_size)) - text_x_offset += text_x_offset_increment - drawable.text((text_y_offset, text_x_offset), "Duration: " + printable_data.shred_duration,(0),font=ImageFont.truetype(font_file, font_size)) - text_x_offset += text_x_offset_increment + drawable.text((text_x_offset, text_y_offset), "Familiy: " + printable_data.modelfamiliy,(0),font=ImageFont.truetype(font_file, font_size)) + text_y_offset += text_y_offset_increment + drawable.text((text_x_offset, text_y_offset), "Model: " + printable_data.modelname,(0),font=ImageFont.truetype(font_file, font_size)) + text_y_offset += text_y_offset_increment + drawable.text((text_x_offset, text_y_offset), "Serial: " + printable_data.serialnumber,(0),font=ImageFont.truetype(font_file, font_size)) + text_y_offset += text_y_offset_increment + drawable.text((text_x_offset, text_y_offset), "Hours: " + printable_data.power_on_hours,(0),font=ImageFont.truetype(font_file, font_size)) + text_y_offset += text_y_offset_increment + drawable.text((text_x_offset, text_y_offset), "Cycles: " + printable_data.power_cycle,(0),font=ImageFont.truetype(font_file, font_size)) + text_y_offset += text_y_offset_increment + drawable.text((text_x_offset, text_y_offset), "Errors: " + printable_data.smart_error_count,(0),font=ImageFont.truetype(font_file, font_size)) + text_y_offset += text_y_offset_increment + drawable.text((text_x_offset, text_y_offset), "Shred on: " + printable_data.shred_timestamp,(0),font=ImageFont.truetype(font_file, font_size)) + text_y_offset += text_y_offset_increment + drawable.text((text_x_offset, text_y_offset), "Duration: " + printable_data.shred_duration,(0),font=ImageFont.truetype(font_file, font_size)) + text_y_offset += text_y_offset_increment + + drawable.text((text_x_offset, text_y_offset), printable_data.capacity,(0),font=ImageFont.truetype(font_file, font_size*3)) def draw_outline(drawable, margin, width, output_width, output_height): #upper @@ -132,26 +150,31 @@ def draw_outline(drawable, margin, width, output_width, output_height): #lower drawable.line([(margin,output_height - margin), (output_width-margin,output_height -margin)], fill=None, width=width, joint=None) +def draw_qr_code(image, data): + qr_img = qrcode.make(data) + qr_img.thumbnail((290, 290), Image.Resampling.LANCZOS) + image.paste(qr_img, (7, 7)) def main(): output_width = 696 - output_height = 348 + output_height = 300 printable_data = format_to_printable(temp_drive) - print(printable_data) + qr_data = DriveDataJson(temp_drive, rehdd_info) + json_qr_daten = json.dumps(dataclasses.asdict(qr_data)) - text_y_offset= int(output_width / 3) + #print(printable_data) + + text_x_offset= 300 output_image = Image.new('1', (output_width, output_height), "white") draw = ImageDraw.Draw(output_image) - draw_outline(draw, 4, 5, output_width, output_height) - - - draw_text(draw, printable_data, text_y_offset) - + draw_outline(draw, 2, 5, output_width, output_height) + draw_text(draw, printable_data, text_x_offset) + draw_qr_code(output_image, str(json_qr_daten).replace(" ", "")) output_image.save("output.png") diff --git a/output.png b/output.png index 2954476c8c0b106fbc53e8eaefbcfd80d2b64445..c9784b1eb00bdda203dad770e89c6a0acfb9f331 100644 GIT binary patch literal 5514 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

y&3XOua^rdg6i;-mZRJ&oBPP)L+}j+xs(Sjz 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