Creazione automatica di un file di log per inviare quesiti al forum: differenze tra le versioni

nessun oggetto della modifica
Nessun oggetto della modifica
Riga 27: Riga 27:
# Eseguire lo script con i permessi di [[root]]:<pre># ./nomefile</pre>il comando precedente deve essere eseguito nella stessa directory in cui risiede lo script.<br/>L'utilizzo dei permessi di root è motivato dal fatto che alcuni comandi devono essere eseguiti necessariamente come utente privilegiato.
# Eseguire lo script con i permessi di [[root]]:<pre># ./nomefile</pre>il comando precedente deve essere eseguito nella stessa directory in cui risiede lo script.<br/>L'utilizzo dei permessi di root è motivato dal fatto che alcuni comandi devono essere eseguiti necessariamente come utente privilegiato.
# Leggere le informazioni a video.
# Leggere le informazioni a video.
== Parametri dello script ==
Lo script accetta, in maniera facoltativa, alcuni parametri:
;--tipo={rete|video|audio|apt|mount|touchpad|generico}:specifica il tipo di problema<br/>Es: --tipo=apt
;--nocompress:non crea il file compresso del file di log
;--nopaste:non invia il file di log a paste.debian.net
;--help:visualizza informazioni sull'utilizzo dei parametri


== Script ==
== Script ==
Riga 62: Riga 69:


# Versione script
# Versione script
readonly VERSIONE="1.0.41"
readonly VERSIONE="1.0.42"


# Codename per stable e testing. Da modificare nei successivi rilasci di Debian
# Codename per stable e testing. Da modificare nei successivi rilasci di Debian
Riga 121: Riga 128:
readonly ROSSO="\033[01;31m" # colore rosso e grassetto
readonly ROSSO="\033[01;31m" # colore rosso e grassetto
readonly VERDE="\033[01;32m" # colore verde e grassetto
readonly VERDE="\033[01;32m" # colore verde e grassetto
readonly BOLD="\033[01m"       # grassetto
readonly BOLD="\033[01m"         # grassetto
readonly FINE="\033[0m"         # reset
readonly FINE="\033[0m"         # reset
 
# --------------------------------------------------------------------------
# Sezione relativa ai parametri dello script
# --------------------------------------------------------------------------
 
# Funzione che segnala un errato utilizzo dei parametri e termina lo script
function _parm_err {
  echo "Parametri non validi" && _parm_uso && exit
}
 
# Messaggio di errore se viene specificato più di un tipo di problema attraverso
# i parametri.
function _parm_tipo_err {
  echo "È possibile specificare un solo di tipo di problema" && _parm_uso && exit
}
 
# Messaggio visualizzato nel caso in cui venga specificato lo stesso parametro
function _parm_rip_err {
  echo "È stato immesso lo stesso parametro" && _parm_uso && exit
}
 
# Messaggio visualizzato nel caso in cui --help non sia l'unico parametro specificato
function _parm_uso_err {
  echo "Il parametro --help non deve essere accompagnato da altri parametri" && _parm_uso && exit
}
 
# Funzione che stampa informazioni sull'utilizzo dei parametri
function _parm_uso {
  printf %b "
Utilizzo dei parametri:
 
$BOLD--tipo={rete|video|audio|apt|mount|touchpad|generico}$FINE
  utilizzato per specificare un solo tipo di problema.
  Es: --tipo=apt
 
$BOLD--nocompress$FINE
  non viene creato un file compresso del log
 
$BOLD--nopaste$FINE
  non viene inviato il log a paste.debian.net
 
$BOLD--help$FINE
  visualizza queste informazioni
 
}
 
# Inizializzazione di variabili. La variabile TIPO serve ad evitare ripetizioni
# nel passaggio del parametro tipo=blabla
NOCOMPRESS=0 NOPASTE=0 TIPO=0 TIPO_RETE=0 TIPO_APT=0 TIPO_VIDEO=0
TIPO_AUDIO=0 TIPO_MNT=0 TIPO_TOUCH=0 TIPO_COMM=0
 
