Repository 32bit  Forum
Repository 64bit  Wiki

Check For Updated: differenze tra le versioni

Da Slacky.eu.
Riga 2: Riga 2:
[[category:Script]]
[[category:Script]]
=Introduzione=
=Introduzione=
Lo script '''chek_upgrade.sh''' controlla se una determinata pagina internet, o parte di essa (grazie all'uso di 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 '''chek_upgrade.sh''' controlla se una determinata pagina internet, o parte di essa (grazie all'uso di
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.
+
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=
=Download=
La prima cosa da fare è procurarsi lo script dal link:<br>
+
La prima cosa da fare &egrave; procurarsi lo script dal link:<br>
http://www.slacky.eu/wikislack/script/check-upgrade/check_upgrade.sh
http://www.slacky.eu/wikislack/script/check-upgrade/check_upgrade.sh
=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 nella mia macchina ho:
<pre>
<pre>
$> ls -1F Software/
$> ls -1F Software/
Riga 23: Riga 23:
...
...
</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 seguo (FileZilla, aicrack-ng, etc. 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_upgrade.sh --help
Riga 33: Riga 33:
check_upgrade.sh -v|--version
check_upgrade.sh -v|--version
MODALITA è una tra:
+
MODALITA &egrave; una tra:
check
check
init
init
Riga 40: Riga 40:
url
url
</pre>
</pre>
noi qui spieghiamo tutte le modalità una ad una, non in ordine alfabetico come mostrato dall'help, ma in ordine d'uso.
+
noi qui spieghiamo tutte le modalit&agrave; 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
  +
modalit&agrave; &egrave; il seguente:
<pre>$> check_upgrade.sh init --help
<pre>$> check_upgrade.sh init --help
Uso: check_upgrade.sh init [opzioni] dir URL
Uso: check_upgrade.sh init [opzioni] dir URL
Riga 72: Riga 72:
===Che vuol dire inizializzata?===
===Che vuol dire inizializzata?===
Una volta che la directory è stata inizializzata la si definisce "conforme" allo script, ovvero lo script al suo interno ha creato una sottodirectory di nome ''.check_upgrade'' con all'interno due file:
+
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_upgrade'' con all'interno due file:
<pre>
<pre>
$> tree FileZilla/.check_upgrade/
$> tree FileZilla/.check_upgrade/
Riga 83: Riga 83:
; page : la pagina web indirizzata dall'URL, scaricata tramite il comando '''wget'''
; page : la pagina web indirizzata dall'URL, scaricata tramite il comando '''wget'''
; url : contiene l'URL che si è passato come parametro.
+
; url : contiene l'URL che si &egrave; passato come parametro.
==Modalità check==
+
==Modalit&agrave; check==
Una volta inizializzata la directory, possiamo seguire il progetto quando ci pare facendo un '''check''' su di essa. L'help per questa modalità è:
+
Una volta inizializzata la directory, possiamo seguire il progetto quando ci pare facendo un '''check''' su di
  +
essa. L'help per questa modalit&agrave; &egrave;:
<pre>
<pre>
$> check_upgrade.sh check --help
$> check_upgrade.sh check --help
Uso: check_upgrade.sh check [opzioni] dir1...
Uso: check_upgrade.sh check [opzioni] dir1...
Controlla se la pagina è aggiornata.
+
Controlla se la pagina &egrave; aggiornata.
Opzioni:
Opzioni:
Riga 97: Riga 97:
-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
-o: produce output solo se la pagina è stata aggiornata
+
-o: produce output solo se la pagina &egrave; stata aggiornata
-q: quiet
-q: quiet
-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 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 sulle directory non conformi. Questo &egrave; utile se si vuole eseguire il check sull'intera
  +
directory ''Software'' con:
$> check_upgrade.sh check *
$> check_upgrade.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 parte con l'uso
  +
dell'opzione '-f'):
* scarica la pagina web identificata dall'indirizzo trovato nel file ''.check_upgrade/url'' in un file temporaneo
* scarica la pagina web identificata dall'indirizzo trovato nel file ''.check_upgrade/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_upgrade/page'' in un altro file temporaneo
Riga 120: Riga 120:
===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; 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)
+
Se &egrave; dovuta ad altre cause si pu&ograve; migliorare il controllo creando appositi filtri (vedremo in seguito
  +
l'uso dei filtri)
===Opzione -f===
===Opzione -f===
In questo caso lo script non esegue l'algoritmo spiegato in precedenza, ma si limita a filtrare la pagina '''.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_upgrade/page'' e a mostrare l'esito del filtro, e quindi la porzione di pagina che si vuole
  +
controllare. L'opzione &egrave; utile per testare i filtri (vedremo in seguito l'uso dei filtri)
===Opzione -k===
===Opzione -k===
Come si è 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.
+
Come si &egrave; visto lo script crea almeno due file temporanei, quelli sui quali applica i filtri ed esegue
  +
