• v1.0.0 f0d06c5b3a

    enne2 released this 2026-09-20 15:30:02 +00:00 | 2 commits to master since this release

    Client CLI di Cellar (enne2/cellar) reimplementato in C, pensato per essere
    il più retrocompatibile possibile: binari statici, zero dipendenze, utilizzabili
    dove Python e le librerie moderne non ci sono o non si possono installare.

    A cosa serve

    cellar-cli gestisce gli archivi di bottiglie Bottles (prefissi Wine) ospitati su un
    server Cellar: elenca, carica, scarica e installa una bottiglia direttamente nella
    cartella locale di Bottles, così da ritrovarla subito nell'app.

    È utile in particolare:

    • su dispositivi retro/handheld o sistemi minimali, dove il client Python originale
      (che richiede Python 3 e le sue librerie) non è praticabile;
    • su distro vecchie (glibc anziana, Python assente o troppo vecchio);
    • per script e automazione: exit code stabili (0 ok, 1 errore HTTP/rete/file,
      2 argomenti non validi), output tabellare identico all'originale e modalità JSON;
    • per trasferire bottiglie via HTTP in VPN/LAN senza installare nulla (basta il file).

    Binari allegati

    file architettura ABI minima (nota ELF) dimensione sha256 indicato per
    cellar-cli-1.0.0-linux-x86_64-static x86-64 (amd64) Linux, ABI 3.2.0 1.1 MiB 0c454b2c65ac872e… PC 64 bit, server, container, qualsiasi distro x86-64 (Debian/Ubuntu/Fedora/Arch, anche molto vecchie)
    cellar-cli-1.0.0-linux-i686-static i686 (x86 32 bit) Linux, ABI 3.2.0 1.2 MiB 16c7db8c6667ff46… sistemi 32 bit legacy: vecchie distro i386, netbook, console/handheld x86, chroot 32 bit
    cellar-cli-1.0.0-linux-aarch64-static aarch64 (arm64) Linux, ABI 3.7.0 968 KiB 11ad5ae2b5916c21… handheld ARM (muOS/RG40XXH con glibc 2.38, kernel 4.9), SBC (Allwinner, Rockchip), server ARM

    I tre binari sono statici: non richiedono nessuna libreria a runtime
    (niente glibc esterna, niente Python, niente zlib, niente curl, niente OpenSSL).

    Retrocompatibilità — come è ottenuta

    • Link statico completo: ldd risponde "non è un eseguibile dinamico"; nessun
      simbolo GLIBC_* richiesto, quindi nessun vincolo sulla glibc del sistema.
    • Nessuna syscall moderna: il codice usa solo open/read/write/stat/lstat/rename/ mkdir/symlink/link/utimensat/chmod/poll. Verificato automaticamente: assenti
      statx, openat2, O_TMPFILE, memfd_create, getrandom, close_range.
    • Large File Support a 64 bit: gli archivi Cellar arrivano a 1,3 GB e vengono
      trasmessi in streaming (l'originale li caricava in RAM).
    • Resolver DNS di riserva: se getaddrinfo non funziona (tipico della glibc
      statica su firmware senza NSS), si legge /etc/hosts e, se serve, si interroga il DNS
      direttamente via UDP leggendo /etc/resolv.conf.
    • Nessuna dipendenza da display/GTK/Qt: funziona su console, SSH, script e cron.
    • Comunicazione in HTTP semplice: il server Cellar parla HTTP; non essendoci TLS nel
      binario (scelta di portabilità: niente OpenSSL), si usa http:// — tipicamente via
      LAN o VPN (es. http://10.8.0.3:8080 o http://brain.vpn:8080). Se serve HTTPS,
      basta mettere il server dietro un reverse proxy TLS.
    • Tar/gzip compatibili: gli archivi creati sono PAX come quelli di tarfile di
      Python, leggibili da Python e da GNU tar; l'estrazione preserva permessi, mtime e
      symlink con lo stesso comportamento del client originale.

    Uso rapido

    # 1) metti il binario nel PATH
    chmod +x cellar-cli-1.0.0-linux-x86_64-static
    mv cellar-cli-1.0.0-linux-x86_64-static ~/.local/bin/cellar-cli
    
    # 2) configura il server (il file viene creato con i default se manca)
    cat > ~/.cellar.conf <<'EOF'
    [cellar]
    server = http://brain.vpn:8080
    bottles_dir = ~/.var/app/com.usebottles.bottles/data/bottles/bottles
    EOF
    
    # 3) usa
    cellar-cli list                                   # archivi disponibili sul server
    cellar-cli install 'Fallen-Haven-Liberation-Day'  # scarica, estrae e installa
    cellar-cli scan-local                             # bottiglie presenti su questa macchina
    cellar-cli scan-local --json                      # output JSON per script
    cellar-cli upload Backup.tar.gz --name 'Gioco' --tags 'gog,rpg' --arch win32
    cellar-cli download 3 ~/Downloads/
    cellar-cli wizard-upload                          # wizard interattivo
    cellar-cli --server http://10.8.0.3:8080 list     # override del server
    

    Verifica dell'integrità

    sha256sum -c SHA256SUMS.txt
    

    Parità con il client Python

    Il comportamento è verificato da 30/30 test automatici (tests/parity_test.sh) che
    confrontano il binario C con cellar-cli.py originale su due server mock indipendenti:
    stdout, stderr ed exit code identici per tutti i comandi e per i casi di errore, più
    verifiche sugli artefatti (download byte-identico, albero installato identico, archivio
    C equivalente a quello Python, estrazione incrociata, compatibilità GNU tar).

    Le poche differenze volute (help più sintetico, mtime dei symlink non ripristinato come
    fa tarfile, gestione dell'EOF nei prompt interattivi, assenza di TLS) sono documentate
    nel README.md.

    Compilare da sorgente

    make          # x86-64 statico
    make 32       # i686 statico
    make arm64    # aarch64 statico (cross toolchain ARM GNU 13.2)
    make test     # test di parità (build ASan)
    make verify   # analisi di portabilità del binario
    
    Downloads