while [ $# -gt 0 ] ; do
  case "$1" in
    "--nocompress") [ "$NOCOMPRESS" -eq 1 ] && _parm_rip_err || NOCOMPRESS=1 ;;
    "--nopaste") [ "$NOPASTE" -eq 1 ] && _parm_rip_err || NOPASTE=1 ;;
    "--tipo=rete") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_RETE=1  ;;
    "--tipo=apt") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_APT=1  ;;
    "--tipo=video") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_VIDEO=1 ;;
    "--tipo=audio") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_AUDIO=1 ;;
    "--tipo=mount") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_MNT=1  ;;
    "--tipo=touchpad") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_TOUCH=1 ;;
    "--tipo=generico") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_COMM=1  ;;
    "--help") [ $BASH_ARGC -gt 1 ] && _parm_uso_err || _parm_uso && exit    ;;
    *) _parm_err
  esac
  shift
done


# --------------------------------------------------------------------------
# --------------------------------------------------------------------------
Riga 135: Riga 210:
*                                                                              *
*                                                                              *
*  Script che crea un log utile alla risoluzione dei problemi più comuni        *
*  Script che crea un log utile alla risoluzione dei problemi più comuni        *
*  Versione "$VERSIONE"                                                         *
*  Versione "$VERSIONE"                                                             *
*                                                                              *
*                                                                              *
*********************************************************************************"
*********************************************************************************"
Riga 181: Riga 256:


# Funzione per separare il log in parti per l'invio a paste.debian.net
# Funzione per separare il log in parti per l'invio a paste.debian.net
function _split_and_send {
function _split_and_send {
   local paste_url='http://paste.debian.net'
   local paste_url='http://paste.debian.net'
   local chunk_prefix='pastebin'
   local chunk_prefix='pastebin'
Riga 263: Riga 338:
# Funzione che invia il log a paste.debian.net
# Funzione che invia il log a paste.debian.net
function _upload {
function _upload {
  # Nessun invio a paste.debian.net se viene scelto "--nopaste"
  [ "$NOPASTE" -eq 1 ] && return
 
   local risp
   local risp
   # Pastebinit è installato?
   # Pastebinit è installato?
Riga 291: Riga 369:


# Funzione richiamata in caso di corretta/scorretta creazione del file compresso
# Funzione richiamata in caso di corretta/scorretta creazione del file compresso
function _compress_ok {
function _compress_ok { echo "File compresso creato correttamente nella directory corrente."; }
  echo "File compresso creato correttamente nella directory corrente."
}


function _compress_err {
function _compress_err { echo "Errore nella creazione del file compresso."; }
  echo "Errore nella creazione del file compresso."
}


# Funzione che crea il file compresso
# Funzione che crea il file compresso
# Prova a creare nell'ordine: un file .bz2, un file .zip o un file .tgz
# Prova a creare nell'ordine: un file .bz2, un file .zip o un file .tgz
function _compress {
function _compress {
  # La funzione termina se è stato utilizzato il parametro "--nocompress"
  [ "$NOCOMPRESS" -eq 1 ] && return
   local risp
   local risp
   echo -n $'\nCreare un file compresso [S/n]? '
   echo -n $'\nCreare un file compresso [S/n]? '
Riga 329: Riga 406:


function _scelta {
function _scelta {
  # Problemi selezionati in base al parametro passato allo script
  [ "$TIPO_RETE" -eq 1 ] && _wait && echo $'### Problemi di rete ###\n' > "$log" && _rete && return
  [ "$TIPO_VIDEO" -eq 1 ] && _wait && echo $'### Problemi video ###\n' > "$log" && _video && return
  [ "$TIPO_AUDIO" -eq 1 ] && _wait && echo $'### Problemi audio ###\n' > "$log" && _audio && return
  [ "$TIPO_APT" -eq 1 ] && _wait && echo $'### Problemi APT ###\n' > "$log" && _apt && return
  [ "$TIPO_MNT" -eq 1 ] && _wait && echo $'### Problemi mount-unmount ###\n' > "$log" && _mount && return
  [ "$TIPO_TOUCH" -eq 1 ] && _wait && echo $'### Problemi touchpad ###\n' > "$log" && _tpad && return
  [ "$TIPO_COMM" -eq 1 ] && _wait && echo $'### Solo informazioni generiche ###\n' > "$log" && _common && return
 
  # La funzione presenta un menù di scelta nel caso non sia stato passato nessun parametro
   local num
   local num
   
   
Riga 357: Riga 445:
             7) echo $'### Solo informazioni generiche ###\n' > "$log" && _common ;;&
             7) echo $'### Solo informazioni generiche ###\n' > "$log" && _common ;;&
         [1-7]) break  ;; # Termina il ciclo 'while'
         [1-7]) break  ;; # Termina il ciclo 'while'
      0) _exit  ;; # È stato inserito '0' . Uscita dallo script
            0) _exit  ;; # È stato inserito '0' . Uscita dallo script
      *) # Tutti gli altri caratteri. Cancella l'input immesso e ripete la domanda
            *) # Tutti gli altri caratteri. Cancella l'input immesso e ripete la domanda
