Mozilla Italia: migrazione di r2z, Dict e nuovo PYr2z

| |

Qualcuno a caso, con lo stesso tatto di un elefante in cristalleria (no dai, scherzo Dag), mi ha fatto notare che non ho fornito aggiornamenti in merito alle ultime attività legate a Mozilla Italia e alla sua comunità. È vero, non sono mai stato troppo palese nel comunicarlo ma – come forse avrai notato – mi sono allontanato un po’ dalla quotidianità di Mozilla Italia, del forum e del sito web che nel frattempo è cambiato totalmente e che oggi vive in maniera aperta e collaborativa su GitHub. Il tempo a disposizione è sempre meno e non voglio essere un peso per il progetto, ampio spazio alle nuove leve quindi, Daniele sta facendo un ottimo lavoro (e con lui anche tutti gli altri del gruppo).

Firefox Nightly: nuova integrazione Firefox Monitor, blocco CryptoMining e Fingerprint

Ciò detto, qualche novità di cui parlare c’è sicuramente. Riepilogo il tutto qui di seguito.

r2z e Dict

Release2Zip (per gli amici r2z) e Firefox Dict sono stati ufficialmente migrati nell’organizzazione Mozilla Italia su GitHub. Ne faccio parte da molto tempo, custodisce tutti i progetti collaborativi legati alla comunità italiana e mi è sembrato quindi giusto spostare in questo spazio ambo i progetti che precedentemente occupavano un posto nel mio account GitHub personale. Ne ho approfittato per cessare anche i virtual host assegnati su noads.it per i rispettivi siti web che ora puoi trovare agli indirizzi mozillaitalia.github.io/r2z e mozillaitalia.github.io/firefox-dict, è GitHub Pages ora a fare tutto il lavoro sporco.

Il codice di Release2Zip non è stato modificato, tutti i rilasci sono disponibili ora su github.com/MozillaItalia/r2z/releases. Dict ha ricevuto qualche nuovo vocabolo, se lo utilizzi è arrivato il momento di lanciare un aggiornamento sul tuo PC :-)

PYr2z: r2z tradotto in Python

Che poi forse è l’unica novità davvero degna di nota e che ti può interessare conoscere meglio, nonostante sia già in funzione da un po’ e sia stata completamente integrata – in maniera pressoché trasparente – nel sito web di Mozilla Italia.
Ho preso la funzione principale di r2z “offline” e l’ho tradotta in Python, automatizzando poi il rilascio pacchetti di Firefox (in versione stabile ed ESR) e Thunderbird tramite GitHub Actions. Scendo un po’ più nel dettaglio, sentiti libero di abbandonare la nave ora che sei ancora in tempo.

Mozilla Italia: migrazione di r2z, Dict e nuovo PYr2z (Python)

r2z ha sempre utilizzato lo spazio FTP pubblico di Mozilla per catturare i pacchetti di Firefox e Thunderbird in base all’esigenza dell’utilizzatore. Bisognava poi prendere quei file ZIP e caricarli manualmente sul sito web di Mozilla Italia, permettendo così a tutti di poter scaricare le versioni portabili dei due programmi di punta più aggiornati, il tutto cercando di rimanere quanto più fedeli alla reale data di rilascio dell’eseguibile completo da parte dell’azienda.

Automatizzare il processo era la via più ovvia e comoda da intraprendere, per staccarsi da un’attività evidentemente lasciata in balia delle onde. Grazie a Francesco, sono venuto a conoscenza dell’esistenza di due file JSON tenuti aggiornati da Mozilla stessa, disponibili rispettivamente per Firefox e Thunderbird agli indirizzi product-details.mozilla.org/1.0/firefox_versions.jsonproduct-details.mozilla.org/1.0/thunderbird_versions.json.

Al loro interno sono riportati i numeri di versioni attuali per ciascun ramo di rilascio di ambedue gli applicativi. Basta aprire il primo per capire (a oggi che sto scrivendo l’articolo) che Firefox è arrivato alla versione “100.0.1” (stabile) o “91.9.0esr” (se parliamo di quella con durata supporto estesa, dedicata alle aziende prima di tutto). All’interno dei file vengono anche proposte le date ultime di rilascio e quelle che – a meno di problemi – seguiranno, ma non è un dato che al momento ci interessa. Quello che va a completare questo quadro, è – almeno per ora – l’indirizzo internet che puoi comporre per arrivare dritti alla destinazione, ovvero a quell’URL completo che ti consentirà di scaricare il pacchetto che desideri, per capirci:

"https://ftp.mozilla.org/pub/firefox/releases/%s/win64/it/Firefox Setup %s.exe"

Dove entrambi quei %s verranno sostituiti dal numero di versione preciso che ti interessa scaricare. Chiaro che se intendi scaricare una versione del pacchetto a 32 bit, dovrai anche andare a ritoccare quel win64 con un win32, il resto però rimarrà sempre identico. Poco e nulla cambia nel caso di Thunderbird:

"https://ftp.mozilla.org/pub/thunderbird/releases/%s/win64/it/Thunderbird Setup %s.exe"

Mettere insieme i pezzi

Ora che le cose fondamentali da sapere sono al sicuro, bisogna mettere insieme i pezzi e appoggiarsi alle capacità di Python (che poi è perché è comodo per me e per far girare il tutto su GitHub, tu sulla carta potresti decidere di utilizzare tutt’altro linguaggio per arrivare a tagliare la stessa identica linea del traguardo) per ottenere in ordine:

  • il pacchetto di installazione desiderato dallo spazio web di Mozilla (che si tratti di Firefox o Thunderbird poco importa).
  • Scompattare quel pacchetto, buttare via ciò che non è necessario e tenere solo la cartella contenente il programma.
  • Creare un file ZIP (o 7-Zip, in questo caso) contenente una versione di Firefox (o Thunderbird) che potrai comodamente portare con te e/o eseguire su qualsivoglia PC dove non puoi installare alcunché.

Questo viene tradotto in codice che puoi tu stesso sbirciare andando all’indirizzo github.com/MozillaItalia/pyr2z/blob/main/r2zfx-win64.py. Lo script in questione scaricherà la versione più aggiornata di Firefox a 64 bit, la stabile per la precisione. Qualche passaggio fondamentale:

channel = "LATEST_FIREFOX_VERSION"
fxversion = mzlaJson("https://product-details.mozilla.org/1.0/firefox_versions.json",channel)
folder = "fx-win64"
zipfilename = "firefox-"+fxversion+"-it.win64.7z"
file_exist = os.path.join(folder,zipfilename)

if (os.path.exists(file_exist)):
    print("Same version, abort.")
    with open(env_file, "a") as ghenv:
        ghenv.write("DIFF=None\n")
    sys.exit
else:
    pkgpath = "https://ftp.mozilla.org/pub/firefox/releases/%s/win64/it/Firefox Setup %s.exe" % (fxversion,fxversion)
    pkgname = "Firefox Setup %s.exe" % fxversion
    download = mzlaDownload(pkgpath,pkgname)
    print(channel,download)
    html = makewebpage(folder,zipfilename)
    with open ("fx64.html", 'w') as fp:
        fp.write(html)

Leggerò il file JSON alla ricerca del ramo di aggiornamento che mi interessa (il LATEST_FIREFOX_VERSION altro non è che lo stabile, NdA), specificherò la versione desiderata (Windows, 64 bit) e andrò a comporre quello che sarà il nome del mio pacchetto 7z al termine del processo (zipfilename). Dopo un rapido controllo che verifica se esiste già il file all’interno dello spazio GitHub (vuol dire che è stato già scaricato e che non dovrò rifare il lavoro), costruirò l’URL completo tramite il quale recuperare il pacchetto (pkgpath).

A questo punto potrò scaricarlo in locale:

def mzlaDownload(url,filename):
    # URL di esempio https://ftp.mozilla.org/pub/firefox/releases/98.0.1/win64/it/Firefox%20Setup%2098.0.1.exe
    url = url.replace(" ", "%20") # https://stackoverflow.com/a/69811079
    urllib.request.urlretrieve(url,filename)
    hash_md5 = hashlib.md5() # https://stackoverflow.com/a/3431838
    with open(filename, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()

Una pagina web ospitata da GitHub Pages mi proporrà così un collegamento diretto al pacchetto 7z da scaricare non appena la visiterò. Se si pensa a questo esempio, basato sulla versione stabile di Firefox per Windows a 64 bit, la pagina in questione è questa: mozillaitalia.github.io/pyr2z/fx64.html.

Che fine ha fatto il file 7z?

Calma cowboy, è presto detto. Quello che inizialmente faceva già lo script di cui ti parlavo una manciata di righe fa, grazie all’utilizzo della riga di comando 7-Zip per Linux, l’ho delegato a una serie di righe di codice raccolte in un’azione di GitHub perché non è possibile far girare sul noto servizio di hosting progetti.
Per questo motivo, ecco chi si occupa di fare il lavoro sporco partendo da informazioni molto precise:

- name: Check Vars
  if: env.DIFF != 'None'
  run: |
       echo ${{ env.CHANNEL }}
       echo ${{ env.PKGNAME }}
       echo ${{ env.FXVERSION }}
       echo ${{ env.FXZIPFILE }}

- name: FxUnzip
  if: env.DIFF != 'None'
  uses: DuckSoft/extract-7z-action@v1.0
  with:
    pathSource: ${{ env.PKGNAME }}
    pathTarget: "FxTemp64"

- name: Move Core Directory
  if: env.DIFF != 'None'
  run: mv './FxTemp64/core' './core64'

- name: FxZip
  if: env.DIFF != 'None'
  uses: edgarrc/action-7z@v1
  with:
    args: 7z a -t7z -mx=9 fx-win64/${{ env.FXZIPFILE }} ./core64/*

Questo pezzo di azione legge dapprima una serie di variabili prodotte dal mio script Python (ramo di aggiornamento, nome del pacchetto, versione di Firefox e nome completo del pacchetto 7z da produrre), quindi scompatta il file precedentemente scaricato (FxUnzip) e sposta la cartella utile in uno spazio temporaneo (Move Core Directory) prima di far diventare il contenuto di quella cartella un file 7z da caricare successivamente su GitHub (FxZip), buttando via tutto il resto.

Un commit rapido ed ecco servito il pacchetto finalmente scaricabile tramite GitHub.

Il tutto è stato “collegato” alla pagina Download ufficiale del sito web di Mozilla Italia semplicemente proponendo un collegamento alla pagina che scatenerà l’evento di scaricamento del file interessato, quella pagina di cui già ti parlavo prima:

Mozilla Italia: migrazione di r2z, Dict e nuovo PYr2z 1

Tutto il codice utilizzato è certamente migliorabile e sono assolutamente aperto a consigli, suggerimenti ma – soprattutto – a Pull Request direttamente su GitHub, la collaborazione è l’anima dell’Open Source. Questo è stato e vuole essere tutt’oggi un progetto collaterale, un qualcosa che mi appassiona e che faccio nel poco tempo libero a disposizione, una donazione “as-is” alla comunità che per tanti anni mi ha tenuto (insieme a molti altri) al centro delle attività Mozilla in Italia, un orgoglio che ancora oggi fa curriculum e del quale non posso che parlare bene.

Extra

È un paragrafo del quale certamente potevi fare a meno, ma ci tenevo a farti dare un’occhiata allo script che – se GitHub permettesse l’utilizzo della command line di 7-Zip – avrei potuto utilizzare per velocizzare i tempi. È uno script che a questo punto può essere eseguito su una tua macchina, senza che GitHub si infili in mezzo:


import requests
import urllib.request
import base64
import json
import os
import shutil
import subprocess
import hashlib
channel = "LATEST_FIREFOX_VERSION"
def fxjson(path,channel):
urllib.request.urlretrieve(path,"firefox_versions.json")
with open("firefox_versions.json", 'r') as f:
response = json.load(f)
os.remove("firefox_versions.json")
return response[channel]
def fxdownload(url,filename):
# URL di esempio https://ftp.mozilla.org/pub/firefox/releases/98.0.1/win64/it/Firefox%20Setup%2098.0.1.exe
url = url.replace(" ", "%20") # https://stackoverflow.com/a/69811079
urllib.request.urlretrieve(url,filename)
hash_md5 = hashlib.md5() # https://stackoverflow.com/a/3431838
with open(filename, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
def fxTempClean():
shutil.rmtree('./FxTemp', ignore_errors=True)
shutil.rmtree('./core', ignore_errors=True)
return
def fxUnzip(filename):
fxTempClean()
# https://stackoverflow.com/a/325495
cmd = ['./7zz', 'x', filename, '-oFxTemp']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
"""
for line in p.stdout:
print(line)
"""
p.wait()
return p.returncode
def fxZip(version):
shutil.move('./FxTemp/core','./core')
fxZipFile = "firefox-%s-it.win32.zip" %version
# https://stackoverflow.com/a/325495
cmd = ['./7zz', 'a', fxZipFile, './core/*']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
p.wait()
return p.returncode
fxversion = fxjson("https://product-details.mozilla.org/1.0/firefox_versions.json",channel)
pkgpath = "https://ftp.mozilla.org/pub/firefox/releases/%s/win64/it/Firefox Setup %s.exe" % (fxversion,fxversion)
pkgname = "Firefox Setup %s.exe" % fxversion
download = fxdownload(pkgpath,pkgname)
print(channel,download)
unzip = fxUnzip(pkgname)
zip = fxZip(fxversion)
fxTempClean()

view raw

r2z-fx.py

hosted with ❤ by GitHub

Questo è quanto. Grazie per aver letto fino a qui, evidentemente eri proprio interessatə! 🍻

#StaySafe

Correzioni, suggerimenti? Lascia un commento nell'apposita area qui di seguito o contattami privatamente.
Ti è piaciuto l'articolo? Offrimi un caffè! ☕ :-)

L'articolo potrebbe non essere aggiornato

Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)

Condividi l'articolo con i tuoi contatti:
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

1 Commento
Oldest
Newest Most Voted
Inline Feedbacks
View all comments