Serveur de réception des fichiers scannés
Il faudra à terme en complément de ce site un serveur de réception des scans. Il doit ouvrir un serveur TCP sur un port et attendre que l'imprimante lui parle, et déposer ensuite les fichiers reçus au bon endroit.
Il est prévu d'avoir une implémentation propre à part en Rust, mais à titre d'idée voilà une implémentation basique en Python des requis :
#!/usr/bin/env python3
import os
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 9751))
s.listen()
while True:
conn, addr = s.accept()
conn.recvfrom(2)
data, _ = conn.recvfrom(18)
desc = data.decode()
nbytes = int(desc[6:12])
data, _ = conn.recvfrom(nbytes)
desc = data.decode()
for elem in desc.split('&'):
key, value = elem.split('=')
if key == 'NAME':
username, name = value.split(':')
break
d = '/var/lib/django-printer/files/scans/' + username
if not os.path.isdir(d):
os.mkdir(d)
with open(f'{d}/{name}.pdf', 'wb') as f:
while True:
data, _ = conn.recvfrom(18)
if not data:
break
desc = data.decode()
if desc.startswith('BLOCK='):
nbytes = int(desc[6:12])
i = 0
while i < nbytes:
data, _ = conn.recvfrom(nbytes - i)
i += len(data)
f.write(data)
print(f'{d}/{name}.pdf received')