Repository 32bit  Forum
Repository 64bit  Wiki

Check For Updated: differenze tra le versioni

Da Slacky.eu.
Riga 2: Riga 2:
[[category:Script]]
[[category:Script]]
=Introduzione=
=Introduzione=
Lo script '''chek_upgrade.sh''' controlla se una determinata pagina internet, o parte di essa (grazie all'uso di
+
Lo script '''check_for_updated.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
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
scoprire se un determinato progetto che si vuole tenere d'occhio, è stato modificato oppure no, dall'ultima volta
Riga 9: Riga 9:
=Download=
=Download=
La prima cosa da fare &egrave; procurarsi lo script, che attualmente &egrave; alla versione 1.3, dal link:<br>
+
La prima cosa da fare &egrave; procurarsi lo script, che attualmente &egrave; alla versione 1.5, dal link:<br>
http://www.slacky.eu/wikislack/script/check-upgrade/check_upgrade.sh
+
http://www.slacky.eu/~spina/script/check_for_updated.sh
Il changelog tra le varie versioni si trova all'inizio dello script.
Il changelog tra le varie versioni si trova all'inizio dello script.
  +
  +
==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
  +
in '''check_for_updated.sh''')
  +
si dovrebbe anche rinominare tutte le sottodirectory ''.check_upgrade'' in ''.check_for_updated''
  +
ad esempio con uno script come questo:
  +
<pre>
  +
for file in *;
  +
do
  +
if [ -d $file ] && [ -d ${file}/.check_upgrade ];
  +
then
  +
mv ${file}/.check_upgrade ${file}/.check_for_updated;
  +
fi;
  +
done
  +
</pre>
  +
  +
'''Se invece è la prima volta che si usa lo script, questo non è necessario!!'''
=L'ambiente di lavoro=
=L'ambiente di lavoro=
Riga 26: Riga 43:
audacity/
audacity/
...
...
check_upgrade.sh*
+
check_for_updated.sh*
...
...
</pre>
</pre>
Riga 36: Riga 53:
lo si trova con l'uso dell'opizione ''--help''
lo si trova con l'uso dell'opizione ''--help''
<pre>
<pre>
$> check_upgrade.sh --help
+
$> check_for_updated.sh --help
Uso: check_upgrade.sh MODALITA [opzioni] arg1...
+
Uso: check_for_updated.sh MODALITA [opzioni] arg1...
check_upgrade.sh MODALITA -h|--help
+
check_for_updated.sh MODALITA -h|--help
check_upgrade.sh -v|--version
+
check_for_updated.sh -v|--version
MODALITA &egrave; una tra:
MODALITA &egrave; una tra:
Riga 54: Riga 71:
Questa &egrave; la prima modalit&agrave; che si usa per iniziare a seguire un progetto. L'help per questa
Questa &egrave; la prima modalit&agrave; che si usa per iniziare a seguire un progetto. L'help per questa
modalit&agrave; &egrave; il seguente:
modalit&agrave; &egrave; il seguente:
<pre>$> check_upgrade.sh init --help
+
<pre>$> check_for_updated.sh init --help
Uso: check_upgrade.sh init [opzioni] dir URL
+
Uso: check_for_updated.sh init [opzioni] dir URL
Inizializza la directory dir tramite l'URL passatogli.
Inizializza la directory dir tramite l'URL passatogli.
Riga 78: Riga 95:
quindi per iniziare a seguire il progetto si esegue:
quindi per iniziare a seguire il progetto si esegue:
<pre>
<pre>
$> check_upgrade.sh init FileZilla/ http://filezilla-project.org/download.php?type=client
+
$> check_for_updated.sh init FileZilla/ http://filezilla-project.org/download.php?type=client
# Directory: FileZilla
# Directory: FileZilla
INIZIALIZZATA
INIZIALIZZATA
Riga 88: Riga 105:
===Che vuol dire inizializzata?===
===Che vuol dire inizializzata?===
Una volta che la directory &egrave; stata inizializzata la si definisce "conforme" allo script, ovvero lo script al suo
Una volta che la directory &egrave; 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:
+
interno ha creato una sottodirectory di nome ''.check_for_updated'' con all'interno due file:
<pre>
<pre>
$> tree FileZilla/.check_upgrade/
+
$> tree FileZilla/.check_for_updated/
FileZilla/.check_upgrade/
+
FileZilla/.check_for_updated/
|-- page
|-- page
`-- url
`-- url
Riga 105: Riga 122:
essa. L'help per questa modalit&agrave; &egrave;:
essa. L'help per questa modalit&agrave; &egrave;:
<pre>
<pre>
$> check_upgrade.sh check --help
+
$> check_for_updated.sh check --help
Uso: check_upgrade.sh check [opzioni] dir1...
+
Uso: check_for_updated.sh check [opzioni] dir1...
Controlla se la pagina &grave; aggiornata.
Controlla se la pagina &grave; aggiornata.
Riga 123: Riga 140:
stamper&agrave; nulla sulle directory non conformi. Questo &egrave; utile se si vuole eseguire il check sull'intera
stamper&agrave; nulla sulle directory non conformi. Questo &egrave; utile se si vuole eseguire il check sull'intera
directory ''Software'' con:
directory ''Software'' con:
$> check_upgrade.sh check *
+
$> check_for_updated.sh check *
Lo script, quando &egrave; invocato con questa modalit&agrave; segue il seguente algoritmo (a parte con l'uso
Lo script, quando &egrave; invocato con questa modalit&agrave; segue il seguente algoritmo (a parte con l'uso
dell'opzione '-f'):
dell'opzione '-f'):
* scarica la pagina web identificata dall'indirizzo trovato nel file ''.check_upgrade/url'' in un file temporaneo
+
* scarica la pagina web identificata dall'indirizzo trovato nel file ''.check_for_updated/url'' in un file temporaneo
* fa una copia della pagina web ''.check_upgrade/page'' in un altro file temporaneo
+
* fa una copia della pagina web ''.check_for_updated/page'' in un altro file temporaneo
* se ci sono filtri, allora filtra entrambe le pagine temporanee
* 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
* esegue il comando '''diff''' per vedere se ci sono differenze tra le due pagine temporanee
Riga 134: Riga 151:
Un esempio di invocazione:
Un esempio di invocazione:
<pre>
<pre>
$> check_upgrade.sh check FileZilla/
+
$> check_for_updated.sh check FileZilla/
# Directory: FileZilla
# Directory: FileZilla
OK
OK
</pre>
</pre>
il valore di ritorno 'OK' indica che la pagina ''.check_upgrade/page'' non differisce (filtrata) dalla pagina internet
+
il valore di ritorno 'OK' indica che la pagina ''.check_for_updated/page'' non differisce (filtrata) dalla pagina internet
===Opzione -d===
===Opzione -d===
Riga 150: Riga 167:
===Opzione -f===
===Opzione -f===
In questo caso lo script non esegue l'algoritmo spiegato in precedenza, ma si limita a filtrare la pagina
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
+
'''.check_for_updated/page'' e a mostrare l'esito del filtro, e quindi la porzione di pagina che si vuole
controllare. L'opzione &egrave; utile per testare i filtri (vedremo in seguito l'uso dei filtri)
controllare. L'opzione &egrave; utile per testare i filtri (vedremo in seguito l'uso dei filtri)
Riga 159: Riga 176:
Ad esempio:
Ad esempio:
<pre>
<pre>
$> check_upgrade.sh check -k FileZilla/
+
$> check_for_updated.sh check -k FileZilla/
# Directory: FileZilla
# Directory: FileZilla
OK
OK
Riga 178: Riga 195:
Ad esempio:
Ad esempio:
<pre>
<pre>
$> check_upgrade.sh check -o FileZilla/ amrwb/
+
$> check_for_updated.sh check -o FileZilla/ amrwb/
# Directory: amrwb
# Directory: amrwb
DA AGGIORNARE
DA AGGIORNARE
Riga 192: Riga 209:
Ad esempio:
Ad esempio:
<pre>
<pre>
$> check_upgrade.sh check -qo FileZilla/ amrwb/
+
$> check_for_updated.sh check -qo FileZilla/ amrwb/
amrwb
amrwb
</pre>
</pre>
Riga 201: Riga 218:
Normalmente se allo script gli si passa una directory non conforme esso produrra in output una scritta simile a questa:
Normalmente se allo script gli si passa una directory non conforme esso produrra in output una scritta simile a questa:
<pre>
<pre>
$> check_upgrade.sh check Kernel/
+
$> check_for_updated.sh check Kernel/
# Directory: Kernel
# Directory: Kernel
Attenzione: Kernel non ha:
Attenzione: Kernel non ha:
* o la sottodirectory .check_upgrade
+
* o la sottodirectory .check_for_updated
* o il file .check_upgrade/url
+
* o il file .check_for_updated/url
* o il file .check_upgrade/page
+
* o il file .check_for_updated/page
</pre>
</pre>
Riga 217: Riga 234:
di invocarlo con questa modalit&agrave;. L'help &egrave; il seguente:
di invocarlo con questa modalit&agrave;. L'help &egrave; il seguente:
<pre>
<pre>
$>check_upgrade.sh update --help
+
$>check_for_updated.sh update --help
Uso: check_upgrade.sh update [opzioni] dir1...
+
Uso: check_for_updated.sh update [opzioni] dir1...
Aggiorna, riscaricando la pagina, la directory dir.
Aggiorna, riscaricando la pagina, la directory dir.
Riga 228: Riga 245:
L'algoritmo seguito in questo caso &egrave;:
L'algoritmo seguito in questo caso &egrave;:
* scarica la pagina web identificata dall'indirizzo trovato nel file ''.check_upgrade/url'' nel file ''.check_upgrade/page''
+
* scarica la pagina web identificata dall'indirizzo trovato nel file ''.check_for_updated/url'' nel file ''.check_for_updated/page''
* notifica all'utente
* notifica all'utente
Riga 234: Riga 251:
script con questa modalit&agrave; ottengo:
script con questa modalit&agrave; ottengo:
<pre>
<pre>
$> check_upgrade.sh update amrwb/
+
$> check_for_updated.sh update amrwb/
# Directory: amrwb
# Directory: amrwb
AGGIORNATO
AGGIORNATO
Riga 245: Riga 262:
La modalit&agrave; si limita ad elencare, tra le directory passategli, quelle non conformi. L'help &egrave; il seguente:
La modalit&agrave; si limita ad elencare, tra le directory passategli, quelle non conformi. L'help &egrave; il seguente:
<pre>
<pre>
$> check_upgrade.sh not_conform --help
+
$> check_for_updated.sh not_conform --help
Uso: check_upgrade.sh not_conform dir1...
+
Uso: check_for_updated.sh not_conform dir1...
Stampa il nome delle dir non conformi (non inizializzate).
Stampa il nome delle dir non conformi (non inizializzate).
Riga 255: Riga 272:
Esempio:
Esempio:
<pre>
<pre>
$> check_upgrade.sh not_conform FileZilla/ amrwb/ Kernel/
+
$> check_for_updated.sh not_conform FileZilla/ amrwb/ Kernel/
Kernel
Kernel
</pre>
</pre>
Riga 261: Riga 278:
==Modalit&agrave; url==
==Modalit&agrave; url==
Per ogni directory passatagli, se la directory &egrave; conforme, lo script stampa l'URL trovato nel file
Per ogni directory passatagli, se la directory &egrave; conforme, lo script stampa l'URL trovato nel file
''.check_upgrade/url''. L'help &egrave; il seguente:
+
''.check_for_updated/url''. L'help &egrave; il seguente:
<pre>
<pre>
$> check_upgrade.sh url --help
+
$> check_for_updated.sh url --help
Uso: check_upgrade.sh url dir1...
+
Uso: check_for_updated.sh url dir1...
Stama l'URL impostato per la directory dir.
Stama l'URL impostato per la directory dir.
Riga 274: Riga 291:
Ad esempio:
Ad esempio:
<pre>
<pre>
$> check_upgrade.sh url FileZilla/ amrwb/ Kernel/
+
$> check_for_updated.sh url FileZilla/ amrwb/ Kernel/
# Directory: FileZilla
# Directory: FileZilla
http://filezilla-project.org/download.php?type=client
http://filezilla-project.org/download.php?type=client
Riga 287: Riga 304:
I filtri sono un modo per far si che lo script esegua il comando '''diff''' solo una porzione e non sull'intera pagina.
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
+
Attualmente i filtri si devono creare a mano e vanno messi in file nella sottodirectory ''.check_for_updated/'' del nostro
progetto. Ci sono quattro tipi di filtri, caratterizzati da altrettanti nomi file.
progetto. Ci sono quattro tipi di filtri, caratterizzati da altrettanti nomi file.
Riga 297: Riga 314:
==Il filtro compare_only_line==
==Il filtro compare_only_line==
Se esiste un file chiamato ''.check_upgrade/compare_only_line'', questo file deve contenere, una per riga, una
+
Se esiste un file chiamato ''.check_for_updated/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
espressione regolare. Solo le righe dei file temporanei che hanno il match con queste espressioni regolari saranno
confrontate.
confrontate.
Riga 303: Riga 320:
Ad esempio, se si guarda il link impostato per FileZilla, si noter&agrave; che in quella pagina vengono linkati sia i
Ad esempio, se si guarda il link impostato per FileZilla, si noter&agrave; 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
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
+
stati postati nuovi sorgenti per linux, ho creato il file ''.check_for_updated/compare_only_line'' con all'interno questa
espressione regolare:
espressione regolare:
FileZilla.*src.*bz2
FileZilla.*src.*bz2
Riga 310: Riga 327:
opzione '-f':
opzione '-f':
<pre>
<pre>
$> check_upgrade.sh check -f FileZilla/
+
$> check_for_updated.sh check -f FileZilla/
# Directory: 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>
<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>
Riga 317: Riga 334:
==Il filtro filter_line_number==
==Il filtro filter_line_number==
Se esiste un file chiamato ''.check_upgrade/filter_line_number'', questo file deve contenere, per ogni riga, un
+
Se esiste un file chiamato ''.check_for_updated/filter_line_number'', questo file deve contenere, per ogni riga, un
numero. Lo script sopprimer&agrave; le righe corrispondenti dalla pagina, prima di eseguire '''diff'''.
numero. Lo script sopprimer&agrave; le righe corrispondenti dalla pagina, prima di eseguire '''diff'''.
==Il filtro filter_line_regex==
==Il filtro filter_line_regex==
Se esiste un file chiamato ''.check_upgrade/filter_line_regex'', questo file deve contenere, per ogni riga, una
+
Se esiste un file chiamato ''.check_for_updated/filter_line_regex'', questo file deve contenere, per ogni riga, una
espressione regolare. Lo script sopprimer&agrave; le righe della pagina che hanno il match con una di queste espressioni
espressione regolare. Lo script sopprimer&agrave; le righe della pagina che hanno il match con una di queste espressioni
regolari, prima di eseguire '''diff'''.
regolari, prima di eseguire '''diff'''.
==Il filtro filter_word==
==Il filtro filter_word==
Se esiste un file chiamato ''.check_upgrade/filter_word'', questo file deve contenere, per ogni riga, una espressione
+
Se esiste un file chiamato ''.check_for_updated/filter_word'', questo file deve contenere, per ogni riga, una espressione
regolare. Lo script sopprimer&agrave;, per ogni riga che ha il match con una di queste espressione regolari,
regolare. Lo script sopprimer&agrave;, per ogni riga che ha il match con una di queste espressione regolari,
l'espressione regolare stessa.
l'espressione regolare stessa.
Riga 334: Riga 351:
protocollo https, basta fare:
protocollo https, basta fare:
<pre>
<pre>
$> echo '^.*href="' > FileZilla/.check_upgrade/filter_word
+
$> echo '^.*href="' > FileZilla/.check_for_updated/filter_word
$> check_upgrade.sh check -f FileZilla/
+
$> check_for_updated.sh check -f FileZilla/
# Directory: 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>
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>
Riga 362: Riga 379:
==svn==
==svn==
L'uso di subversion avviene scaricando, come pagina da confontare, il log, e viene fatto usando:
L'uso di subversion avviene scaricando, come pagina da confontare, il log, e viene fatto usando:
svn log -l 1
+
svn info -r HEAD
==git==
==git==
Riga 414: Riga 431:
==Filtrare gli RSS di sourceforge==
==Filtrare gli RSS di sourceforge==
Gli RSS di sourceforge vengono modificati anche ogni qualvolta un sorgente viene scaricato (incrementando un contatore),
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
+
quindi di solito bisogna e basta, aggiungere il filtro '''compare_only_line''' inserendoci quanto segue:
rispettivamente:
+
; compare_only_line: nome_programma.*released
; filter_line_regex : <pre>RSS generated by</pre>
 
