3.8.0: «database is locked» y los 753 que no se movieron, arreglados; fechas raras, escaneo profundo, buscar, otros discos, banco por fecha y compilar en el estudio
- Tras «Aplicar» en una carpeta grande el inventario se ponía al día con la base tomada más de diez minutos y «Buscar clips» se rendía con «database is locked». Ahora las preguntas al disco van antes y en paralelo y lo de dentro de cada carpeta se busca por índice: 1,3 s para 2.493 movimientos, mismas filas de archivos que antes y 183 carpetas que antes se perdían. La lectura de clips reintenta si la base está ocupada. - Las fotos de «Alta» y «Baja» chocaban al juntarse en una carpeta: las subcarpetas con sentido se conservan, el plan avisa antes de dos archivos iguales en una fila, y un número entre dos palabras («Fiesta 6 Años») ya no se quita. - Los fallos de «Aplicar» se agrupan por motivo y dicen qué hacer; el banco de material se explica en llano. - Fechas raras (el reloj de una cámara), escaneo profundo, buscar en todos los clientes, traer lo que el cliente tiene en otros discos, el banco por temas o por fecha, y «Calcular de nuevo» más rápido. - Mover reintenta un momento si el archivo está abierto un instante (lectura de clips, antivirus). - .github/workflows/publicar.yml para compilar y publicar desde un PC del estudio; las pruebas devuelven error si algo falla. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Este commit está contenido en:
39
verificar_publicado.py
Archivo normal
39
verificar_publicado.py
Archivo normal
@@ -0,0 +1,39 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Comprueba lo que sirve Labstream OS después de publicar: la versión, que la firma del manifiesto es válida, que
|
||||
es el mismo manifiesto que el local, y que el paquete que se descarga tiene la huella y el tamaño que dice.
|
||||
Termina con error si algo no cuadra (la compilación del estudio se detiene ahí).
|
||||
|
||||
py -3.12 verificar_publicado.py
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
import io
|
||||
import json
|
||||
import hashlib
|
||||
import urllib.request
|
||||
|
||||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
|
||||
REPO = os.path.dirname(os.path.abspath(__file__))
|
||||
sys.path.insert(0, REPO)
|
||||
import firma # noqa: E402
|
||||
import actualizador as A # noqa: E402
|
||||
|
||||
BASE = "https://os.labstreamsas.com"
|
||||
|
||||
|
||||
def pedir(url):
|
||||
return urllib.request.urlopen(urllib.request.Request(url, headers={"Cache-Control": "no-cache"}), timeout=120).read()
|
||||
|
||||
|
||||
m = json.loads(pedir(BASE + "/herramientas/organizador.json"))
|
||||
local = json.load(open(os.path.join(REPO, "manifiesto.json"), encoding="utf-8"))
|
||||
firma_ok = firma.verificar(firma.texto_manifiesto(m), str(m["firma"]["valor"]), A.CLAVE_PUBLICA)
|
||||
igual = m == local
|
||||
datos = pedir(BASE + m["app"]["url"])
|
||||
huella_ok = hashlib.sha256(datos).hexdigest() == m["app"]["sha256"] and len(datos) == m["app"]["size"]
|
||||
print("servidor: versión", m["version"], "· local:", local.get("version"))
|
||||
print("firma del manifiesto:", "válida" if firma_ok else "NO VÁLIDA")
|
||||
print("coincide con el manifiesto local:", igual)
|
||||
print(f"descarga del paquete: {len(datos)} bytes · huella y tamaño iguales a los del manifiesto: {huella_ok}")
|
||||
print("notas:", (m.get("notes") or "")[:120], "…")
|
||||
sys.exit(0 if (firma_ok and igual and huella_ok) else 1)
|
||||
Referencia en una nueva incidencia
Block a user