tput cuu1 # in alto di una riga
tput cuu1 # in alto di una riga
tput ed # cancella fino alla fine dello schermo
tput ed # cancella fino alla fine dello schermo
Riga 375: Riga 463:


# Funzione che stampa un pallino di colore verde in caso di comando con output
# Funzione che stampa un pallino di colore verde in caso di comando con output
# Visualizza a video l'eventuale stringa passata come primo parametro ($1).
function _ok {
function _ok {
   echo
   echo
   tput cuu1  # in alto di una riga
   tput cuu1  # in alto di una riga
   tput cuf1 # a destra di uno spazio
   tput cuf1 # a destra di uno spazio
   printf %b "${VERDE}•${FINE}\n" # stampa pallino
   # se non ci sono parametri, viene stampato solo il pallino
  if [ $# -eq 0 ]; then
    printf %b "${VERDE}•${FINE}\n" # stampa pallino e va a capo
  # se c'è un parametro, viene stampato il pallino e il parametro
  elif [ $# -eq 1 ]; then
    printf %b "${VERDE}•${FINE}"
    tput cuf 3 # a destra di tre spazi
    tput el    # cancella fino a fine riga
    printf %b "$1\n" # stampa il parametro e va a capo
  fi
}
}


Riga 387: Riga 485:
   tput cuu1  # in alto di una riga
   tput cuu1  # in alto di una riga
   tput cuf1 # a destra di uno spazio
   tput cuf1 # a destra di uno spazio
   printf %b "${ROSSO}•${FINE}\n" # stampa pallino
   # se non ci sono parametri, viene stampato solo il pallino
  if [ $# -eq 0 ]; then
    printf %b "${ROSSO}•${FINE}\n" # stampa pallino e va a capo
  # se c'è un parametro, viene stampato il pallino e il parametro
  elif [ $# -eq 1 ]; then
    printf %b "${ROSSO}•${FINE}"
    tput cuf 3 # a destra di tre spazi
    tput el    # cancella fino a fine riga
    printf %b "$1\n" # stampa il parametro e va a capo
  fi
}
}


Riga 580: Riga 687:
      # Esegue lo script ALSA
      # Esegue lo script ALSA
               _prompt "Esecuzione script ALSA"
               _prompt "Esecuzione script ALSA"
      su  -c "$tempfile --stdout >> $log" "$utente" && _ok "Script ALSA eseguito" || _error "Script ALSA non eseguito"
      su  -c "$tempfile --stdout >> $log" "$utente" && _ok || _error
  else
  else
      _error "Download script ALSA fallito"
      _error "Download script ALSA fallito"
Riga 647: Riga 754:
    /etc/network/interfaces)
    /etc/network/interfaces)
                       # Nasconde nel log gli ESSID e le password criptate contenute in /etc/network/interfaces
                       # Nasconde nel log gli ESSID e le password criptate contenute in /etc/network/interfaces
      sed -r "s/((wpa-ssid)|(wpa-psk)).*/\1 \*script-removed\*/" "$1" &>> "$log" && _ok "$1" || _error "$1" ;;
      sed -r "s/((wpa-ssid)|(wpa-psk)).*/\1 \*script-removed\*/" "$1" &>> "$log" && _ok || _error ;;
    /var/log/syslog)
    /var/log/syslog)
      # se il file contiene la stringa "rsyslogd.*start" ...
      # se il file contiene la stringa "rsyslogd.*start" ...
      if [ "$(grep -sci 'rsyslogd.*start$' "$1")" -ne 0 ]; then
      if [ "$(grep -sci 'rsyslogd.*start$' "$1")" -ne 0 ]; then
