Check For Updated: differenze tra le versioni
| 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 è procurarsi lo script, che attualmente è alla versione 1.3, dal link:<br> |
+ | La prima cosa da fare è procurarsi lo script, che attualmente è 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 è una tra: |
MODALITA è una tra: |
||
| Riga 54: | Riga 71: | ||
Questa è la prima modalità che si usa per iniziare a seguire un progetto. L'help per questa |
Questa è la prima modalità che si usa per iniziare a seguire un progetto. L'help per questa |
||
modalità è il seguente: |
modalità è 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 è stata inizializzata la si definisce "conforme" allo script, ovvero lo script al suo |
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: |
+ | 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à è: |
essa. L'help per questa modalità è: |
||
<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 ` aggiornata. |
Controlla se la pagina ` aggiornata. |
||
| Riga 123: | Riga 140: | ||
stamperà nulla sulle directory non conformi. Questo è utile se si vuole eseguire il check sull'intera |
stamperà nulla sulle directory non conformi. Questo è 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 è invocato con questa modalità segue il seguente algoritmo (a parte con l'uso |
Lo script, quando è invocato con questa modalità 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 è utile per testare i filtri (vedremo in seguito l'uso dei filtri) |
controllare. L'opzione è 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à. L'help è il seguente: |
di invocarlo con questa modalità. L'help è 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 è: |
L'algoritmo seguito in questo caso è: |
||
| − | * 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à ottengo: |
script con questa modalità 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à si limita ad elencare, tra le directory passategli, quelle non conformi. L'help è il seguente: |
La modalità si limita ad elencare, tra le directory passategli, quelle non conformi. L'help è 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à url== |
==Modalità url== |
||
Per ogni directory passatagli, se la directory è conforme, lo script stampa l'URL trovato nel file |
Per ogni directory passatagli, se la directory è conforme, lo script stampa l'URL trovato nel file |
||
| − | ''.check_upgrade/url''. L'help è il seguente: |
+ | ''.check_for_updated/url''. L'help è 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à che in quella pagina vengono linkati sia i |
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 |
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à le righe corrispondenti dalla pagina, prima di eseguire '''diff'''. |
numero. Lo script sopprimerà 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à le righe della pagina che hanno il match con una di queste espressioni |
espressione regolare. Lo script sopprimerà 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à, per ogni riga che ha il match con una di queste espressione regolari, |
regolare. Lo script sopprimerà, 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:
- Il nome della directory == FileZilla
- URL = http://filezilla-project.org/download.php?type=client
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 ` 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. 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)