'''diff'''. Passando questa opzione, lo script non eliminer&agrave; questi due file temporanei.
Ad esempio:
Ad esempio:
Riga 136: Riga 136:
OK
OK
Il file /tmp/checkiEW7wR non è stato eliminato.
+
Il file /tmp/checkiEW7wR non &egrave; stato eliminato.
Il file /tmp/checkJlotcW, non è stato eliminato.
+
Il file /tmp/checkJlotcW, non &egrave; stato eliminato.
</pre>
</pre>
Riga 143: Riga 143:
===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. 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:
Riga 153: Riga 153:
===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:
Riga 172: Riga 172:
</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 produrr&agrave; nessun output. Anche
  +
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:
+
Una volta che il progetto locale &egrave; stato aggiornato (poich&eacute; la modalit&agrave; '''check''' ha ritornato
  +
'DA AGGIORNARE'), l'unico modo per far sapere allo script che la directory &egrave; di nuovo aggiornata, &egrave; quello
  +
di invocarlo con questa modalit&agrave;. L'help &egrave; il seguente:
<pre>
<pre>
$>check_upgrade.sh update --help
$>check_upgrade.sh update --help
Riga 187: Riga 187:
</pre>
</pre>
L'algoritmo seguito in questo caso è:
+
L'algoritmo seguito in questo caso &egrave;:
* scarica la pagina web identificata dall'indirizzo trovato nel file ''.check_upgrade/url'' nel file ''.check_upgrade/page''
* scarica la pagina web identificata dall'indirizzo trovato nel file ''.check_upgrade/url'' nel file ''.check_upgrade/page''
* notifica all'utente
* 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:
+
Ad esempio, se aggiorno la directory ''amrwb'', per il quale lo script mi ha tornato 'DA AGGIORNARE', invocando lo
  +
script con questa modalit&agrave; ottengo:
<pre>
<pre>
$> check_upgrade.sh update amrwb/
$> check_upgrade.sh update amrwb/
Riga 198: Riga 198:
</pre>
</pre>
Quindi, le prossime esecuzioni della modalità '''check''' useranno la nuova pagina appena scaricata per il confronto.
+
Quindi, le prossime esecuzioni della modalit&agrave; '''check''' useranno la nuova pagina appena scaricata per il
  +
