mercoledì 16 marzo 2011

Script per storicizzazione bollettini nivo-meteo (e non solo)

Aggiornato lo script per la storicizzazione dei bollettini nivo-meteo.
Ho strutturato la cosa in due parti, uno script che esegue il download, il controllo ed il salvataggio del bollettino, un file che contiene l’elenco dei bollettini da manipolare, rendendo piu` comoda l’aggiunta futura di ulteriori bollettini, o il riutilizzo dello script per altri scopi (che ho gia` in mente, ma e` un’altra storia).
Lo script e` scritto in “bash”, ovviamente gira su OS *nix/bsd.

Il file, che ho chiamato “elenco”, e` strutturato e contiene la “url” del file da scaricare, uno spazio vuoto, il “nome” del file di destinazione (come volete che venga nominato), uno spazio, il tipo del file che stiamo scaricando, questo e` il mio attuale:
http://www.sian.it/infoMeteo/stampaBollettinoStampa.do?settore=C&pubblicato=true&outputFormat=2&generatorClass=it.sian.mwablx.web.print.DatiStampaBollettinoDG&chiamata=infoMeteo EmiliaRomagna-Valanghe- pdf
http://www.sian.it/infoMeteo/stampaBollettinoStampa.do?settore=B&pubblicato=true&outputFormat=2&generatorClass=it.sian.mwablx.web.print.DatiStampaBollettinoDG&chiamata=infoMeteo Toscana-Valanghe- pdf
http://www.meteotrentino.it/bollettini/today/valanghe_it.pdf Trentino-Valanghe- pdf
http://www.meteotrentino.it/bollettini/today/generale_it.pdf Trentino-Meteo- pdf
http://www.arpa.veneto.it/upload_arabba/bollettini_meteo/dolomitimeteo/dolomitimeteo.pdf Veneto-Dolomiti-Meteo- pdf
http://www.arpa.veneto.it/upload_arabba/bollettini_meteo/dolomitineve/dolomitineve.pdf Veneto-Dolomiti-Valanghe- pdf

http://www.meteoam.it/?q=printpdf/node/10897 AM-Rischio-Valanghe- pdf
http://www.meteoam.it/?q=node/10897 AM-Rischio-Valanghe- html

Lo script e` questo, i commenti all’interno aiutano a capirne il funzionamento:
#!/bin/bash

# Questo batch legge dallo standard input una linea alla volta,
# scaricando la url specificata come primo parametro, assegnandogli
# il nome specificato come secondo, e l'estensione come terzo.
# Aggiunge inoltre ANNO MESE GIORNO al nome file salvato.
# Se il file scaricato e` uguale al primo precedente lo scarta.
#
# Il file di input deve quindi essere strutturato in questo
# modo:
#       URL NAME EXT
#
# Il comando dev'essere utilizzato cosi`: $0 < inputfile
#
# NOTE:
# Al primo utilizzo viene generato un file di confronto, e` un file
# vuoto che puo`/deve essere eliminato quando almeno un'altro e`
# stato scaricato e salvato.


# Funzione Contolla Scarica E Salva
funcses () {
    if [ -e `find -name $2\* | tail -n 1` ]
        then echo ""
        else touch $2$(date +%Y%m%d -d "-1 day").$3
    fi
    wget -U mozilla $1 --output-document=$2$(date +%Y%m%d)-new.$3
    i=0
    while [ -e $2$(date +%Y%m%d)-new.$3 ]
        do
            if [ -e $2$(date +%Y%m%d -d "-$i day").$3 ]
                then
                    diff $2$(date +%Y%m%d -d "-$i day").$3 $2$(date +%Y%m%d)-new.$3 > /dev/null
                    if [ $? != 0 ]
                        then
                            mv $2$(date +%Y%m%d)-new.$3 $2$(date +%Y%m%d).$3
                        else
                            rm $2$(date +%Y%m%d)-new.$3
                    fi
                else
                    $(( i++ )) 2> /dev/null
            fi
    done
    }

