Repository 32bit  Forum
Repository 64bit  Wiki

Check For Updated: differenze tra le versioni

Da Slacky.eu.
(Aggiornato alla versione 1.10 dello script)
(Caricato i file esterni all'interno di wikislacky)
 
(2 revisioni intermedie di un utente non mostrate)
Riga 1: Riga 1:
<!--Per http://www.slacky.eu/wikislack/index.php?title=Check_For_Updated -->
+
<!--Per http://www.slacky.eu/wikislack/index.php?title=Check_For_Updates -->
[[category:Script]]
[[category:Script]]
=Introduzione=
=Introduzione=
Lo script '''check_for_updated.sh''' controlla se una determinata pagina internet, o parte di essa (grazie all'uso di
+
Lo script '''check_for_updates.sh''' controlla se una determinata pagina internet &egrave; stata modificata. Lo si pu&ograve; pensare come un'alternativa ai feed RSS.
filtri), &egrave; stata modificata a partire da una data iniziale. Lo script &egrave; stato creato con lo scopo di
 
scoprire se un determinato progetto che si vuole tenere d'occhio, &egrave; stato modificato oppure no, dall'ultima volta
 
che lo si &egrave; controllato. Questo perch&egrave; la slackware non &egrave; fornita di tutti i programmi e librerie
 
esistenti, e quindi vi &egrave; una necessita di seguire in prima persona determinati progetti.
 
=Download=
+
Lo script &egrave; stato creato con lo scopo di scoprire se un determinato progetto &egrave; stato modificato oppure no, dall'ultima volta che lo si &egrave; controllato.
Tutto ci&ograve; che serve si trova al link:<br>
 
http://www.slacky.eu/~spina/script/check_for_updated/
 
I file:
+
=Download=
; check_for_updated.sh : &egrave; lo script vero e proprio
+
Lo script lo potete trovare [[Media:Check_for_updates.sh‎|qui]].
; ChangeLog &egrave; : l'elenco delle modifiche tra una versione e l'altra
 
; TODO : &egrave; la lista delle cose che andrebbero fatte
 
==NOTA per le versioni dalla 1.5 in poi==
==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
+
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:
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>
<pre>
for file in *;
for file in *;
Riga 17: Riga 17:
if [ -d $file ] && [ -d ${file}/.check_upgrade ];
if [ -d $file ] && [ -d ${file}/.check_upgrade ];
then
then
mv ${file}/.check_upgrade ${file}/.check_for_updated;
+
mv ${file}/.check_upgrade ${file}/.check_for_updates;
fi;
fi;
done
done
Riga 25: Riga 25:
=L'ambiente di lavoro=
=L'ambiente di lavoro=
Lo script lavora su directory, l'idea &egrave; che per ogni progetto che l'utente segue, ci sia una directory associata,
+
Lo script lavora su directory, l'idea &egrave; che per ogni progetto che l'utente segue, ci sia una directory associata, ad esempio:
ad esempio nella mia macchina ho:
 
<pre>
<pre>
$> ls -1F Software/
+
$> ls -1F software/
FileZilla/
FileZilla/
a52dec/
a52dec/
Riga 35: Riga 35:
audacity/
audacity/
...
...
check_for_updated.sh*
+
check_for_updates.sh*
...
...
</pre>
</pre>
come si nota, lo script &egrave; all'interno della directory ''Software'', la quale contiene una directory per ogni
+
come si nota, lo script &egrave; all'interno della directory ''software'', la quale contiene una directory per ogni progetto che si vuole seguire (FileZilla, aicrack-ng, etc...).
progetto che seguo (FileZilla, aicrack-ng, etc. etc.).
 
=Lo script e le varie modalit&agrave;=
=Lo script e le varie modalit&agrave;=
Lo script opera in diversi modi a seconda di quale modalit&agrave; si scelga di eseguire. L'elenco delle modalit&agrave;
+
Lo script opera in diversi modi a seconda di quale modalit&agrave; si scelga di eseguire. L'elenco delle modalit&agrave; lo si trova con l'uso dell'opizione ''--help''
lo si trova con l'uso dell'opizione ''--help''
 
<pre>
<pre>
$> Uso: check_for_updated.sh [opzioni] MODALITA [mod_opzioni] arg1...
+
$> check_for_updates.sh --help
check_for_updated.sh MODALITA -h|--help
+
Uso: check_for_updates.sh [opzioni] MODALITA [mod_opzioni] arg1...
check_for_updated.sh -v|--version
+
check_for_updates.sh MODALITA -h|--help
  +
check_for_updates.sh -v|--version
Opzioni:
Opzioni:
-c Non colora l'output
-c Non colora l'output
MODALITA &egrave; una tra:
+
MODALITA e' una tra:
check
check
db
db
Riga 58: Riga 58:
url
url
by Emanuele Tomasi aka Spina <spina80@gmail.it>
+
by Emanuele Tomasi aka targzeta <targzeta@gmail.com>
</pre>
</pre>
noi qui spieghiamo tutte le modalit&agrave; una ad una, non in ordine alfabetico come mostrato dall'help, ma in ordine
 
d'uso.
 
==Modalit&agrave; init==
==Modalit&agrave; init==
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_for_updated.sh init --help
+
<pre>
Uso: check_for_updated.sh init [opzioni] dir URL
+
$> check_for_updates.sh init --help
  +
Uso: check_for_updates.sh init [opzioni] dir URL
Inizializza la directory dir tramite l'URL passatogli.
Inizializza la directory dir tramite l'URL passatogli.
Opzioni:
Opzioni:
-q: quiet
+
-g forza l'uso del protocollo git
-v: verbose
+
-q quiet
  +
-s forza l'uso del protocollo svn
  +
-v verbose
L'URL va quotato se contiene caratteri speciali per la shell,
L'URL va quotato se contiene caratteri speciali per la shell,
come ad esempio il carattere '&'
+
come ad esempio il carattere '&'.
</pre>
</pre>
gli argomenti sono quindi soltanto due:
gli argomenti sono quindi soltanto due:
* Il nome della directory associata al progetto da seguire
+
* Il nome della directory associata al progetto da seguire;
* L'URL della pagina web in cui vengono annunciati i cambiamenti o nuove release
+
* 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&ograve;
+
{{Be Careful|Nota|Come dice anche l'help, l'URL va quotato se contiene caratteri che la shell pu&ograve; interpretare o espandere. Vedi appunto il carattere '&' che per la shell significa: "manda in background".}}
interpretare o espandere. Vedi appunto il carattere '&' che per la shell significa: "manda in background".
 
Ad esempio per il progetto FileZilla si ha:
+
Ad esempio, per il progetto FileZilla si ha:
* Il nome della directory == ''FileZilla''
+
* Il nome della directory == ''FileZilla/''
* URL = http://filezilla-project.org/download.php?type=client
* URL = http://filezilla-project.org/download.php?type=client
quindi per iniziare a seguire il progetto si esegue:
+
quindi per iniziare a seguire il progetto basta eseguire:
<pre>
<pre>
$> check_for_updated.sh init FileZilla/ http://filezilla-project.org/download.php?type=client
+
$> check_for_updates.sh init FileZilla/ http://filezilla-project.org/download.php?type=client
# Directory: FileZilla
# Directory: FileZilla
INIZIALIZZATA
INIZIALIZZATA
</pre>
</pre>
  +
{{Hint|Nota|Il nome della directory non deve finire necessariamente con il carattere '/'.}}
'''Nota:''' il nome della directory non deve finire necessariamente con il carattere '/', nell'esempio
+
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_for_updates'' con all'interno due file:
ho usato il tasto <TAB> e la shell ha completato il nome per me.
+
; page : la pagina web indirizzata dall'URL (scaricata tramite il comando '''wget''');
+
; url : l'URL che si &egrave; passato come parametro;
===Che vuol dire inizializzata?===
 
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_for_updated'' con all'interno due file:
 
<pre>
<pre>
$> tree FileZilla/.check_for_updated/
+
$> tree FileZilla/.check_for_updates/
FileZilla/.check_for_updated/
+
FileZilla/.check_for_updates/
|-- page
|-- page
`-- url
`-- url
Riga 106: Riga 105:
</pre>
</pre>
; page : la pagina web indirizzata dall'URL, scaricata tramite il comando '''wget'''
+
===Protocolli===
; url : contiene l'URL che si &egrave; passato come parametro.
+
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&agrave; '''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 &egrave; 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 &egrave; di default quando l'URL inizia con svn://. Poich&egrave; per&ograve; subversion si appoggia anche su altri protocolli, si pu&ograve; 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&agrave; '''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 &egrave; di default quando l'URL inizia con git://. Poich&egrave; per&ograve; git si appoggia anche su altri protocolli, si pu&ograve; 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&agrave; '''init'''.
==Modalit&agrave; check==
==Modalit&agrave; check==
Una volta inizializzata la directory, possiamo seguire il progetto quando ci pare facendo un '''check''' su di
+
Una volta inizializzata la directory, si pu&ograve; seguire il progetto facendo un '''check''' su di essa. L'help per questa modalit&agrave; &egrave;:
essa. L'help per questa modalit&agrave; &egrave;:
 
<pre>
<pre>
$> check_for_updated.sh check --help
+
$> check_for_updates.sh check --help
Uso: check_for_updated.sh check [opzioni] dir1...
+
Uso: check_for_updates.sh check [opzioni] dir1...
Controlla se la pagina &grave; aggiornata.
+
Controlla se la pagina e' aggiornata.
Opzioni:
Opzioni:
-d: mostra l'output di 'diff' quando controlla l'aggiornamento
+
-d mostra l'output di 'diff' quando controlla l'aggiornamento
-e: non mostra gli errori di download
+
-e non mostra gli errori di download
-f: mostra la pagina filtrata (non effettua controlli sull'aggiornamento)
+
-f mostra la pagina filtrata (non effettua controlli sull'aggiornamento)
-k: non elimina i file temporanei all'uscita
+
-k non elimina i file temporanei all'uscita
-n mostra l'output di 'diff' stampando solo le nuove righe. Ignora '-d'
+
-n mostra l'output di 'diff' stampando solo le nuove righe. Ignora '-d'
-o: produce output solo se la pagina &grave; stata aggiornata. Implica '-s'
+
-o produce output solo se la pagina e' stata aggiornata. Implica '-s'
-q: quiet. Implica '-s'.
+
-q quiet. Implica '-s'
-s: non stampa errori sulle directory non conformi
+
-s non stampa errori sulle directory non conformi
-v: verbose
+
-v verbose
</pre>
</pre>
come si vede, si pu&ograve; fare il '''check''' anche su pi&ugrave; directory contemporaneamente, in effetti lo si
+
come si vede, si pu&ograve; fare il '''check''' anche su pi&ugrave; directory contemporaneamente, in effetti lo si pu&ograve; fare anche su directory non conformi o file, lo script salter&agrave; i file, e tramimte l'opzione '-s' non stamper&agrave; nulla neanche sulle directory non conformi. Questo &egrave; utile se si vuole eseguire il check su di un'intera directory con:
pu&ograve; fare anche su directory non conformi o file, lo script salter&agrave; i file, e tramimte l'opzione '-s' non
+
$> check_for_updates.sh check *
stamper&agrave; nulla sulle directory non conformi. Questo &egrave; utile se si vuole eseguire il check sull'intera
 
directory ''Software'' con:
 
$> 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 meno che non venga eseguito con l'opzione '-f'):
dell'opzione '-f'):
+
* scarica la pagina web (identificata dall'indirizzo trovato nel file ''.check_for_updates/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_for_updates/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
 
Un esempio di invocazione:
+
Un esempio di invocazione &egrave; il seguente:
<pre>
<pre>
$> check_for_updated.sh check FileZilla/
+
$> check_for_updates.sh check FileZilla/
# Directory: FileZilla
# Directory: FileZilla
OK
OK
</pre>
</pre>
il valore di ritorno 'OK' indica che la pagina ''.check_for_updated/page'' non differisce (filtrata) dalla pagina internet
+
il valore di ritorno 'OK' indica che la pagina ''.check_for_updates/page'' (filtrata) non differisce dalla pagina internet (filtrata).
===Opzione -d===
===Opzione -d===
Tramite questa opzione, lo script mostrer&agrave; l'output del comando '''diff''' sulle pagine temporanee, questo
+
Tramite questa opzione, lo script mostrer&agrave; l'output del comando '''diff''' sulle pagine temporanee. Questo &egrave; utile per vedere se effettivamente la differenza &egrave; significativa oppure no. Se non &egrave; significativa, si pu&ograve; migliorare il controllo creando appositi filtri (si vedr&agrave; in seguito l'uso dei filtri).
&egrave; utile per vedere se effettivamente la differenza &egrave; dovuta ad una nuova release per il progetto, oppure
 
ad altre cause.
 
 
Se &egrave; dovuta ad altre cause si pu&ograve; migliorare il controllo creando appositi filtri (vedremo in seguito
 
l'uso dei filtri)
 
===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_for_updates/page'' e a mostrare l'esito dei filtri e, quindi, la porzione di pagina che si verr&agrave; controllata.
'''.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)
 