; filter_word : <pre>[[:digit:]]\+ downloads to date)</pre>
 
Ad esempio per la directory ''p7zip/'' basta fare:
Ad esempio per la directory ''p7zip/'' basta fare:
<pre>
+
$> echo 'p7zip.*released' > p7zip/.check_for_updated/compare_only_line
$> echo 'RSS generated by' > p7zip/.check_upgrade/filter_line_regex
 
 
$> echo '[[:digit:]]\+ downloads to date)' > p7zip/.check_upgrade/filter_word
 
</pre>
 
=Working in progress...=
=Working in progress...=
Riga 439: Riga 456:
rapido per tenere d'occhio tutto un insieme di progetti interessanti, basti pensare al caso limite di chi si fa
rapido per tenere d'occhio tutto un insieme di progetti interessanti, basti pensare al caso limite di chi si fa
distribuzioni "from scratch".
distribuzioni "from scratch".
  +
  +
Ovviamente usate lo script per seguire i cambiamenti di questa pagina controllando quindi l'uscita di una nuova versione ;-)
Autore (data dell'ultimo aggiornamento):
Autore (data dell'ultimo aggiornamento):
[[Utente:Spina|spina]] 16:30, 3 Dic 2008 (CET)
+
[[Utente:Spina|spina]] 10:13, 24 Gen 2009 (UTC)

Versione delle 12:13, 24 gen 2009

Indice

Introduzione

Lo script check_for_updated.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, che attualmente è alla versione 1.5, dal link:
http://www.slacky.eu/~spina/script/check_for_updated.sh

Il changelog tra le varie versioni si trova all'inizio dello script.

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 in check_for_updated.sh) si dovrebbe anche rinominare tutte le sottodirectory .check_upgrade in .check_for_updated ad esempio con uno script come questo:

for file in *; 
  do 
    if [ -d $file ] && [ -d ${file}/.check_upgrade ]; 
      then 
        mv ${file}/.check_upgrade ${file}/.check_for_updated; 
    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 nella mia macchina ho:

$> ls -1F Software/
FileZilla/
a52dec/
aircrack-ng/
amrnb/
amrwb/
audacity/
...
check_for_updated.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_for_updated.sh --help
Uso: check_for_updated.sh MODALITA [opzioni] arg1... 
     check_for_updated.sh MODALITA -h|--help 
     check_for_updated.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_for_updated.sh init --help
Uso: check_for_updated.sh init [opzioni] dir URL 

Inizializza la directory dir tramite l'URL passatogli. 

Opzioni: 
  -q:   quiet 
  -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 si esegue:

$> check_for_updated.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_for_updated con all'interno due file:

$> tree FileZilla/.check_for_updated/
FileZilla/.check_for_updated/
|-- 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_for_updated.sh check --help
Uso: check_for_updated.sh check [opzioni] dir1... 

Controlla se la pagina &grave; 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 &grave; 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 sulle directory non conformi. Questo è utile se si vuole eseguire il check sull'intera directory Software con:

$> check_for_updated.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_for_updated/url in un file temporaneo
  • fa una copia della pagina web .check_for_updated/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_for_updated.sh check FileZilla/
# Directory: FileZilla
OK

il valore di ritorno 'OK' indica che la pagina .check_for_updated/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_for_updated/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_for_updated.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_for_updated.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_updated.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_updated.sh check Kernel/
# Directory: Kernel
  Attenzione: Kernel non ha: 
        * o la sottodirectory .check_for_updated 
        * o il file .check_for_updated/url 
        * o il file .check_for_updated/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_for_updated.sh update --help
Uso: check_for_updated.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_for_updated/url nel file .check_for_updated/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_for_updated.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_for_updated.sh not_conform --help
Uso: check_for_updated.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_for_updated.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_updated/url. L'help è il seguente:

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

Stama l'URL impostato per la directory dir. 

Opzioni: 
  -v:   verbose

Ad esempio:

$> check_for_updated.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_for_updated/ 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.

Nota: tutti i filtri sono fatti usando sed. Visto che le espressioni regolari sono delimitate dal
carattere '/', nel filtro tale carattere lo si dove quotare in questo modo, '\/'.

Il filtro compare_only_line

Se esiste un file chiamato .check_for_updated/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_for_updated/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_updated.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_for_updated/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_for_updated/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_for_updated/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_for_updated/filter_word

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

Protocolli

Ci sono vari tipi di protocolli accettati dallo script, il protocollo da usare viene individuato analizzando l'inizio dell'URL.

http(s) o ftp

Entrambi questi protocolli restituiscono pagine web che possono essere controllate, l'uso di questi protocolli quindi avviene tramite il comando:

 wget --no-check-certificate

svn

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

svn info -r HEAD

git

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

git ls-remote HEAD

Nota su svn e git

Generalmente chi rilascia il codice solo con svn o con git, senza quindi rilasciare una versione ufficiale, usa anche far vedere l'albero dei sorgenti attraverso un front-end http. Quindi si possono scegliere vari modi per seguire il progetto.

Un esempio tra tutti è ffmpeg. Nella sua pagina di download viene spiegato come prelevare il programma sia con svn, sia con git, ma non ci sono release ufficiali. Quindi noi potremmo decidere di usare:

  • il protocollo svn con:
 chek_upgrade.sh init svn://svn.ffmpeg.org/ffmpeg/trunk
  • il protocollo git con:
check_uprade.sh init git://git.mplayerhq.hu/ffmpeg/
  • oppure usare uno dei due link http forniti per visualizzare l'albero di directory:
    • il link per svn andrebbe filtrato in modo da comparare solo la riga contenente 'revision:'.
    • il link per git invece non va bene, in quel link si dovrebbe clikkare su 'summary' ed arrivare al link dei commit e qui filtrare in modo da coparare solo la riga 'last change'

Sourceforge e RSS

Moltissimi progretti ormai sono hostati su sourceforge, il quale fornisce degli RSS 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 il filtro compare_only_line inserendoci quanto segue:

compare_only_line
nome_programma.*released

Ad esempio per la directory p7zip/ basta fare:

$> echo 'p7zip.*released' > p7zip/.check_for_updated/compare_only_line

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 :)

Ringraziamenti e Conclusioni

Ringrazio:

  • conraid per l'ottimo feedback

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".

Ovviamente usate lo script per seguire i cambiamenti di questa pagina controllando quindi l'uscita di una nuova versione ;-)

Autore (data dell'ultimo aggiornamento): spina 10:13, 24 Gen 2009 (UTC)

Strumenti personali
Namespace

Varianti