# Help
if [[ $# -ne 0 || $1 = "-h" ]]
    then
        echo "uso: $0 < inputfile"
        echo "oppure"
        echo "uso: cat inputfile | $0"
        echo ""
        echo "Se non specificata redirezione accetta input manuale"
    exit 1
fi

# Lettura standard input e chiamata alla funzione
while read line
    do
        if [ "$line" != "" ]
            then
                funcses $line
        fi
done
L’uso e` semplice:
nomedelloscript < inputfile
oppure:
cat inputfile | nomedelloscript
"nomedelloscript" e` il nome del file dello script (come lo avete chiamato), "inputfile" e` l’esempio "elenco" usato sopra. Nel mio specifico caso, ho nascosto i file in una directory del web server e l’aggiornamento dei bollettini e` effettuato una sola volta al giorno dal demone "crontab":
crontab -l
# m h  dom mon dow   command
1 12 * * * cd /var/www/nivometeo/ && . /var/www/nivometeo/.dwlbnm < /var/www/nivometeo/.elenco
2 12 * * * cd /var/www/nivometeo/ && . /var/www/nivometeo/.changepermission
si puo` notare come abbia chiamato lo script “.dwlbnm” ed il file “.elenco” per l’elenco (appunto), la directory “/var/www/nivometeo” e` dove si trovano i file e dove vengono scaricati e memorizzati i bollettini.

mercoledì 9 marzo 2011

Script Bollettini Nivo-Meteo

Script per scaricare e creare un'archivio storico di bollettini nivo-meteo.
Non sto` a descriverlo perche` mi sembra molto semplice.
#!/bin/bash

wget "http://www.sian.it/infoMeteo/stampaBollettinoStampa.do?settore=C&pubblicato=true&outputFormat=2&generatorClass=it.sian.mwablx.web.print.DatiStampaBollettinoDG&chiamata=infoMeteo" --output-document="EmiliaRomagna-Valanghe-$(date +%Y%m%d)-new.pdf"
i=0
while [ -e EmiliaRomagna-Valanghe-$(date +%Y%m%d)-new.pdf ]
 do
  if [ -e EmiliaRomagna-Valanghe-$(date +%Y%m%d -d "-$i day").pdf ]
   then
    diff EmiliaRomagna-Valanghe-$(date +%Y%m%d -d "-$i day").pdf EmiliaRomagna-Valanghe-$(date +%Y%m%d)-new.pdf > /dev/null
    if [ $? != "0" ]
     then
      mv EmiliaRomagna-Valanghe-$(date +%Y%m%d)-new.pdf EmiliaRomagna-Valanghe-$(date +%Y%m%d).pdf
      echo "mv EmiliaRomagna-Valanghe-$(date +%Y%m%d)-new.pdf EmiliaRomagna-Valanghe-$(date +%Y%m%d).pdf"
     else
      rm EmiliaRomagna-Valanghe-$(date +%Y%m%d)-new.pdf
      echo "REMOVED: EmiliaRomagna-Valanghe-$(date +%Y%m%d)-new.pdf"
    fi
   else
    $(( i++ )) 2> /dev/null
    echo $i
  fi
done

wget "http://www.sian.it/infoMeteo/stampaBollettinoStampa.do?settore=B&pubblicato=true&outputFormat=2&generatorClass=it.sian.mwablx.web.print.DatiStampaBollettinoDG&chiamata=infoMeteo" --output-document="Toscana-Valanghe-$(date +%Y%m%d)-new.pdf"
i=0
while [ -e Toscana-Valanghe-$(date +%Y%m%d)-new.pdf ]
 do
  if [ -e Toscana-Valanghe-$(date +%Y%m%d -d "-$i day").pdf ]
   then
    diff Toscana-Valanghe-$(date +%Y%m%d -d "-$i day").pdf Toscana-Valanghe-$(date +%Y%m%d)-new.pdf > /dev/null
    if [ $? != "0" ]
     then
      mv Toscana-Valanghe-$(date +%Y%m%d)-new.pdf Toscana-Valanghe-$(date +%Y%m%d).pdf
      echo "mv Toscana-Valanghe-$(date +%Y%m%d)-new.pdf Toscana-Valanghe-$(date +%Y%m%d).pdf"
     else
      rm Toscana-Valanghe-$(date +%Y%m%d)-new.pdf
      echo "REMOVED: Toscana-Valanghe-$(date +%Y%m%d)-new.pdf"
    fi
   else
    $(( i++ )) 2> /dev/null
    echo $i
  fi
done

wget http://www.meteotrentino.it/bollettini/today/valanghe_it.pdf --output-document="Trentino-Valanghe-$(date +%Y%m%d)-new.pdf"
i=0
while [ -e Trentino-Valanghe-$(date +%Y%m%d)-new.pdf ]
 do
  if [ -e Trentino-Valanghe-$(date +%Y%m%d -d "-$i day").pdf ]
   then
    diff Trentino-Valanghe-$(date +%Y%m%d -d "-$i day").pdf Trentino-Valanghe-$(date +%Y%m%d)-new.pdf > /dev/null
    if [ $? != "0" ]
     then
      mv Trentino-Valanghe-$(date +%Y%m%d)-new.pdf Trentino-Valanghe-$(date +%Y%m%d).pdf
      echo "mv Trentino-Valanghe-$(date +%Y%m%d)-new.pdf Trentino-Valanghe-$(date +%Y%m%d).pdf"
     else
      rm Trentino-Valanghe-$(date +%Y%m%d)-new.pdf
      echo "REMOVED: Trentino-Valanghe-$(date +%Y%m%d)-new.pdf"
    fi
   else
    $(( i++ )) 2> /dev/null
    echo $i
  fi
done

wget http://www.meteotrentino.it/bollettini/today/generale_it.pdf --output-document="Trentino-Meteo-$(date +%Y%m%d)-new.pdf"
i=0
while [ -e Trentino-Meteo-$(date +%Y%m%d)-new.pdf ]
 do
  if [ -e Trentino-Meteo-$(date +%Y%m%d -d "-$i day").pdf ]
   then
    diff Trentino-Meteo-$(date +%Y%m%d -d "-$i day").pdf Trentino-Meteo-$(date +%Y%m%d)-new.pdf > /dev/null
    if [ $? != "0" ]
     then
      mv Trentino-Meteo-$(date +%Y%m%d)-new.pdf Trentino-Meteo-$(date +%Y%m%d).pdf
      echo "mv Trentino-Meteo-$(date +%Y%m%d)-new.pdf Trentino-Meteo-$(date +%Y%m%d).pdf"
     else
      rm Trentino-Meteo-$(date +%Y%m%d)-new.pdf
      echo "REMOVED: Trentino-Meteo-$(date +%Y%m%d)-new.pdf"
    fi
   else
    $(( i++ )) 2> /dev/null
    echo $i
  fi
done

wget http://www.arpa.veneto.it/upload_arabba/bollettini_meteo/dolomitimeteo/dolomitimeteo.pdf --output-document="Veneto-Dolomiti-Meteo-$(date +%Y%m%d)-new.pdf"
i=0
while [ -e Veneto-Dolomiti-Meteo-$(date +%Y%m%d)-new.pdf ]
 do
  if [ -e Veneto-Dolomiti-Meteo-$(date +%Y%m%d -d "-$i day").pdf ]
   then
    diff Veneto-Dolomiti-Meteo-$(date +%Y%m%d -d "-$i day").pdf Veneto-Dolomiti-Meteo-$(date +%Y%m%d)-new.pdf > /dev/null
    if [ $? != "0" ]
     then
      mv Veneto-Dolomiti-Meteo-$(date +%Y%m%d)-new.pdf Veneto-Dolomiti-Meteo-$(date +%Y%m%d).pdf
      echo "mv Veneto-Dolomiti-Meteo-$(date +%Y%m%d)-new.pdf Veneto-Dolomiti-Meteo-$(date +%Y%m%d).pdf"
     else
      rm Veneto-Dolomiti-Meteo-$(date +%Y%m%d)-new.pdf
      echo "REMOVED: Veneto-Dolomiti-Meteo-$(date +%Y%m%d)-new.pdf"
    fi
   else
    $(( i++ )) 2> /dev/null
    echo $i
  fi
done

wget http://www.arpa.veneto.it/upload_arabba/bollettini_meteo/dolomitineve/dolomitineve.pdf --output-document="Veneto-Dolomiti-Valanghe-$(date +%Y%m%d)-new.pdf"
i=0
while [ -e Veneto-Dolomiti-Valanghe-$(date +%Y%m%d)-new.pdf ]
 do
  if [ -e Veneto-Dolomiti-Valanghe-$(date +%Y%m%d -d "-$i day").pdf ]
   then
    diff Veneto-Dolomiti-Valanghe-$(date +%Y%m%d -d "-$i day").pdf Veneto-Dolomiti-Valanghe-$(date +%Y%m%d)-new.pdf > /dev/null
    if [ $? != "0" ]
     then
      mv Veneto-Dolomiti-Valanghe-$(date +%Y%m%d)-new.pdf Veneto-Dolomiti-Valanghe-$(date +%Y%m%d).pdf
      echo "mv Veneto-Dolomiti-Valanghe-$(date +%Y%m%d)-new.pdf Veneto-Dolomiti-Valanghe-$(date +%Y%m%d).pdf"
     else
      rm Veneto-Dolomiti-Valanghe-$(date +%Y%m%d)-new.pdf
      echo "REMOVED: Veneto-Dolomiti-Valanghe-$(date +%Y%m%d)-new.pdf"
    fi
   else
    $(( i++ )) 2> /dev/null
    echo $i
  fi
done

wget -U mozilla http://www.meteoam.it/?q=printpdf/node/10897 --output-document="AM-Rischio-Valanghe-$(date +%Y%m%d)-new.pdf"
i=0
while [ -e AM-Rischio-Valanghe-$(date +%Y%m%d)-new.pdf ]
 do
  if [ -e AM-Rischio-Valanghe-$(date +%Y%m%d -d "-$i day").pdf ]
   then
    diff AM-Rischio-Valanghe-$(date +%Y%m%d -d "-$i day").pdf AM-Rischio-Valanghe-$(date +%Y%m%d)-new.pdf > /dev/null
    if [ $? != "0" ]
     then
      mv AM-Rischio-Valanghe-$(date +%Y%m%d)-new.pdf AM-Rischio-Valanghe-$(date +%Y%m%d).pdf
      echo "mv AM-Rischio-Valanghe-$(date +%Y%m%d)-new.pdf AM-Rischio-Valanghe-$(date +%Y%m%d).pdf"
     else
      rm AM-Rischio-Valanghe-$(date +%Y%m%d)-new.pdf
      echo "REMOVED: AM-Rischio-Valanghe-$(date +%Y%m%d)-new.pdf"
    fi
   else
    $(( i++ )) 2> /dev/null
    echo $i
  fi
done

wget -U mozilla http://www.meteoam.it/?q=node/10897 --output-document="AM-Rischio-Valanghe-$(date +%Y%m%d)-new.html"
i=0
while [ -e AM-Rischio-Valanghe-$(date +%Y%m%d)-new.html ]
 do
  if [ -e AM-Rischio-Valanghe-$(date +%Y%m%d -d "-$i day").html ]
   then
    diff AM-Rischio-Valanghe-$(date +%Y%m%d -d "-$i day").html AM-Rischio-Valanghe-$(date +%Y%m%d)-new.html > /dev/null
    if [ $? != "0" ]
     then
      mv AM-Rischio-Valanghe-$(date +%Y%m%d)-new.html AM-Rischio-Valanghe-$(date +%Y%m%d).html
      echo "mv AM-Rischio-Valanghe-$(date +%Y%m%d)-new.html AM-Rischio-Valanghe-$(date +%Y%m%d).html"
     else
      rm AM-Rischio-Valanghe-$(date +%Y%m%d)-new.html
      echo "REMOVED: AM-Rischio-Valanghe-$(date +%Y%m%d)-new.html"
    fi
   else
    $(( i++ )) 2> /dev/null
    echo $i
  fi
done

Riferimenti:
http://blog.snowboardactivity.dreamhosters.com/2011/03/13/bollettini-nivometeo/

Test Raid

Anzitutto, stiamo parlando di questa scheda qui:
$ lspci | grep RAID
00:1f.2 RAID bus controller: Intel Corporation 82801GR/GH (ICH7 Family) SATA RAID Controller (rev 01)

Ho avuto la bellissima idea di testare il raid (funzionante) dopo un'aggiornamento a "squeeze".
Spengo, distacco il cavo SATA da uno dei due HDD in mirror, accendo, tutto bene, spengo di nuovo e ripeto per l'altro dico, ancora tutto bene, nel mentre, le schermate di avvio della motherboard mostrano a video indicazioni "degraded" del raid.
Rimetto tutto a posto, riavvio, la motherboard mi dice che i dischi sono da "risincronizzare" (non ricordo il termine esatto), mi scrive che e` un'operazione che non puo` fare, devo farla da sistema operativo.
Una volta avviato il sistema, mi accorgo in effetti della presenza di un "nosync" nel raid dei due dischi.
E qui parte la mia cavolata (forse), vedo che per il "rebuild" del raid il comando e` "dmraid -R noemdelraid", lancio e va in "errore", analizzo velocemente la situazione, il raid ha perso completamente un disco, non convinto di tutto cio`, ho avuto la bellissima idea di riavviare il sistema.
Al riavvio del sistema, i messaggi della motherboard mi dicono che non c'e` un raid, che uno dei due dischi (il secondo ?) e` "unknown" e che l'altro e` "undefined".
Penso, decido e faccio un riavvio del computer tramite una 'knoppix' live, questa mi vede due dischi, ma ci dormo su e al mattino ho un dubbio, uno dovrebbe essere uno dei due del raid, ma l'altro e` il terzo disco, perche` questo pc ha 3 dischi, non due.
Comunque, poi verifichero` questi dischi "visti" dal sistema, ma adesso le vie del ripristino mi sembrano due e devo sceglierne una, tentare un ripristino da utility di motherboard, o tentare un ripristino software, di certo, la prima cosa da fare e` procurarmi un disco da almeno 400GB per salvare i dati di quel disco visto da knoppix (ho il backup, ma uno in piu` non fa` mai male).
Scrivendo e pensando al fatto che da 'knoppix' mi riconosce un raid degradato, penso che optero` per cercare di ripristinare la situazione da sistema operativo, guardando bene (poi ricontrollero`), i comandi dovrebbero essere:
"dmraid -R nomeraid /dev/disco"
il resto, spero, dovrebbe venire da se, cioe`, una volta ripristinata la cosa, la motherboard dovrebbe riconoscere il raid .. o no ?
Ho verificato, i dischi visti dalla "live" sono i due del raid, il terzo e` in LVM, quindi, posso pensare che abbiano perso la 'firma' di dischi in raid.
Ricapitoliamo:
  • /dev/sda1 e /dev/sda2 sembrano funzionare
  • il sistema (motherboard) non li riconosce (unknown e undefined)
  • dmraid vede solo uno dei due
  • il sistema (colpa della motherboard ?) non si avvia

Non so se ricordo/mi sono scritto proprio tutto, ma provo ad elencare i passi eseguiti per il ripristino del raid.
Tutte (o quasi) le operazioni/comandi sono state eseguite con la "Knoppix Live".

# dmraid -s
ERROR: isw: Could not find disk /dev/sdb in the metadata
ERROR: isw: wrong number of devices in RAID set "isw_iehdefhej_raid" [1/2] on /dev/sda
*** Group superset isw_iehdefhej
--> *Inconsistent* Subset
name   : isw_iehdefhej_raid
size   : 781416448
stride : 128
type   : mirror
status : inconsistent
subsets: 0
devs   : 1
spares : 0

# dmraid -r
ERROR: isw: Could not find disk /dev/sdb in the metadata
/dev/sda: isw, "isw_iehdefhej", GROUP, ok, 781422766 sectors, data@ 0

Forse dimentico qualcosa, ho lanciato il comando per la distruzione del raid:
# dmraid -x
ERROR: isw: Could not find disk /dev/sdb in the metadata
ERROR: isw: wrong number of devices in RAID set "isw_iehdefhej_raid" [1/2] on /dev/sda

About to delete RAID set isw_iehdefhej_raid

WARNING: The metadata stored on the raidset(s) will not be accessible after deletion
Do you want to continue ? [y/n] :y

Poi l'ho ricreato col comando:
# dmraid -f isw -C isw_raid --type 1 --disk "/dev/sda /dev/sdb"

Riavviando il sistema, nella schermata della motherboard e` ricomparso il raid, la 'knoppix' dice che si chiama "isw_b....", monto il raid tramite distro live e modifico/correggo il file "/etc/fstab".
Non resta che riavviare ..