===Opzione -k===
===Opzione -k===
Come si &egrave; visto lo script crea almeno due file temporanei, quelli sui quali applica i filtri ed esegue
+
Con questa opzione, lo script non eliminer&agrave; i file temporanei creati per il confronto.
'''diff'''. Passando questa opzione, lo script non eliminer&agrave; questi due file temporanei.
 
 
Ad esempio:
 
<pre>
 
$> check_for_updated.sh check -k FileZilla/
 
# Directory: FileZilla
 
OK
 
 
Il file /tmp/checkiEW7wR non &egrave; stato eliminato.
 
Il file /tmp/checkJlotcW, non &egrave; stato eliminato.
 
</pre>
 
 
Questa opzione la tovavo utile prima dell'introduzione dell'opzione '-f'.
 
===Opzione -n===
===Opzione -n===
Questa opzione &egrave; simile (e ne &egrave; un alternativa) all'opzione '-d' con la differenza che mostra soltanto le
+
Questa opzione &egrave; simile (e ne &egrave; 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.
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===
===Opzione -o===
Lo script, per ogni directory che gli si passa produce una serie di output tipo quello visto negli esempi
+
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 '*'.
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:
Ad esempio:
<pre>
<pre>
$> check_for_updated.sh check -o FileZilla/ amrwb/
+
$> check_for_updates.sh check -o FileZilla/ amrwb/
# Directory: amrwb
# Directory: amrwb
DA AGGIORNARE
DA AGGIORNARE
</pre>
</pre>
+
{{Information|NOTA|L'uso di questa opzione implica l'opzione '-s'.}}
'''NOTA:''' l'uso di questa opzione implica l'opzione '-s'
 
===Opzione -q (caso particolare)===
===Opzione -q (caso particolare)===
Questa opzione inibisce lo script a produrre output, in pratica rende incompresibile l'uso dello script. L'unico motivo
+
Questa opzione inibisce lo script a produrre output, in pratica rende incompresibile l'uso dello script. L'unico motivo per cui esiste ancora &egrave; che in associazione con l'opzione '-o', si ha l'elenco delle directory per le quali lo script produrrebbe 'DA AGGIORNARE'.
per cui esiste ancora &egrave; che in associazione con l'opzione '-o', si ha l'elenco delle directory per le quali lo
 
script produrrebbe 'DA AGGIORNARE'.
 
Ad esempio:
Ad esempio:
<pre>
<pre>
$> check_for_updated.sh check -qo FileZilla/ amrwb/
+
$> check_for_updates.sh check -qo FileZilla/ amrwb/
amrwb
amrwb
</pre>
</pre>
+
{{Information|NOTA|L'uso di questa opzione implica l'opzione '-s'.}}
'''NOTA:''' l'uso di questa opzione implica l'opzione '-s'
 
===Opzione -s===
===Opzione -s===
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_for_updated.sh check Kernel/
+
$> check_for_updates.sh check Kernel/
# Directory: Kernel
# Directory: Kernel
Attenzione: Kernel non ha:
Attenzione: Kernel non ha:
* o la sottodirectory .check_for_updated
+
* o la sottodirectory .check_for_updates
* o il file .check_for_updated/url
+
* o il file .check_for_updates/url
* o il file .check_for_updated/page
+
* o il file .check_for_updates/page
</pre>
</pre>
Tramite l'uso di questa opzione, lo script salta queste directory e quindi non produrr&agrave; nessun output. Anche
+
Tramite l'uso di questa opzione, lo script salta queste directory e quindi non produce nessun output. Questa opzione &egrave; utile se si invoca lo script su pi&ugrave; directory in contemporanea o su '*'.
questa opzione &egrave; utile se si invoca lo script su pi&ugrave; directory in contemporanea o su '*'.
 
==Modalit&agrave; update==
==Modalit&agrave; update==
Una volta che il progetto locale &egrave; stato aggiornato (poich&eacute; la modalit&agrave; '''check''' ha ritornato
+
L'unico modo per far sapere allo script che una directory &egrave; di nuovo aggiornata, &egrave; quello di invocarlo con questa modalit&agrave;. Lo script scaricher&agrave; la nuova pagina web e la sostituir&agrave; con quella in ''.check_for_updates/page''. L'help &egrave; il seguente:
'DA AGGIORNARE'), l'unico modo per far sapere allo script che la directory &egrave; di nuovo aggiornata, &egrave; quello
 
di invocarlo con questa modalit&agrave;. L'help &egrave; il seguente:
 
<pre>
<pre>
$>check_for_updated.sh update --help
+
$>check_for_updates.sh update --help
Uso: check_for_updated.sh update [opzioni] dir1...
+
Uso: check_for_updates.sh update [opzioni] dir1...
Aggiorna, riscaricando la pagina, la directory dir.
Aggiorna, riscaricando la pagina, la directory dir.
Opzioni:
Opzioni:
-q: quiet
+
-q quiet
-v: verbose
+
-v verbose
</pre>
</pre>
L'algoritmo seguito in questo caso &egrave;:
+
Ad esempio, se si aggiorna la directory ''amrwb'', per il quale lo script ha ritornato 'DA AGGIORNARE', invocando lo script con questa modalit&agrave; si ottiene:
* 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&agrave; ottengo:
 
<pre>
<pre>
$> check_for_updated.sh update amrwb/
+
$> check_for_updates.sh update amrwb/
# Directory: amrwb
# Directory: amrwb
AGGIORNATO
+
AGGIORNATA
</pre>
</pre>
 
Quindi, le prossime esecuzioni della modalit&agrave; '''check''' useranno la nuova pagina appena scaricata per il
 
confronto.
 
==Modalit&agrave; not_conform==
==Modalit&agrave; not_conform==
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_for_updated.sh not_conform --help
+
$> check_for_updates.sh not_conform --help
Uso: check_for_updated.sh not_conform dir1...
+
Uso: check_for_updates.sh not_conform dir1...
Stampa il nome delle dir non conformi (non inizializzate).
Stampa il nome delle dir non conformi (non inizializzate).
</pre>
</pre>
In questo modo possiamo sempre sapere quali, tra le nostre directory, non sono state ancora inizializzate.
+
Ad esempio:
 
Esempio:
 
<pre>
<pre>
$> check_for_updated.sh not_conform FileZilla/ amrwb/ Kernel/
+
$> check_for_updates.sh not_conform FileZilla/ amrwb/ Kernel/
Kernel
Kernel
</pre>
</pre>
==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_for_updates/url''. L'help &egrave; il seguente:
''.check_for_updated/url''. L'help &egrave; il seguente:
 
<pre>
<pre>
$> check_for_updated.sh url --help
+
$> check_for_updates.sh url --help
Uso: check_for_updated.sh url dir1...
+
Uso: check_for_updates.sh url dir1...
Stama l'URL impostato per la directory dir.
+
Stampa l'URL impostato per la directory dir.
Opzioni:
Opzioni:
-v: verbose
+
-q quiet
</pre>
</pre>
Ad esempio:
Ad esempio:
<pre>
<pre>
$> check_for_updated.sh url FileZilla/ amrwb/ Kernel/
+
$> check_for_updates.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 250: Riga 246:
http://www.penguin.cz/~utx/amr
http://www.penguin.cz/~utx/amr
</pre>
</pre>
 
Cos&igrave; sappiamo sempre rintracciare il link ai nuovi sorgenti per il progetto che stiamo seguendo.
 
=Filtri=
=Filtri=
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 su una porzione anzich&eacute; 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 cinque tipi di filtri, caratterizzati da altrettanti nomi file.
 
 
Quando lo script viene invocato con la modalit&agrave; '''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''' con le basic regex.
+
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.
Nella scrittura di alcuni filtri si pu&ograve; usare la direttiva '''#DIR#''' che viene sostituita dal nome della directory
+
Quando lo script viene invocato con la modalit&agrave; '''check''', prima di eseguire il comando '''diff''', se trova i file dei filtri, filtra i file temporanei.
su cui si st&agrave; lavorando.
+
{{Hint|Nota|I filtri sono applicati usando '''sed''' con le basic regex.}}
  +
Nella scrittura di alcuni filtri si pu&ograve; usare la direttiva '''#DIR#''' che viene sostituita dal nome della directory su cui lo script st&agrave; lavorando.
  +
{{Be Careful|Nota|Poich&eacute; il filtro '''sed_script''' pu&ograve; sostituire tutti gli altri, nelle prossime versioni sar&agrave; l'unico filtro ammesso.}}
==Il filtro compare_only_line==
+
==Il filtro compare_only_line (obsoleto)==
Se esiste un file chiamato ''.check_for_updated/compare_only_line'', questo file deve contenere, una per riga, una
+
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.
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&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. 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:
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
FileZilla.*src.*bz2
Per vedere cosa effettivamente compara il comando '''diff''' basta eseguire lo script con modalit&agrave; '''check''' e
+
Per vedere cosa effettivamente compara il comando '''diff''', basta eseguire lo script con modalit&agrave; '''check''' e opzione '-f':
opzione '-f':
 
<pre>
<pre>
$> check_for_updated.sh check -f FileZilla/
+
$> check_for_updates.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 275: Riga 269:
come si pu&ograve; notare, il filtro ha lasciato passare solo la riga che contiene il link ai sorgenti.
come si pu&ograve; notare, il filtro ha lasciato passare solo la riga che contiene il link ai sorgenti.
Per questo filtro si pu&ograve; usare la direttiva '''#DIR#''', quindi se il nome della directory che contiene il progetto FileZilla si chiama
+
Per questo filtro si pu&ograve; 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 &egrave;:
proprio ''FileZilla'', una regex del tutto analoga a quella mostrato prima &egrave;:
 
#DIR#.*src.*bz2
#DIR#.*src.*bz2
poich&eacute; la direttiva '''#DIR''' sar&agrave; sostituita dal nome della directory.
 
==Il filtro filter_line_number==
+
==Il filtro filter_line_number (obsoleto)==
Se esiste un file chiamato ''.check_for_updated/filter_line_number'', questo file deve contenere, per ogni riga, un
+
Se esiste un file chiamato ''.check_for_updates/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 (obsoleto)==
Se esiste un file chiamato ''.check_for_updated/filter_line_regex'', questo file deve contenere, per ogni riga, una
+
Se esiste un file chiamato ''.check_for_updates/filter_line_regex'', questo file deve contenere, per ogni riga, un'espressione regolare. Lo script sopprimer&agrave; le righe della pagina che hanno il match con una di queste espressioni regolari, prima di eseguire '''diff'''.
espressione regolare. Lo script sopprimer&agrave; le righe della pagina che hanno il match con una di queste espressioni
 
regolari, prima di eseguire '''diff'''.
 
Per questo filtro si pu&ograve; usare la direttiva '''#DIR#'''.
Per questo filtro si pu&ograve; usare la direttiva '''#DIR#'''.
==Il filtro filter_word==
+
==Il filtro filter_word (obsoleto)==
Se esiste un file chiamato ''.check_for_updated/filter_word'', questo file deve contenere, per ogni riga, una espressione
+
Se esiste un file chiamato ''.check_for_updates/filter_word'', questo file deve contenere, per ogni riga, un'espressione regolare. Lo script sopprimer&agrave;, per ogni riga che ha il match con una di queste espressione regolari, l'espressione regolare stessa.
regolare. Lo script sopprimer&agrave;, 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&agrave; dal filtro '''compare_only_line''' nell'esempio precedente,
+
Ad esempio, con riferimento all'output prodotto gi&agrave; 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:
se noi volessimo eliminare dall'unica riga prodotta dal filtro, anche tutte le parole dall'inizio della riga sino al
 
protocollo https, basta fare:
 
<pre>
<pre>
$> echo '^.*href="' > FileZilla/.check_for_updated/filter_word
+
$> echo '^.*href="' > FileZilla/.check_for_updates/filter_word
$> check_for_updated.sh check -f FileZilla/
+
$> check_for_updates.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 302: Riga 295:
== Il filtro sed_script ==
== Il filtro sed_script ==
Se esiste un file chiamato ''.check_for_updated/sed_script'', questo file deve contenere un vero e proprio script per sed.
+
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&eacute; non verr&agrave; generato nessun output a meno che non si sia usato il comando '''p''' di sed.
Lo script esegue il comando '''sed -n -f .check_for_updated/sed_script''', quindi si faccia attenzione che non viene generato
 
nessun output a meno che non usa il comando '''p''' di sed.
 
Per questo filtro si pu&ograve; usare la direttiva '''#DIR#'''.
Per questo filtro si pu&ograve; usare la direttiva '''#DIR#'''.
Riga 314: Riga 307:
* file_filter_word
* file_filter_word
In realt&agrave; l'ordine degli ultimi tre filtri non &egrave; importante, ma si deve tenere bene in mente che
+
L'ordine degli ultimi tre filtri non &egrave; 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.
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 eseguiti, se ci sono,
 
i filtri per sopprimere altre righe o parole.
 
=Protocolli=
+
=Progetti su Sourceforge=
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 &egrave; ffmpeg. Nella sua [http://ffmpeg.mplayerhq.hu/download.html 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 [http://svn.ffmpeg.org/ffmpeg/trunk/ link per svn] andrebbe filtrato in modo da comparare solo la riga contenente 'revision:'.
 
**il [http://git.ffmpeg.org/ link per git] invece non va bene, in quel link si dovrebbe clikkare su 'summary' ed arrivare al [http://git.ffmpeg.org/?p=ffmpeg;a=summary link dei commit] e qui filtrare in modo da coparare solo la riga 'last change'
 
 
=Sourceforge=
 
Il link ai file di un progetto hostato su Sourceforge hanno tutti la stessa forma:
Il link ai file di un progetto hostato su Sourceforge hanno tutti la stessa forma:
http://sourceforge.net/projects/NOME_PROGETTO/files/
http://sourceforge.net/projects/NOME_PROGETTO/files/
Riga 322: Riga 315:
Quindi un modo per inizializzare lo script, ad esempio per p7zip &egrave;:
Quindi un modo per inizializzare lo script, ad esempio per p7zip &egrave;:
$> check_for_updated init p7zip http://sourceforge.net/projects/p7zip/files/
+
$> check_for_updates.sh init p7zip http://sourceforge.net/projects/p7zip/files/
E, per filtrare la pagina scaricata basta fare:
E, per filtrare la pagina scaricata basta fare:
<pre>
<pre>
$> echo '/#DIR#.*class="folder/b get_date;d;:get_date /date/{s/.*title="\([[:digit:]-]\+\).*/#DIR# \1/p;q};n;b get_date'\
$> 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_updated/sed_script
+
> p7zip/.check_for_updates/sed_script
</pre>
</pre>
il quale fa passare solo la data dell'ultimo file aggiornamento, come si pu&ograve; vedere dall'output della modalit&agrave; '''check''' con l'opzione '-f':
il quale fa passare solo la data dell'ultimo file aggiornamento, come si pu&ograve; vedere dall'output della modalit&agrave; '''check''' con l'opzione '-f':
<pre>
<pre>
$> check_for_updated.sh check -f p7zip/
+
$> check_for_updates.sh check -f p7zip/
# Directory: p7zip
# Directory: p7zip
p7zip 2010-05-30
p7zip 2010-05-30
</pre>
</pre>
 
'''Nota:''' si noti che l'uso della direttiva '''#DIR#''' nel filtro, questo perch&egrave; il progetto p7zip si trova proprio nella directory ''p7zip/''.
 
=Working in progress...=
=Working in progress...=
Lo script necessita ancora di ottimizzazioni, ritocchi ed espansioni. Per ora ad esempio il comportamento con le opzioni
+
Lo script necessita ancora di ottimizzazioni, ritocchi ed espansioni. Per ora, ad esempio, il comportamento con le opzioni delle varie modalit&agrave; &egrave; un po' bizzarro, basti pensare che l'opzione '-q' e '-v' non generano un errore di incompatibilit&agrave;.
delle varie modalit&agrave; &egrave; un po' bizzarro, basti pensare che l'opzione '-q' e '-v' non generano un
 
errore di incompatibilit&agrave;.
 
Ho in mente anche una madalit&agrave; '''db''' per poter esportare ed importare URL e/o filtri. In questo modo
+
La madalit&agrave; '''db''' per ora non fa nulla, ma l'idea &egrave; quella di poter esportare ed importare URL e/o filtri. In questo modo basterebbe avere un pacchetto il pi&ugrave; completo possibile di queste informazioni per far si che pi&ugrave; utenti possano controllare gli stessi progetti senza doversi ogni volta scovare URL e filtri adatti.
basterebbe avere un pacchetto il pi&ugrave; completo possibile di queste informazioni per far si che pi&ugrave; utenti
 
possano controllare gli stessi progetti senza doversi ogni volta scovare URL e filtri adatti.
 
Tutto si pu&ograve; fare e tutto forse si far&agrave;, certo &egrave; che se chiunque si senta pratico di scripting bash
+
=Ringraziamenti e conclusioni=
abbia anche la volont&agrave; di collaborare, tutto si potrebbe fare pi&ugrave; in fretta :)
 
 
=Ringraziamenti e Conclusioni=
 
Ringrazio:
Ringrazio:
* conraid per l'ottimo feedback
* 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
+
Autore (data dell'ultimo aggiornamento):<br/>
rapido per tenere d'occhio tutto un insieme di progetti interessanti, basti pensare al caso limite di chi si fa
+
[[Utente:targzeta|targzeta]] ([[Discussioni utente:targzeta|discussioni]]) 00:08, 1 ago 2012 (CEST)
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):
 
[[Utente:Spina|spina]] 18:35, 2 dic 2010 (UTC)
 

Versione attuale delle 00:19, 3 ott 2012

Indice

[modifica] 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.

[modifica] Download

Lo script lo potete trovare qui.

[modifica] 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!!

[modifica] 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...).

[modifica] 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>

[modifica] 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

[modifica] 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.

[modifica] 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.

[modifica] 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.

[modifica] 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.

[modifica] 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).

[modifica] 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).

[modifica] 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.

[modifica] Opzione -k

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

[modifica] 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.

[modifica] 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'.

[modifica] 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'.

[modifica] 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 '*'.

[modifica] 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

[modifica] 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

[modifica] 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

[modifica] 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.

[modifica] 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

[modifica] 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.

[modifica] 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#.

[modifica] 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#.

[modifica] 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#.

[modifica] 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.

[modifica] 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

[modifica] 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.

[modifica] 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