Repository 32bit  Forum
Repository 64bit  Wiki

Check For Updated: differenze tra le versioni

Da Slacky.eu.
(Caricato i file esterni all'interno di wikislacky)
 
(5 revisioni intermedie di un utente non mostrate)
Riga 1: Riga 1:
<!--Per www.slacky.eu -->
+
<!--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.
La prima cosa da fare &egrave; procurarsi lo script, che attualmente &egrave; alla versione 1.5, dal link:<br>
 
http://www.slacky.eu/~spina/script/check_for_updated.sh
 
Il changelog tra le varie versioni si trova all'inizio dello script.
+
=Download=
  +
Lo script lo potete trovare [[Media:Check_for_updates.sh‎|qui]].
==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 *;
do
+
do
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
</pre>
</pre>
'''Se invece è la prima volta che si usa lo script, questo non è necessario!!'''
+
'''Se invece &egrave; la prima volta che si usa lo script, questo non &egrave; necessario!!'''
=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 33: Riga 33:
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>
$> check_for_updated.sh --help
+
$> check_for_updates.sh --help
Uso: check_for_updated.sh MODALITA [opzioni] arg1...
+
Uso: check_for_updates.sh [opzioni] MODALITA [mod_opzioni] arg1...
check_for_updated.sh MODALITA -h|--help
+
check_for_updates.sh MODALITA -h|--help
check_for_updated.sh -v|--version
+
check_for_updates.sh -v|--version
MODALITA &egrave; una tra:
+
Opzioni:
  +
-c Non colora l'output
  +
  +
MODALITA e' una tra:
check
check
  +
db
init
init
not_conform
not_conform
update
update
url
url
  +
  +
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 99: Riga 101:
</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
-f: mostra la pagina filtrata (non effettua controlli sull'aggiornamento)
+
-e non mostra gli errori di download
-k: non elimina i file temporanei all'uscita
+
-f mostra la pagina filtrata (non effettua controlli sull'aggiornamento)
-o: produce output solo se la pagina &grave; stata aggiornata. Implica '-s'
+
-k non elimina i file temporanei all'uscita
-q: quiet. Implica '-s'.
+
-n mostra l'output di 'diff' stampando solo le nuove righe. Ignora '-d'
-s: non stampa errori sulle directory non conformi
+
-o produce output solo se la pagina e' stata aggiornata. Implica '-s'
-v: verbose
+
-q quiet. Implica '-s'
  +
-s non stampa errori sulle directory non conformi
  +
-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===
  +
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.
===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 240: Riga 239:
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
+
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.
progetto. Ci sono quattro 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
+
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.
file dei filtri, filtra i file temporanei con i filtri trovati al loro interno.
+
{{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.}}
'''Nota''': tutti i filtri sono fatti usando '''sed'''. Visto che le espressioni regolari sono delimitate dal
+
==Il filtro compare_only_line (obsoleto)==
carattere '/', nel filtro tale carattere lo si dove quotare in questo modo, '\/'.
+
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.
==Il filtro compare_only_line==
+
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:
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&agrave; che in quella pagina vengono linkati sia i
 
sorgenti per linux, sia l'installer per Windows, per Mac OS, etc. etc. Dato che a me interessa controllare solo se sono
 
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_updates.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 265: Riga 262:
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.
==Il filtro filter_line_number==
+
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;:
Se esiste un file chiamato ''.check_for_updated/filter_line_number'', questo file deve contenere, per ogni riga, un
+
#DIR#.*src.*bz2
numero. Lo script sopprimer&agrave; le righe corrispondenti dalla pagina, prima di eseguire '''diff'''.
+
  +
==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&agrave; le righe corrispondenti dalla pagina, prima di eseguire '''diff'''.
  +
  +
==Il filtro filter_line_regex (obsoleto)==
  +
Se esiste un file chiamato ''.check_for_updates/filter_line_regex'', questo file deve contenere, per ogni riga, un'espressione regolare. Lo script sopprimer&agrave; le righe della pagina che hanno il match con una di queste espressioni regolari, prima di eseguire '''diff'''.
==Il filtro filter_line_regex==
+
Per questo filtro si pu&ograve; usare la direttiva '''#DIR#'''.
Se esiste un file chiamato ''.check_for_updated/filter_line_regex'', questo file deve contenere, per ogni riga, una
 
espressione regolare. Lo script sopprimer&agrave; le righe della pagina che hanno il match con una di queste espressioni
 
regolari, prima di eseguire '''diff'''.
 
==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>
</pre>
</pre>
  +
  +
Per questo filtro si pu&ograve; usare la direttiva '''#DIR#'''.
  +
  +
== Il filtro sed_script ==
  +
Se esiste un file chiamato ''.check_for_updates/sed_script'', questo file deve contenere un vero e proprio script per sed. '''check_for_updates.sh''' esegue il comando '''sed -n -f .check_for_updates/sed_script''', quindi si faccia attenzione poich&eacute; non verr&agrave; generato nessun output a meno che non si sia usato il comando '''p''' di sed.
  +
  +
Per questo filtro si pu&ograve; usare la direttiva '''#DIR#'''.
==L'ordine di esecuzione dei filtri==
==L'ordine di esecuzione dei filtri==
I filtri sopra citati vengono eseguiti nel seguente ordine:
I filtri sopra citati vengono eseguiti nel seguente ordine:
  +
* sed_script
* compare_only_line
* compare_only_line
* filter_line_number
* filter_line_number
Riga 290: Riga 295:
* file_filter_word
* file_filter_word
In realt&agrave; l'ordine degli ultimi tre filtri pu&ograve; non essere 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 '''compare_only_line''' in modo da ridurre la porzione di pagina, e
 
poi su questa gi&agrave; ridotta porzione, 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.
+
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 &egrave; proprio il nome del progetto hostato.
==http(s) o ftp==
+
Quindi un modo per inizializzare lo script, ad esempio per p7zip &egrave;:
Entrambi questi protocolli restituiscono pagine web che possono essere controllate, l'uso di questi protocolli
+
$> check_for_updates.sh init p7zip http://sourceforge.net/projects/p7zip/files/
quindi avviene tramite il comando:
 
wget --no-check-certificate
 
==svn==
+
E, per filtrare la pagina scaricata basta fare:
L'uso di subversion avviene scaricando, come pagina da confontare, il log, e viene fatto usando:
+
<pre>
svn info -r HEAD
+
$> 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
  +
</pre>
==git==
+
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':
L'uso di git avviene scaricando, come pagina da confrontare, il log, e viene fatto usando:
+
<pre>
git ls-remote HEAD
+
$> check_for_updates.sh check -f p7zip/
+
# Directory: p7zip
==Nota su svn e git==
+
p7zip 2010-05-30
Generalmente chi rilascia il codice solo con svn o con git, senza quindi rilasciare una versione ufficiale, usa anche
+
</pre>
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 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 &egrave; hostato da sourceforce &egrave; '''p7zip'''. Per usare gli RSS di
 
sourceforge basta andare sulla sezione 'Download' del progetto, nel caso di p7zip &egrave;:<br>
 
http://sourceforge.net/project/showfiles.php?group_id=111810
 
 
Nella tabella in cui vengono mostrate le varie release c'&egrave; 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:<br>
 
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 &egrave;:<br>
 
http://sourceforge.net/export/rss2_project.php?group_id=111810
 
 
Se ora si scegli l'XML associato a 'Project file releases', ci si sposter&agrave; sull'RSS che in cui viene inserito il
 
link ad una nuova versione, quando questa viene rilasciata. Per '''p7zip''' il link &egrave;:<br>
 
http://sourceforge.net/export/rss2_projfiles.php?group_id=111810
 
 
Bene, questo &egrave; 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&ograve; 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...=
=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 p&ograve; 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
 
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):
+
Autore (data dell'ultimo aggiornamento):<br/>
[[Utente:Spina|spina]] 10:13, 24 Gen 2009 (UTC)
+
[[Utente:targzeta|targzeta]] ([[Discussioni utente:targzeta|discussioni]]) 00:08, 1 ago 2012 (CEST)

Versione attuale delle 23:19, 2 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