confronto.
==Modalità not-conform==
+
==Modalit&agrave; not-conform==
La modalità si limita ad elencare, tra le directory passategli, quelle non conformi. L'help è il seguente:
+
La modalit&agrave; si limita ad elencare, tra le directory passategli, quelle non conformi. L'help &egrave; il seguente:
<pre>
<pre>
$> check_upgrade.sh not-conform --help
$> check_upgrade.sh not-conform --help
Riga 217: Riga 217:
</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_upgrade/url''. L'help &egrave; il seguente:
<pre>
<pre>
$> check_upgrade.sh url --help
$> check_upgrade.sh url --help
Riga 239: Riga 239:
</pre>
</pre>
Così sappiamo sempre rintracciare il link ai nuovi sorgenti per il progetto che stiamo seguendo.
+
Cos&igrave; sappiamo sempre rintracciare il link ai nuovi sorgenti per il progetto che stiamo seguendo.
=Filtri=
=Filtri=
I filtri sono un modo per far si che lo script esegua il comando '''diff''' solo una porzione e non sull'intera pagina.
I filtri sono un modo per far si che lo script esegua il comando '''diff''' solo una porzione e non sull'intera pagina.
Attualmente i filtri si devono creare a mano e vanno messi in file nella sottodirectory ''.check_upgrade/'' del nostro progetto. Ci sono quattro tipi di filtri, caratterizzati da altrettanti nomi file.
+
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.
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 con i filtri trovati al loro interno.
==Il filtro compare_only_line==
==Il filtro compare_only_line==
Se esiste un file chiamato ''.check_upgrade/compare_only_line'', questo file deve contenere, una per riga, una espressione regolare. Solo le righe dei file temporanei che hanno il match con queste espressioni regolari saranno confrontate.
+
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.
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. 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:
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_upgrade.sh check -f FileZilla/
Riga 260: Riga 260:
<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.
==Il filtro filter_line_number==
==Il filtro filter_line_number==
Se esiste un file chiamato ''.check_upgrade/filter_line_number'', questo file deve contenere, per ogni riga, un numero. Lo script sopprimerà le righe corrispondenti dalla pagina, prima di eseguire '''diff'''.
+
Se esiste un file chiamato ''.check_upgrade/filter_line_number'', questo file deve contenere, per ogni riga, un
  +
numero. Lo script sopprimer&agrave; le righe corrispondenti dalla pagina, prima di eseguire '''diff'''.
==Il filtro filter_line_regex==
==Il filtro filter_line_regex==
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'''.
+
Se esiste un file chiamato ''.check_upgrade/filter_line_regex'', questo file deve contenere, per ogni riga, una
  +
espressione regolare. Lo script sopprimer&agrave; le righe della pagina che hanno il match con una di queste espressioni
  +
regolari, prima di eseguire '''diff'''.
==Il filtro filter_word==
==Il filtro filter_word==
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_upgrade/filter_word'', questo file deve contenere, per ogni riga, una 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 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_upgrade/filter_word
$> echo '^.*href="' > FileZilla/.check_upgrade/filter_word
Riga 287: Riga 287:
* 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.
+
In realt&agrave; l'ordine degli ultimi tre filtri pu&ograve; 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&agrave; ridotta porzione, vengono eseguiti, se ci sono, i filtri per sopprimere altre righe o parole.
=Protocollo, Sourceforge e RSS=
=Protocollo, Sourceforge e RSS=
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.
+
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.
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>
+
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 &egrave; hostato da sourceforce &egrave; '''p7zip'''. Per usare
  +
gli RSS di sourceforge basta andare sulla sezione 'Download' del progetto, nel caso di p7zip &egrave;:<br>
http://sourceforge.net/project/showfiles.php?group_id=111810
http://sourceforge.net/project/showfiles.php?group_id=111810
Nella tabella in cui vengono mostrate le varie release c'è anche una colonna chiamata 'Notes/Monitor', clikkando sull'icona di 'Notes' si viene spostati sulla pagina delle note per il progetto, nell'esempio di '''p7zip''' si va su:<br>
+
Nella tabella in cui vengono mostrate le varie release c'&egrave; anche una colonna chiamata 'Notes/Monitor', clikkando
  +
sull'icona di 'Notes' si viene spostati sulla pagina delle note per il progetto, nell'esempio di '''p7zip''' si va
  +
su:<br>
http://sourceforge.net/project/shownotes.php?group_id=111810&release_id=605388
http://sourceforge.net/project/shownotes.php?group_id=111810&release_id=605388
Questa pagina contiene anche l'icona degli RSS, clikkandola si viene portati sulla pagina della scelta degli RSS ai quali ci si vuole abbonare, sempre per '''p7zip''' la pagina è:<br>
+
Questa pagina contiene anche l'icona degli RSS, clikkandola si viene portati sulla pagina della scelta degli RSS ai
  +
quali ci si vuole abbonare, sempre per '''p7zip''' la pagina &egrave;:<br>
http://sourceforge.net/export/rss2_project.php?group_id=111810
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>
+
Se ora si scegli l'XML associato a 'Project file releases', ci si sposter&agrave; sull'RSS che in cui viene inserito il
  +
link ad una nuova versione, quando questa viene rilasciata. Per '''p7zip''' il link &egrave;:<br>
http://sourceforge.net/export/rss2_projfiles.php?group_id=111810
http://sourceforge.net/export/rss2_projfiles.php?group_id=111810
Bene, questo è l'indirizzo che possiamo usare per inizializzare la nostra directory.
+
Bene, questo &egrave; l'indirizzo che possiamo usare per inizializzare la nostra directory.
'''Nota:''' per sbrigarsi basta prendere il link della sezione 'Download' del nostro progetto, nel nostro caso:
'''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
http://sourceforge.net/project/showfiles.php?group_id=111810
e sostituire, nel link, tutto ciò che precede il '?' con
+
e sostituire, nel link, tutto ci&ograve; che precede il '?' con
'http://sourceforge.net/export/rss2_projfiles.php'
'http://sourceforge.net/export/rss2_projfiles.php'
nel nostro caso quindi diventa:
nel nostro caso quindi diventa:
Riga 314: Riga 314:
==Filtrare gli RSS di sourceforge==
==Filtrare gli RSS di sourceforge==
Gli RSS di sourceforge vengono modificati anche ogni qualvolta un sorgente viene scaricato (incrementando un contatore), quindi di solito bisogna e basta, aggiungere i filtri '''filter_line_regex''' e '''filter_word''', inserendoci rispettivamente:
+
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_line_regex : <pre>RSS generated by</pre>
; filter_word : <pre>[[:digit:]]\+ downloads to date)</pre>
; filter_word : <pre>[[:digit:]]\+ downloads to date)</pre>
Riga 325: Riga 325:
</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 pò 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 p&ograve; 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.
+
Ho in mente anche una madalit&agrave; '''db''' per 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.
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 :)
+
Tutto si pu&ograve; fare e tutto forse si far&agrave;, certo &egrave; che se chiunque si senta pratico di scripting bash
  +
