Creazione automatica di un file di log per inviare quesiti al forum: differenze tra le versioni
S3v (discussione | contributi) (paragrafo sulla privacy) |
m (condizione ifeq) |
||
Riga 4: | Riga 4: | ||
* modificare il codename nella riga "#ifeq" sottostante con quello della nuova stable, dopo aver aggiornato questa guida. | * modificare il codename nella riga "#ifeq" sottostante con quello della nuova stable, dopo aver aggiornato questa guida. | ||
* In caso contrario sarà mostrato un messaggio di avvertenza al posto del template "Versioni compatibili". | * In caso contrario sarà mostrato un messaggio di avvertenza al posto del template "Versioni compatibili". | ||
* Il codename *deve* essere scritto | * Il codename *deve* essere scritto tutto minuscolo (per esempio: jessie). | ||
--> | --> | ||
{{#ifeq: {{Codename| | {{#ifeq: {{Codename|stable}} | buster | | ||
{{Versioni compatibili}} | | {{Versioni compatibili}} | | ||
{{Cautionbox | [[Guide@Debianizzati.Org:Passaggio_alla_stable_-_pagine_da_aggiornare | Script non ancora aggiornato]] in seguito al rilascio di Debian {{Codename|Stable}}, pertanto le informazioni restituite riguardo la provenienza dei pacchetti installati nel sistema potrebbero non essere accurate. }} | {{Cautionbox | [[Guide@Debianizzati.Org:Passaggio_alla_stable_-_pagine_da_aggiornare | Script non ancora aggiornato]] in seguito al rilascio di Debian {{Codename|Stable}}, pertanto le informazioni restituite riguardo la provenienza dei pacchetti installati nel sistema potrebbero non essere accurate. }} |
Versione delle 19:00, 6 mar 2021
Avvertimento Script non ancora aggiornato in seguito al rilascio di Debian bookworm, pertanto le informazioni restituite riguardo la provenienza dei pacchetti installati nel sistema potrebbero non essere accurate. |
Introduzione
Questo script permette la creazione di un file contenente informazioni utili che possono aiutare a comprendere meglio il proprio problema oppure che è possibile portare a conoscenza del forum per tentare di risolverlo insieme.
Le informazioni riguardano i seguenti tipi di problema:
- Connessioni di rete
- Video
- Avvio del sistema (boot)
- Audio (tramite lo script ALSA prelevabile qui)
- Sottosistema di gestione dei pacchetti (APT)
- Mount/unmount di periferiche
- Touchpad
- Altro. Verranno inserite nel log solo informazioni generiche (già presenti nel log creato con tutte le tipologie di problema precedenti).
Lo script crea due file:
- log_data
- contiene le informazioni in formato testo
- log_data.{xz,bz2,gz}
- il file precedente ma in formato compresso. Può essere allegato ad una discussione sul forum
Se si vuole, attraverso lo script è anche possibile inviare il file direttamente a paste.debian.net per poterlo condividere pubblicamente, in questo caso il file non potrà superare la grandezza complessiva di 240K circa (diviso in parti della dimensione massima di 60K circa) e le informazioni saranno disponibili a chiunque per una settimana.
Prima di effettuare l'invio, lo script chiede un esplicito consenso all'utente.
Per usufruire del servizio offerto da paste.debian.net è necessaria l'installazione del pacchetto pastebinit
:
# apt-get install pastebinit
Nota Lo script è liberamente modificabile. Per ogni segnalazione, informazione o suggerimento fare riferimento a questa discussione sul forum. |
Privacy dell'utente
Questo script raccoglie informazioni che potenzialmente potrebbero violare la privacy dell'utente che mette a disposizione pubblicamente il file di log generato (attraverso paste.debian.net oppure come allegato ad una discussione sul forum).
Il diritto alla privacy dell'utente che esegue lo script è sempre stato la priorità nel corso degli anni e molte informazioni personali sono già nascoste nel file di log generato. È però possibile che non tutto venga correttamente rilevato per sopravvenute modifiche all'output dei comandi o log di sistema o a personalizzazioni dell'utente.
Si raccomanda caldamente, prima di rendere pubblico il log, di leggere attentamente le informazioni raccolte dallo script; in particolare i messaggi dei log di sistema, i contenuti dei servizi di systemd (soprattutto se sono stati creati nuovi servizi o se si è provveduto a personalizzarne di esistenti) e il file /etc/fstab.
Se si ravvisa la comparsa di informazioni sensibili, quali indirizzi IP pubblici, URL, nomi utente o di connessioni di rete, o comunque di qualunque dato ritenuto in violazione del proprio diritto alla privacy, non rendere pubblico il file di log raccolto e segnalare il problema nella discussione apposita o all'interno della pagina di discussione.
Utilizzo
- Eseguire un upgrade del sistema, se possibile, in modo che le informazioni raccolte dallo script siano aggiornate.
- Copiare manualmente il codice dello script in un file di testo all'interno di una directory a propria scelta. Il nome del file può essere scelto liberamente, ad esempio
scriptlog-debianizzati.org
. - Assegnare i permessi di esecuzione al file appena creato; ad esempio, da terminale o emulatore di terminale:
$ chmod a+x scriptlog-debianizzati.org
In alternativa, se si preferisce, è possibile eseguire il seguente comando:wget -qO- "http://guide.debianizzati.org/index.php?title=Aiuto:LogScript&action=edit"|awk '/=S=/{while(getline&&!index($0,"=F"))print}'|base64 -d|tar xz
con cui verrà creato il file "scriptlog-debianizzati.org" all'interno della directory da cui è stato eseguito il precedente comando. In questo caso vengono automaticamente impostati i permessi di esecuzione per lo script. - Eseguire da terminale (o emulatore di terminale) lo script con i permessi di root:
# ./scriptlog-debianizzati.org
il comando precedente deve essere eseguito nella stessa directory in cui risiede lo script.
L'utilizzo dei permessi di root è motivato dal fatto che alcuni comandi devono essere eseguiti necessariamente come utente privilegiato. - Leggere le informazioni a video.
Parametri dello script
Lo script accetta, in maniera facoltativa, alcuni parametri:
- --tipo={rete|video|boot|audio|apt|mount|touchpad|generico}
- specifica il tipo di problema
- --nocompress
- non crea il file compresso del file di log
- --nopaste
- non invia il file di log a paste.debian.net
- --update
- aggiorna lo script se esiste una versione recente
- --base64
- crea un file contenente la codifica base64 dello script
- --debug
- crea un file contenente le informazioni utili per il debug dello script
- --versione
- visualizza la versione dello script
- --help
- visualizza informazioni sull'utilizzo dei parametri
Esempi:
# ./scriptlog-debianizzati.org --tipo=rete # ./scriptlog-debianizzati.org --tipo=apt --nocompress --nopaste # ./scriptlog-debianizzati.org --versione
Script
#! /bin/bash # -------------------------------------------------------------------------- # Impostazioni # -------------------------------------------------------------------------- # I file creati saranno leggibili e scrivibili da tutti umask 0011 # Intercettazione Ctrl+C trap _exit INT # Abilitazione dell'opzione 'extdebug' necessaria per espandere ARGC in # Bash 5 e versioni successive shopt -s extdebug # -------------------------------------------------------------------------- # Funzioni che sovrascrivono comandi # -------------------------------------------------------------------------- # Rimpiazza echo ed echo -n, impedendo echo -e e le possibili combinazioni # Sintassi accettata: # echo -n "testo" # stampa senza a capo finale # echo "testo" # stampa con a capo finale # echo # stampa una riga vuota function echo { if [ $# -gt 1 ] && [ "$1" = "-n" ]; then shift printf %s "$*" else printf %s\\n "$*" fi } # Sostituisce il comando 'cat' per controllare che al file di log # venga inviato effettivamente il contenuto di un file di testo function cat { if [ "$(file -bL $1)" = 'ASCII text' ]; then /bin/cat "$1" else echo "File non di testo" fi } # -------------------------------------------------------------------------- # Costanti # -------------------------------------------------------------------------- # Versione script readonly VERSIONE="1.0.69" # Path e nome dello script readonly PATH_NAME="$(readlink -f "${BASH_SOURCE[0]}")" # Codename per oldstable, stable e testing. Da modificare nei successivi rilasci di Debian readonly OLDSTABLE="stretch" readonly STABLE="buster" readonly TESTING="bullseye" # Path dei comandi dello script readonly PATH="/bin:/sbin:/usr/bin:/usr/sbin" # Nome del file di log in base alla data corrente readonly log="log_$(date '+%d%b_%H%M%S')" # Nome del file di debug readonly script_debug="/tmp/script_debug_$(date '+%d%b_%H%M%S')" # File descriptor per il debug FD=9 # URL remoto della pagina contenente lo script readonly SCRIPTURL="http://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&action=edit" # URL remoto della pagina contenente lo script codificato in base64 readonly SCRIPTURL_BASE64="http://guide.debianizzati.org/index.php?title=Aiuto:LogScript&action=edit" # nome utente utente=$(logname) && [ "$utente" != "root" ] || { # NOTA: "root" è permesso (solo) se scelto esplicitamente dall'utente tmputente2=$(getent passwd 1000 2> /dev/null | cut -d ":" -f 1) || tmputente2="" echo -n "Inserisci il tuo nome utente" if [ -n "$tmputente2" ]; then echo -n " (lascia vuoto per \"$tmputente2\"): " else echo -n ": " fi read tmputente && tmputente=${tmputente:-$tmputente2} && # non può contenere: spazi, tabulazioni, nuove righe; né essere vuota [ -n "${tmputente##*[[:space:]]*}" ] && # deve esistere in /etc/passwd (o equivalente) getent passwd "$tmputente" > /dev/null 2>&1 || { echo "Nome utente non valido o non esistente!" >&2 exit 255 } utente=$tmputente unset tmputente unset tmputente2 } readonly utente # nome host readonly nomehost=$(hostname) # Codici stile carattere readonly ROSSO="\033[01;31m" # colore rosso e grassetto readonly VERDE="\033[01;32m" # colore verde e grassetto readonly BOLD="\033[01m" # grassetto readonly FINE="\033[0m" # reset # variabile che vale 1 se systemd è installato [ "$(ps -o comm= -p 1)" = "systemd" ] && systemd=1 || systemd=0 readonly systemd # -------------------------------------------------------------------------- # 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 } # 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 } # Messaggio visualizzato nel caso in cui venga specificato lo stesso parametro function _parm_rip_err { echo "È stato immesso lo stesso parametro" && _parm_uso } # Messaggio visualizzato nel caso in cui --help non sia l'unico parametro specificato function _parm_uso_err { echo "Il parametro $1 non deve essere accompagnato da altri parametri" && _parm_uso } # Funzione che stampa informazioni sull'utilizzo dei parametri function _parm_uso { printf %b " Utilizzo dei parametri: $BOLD--tipo={rete|video|boot|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--update$FINE viene aggiornato lo script se è disponibile una nuova versione $BOLD--base64$FINE viene creato un file con la codifica base64 dello script $BOLD--debug$FINE crea un file contenente le informazioni utili per il debug dello script $BOLD--versione$FINE visualizza la versione dello script in esecuzione $BOLD--help$FINE visualizza queste informazioni " && exit } # Visualizza la versione corrente dello script function _showvers { echo "$VERSIONE" && exit } # 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_BOOT=0 TIPO_AUDIO=0 TIPO_MNT=0 TIPO_TOUCH=0 TIPO_COMM=0 UPDATE=0 BASE64=0 DEBUG=0 while [ $# -gt 0 ] ; do case "$1" in "--base64") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || BASE64=1 ;; "--update") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || UPDATE=1 ;; "--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=boot") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_BOOT=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 ;; "--debug") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || DEBUG=1 ;; "--versione") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _showvers ;; "--help") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _parm_uso ;; *) _parm_err esac shift done # -------------------------------------------------------------------------- # Debug # -------------------------------------------------------------------------- function _debug { [ "$DEBUG" -eq 1 ] && [ ! -e /proc/$$/fd/"$FD" ] && { exec {FD}>"$script_debug" export BASH_XTRACEFD="$FD" set -x } } function _close_debug { set +x exec {FD}>&- } # -------------------------------------------------------------------------- # Funzioni iniziali # -------------------------------------------------------------------------- # Funzione che stampa il messaggio introduttivo function _intro { echo " ********************************************************************************* * www.debianizzati.org * * * * Script che crea un log utile alla risoluzione dei problemi più comuni * * Versione $VERSIONE * * * *********************************************************************************" } # Funzione che stampa alcune avvertenze sullo script function _avvertenze { local risp echo " -- Lo script richiede i permessi di root per essere eseguito -- Per inviare il log su paste.debian.net è necessario il pacchetto 'pastebinit' -- L'invio del log a paste.debian.net avverrà solo dopo esplicito consenso -- Verrà creato un file contenente l'output di questo script -- Verrà creato un file in formato compresso da inviare al forum" echo -n "Continuare [S/n]? " read risp || risp="ERROR" # Se non viene premuto "s" o "S" o [Invio], lo script termina [ -z "$risp" ] || [ "$risp" = "s" ] || [ "$risp" = "S" ] || _exit } # Funzione che esegue un check preliminare function _check { if [ $EUID -ne 0 ]; then # Lo script viene lanciato da root? echo "Lo script deve essere lanciato da root" && _exit fi # Se esiste già un file di log con lo stesso nome oppure file compressi con lo # stesso nome di quelli che verranno creati, lo script chiede se cancellarli o meno local risp if [ -f "$log" ] || [ -f "${log}.xz" ] || [ -f "${log}.bz2" ] || [ -f "${log}.gz" ]; then echo $'\n'"Esiste già un file ${log}, ${log}.xz, ${log}.bz2 o ${log}.gz nella directory corrente." echo -n "Sovrascivere [S/n]? " read risp case "$risp" in ""|[Ss]) rm -f -- "$log" "${log}.xz" "${log}.bz2" "${log}.gz" > /dev/null 2>&1 ;; *) exit 1 esac fi } # -------------------------------------------------------------------------- # Funzioni per l'invio del log a paste.debian.net # -------------------------------------------------------------------------- # Funzione per separare il log in parti per l'invio a paste.debian.net function _split_and_send { local paste_url='https://paste.debian.net' local chunk_prefix='pastebin' local chunk_num=1 local paste_exit_status=0 local chunkfile pastelink # dimensione massima del singolo file da inviare local chunk_size='60k' # termina la funzione se il log è più grande di chunk_size x 4 (numero di parti impostate) if [ "$(du -k "$log" | cut -f1)" -gt 240 ]; then echo "Log troppo grande per essere inviato a paste.debian.net" echo "Allegare il file compresso alla discussione sul forum." return 1 fi # rinomina parti di log preesistenti (se ve ne sono) # scarta i messaggi di errore (se presenti) rename "s/${chunk_prefix}/old-${chunk_prefix}-$(date '+%s')/" "$chunk_prefix".* > /dev/null 2>&1 # dividi il file di log in parti di $chunk_size bytes senza spezzare le linee # scarta i messaggi di errore (se presenti) per log di dimensione superiore a 10 parti # (max 10 parti con l'opzione -a) split -a 1 -d -C "$chunk_size" "$log" "${chunk_prefix}." > /dev/null 2>&1 # comunica il numero di parti inviate chunk_num=$(find . -maxdepth 1 -type f -name "${chunk_prefix}.*" -printf x | wc -c) if [ "$chunk_num" = 1 ]; then echo $'\nIl log sarà inviato in un singolo file.' else echo $'\n'"Il log sarà inviato in ${chunk_num} parti." fi # invia al massimo 4 parti echo $'\nIl log è consultabile ai seguenti indirizzi:' for chunkfile in "${chunk_prefix}."[0-3]; do # verifica l'esistenza del file da inviare if [ -f "$chunkfile" ]; then # invia dati tramite pastebinit, l'output d'errore viene soppresso pastelink=$(pastebinit -a '' -b "$paste_url" -i "$chunkfile" 2>/dev/null) if [ $? = 0 ]; then # invio apparentemente riuscito (pastebinit exit status = 0) # controlla URL restituita da pastebinit case "$pastelink" in # verifica in caso di URL corretta "$paste_url"/[0-9]*) echo ".. inviato ${chunkfile} all'indirizzo ${pastelink}" ;; # verifica in caso di URL non corretta *) echo ".. ${paste_url} ha restituito una URL non valida (${pastelink}) per ${chunkfile}!" paste_exit_status=1 esac else # Invio fallito (pastebinit exit status = 1) echo ".. non riuscito invio ${chunkfile}" paste_exit_status=1 fi fi done # cancella le parti di log inviate for chunkfile in "./${chunk_prefix}."[0-9]*; do if [ -f "$chunkfile" ]; then rm -f -- "$chunkfile" fi done return $paste_exit_status } # Funzione che invia il log a paste.debian.net function _upload { # Nessun invio a paste.debian.net se viene scelto "--nopaste" [ "$NOPASTE" -eq 1 ] && return local risp # Pastebinit è installato? if [ ! -f /usr/bin/pastebinit ]; then echo $'\nNon è possibile inviare il log a paste.debian.net\nIl pacchetto "pastebinit" non è installato.' return 1 fi # Invia il file log.txt a paste.debian.net echo -n $'\nInviare il log a http://paste.debian.net [S/n]? ' read risp case "$risp" in ""|[Ss]) _split_and_send if [ $? = 0 ]; then echo $'\nIl log è stato inviato' else echo $'\nSi sono verificati errori nell\'invio del log!' fi ;; *) echo "Il log non è stato inviato" esac } # -------------------------------------------------------------------------- # Funzioni di creazione del file compresso e messaggi di successo/fallimento # -------------------------------------------------------------------------- # Funzioni richiamate in caso di corretta/scorretta creazione del file compresso function _compress_ok { echo "File compresso creato correttamente nella directory corrente."; } function _compress_err { echo "Errore nella creazione del file compresso."; } # Funzione che crea il file compresso # Prova a creare nell'ordine: un file .xz, un file .bz2 o un file .gz function _compress { # La funzione termina se è stato utilizzato il parametro "--nocompress" [ "$NOCOMPRESS" -eq 1 ] && return local risp echo -n $'\nCreare un file compresso [S/n]? ' read risp case "$risp" in ""|[Ss]) echo "Sta per essere creato un file compresso..." sleep 1 if [ "$(command -v xz)" ]; then xz -e < "$log" > "${log}.xz" && _compress_ok || _compress_err elif [ "$(command -v bzip2)" ]; then bzip2 -9 < "$log" > "${log}.bz2" && _compress_ok || _compress_err elif [ "$(command -v gzip)" ]; then gzip -9 < "$log" > "${log}.gz" && _compress_ok || _compress_err else echo "Impossibile effettuare la compressione!" >&2 fi ;; *) echo "Non è stato creato un file compresso." esac } # -------------------------------------------------------------------------- # Funzione di stampa menù e selezione del problema # -------------------------------------------------------------------------- function _scelta { # Problemi selezionati in base al parametro passato allo script [ "$TIPO_RETE" -eq 1 ] && _wait && _header "rete" && _rete && return [ "$TIPO_VIDEO" -eq 1 ] && _wait && _header "video" && _video && return [ "$TIPO_BOOT" -eq 1 ] && _wait && _header "boot" && _boot && return [ "$TIPO_AUDIO" -eq 1 ] && _wait && _header "audio" && _audio && return [ "$TIPO_APT" -eq 1 ] && _wait && _header "APT" && _apt && return [ "$TIPO_MNT" -eq 1 ] && _wait && _header "mount-unmount" && _mount && return [ "$TIPO_TOUCH" -eq 1 ] && _wait && _header "touchpad" && _tpad && return [ "$TIPO_COMM" -eq 1 ] && _wait && _header "generico" && _common && return # La funzione presenta un menù di scelta nel caso non sia stato passato alcun parametro local num clear _intro echo " Selezionare il tipo di problema per il quale verrà generato il file di log [1] Problemi relativi alle connessioni di rete [2] Problemi video [3] Problemi di boot [4] Problemi audio [5] Problemi di gestione dei pacchetti (APT) [6] Problemi di mount/unmount [7] Problemi di funzionamento del touchpad [8] Altro tipo di problema [0] Uscita" while true; do echo -n "Scegliere il numero corrispondente: " read num case "$num" in [1-8]) _wait ;;& # ;;& -> va alla successiva occorrenza del carattere immesso 1) _header "rete" && _rete ;;& 2) _header "video" && _video ;;& 3) _header "boot" && _boot ;;& 4) _header "audio" && _audio ;;& 5) _header "APT" && _apt ;;& 6) _header "mount-unmount" && _mount ;;& 7) _header "touchpad" && _tpad ;;& 8) _header "generico" && _common ;;& [1-8]) break ;; # Termina il ciclo 'while' 0) _exit ;; # È stato inserito '0' . Uscita dallo script *) # Tutti gli altri caratteri. Cancella l'input immesso e ripete la domanda tput cuu1 # in alto di una riga tput ed # cancella fino alla fine dello schermo esac done } # -------------------------------------------------------------------------- # Funzioni varie # -------------------------------------------------------------------------- # Funzione che stampa solo parentesi e il nome del comando, prima di eseguirlo function _prompt { echo -n "[ ] $*" } # Funzione che stampa un pallino colorato in base al primo parametro function _printdot { echo tput cuu1 # in alto di una riga tput cuf1 # a destra di uno spazio printf %b "$1•${FINE}\n" # stampa pallino e va a capo } # Funzione che stampa un pallino di colore verde in caso di comando con output function _ok { _printdot "${VERDE}"; } # Funzione che stampa una pallino rosso in caso di comando privo di output function _error { _printdot "${ROSSO}"; } # Funzione che stampa in grassetto gli argomenti function _bold { printf %b "${BOLD}" echo -n "$*" printf %b\\n "${FINE}" } # Funzione che invia nel file di log due righe tra le quali viene visualizzato il # nome del comando (passato come primo parametro della funzione -> $1) function _nome_e_riga { echo " ****************************************** $1 ******************************************" >> "$log" } # Funzione che stampa un messaggio di attesa function _wait { echo $'\nCreazione del log in corso...\n' } # Intestazione del file di log function _header { echo "Tipo di problema: $1" >> "$log" _data _lastupd echo "Versione script: $VERSIONE" >> "$log" } # Stampa la data corrente nel file di log function _data { echo "Log creato il: $(date '+%d %B %Y alle %H.%M')" >> "$log" } # Quota i caratteri specificati per le parole da nascondere con sed # Es: abc.def -> abc\.def function _sed_quote { # array di caratteri da quotare quotearr=("." "/") retstr="$1" for char in "${quotearr[@]}"; do retstr="${retstr//$char/\\$char}" done echo "$retstr" } # Funzione che nasconde nel log alcune informazioni sensibili function _hide { # Sostituisce il nome utente e il nome host con 'nomeutente' e 'nomehost' se diversi da [dD]ebian if [[ "$nomehost" =~ .*"$utente".* ]]; then [ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log" [ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log" else [ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log" [ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log" fi # Nasconde gli ESSID gestiti attraverso Network Manager local var file mydir="/etc/NetworkManager/system-connections/" if [ -d "$mydir" ]; then # se esiste la directory /etc/NetworkManager/system-connections/ ... for file in "$mydir"/*; do # ciclo attraverso il contenuto della directory if [ -f "$file" ]; then # se l'elemento è un file... var=$(sed -n "s/ssid=//p" "$file") # ... var conterrà l'eventuale ESSID... if [ -n "$var" ]; then # ... e se è diverso dalla stringa vuota... sed -i "s/${var}/\*script-removed\*/g" "$log" # ... lo nasconde nel file di log fi fi done fi # Nasconde nel log i nomi delle connessioni gestite da NetworkManager sed -i -r "s/(NetworkManager.*keyfile.*((parsing)|(read connection))).*/\1 \*script-removed\*/" "$log" sed -i -r "s/(NetworkManager.*keyfile: new connection.*system-connections\/)(.*)( \(.*,\").*(\"\))/\1\*script-removed\*\3\*script-removed\*\4/g" "$log" sed -i -r "s/(NetworkManager.*policy: auto-activating connection ').*(')/\1\*script-removed\*\2/g" "$log" sed -i -r "s/(NetworkManager.*Activation: starting connection ').*(')/\1\*script-removed\*\2/g" "$log" sed -i -r "s/(NetworkManager.*policy: set ').*(')/\1\*script-removed\*\2/g" "$log" # Nasconde l'indirizzo MAC delle interfacce wireless local interfaces macaddress line if [ -f /proc/net/wireless ]; then # array che contiene i nomi delle interfacce wireless mapfile -s 2 interfaces < <(awk -F'[: ]+' '{ print $2 }' /proc/net/wireless) for i in "${interfaces[@]}"; do # indirizzo MAC dell'interfaccia solo se questa ne ha uno line="$(ip -br link show $i)" if [ "$(echo $line | wc -w)" -gt 3 ]; then macaddress="$(awk '{ print $3 }' <<< $line)" macaddress="$(_sed_quote $macaddress)" # l'indirizzo MAC viene nascosto nel file sed -i 's/'$macaddress'/\*script-removed\*/g' "$log" fi done fi } # Invia al log l'output del comando passato come primo parametro e # con i permessi utente function _su { echo "$(su -c "$1" $utente)" >> "$log" } # Stabilisce la data dell'ultimo aggiornamento effettuato. Viene preso in # considerazione il file /var/log/apt/history.log oppure il file /var/log/apt/history.log.1.gz function _lastupd { local convdate lastdate file=/var/log/apt/history.log if [ -f "$file" ]; then lastdate=$(sed -n '/^Start-Date/h ; $p' "$file" | cut -d ' ' -f 2) # se il file history.log non contiene la data dell'ultimo aggiornamento, viene utilizzato history.log.1.gz [ -z "$lastdate" ] && [ -f "${file}.1.gz" ] && lastdate=$(zcat "${file}.1.gz" | sed -n '/^Start-Date/h ; $p' | cut -d ' ' -f 2) # variabile che contiene la data in formato "giorno mese anno" convdate=$(date -d "$lastdate" '+%d %B %Y') echo $"Ultimo aggiornamento del sistema: ${convdate}" >> "$log" fi } # Funzione che effettua l'aggiornamento automatico dello script function _self_update { echo -n "Aggiornare questo script [S/n]? " local risp read risp [ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit || echo "Aggiornamento in corso..." # Controlla l'esistenza di wget [ ! "$(command -v wget)" ] && echo "Impossibile eseguire l'aggiornamento. Installare il pacchetto wget." && _exit # Ricava la versione remota dello script local vers="$(wget -q -O- "$SCRIPTURL" | sed -n '/^readonly VERSIONE.*/{p;q}' | cut -d '"' -f2)" if [ "$vers" = "" ]; then echo "Connessione non riuscita" && _exit fi if [ "$vers" = "$VERSIONE" ]; then echo "Lo script è gia alla versione più recente" else echo -n "È disponibile una nuova versione dello script: " && _bold "$vers" echo -n "Procedere con l'aggiornamento [S/n]? " read risp case "$risp" in [Ss]|"") local tempfile="$(mktemp)" # viene creato un file temporaneo # lo script in formato base64 viene copiato nel file temporaneo wget -q -O- "$SCRIPTURL_BASE64" | sed -n "/^=S=/{n; :a /^==Fine/ ! {p; n; ba}}" | base64 -d | tar xz -O > "$tempfile" if [ ! -s "$tempfile" ]; then # Controlla se il file è vuoto echo "Connessione non riuscita" else cp "$tempfile" "$PATH_NAME" [ $? -eq 0 ] && echo "Aggiornamento effettuato" || echo "Aggiornamento fallito" #rm -f "$tempfile" # Rimuove il file temporaneo fi ;; *) echo "Non è stato eseguito alcun aggiornamento" esac fi } # funzione che crea un file con la codifica base64 dello script # Da utilizzare in caso di aggiornamenti per modificare la pagina # http://guide.debianizzati.org/index.php/Aiuto:LogScript function _base64 { echo -n "Verrà creato un file con la codifica base64 di questo script. Continuare [S/n]? " local risp read risp [ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit || local tempfile="$(mktemp)" # crea un file temporaneo tar cf - "${BASH_SOURCE[0]}" | gzip -9 | base64 > "$tempfile" if [ $? -eq 0 ]; then echo -n "Il file contenente la codifica base64 di questo script è " && _bold "$tempfile" else echo "Codifica non riuscita" fi # Modifica i permessi del file in modo che possa essere letto da tutti chmod 444 "$tempfile" } # Funzione che stampa un messaggio che indica i file creati e poi termina lo script function _exit { # se è stato effettuato un update o una codifica base64, stampa solo il messaggio finale if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then local complog="" if [ -f "$log" ]; then echo -n $'\nFile contenente il log dello script: ' _bold "$log" else echo $'\nNon è stato creato un file di log' fi if [ -f "${log}.xz" ]; then complog="${log}.xz" elif [ -f "${log}.bz2" ]; then complog="${log}.bz2" elif [ -f "${log}.gz" ]; then complog="${log}.gz" fi if [ -z "$complog" ]; then echo "Non è stato creato un file compresso del log" else echo -n "File compresso da allegare alla discussione sul forum: " _bold "$complog" fi if [ -f "$script_debug" ]; then echo -n "File contenente l'output di debug: " _bold "$script_debug" fi fi echo $'Script terminato\n' _close_debug exit 0 } # -------------------------------------------------------------------------- # Funzioni relative a ciascun problema selezionato # -------------------------------------------------------------------------- # Informazioni comuni a tutti i tipi di problema function _common { _dmi_decode _comando "/bin/uname -a" _file "/etc/debian_version" _de_wm _file "/etc/X11/default-display-manager" _comando "/usr/bin/groups" "su" _file "/var/log/syslog" _comando "/bin/systemctl --failed --no-pager" _comando "/bin/journalctl -x -b --no-pager -p err" _comando "/bin/journalctl -x -b --no-pager -p warning" _comando "/bin/journalctl -x -b --no-pager" _comando "/usr/bin/systemd-cgtop -b --iterations=5" _comando "/usr/bin/systemd-cgls -l" _comando "/usr/bin/systemd-delta" _comando "/bin/dmesg -l err" _comando "/bin/dmesg -l warn" _comando "/bin/lsmod" _comando "/usr/bin/lspci -knn" _comando "/usr/bin/lsusb" _comando "/sbin/fdisk -l" _comando "/sbin/blkid" _file "/etc/fstab" _dir "/etc/fstab.d/" _comando "/bin/findmnt" _comando "/bin/lsblk" _comando "/bin/df" _dir "/etc/modprobe.d/" _dir "/etc/modules-load.d/" _file "/etc/modules" _file "/etc/apt/sources.list" _dir "/etc/apt/sources.list.d/" _comando "/usr/bin/apt-cache policy" _comando "/usr/bin/apt-cache stats" _comando "/usr/bin/dpkg --audit" _comando "/usr/bin/apt-get check" _firmware _extpack _pack "linux-headers" _pack "linux-image" _comando "/usr/sbin/dkms status" } # Funzione relativa ai problemi di rete function _rete { _common _file "/etc/network/interfaces" _dir "/etc/network/interfaces.d/" _file "/etc/hosts" _comando "/sbin/ifconfig" _comando "/sbin/ifconfig -a" _comando "/sbin/ip -s -d link show" _comando "/usr/sbin/rfkill list all" _comando "/bin/ping -c3 -W5 8.8.8.8" #DNS di Google 8.8.8.8 _comando "/bin/ip addr" _comando "/bin/ip route list" _comando "/sbin/iwconfig" _comando "/sbin/iwlist scan" _comando "/sbin/route -n" _pack "resolvconf" _file "/etc/resolv.conf" _pack "DHCP" _file "/etc/dhclient.conf" _file "/etc/NetworkManager/NetworkManager.conf" _comando "/usr/bin/nmcli dev list" _comando "/usr/bin/nmcli device show" _demone "/usr/sbin/NetworkManager" "Network Manager" _demone "/usr/sbin/wicd" "Wicd" } # Funzione relativa a problemi video function _video { _common _file "/etc/X11/xorg.conf" _dir "/etc/X11/xorg.conf.d/" _file "/var/log/Xorg.0.log" _file "${utente}/.local/share/xorg/Xorg.0.log" _pack "xserver-xorg" _pack "nouveau" _pack "nvidia" _pack "mesa" _pack "fglrx" _pack "amdgpu" } # Funzione relativa ai problemi di avvio del sistema function _boot { _common _file "/etc/default/grub" _file "/boot/grub/grub.cfg" _dir "/etc/default/grub.d/" _dir "/etc/grub.d/" _file "/boot/grub/device.map" _comando "/usr/sbin/grub-mkdevicemap" _pack grub } # Funzione relativa ai problemi audio. Scarica ed esegue lo script ALSA function _audio { _common _pack "alsa" _nome_e_riga "dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel'" _prompt "ALSA dmesg" dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel' >> "$log" && _ok || _error local risp alsaurl="http://www.alsa-project.org/alsa-info.sh" echo $'\nI log relativi ai problemi audio sono ricavati attraverso lo script di debug' echo "ALSA prelevabile all'indirizzo: ${alsaurl}" echo -n $'\nVerrà ora scaricato e eseguito lo script ALSA. Continuare [S/n]? ' read risp case "$risp" in ""|[Ss]) # wget esiste? if [ ! -f /usr/bin/wget ]; then echo "Impossibile scaricare lo script ALSA. Installare il pacchetto wget." return fi # Crea un file temporaneo in /tmp che conterrà lo script ALSA local tempfile=$(mktemp) # Scarica lo script ALSA _prompt "Download script ALSA" wget -q -O "$tempfile" "$alsaurl" # Se il download riesce... if [ $? -eq 0 ]; then _ok "Download script ALSA riuscito" # Imposta i permessi dello script scaricato chmod 777 "$tempfile" _nome_e_riga "Problemi audio" # rimuove il comando "dmesg" dallo script ALSA # perché non eseguibile da utente normale (il comando è # stato inserito a parte in questa funzione) sed -i "/^$(printf '\t')withdmesg/d" "$tempfile" # Esegue lo script ALSA _prompt "Esecuzione script ALSA" _su "$tempfile --stdout" && _ok || _error else _error "Download script ALSA fallito" fi # Rimuove il file temporaneo rm -- "$tempfile" ;; *) echo "Lo script ALSA non è stato ancora eseguito." echo "Avviare manualmente lo script prelevabile a questo indirizzo:" _bold "$alsaurl" echo "Lo script ALSA va eseguito con i permessi di normale utente." esac } # Funzione relativa alla gestione dei pacchetti attraverso il sistema APT function _apt { _common _comando "/usr/bin/dpkg --print-architecture" _comando "/usr/bin/dpkg --print-foreign-architectures" _comando "/usr/bin/apt-get update" _comando "/usr/bin/apt-get -s -y upgrade" _comando "/usr/bin/apt-get -s -y dist-upgrade" _comando "/usr/bin/apt-get -s -y -f install" _comando "/usr/bin/apt-get -s -y autoremove" _comando "/usr/bin/apt-config dump" _file "/etc/apt/apt.conf" _dir "/etc/apt/apt.conf.d/" _file "/etc/apt/preferences" _dir "/etc/apt/preferences.d/" } # Funzione relativa a problemi di mount/unmount function _mount { _common _comando "/usr/bin/udisksctl dump" _pack "usbmount" } # Funzione relativa al funzionamento del touchpad function _tpad { _common _pack "xserver-xorg" _pack "touchpad" _file "/etc/X11/xorg.conf" _dir "/etc/X11/xorg.conf.d/" _file "/var/log/Xorg.0.log" _comando "/usr/bin/synclient -l" "su" } # -------------------------------------------------------------------------- # Funzioni utilizzate per tipo di problema (generiche) # -------------------------------------------------------------------------- # Funzione che invia il contenuto di un file al file di log # La funzione va richiamata specificando il path completo del file che sarà assegnato a $1 # Il contenuto dei file viene inviato inalterato al file di log. Se si ha necessità di # modificare questo comportamento, creare una entry nel ciclo "case" function _file { _nome_e_riga "$1" _prompt "$1" if [ -f "$1" ]; then case "$1" in /etc/fstab) # Nasconde username, password e dominio di mount CIFS sed -e "s/\( cifs.*username *= *\)[^,]*/\1\*script-removed\*/" \ -e "s/\( cifs.*password *= *\)[^,]*/\1\*script-removed\*/" \ -e "s/\( cifs.*domain *= *\)[^,]*/\1\*script-removed\*/" "$1" &>> "$log" && _ok || _error ;; /etc/network/interfaces) # Nasconde nel log gli ESSID e le password criptate contenute in /etc/network/interfaces sed -r "s/((wpa-ssid)|(wpa-psk)|(wpa-identity)|(wpa-password)|(wireless-key)).*/\1 \*script-removed\*/" "$1" &>> "$log" && _ok || _error ;; /var/log/syslog) # se è installato systemd, il log viene ricavato da "journalctl -x" if [ $systemd -eq 0 ]; then # se il file contiene la stringa "rsyslogd.*start" ... if [ "$(grep -sci 'rsyslogd.*start$' "$1")" -ne 0 ]; then # ... 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 || _error else # 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 cat "$1" &>> "$log" && _ok || _error _nome_e_riga "$1".1 _prompt "$1".1 sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1".1 >> "$log" && _ok || _error fi else _error # systemd è installato. I log vengono ricavati da "journalctl -x" fi ;; *) # per tutti i file non specificati sopra... cat "$1" &>> "$log" && _ok || _error esac else echo "File \"$1\" non trovato" >> "$log" && _error fi } # Invia l'output di un comando al file di log # La funzione va richiamata specificando il path completo del comando (con eventuali opzioni) # che sarà assegnato a $1 . L'output dei comandi viene inviato interamente al file di log. Se # si ha necessità di modificare gli output, creare una entry nel ciclo "case" # Es. _comando "/usr/bin/apt-get update" # # Nel caso in cui il comando debba essere eseguito tramite 'su', richiamare la funzione con # due parametri: # $1 = il comando da eseguire attraverso 'su' # $2 = la stringa 'su' # Es. _comando "/usr/bin/groups" "su" function _comando { local var=${1##*/} # var conterrà il comando ($1) con le opzioni ma privo del path local var2=${1%% *} # var2 conterrà il comando ($1) privo di eventuali opzioni ma con il path _nome_e_riga "$var" _prompt "$var" if [ -f "$var2" ]; then # il comando esiste? if [ $# -eq 2 ]; then # Se vi sono 2 parametri, viene chiamata la funzione "_su" case "$1" in "/usr/bin/synclient -l") # se $DISPLAY è vuota, usa :0 (default per il primo server X) _su "DISPLAY=${DISPLAY:-:0} $1" && _ok || _error ;; *) _su "$1" && _ok || _error esac else # non viene utilizzato "su" case "$1" in # per "iwconfig" e "iwlist scan" gli ESSID non vengono inviati al log /sbin/iwconfig) (iwconfig | sed -e '/ESSID:/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error ;; "/sbin/iwlist scan") (iwlist scan | sed -e '/ESSID:.*/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error ;; # nasconde gli ESSID visualizzati da "nmcli dev list" (fino a Wheezy) # L'array PIPESTATUS mostra il codice d'uscita dei comandi della pipe. PIPESTATUS[0] è il codice d'uscita di "nmcli dev list" (0=successo) "/usr/bin/nmcli dev list") nmcli dev list 2>/dev/null | sed -r "s/(^AP[[:digit:]]*\.SSID:[[:space:]]*).*/\1\*script removed\*/" >> "$log" && [ "${PIPESTATUS[0]}" -eq 0 ] && _ok || \ ( _error && echo "Comando valido solo per Wheezy" >> "$log" ) ;; # nasconde gli ESSID visualizzati da "nmcli device show" (da Jessie in poi) "/usr/bin/nmcli device show") LANG=C nmcli device show 2>/dev/null | sed -r "s/(^AP[[:digit:]]*\.SSID:[[:space:]]*|GENERAL.CONNECTION:[[:space:]]*).*/\1\*script removed\*/" >> "$log" && [ "${PIPESTATUS[0]}" -eq 0 ] && _ok || \ ( _error && echo "Comando valido solo per Jessie e versioni superiori" >> "$log" ) ;; /bin/dmesg*) # Il comando viene eseguito solo se è non installato systemd [ $systemd -eq 0 ] && $1 &>> "$log" && _ok || _error ;; "/usr/sbin/grub-mkdevicemap") local devicemaptempfile="$(mktemp)" && \ grub-mkdevicemap -m "$devicemaptempfile" && \ if [ -f "$devicemaptempfile" ]; then cat "$devicemaptempfile" >> "$log"; fi && _ok || _error ;; *) # per tutti gli altri comandi non specificati in precedenza, l'output del comando è inviato inalterato al log $1 &>> "$log" && _ok || _error esac fi else echo "Comando \"${var2}\" non trovato" >> "$log" && _error fi } # Funzione che invia il contenuto dei file di una directory al file di log function _dir { _nome_e_riga "$1" _prompt "$1" # Se la directory non esiste, stampa un output sul log ed esce. if [ ! -d "$1" ]; then echo "La directory non esiste" >> "$log" && _error return fi local file # numfile contiene il numero di file contenuti nella directory. Solo primo livello. local numfile=$(find "$1" -maxdepth 1 -type f | wc -l) # numdir contiene il numero di sottodirectory contenute nella directory. Solo primo livello. local numdir=$(find "$1" -maxdepth 1 -type d | wc -l) if [ "$numfile" -eq 0 ] && [ "$numdir" -eq 1 ]; then echo "La directory non contiene file o directory" >> "$log" && _error else echo "La directory contiene ${numfile} file e $((numdir - 1)) directory" >> "$log" && _ok ls -al "$1" >> "$log" # invia al log il contenuto dei file della directory for file in "$1"*; do if [ -f "$file" ]; then _nome_e_riga "$file" _prompt "$file" cat "$file" &>> "$log" && _ok || _error fi done # Funzione che invia al log il contenuto dei file presenti nelle sottodirectory # I due cicli "for" sono separati per permettere l'output di un file subito dopo # la directory a cui appartiene for file in "$1"*; do if [ -d "$file" ]; then _dir "$file/" fi done fi } # Funzione che elenca i pacchetti installati che contengono la parola # passata come parametro ($1) function _pack { _nome_e_riga "Pacchetti che contengono \"$1\"" _prompt "Nomi di pacchetti con $1" # Variabile che contiene i pacchetti trovati local packages=$(dpkg -l | grep -i "$1") if [ -z "$packages" ]; then echo "Nessun pacchetto installato" >> "$log" && _error else echo "$packages" >> "$log" && _ok fi } # Funzione che verifica l'esistenza e l'esecuzione di alcuni demoni # Viene chiamata con due parametri: # $1 - percorso dell'eseguibile # $2 - nome da visualizzare # Se si vuol visualizzare la versione del demone, inserire il comando adatto # all'interno del ciclo 'case', allo stesso modo specificare al suo interno # anche il nome dello script d'avvio per fermare, avviare, etc il demone function _demone { # vers = versione del demone ; var = nome dello script d'avvio del demone local vers="" var="" _nome_e_riga "$2" _prompt "$2" if [ -f "$1" ]; then case "$1" in /usr/sbin/NetworkManager) vers=$(NetworkManager --version) var="network-manager" ;; /usr/sbin/wicd) vers=$(wicd -h | head -2 | tail -1) var="wicd" ;; esac echo "$2 è installato (versione "$vers")" >> "$log" && _ok invoke-rc.d "$var" status &>/dev/null [ $? -eq 0 ] && echo "$2 è in esecuzione" >> "$log" || echo "$2 non è in esecuzione" >> "$log" else echo "$2 non è installato" >> "$log" && _error fi } # -------------------------------------------------------------------------- # Funzioni utilizzate per tipo di problema (particolari) # -------------------------------------------------------------------------- # comando 'cat /sys/class/dmi/id/{sys_vendor,product_name,product_version,bios_version}' function _dmi_decode { local var="/sys/class/dmi/id/*" _nome_e_riga "$var" _prompt "$var" if [ -f /sys/class/dmi/id/sys_vendor ]; then echo "Produttore: $(cat /sys/class/dmi/id/sys_vendor)" &>> "$log" echo "Prodotto: $(cat /sys/class/dmi/id/product_name)" &>> "$log" echo "Versione: $(cat /sys/class/dmi/id/product_version)" &>> "$log" echo "BIOS vers.: $(cat /sys/class/dmi/id/bios_version)" &>> "$log" && _ok || _error else echo "File /sys/class/dmi/id/sys_vendor non trovato" >> "$log" && _error fi } # esistenza di pacchetti contenenti firmware e firmware presente sulla macchina function _firmware { local i var="Firmware" _prompt "$var" _nome_e_riga "$var" dpkg -l | grep -i firmware >> "$log" && _ok || _error echo >> "$log" # Elenca i file contenuti nelle directory specificate for i in "/usr/lib/firmware" "/usr/local/lib/firmware" "/lib/firmware" "/run/udev/firmware-missing"; do if [ -d "$i" ]; then echo "Contenuto di ${i}" >> "$log" ls -alR "$i" >> "$log" else echo "${i} non trovata" >> "$log" fi echo >> "$log" done } # Stampa sullo standard output l'eseguibile associato a x-session-manager (il default) function _x_session_manager { update-alternatives --query "x-session-manager" | awk '$1 ~ /^Value:$/ { print $2; exit 0 }' } # Stampa sullo standard output l'eseguibile associato a x-window-manager (il default) function _x_window_manager { update-alternatives --query "x-window-manager" | awk '$1 ~ /^Value:$/ { print $2; exit 0 }' } # Stampa la lista dei pacchetti installati che soddisfano una data dipendenza # con versione (del programma e in Debian) e archivio di provenienza # Viene chiamata con un parametro: # $1 - nome della dipendenza function _soddisfa { echo "Installati (${1}):" aptitude search '?installed?provides('"$1"')' --disable-columns \ --display-format "- %p (versione: %v; archivio: %t)" } # Restituisce un exit status di 0 solo se l'eseguibile con il nome scelto è in esecuzione da parte dell'utente ($utente) # Viene chiamata con un parametro: # $1 - comando di cui controllare l'esecuzione da parte di $utente function _is_running { local list_pids_user list_pids_bin pid pid2 list_pids_user=$(ps -U "$utente" -o pid) # lista di interi, separati da spazi, con i PID dei processi avviati da $utente list_pids_bin=$(pidof -- "$1") # lista di interi, separati da spazi, con i PID dei processi del comando $1 for pid in $list_pids_user; do for pid2 in $list_pids_bin; do if [ "$pid" = "$pid2" ]; then return 0 # trovato fi done done return 1 # non trovato! } # Funzione che "cerca" di ricavare il nome e la versione del DE/WM utilizzato function _de_wm { _nome_e_riga "Desktop Environment - Window Manager" _prompt "DE/WM" { # impostazione di default echo -n $'Default:\n- x-session-manager: ' _x_session_manager echo -n "- x-window-manager: " _x_window_manager # installati if [ "$(command -v aptitude)" ]; then _soddisfa "x-session-manager" # _soddisfa "x-window-manager" # non essenziale e impiega già tanto fi } >> "$log" # in esecuzione echo -n "In esecuzione: " >> "$log" if _is_running "ksmserver"; then kf5-config -v 2>/dev/null >> "$log" || # KDE5 kde4-config -v 2>/dev/null >> "$log" && _ok || _error # KDE4 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 || _error # Xfce4 elif _is_running "openbox"; then if [ "$(_x_session_manager)" != "/usr/bin/openbox-session" ]; then echo -n "(altro x-session-manager) + " >> "$log" # Session manager (LXDE?) + Openbox fi openbox --version | head -n 1 >> "$log" && _ok || _error # Openbox else echo "Sconosciuto" >> "$log" && _error # NON TROVATO fi } # Funzione che elenca i pacchetti non appartenenti alla release di default utilizzata function _extpack { local var="Pacchetti esterni" _prompt "$var" # La funzione termina se aptitude non è installato if [ ! "$(command -v aptitude)" ]; then _nome_e_riga "$var" echo "Aptitude non è installato" >> "$log" && _error return 1 fi local riga indirizzo rel linea release="" # variabile con il contenuto del file sources.list (solo righe che iniziano con deb # e che contengono "main" ) local sourceslist="$(sed -e '/^deb /!d' -e '/.* main.*/!d' /etc/apt/sources.list)" # variabile che contiene l'output del comando "apt-cache policy" local aptcachepol="$(apt-cache policy)" # ciclo sulle righe della variabile "sourceslist" while read linea; do # variabile che contiene l'URL dell'archivio (es. http://ftp.it.debian.org/debian/) indirizzo="$(awk '{ print $2 }' <<< "$linea")" # sostituisce / con \/ (necessario per il successivo sed) indirizzo="$(_sed_quote "$indirizzo")" # release della riga corrente (es. wheezy o testing o sid) rel="$(awk '{ print $3 }' <<< "$linea")" # controlla che sia un nome di release valido if [ "$rel" = "oldstable" ] || [ "$rel" = "stable" ] || [ "$rel" = "testing" ] || [ "$rel" = "unstable" ] || [ "$rel" = "$OLDSTABLE" ] || [ "$rel" = "$STABLE" ] || [ "$rel" = "$TESTING" ] || [ "$rel" = "sid" ]; then # controlla che sia un repository di Debian # si basa sull'output di "apt-cache policy" e su o=Debian e l=Debian riga="$(echo "$aptcachepol" | sed -n '/'$indirizzo'*.*'$rel'\/main.*Packages$/ {N; /.*o=Debian,.*l=Debian,/p}')" # se è un archivio valido, aggiorna la variabile "release" if [ ! -z "$riga" ]; then if [ -z "$release" ]; then release="$rel" else release="$(printf %b "$release\n$rel")" fi fi fi done <<< "$sourceslist" # Lo script DEVE rilevare almeno una release. Se la variabile "release" è nulla, c'è un errore in "sources.list" # oppure non è stato eseguito un aggiornamento della lista dei pacchetti (update) # (vedere anche il modo in cui viene ricavata la variabile "release" in alto) if [ -z "$release" ]; then _nome_e_riga "${var} all'archivio \"NON RILEVATO!\"" echo "Release non rilevata. Repository errati oppure è necessaria una modifica dello script" >> "$log" && _error return 1 fi # Rimuove eventuali duplicati (esistono repository doppi in sources.list) release="$(echo "$release" | sort -u)" # Numero di release trovate local num=$(echo "$release" | wc -l) # Se il numero di release è diverso da 1 (pinning?), la funzione termina if [ "$num" -ne 1 ]; then _nome_e_riga "$var" echo "Sono presenti ${num} release in sources.list" >> "$log" && _error return fi local pkg="" # Se il numero di release è uguale a 1, la variabile pkg conterrà i pacchetti *non* facenti parte della release case "$release" in "$OLDSTABLE"|oldstable) release="oldstable" pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aoldstable' --disable-columns | column -t) ;; "$STABLE"|stable) release="stable" pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Astable' --disable-columns | column -t) ;; "$TESTING"|testing) release="testing" pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Atesting' --disable-columns | column -t) ;; sid|unstable) release="unstable" pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aunstable' --disable-columns | column -t) ;; esac # Invia al log il contenuto di pkg (se esiste) _nome_e_riga "${var} all'archivio \"${release}\"" if [ -z "$pkg" ]; then echo "Nessun pacchetto esterno installato" >> "$log" && _error else echo "$pkg" >> "$log" && _ok fi } # -------------------------------------------------------------------------- # Main # -------------------------------------------------------------------------- clear _intro if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then _debug _avvertenze _check _scelta _hide _upload _compress elif [ "$UPDATE" -eq 1 ]; then _self_update elif [ "$BASE64" -eq 1 ]; then _base64 fi _exit
Changelog
- 1.0.69
- http->https per paste.debian.net
- Sostituito "which" con "command -v"
- Aggiunto _pack "amdgpu"
- Aggiunta funzione per quotare stringhe prima di passarle a sed
- Rimosso comando "udisks --dump" (non più presente in Debian)
- Gestita la mancanza di aptitude
- Modifiche minori
- S3v 13:21, 23 ott 2020 (CEST)
- 1.0.68
- Nascosti indirizzi MAC delle interfacce wireless
- Sovrascrittura del comando cat per evitare che al file di
- log venga inviato il contenuto di un file non di testo
- Impostata a 'on' l'opzione 'extdebug' per consentire l'espansione
- di ARGC per Bash >= 5
- Modifiche e correzioni minori
- S3v 15:00, 23 mag 2020 (CEST)
- 1.0.67
- Aggiornamento per rilascio di Debian 10 (Buster)
- HAL 9000 09:39, 7 lug 2019 (CEST)
- 1.0.66
- Aggiunto problema per avvio del sistema (boot)
- Aggiunta funzione _su (c'erano problemi con lo script ALSA)
- Aggiunte directory
/etc/fstab/
,/etc/modprobe.d/
, /etc/modules-load.d/
,/etc/network/interfaces.d/
e il- file
/etc/modules
- dmesg dello script ALSA spostato nello script
- Modifiche e correzioni minori
- S3v 10:37, 29 giu 2019 (CEST)
- 1.0.65
- Aggiunti "ip -s -d link show" e Xorg.0.log locale
- Nascosti username, password e dominio per montaggi cifs
- Modifiche e correzioni minori
- S3v 20:49, 20 feb 2018 (CET)
- 1.0.64
- Aggiornamento per rilascio di Debian 9 (Stretch)
- HAL 9000 10:46, 18 giu 2017 (CEST)
- 1.0.63
- Debug come parametro
- KDE5 tra i DE rilevati
- S3v 22:38, 19 mag 2017 (CEST)
- 1.0.62
- Inserito debug
- Inserita funzione _printdot (per evitare ripetizioni)
- Modifiche minori
- S3v 17:41, 26 feb 2017 (CET)
- 1.0.61
- Aggiunta funzione _header() (intestazione del file di log)
- Aggiunto parametro "--versione"
- Modifiche e correzioni minori
- S3v 13:53, 10 dic 2016 (CET)
- 1.0.60
- Elenco ricorsivo delle directory contenenti firmware
- Nascosti (altri) ID di connessioni gestite da NM
- S3v 20:53, 6 dic 2016 (CET)
- 1.0.59
- Modificata funzione _hide() per nascondere completamente hostname contenuto nel
- nome utente (e viceversa)
- S3v 21:33, 11 nov 2016 (CET)
- 1.0.58
- Rimossa precedente istruzione e modificata regexp per far funzionare la ricerca di
- pacchetti esterni sia su stable che su testing
- Modifiche minori
- S3v 16:44, 10 lug 2016 (CEST)
- 1.0.57
- Istruzione per rimuovere eventuale slash alla fine dell'URL in "sources.list"
- Aggiunti comandi "systemd-cgtop -b --iterations=5", "systemd-cgls" e "systemd-delta" a problemi comuni
- S3v 21:27, 9 lug 2016 (CEST)
- 1.0.56
- Rimosse dal file interfaces anche le chiavi relative a wep e a wpa-enterprise
- metaldaze 12:54, 04 feb 2016 (CET)
- 1.0.55
- Opzioni per aggiornare lo script o crearne una codifica base64
- Corretti ESSID in "nmcli device show" non nascosti
- Rimozione duplicati in "release" (pacchetti esterni)
- S3v 21:26, 15 giu 2015 (CEST)
- 1.0.54
- Correzioni minori legate alla compressione xz; semplificata lettura nome utente in caso di errori con logname
- HAL 9000 18:41, 31 mag 2015 (CEST)
- 1.0.53
- Vengono rimosse dalla variabile "release" (pacchetti esterni) le linee duplicate
- S3v 18:22, 30 mag 2015 (CEST)
- 1.0.52
- Aggiunta compressione xz, se disponibile, con ripiego su bzip2 oppure gzip
- HAL 9000 22:15, 17 mag 2015 (CEST)
- 1.0.51
- Aggiunti comandi "systemctl --failed", "journal -x -b --no-pager [-p [err, warning]]",
- "blkid", "lsblk", "dpkg --audit"
- "/var/log/syslog" e "dmesg" solo se non è installato systemd
- Aggiunta variabile globale "oldstable" e aggiornate "testing" e "stable"
- Modifiche minori
- HAL 9000 e S3v 17:12, 4 mag 2015 (CEST)
- 1.0.50
- Rivista la funzione _extpack (repository Debian
- in base al comando "apt-cache policy")
- S3v 22:37, 22 dic 2014 (CET)
- 1.0.49
- Aggiunti trap INT e "dpkg --print-foreign-architectures"
- Spostato "dkms status" nei comandi generali
- S3v 21:19, 20 dic 2014 (CET)
- 1.0.48
- Corretta la ricerca per i pacchetti esterni
- Aggiunto _pack "linux-image"
- S3v 20:16, 19 nov 2014 (CET)
- 1.0.47
- Inseriti "nmcli dev list" (per Wheezy) e "nmcli device show" (per Jessie e superiori)
- Inserito "udisksctl dump"
- S3v 15:55, 5 nov 2014 (CET)
(Prosegue nella pagina di discussione).
Guida scritta da: S3v 23:38, 13 apr 2013 (CEST) | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |