Ci sono una serie di software che ho bisogno di tenere d’occhio poiché, in caso di rilascio aggiornamento, mi serve farne pacchetti di distribuzione adatti al sistema che utilizziamo attualmente in azienda (Quest Kace). Ci sono diverse possibilità per arrivare allo stesso scopo: delegare l’azione al sistema di distribuzione (per i software compresi nella sua lista di rilascio / patching), iscriversi ai feed RSS quando e se disponibili, impostare un rilevamento delle modifiche a un particolare sito web.
Io ho optato per riprendere in mano quanto fatto – di base – per Firefox ESR / stabile in PYr2z (Mozilla Italia: migrazione di r2z, Dict e nuovo PYr2z) e allargarne lo scopo anche ad altro, mettendo in mezzo anche un canale Telegram da utilizzare come sistema di notifica vero e proprio.
gioxx / SWUpdates-Alert
Si chiama SWUpdates-Alert perché quel giorno lì avevo terminato la fantasia e non sono riuscito a passare al mercato rionale per acquistarne dell’altra, ma alla fin fine è lo scopo ultimo che deve farla da padrone, con buona pace dell’inesistente reparto marketing di questo blog. È di base uno script Python che serve a tenere d’occhio un particolare URL (principalmente si parla di lettura JSON quando possibile), una funzione che permette l’invio di messaggi in Telegram (passando dalle sue API web) e un’azione GitHub che possa programmare ed eseguire il tutto senza l’intervento umano.
Scendiamo insieme nel dettaglio se vuoi, altrimenti abbandona la nave adesso perché qui di seguito ci saranno solo tecnicismi che non interessano ai più.
Firefox
Ci avevo già lavorato, nulla quindi di rivoluzionario. Lo script che si occupa di tenere sotto monitor Firefox ESR e Firefox in versione stabile lo trovi all’indirizzo github.com/gioxx/SWUpdates-Alert/blob/main/sw_firefox.py.
Una volta portati a bordo i requirements (pochi), lo script si occupa di andare a scaricare una copia del file JSON di rilascio ufficiale (https://product-details.mozilla.org/1.0/firefox_versions.json
) prendendo i numeri di versione di Firefox ESR (FIREFOX_ESR
) e della versione stabile (LATEST_FIREFOX_VERSION
).
Salva quel dato nel file updates/FIREFOX_ESR
e – se differisce da quello che aveva precedentemente – invia una notifica al canale Telegram (appoggiandosi allo script include_tgram.py
(github.com/gioxx/SWUpdates-Alert/blob/main/include_tgram.py) e aggiorna quel dato nel file di aggiornamento, così da non allarmarsi nuovamente fino a quando la versione cambierà ancora una volta:
import requests import urllib.request import base64 import json import os import os.path import sys from jsondiff import diff from include_tgram import * def sourceJson(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 checkrepo(updates_file): with open(updates_file, "r") as f: content = f.read() first_line = content.split('\n', 1)[0] return first_line def checkversion(fxversion,channel): if (fxversion != checkrepo(os.path.join("updates",channel))): print("New version of " + channel + " is available: %s, i'm updating version file." % fxversion) writenewversion(os.path.join("updates",channel),fxversion) if (channel == "FIREFOX_ESR"): sendtotelegram("👨🏽💻 Firefox ESR: new version available! %s \nDownload from https://www.mozilla.org/firefox/enterprise/#download" % fxversion) elif (channel == "LATEST_FIREFOX_VERSION"): sendtotelegram("👨🏽💻 Firefox (Stable): new version available! %s \nDownload from https://www.mozilla.org/firefox/new/" % fxversion) else: sendtotelegram("👨🏽💻 %s: new version available! %s \nDownload from https://www.mozilla.org/firefox/browsers/" % channel,fxversion) else: print("Latest " + channel + " is the same of the repository, skip.") def writenewversion(updates_file,newversion): with open(updates_file, "w") as readversion: readversion.write(newversion) return channel = "FIREFOX_ESR" fxversion = sourceJson("https://product-details.mozilla.org/1.0/firefox_versions.json",channel) checkversion(fxversion,channel) channel = "LATEST_FIREFOX_VERSION" fxversion = sourceJson("https://product-details.mozilla.org/1.0/firefox_versions.json",channel) checkversion(fxversion,channel)
FileZilla
Simile a Firefox se non fosse per chi annuncia l’aggiornamento disponibile. Non esiste una fonte ufficiale da consultare riguardo la disponibilità di aggiornamenti del noto client FTP. Avrei potuto puntare a uno scraping della pagina web ma gironzolando per GitHub mi sono imbattuto in un progetto di uno sviluppatore cinese che ha realizzato un prodotto PowerShell per l’aggiornamento delle applicazioni Windows. Tra le sue fonti monitorate c’è anche FileZilla ed è proprio l’autore che rilascia un file JSON che io posso utilizzare per tenere d’occhio la disponibilità di nuove versioni di FileZilla (github.com/akirco/aki-apps/blob/master/bucket/filezilla.json).
Il resto non varia rispetto al paragrafo dedicato a Firefox. Versione tracciata in updates/LATEST_FILEZILLA
e messaggio di allerta nel canale Telegram solo nel caso in cui la versione rilevata nel JSON differisca da quella che conservo nel file di aggiornamento.
Se vuoi dare un’occhiata al codice dello script di check FileZilla punta il browser all’indirizzo github.com/gioxx/SWUpdates-Alert/blob/main/sw_filezilla.py.
Notepad++
L’unico diverso. Qui viene in aiuto GitHub stesso dato che Notepad++ è un progetto ospitato dal portale di proprietà Microsoft. La cosa bella è che in questa maniera posso usare le API di GitHub per capire quando viene effettuato il rilascio di una nuova versione dell’editor di testo, più precisamente basterà bussare all’indirizzo api.github.com/repos/notepad-plus-plus/notepad-plus-plus/releases/latest per ottenere un file JSON che posso tranquillamente gestire. Parlo del campo tag, è quello che gli stessi autori utilizzano per dichiarare la versione prodotto.
Il risultato è così servito all’interno del mio script sw_npp.py
(github.com/gioxx/SWUpdates-Alert/blob/main/sw_npp.py). Versione tracciata in updates/LATEST_NPP
e aggiornamento inviato a Telegram solo nel caso in cui la versione rilevata su GitHub differisca da quella da me tenuta da parte.
Se vuoi dare un’occhiata al codice dello script di check Notepad++ punta il browser all’indirizzo github.com/gioxx/SWUpdates-Alert/blob/main/sw_npp.py.
Cos’altro vuoi sapere?
Automatizzazione
Via GitHub Actions. Eseguo gli script di check alle 9:30 di ogni giorno e mando in commit le modifiche della sola cartella updates
nel caso in cui ci siano delle novità, altrimenti lascio tutto invariato e amici come prima. Se vuoi dare una sbirciata ti basterà curiosare in github.com/gioxx/SWUpdates-Alert/tree/main/.github/workflows. Qui di seguito il codice eseguito per Notepad++ (gli altri sono pressoché identici):
name: Sw Check - Notepad++ on: schedule: - cron: '30 9 * * *' workflow_dispatch: jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python 3.10 uses: actions/setup-python@v3 with: python-version: "3.10" - name: Install dependencies run: | python -m pip install --upgrade pip if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Check Software Update run: python sw_npp.py env: TGRAMTOKEN: ${{ secrets.TGRAMTOKEN }} TGRAMCHATID: ${{ secrets.TGRAMCHATID }} - name: Commit changes uses: stefanzweifel/git-auto-commit-action@v4.14.1 with: commit_message: Update Notepad++ version file push_options: '--force' skip_dirty_check: false skip_fetch: true skip_checkout: true disable_globbing: true file_pattern: updates/*
Altri software
Attualmente non pervenuti. Potenzialmente ce ne potrebbero essere molti altri, vuoi suggerirne? Ben venga, apri una nuova richiesta direttamente su GitHub oppure lascia un commento al termine di questo articolo. Meglio ancora se sei capace di fornire una fonte JSON (o equivalente) da tenere d’occhio, altrimenti la cercherò io ammesso sia disponibile.
Il canale
Hai ragione, quasi dimenticavo, lo puoi raggiungere tramite Telegram all’indirizzo t.me/SWUpdate. È silenzioso per definizione e gli unici messaggi che compariranno saranno quelli dedicati ai nuovi rilasci delle applicazioni tenute sotto monitor. Le comunicazioni non verranno inviate dal mio account bensì da quelle del bot @SWRelease_bot che parlerà esclusivamente nel canale, non sono previste funzioni private che l’utente può sfruttare in chat uno-a-uno con il bot.
Il canale è aperto a tutti, sei il benvenuto se vuoi entrarne a far parte! :-)
Io resto a disposizione per ogni ulteriore dubbio, consiglio o chiacchiera davanti a una birra, cheers 🍻.
#StaySafe
Immagine di copertina John Schnobrich on Unsplash
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! :-)