abbia anche la volont&agrave; di collaborare, tutto si potrebbe fare pi&ugrave; in fretta :)
=Conclusioni=
=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".
+
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".
Autore (data dell'ultimo aggiornamento):
Autore (data dell'ultimo aggiornamento):
[[Utente:Spina|Spina]] 20:11, 23 Nov 2008 (CET)
+
[[Utente:Spina|Spina]] 22:31, 23 Nov 2008 (CET)

Versione delle 22:31, 23 nov 2008

Indice

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. Questo perchè la slackware non è fornita di tutti i programmi e librerie esistenti, e quindi vi è una necessita di seguire in prima persona determinati progetti.

Download

La prima cosa da fare è procurarsi lo script dal link:
http://www.slacky.eu/wikislack/script/check-upgrade/check_upgrade.sh

L'ambiente di lavoro

Lo script lavora su directory, l'idea è che per ogni progetto che l'utente segue, ci sia una directory associata, ad esempio nella mia macchina ho:

$> ls -1F Software/
FileZilla/
a52dec/
aircrack-ng/
amrnb/
amrwb/
audacity/
...
check_upgrade.sh*
...

come si nota, lo script è all'interno della directory Software, la quale contiene una directory per ogni progetto che seguo (FileZilla, aicrack-ng, etc. etc.).

Lo script e le varie modalità

Lo script opera in diversi modi a seconda di quale modalità si scelga di eseguire. L'elenco delle modalità lo si trova con l'uso dell'opizione --help

$> check_upgrade.sh --help
Uso: check_upgrade.sh MODALITA [opzioni] arg1... 
     check_upgrade.sh MODALITA -h|--help 
     check_upgrade.sh -v|--version 

MODALITA è una tra:
        check
        init
        not-conform
        update
        url

noi qui spieghiamo tutte le modalità una ad una, non in ordine alfabetico come mostrato dall'help, ma in ordine d'uso.

Modalità init

Questa è la prima modalità che si usa per iniziare a seguire un progetto. L'help per questa modalità è il seguente:

$> check_upgrade.sh init --help
Uso: check_upgrade.sh init [opzioni] dir URL 

Inizializza la directory dir tramite l'URL passatogli. 

Opzioni: 
  -q:   quiet 
  -v:   verbose

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

Ad esempio per il progetto FileZilla si ha:

quindi per iniziare a seguire il progetto si esegue:

$> check_upgrade.sh init FileZilla/ http://filezilla-project.org/download.php?type=client
# Directory: FileZilla
INIZIALIZZATA
NOTA: il nome della directory non deve finire necessariamente con il carattere '/', nell'esempio
ho usato il tasto <TAB> e la shell ha completato il nome per me.

Che vuol dire inizializzata?

Una volta che la directory è stata inizializzata la si definisce "conforme" allo script, ovvero lo script al suo interno ha creato una sottodirectory di nome .check_upgrade con all'interno due file:

$> tree FileZilla/.check_upgrade/
FileZilla/.check_upgrade/
|-- page
`-- url

0 directories, 2 files
page 
la pagina web indirizzata dall'URL, scaricata tramite il comando wget
url 
contiene l'URL che si è passato come parametro.

Modalità check

Una volta inizializzata la directory, possiamo seguire il progetto quando ci pare facendo un check su di essa. L'help per questa modalità è:

$> check_upgrade.sh check --help
Uso: check_upgrade.sh check [opzioni] dir1... 

Controlla se la pagina è aggiornata. 

Opzioni: 
  -d:   mostra l'output di 'diff' quando controlla l'aggiornamento 
  -f:   mostra la pagina filtrata (non effettua controlli sull'aggiornamento) 
  -k:   non elimina i file temporanei all'uscita 
  -o:   produce output solo se la pagina è stata aggiornata 
  -q:   quiet 
  -s:   non stampa errori sulle directory non conformi 
  -v:   verbose

come si vede, si può fare il check anche su più directory contemporaneamente, in effetti lo si può fare anche su directory non conformi o file, lo script salterà i file, e tramimte l'opzione '-s' non stamperà nulla sulle directory non conformi. Questo è utile se si vuole eseguire il check sull'intera directory Software con:

$> check_upgrade.sh check *

Lo script, quando è invocato con questa modalità segue il seguente algoritmo (a parte con l'uso dell'opzione '-f'):

  • scarica la pagina web identificata dall'indirizzo trovato nel file .check_upgrade/url in un file temporaneo
  • fa una copia della pagina web .check_upgrade/page in un altro file temporaneo
  • se ci sono filtri, allora filtra entrambe le pagine temporanee
  • esegue il comando diff per vedere se ci sono differenze tra le due pagine temporanee

Un esempio di invocazione:

$> check_upgrade.sh check FileZilla/
# Directory: FileZilla
OK

il valore di ritorno 'OK' indica che la pagina .check_upgrade/page non differisce (filtrata) dalla pagina internet

Opzione -d

Tramite questa opzione, lo script mostrerà l'output del comando diff sulle pagine temporanee, questo è utile per vedere se effettivamente la differenza è dovuta ad una nuova release per il progetto, oppure ad altre cause.

Se è dovuta ad altre cause si può migliorare il controllo creando appositi filtri (vedremo in seguito l'uso dei filtri)

Opzione -f

In questo caso lo script non esegue l'algoritmo spiegato in precedenza, ma si limita a filtrare la pagina '.check_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)

Opzione -k

Come si è visto lo script crea almeno due file temporanei, quelli sui quali applica i filtri ed esegue diff. Passando questa opzione, lo script non eliminerà questi due file temporanei.

Ad esempio:

$> check_upgrade.sh check -k FileZilla/
# Directory: FileZilla
OK

Il file /tmp/checkiEW7wR non è stato eliminato. 
Il file /tmp/checkJlotcW, non è stato eliminato.

Questa opzione la tovavo utile prima dell'introduzione dell'opzione '-f'.

Opzione -o

Lo script, per ogni directory che gli si passa produce una serie di output tipo quello visto negli esempi precedenti. Questa opzione inibisce lo script a produrre output se il comando diff torna che le due pagine temporanee sono identiche. Nel nostro esempio, dato che la directory FileZilla viene trovata 'OK', lo script, con questa opzione, non avrebbe prodotto output. E' molto utile se si invoca lo script passandogli molte directory, o addirittuta '*'.

Ad esempio:

$> check_upgrade.sh check -o FileZilla/ amrwb/
# Directory: amrwb
DA AGGIORNARE

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_upgrade.sh check -qo FileZilla/ amrwb/
amrwb

Opzione -s

Normalmente se allo script gli si passa una directory non conforme esso produrra in output una scritta simile a questa:

$> check_upgrade.sh check Kernel/
# Directory: Kernel
  Attenzione: Kernel non ha: 
        * o la sottodirectory .check_upgrade 
        * o il file .check_upgrade/url 
        * o il file .check_upgrade/page

Tramite l'uso di questa opzione, lo script salta queste directory e quindi non produrrà nessun output. Anche questa opzione è utile se si invoca lo script su più directory in contemporanea o su '*'.

Modalità update

Una volta che il progetto locale è stato aggiornato (poiché la modalità check ha ritornato 'DA AGGIORNARE'), l'unico modo per far sapere allo script che la directory è di nuovo aggiornata, è quello di invocarlo con questa modalità. L'help è il seguente:

$>check_upgrade.sh update --help
Uso: check_upgrade.sh update [opzioni] dir1... 

Aggiorna, riscaricando la pagina, la directory dir. 

Opzioni: 
  -q:   quiet 
  -v:   verbose

L'algoritmo seguito in questo caso è:

  • scarica la pagina web identificata dall'indirizzo trovato nel file .check_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:

$> check_upgrade.sh update amrwb/
# Directory: amrwb
AGGIORNATO

Quindi, le prossime esecuzioni della modalità check useranno la nuova pagina appena scaricata per il confronto.

Modalità not-conform

La modalità si limita ad elencare, tra le directory passategli, quelle non conformi. L'help è il seguente:

$> check_upgrade.sh not-conform --help
Uso: check_upgrade.sh not-conform dir1... 

Stampa il nome delle dir non conformi (non inizializzate).

In questo modo possiamo sempre sapere quali, tra le nostre directory, non sono state ancora inizializzate.

Esempio:

$> check_upgrade.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_upgrade/url. L'help è il seguente:

$> check_upgrade.sh url --help
Uso: check_upgrade.sh url dir1... 

Stama l'URL impostato per la directory dir. 

Opzioni: 
  -v:   verbose

Ad esempio:

$> check_upgrade.sh url FileZilla/ amrwb/ Kernel/
# Directory: FileZilla
http://filezilla-project.org/download.php?type=client

# Directory: amrwb
http://www.penguin.cz/~utx/amr

Così sappiamo sempre rintracciare il link ai nuovi sorgenti per il progetto che stiamo seguendo.

Filtri

I filtri sono un modo per far si che lo script esegua il comando diff solo una porzione e non sull'intera pagina.

Attualmente i filtri si devono creare a mano e vanno messi in file nella sottodirectory .check_upgrade/ del nostro progetto. Ci sono quattro tipi di filtri, caratterizzati da altrettanti nomi file.

Quando lo script viene invocato con la modalità check, prima di eseguire il comando diff, se trova i file dei filtri, filtra i file temporanei con i filtri trovati al loro interno.

Il filtro compare_only_line

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.

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:

FileZilla.*src.*bz2

Per vedere cosa effettivamente compara il comando diff basta eseguire lo script con modalità check e opzione '-f':

 
$> check_upgrade.sh check -f FileZilla/
# Directory: FileZilla
  <p><a href="https://www.ohloh.net/projects/filezilla/download?filename=FileZilla_3.1.5.1_src.tar.bz2">FileZilla_3.1.5.1_src.tar.bz2</a> </p>

come si può notare, il filtro ha lasciato passare solo la riga che contiene il link ai sorgenti.

Il filtro filter_line_number

Se esiste un file chiamato .check_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.

Il filtro filter_line_regex

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

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.

Ad esempio, con riferimento all'output prodotto già dal filtro compare_only_line nell'esempio precedente, se noi volessimo eliminare dall'unica riga prodotta dal filtro, anche tutte le parole dall'inizio della riga sino al protocollo https, basta fare:

$> echo '^.*href="' > FileZilla/.check_upgrade/filter_word

$> check_upgrade.sh check -f FileZilla/
# Directory: FileZilla
https://www.ohloh.net/projects/filezilla/download?filename=FileZilla_3.1.5.1_src.tar.bz2">FileZilla_3.1.5.1_src.tar.bz2</a> </p>

L'ordine di esecuzione dei filtri

I filtri sopra citati vengono eseguiti nel seguente ordine:

  • compare_only_line
  • filter_line_number
  • filter_line_regex
  • file_filter_word

In realtà l'ordine degli ultimi tre filtri può non essere importante, ma si deve tenere bene in mente che prima si filtrano i file temporanei con il filtro compare_only_line in modo da ridurre la porzione di pagina, e poi su questa già ridotta porzione, vengono eseguiti, se ci sono, i filtri per sopprimere altre righe o parole.

Protocollo, Sourceforge e RSS

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.

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 è:
http://sourceforge.net/project/showfiles.php?group_id=111810

Nella tabella in cui vengono mostrate le varie release c'è anche una colonna chiamata 'Notes/Monitor', clikkando sull'icona di 'Notes' si viene spostati sulla pagina delle note per il progetto, nell'esempio di p7zip si va su:
http://sourceforge.net/project/shownotes.php?group_id=111810&release_id=605388

Questa pagina contiene anche l'icona degli RSS, clikkandola si viene portati sulla pagina della scelta degli RSS ai quali ci si vuole abbonare, sempre per p7zip la pagina è:
http://sourceforge.net/export/rss2_project.php?group_id=111810

Se ora si scegli l'XML associato a 'Project file releases', ci si sposterà sull'RSS che in cui viene inserito il link ad una nuova versione, quando questa viene rilasciata. Per p7zip il link è:
http://sourceforge.net/export/rss2_projfiles.php?group_id=111810

Bene, questo è l'indirizzo che possiamo usare per inizializzare la nostra directory.

Nota: per sbrigarsi basta prendere il link della sezione 'Download' del nostro progetto, nel nostro caso:
   http://sourceforge.net/project/showfiles.php?group_id=111810
e sostituire, nel link, tutto ciò che precede il '?' con 
  'http://sourceforge.net/export/rss2_projfiles.php'
nel nostro caso quindi diventa:
   http://sourceforge.net/export/rss2_projfiles.php?group_id=111810

Filtrare gli RSS di sourceforge

Gli RSS di sourceforge vengono modificati anche ogni qualvolta un sorgente viene scaricato (incrementando un contatore), quindi di solito bisogna e basta, aggiungere i filtri filter_line_regex e filter_word, inserendoci rispettivamente:

filter_line_regex 
RSS generated by
filter_word 
[[:digit:]]\+ downloads to date)

Ad esempio per la directory p7zip/ basta fare:

$> echo 'RSS generated by' > p7zip/.check_upgrade/filter_line_regex

$> echo '[[:digit:]]\+ downloads to date)' > p7zip/.check_upgrade/filter_word

Working in progress...

Lo script necessita ancora di ottimizzazioni, ritocchi ed espansioni. Per ora ad esempio il comportamento con le opzioni delle varie modalità è un pò bizzarro, basti pensare che l'opzione '-q' e '-v' non generano un errore di incompatibilità.

Ho in mente anche una madalità db per poter esportare ed importare URL e/o filtri. In questo modo basterebbe avere un pacchetto il più completo possibile di queste informazioni per far si che più utenti possano controllare gli stessi progetti senza doversi ogni volta scovare URL e filtri adatti.

Tutto si può fare e tutto forse si farà, certo è che se chiunque si senta pratico di scripting bash abbia anche la volontà di collaborare, tutto si potrebbe fare più in fretta :)

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".

Autore (data dell'ultimo aggiornamento): Spina 22:31, 23 Nov 2008 (CET)

Strumenti personali
Namespace

Varianti