Repository 32bit  Forum
Repository 64bit  Wiki

Check For Updated: differenze tra le versioni

Da Slacky.eu.
(Aggiornato il wiki alla versione 1.11 dello script.)
(Cambiato nick)
Riga 9: Riga 9:
=Download=
=Download=
Lo script si trova all'indirizzo:<br/>
Lo script si trova all'indirizzo:<br/>
http://www.slacky.eu/~spina/script/check_for_updates.sh
+
http://www.slacky.eu/~targzeta/script/check_for_updates.sh
==NOTA per le versioni dalla 1.5 in poi==
==NOTA per le versioni dalla 1.5 in poi==
Riga 60: Riga 60:
url
url
by Emanuele Tomasi aka Spina <spina80@gmail.com>
+
by Emanuele Tomasi aka targzeta <targzeta@gmail.com>
</pre>
</pre>
Riga 365: Riga 365:
Autore (data dell'ultimo aggiornamento):<br/>
Autore (data dell'ultimo aggiornamento):<br/>
[[Utente:Spina|spina]] ([[Discussioni utente:Spina|discussioni]]) 00:08, 1 ago 2012 (CEST)
+
[[Utente:targzeta|targzeta]] ([[Discussioni utente:targzeta|discussioni]]) 00:08, 1 ago 2012 (CEST)

Versione delle 23:56, 2 ott 2012

Indice

Introduzione

Lo script check_for_updates.sh controlla se una determinata pagina internet è stata modificata. Lo si può pensare come un'alternativa ai feed RSS.

Lo script è stato creato con lo scopo di scoprire se un determinato progetto è stato modificato oppure no, dall'ultima volta che lo si è controllato.

Download

Lo script si trova all'indirizzo:
http://www.slacky.eu/~targzeta/script/check_for_updates.sh

NOTA per le versioni dalla 1.5 in poi

Se si passa da una versione precedente ad una >= della 1.5, dato che lo script ha cambiato nome (da check_upgrade.sh a check_for_updates.sh), si dovrebbero anche rinominare tutte le sottodirectory .check_upgrade in .check_for_updates. Ecco uno script che potrebbe essere d'aiuto:

for file in *;
  do
    if [ -d $file ] && [ -d ${file}/.check_upgrade ];
      then
        mv ${file}/.check_upgrade ${file}/.check_for_updates;
    fi;
  done

Se invece è la prima volta che si usa lo script, questo non è necessario!!

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:

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

come si nota, lo script è all'interno della directory software, la quale contiene una directory per ogni progetto che si vuole seguire (FileZilla, aicrack-ng, 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_for_updates.sh --help
Uso: check_for_updates.sh [opzioni] MODALITA [mod_opzioni] arg1...
     check_for_updates.sh MODALITA -h|--help
     check_for_updates.sh -v|--version

Opzioni:
  -c    Non colora l'output

MODALITA e' una tra:
        check
        db
        init
        not_conform
        update
        url

by Emanuele Tomasi aka targzeta <targzeta@gmail.com>

Modalità init

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

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

Inizializza la directory dir tramite l'URL passatogli.

Opzioni:
-g      forza l'uso del protocollo git
-q      quiet
-s      forza l'uso del protocollo svn
-v      verbose

L'URL va quotato se contiene caratteri speciali per la shell,
come ad esempio il carattere '&'.

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;
Nota:
Come dice anche l'help, l'URL va quotato se contiene caratteri che la shell può interpretare o espandere. Vedi appunto il carattere '&' che per la shell significa: "manda in background".

Ad esempio, per il progetto FileZilla si ha:

quindi per iniziare a seguire il progetto basta eseguire:

$> check_for_updates.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 '/'.

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_for_updates con all'interno due file:

page 
la pagina web indirizzata dall'URL (scaricata tramite il comando wget);
url 
l'URL che si è passato come parametro;
$> tree FileZilla/.check_for_updates/
FileZilla/.check_for_updates/
|-- page
`-- url

0 directories, 2 files

Protocolli

Ci sono vari tipi di protocolli accettati dallo script, il protocollo da usare viene individuato analizzando l'inizio dell'URL oppure attraverso l'uso delle opzioni -g e -s della modalità init.

http(s) o ftp

Il download delle pagine per questi protocolli avviene tramite il comando:

 wget --no-check-certificate

L'uso di questi protocolli è di default quando l'URL inizia con http(s):// oppure ftp.

svn

L'uso di subversion avviene scaricando, come pagina da confontare, il log, e viene fatto usando:

svn info -r HEAD

L'uso di questo protocollo è di default quando l'URL inizia con svn://. Poichè però subversion si appoggia anche su altri protocolli, si può forzare l'uso di questo protocollo anche con URL che non iniziano con svn://. Per fare questo basta semplicemente usare l'opzione -s della modalità init.

git

L'uso di git avviene scaricando, come pagina da confrontare, il log, e viene fatto usando:

git ls-remote HEAD

L'uso di questo protocollo è di default quando l'URL inizia con git://. Poichè però git si appoggia anche su altri protocolli, si può forzare l'uso di questo protocollo anche con URL che non iniziano con git://. Per fare questo basta semplicemente usare l'opzione -g della modalità init.

Modalità check

Una volta inizializzata la directory, si può seguire il progetto facendo un check su di essa. L'help per questa modalità è:

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

Controlla se la pagina e' aggiornata.

Opzioni:
-d      mostra l'output di 'diff' quando controlla l'aggiornamento
-e      non mostra gli errori di download
-f      mostra la pagina filtrata (non effettua controlli sull'aggiornamento)
-k      non elimina i file temporanei all'uscita
-n      mostra l'output di 'diff' stampando solo le nuove righe. Ignora '-d'
-o      produce output solo se la pagina e' stata aggiornata. Implica '-s'
-q      quiet. Implica '-s'
-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 neanche sulle directory non conformi. Questo è utile se si vuole eseguire il check su di un'intera directory con:

$> check_for_updates.sh check *

Lo script, quando è invocato con questa modalità segue il seguente algoritmo (a meno che non venga eseguito con l'opzione '-f'):

  • scarica la pagina web (identificata dall'indirizzo trovato nel file .check_for_updates/url) in un file temporaneo;
  • fa una copia della pagina web .check_for_updates/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 è il seguente:

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

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

Opzione -d

Tramite questa opzione, lo script mostrerà l'output del comando diff sulle pagine temporanee. Questo è utile per vedere se effettivamente la differenza è significativa oppure no. Se non è significativa, si può migliorare il controllo creando appositi filtri (si vedrà 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_for_updates/page e a mostrare l'esito dei filtri e, quindi, la porzione di pagina che si verrà controllata.

Opzione -k

Con questa opzione, lo script non eliminerà i file temporanei creati per il confronto.

Opzione -n

Questa opzione è simile (e ne è un alternativa) all'opzione -d, con la differenza che mostra soltanto le nuove righe. E' utile nel caso la pagina che si tiene sotto controllo sia effettivamente un log con entry che vengono eliminate in favore di nuove.

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. Nell'esempio, dato che la directory FileZilla viene trovata 'OK', lo script, con questa opzione, non produce output. E' molto utile se si invoca lo script passandogli molte directory, o addirittuta '*'.

Ad esempio:

$> check_for_updates.sh check -o FileZilla/ amrwb/
# Directory: amrwb
DA AGGIORNARE
NOTA:
L'uso di questa opzione implica l'opzione '-s'.

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_for_updates.sh check -qo FileZilla/ amrwb/
amrwb
NOTA:
L'uso di questa opzione implica l'opzione '-s'.

Opzione -s

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

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

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

Modalità update

L'unico modo per far sapere allo script che una directory è di nuovo aggiornata, è quello di invocarlo con questa modalità. Lo script scaricherà la nuova pagina web e la sostituirà con quella in .check_for_updates/page. L'help è il seguente:

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

Aggiorna, riscaricando la pagina, la directory dir.

Opzioni:
-q      quiet
-v      verbose

Ad esempio, se si aggiorna la directory amrwb, per il quale lo script ha ritornato 'DA AGGIORNARE', invocando lo script con questa modalità si ottiene:

$> check_for_updates.sh update amrwb/
# Directory: amrwb
AGGIORNATA

Modalità not_conform

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

$> check_for_updates.sh not_conform --help
Uso: check_for_updates.sh not_conform dir1...

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

Ad esempio:

$> check_for_updates.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_for_updates/url. L'help è il seguente:

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

Stampa l'URL impostato per la directory dir.

Opzioni:
-q      quiet

Ad esempio:

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

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

Filtri

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

Attualmente i filtri si devono creare a mano e vanno messi in dei file nella sottodirectory .check_for_updates/ del progetto. Ci sono cinque 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.

Nota:
I filtri sono applicati usando sed con le basic regex.

Nella scrittura di alcuni filtri si può usare la direttiva #DIR# che viene sostituita dal nome della directory su cui lo script stà lavorando.

Nota:
Poiché il filtro sed_script può sostituire tutti gli altri, nelle prossime versioni sarà l'unico filtro ammesso.

Il filtro compare_only_line (obsoleto)

Se esiste un file chiamato .check_for_updates/compare_only_line, questo file deve contenere, una per riga, un'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. Se si vuole controllare solo i sorgenti per linux, basta creare il file .check_for_updates/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_for_updates.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.

Per questo filtro si può usare la direttiva #DIR#, quindi se il nome della directory che contiene il progetto FileZilla si chiama proprio FileZilla/, una regex del tutto analoga a quella mostrata prima è:

#DIR#.*src.*bz2

Il filtro filter_line_number (obsoleto)

Se esiste un file chiamato .check_for_updates/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 (obsoleto)

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

Per questo filtro si può usare la direttiva #DIR#.

Il filtro filter_word (obsoleto)

Se esiste un file chiamato .check_for_updates/filter_word, questo file deve contenere, per ogni riga, un'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 si volesse 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_for_updates/filter_word

$> check_for_updates.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>

Per questo filtro si può usare la direttiva #DIR#.

Il filtro sed_script

Se esiste un file chiamato .check_for_updates/sed_script, questo file deve contenere un vero e proprio script per sed. check_for_updates.sh esegue il comando sed -n -f .check_for_updates/sed_script, quindi si faccia attenzione poiché non verrà generato nessun output a meno che non si sia usato il comando p di sed.

Per questo filtro si può usare la direttiva #DIR#.

L'ordine di esecuzione dei filtri

I filtri sopra citati vengono eseguiti nel seguente ordine:

  • sed_script
  • compare_only_line
  • filter_line_number
  • filter_line_regex
  • file_filter_word

L'ordine degli ultimi tre filtri non è importante, ma si deve tenere ben presente che prima si filtrano i file temporanei con il filtro sed_script, quindi sull'output di questo filtro viene applicato, se esiste, il filtro compare_only_line, ed infine sull'output di quest'altro filtro, vengono applicati, se ci sono, i filtri per sopprimere altre righe o parole.

Progetti su Sourceforge

Il link ai file di un progetto hostato su Sourceforge hanno tutti la stessa forma:

http://sourceforge.net/projects/NOME_PROGETTO/files/

dove NOME_PROGETTO è proprio il nome del progetto hostato.

Quindi un modo per inizializzare lo script, ad esempio per p7zip è:

$> check_for_updates.sh init p7zip http://sourceforge.net/projects/p7zip/files/

E, per filtrare la pagina scaricata basta fare:

$> echo '/#DIR#.*class="folder/b get_date;d;:get_date /date/{s/.*title="\([[:digit:]-]\+\).*/#DIR#  \1/p;q};n;b get_date'\
  > p7zip/.check_for_updates/sed_script

il quale fa passare solo la data dell'ultimo file aggiornamento, come si può vedere dall'output della modalità check con l'opzione '-f':

$> check_for_updates.sh check -f p7zip/
# Directory: p7zip
p7zip  2010-05-30

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 po' bizzarro, basti pensare che l'opzione '-q' e '-v' non generano un errore di incompatibilità.

La madalità db per ora non fa nulla, ma l'idea è quella di 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.

Ringraziamenti e conclusioni

Ringrazio:

  • conraid per l'ottimo feedback

Autore (data dell'ultimo aggiornamento):
targzeta (discussioni) 00:08, 1 ago 2012 (CEST)

Strumenti personali
Namespace

Varianti