Repository 32bit  Forum
Repository 64bit  Wiki

Check For Updated: differenze tra le versioni

Da Slacky.eu.
(Caricato i file esterni all'interno di wikislacky)
 
(13 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 '''chek_upgrade.sh''' controlla se una determinata pagina internet, o parte di essa (grazie all'uso di filtri), è stata modificata a partire da una data iniziale. Lo script è stato creato con lo scopo di scoprire se un determinato progetto che si vuole tenere d'occhio, è stato modificato oppure no, dall'ultima volta che lo si è controllato.
+
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.
Questo perchè la slackware non è fornita di tutti i programmi e librerie esistenti, e quindi vi è una necessita di seguire in prima persona determinati progetti.
+
  +
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.
=Download=
=Download=
La prima cosa da fare è procurarsi lo script dal link:<br>
+
Lo script lo potete trovare [[Media:Check_for_updates.sh‎|qui]].
http://www.slacky.eu/wikislack/script/check-upgrade/check_upgrade.sh
+
  +
==NOTA per le versioni dalla 1.5 in poi==
  +
Se si passa da una versione precedente ad una >= della 1.5, dato che lo script ha cambiato nome (da '''check_upgrade.sh''' a '''check_for_updates.sh'''), si dovrebbero anche rinominare tutte le sottodirectory ''.check_upgrade'' in ''.check_for_updates''. Ecco uno script che potrebbe essere d'aiuto:
  +
<pre>
  +
for file in *;
  +
do
  +
if [ -d $file ] && [ -d ${file}/.check_upgrade ];
  +
then
  +
mv ${file}/.check_upgrade ${file}/.check_for_updates;
  +
fi;
  +
done
  +
</pre>
  +
  +
'''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 è che per ogni progetto che l'utente segue, ci sia una directory associata, ad esempio nella mia macchina ho:
+
Lo script lavora su directory, l'idea &egrave; che per ogni progetto che l'utente segue, ci sia una directory associata, ad esempio:
<pre>
<pre>
$> ls -1F Software/
+
$> ls -1F software/
FileZilla/
FileZilla/
a52dec/
a52dec/
Riga 20: Riga 20:
audacity/
audacity/
...
...
check_upgrade.sh*
+
check_for_updates.sh*
...
...
</pre>
</pre>
come si nota, lo script è all'interno della directory ''Software'', la quale contiene una directory per ogni progetto che seguo (FileZilla, aicrack-ng, etc. etc.).
+
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...).
=Lo script e le varie modalità=
+
=Lo script e le varie modalit&agrave;=
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''
+
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''
<pre>
<pre>
$> check_upgrade.sh --help
+
$> check_for_updates.sh --help
Uso: check_upgrade.sh MODALITA [opzioni] arg1...
+
Uso: check_for_updates.sh [opzioni] MODALITA [mod_opzioni] arg1...
check_upgrade.sh MODALITA -h|--help
+
check_for_updates.sh MODALITA -h|--help
check_upgrade.sh -v|--version
+
check_for_updates.sh -v|--version
  +
  +
Opzioni:
  +
-c Non colora l'output
MODALITA è una tra:
+
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à una ad una, non in ordine alfabetico come mostrato dall'help, ma in ordine d'uso.
 
==Modalità init==
+
==Modalit&agrave; init==
Questa è la prima modalità che si usa per iniziare a seguire un progetto. L'help per questa modalità è il seguente:
+
Questa &egrave; la prima modalit&agrave; che si usa per iniziare a seguire un progetto. L'help per questa
<pre>$> check_upgrade.sh init --help
+
modalit&agrave; &egrave; il seguente:
Uso: check_upgrade.sh init [opzioni] dir URL
+
<pre>
  +
$> 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,
  +
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;
  +
{{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".}}
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_upgrade.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 è stata inizializzata la si definisce "conforme" allo script, ovvero lo script al suo interno ha creato una sottodirectory di nome ''.check_upgrade'' con all'interno due file:
 
<pre>
<pre>
$> tree FileZilla/.check_upgrade/
+
$> tree FileZilla/.check_for_updates/
FileZilla/.check_upgrade/
+
FileZilla/.check_for_updates/
|-- page
|-- page
`-- url
`-- url
Riga 80: Riga 83:
</pre>
</pre>
; page : la pagina web indirizzata dall'URL, scaricata tramite il comando '''wget'''
+
===Protocolli===
; url : contiene l'URL che si è 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'''.
==Modalità check==
+
====http(s) o ftp====
Una volta inizializzata la directory, possiamo seguire il progetto quando ci pare facendo un '''check''' su di essa. L'help per questa modalità è:
+
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==
  +
Una volta inizializzata la directory, si pu&ograve; seguire il progetto facendo un '''check''' su di essa. L'help per questa modalit&agrave; &egrave;:
<pre>
<pre>
$> check_upgrade.sh check --help
+
$> check_for_updates.sh check --help
Uso: check_upgrade.sh check [opzioni] dir1...
+
Uso: check_for_updates.sh check [opzioni] dir1...
Controlla se la pagina è 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 è stata aggiornata
+
-k non elimina i file temporanei all'uscita
-q: quiet
+
-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ò fare il '''check''' anche su più directory contemporaneamente, in effetti lo si può fare anche su directory non conformi o file, lo script salterà i file, e tramimte l'opzione '-s' non stamperà nulla sulle directory non conformi. Questo è utile se si vuole eseguire il check sull'intera directory ''Software'' con:
+
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:
$> check_upgrade.sh check *
+
$> check_for_updates.sh check *
Lo script, quando è invocato con questa modalità segue il seguente algoritmo (a parte con l'uso dell'opzione '-f'):
+
Lo script, quando &egrave; invocato con questa modalit&agrave; 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_upgrade/url'' in un file temporaneo
+
* 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_upgrade/page'' in un altro 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
+
* 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_upgrade.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_upgrade/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à l'output del comando '''diff''' sulle pagine temporanee, questo è utile per vedere se effettivamente la differenza è dovuta ad una nuova release per il progetto, oppure ad altre cause.
+
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).
 
Se è dovuta ad altre cause si può 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 '''.check_upgrade/page'' e a mostrare l'esito del filtro, e quindi la porzione di pagina che si vuole controllare. L'opzione è utile per testare i filtri (vedremo in seguito l'uso dei filtri)
+
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.
===Opzione -k===
===Opzione -k===
Come si è visto lo script crea almeno due file temporanei, quelli sui quali applica i filtri ed esegue '''diff'''. Passando questa opzione, lo script non eliminerà questi due file temporanei.
+
Con questa opzione, lo script non eliminer&agrave; i file temporanei creati per il confronto.
Ad esempio:
+
===Opzione -n===
<pre>
+
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.
$> check_upgrade.sh check -k FileZilla/
 
# Directory: FileZilla
 
OK
 
 
Il file /tmp/checkiEW7wR non è stato eliminato.
 
Il file /tmp/checkJlotcW, non è stato eliminato.
 
</pre>
 
 
Questa opzione la tovavo utile prima dell'introduzione dell'opzione '-f'.
 
===Opzione -o===
===Opzione -o===
Lo script, per ogni directory che gli si passa produce una serie di output tipo quello visto negli esempi precedenti. Questa opzione inibisce lo script a produrre output se il comando '''diff''' torna che le due pagine temporanee sono identiche. Nel nostro esempio, dato che la directory FileZilla viene trovata 'OK', lo script, con questa opzione, non avrebbe prodotto output. E' molto utile se si invoca lo script passandogli molte directory, o addirittuta '*'.
+
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:
Ad esempio:
<pre>
<pre>
$> check_upgrade.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'.}}
===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 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'.
+
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'.
Ad esempio:
Ad esempio:
<pre>
<pre>
$> check_upgrade.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'.}}
===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_upgrade.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_upgrade
+
* o la sottodirectory .check_for_updates
* o il file .check_upgrade/url
+
* o il file .check_for_updates/url
* o il file .check_upgrade/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à nessun output. Anche questa opzione è utile se si invoca lo script su più directory in contemporanea o su '*'.
+
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 '*'.
==Modalità update==
+
==Modalit&agrave; update==
Una volta che il progetto locale è stato aggiornato (poiché la modalità '''check''' ha ritornato 'DA AGGIORNARE'), l'unico modo per far sapere allo script che la directory è di nuovo aggiornata, è quello di invocarlo con questa modalità. L'help è il seguente:
+
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:
<pre>
<pre>
$>check_upgrade.sh update --help
+
$>check_for_updates.sh update --help
Uso: check_upgrade.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 è:
+
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_upgrade/url'' nel file ''.check_upgrade/page''
 
* notifica all'utente
 
 
Ad esempio, se aggiorno la directory ''amrwb'', per il quale lo script mi ha tornato 'DA AGGIORNARE', invocando lo script con questa modalità ottengo:
 
<pre>
<pre>
$> check_upgrade.sh update amrwb/
+
$> check_for_updates.sh update amrwb/
# Directory: amrwb
# Directory: amrwb
AGGIORNATO
+
AGGIORNATA
</pre>
</pre>
Quindi, le prossime esecuzioni della modalità '''check''' useranno la nuova pagina appena scaricata per il confronto.
+
==Modalit&agrave; not_conform==
+
La modalit&agrave; si limita ad elencare, tra le directory passategli, quelle non conformi. L'help &egrave; il seguente:
==Modalità not-conform==
 
La modalità si limita ad elencare, tra le directory passategli, quelle non conformi. L'help è il seguente:
 
<pre>
<pre>
$> check_upgrade.sh not-conform --help
+
$> check_for_updates.sh not_conform --help
Uso: check_upgrade.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_upgrade.sh not-conform FileZilla/ amrwb/ Kernel/
+
$> check_for_updates.sh not_conform FileZilla/ amrwb/ Kernel/
Kernel
Kernel
</pre>
</pre>
==Modalità url==
+
==Modalit&agrave; url==
Per ogni directory passatagli, se la directory è conforme, lo script stampa l'URL trovato nel file ''.check_upgrade/url''. L'help è il seguente:
+
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:
<pre>
<pre>
$> check_upgrade.sh url --help
+
$> check_for_updates.sh url --help
Uso: check_upgrade.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_upgrade.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 217: Riga 222:
http://www.penguin.cz/~utx/amr
http://www.penguin.cz/~utx/amr
</pre>
</pre>
 
Così 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_upgrade/'' del nostro progetto. Ci sono quattro tipi di filtri, caratterizzati da altrettanti nomi file.
+
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 con i filtri trovati al loro interno.
+
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.
  +
{{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_upgrade/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.
+
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. Dato che a me interessa controllare solo se sono stati postati nuovi sorgenti per linux, ho creato il file ''.check_upgrade/compare_only_line'' con all'interno questa espressione regolare:
+
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:
FileZilla.*src.*bz2
FileZilla.*src.*bz2
Per vedere cosa effettivamente compara il comando '''diff''' basta eseguire lo script con modalità '''check''' e opzione '-f':
+
Per vedere cosa effettivamente compara il comando '''diff''', basta eseguire lo script con modalit&agrave; '''check''' e opzione '-f':
<pre>
+
<pre>
$> check_upgrade.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>
</pre>
</pre>
come si può 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 proprio ''FileZilla/'', una regex del tutto analoga a quella mostrata prima &egrave;:
  +
#DIR#.*src.*bz2
  +
  +
==Il filtro filter_line_number (obsoleto)==
  +
Se esiste un file chiamato ''.check_for_updates/filter_line_number'', questo file deve contenere, per ogni riga, un numero. Lo script sopprimer&agrave; le righe corrispondenti dalla pagina, prima di eseguire '''diff'''.
==Il filtro filter_line_number==
+
==Il filtro filter_line_regex (obsoleto)==
Se esiste un file chiamato ''.check_upgrade/filter_line_number'', questo file deve contenere, per ogni riga, un numero. Lo script sopprimerà le righe corrispondenti dalla pagina, prima di eseguire '''diff'''.
+
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_upgrade/filter_line_regex'', questo file deve contenere, per ogni riga, una espressione regolare. Lo script sopprimerà le righe della pagina che hanno il match con una di queste espressioni regolari, prima di eseguire '''diff'''.
 
==Il filtro filter_word==
+
==Il filtro filter_word (obsoleto)==
Se esiste un file chiamato ''.check_upgrade/filter_word'', questo file deve contenere, per ogni riga, una espressione regolare. Lo script sopprimerà, per ogni riga che ha il match con una di queste espressione regolari, l'espressione regolare stessa.
+
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.
Ad esempio, con riferimento all'output prodotto già dal filtro '''compare_only_line''' nell'esempio precedente, se noi volessimo eliminare dall'unica riga prodotta dal filtro, anche tutte le parole dall'inizio della riga sino al protocollo https, basta fare:
+
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:
<pre>
<pre>
$> echo '^.*href="' > FileZilla/.check_upgrade/filter_word
+
$> echo '^.*href="' > FileZilla/.check_for_updates/filter_word
$> check_upgrade.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 265: Riga 276:
* file_filter_word
* file_filter_word
In realtà l'ordine degli ultimi tre filtri può non essere importante, ma si deve tenere bene in mente che prima si filtrano i file temporanei con il filtro '''compare_only_line''' in modo da ridurre la porzione di pagina, e poi su questa già ridotta porzione, vengono eseguiti, se ci sono, i filtri per sopprimere altre righe o parole.
+
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.
=Protocollo, Sourceforge e RSS=
+
=Progetti su Sourceforge=
Lo script ovviamente non accetta solo pagine web con protocollo http, ma con tutti i tipi di protocollo (vedi ftp) che ritornano delle pagine di testo da poter confrontare.
+
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.
Moltissimi progretti ormai sono hostati su sourceforge, il quale fornisce gli RSS (sempre presi via http) per tenere d'occhio i progetti. Uno dei progetti che seguo e che è hostato da sourceforce è '''p7zip'''. Per usare gli RSS di sourceforge basta andare sulla sezione 'Download' del progetto, nel caso di p7zip è:<br>
+
Quindi un modo per inizializzare lo script, ad esempio per p7zip &egrave;:
http://sourceforge.net/project/showfiles.php?group_id=111810
+
$> check_for_updates.sh init p7zip http://sourceforge.net/projects/p7zip/files/
Nella tabella in cui vengono mostrate le varie release c'è anche una colonna chiamata 'Notes/Monitor', clikkando sull'icona di 'Notes' si viene spostati sulla pagina delle note per il progetto, nell'esempio di '''p7zip''' si va su:<br>
+
E, per filtrare la pagina scaricata basta fare:
http://sourceforge.net/project/shownotes.php?group_id=111810&release_id=605388
+
<pre>
  +
$> 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>
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 è:<br>
+
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':
http://sourceforge.net/export/rss2_project.php?group_id=111810
 
 
Se ora si scegli l'XML associato a 'Project file releases', ci si sposterà sull'RSS che in cui viene inserito il link ad una nuova versione, quando questa viene rilasciata. Per '''p7zip''' il link è:<br>
 
http://sourceforge.net/export/rss2_projfiles.php?group_id=111810
 
 
Bene, questo è l'indirizzo che possiamo usare per inizializzare la nostra directory.
 
 
'''Nota:''' per sbrigarsi basta prendere il link della sezione 'Download' del nostro progetto, nel nostro caso:
 
http://sourceforge.net/project/showfiles.php?group_id=111810
 
e sostituire, nel link, tutto ciò che precede il '?' con
 
'http://sourceforge.net/export/rss2_projfiles.php'
 
nel nostro caso quindi diventa:
 
http://sourceforge.net/export/rss2_projfiles.php?group_id=111810
 
 
==Filtrare gli RSS di sourceforge==
 
Gli RSS di sourceforge vengono modificati anche ogni qualvolta un sorgente viene scaricato (incrementando un contatore), quindi di solito bisogna e basta, aggiungere i filtri '''filter_line_regex''' e '''filter_word''', inserendoci rispettivamente:
 
; filter_line_regex : <pre>RSS generated by</pre>
 
; filter_word : <pre>[[:digit:]]\+ downloads to date)</pre>
 
 
Ad esempio per la directory ''p7zip/'' basta fare:
 
<pre>
<pre>
$> echo 'RSS generated by' > p7zip/.check_upgrade/filter_line_regex
+
$> check_for_updates.sh check -f p7zip/
+
# Directory: p7zip
$> echo '[[:digit:]]\+ downloads to date)' > p7zip/.check_upgrade/filter_word
+
p7zip 2010-05-30
</pre>
</pre>
=Working in progress=
+
=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 bizzarro, basti pensare che l'opzione '-q' e '-v' non generano un errore di incompatibilità.
+
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;.
 
Ho in mente anche una madalità '''db''' per poter esportare ed importare URL e/o filtri. In questo modo basterebbe avere un pacchetto il più completo possibile di queste informazioni per far si che più utenti possano controllare gli stessi progetti senza doversi ogni volta scovare URL e filtri adatti.
 
Tutto si può fare e tutto forse si farà, certo è che se chiunque si senta pratico di scripting bash abbia anche la volontà di collaborare, tutto si potrebbe fare più in fretta :)
+
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.
=Conclusioni=
+
=Ringraziamenti e conclusioni=
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".
+
Ringrazio:
  +
* conraid per l'ottimo feedback
Autore (data dell'ultimo aggiornamento):
+
Autore (data dell'ultimo aggiornamento):<br/>
[[Utente:Spina|Spina]] 20:11, 23 Nov 2008 (CET)
+
[[Utente:targzeta|targzeta]] ([[Discussioni utente:targzeta|discussioni]]) 00:08, 1 ago 2012 (CEST)

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