# ... estrae da syslog tutto il contenuto dall'ultima occorrenza della stringa alla fine del file
# ... estrae da syslog tutto il contenuto dall'ultima occorrenza della stringa alla fine del file
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1" >> "$log" && _ok "$1" || _error "$1"
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1" >> "$log" && _ok || _error
      else
      else
# se syslog non contiene quella stringa, allora si effettuerà la stessa operazione su syslog.1 ($1.1)
# se syslog non contiene quella stringa, allora si effettuerà la stessa operazione su syslog.1 ($1.1)
# in questo caso l'intero contenuto del file syslog viene inviato al log
# in questo caso l'intero contenuto del file syslog viene inviato al log
cat "$1" &>> "$log" && _ok "$1" || _error "$1"
cat "$1" &>> "$log" && _ok || _error
nome_e_riga "$1".1
nome_e_riga "$1".1
                         _prompt "$1".1
                         _prompt "$1".1
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1".1 >> "$log" && _ok "$1".1 || _error "$1".1
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1".1 >> "$log" && _ok || _error
      fi ;;
      fi ;;
    *)
    *)
      # per tutti i file non specificati sopra...
      # per tutti i file non specificati sopra...
      cat "$1" &>> "$log" && _ok "$1" || _error "$1"
      cat "$1" &>> "$log" && _ok || _error
esac
esac
     else
     else
       echo "File \"$1\" non trovato" >> "$log" && _error "$1"
       echo "File \"$1\" non trovato" >> "$log" && _error
     fi
     fi
}
}
Riga 694: Riga 801:
      "/usr/bin/synclient -l")
      "/usr/bin/synclient -l")
      # se $DISPLAY è vuota, usa :0 (default per il primo server X)
      # se $DISPLAY è vuota, usa :0 (default per il primo server X)
      su -c "DISPLAY=${DISPLAY:-:0} $1" "$utente" &>> "$log" _ok "$var" || _error "$var" ;;
      su -c "DISPLAY=${DISPLAY:-:0} $1" "$utente" &>> "$log" _ok || _error ;;
      *)     
      *)     
      su -c "$1" "$utente" &>> "$log" && _ok "$var" || _error "$var"
      su -c "$1" "$utente" &>> "$log" && _ok || _error
  esac
  esac
       else # non viene utilizzato "su"
       else # non viene utilizzato "su"
Riga 702: Riga 809:
      # per "iwconfig" e "iwlist scan" gli ESSID non vengono inviati al log
      # per "iwconfig" e "iwlist scan" gli ESSID non vengono inviati al log
      /sbin/iwconfig)
      /sbin/iwconfig)
  (iwconfig | sed -e '/ESSID:/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok "$var" || _error "$var"
  (iwconfig | sed -e '/ESSID:/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error
  ;;
  ;;
      /sbin/iwlist)
      /sbin/iwlist)
  (iwlist scan | sed -e '/ESSID:.*/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok "$var" || _error "$var"
  (iwlist scan | sed -e '/ESSID:.*/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error
  ;;
  ;;
      *)
      *)
  # per tutti gli altri comandi non specificati sopra l'output del comando è inviato inalterato al log
  # per tutti gli altri comandi non specificati sopra l'output del comando è inviato inalterato al log
  $1 &>> "$log" && _ok "$var" || _error "$var"
  $1 &>> "$log" && _ok || _error
  esac    
  esac    
       fi
       fi
   else
   else
       echo "Comando \"${var2}\" non trovato" >> "$log" && _error "$var"
       echo "Comando \"${var2}\" non trovato" >> "$log" && _error
   fi
   fi
}
}
Riga 724: Riga 831:
   # Se la directory non esiste, stampa un output sul log ed esce.
   # Se la directory non esiste, stampa un output sul log ed esce.
   if [ ! -d "$1" ]; then
   if [ ! -d "$1" ]; then
     echo "La directory non esiste" >> "$log" && _error "$1"
     echo "La directory non esiste" >> "$log" && _error
     return
     return
   fi
   fi
