Check For Updated: differenze tra le versioni
(Aggiornato alla versione 1.10 dello script) |
(Aggiornato il wiki alla versione 1.11 dello script.) |
||
| Riga 1: | Riga 1: | ||
| − | <!--Per http://www.slacky.eu/wikislack/index.php?title=Check_For_Updated --> |
+ | <!--Per http://www.slacky.eu/wikislack/index.php?title=Check_For_Updates --> |
[[category:Script]] |
[[category:Script]] |
||
=Introduzione= |
=Introduzione= |
||
| − | Lo script '''check_for_updated.sh''' controlla se una determinata pagina internet, o parte di essa (grazie all'uso di |
+ | Lo script '''check_for_updates.sh''' controlla se una determinata pagina internet è stata modificata. Lo si può pensare come un'alternativa ai feed RSS. |
| − | filtri), è stata modificata a partire da una data iniziale. Lo script è stato creato con lo scopo di |
||
| − | scoprire se un determinato progetto che si vuole tenere d'occhio, è stato modificato oppure no, dall'ultima volta |
||
| − | che lo si è controllato. Questo perchè la slackware non è fornita di tutti i programmi e librerie |
||
| − | esistenti, e quindi vi è una necessita di seguire in prima persona determinati progetti. |
||
| − | =Download= |
+ | Lo script è stato creato con lo scopo di scoprire se un determinato progetto è stato modificato oppure no, dall'ultima volta che lo si è controllato. |
| − | Tutto ciò che serve si trova al link:<br> |
||
| − | http://www.slacky.eu/~spina/script/check_for_updated/ |
||
| − | I file: |
+ | =Download= |
| − | ; check_for_updated.sh : è lo script vero e proprio |
+ | Lo script si trova all'indirizzo:<br/> |
| − | ; ChangeLog è : l'elenco delle modifiche tra una versione e l'altra |
+ | http://www.slacky.eu/~spina/script/check_for_updates.sh |
| − | ; TODO : è la lista delle cose che andrebbero fatte |
||
==NOTA per le versioni dalla 1.5 in poi== |
==NOTA per le versioni dalla 1.5 in poi== |
||
| − | Se si passa da una versione precedente ad una >= della 1.5, dato che lo script ha cambiato nome (da '''check_upgrade.sh |
+ | Se si passa da una versione precedente ad una >= della 1.5, dato che lo script ha cambiato nome (da '''check_upgrade.sh''' a '''check_for_updates.sh'''), si dovrebbero anche rinominare tutte le sottodirectory ''.check_upgrade'' in ''.check_for_updates''. Ecco uno script che potrebbe essere d'aiuto: |
| − | in '''check_for_updated.sh''') |
||
| − | si dovrebbe anche rinominare tutte le sottodirectory ''.check_upgrade'' in ''.check_for_updated'' |
||
| − | ad esempio con uno script come questo: |
||
<pre> |
<pre> |
||
for file in *; |
for file in *; |
||
| Riga 18: | Riga 18: | ||
if [ -d $file ] && [ -d ${file}/.check_upgrade ]; |
if [ -d $file ] && [ -d ${file}/.check_upgrade ]; |
||
then |
then |
||
| − | mv ${file}/.check_upgrade ${file}/.check_for_updated; |
+ | mv ${file}/.check_upgrade ${file}/.check_for_updates; |
fi; |
fi; |
||
done |
done |
||
| Riga 26: | Riga 26: | ||
=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, |
+ | Lo script lavora su directory, l'idea è 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 36: | Riga 36: | ||
audacity/ |
audacity/ |
||
... |
... |
||
| − | check_for_updated.sh* |
+ | check_for_updates.sh* |
... |
... |
||
</pre> |
</pre> |
||
| − | come si nota, lo script è all'interno della directory ''Software'', la quale contiene una directory per ogni |
+ | 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...). |
| − | progetto che seguo (FileZilla, aicrack-ng, etc. etc.). |
||
=Lo script e le varie modalità= |
=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 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 si trova con l'uso dell'opizione ''--help'' |
||
<pre> |
<pre> |
||
| − | $> Uso: check_for_updated.sh [opzioni] MODALITA [mod_opzioni] arg1... |
+ | $> check_for_updates.sh --help |
| − | check_for_updated.sh MODALITA -h|--help |
+ | Uso: check_for_updates.sh [opzioni] MODALITA [mod_opzioni] arg1... |
| − | check_for_updated.sh -v|--version |
+ | check_for_updates.sh MODALITA -h|--help |
| + | check_for_updates.sh -v|--version |
||
Opzioni: |
Opzioni: |
||
-c Non colora l'output |
-c Non colora l'output |
||
| − | MODALITA è una tra: |
+ | MODALITA e' una tra: |
check |
check |
||
db |
db |
||
| Riga 59: | Riga 59: | ||
url |
url |
||
| − | by Emanuele Tomasi aka Spina <spina80@gmail.it> |
+ | by Emanuele Tomasi aka Spina <spina80@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à init== |
||
Questa è la prima modalità che si usa per iniziare a seguire un progetto. L'help per questa |
Questa è la prima modalità che si usa per iniziare a seguire un progetto. L'help per questa |
||
modalità è il seguente: |
modalità è il seguente: |
||
| − | <pre>$> check_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ò |
+ | {{Be Careful|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".}} |
| − | 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 è 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 è 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_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 107: | Riga 106: | ||
</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à '''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 è 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 è 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'''. |
||
| + | |||
| + | ====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'''. |
||
==Modalità check== |
==Modalità 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ò seguire il progetto facendo un '''check''' su di essa. L'help per questa modalità è: |
| − | essa. L'help per questa modalità è: |
||
<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 ` aggiornata. |
+ | Controlla se la pagina e' aggiornata. |
Opzioni: |
Opzioni: |
||
| − | -d: mostra l'output di 'diff' quando controlla l'aggiornamento |
+ | -d mostra l'output di 'diff' quando controlla l'aggiornamento |
| − | -e: non mostra gli errori di download |
+ | -e non mostra gli errori di download |
| − | -f: mostra la pagina filtrata (non effettua controlli sull'aggiornamento) |
+ | -f mostra la pagina filtrata (non effettua controlli sull'aggiornamento) |
| − | -k: non elimina i file temporanei all'uscita |
+ | -k non elimina i file temporanei all'uscita |
| − | -n mostra l'output di 'diff' stampando solo le nuove righe. Ignora '-d' |
+ | -n mostra l'output di 'diff' stampando solo le nuove righe. Ignora '-d' |
| − | -o: produce output solo se la pagina ` stata aggiornata. Implica '-s' |
+ | -o produce output solo se la pagina e' stata aggiornata. Implica '-s' |
| − | -q: quiet. Implica '-s'. |
+ | -q quiet. Implica '-s' |
| − | -s: non stampa errori sulle directory non conformi |
+ | -s non stampa errori sulle directory non conformi |
| − | -v: verbose |
+ | -v verbose |
</pre> |
</pre> |
||
| − | come si vede, si può fare il '''check''' anche su più directory contemporaneamente, in effetti lo si |
+ | 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: |
| − | può fare anche su directory non conformi o file, lo script salterà i file, e tramimte l'opzione '-s' non |
+ | $> check_for_updates.sh check * |
| − | stamperà nulla sulle directory non conformi. Questo è utile se si vuole eseguire il check sull'intera |
||
| − | directory ''Software'' con: |
||
| − | $> check_for_updated.sh check * |
||
| − | Lo script, quando è invocato con questa modalità segue il seguente algoritmo (a parte con l'uso |
+ | Lo script, quando è invocato con questa modalità 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 è 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à l'output del comando '''diff''' sulle pagine temporanee, questo |
+ | 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). |
| − | è utile per vedere se effettivamente la differenza è dovuta ad una nuova release per il progetto, oppure |
||
| − | ad altre cause. |
||
| − | |||
| − | Se è dovuta ad altre cause si può migliorare il controllo creando appositi filtri (vedremo in seguito |
||
| − | l'uso dei filtri) |
||
===Opzione -f=== |
===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à controllata. |
| − | '''.check_for_updated/page'' e a mostrare l'esito del filtro, e quindi la porzione di pagina che si vuole |
||
| − | controllare. L'opzione è utile per testare i filtri (vedremo in seguito l'uso dei filtri) |
||
===Opzione -k=== |
===Opzione -k=== |
||
| − | Come si è visto lo script crea almeno due file temporanei, quelli sui quali applica i filtri ed esegue |
+ | Con questa opzione, lo script non eliminerà i file temporanei creati per il confronto. |
| − | '''diff'''. Passando questa opzione, lo script non eliminerà questi due file temporanei. |
||
| − | |||
| − | Ad esempio: |
||
| − | <pre> |
||
| − | $> check_for_updated.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 -n=== |
===Opzione -n=== |
||
| − | Questa opzione è simile (e ne è un alternativa) all'opzione '-d' con la differenza che mostra soltanto le |
+ | 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. |
| − | 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 è 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 è 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à nessun output. Anche |
+ | 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 '*'. |
| − | questa opzione è utile se si invoca lo script su più directory in contemporanea o su '*'. |
||
==Modalità update== |
==Modalità update== |
||
| − | Una volta che il progetto locale è stato aggiornato (poiché la modalità '''check''' ha ritornato |
+ | 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: |
| − | '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: |
||
<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 è: |
+ | 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: |
| − | * scarica la pagina web identificata dall'indirizzo trovato nel file ''.check_for_updated/url'' nel file ''.check_for_updated/page'' |
||
| − | * notifica all'utente |
||
| − | |||
| − | Ad esempio, se aggiorno la directory ''amrwb'', per il quale lo script mi ha tornato 'DA AGGIORNARE', invocando lo |
||
| − | script con questa modalità ottengo: |
||
<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à '''check''' useranno la nuova pagina appena scaricata per il |
||
| − | confronto. |
||
==Modalità not_conform== |
==Modalità not_conform== |
||
La modalità si limita ad elencare, tra le directory passategli, quelle non conformi. L'help è il seguente: |
La modalità si limita ad elencare, tra le directory passategli, quelle non conformi. L'help è il seguente: |
||
<pre> |
<pre> |
||
| − | $> check_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à url== |
==Modalità url== |
||
| − | Per ogni directory passatagli, se la directory è conforme, lo script stampa l'URL trovato nel file |
+ | Per ogni directory passatagli, se la directory è conforme, lo script stampa l'URL trovato nel file ''.check_for_updates/url''. L'help è il seguente: |
| − | ''.check_for_updated/url''. L'help è 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 251: | Riga 247: | ||
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é sull'intera pagina. |
| − | |||
| − | Attualmente i filtri si devono creare a mano e vanno messi in file nella sottodirectory ''.check_for_updated/'' del nostro |
||
| − | progetto. Ci sono cinque tipi di filtri, caratterizzati da altrettanti nomi file. |
||
| − | |||
| − | Quando lo script viene invocato con la modalità '''check''', prima di eseguire il comando '''diff''', se trova i |
||
| − | file dei filtri, filtra i file temporanei con i filtri trovati al loro interno. |
||
| − | '''Nota''': tutti i filtri sono fatti usando '''sed''' con le basic regex. |
+ | Attualmente i filtri si devono creare a mano e vanno messi in dei file nella sottodirectory ''.check_for_updates/'' del progetto. Ci sono cinque tipi di filtri, caratterizzati da altrettanti nomi file. |
| − | Nella scrittura di alcuni filtri si può usare la direttiva '''#DIR#''' che viene sostituita dal nome della directory |
+ | 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. |
| − | su cui si stà lavorando. |
+ | {{Hint|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. |
||
| + | {{Be Careful|Nota|Poiché il filtro '''sed_script''' può sostituire tutti gli altri, nelle prossime versioni sarà l'unico filtro ammesso.}} |
||
| − | ==Il filtro compare_only_line== |
+ | ==Il filtro compare_only_line (obsoleto)== |
| − | Se esiste un file chiamato ''.check_for_updated/compare_only_line'', questo file deve contenere, una per riga, una |
+ | Se esiste un file chiamato ''.check_for_updates/compare_only_line'', questo file deve contenere, una per riga, un'espressione regolare. Solo le righe dei file temporanei che hanno il match con queste espressioni regolari saranno confrontate. |
| − | espressione regolare. Solo le righe dei file temporanei che hanno il match con queste espressioni regolari saranno |
||
| − | confrontate. |
||
| − | Ad esempio, se si guarda il link impostato per FileZilla, si noterà che in quella pagina vengono linkati sia i |
+ | Ad esempio, se si guarda il link impostato per FileZilla, si noterà che in quella pagina vengono linkati sia i sorgenti per linux, sia l'installer per Windows, per Mac OS, etc. etc. Se si vuole controllare solo i sorgenti per linux, basta creare il file ''.check_for_updates/compare_only_line'' con all'interno questa espressione regolare: |
| − | sorgenti per linux, sia l'installer per Windows, per Mac OS, etc. etc. Dato che a me interessa controllare solo se sono |
||
| − | stati postati nuovi sorgenti per linux, ho creato il file ''.check_for_updated/compare_only_line'' con all'interno questa |
||
| − | espressione regolare: |
||
FileZilla.*src.*bz2 |
FileZilla.*src.*bz2 |
||
| − | Per vedere cosa effettivamente compara il comando '''diff''' basta eseguire lo script con modalità '''check''' e |
+ | Per vedere cosa effettivamente compara il comando '''diff''', basta eseguire lo script con modalità '''check''' e opzione '-f': |
| − | opzione '-f': |
||
<pre> |
<pre> |
||
| − | $> check_for_updated.sh check -f FileZilla/ |
+ | $> check_for_updates.sh check -f FileZilla/ |
# Directory: FileZilla |
# Directory: FileZilla |
||
<p><a href="https://www.ohloh.net/projects/filezilla/download?filename=FileZilla_3.1.5.1_src.tar.bz2">FileZilla_3.1.5.1_src.tar.bz2</a> </p> |
<p><a href="https://www.ohloh.net/projects/filezilla/download?filename=FileZilla_3.1.5.1_src.tar.bz2">FileZilla_3.1.5.1_src.tar.bz2</a> </p> |
||
| Riga 276: | Riga 270: | ||
come si può notare, il filtro ha lasciato passare solo la riga che contiene il link ai sorgenti. |
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 |
+ | 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 è: |
| − | proprio ''FileZilla'', una regex del tutto analoga a quella mostrato prima è: |
||
#DIR#.*src.*bz2 |
#DIR#.*src.*bz2 |
||
| − | poiché la direttiva '''#DIR''' sarà sostituita dal nome della directory. |
||
| − | ==Il filtro filter_line_number== |
+ | ==Il filtro filter_line_number (obsoleto)== |
| − | Se esiste un file chiamato ''.check_for_updated/filter_line_number'', questo file deve contenere, per ogni riga, un |
+ | Se esiste un file chiamato ''.check_for_updates/filter_line_number'', questo file deve contenere, per ogni riga, un numero. Lo script sopprimerà le righe corrispondenti dalla pagina, prima di eseguire '''diff'''. |
| − | numero. Lo script sopprimerà le righe corrispondenti dalla pagina, prima di eseguire '''diff'''. |
||
| − | ==Il filtro filter_line_regex== |
+ | ==Il filtro filter_line_regex (obsoleto)== |
| − | Se esiste un file chiamato ''.check_for_updated/filter_line_regex'', questo file deve contenere, per ogni riga, una |
+ | Se esiste un file chiamato ''.check_for_updates/filter_line_regex'', questo file deve contenere, per ogni riga, un'espressione regolare. Lo script sopprimerà le righe della pagina che hanno il match con una di queste espressioni regolari, prima di eseguire '''diff'''. |
| − | 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#'''. |
Per questo filtro si può usare la direttiva '''#DIR#'''. |
||
| − | ==Il filtro filter_word== |
+ | ==Il filtro filter_word (obsoleto)== |
| − | Se esiste un file chiamato ''.check_for_updated/filter_word'', questo file deve contenere, per ogni riga, una espressione |
+ | Se esiste un file chiamato ''.check_for_updates/filter_word'', questo file deve contenere, per ogni riga, un'espressione regolare. Lo script sopprimerà, per ogni riga che ha il match con una di queste espressione regolari, l'espressione regolare stessa. |
| − | 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, |
+ | 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: |
| − | se noi volessimo eliminare dall'unica riga prodotta dal filtro, anche tutte le parole dall'inizio della riga sino al |
||
| − | protocollo https, basta fare: |
||
<pre> |
<pre> |
||
| − | $> echo '^.*href="' > FileZilla/.check_for_updated/filter_word |
+ | $> echo '^.*href="' > FileZilla/.check_for_updates/filter_word |
| − | $> check_for_updated.sh check -f FileZilla/ |
+ | $> check_for_updates.sh check -f FileZilla/ |
# Directory: FileZilla |
# Directory: FileZilla |
||
https://www.ohloh.net/projects/filezilla/download?filename=FileZilla_3.1.5.1_src.tar.bz2">FileZilla_3.1.5.1_src.tar.bz2</a> </p> |
https://www.ohloh.net/projects/filezilla/download?filename=FileZilla_3.1.5.1_src.tar.bz2">FileZilla_3.1.5.1_src.tar.bz2</a> </p> |
||
| Riga 303: | Riga 296: | ||
== Il filtro sed_script == |
== Il filtro sed_script == |
||
| − | Se esiste un file chiamato ''.check_for_updated/sed_script'', questo file deve contenere un vero e proprio script per sed. |
+ | Se esiste un file chiamato ''.check_for_updates/sed_script'', questo file deve contenere un vero e proprio script per sed. '''check_for_updates.sh''' esegue il comando '''sed -n -f .check_for_updates/sed_script''', quindi si faccia attenzione poiché non verrà generato nessun output a meno che non si sia usato il comando '''p''' di sed. |
| − | Lo script esegue il comando '''sed -n -f .check_for_updated/sed_script''', quindi si faccia attenzione che non viene generato |
||
| − | nessun output a meno che non usa il comando '''p''' di sed. |
||
Per questo filtro si può usare la direttiva '''#DIR#'''. |
Per questo filtro si può usare la direttiva '''#DIR#'''. |
||
| Riga 315: | Riga 308: | ||
* file_filter_word |
* file_filter_word |
||
| − | In realtà l'ordine degli ultimi tre filtri non è importante, ma si deve tenere bene in mente che |
+ | 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. |
| − | prima si filtrano i file temporanei con il filtro '''sed_script''', quindi sull'output di questo filtro viene applicato, |
||
| − | se esiste, il filtro '''compare_only_line''', ed infine sull'output di quest'altro filtro, vengono eseguiti, se ci sono, |
||
| − | i filtri per sopprimere altre righe o parole. |
||
| − | =Protocolli= |
+ | =Progetti su Sourceforge= |
| − | Ci sono vari tipi di protocolli accettati dallo script, il protocollo da usare viene individuato analizzando l'inizio dell'URL. |
||
| − | |||
| − | ==http(s) o ftp== |
||
| − | Entrambi questi protocolli restituiscono pagine web che possono essere controllate, l'uso di questi protocolli |
||
| − | quindi avviene tramite il comando: |
||
| − | wget --no-check-certificate |
||
| − | |||
| − | ==svn== |
||
| − | L'uso di subversion avviene scaricando, come pagina da confontare, il log, e viene fatto usando: |
||
| − | svn info -r HEAD |
||
| − | |||
| − | ==git== |
||
| − | L'uso di git avviene scaricando, come pagina da confrontare, il log, e viene fatto usando: |
||
| − | git ls-remote HEAD |
||
| − | |||
| − | ==Nota su svn e git== |
||
| − | Generalmente chi rilascia il codice solo con svn o con git, senza quindi rilasciare una versione ufficiale, usa anche |
||
| − | far vedere l'albero dei sorgenti attraverso un front-end http. Quindi si possono scegliere vari modi per seguire il |
||
| − | progetto. |
||
| − | |||
| − | Un esempio tra tutti è ffmpeg. Nella sua [http://ffmpeg.mplayerhq.hu/download.html pagina di download] |
||
| − | viene spiegato come prelevare il programma sia con '''svn''', sia con '''git''', ma non ci sono release ufficiali. |
||
| − | Quindi noi potremmo decidere di usare: |
||
| − | *il protocollo svn con: |
||
| − | chek_upgrade.sh init svn://svn.ffmpeg.org/ffmpeg/trunk |
||
| − | *il protocollo git con: |
||
| − | check_uprade.sh init git://git.mplayerhq.hu/ffmpeg/ |
||
| − | *oppure usare uno dei due link http forniti per visualizzare l'albero di directory: |
||
| − | **il [http://svn.ffmpeg.org/ffmpeg/trunk/ link per svn] andrebbe filtrato in modo da comparare solo la riga contenente 'revision:'. |
||
| − | **il [http://git.ffmpeg.org/ link per git] invece non va bene, in quel link si dovrebbe clikkare su 'summary' ed arrivare al [http://git.ffmpeg.org/?p=ffmpeg;a=summary link dei commit] e qui filtrare in modo da coparare solo la riga 'last change' |
||
| − | |||
| − | =Sourceforge= |
||
Il link ai file di un progetto hostato su Sourceforge hanno tutti la stessa forma: |
Il link ai file di un progetto hostato su Sourceforge hanno tutti la stessa forma: |
||
http://sourceforge.net/projects/NOME_PROGETTO/files/ |
http://sourceforge.net/projects/NOME_PROGETTO/files/ |
||
| Riga 323: | Riga 316: | ||
Quindi un modo per inizializzare lo script, ad esempio per p7zip è: |
Quindi un modo per inizializzare lo script, ad esempio per p7zip è: |
||
| − | $> check_for_updated init p7zip http://sourceforge.net/projects/p7zip/files/ |
+ | $> check_for_updates.sh init p7zip http://sourceforge.net/projects/p7zip/files/ |
E, per filtrare la pagina scaricata basta fare: |
E, per filtrare la pagina scaricata basta fare: |
||
<pre> |
<pre> |
||
$> echo '/#DIR#.*class="folder/b get_date;d;:get_date /date/{s/.*title="\([[:digit:]-]\+\).*/#DIR# \1/p;q};n;b get_date'\ |
$> echo '/#DIR#.*class="folder/b get_date;d;:get_date /date/{s/.*title="\([[:digit:]-]\+\).*/#DIR# \1/p;q};n;b get_date'\ |
||
| − | > p7zip/.check_for_updated/sed_script |
+ | > p7zip/.check_for_updates/sed_script |
</pre> |
</pre> |
||
il quale fa passare solo la data dell'ultimo file aggiornamento, come si può vedere dall'output della modalità '''check''' con l'opzione '-f': |
il quale fa passare solo la data dell'ultimo file aggiornamento, come si può vedere dall'output della modalità '''check''' con l'opzione '-f': |
||
<pre> |
<pre> |
||
| − | $> check_for_updated.sh check -f p7zip/ |
+ | $> check_for_updates.sh check -f p7zip/ |
# Directory: p7zip |
# Directory: p7zip |
||
p7zip 2010-05-30 |
p7zip 2010-05-30 |
||
</pre> |
</pre> |
||
| − | |||
| − | '''Nota:''' si noti che l'uso della direttiva '''#DIR#''' nel filtro, questo perchè il progetto p7zip si trova proprio nella directory ''p7zip/''. |
||
=Working in progress...= |
=Working in progress...= |
||
| − | Lo script necessita ancora di ottimizzazioni, ritocchi ed espansioni. Per ora ad esempio il comportamento con le opzioni |
+ | Lo script necessita ancora di ottimizzazioni, ritocchi ed espansioni. Per ora, ad esempio, il comportamento con le opzioni delle varie modalità è un po' bizzarro, basti pensare che l'opzione '-q' e '-v' non generano un errore di incompatibilità. |
| − | delle varie modalità è un po' bizzarro, basti pensare che l'opzione '-q' e '-v' non generano un |
||
| − | errore di incompatibilità. |
||
| − | Ho in mente anche una madalità '''db''' per poter esportare ed importare URL e/o filtri. In questo modo |
+ | 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. |
| − | 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 |
+ | =Ringraziamenti e conclusioni= |
| − | abbia anche la volontà di collaborare, tutto si potrebbe fare più in fretta :) |
||
| − | |||
| − | =Ringraziamenti e Conclusioni= |
||
Ringrazio: |
Ringrazio: |
||
* conraid per l'ottimo feedback |
* conraid per l'ottimo feedback |
||
| − | Spero che lo script possa essere di aiuto ai "pacchettizzatori" di Slacky.eu, ma anche a chiunque necessiti di un metodo |
+ | Autore (data dell'ultimo aggiornamento):<br/> |
| − | rapido per tenere d'occhio tutto un insieme di progetti interessanti, basti pensare al caso limite di chi si fa |
+ | [[Utente:Spina|spina]] ([[Discussioni utente:Spina|discussioni]]) 00:08, 1 ago 2012 (CEST) |
| − | distribuzioni "from scratch". |
||
| − | |||
| − | Ovviamente usate lo script per seguire i cambiamenti di questa pagina controllando quindi l'uscita di una nuova versione ;-) |
||
| − | |||
| − | Autore (data dell'ultimo aggiornamento): |
||
| − | [[Utente:Spina|spina]] 18:35, 2 dic 2010 (UTC) |
||
Versione delle 00:08, 1 ago 2012
Indice |
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.
Download
Lo script si trova all'indirizzo:
http://www.slacky.eu/~spina/script/check_for_updates.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:
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!!
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...).
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 Spina <spina80@gmail.com>
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:
- Il nome della directory == FileZilla/
- URL = http://filezilla-project.org/download.php?type=client
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
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.
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.
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.
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.
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).
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).
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.
Opzione -k
Con questa opzione, lo script non eliminerà i file temporanei creati per il confronto.
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.
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'. |
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'. |
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 '*'.
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
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
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
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. |
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
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.
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#.
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#.
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#.
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.
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
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.
Ringraziamenti e conclusioni
Ringrazio:
- conraid per l'ottimo feedback
Autore (data dell'ultimo aggiornamento):
spina (discussioni) 00:08, 1 ago 2012 (CEST)