Repository 32bit  Forum
Repository 64bit  Wiki

Check For Updated

Da Slacky.eu.
Versione delle 21:11, 23 nov 2008, autore: Targzeta (Discussione | contributi)

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

Indice

Introduzione

Lo script chek_upgrade.sh controlla se una determinata pagina internet, o parte di essa (grazie all'uso di filtri), è stata modificata a partire da una data iniziale. Lo script è stato creato con lo scopo di scoprire se un determinato progetto che si vuole tenere d'occhio, è stato modificato oppure no, dall'ultima volta che lo si è controllato. Questo perchè la slackware non è fornita di tutti i programmi e librerie esistenti, e quindi vi è una necessita di seguire in prima persona determinati progetti.

Download

La prima cosa da fare è procurarsi lo script dal link:
http://www.slacky.eu/wikislack/script/check-upgrade/check_upgrade.sh

L'ambiente di lavoro

Lo script lavora su directory, l'idea è che per ogni progetto che l'utente segue, ci sia una directory associata, ad esempio nella mia macchina ho:

$> ls -1F Software/
FileZilla/
a52dec/
aircrack-ng/
amrnb/
amrwb/
audacity/
...
check_upgrade.sh*
...

come si nota, lo script è all'interno della directory Software, la quale contiene una directory per ogni progetto che seguo (FileZilla, aicrack-ng, etc. etc.).

Lo script e le varie modalità

Lo script opera in diversi modi a seconda di quale modalità si scelga di eseguire. L'elenco delle modalità lo si trova con l'uso dell'opizione --help

$> check_upgrade.sh --help
Uso: check_upgrade.sh MODALITA [opzioni] arg1... 
     check_upgrade.sh MODALITA -h|--help 
     check_upgrade.sh -v|--version 

MODALITA è una tra:
        check
        init
        not-conform
        update
        url

noi qui spieghiamo tutte le modalità una ad una, non in ordine alfabetico come mostrato dall'help, ma in ordine d'uso.

Modalità init

Questa è la prima modalità che si usa per iniziare a seguire un progetto. L'help per questa modalità è il seguente:

$> check_upgrade.sh init --help
Uso: check_upgrade.sh init [opzioni] dir URL 

Inizializza la directory dir tramite l'URL passatogli. 

Opzioni: 
  -q:   quiet 
  -v:   verbose

gli argomenti sono quindi soltanto due:

  • Il nome della directory associata al progetto da seguire
  • L'URL della pagina web in cui vengono annunciati i cambiamenti o nuove release

Ad esempio per il progetto FileZilla si ha:

quindi per iniziare a seguire il progetto si esegue:

$> check_upgrade.sh init FileZilla/ http://filezilla-project.org/download.php?type=client
# Directory: FileZilla
INIZIALIZZATA
NOTA: il nome della directory non deve finire necessariamente con il carattere '/', nell'esempio
ho usato il tasto <TAB> e la shell ha completato il nome per me.

Che vuol dire inizializzata?

Una volta che la directory è stata inizializzata la si definisce "conforme" allo script, ovvero lo script al suo interno ha creato una sottodirectory di nome .check_upgrade con all'interno due file:

$> tree FileZilla/.check_upgrade/
FileZilla/.check_upgrade/
|-- page
`-- url

0 directories, 2 files
page 
la pagina web indirizzata dall'URL, scaricata tramite il comando wget
url 
contiene l'URL che si è passato come parametro.

Modalità check

Una volta inizializzata la directory, possiamo seguire il progetto quando ci pare facendo un check su di essa. L'help per questa modalità è:

$> check_upgrade.sh check --help
Uso: check_upgrade.sh check [opzioni] dir1... 

Controlla se la pagina è aggiornata. 

Opzioni: 
  -d:   mostra l'output di 'diff' quando controlla l'aggiornamento 
  -f:   mostra la pagina filtrata (non effettua controlli sull'aggiornamento) 
  -k:   non elimina i file temporanei all'uscita 
  -o:   produce output solo se la pagina è stata aggiornata 
  -q:   quiet 
  -s:   non stampa errori sulle directory non conformi 
  -v:   verbose

come si vede, si può fare il check anche su più directory contemporaneamente, in effetti lo si può fare anche su directory non conformi o file, lo script salterà i file, e tramimte l'opzione '-s' non stamperà nulla sulle directory non conformi. Questo è utile se si vuole eseguire il check sull'intera directory Software con:

$> check_upgrade.sh check *

Lo script, quando è invocato con questa modalità segue il seguente algoritmo (a parte con l'uso dell'opzione '-f'):

  • scarica la pagina web identificata dall'indirizzo trovato nel file .check_upgrade/url in un file temporaneo
  • fa una copia della pagina web .check_upgrade/page in un altro file temporaneo
  • se ci sono filtri, allora filtra entrambe le pagine temporanee
  • esegue il comando diff per vedere se ci sono differenze tra le due pagine temporanee

Un esempio di invocazione:

$> check_upgrade.sh check FileZilla/
# Directory: FileZilla
OK

il valore di ritorno 'OK' indica che la pagina .check_upgrade/page non differisce (filtrata) dalla pagina internet

Opzione -d

Tramite questa opzione, lo script mostrerà l'output del comando diff sulle pagine temporanee, questo è utile per vedere se effettivamente la differenza è dovuta ad una nuova release per il progetto, oppure ad altre cause.

Se è dovuta ad altre cause si può migliorare il controllo creando appositi filtri (vedremo in seguito l'uso dei filtri)

Opzione -f

In questo caso lo script non esegue l'algoritmo spiegato in precedenza, ma si limita a filtrare la pagina '.check_upgrade/page e a mostrare l'esito del filtro, e quindi la porzione di pagina che si vuole controllare. L'opzione è utile per testare i filtri (vedremo in seguito l'uso dei filtri)

Opzione -k

Come si è visto lo script crea almeno due file temporanei, quelli sui quali applica i filtri ed esegue diff. Passando questa opzione, lo script non eliminerà questi due file temporanei.

Ad esempio:

$> check_upgrade.sh check -k FileZilla/
# Directory: FileZilla
OK

Il file /tmp/checkiEW7wR non è stato eliminato. 
Il file /tmp/checkJlotcW, non è stato eliminato.

Questa opzione la tovavo utile prima dell'introduzione dell'opzione '-f'.

Opzione -o

Lo script, per ogni directory che gli si passa produce una serie di output tipo quello visto negli esempi precedenti. Questa opzione inibisce lo script a produrre output se il comando diff torna che le due pagine temporanee sono identiche. Nel nostro esempio, dato che la directory FileZilla viene trovata 'OK', lo script, con questa opzione, non avrebbe prodotto output. E' molto utile se si invoca lo script passandogli molte directory, o addirittuta '*'.

Ad esempio:

$> check_upgrade.sh check -o FileZilla/ amrwb/
# Directory: amrwb
DA AGGIORNARE

Opzione -q (caso particolare)

Questa opzione inibisce lo script a produrre output, in pratica rende incompresibile l'uso dello script. L'unico motivo per cui esiste ancora è che in associazione con l'opzione '-o', si ha l'elenco delle directory per le quali lo script produrrebbe 'DA AGGIORNARE'.

Ad esempio:

$> check_upgrade.sh check -qo FileZilla/ amrwb/
amrwb

Opzione -s

Normalmente se allo script gli si passa una directory non conforme esso produrra in output una scritta simile a questa:

$> check_upgrade.sh check Kernel/
# Directory: Kernel
  Attenzione: Kernel non ha: 
        * o la sottodirectory .check_upgrade 
        * o il file .check_upgrade/url 
        * o il file .check_upgrade/page

Tramite l'uso di questa opzione, lo script salta queste directory e quindi non produrrà nessun output. Anche questa opzione è utile se si invoca lo script su più directory in contemporanea o su '*'.

Modalità update

Una volta che il progetto locale è stato aggiornato (poiché la modalità check ha ritornato 'DA AGGIORNARE'), l'unico modo per far sapere allo script che la directory è di nuovo aggiornata, è quello di invocarlo con questa modalità. L'help è il seguente:

$>check_upgrade.sh update --help
Uso: check_upgrade.sh update [opzioni] dir1... 

Aggiorna, riscaricando la pagina, la directory dir. 

Opzioni: 
  -q:   quiet 
  -v:   verbose

L'algoritmo seguito in questo caso è:

  • scarica la pagina web identificata dall'indirizzo trovato nel file .check_upgrade/url nel file .check_upgrade/page
  • notifica all'utente

Ad esempio, se aggiorno la directory amrwb, per il quale lo script mi ha tornato 'DA AGGIORNARE', invocando lo script con questa modalità ottengo:

$> check_upgrade.sh update amrwb/
# Directory: amrwb
AGGIORNATO

Quindi, le prossime esecuzioni della modalità check useranno la nuova pagina appena scaricata per il confronto.

Modalità not-conform

La modalità si limita ad elencare, tra le directory passategli, quelle non conformi. L'help è il seguente:

$> check_upgrade.sh not-conform --help
Uso: check_upgrade.sh not-conform dir1... 

Stampa il nome delle dir non conformi (non inizializzate).

In questo modo possiamo sempre sapere quali, tra le nostre directory, non sono state ancora inizializzate.

Esempio:

$> check_upgrade.sh not-conform FileZilla/ amrwb/ Kernel/
Kernel

Modalità url

Per ogni directory passatagli, se la directory è conforme, lo script stampa l'URL trovato nel file .check_upgrade/url. L'help è il seguente:

$> check_upgrade.sh url --help
Uso: check_upgrade.sh url dir1... 

Stama l'URL impostato per la directory dir. 

Opzioni: 
  -v:   verbose

Ad esempio:

$> check_upgrade.sh url FileZilla/ amrwb/ Kernel/
# Directory: FileZilla
http://filezilla-project.org/download.php?type=client

# Directory: amrwb
http://www.penguin.cz/~utx/amr

Così sappiamo sempre rintracciare il link ai nuovi sorgenti per il progetto che stiamo seguendo.

Filtri

I filtri sono un modo per far si che lo script esegua il comando diff solo una porzione e non sull'intera pagina.

Attualmente i filtri si devono creare a mano e vanno messi in file nella sottodirectory .check_upgrade/ del nostro progetto. Ci sono quattro tipi di filtri, caratterizzati da altrettanti nomi file.

Quando lo script viene invocato con la modalità check, prima di eseguire il comando diff, se trova i file dei filtri, filtra i file temporanei con i filtri trovati al loro interno.

Il filtro compare_only_line

Se esiste un file chiamato .check_upgrade/compare_only_line, questo file deve contenere, una per riga, una espressione regolare. Solo le righe dei file temporanei che hanno il match con queste espressioni regolari saranno confrontate.

Ad esempio, se si guarda il link impostato per FileZilla, si noterà che in quella pagina vengono linkati sia i sorgenti per linux, sia l'installer per Windows, per Mac OS, etc. etc. Dato che a me interessa controllare solo se sono stati postati nuovi sorgenti per linux, ho creato il file .check_upgrade/compare_only_line con all'interno questa espressione regolare:

FileZilla.*src.*bz2

Per vedere cosa effettivamente compara il comando diff basta eseguire lo script con modalità check e opzione '-f':

 
$> check_upgrade.sh check -f FileZilla/
# Directory: FileZilla
  <p><a href="https://www.ohloh.net/projects/filezilla/download?filename=FileZilla_3.1.5.1_src.tar.bz2">FileZilla_3.1.5.1_src.tar.bz2</a> </p>

come si può notare, il filtro ha lasciato passare solo la riga che contiene il link ai sorgenti.

Il filtro filter_line_number

Se esiste un file chiamato .check_upgrade/filter_line_number, questo file deve contenere, per ogni riga, un numero. Lo script sopprimerà le righe corrispondenti dalla pagina, prima di eseguire diff.

Il filtro filter_line_regex

Se esiste un file chiamato .check_upgrade/filter_line_regex, questo file deve contenere, per ogni riga, una espressione regolare. Lo script sopprimerà le righe della pagina che hanno il match con una di queste espressioni regolari, prima di eseguire diff.

Il filtro filter_word

Se esiste un file chiamato .check_upgrade/filter_word, questo file deve contenere, per ogni riga, una espressione regolare. Lo script sopprimerà, per ogni riga che ha il match con una di queste espressione regolari, l'espressione regolare stessa.

Ad esempio, con riferimento all'output prodotto già dal filtro compare_only_line nell'esempio precedente, se noi volessimo eliminare dall'unica riga prodotta dal filtro, anche tutte le parole dall'inizio della riga sino al protocollo https, basta fare:

$> echo '^.*href="' > FileZilla/.check_upgrade/filter_word

$> check_upgrade.sh check -f FileZilla/
# Directory: FileZilla
https://www.ohloh.net/projects/filezilla/download?filename=FileZilla_3.1.5.1_src.tar.bz2">FileZilla_3.1.5.1_src.tar.bz2</a> </p>

L'ordine di esecuzione dei filtri

I filtri sopra citati vengono eseguiti nel seguente ordine:

  • compare_only_line
  • filter_line_number
  • filter_line_regex
  • file_filter_word

In realtà l'ordine degli ultimi tre filtri può non essere importante, ma si deve tenere bene in mente che prima si filtrano i file temporanei con il filtro compare_only_line in modo da ridurre la porzione di pagina, e poi su questa già ridotta porzione, vengono eseguiti, se ci sono, i filtri per sopprimere altre righe o parole.

Protocollo, Sourceforge e RSS

Lo script ovviamente non accetta solo pagine web con protocollo http, ma con tutti i tipi di protocollo (vedi ftp) che ritornano delle pagine di testo da poter confrontare.

Moltissimi progretti ormai sono hostati su sourceforge, il quale fornisce gli RSS (sempre presi via http) per tenere d'occhio i progetti. Uno dei progetti che seguo e che è hostato da sourceforce è p7zip. Per usare gli RSS di sourceforge basta andare sulla sezione 'Download' del progetto, nel caso di p7zip è:
http://sourceforge.net/project/showfiles.php?group_id=111810

Nella tabella in cui vengono mostrate le varie release c'è anche una colonna chiamata 'Notes/Monitor', clikkando sull'icona di 'Notes' si viene spostati sulla pagina delle note per il progetto, nell'esempio di p7zip si va su:
http://sourceforge.net/project/shownotes.php?group_id=111810&release_id=605388

Questa pagina contiene anche l'icona degli RSS, clikkandola si viene portati sulla pagina della scelta degli RSS ai quali ci si vuole abbonare, sempre per p7zip la pagina è:
http://sourceforge.net/export/rss2_project.php?group_id=111810

Se ora si scegli l'XML associato a 'Project file releases', ci si sposterà sull'RSS che in cui viene inserito il link ad una nuova versione, quando questa viene rilasciata. Per p7zip il link è:
http://sourceforge.net/export/rss2_projfiles.php?group_id=111810

Bene, questo è l'indirizzo che possiamo usare per inizializzare la nostra directory.

Nota: per sbrigarsi basta prendere il link della sezione 'Download' del nostro progetto, nel nostro caso:
   http://sourceforge.net/project/showfiles.php?group_id=111810
e sostituire, nel link, tutto ciò che precede il '?' con 
  'http://sourceforge.net/export/rss2_projfiles.php'
nel nostro caso quindi diventa:
   http://sourceforge.net/export/rss2_projfiles.php?group_id=111810

Filtrare gli RSS di sourceforge

Gli RSS di sourceforge vengono modificati anche ogni qualvolta un sorgente viene scaricato (incrementando un contatore), quindi di solito bisogna e basta, aggiungere i filtri filter_line_regex e filter_word, inserendoci rispettivamente:

filter_line_regex 
RSS generated by
filter_word 
[[:digit:]]\+ downloads to date)

Ad esempio per la directory p7zip/ basta fare:

$> echo 'RSS generated by' > p7zip/.check_upgrade/filter_line_regex

$> echo '[[:digit:]]\+ downloads to date)' > p7zip/.check_upgrade/filter_word

Working in progress

Lo script necessita ancora di ottimizzazioni, ritocchi ed espansioni. Per ora ad esempio il comportamento con le opzioni delle varie modalità è un pò bizzarro, basti pensare che l'opzione '-q' e '-v' non generano un errore di incompatibilità.

Ho in mente anche una madalità db per poter esportare ed importare URL e/o filtri. In questo modo basterebbe avere un pacchetto il più completo possibile di queste informazioni per far si che più utenti possano controllare gli stessi progetti senza doversi ogni volta scovare URL e filtri adatti.

Tutto si può fare e tutto forse si farà, certo è che se chiunque si senta pratico di scripting bash abbia anche la volontà di collaborare, tutto si potrebbe fare più in fretta :)

Conclusioni

Spero che lo script possa essere di aiuto ai "pacchettizzatori" di Slacky.eu, ma anche a chiunque necessiti di un metodo rapido per tenere d'occhio tutto un insieme di progetti interessanti, basti pensare al caso limite di chi si fa distribuzioni "from scratch".

Autore (data dell'ultimo aggiornamento): Spina 20:11, 23 Nov 2008 (CET)

Strumenti personali
Namespace

Varianti