Riga 736: Riga 843:


   if [ "$numfile" -eq 0 ] && [ "$numdir" -eq 1 ]; then
   if [ "$numfile" -eq 0 ] && [ "$numdir" -eq 1 ]; then
     echo "La directory non contiene file o directory" >> "$log" && _error "$1"
     echo "La directory non contiene file o directory" >> "$log" && _error
   else
   else
     echo "La directory contiene ${numfile} file e $(($numdir - 1)) directory" >> "$log"
     echo "La directory contiene ${numfile} file e $(($numdir - 1)) directory" >> "$log"
Riga 745: Riga 852:
         nome_e_riga "$file"
         nome_e_riga "$file"
         _prompt "$file"
         _prompt "$file"
         cat "$file" &>> "$log" && _ok "$file" || _error "$file"
         cat "$file" &>> "$log" && _ok || _error
       fi
       fi
     done
     done
Riga 771: Riga 878:


   if [ -z "$packages" ]; then
   if [ -z "$packages" ]; then
     echo "Nessun pacchetto installato" >> "$log" && _error "$1"
     echo "Nessun pacchetto installato" >> "$log" && _error
   else
   else
     echo "$packages" >> "$log" && _ok "$1"
     echo "$packages" >> "$log" && _ok
   fi
   fi
}
}
Riga 803: Riga 910:
     esac
     esac
    
    
     echo "$2 è installato (versione "$vers")" >> "$log" && _ok "$2"
     echo "$2 è installato (versione "$vers")" >> "$log" && _ok
     invoke-rc.d "$var" status &>/dev/null
     invoke-rc.d "$var" status &>/dev/null
     [ $? -eq 0 ] && echo "$2 è in esecuzione" >> "$log" || echo "$2 non è in esecuzione" >> "$log"
     [ $? -eq 0 ] && echo "$2 è in esecuzione" >> "$log" || echo "$2 non è in esecuzione" >> "$log"
   else
   else
     echo "$2 non è installato" >> "$log" && _error "$2"
     echo "$2 non è installato" >> "$log" && _error
   fi
   fi
}
}
Riga 824: Riga 931:
     echo "Prodotto:  $(cat /sys/class/dmi/id/product_name)"    &>> "$log"
     echo "Prodotto:  $(cat /sys/class/dmi/id/product_name)"    &>> "$log"
     echo "Versione:  $(cat /sys/class/dmi/id/product_version)" &>> "$log"
     echo "Versione:  $(cat /sys/class/dmi/id/product_version)" &>> "$log"
     echo "BIOS vers.: $(cat /sys/class/dmi/id/bios_version)"    &>> "$log" && _ok "$var" || _error "$var"
     echo "BIOS vers.: $(cat /sys/class/dmi/id/bios_version)"    &>> "$log" && _ok || _error
   else
   else
     echo "File /sys/class/dmi/id/sys_vendor non trovato" >> "$log" && _error "$var"
     echo "File /sys/class/dmi/id/sys_vendor non trovato" >> "$log" && _error
   fi
   fi
}
}
Riga 835: Riga 942:
   _prompt "$var"
   _prompt "$var"
   nome_e_riga "$var"
   nome_e_riga "$var"
   dpkg -l | grep -i firmware >> "$log" && _ok "$var"
   dpkg -l | grep -i firmware >> "$log" && _ok
   echo >> "$log"
   echo >> "$log"


Riga 905: Riga 1 012:
   # in esecuzione
   # in esecuzione
   echo -n "In esecuzione: " >> "$log"
   echo -n "In esecuzione: " >> "$log"
   if _is_running "ksmserver"; then kde4-config --version >> "$log" && _ok "DE/WM" || _error "DE/WM"                         # KDE4
   if _is_running "ksmserver"; then kde4-config --version >> "$log" && _ok || _error                        # KDE4
   elif _is_running "gnome-shell"; then gnome-shell --version >> "$log" && _ok "DE/WM" || _error "DE/WM"                     # Gnome Shell
   elif _is_running "gnome-shell"; then gnome-shell --version >> "$log" && _ok || _error                    # Gnome Shell
   elif _is_running "xfdesktop"; then xfce4-about -V | head -n1 | cut -d ' ' -f2- >> "$log" && _ok "DE/WM" || _error "DE/WM" # Xfce4
   elif _is_running "xfdesktop"; then xfce4-about -V | head -n1 | cut -d ' ' -f2- >> "$log" && _ok || _error # Xfce4
   elif _is_running "openbox"; then
   elif _is_running "openbox"; then
     if [ "$(_x_session_manager)" != "/usr/bin/openbox-session" ]; then
     if [ "$(_x_session_manager)" != "/usr/bin/openbox-session" ]; then
       echo -n "(altro x-session-manager) + " >> "$log"                                                                      # Session manager (LXDE?) + Openbox
       echo -n "(altro x-session-manager) + " >> "$log"                                                                      # Session manager (LXDE?) + Openbox
     fi
     fi
     openbox --version | head -n 1 >> "$log" && _ok "DE/WM" || _error "DE/WM"                                               # Openbox
     openbox --version | head -n 1 >> "$log" && _ok || _error                                                # Openbox
   else
   else
     echo "Sconosciuto" >> "$log" && _error "DE/WM"                                                                         # NON TROVATO
     echo "Sconosciuto" >> "$log" && _error                                                                          # NON TROVATO
   fi
   fi
}
}
Riga 936: Riga 1 043:
   if [ "$num" -ne 1 ]; then
   if [ "$num" -ne 1 ]; then
     nome_e_riga "$var"
     nome_e_riga "$var"
     echo "Sono presenti ${num} release in sources.list" >> "$log" && _error "$var"
     echo "Sono presenti ${num} release in sources.list" >> "$log" && _error
     return
     return
   fi
   fi
Riga 958: Riga 1 065:
   nome_e_riga "${var} all'archivio \"${release}\""
   nome_e_riga "${var} all'archivio \"${release}\""
   if [ -z "$pkg" ]; then
   if [ -z "$pkg" ]; then
     echo "Nessun pacchetto esterno installato" >> "$log" && _error "$var"
     echo "Nessun pacchetto esterno installato" >> "$log" && _error
   else
   else
     echo "$pkg" >> "$log" && _ok "$var"
     echo "$pkg" >> "$log" && _ok
   fi
   fi
}
}
Riga 983: Riga 1 090:
== Changelog ==
== Changelog ==
<!-- Qui vanno inserite le spiegazioni di eventuali modifiche dello script (chi, cosa, quando). Ricordarsi di modificare la versione (variabile VERSIONE) all'interno del codice (la versione iniziale è 1.0.0) -->
<!-- Qui vanno inserite le spiegazioni di eventuali modifiche dello script (chi, cosa, quando). Ricordarsi di modificare la versione (variabile VERSIONE) all'interno del codice (la versione iniziale è 1.0.0) -->
;1.0.42
:''Introduzione parametri dello script''
:''Modificate _ok e _error per accettare un parametro''
:[[Utente:S3v|S3v]] 12:27, 20 ago 2014 (CEST)
;1.0.41
;1.0.41
:''Corretta _extpack per righe in sources.list che iniziano con "ftp"''
:''Corretta _extpack per righe in sources.list che iniziano con "ftp"''
6 999

contributi