https://guide.debianizzati.org/api.php?action=feedcontributions&user=S3v&feedformat=atomGuide@Debianizzati.Org - Contributi dell'utente [it]2024-03-28T20:25:31ZContributi dell'utenteMediaWiki 1.39.5https://guide.debianizzati.org/index.php?title=Bullseye&diff=44442Bullseye2021-04-23T14:37:43Z<p>S3v: </p>
<hr />
<div>__NOTOC__<br />
'''Bullseye''' è il [[codename]] della [[release]] di Debian attualmente in fase di [[testing]], destinata a diventare la successiva Debian [[stable]] al prossimo rilascio.<br />
<br />
''Vedere anche'':<br />
<br />
* [[La struttura della Distribuzione]]<br />
<br />
== Timeline ==<br />
{| class="wikitable" style="width:50%;"<br />
|-<br />
|''07 luglio 2019'' || Nasce la nuova testing, nome in codice "Bullseye" || <br />
|-<br />
|''16 marzo 2020'' || Debian installer (Alpha 2) per Bullseye || [https://www.debian.org/devel/debian-installer/News/2020/20200316 link]<br />
|-<br />
|''06 dicembre 2020'' || Debian installer (Alpha 3) per Bullseye || [https://www.debian.org/devel/debian-installer/News/2020/20201206 link]<br />
|-<br />
|''23 aprile 2021'' || Debian installer (RC 1) per Bullseye || [https://www.debian.org/devel/debian-installer/News/2021/20210423 link]<br />
|}<br />
<br />
[[Categoria:Glossario]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Bullseye&diff=44441Bullseye2021-04-23T14:37:09Z<p>S3v: Debian Installer RC 1</p>
<hr />
<div>__NOTOC__<br />
'''Bullseye''' è il [[codename]] della [[release]] di Debian attualmente in fase di [[testing]], destinata a diventare la successiva Debian [[stable]] al prossimo rilascio.<br />
<br />
''Vedere anche'':<br />
<br />
* [[La struttura della Distribuzione]]<br />
<br />
== Timeline ==<br />
{| class="wikitable" style="width:50%;"<br />
|-<br />
|''07 luglio 2019'' || Nasce la nuova testing, nome in codice "Bullseye" || <br />
|-<br />
|''16 marzo 2020'' || Debian installer (Alpha 2) per Bullseye || [https://www.debian.org/devel/debian-installer/News/2020/20200316 link]<br />
|-<br />
|''06 dicembre 2020'' || Debian installer (Alpha 3) per Bullseye || [https://www.debian.org/devel/debian-installer/News/2020/20201206 link]<br />
|-<br />
|''23 aprile 2020'' || Debian installer (RC 1) per Bullseye || [https://www.debian.org/devel/debian-installer/News/2021/20210423 link]<br />
|}<br />
<br />
[[Categoria:Glossario]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Debian_Project_Leader&diff=44439Debian Project Leader2021-04-18T20:42:30Z<p>S3v: + DPL 2021</p>
<hr />
<div>__NOTOC__<br />
Il Debian Project Leader (Leader del Progetto Debian) o '''DPL''' è la figura ufficiale del progetto Debian che si rapporta sia con il mondo esterno a Debian (contatti con altre distibuzioni, rapporti con attività riguardanti l'informazione, conferenze, eventi, dialogo con diverse realtà del software libero e non, ecc.), sia con le strutture interne al Progetto Debian definendo le linee guida, assicurandosi che vengano realizzate (personalmente o tramite deleghe ad altri [[Debian Developer | Debian Developers]]) e coordinandone gli aspetti applicativi.<br/><br />
Tutti i compiti del Debian Project Leader sono descritti con precisione nella [https://www.debian.org/devel/constitution Costituzione di Debian].<br/><br />
La carica di DPL dura un anno; sei settimane prima del termine del mandato vengono indette nuove elezioni a cui partecipano tutti gli sviluppatori Debian.<br />
<br />
Qui di seguito sono elencati tutti coloro che hanno ricoperto la carica di DPL.<br />
<br />
{| class="wikitable" style="width:99%"<br />
!width="16%" | Debian Project Leader<br />
!width="21%" | Periodo<br />
!width="9%" | Programma<br />
!width="11%" | Pagina sul voto<br />
!Altri candidati<br />
!width="18%" | Note<br />
|-<br />
|'''Ian Murdock'''<br />
||da agosto 1993 (fondazione di Debian) a marzo 1996 || || || ||<br />
|-<br />
|'''Bruce Perens'''<br />
||da aprile 1996 a dicembre 1997<br />
|| || || ||<br />
|-<br />
|'''Ian Jackson'''<br />
||da gennaio 1998 a dicembre 1998<br />
|| || || ||<br />
|-<br />
|'''Wichert Akkerman'''<br />
||da gennaio 1999 a marzo 2000<br />
||[https://www.debian.org/vote/1999/wichert link]<br />
||[https://www.debian.org/vote/1999/vote_0001 link]<br />
||Joseph Carter, Ben Collins, Richard Braakman<br />
||<br />
|-<br />
|'''Wichert Akkerman'''<br />
||da marzo 2000 a marzo 2001<br />
||<br />
||[https://www.debian.org/vote/2000/vote_0007 link]<br />
||Ben Collins, Joel Klecker, Matthew Vernon<br />
||<br />
|-<br />
|'''Ben Collins'''<br />
||da marzo 2001 ad aprile 2002<br />
||[https://lists.debian.org/debian-vote-0102/msg00017.html link]<br />
||[https://www.debian.org/vote/2001/vote_0001 link]<br />
||Branden Robinson, Anand Kumria, Bdale Garbee<br />
||<br />
|-<br />
|'''Bdale Garbee'''<br />
||da aprile 2002 ad aprile 2003<br />
||[https://www.debian.org/vote/2002/platforms/bdale link]<br />
||[https://www.debian.org/vote/2002/vote_0001 link]<br />
||Branden Robinson, Raphaël Hertzog<br />
||<br />
|-<br />
|'''Martin Michlmayr'''<br />
||da aprile 2003 a marzo 2004<br />
||[https://www.debian.org/vote/2003/platforms/tbm link]<br />
||[https://www.debian.org/vote/2003/vote_0001 link]<br />
||Moshe Zadka, Bdale Garbee, Branden Robinson<br />
||<br />
|-<br />
|'''Martin Michlmayr'''<br />
||da marzo 2004 ad aprile 2005<br />
||[https://www.debian.org/vote/2004/platforms/tbm link]<br />
||[https://www.debian.org/vote/2004/vote_001 link]<br />
||Gergely Nagy, Branden Robinson<br />
||<br />
|-<br />
|'''Branden Robinson'''<br />
||da aprile 2005 ad aprile 2006<br />
||[https://www.debian.org/vote/2005/platforms/branden link]<br />
||[https://www.debian.org/vote/2005/vote_001 link]<br />
||Matthew Garrett, Andreas Schuldei, Angus Lees, Anthony Towns, Jonathan Walther<br />
||<br />
|-<br />
|'''Anthony Towns'''<br />
|| da aprile 2006 ad aprile 2007<br />
||[https://www.debian.org/vote/2006/platforms/ajt link]<br />
||[https://www.debian.org/vote/2006/vote_002 link]<br />
||Jeroen van Wolffelaar, Ari Pollak, Steve McIntyre, Andreas Schuldei, Jonathan (Ted) Walther, Bill Allombert<br />
||<br />
|-<br />
|'''Sam Hocevar'''<br />
||da aprile 2007 ad aprile 2008<br />
||[https://www.debian.org/vote/2007/platforms/sho link]<br />
||[https://www.debian.org/vote/2007/vote_001 link]<br />
||Wouter Verhelst, Aigars Mahinovs, Gustavo Franco, Steve McIntyre, Raphaël Hertzog, Anthony Towns, Simon Richter<br />
||<br />
|-<br />
|'''Steve McIntyre'''<br />
||da aprile 2008 ad aprile 2009<br />
||[https://www.debian.org/vote/2008/platforms/93sam link]<br />
||[https://www.debian.org/vote/2008/vote_001 link]<br />
||Marc Brockschmidt, Raphaël Hertzog<br />
||[[Intervista a Steve McIntyre | Intervista a Steve McIntyre]]<br />
|-<br />
|'''Steve McIntyre'''<br />
||da aprile 2009 ad aprile 2010<br />
||[https://www.debian.org/vote/2009/platforms/93sam link]<br />
||[https://www.debian.org/vote/2009/vote_001 link]<br />
||Stefano Zacchiroli<br />
||<br />
|-<br />
|'''Stefano Zacchiroli'''<br />
||da aprile 2010 ad aprile 2011<br />
||[https://www.debian.org/vote/2010/platforms/zack link]<br />
||[https://www.debian.org/vote/2010/vote_001 link]<br />
||Wouter Verhelst, Charles Plessy, Margarita Manterola<br />
||[[Zack | Intervista a Stefano Zacchiroli]]<br />
|-<br />
|'''Stefano Zacchiroli'''<br />
||da aprile 2011 ad aprile 2012<br />
||[https://www.debian.org/vote/2011/platforms/zack link]<br />
||[https://www.debian.org/vote/2011/vote_001 link]<br />
||<br />
||<br />
|-<br />
|'''Stefano Zacchiroli'''<br />
||da aprile 2012 ad aprile 2013<br />
||[https://www.debian.org/vote/2012/platforms/zack link]<br />
||[https://www.debian.org/vote/2012/vote_001 link]<br />
||Wouter Verhelst, Gergely Nagy<br />
||<br />
|-<br />
|'''Lucas Nussbaum'''<br />
||da aprile 2013 ad aprile 2014<br />
||[https://www.debian.org/vote/2013/platforms/lucas link]<br />
||[https://www.debian.org/vote/2013/vote_001 link]<br />
||Gergely Nagy, Moray Allan<br />
||<br />
|-<br />
|'''Lucas Nussbaum'''<br />
||da aprile 2014 ad aprile 2015<br />
||[https://www.debian.org/vote/2014/platforms/lucas link]<br />
||[https://www.debian.org/vote/2014/vote_001 link]<br />
||Neil McGovern<br />
||<br />
|-<br />
|'''Neil McGovern'''<br />
||da aprile 2015 ad aprile 2016<br />
||[https://www.debian.org/vote/2015/platforms/neilm link]<br />
||[https://www.debian.org/vote/2015/vote_001 link]<br />
||Mehdi Dogguy, Gergely Nagy<br />
||<br />
|-<br />
|'''Mehdi Dogguy'''<br />
||da aprile 2016 ad aprile 2017<br />
||[https://www.debian.org/vote/2016/platforms/mehdi link]<br />
||[https://www.debian.org/vote/2016/vote_001 link]<br />
||<br />
||<br />
|-<br />
|'''Chris Lamb'''<br />
||da aprile 2017 ad aprile 2018<br />
||[https://www.debian.org/vote/2017/platforms/lamby link]<br />
||[https://www.debian.org/vote/2017/vote_001 link]<br />
||Mehdi Dogguy<br />
||<br />
|-<br />
|'''Chris Lamb'''<br />
||da aprile 2018 ad aprile 2019<br />
||[https://www.debian.org/vote/2018/platforms/lamby link]<br />
||[https://www.debian.org/vote/2018/vote_001 link]<br />
||<br />
||<br />
|-<br />
|'''Sam Hartman'''<br />
||da aprile 2019 ad aprile 2020<br />
||[https://www.debian.org/vote/2019/platforms/hartmans link]<br />
||[https://www.debian.org/vote/2019/vote_001 link]<br />
||Joerg Jaspert, Jonathan Carter, Martin Michlmayr<br />
||<br />
|-<br />
|'''Jonathan Carter'''<br />
||da aprile 2020 ad aprile 2021<br />
||[https://www.debian.org/vote/2020/platforms/jcc link]<br />
||[https://www.debian.org/vote/2020/vote_001 link]<br />
||Sruthi Chandran, Brian Gupta<br />
||<br />
|-<br />
|'''Jonathan Carter'''<br />
||da aprile 2021 a oggi<br />
||[https://www.debian.org/vote/2021/platforms/jcc link]<br />
||[https://www.debian.org/vote/2021/vote_001 link]<br />
||Sruthi Chandran<br />
||<br />
|-<br />
|}<br />
<br />
== Collegamenti utili ==<br />
[https://www.debian.org/devel/leader Leader del Progetto Debian]<br/><br />
[https://www.debian.org/vote/ Il voto del DPL]<br/><br />
[https://en.wikipedia.org/wiki/Condorcet_method Metodo di Condorcet]<br />
<br />
[[Categoria: Glossario]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&diff=44377Creazione automatica di un file di log per inviare quesiti al forum2021-04-10T09:46:06Z<p>S3v: </p>
<hr />
<div><!-- <br />
NOTA DI COMMENTO RELATIVA A OGNI NUOVO RILASCIO DI DEBIAN:<br />
<br />
* modificare il codename nella riga "#ifeq" sottostante con quello della nuova stable, dopo aver aggiornato questa guida.<br />
* In caso contrario sarà mostrato un messaggio di avvertenza al posto del template "Versioni compatibili".<br />
* Il codename *deve* essere scritto tutto minuscolo (per esempio: jessie).<br />
<br />
--><br />
{{#ifeq: {{Codename|stable|IN_TEMPLATE}} | buster | <br />
{{Versioni compatibili}} |<br />
{{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. }}<br />
}} <br/><br />
<br />
== Introduzione ==<br />
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 [http://forum.debianizzati.org forum] per tentare di risolverlo insieme.<br/><br />
Le informazioni riguardano i seguenti tipi di problema:<br />
* Connessioni di rete<br />
* Video<br />
* Avvio del sistema (boot)<br />
* Audio (tramite lo script ALSA prelevabile [http://www.alsa-project.org/alsa-info.sh qui])<br />
* Sottosistema di gestione dei pacchetti (APT)<br />
* Mount/unmount di periferiche<br />
* Touchpad<br />
* Altro. Verranno inserite nel log solo informazioni generiche (già presenti nel log creato con tutte le tipologie di problema precedenti).<br />
<br />
Lo script crea due file:<br />
;log_''data'':contiene le informazioni in formato testo<br />
;log_''data''.{xz,bz2,gz}:il file precedente ma in formato compresso. Può essere allegato ad una discussione sul forum<br />
<br />
Se si vuole, attraverso lo script è anche possibile inviare il file direttamente a [https://paste.debian.net 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.<br/><br />
Prima di effettuare l'invio, lo script chiede un esplicito consenso all'utente.<br />
<br />
{{Box|Nota|Lo script è liberamente modificabile.<br/>Per ogni segnalazione, informazione o suggerimento fare riferimento a [http://forum.debianizzati.org/viewtopic.php?f{{=}}13&t{{=}}45098 questa] discussione sul forum.}}<br />
<br />
== Pacchetti opzionali ==<br />
Lo script utilizza alcuni comandi che potrebbero non essere installati di default sulla propria macchina. L'installazione di questi pacchetti è del tutto facoltativa e la loro assenza non pregiudica in alcun modo le funzionalità messe a disposizione dallo script.<br />
;aptitude:Viene utilizzato per ricavare informazioni quali il gestore di sessione e i pacchetti non appartenenti alla [[release]] di Debian predefinita. Per installarlo:<pre># apt install aptitude</pre><br />
;pastebinit:Permette di usufruire del servizio offerto da paste.debian.net per la condivisione del testo. Per installarlo:<pre># apt install pastebinit</pre><br />
<br />
== Privacy dell'utente ==<br />
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).<br />
<br />
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.<br />
<br />
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''.<br />
<br />
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 [http://forum.debianizzati.org/viewtopic.php?f=13&t=45098 discussione apposita] o all'interno della pagina di discussione.<br />
<br />
== Utilizzo ==<br />
# Eseguire un upgrade del sistema, se possibile, in modo che le informazioni raccolte dallo script siano aggiornate.<br />
# 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 <code>scriptlog-debianizzati.org</code>.<br />
# Assegnare i permessi di esecuzione al file appena creato; ad esempio, da terminale o emulatore di terminale:<pre>$ chmod a+x scriptlog-debianizzati.org</pre>In alternativa, se si preferisce, è possibile eseguire il seguente comando:<pre>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</pre>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.<br />
# Eseguire da terminale (o emulatore di terminale) lo script con i permessi di [[root]]:<pre># ./scriptlog-debianizzati.org</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.<br />
# Leggere le informazioni a video.<br />
<br />
== Parametri dello script ==<br />
Lo script accetta, in maniera facoltativa, alcuni parametri:<br />
;--tipo={rete|video|boot|audio|apt|mount|touchpad|generico}:specifica il tipo di problema<br />
;--nocompress:non crea il file compresso del file di log<br />
;--nopaste:non invia il file di log a paste.debian.net<br />
;--update:aggiorna lo script se esiste una versione recente<br />
;--base64:crea un file contenente la codifica base64 dello script<br />
;--debug:crea un file contenente le informazioni utili per il debug dello script<br />
;--versione:visualizza la versione dello script<br />
;--help:visualizza informazioni sull'utilizzo dei parametri<br />
<br />
'''Esempi:'''<br />
<pre><br />
# ./scriptlog-debianizzati.org --tipo=rete<br />
# ./scriptlog-debianizzati.org --tipo=apt --nocompress --nopaste<br />
# ./scriptlog-debianizzati.org --versione<br />
# ./scriptlog-debianizzati.org --help<br />
</pre><br />
<br />
<!-- commento (leggibile per chi modifica la pagina)<br />
<br />
<br />
*IMPORTANTE*<br />
<br />
Se si modifica lo script è *necessario* seguire le istruzioni alla pagina:<br />
<br />
https://guide.debianizzati.org/index.php/Aiuto:LogScript<br />
<br />
in modo da aggiornare l'archivio in formato Base64<br />
<br />
<br />
--><br />
== Script ==<br />
<syntaxhighlight lang="bash"><br />
#! /bin/bash<br />
<br />
# --------------------------------------------------------------------------<br />
# Impostazioni<br />
# --------------------------------------------------------------------------<br />
<br />
# I file creati saranno leggibili e scrivibili da tutti<br />
umask 0011<br />
<br />
# Intercettazione Ctrl+C<br />
trap _exit INT<br />
<br />
# Abilitazione dell'opzione 'extdebug' necessaria per espandere ARGC in<br />
# Bash 5 e versioni successive<br />
shopt -s extdebug<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni che sovrascrivono comandi<br />
# --------------------------------------------------------------------------<br />
<br />
# Rimpiazza echo ed echo -n, impedendo echo -e e le possibili combinazioni<br />
# Sintassi accettata:<br />
# echo -n "testo" # stampa senza a capo finale<br />
# echo "testo" # stampa con a capo finale<br />
# echo # stampa una riga vuota<br />
function echo {<br />
if [ $# -gt 1 ] && [ "$1" = "-n" ]; then<br />
shift<br />
printf %s "$*"<br />
else<br />
printf %s\\n "$*"<br />
fi<br />
}<br />
<br />
# Sostituisce il comando 'cat' per controllare che al file di log<br />
# venga inviato effettivamente il contenuto di un file di testo<br />
function cat {<br />
if [ "$(file -bL $1)" = 'ASCII text' ]; then<br />
/bin/cat "$1"<br />
else<br />
echo "File non di testo"<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Costanti<br />
# --------------------------------------------------------------------------<br />
<br />
# Versione script<br />
readonly VERSIONE="1.0.71"<br />
<br />
# Path e nome dello script<br />
readonly PATH_NAME="$(readlink -f "${BASH_SOURCE[0]}")"<br />
<br />
# Codename per oldoldstable, oldstable, stable e testing.<br />
# Da modificare nei successivi rilasci di Debian<br />
readonly OLDOLDSTABLE="jessie"<br />
readonly OLDSTABLE="stretch"<br />
readonly STABLE="buster"<br />
readonly TESTING="bullseye"<br />
<br />
# Path dei comandi dello script<br />
readonly PATH="/bin:/sbin:/usr/bin:/usr/sbin"<br />
<br />
# Nome del file di log in base alla data corrente<br />
readonly log="log_$(date '+%d%b_%H%M%S')"<br />
<br />
# Nome del file di debug<br />
readonly script_debug="/tmp/script_debug_$(date '+%d%b_%H%M%S')"<br />
<br />
# File descriptor per il debug<br />
FD=9<br />
<br />
# URL remoto della pagina contenente lo script<br />
readonly SCRIPTURL="http://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&action=edit"<br />
<br />
# URL remoto della pagina contenente lo script codificato in base64<br />
readonly SCRIPTURL_BASE64="http://guide.debianizzati.org/index.php?title=Aiuto:LogScript&action=edit"<br />
<br />
# nome utente<br />
utente=$(logname) &&<br />
[ "$utente" != "root" ] || {<br />
# NOTA: "root" è permesso (solo) se scelto esplicitamente dall'utente<br />
tmputente2=$(getent passwd 1000 2> /dev/null | cut -d ":" -f 1) ||<br />
tmputente2=""<br />
echo -n "Inserisci il tuo nome utente"<br />
if [ -n "$tmputente2" ]; then<br />
echo -n " (lascia vuoto per \"$tmputente2\"): "<br />
else<br />
echo -n ": "<br />
fi<br />
read tmputente &&<br />
tmputente=${tmputente:-$tmputente2} &&<br />
# non può contenere: spazi, tabulazioni, nuove righe; né essere vuota<br />
[ -n "${tmputente##*[[:space:]]*}" ] &&<br />
# deve esistere in /etc/passwd (o equivalente)<br />
getent passwd "$tmputente" > /dev/null 2>&1 || {<br />
echo "Nome utente non valido o non esistente!" >&2<br />
exit 255<br />
}<br />
utente=$tmputente<br />
unset tmputente<br />
unset tmputente2<br />
}<br />
readonly utente<br />
<br />
# nome host<br />
readonly nomehost=$(hostname)<br />
<br />
# Codici stile carattere<br />
readonly ROSSO="\033[01;31m" # colore rosso e grassetto<br />
readonly VERDE="\033[01;32m" # colore verde e grassetto<br />
readonly BOLD="\033[01m" # grassetto<br />
readonly FINE="\033[0m" # reset<br />
<br />
# variabile che vale 1 se systemd è installato<br />
[ "$(ps -o comm= -p 1)" = "systemd" ] && systemd=1 || systemd=0<br />
readonly systemd<br />
<br />
# --------------------------------------------------------------------------<br />
# Sezione relativa ai parametri dello script<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che segnala un errato utilizzo dei parametri e termina lo script<br />
function _parm_err {<br />
echo "Parametri non validi" && _parm_uso<br />
}<br />
<br />
# Messaggio di errore se viene specificato più di un tipo di problema attraverso<br />
# i parametri.<br />
function _parm_tipo_err {<br />
echo "È possibile specificare un solo di tipo di problema" && _parm_uso<br />
}<br />
<br />
# Messaggio visualizzato nel caso in cui venga specificato lo stesso parametro<br />
function _parm_rip_err {<br />
echo "È stato immesso lo stesso parametro" && _parm_uso<br />
}<br />
<br />
# Messaggio visualizzato nel caso in cui --help non sia l'unico parametro specificato<br />
function _parm_uso_err {<br />
echo "Il parametro $1 non deve essere accompagnato da altri parametri" && _parm_uso<br />
}<br />
<br />
# Funzione che stampa informazioni sull'utilizzo dei parametri<br />
function _parm_uso {<br />
printf %b "<br />
Utilizzo dei parametri:<br />
<br />
$BOLD--tipo={rete|video|boot|audio|apt|mount|touchpad|generico}$FINE<br />
utilizzato per specificare un solo tipo di problema.<br />
Es: --tipo=apt<br />
<br />
$BOLD--nocompress$FINE<br />
non viene creato un file compresso del log<br />
<br />
$BOLD--nopaste$FINE<br />
non viene inviato il log a paste.debian.net<br />
<br />
$BOLD--update$FINE<br />
viene aggiornato lo script se è disponibile una nuova versione<br />
<br />
$BOLD--base64$FINE<br />
viene creato un file con la codifica base64 dello script<br />
<br />
$BOLD--debug$FINE<br />
crea un file contenente le informazioni utili per il debug dello script<br />
<br />
$BOLD--versione$FINE<br />
visualizza la versione dello script in esecuzione<br />
<br />
$BOLD--help$FINE<br />
visualizza queste informazioni<br />
<br />
" && exit<br />
}<br />
<br />
# Visualizza la versione corrente dello script<br />
function _showvers {<br />
echo "$VERSIONE" && exit<br />
}<br />
<br />
# Inizializzazione di variabili. La variabile TIPO serve ad evitare ripetizioni<br />
# nel passaggio del parametro tipo=blabla<br />
NOCOMPRESS=0 NOPASTE=0 TIPO=0 TIPO_RETE=0 TIPO_APT=0 TIPO_VIDEO=0 TIPO_BOOT=0<br />
TIPO_AUDIO=0 TIPO_MNT=0 TIPO_TOUCH=0 TIPO_COMM=0 UPDATE=0 BASE64=0<br />
DEBUG=0<br />
<br />
while [ $# -gt 0 ] ; do<br />
case "$1" in<br />
"--base64") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || BASE64=1 ;;<br />
"--update") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || UPDATE=1 ;;<br />
"--nocompress") [ "$NOCOMPRESS" -eq 1 ] && _parm_rip_err || NOCOMPRESS=1 ;;<br />
"--nopaste") [ "$NOPASTE" -eq 1 ] && _parm_rip_err || NOPASTE=1 ;;<br />
"--tipo=rete") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_RETE=1 ;;<br />
"--tipo=apt") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_APT=1 ;;<br />
"--tipo=video") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_VIDEO=1 ;;<br />
"--tipo=boot") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_BOOT=1 ;;<br />
"--tipo=audio") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_AUDIO=1 ;;<br />
"--tipo=mount") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_MNT=1 ;;<br />
"--tipo=touchpad") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_TOUCH=1 ;;<br />
"--tipo=generico") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_COMM=1 ;;<br />
"--debug") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || DEBUG=1 ;;<br />
"--versione") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _showvers ;;<br />
"--help") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _parm_uso ;;<br />
*) _parm_err<br />
esac<br />
shift<br />
done<br />
<br />
# --------------------------------------------------------------------------<br />
# Debug<br />
# --------------------------------------------------------------------------<br />
function _debug {<br />
[ "$DEBUG" -eq 1 ] && [ ! -e /proc/$$/fd/"$FD" ] &&<br />
{<br />
exec {FD}>"$script_debug"<br />
export BASH_XTRACEFD="$FD"<br />
set -x<br />
}<br />
}<br />
<br />
function _close_debug {<br />
set +x<br />
exec {FD}>&-<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni iniziali<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che stampa il messaggio introduttivo<br />
function _intro {<br />
echo "<br />
*********************************************************************************<br />
* www.debianizzati.org *<br />
* *<br />
* Script che crea un log utile alla risoluzione dei problemi più comuni *<br />
* Versione $VERSIONE *<br />
* *<br />
*********************************************************************************"<br />
}<br />
<br />
# Funzione che stampa alcune avvertenze sullo script<br />
function _avvertenze {<br />
local risp<br />
echo "<br />
-- Lo script richiede i permessi di root per essere eseguito<br />
-- Per inviare il log su paste.debian.net è necessario il pacchetto 'pastebinit'<br />
-- L'invio del log a paste.debian.net avverrà solo dopo esplicito consenso<br />
-- Verrà creato un file contenente l'output di questo script<br />
-- Verrà creato un file in formato compresso da inviare al forum"<br />
echo -n "Continuare [S/n]? "<br />
read risp || risp="ERROR"<br />
<br />
# Se non viene premuto "s" o "S" o [Invio], lo script termina<br />
[ -z "$risp" ] || [ "$risp" = "s" ] || [ "$risp" = "S" ] || _exit<br />
}<br />
<br />
# Funzione che esegue un check preliminare<br />
function _check {<br />
if [ $EUID -ne 0 ]; then # Lo script viene lanciato da root?<br />
echo "Lo script deve essere lanciato da root" && _exit<br />
fi<br />
<br />
# Se esiste già un file di log con lo stesso nome oppure file compressi con lo<br />
# stesso nome di quelli che verranno creati, lo script chiede se cancellarli o meno<br />
local risp<br />
if [ -f "$log" ] || [ -f "${log}.xz" ] || [ -f "${log}.bz2" ] || [ -f "${log}.gz" ]; then<br />
echo $'\n'"Esiste già un file ${log}, ${log}.xz, ${log}.bz2 o ${log}.gz nella directory corrente."<br />
echo -n "Sovrascivere [S/n]? "<br />
read risp<br />
case "$risp" in<br />
""|[Ss]) rm -f -- "$log" "${log}.xz" "${log}.bz2" "${log}.gz" > /dev/null 2>&1 ;;<br />
*) exit 1<br />
esac<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni per l'invio del log a paste.debian.net<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione per separare il log in parti per l'invio a paste.debian.net<br />
function _split_and_send { <br />
local paste_url='https://paste.debian.net'<br />
local chunk_prefix='pastebin'<br />
local chunk_num=1<br />
local paste_exit_status=0<br />
local chunkfile pastelink<br />
<br />
# dimensione massima del singolo file da inviare<br />
local chunk_size='60k'<br />
<br />
# termina la funzione se il log è più grande di chunk_size x 4 (numero di parti impostate)<br />
if [ "$(du -k "$log" | cut -f1)" -gt 240 ]; then<br />
echo "Log troppo grande per essere inviato a paste.debian.net"<br />
echo "Allegare il file compresso alla discussione sul forum."<br />
return 1<br />
fi<br />
<br />
# rinomina parti di log preesistenti (se ve ne sono)<br />
# scarta i messaggi di errore (se presenti)<br />
rename "s/${chunk_prefix}/old-${chunk_prefix}-$(date '+%s')/" "$chunk_prefix".* > /dev/null 2>&1<br />
<br />
# dividi il file di log in parti di $chunk_size bytes senza spezzare le linee<br />
# scarta i messaggi di errore (se presenti) per log di dimensione superiore a 10 parti<br />
# (max 10 parti con l'opzione -a)<br />
split -a 1 -d -C "$chunk_size" "$log" "${chunk_prefix}." > /dev/null 2>&1<br />
<br />
# comunica il numero di parti inviate<br />
chunk_num=$(find . -maxdepth 1 -type f -name "${chunk_prefix}.*" -printf x |<br />
wc -c)<br />
if [ "$chunk_num" = 1 ]; then<br />
echo $'\nIl log sarà inviato in un singolo file.'<br />
else<br />
echo $'\n'"Il log sarà inviato in ${chunk_num} parti."<br />
fi<br />
<br />
# invia al massimo 4 parti<br />
echo $'\nIl log è consultabile ai seguenti indirizzi:'<br />
for chunkfile in "${chunk_prefix}."[0-3]; do<br />
<br />
# verifica l'esistenza del file da inviare<br />
if [ -f "$chunkfile" ]; then<br />
<br />
# invia dati tramite pastebinit, l'output d'errore viene soppresso<br />
pastelink=$(pastebinit -a '' -b "$paste_url" -i "$chunkfile" 2>/dev/null)<br />
<br />
if [ $? = 0 ]; then<br />
# invio apparentemente riuscito (pastebinit exit status = 0)<br />
<br />
# controlla URL restituita da pastebinit<br />
case "$pastelink" in<br />
# verifica in caso di URL corretta<br />
"$paste_url"/[0-9]*)<br />
echo ".. inviato ${chunkfile} all'indirizzo ${pastelink}"<br />
;;<br />
# verifica in caso di URL non corretta<br />
*)<br />
echo ".. ${paste_url} ha restituito una URL non valida (${pastelink}) per ${chunkfile}!"<br />
paste_exit_status=1<br />
esac<br />
<br />
else<br />
# Invio fallito (pastebinit exit status = 1)<br />
echo ".. non riuscito invio ${chunkfile}"<br />
paste_exit_status=1<br />
fi<br />
<br />
fi<br />
<br />
done<br />
<br />
# cancella le parti di log inviate<br />
for chunkfile in "./${chunk_prefix}."[0-9]*; do<br />
if [ -f "$chunkfile" ]; then<br />
rm -f -- "$chunkfile"<br />
fi<br />
done<br />
<br />
return $paste_exit_status<br />
}<br />
<br />
# Funzione che invia il log a paste.debian.net<br />
function _upload {<br />
# Nessun invio a paste.debian.net se viene scelto "--nopaste"<br />
[ "$NOPASTE" -eq 1 ] && return<br />
<br />
local risp<br />
# Pastebinit è installato?<br />
if [ ! -f /usr/bin/pastebinit ]; then<br />
echo $'\nNon è possibile inviare il log a paste.debian.net\nIl pacchetto "pastebinit" non è installato.'<br />
return 1<br />
fi<br />
# Invia il file log.txt a paste.debian.net<br />
echo -n $'\nInviare il log a http://paste.debian.net [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
_split_and_send<br />
if [ $? = 0 ]; then<br />
echo $'\nIl log è stato inviato'<br />
else<br />
echo $'\nSi sono verificati errori nell\'invio del log!'<br />
fi<br />
;;<br />
*)<br />
echo "Il log non è stato inviato"<br />
esac<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni di creazione del file compresso e messaggi di successo/fallimento<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzioni richiamate in caso di corretta/scorretta creazione del file compresso<br />
function _compress_ok { echo "File compresso creato correttamente nella directory corrente."; }<br />
<br />
function _compress_err { echo "Errore nella creazione del file compresso."; }<br />
<br />
# Funzione che crea il file compresso<br />
# Prova a creare nell'ordine: un file .xz, un file .bz2 o un file .gz<br />
function _compress {<br />
# La funzione termina se è stato utilizzato il parametro "--nocompress"<br />
[ "$NOCOMPRESS" -eq 1 ] && return<br />
<br />
local risp<br />
echo -n $'\nCreare un file compresso [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
echo "Sta per essere creato un file compresso..."<br />
sleep 1<br />
if [ "$(command -v xz)" ]; then<br />
xz -e < "$log" > "${log}.xz" && _compress_ok || _compress_err<br />
elif [ "$(command -v bzip2)" ]; then<br />
bzip2 -9 < "$log" > "${log}.bz2" && _compress_ok || _compress_err<br />
elif [ "$(command -v gzip)" ]; then<br />
gzip -9 < "$log" > "${log}.gz" && _compress_ok || _compress_err<br />
else<br />
echo "Impossibile effettuare la compressione!" >&2<br />
fi<br />
;;<br />
*)<br />
echo "Non è stato creato un file compresso."<br />
esac<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzione di stampa menù e selezione del problema<br />
# --------------------------------------------------------------------------<br />
<br />
function _scelta {<br />
<br />
# Problemi selezionati in base al parametro passato allo script<br />
[ "$TIPO_RETE" -eq 1 ] && _wait && _header "rete" && _rete && return<br />
[ "$TIPO_VIDEO" -eq 1 ] && _wait && _header "video" && _video && return<br />
[ "$TIPO_BOOT" -eq 1 ] && _wait && _header "boot" && _boot && return<br />
[ "$TIPO_AUDIO" -eq 1 ] && _wait && _header "audio" && _audio && return<br />
[ "$TIPO_APT" -eq 1 ] && _wait && _header "APT" && _apt && return<br />
[ "$TIPO_MNT" -eq 1 ] && _wait && _header "mount-unmount" && _mount && return<br />
[ "$TIPO_TOUCH" -eq 1 ] && _wait && _header "touchpad" && _tpad && return<br />
[ "$TIPO_COMM" -eq 1 ] && _wait && _header "generico" && _common && return<br />
<br />
# La funzione presenta un menù di scelta nel caso non sia stato passato alcun parametro<br />
local num<br />
<br />
clear<br />
_intro<br />
echo "<br />
Selezionare il tipo di problema per il quale verrà generato il file di log<br />
[1] Problemi relativi alle connessioni di rete<br />
[2] Problemi video<br />
[3] Problemi di boot<br />
[4] Problemi audio<br />
[5] Problemi di gestione dei pacchetti (APT)<br />
[6] Problemi di mount/unmount<br />
[7] Problemi di funzionamento del touchpad<br />
[8] Altro tipo di problema<br />
[0] Uscita"<br />
<br />
while true; do<br />
echo -n "Scegliere il numero corrispondente: "<br />
read num<br />
case "$num" in<br />
[1-8]) _wait ;;& # ;;& -> va alla successiva occorrenza del carattere immesso<br />
1) _header "rete" && _rete ;;&<br />
2) _header "video" && _video ;;&<br />
3) _header "boot" && _boot ;;&<br />
4) _header "audio" && _audio ;;&<br />
5) _header "APT" && _apt ;;&<br />
6) _header "mount-unmount" && _mount ;;&<br />
7) _header "touchpad" && _tpad ;;&<br />
8) _header "generico" && _common ;;&<br />
[1-8]) break ;; # Termina il ciclo 'while'<br />
0) _exit ;; # È stato inserito '0' . Uscita dallo script<br />
*) # Tutti gli altri caratteri. Cancella l'input immesso e ripete la domanda<br />
tput cuu1 # in alto di una riga<br />
tput ed # cancella fino alla fine dello schermo<br />
esac<br />
done<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni varie<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che stampa solo parentesi e il nome del comando, prima di eseguirlo<br />
function _prompt {<br />
echo -n "[ ] $*"<br />
}<br />
<br />
# Funzione che stampa un pallino colorato in base al primo parametro<br />
function _printdot {<br />
echo<br />
tput cuu1 # in alto di una riga<br />
tput cuf1 # a destra di uno spazio<br />
printf %b "$1•${FINE}\n" # stampa pallino e va a capo<br />
}<br />
<br />
# Funzione che stampa un pallino di colore verde in caso di comando con output<br />
function _ok { _printdot "${VERDE}"; }<br />
<br />
# Funzione che stampa una pallino rosso in caso di comando privo di output<br />
function _error { _printdot "${ROSSO}"; }<br />
<br />
# Funzione che stampa in grassetto gli argomenti<br />
function _bold {<br />
printf %b "${BOLD}"<br />
echo -n "$*"<br />
printf %b\\n "${FINE}"<br />
}<br />
<br />
# Funzione che invia nel file di log due righe tra le quali viene visualizzato il<br />
# nome del comando (passato come primo parametro della funzione -> $1)<br />
function _nome_e_riga {<br />
echo "<br />
******************************************<br />
$1<br />
******************************************" >> "$log"<br />
}<br />
<br />
# Funzione che stampa un messaggio di attesa<br />
function _wait {<br />
echo $'\nCreazione del log in corso...\n'<br />
}<br />
<br />
# Intestazione del file di log<br />
function _header {<br />
echo "Tipo di problema: $1" >> "$log"<br />
_data<br />
_lastupd <br />
echo "Versione script: $VERSIONE" >> "$log"<br />
}<br />
<br />
# Stampa la data corrente nel file di log<br />
function _data {<br />
echo "Log creato il: $(date '+%d %B %Y alle %H.%M')" >> "$log"<br />
}<br />
<br />
# Quota i caratteri specificati per le parole da nascondere con sed<br />
# Es: abc.def -> abc\.def<br />
function _sed_quote {<br />
# array di caratteri da quotare<br />
local quotearr=("." "/")<br />
<br />
local retstr="$1"<br />
for char in "${quotearr[@]}"; do<br />
retstr="${retstr//$char/\\$char}"<br />
done<br />
echo "$retstr"<br />
}<br />
<br />
# Funzione che nasconde nel log alcune informazioni sensibili<br />
function _hide {<br />
<br />
# Sostituisce il nome utente e il nome host con 'nomeutente' e 'nomehost' se diversi da [dD]ebian<br />
if [[ "$nomehost" =~ .*"$utente".* ]]; then<br />
[ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log"<br />
[ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log"<br />
else<br />
[ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log"<br />
[ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log"<br />
fi <br />
<br />
# Nasconde gli ESSID gestiti attraverso Network Manager<br />
local var file mydir="/etc/NetworkManager/system-connections/"<br />
<br />
if [ -d "$mydir" ]; then # se esiste la directory /etc/NetworkManager/system-connections/ ...<br />
for file in "$mydir"/*; do # ciclo attraverso il contenuto della directory<br />
if [ -f "$file" ]; then # se l'elemento è un file...<br />
var=$(sed -n "s/ssid=//p" "$file") # ... var conterrà l'eventuale ESSID...<br />
if [ -n "$var" ]; then # ... e se è diverso dalla stringa vuota...<br />
sed -i "s/${var}/\*script-removed\*/g" "$log" # ... lo nasconde nel file di log<br />
fi<br />
fi<br />
done<br />
fi<br />
<br />
# Nasconde nel log i nomi delle connessioni gestite da NetworkManager<br />
sed -i -r "s/(NetworkManager.*keyfile.*((parsing)|(read connection))).*/\1 \*script-removed\*/" "$log"<br />
sed -i -r "s/(NetworkManager.*keyfile: new connection.*system-connections\/)(.*)( \(.*,\").*(\"\))/\1\*script-removed\*\3\*script-removed\*\4/g" "$log"<br />
sed -i -r "s/(NetworkManager.*policy: auto-activating connection ').*(')/\1\*script-removed\*\2/g" "$log"<br />
sed -i -r "s/(NetworkManager.*Activation: starting connection ').*(')/\1\*script-removed\*\2/g" "$log"<br />
sed -i -r "s/(NetworkManager.*policy: set ').*(')/\1\*script-removed\*\2/g" "$log"<br />
<br />
# Nasconde l'indirizzo MAC delle interfacce wireless<br />
local interfaces macaddress line<br />
if [ -f /proc/net/wireless ]; then<br />
# array che contiene i nomi delle interfacce wireless<br />
mapfile -s 2 interfaces < <(awk -F'[: ]+' '{ print $2 }' /proc/net/wireless)<br />
<br />
for i in "${interfaces[@]}"; do<br />
# indirizzo MAC dell'interfaccia solo se questa ne ha uno<br />
line="$(ip -br link show $i)"<br />
if [ "$(echo $line | wc -w)" -gt 3 ]; then<br />
macaddress="$(awk '{ print $3 }' <<< $line)"<br />
macaddress="$(_sed_quote $macaddress)"<br />
# l'indirizzo MAC viene nascosto nel file<br />
sed -i 's/'$macaddress'/\*script-removed\*/g' "$log"<br />
fi<br />
done<br />
fi<br />
}<br />
<br />
# Invia al log l'output del comando passato come primo parametro e<br />
# con i permessi utente<br />
function _su {<br />
echo "$(su -c "$1" $utente)" >> "$log"<br />
}<br />
<br />
# Stabilisce la data dell'ultimo aggiornamento effettuato. Viene preso in<br />
# considerazione il file /var/log/apt/history.log oppure il file /var/log/apt/history.log.1.gz<br />
function _lastupd {<br />
local convdate lastdate file=/var/log/apt/history.log<br />
<br />
if [ -f "$file" ]; then<br />
lastdate=$(sed -n '/^Start-Date/h ; $p' "$file" | cut -d ' ' -f 2)<br />
# se il file history.log non contiene la data dell'ultimo aggiornamento, viene utilizzato history.log.1.gz<br />
[ -z "$lastdate" ] && [ -f "${file}.1.gz" ] && lastdate=$(zcat "${file}.1.gz" | sed -n '/^Start-Date/h ; $p' | cut -d ' ' -f 2)<br />
<br />
# variabile che contiene la data in formato "giorno mese anno"<br />
convdate=$(date -d "$lastdate" '+%d %B %Y')<br />
<br />
echo $"Ultimo aggiornamento del sistema: ${convdate}" >> "$log"<br />
fi<br />
}<br />
<br />
# Funzione che effettua l'aggiornamento automatico dello script<br />
function _self_update {<br />
<br />
echo -n "Aggiornare questo script [S/n]? "<br />
local risp<br />
read risp<br />
[ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit || echo "Aggiornamento in corso..."<br />
<br />
# Controlla l'esistenza di wget<br />
[ ! "$(command -v wget)" ] && echo "Impossibile eseguire l'aggiornamento. Installare il pacchetto wget." && _exit<br />
<br />
# Ricava la versione remota dello script<br />
local vers="$(wget -q -O- "$SCRIPTURL" | sed -n '/^readonly VERSIONE.*/{p;q}' | cut -d '"' -f2)"<br />
if [ "$vers" = "" ]; then<br />
echo "Connessione non riuscita" && _exit<br />
fi<br />
<br />
if [ "$vers" = "$VERSIONE" ]; then<br />
echo "Lo script è gia alla versione più recente"<br />
else<br />
echo -n "È disponibile una nuova versione dello script: " && _bold "$vers"<br />
echo -n "Procedere con l'aggiornamento [S/n]? "<br />
read risp<br />
case "$risp" in<br />
[Ss]|"")<br />
local tempfile="$(mktemp)" # viene creato un file temporaneo<br />
# lo script in formato base64 viene copiato nel file temporaneo<br />
wget -q -O- "$SCRIPTURL_BASE64" | sed -n "/^=S=/{n; :a /^==Fine/ ! {p; n; ba}}" | base64 -d | tar xz -O > "$tempfile"<br />
if [ ! -s "$tempfile" ]; then # Controlla se il file è vuoto<br />
echo "Connessione non riuscita"<br />
else<br />
cp "$tempfile" "$PATH_NAME"<br />
[ $? -eq 0 ] && echo "Aggiornamento effettuato" || echo "Aggiornamento fallito"<br />
#rm -f "$tempfile" # Rimuove il file temporaneo<br />
fi ;;<br />
*)<br />
echo "Non è stato eseguito alcun aggiornamento"<br />
esac<br />
fi<br />
}<br />
<br />
# funzione che crea un file con la codifica base64 dello script<br />
# Da utilizzare in caso di aggiornamenti per modificare la pagina<br />
# http://guide.debianizzati.org/index.php/Aiuto:LogScript<br />
function _base64 {<br />
<br />
echo -n "Verrà creato un file con la codifica base64 di questo script. Continuare [S/n]? "<br />
local risp<br />
read risp<br />
[ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit ||<br />
local tempfile="$(mktemp)" # crea un file temporaneo<br />
tar cf - "${BASH_SOURCE[0]}" | gzip -9 | base64 > "$tempfile"<br />
if [ $? -eq 0 ]; then<br />
echo -n "Il file contenente la codifica base64 di questo script è " && _bold "$tempfile"<br />
else<br />
echo "Codifica non riuscita"<br />
fi<br />
# Modifica i permessi del file in modo che possa essere letto da tutti<br />
chmod 444 "$tempfile"<br />
}<br />
<br />
# Funzione che stampa un messaggio che indica i file creati e poi termina lo script<br />
function _exit {<br />
<br />
# se è stato effettuato un update o una codifica base64, stampa solo il messaggio finale<br />
if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then<br />
local complog=""<br />
<br />
if [ -f "$log" ]; then<br />
echo -n $'\nFile contenente il log dello script: '<br />
_bold "$log"<br />
else<br />
echo $'\nNon è stato creato un file di log'<br />
fi<br />
<br />
if [ -f "${log}.xz" ]; then<br />
complog="${log}.xz"<br />
elif [ -f "${log}.bz2" ]; then<br />
complog="${log}.bz2"<br />
elif [ -f "${log}.gz" ]; then<br />
complog="${log}.gz"<br />
fi<br />
<br />
if [ -z "$complog" ]; then <br />
echo "Non è stato creato un file compresso del log"<br />
else<br />
echo -n "File compresso da allegare alla discussione sul forum: "<br />
_bold "$complog"<br />
fi<br />
<br />
if [ -f "$script_debug" ]; then<br />
echo -n "File contenente l'output di debug: "<br />
_bold "$script_debug"<br />
fi<br />
fi<br />
<br />
echo $'Script terminato\n'<br />
_close_debug<br />
<br />
exit 0<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni relative a ciascun problema selezionato<br />
# --------------------------------------------------------------------------<br />
<br />
# Informazioni comuni a tutti i tipi di problema<br />
function _common {<br />
_dmi_decode<br />
_comando "/bin/uname -a"<br />
_file "/etc/debian_version"<br />
_de_wm<br />
_file "/etc/X11/default-display-manager"<br />
_comando "/usr/bin/groups" "su"<br />
_file "/var/log/syslog"<br />
_comando "/bin/systemctl --failed --no-pager"<br />
_comando "/bin/journalctl -x -b --no-pager -p err"<br />
_comando "/bin/journalctl -x -b --no-pager -p warning"<br />
_comando "/bin/journalctl -x -b --no-pager"<br />
_comando "/usr/bin/systemd-cgtop -b --iterations=5"<br />
_comando "/usr/bin/systemd-cgls -l"<br />
_comando "/usr/bin/systemd-delta"<br />
_comando "/bin/dmesg -l err"<br />
_comando "/bin/dmesg -l warn"<br />
_comando "/bin/lsmod"<br />
_comando "/usr/bin/lspci -knn"<br />
_comando "/usr/bin/lsusb"<br />
_comando "/sbin/fdisk -l"<br />
_comando "/sbin/blkid"<br />
_file "/etc/fstab"<br />
_dir "/etc/fstab.d/"<br />
_comando "/bin/findmnt"<br />
_comando "/bin/lsblk"<br />
_comando "/bin/df"<br />
_dir "/etc/modprobe.d/"<br />
_dir "/etc/modules-load.d/"<br />
_file "/etc/modules"<br />
_file "/etc/apt/sources.list"<br />
_dir "/etc/apt/sources.list.d/"<br />
_comando "/usr/bin/apt-cache policy"<br />
_comando "/usr/bin/apt-cache stats"<br />
_comando "/usr/bin/apt-mark showhold"<br />
_comando "/usr/bin/dpkg --audit"<br />
_comando "/usr/bin/dpkg -l"<br />
_comando "/usr/bin/apt-get check"<br />
_firmware<br />
_extpack<br />
_pack "linux-headers"<br />
_pack "linux-image"<br />
_comando "/usr/sbin/dkms status"<br />
}<br />
<br />
# Funzione relativa ai problemi di rete<br />
function _rete {<br />
_common<br />
_file "/etc/network/interfaces"<br />
_dir "/etc/network/interfaces.d/"<br />
_file "/etc/hosts"<br />
_comando "/sbin/ifconfig"<br />
_comando "/sbin/ifconfig -a"<br />
_comando "/sbin/ip -s -d link show"<br />
_comando "/usr/sbin/rfkill list all"<br />
_comando "/bin/ping -c3 -W5 8.8.8.8" #DNS di Google 8.8.8.8<br />
_comando "/bin/ip addr"<br />
_comando "/bin/ip route list"<br />
_comando "/sbin/iwconfig"<br />
_comando "/sbin/iwlist scan"<br />
_comando "/sbin/route -n"<br />
_pack "resolvconf"<br />
_file "/etc/resolv.conf"<br />
_pack "DHCP"<br />
_file "/etc/dhclient.conf"<br />
_file "/etc/NetworkManager/NetworkManager.conf"<br />
_comando "/usr/bin/nmcli dev list"<br />
_comando "/usr/bin/nmcli device show"<br />
_demone "/usr/sbin/NetworkManager" "Network Manager"<br />
_demone "/usr/sbin/wicd" "Wicd"<br />
}<br />
<br />
# Funzione relativa a problemi video<br />
function _video {<br />
_common<br />
_file "/etc/X11/xorg.conf"<br />
_dir "/etc/X11/xorg.conf.d/"<br />
_file "/var/log/Xorg.0.log"<br />
_file "${utente}/.local/share/xorg/Xorg.0.log"<br />
_pack "xserver-xorg"<br />
_pack "nouveau"<br />
_pack "nvidia"<br />
_pack "mesa"<br />
_pack "fglrx"<br />
_pack "amdgpu"<br />
}<br />
<br />
# Funzione relativa ai problemi di avvio del sistema<br />
function _boot {<br />
_common<br />
_file "/etc/default/grub"<br />
_file "/boot/grub/grub.cfg"<br />
_dir "/etc/default/grub.d/"<br />
_dir "/etc/grub.d/"<br />
_file "/boot/grub/device.map"<br />
_comando "/usr/sbin/grub-mkdevicemap"<br />
_pack grub<br />
}<br />
<br />
# Funzione relativa ai problemi audio. Scarica ed esegue lo script ALSA<br />
function _audio {<br />
_common<br />
_pack "alsa"<br />
_nome_e_riga "dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel'"<br />
_prompt "ALSA dmesg"<br />
dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel' >> "$log" && _ok || _error<br />
<br />
local risp alsaurl="http://www.alsa-project.org/alsa-info.sh"<br />
<br />
echo $'\nI log relativi ai problemi audio sono ricavati attraverso lo script di debug'<br />
echo "ALSA prelevabile all'indirizzo: ${alsaurl}"<br />
echo -n $'\nVerrà ora scaricato e eseguito lo script ALSA. Continuare [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
# wget esiste?<br />
if [ ! -f /usr/bin/wget ]; then<br />
echo "Impossibile scaricare lo script ALSA. Installare il pacchetto wget."<br />
return<br />
fi<br />
# Crea un file temporaneo in /tmp che conterrà lo script ALSA<br />
local tempfile=$(mktemp)<br />
# Scarica lo script ALSA<br />
_prompt "Download script ALSA"<br />
wget -q -O "$tempfile" "$alsaurl"<br />
# Se il download riesce...<br />
if [ $? -eq 0 ]; then<br />
_ok "Download script ALSA riuscito"<br />
# Imposta i permessi dello script scaricato<br />
chmod 777 "$tempfile"<br />
_nome_e_riga "Problemi audio"<br />
# rimuove il comando "dmesg" dallo script ALSA<br />
# perché non eseguibile da utente normale (il comando è<br />
# stato inserito a parte in questa funzione)<br />
sed -i "/^$(printf '\t')withdmesg/d" "$tempfile"<br />
# Esegue lo script ALSA<br />
_prompt "Esecuzione script ALSA"<br />
_su "$tempfile --stdout" && _ok || _error<br />
else<br />
_error "Download script ALSA fallito"<br />
fi<br />
<br />
# Rimuove il file temporaneo<br />
rm -- "$tempfile"<br />
;;<br />
*)<br />
echo "Lo script ALSA non è stato ancora eseguito."<br />
echo "Avviare manualmente lo script prelevabile a questo indirizzo:"<br />
_bold "$alsaurl"<br />
echo "Lo script ALSA va eseguito con i permessi di normale utente."<br />
esac<br />
<br />
}<br />
<br />
# Funzione relativa alla gestione dei pacchetti attraverso il sistema APT<br />
function _apt {<br />
_common<br />
_comando "/usr/bin/dpkg --print-architecture"<br />
_comando "/usr/bin/dpkg --print-foreign-architectures"<br />
_comando "/usr/bin/apt-get update"<br />
_comando "/usr/bin/apt-get -s -y upgrade"<br />
_comando "/usr/bin/apt-get -s -y dist-upgrade"<br />
_comando "/usr/bin/apt-get -s -y -f install"<br />
_comando "/usr/bin/apt-get -s -y autoremove"<br />
_comando "/usr/bin/apt-config dump"<br />
_file "/etc/apt/apt.conf"<br />
_dir "/etc/apt/apt.conf.d/"<br />
_file "/etc/apt/preferences"<br />
_dir "/etc/apt/preferences.d/"<br />
}<br />
<br />
# Funzione relativa a problemi di mount/unmount<br />
function _mount {<br />
_common<br />
_comando "/usr/bin/udisksctl dump"<br />
_pack "usbmount"<br />
}<br />
<br />
# Funzione relativa al funzionamento del touchpad<br />
function _tpad {<br />
_common<br />
_pack "xserver-xorg"<br />
_pack "touchpad"<br />
_file "/etc/X11/xorg.conf"<br />
_dir "/etc/X11/xorg.conf.d/"<br />
_file "/var/log/Xorg.0.log"<br />
_comando "/usr/bin/synclient -l" "su"<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni utilizzate per tipo di problema (generiche)<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che invia il contenuto di un file al file di log<br />
# La funzione va richiamata specificando il path completo del file che sarà assegnato a $1<br />
# Il contenuto dei file viene inviato inalterato al file di log. Se si ha necessità di<br />
# modificare questo comportamento, creare una entry nel ciclo "case"<br />
<br />
function _file {<br />
_nome_e_riga "$1"<br />
_prompt "$1"<br />
if [ -f "$1" ]; then<br />
case "$1" in<br />
/etc/fstab)<br />
# Nasconde username, password e dominio di mount CIFS<br />
sed -e "s/\( cifs.*username *= *\)[^,]*/\1\*script-removed\*/" \<br />
-e "s/\( cifs.*password *= *\)[^,]*/\1\*script-removed\*/" \<br />
-e "s/\( cifs.*domain *= *\)[^,]*/\1\*script-removed\*/" "$1" &>> "$log" && _ok || _error ;;<br />
/etc/network/interfaces)<br />
# Nasconde nel log gli ESSID e le password criptate contenute in /etc/network/interfaces<br />
sed -r "s/((wpa-ssid)|(wpa-psk)|(wpa-identity)|(wpa-password)|(wireless-key)).*/\1 \*script-removed\*/" "$1" &>> "$log" && _ok || _error ;;<br />
/var/log/syslog)<br />
# se è installato systemd, il log viene ricavato da "journalctl -x"<br />
if [ $systemd -eq 0 ]; then <br />
# se il file contiene la stringa "rsyslogd.*start" ...<br />
if [ "$(grep -sci 'rsyslogd.*start$' "$1")" -ne 0 ]; then<br />
# ... estrae da syslog tutto il contenuto dall'ultima occorrenza della stringa alla fine del file<br />
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1" >> "$log" && _ok || _error<br />
else<br />
# se syslog non contiene quella stringa, allora si effettuerà la stessa operazione su syslog.1 ($1.1)<br />
# in questo caso l'intero contenuto del file syslog viene inviato al log<br />
cat "$1" &>> "$log" && _ok || _error<br />
_nome_e_riga "$1".1<br />
_prompt "$1".1<br />
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1".1 >> "$log" && _ok || _error<br />
fi<br />
else _error # systemd è installato. I log vengono ricavati da "journalctl -x"<br />
fi ;;<br />
*)<br />
# per tutti i file non specificati sopra...<br />
cat "$1" &>> "$log" && _ok || _error<br />
esac<br />
else<br />
echo "File \"$1\" non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# Invia l'output di un comando al file di log<br />
# La funzione va richiamata specificando il path completo del comando (con eventuali opzioni)<br />
# che sarà assegnato a $1 . L'output dei comandi viene inviato interamente al file di log. Se<br />
# si ha necessità di modificare gli output, creare una entry nel ciclo "case"<br />
# Es. _comando "/usr/bin/apt-get update"<br />
#<br />
# Nel caso in cui il comando debba essere eseguito tramite 'su', richiamare la funzione con<br />
# due parametri:<br />
# $1 = il comando da eseguire attraverso 'su'<br />
# $2 = la stringa 'su'<br />
# Es. _comando "/usr/bin/groups" "su"<br />
<br />
function _comando {<br />
<br />
local var=${1##*/} # var conterrà il comando ($1) con le opzioni ma privo del path<br />
local var2=${1%% *} # var2 conterrà il comando ($1) privo di eventuali opzioni ma con il path<br />
_nome_e_riga "$var"<br />
_prompt "$var"<br />
<br />
if [ -f "$var2" ]; then # il comando esiste?<br />
if [ $# -eq 2 ]; then # Se vi sono 2 parametri, viene chiamata la funzione "_su"<br />
case "$1" in<br />
"/usr/bin/synclient -l")<br />
# se $DISPLAY è vuota, usa :0 (default per il primo server X)<br />
_su "DISPLAY=${DISPLAY:-:0} $1" && _ok || _error ;;<br />
*) <br />
_su "$1" && _ok || _error<br />
esac<br />
else # non viene utilizzato "su"<br />
case "$1" in<br />
# per "iwconfig" e "iwlist scan" gli ESSID non vengono inviati al log<br />
/sbin/iwconfig)<br />
(iwconfig | sed -e '/ESSID:/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error<br />
;;<br />
<br />
"/sbin/iwlist scan")<br />
(iwlist scan | sed -e '/ESSID:.*/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error<br />
;;<br />
<br />
# nasconde gli ESSID visualizzati da "nmcli dev list" (fino a Wheezy)<br />
# L'array PIPESTATUS mostra il codice d'uscita dei comandi della pipe. PIPESTATUS[0] è il codice d'uscita di "nmcli dev list" (0=successo)<br />
"/usr/bin/nmcli dev list")<br />
nmcli dev list 2>/dev/null | sed -r "s/(^AP[[:digit:]]*\.SSID:[[:space:]]*).*/\1\*script removed\*/" >> "$log" && [ "${PIPESTATUS[0]}" -eq 0 ] && _ok || \<br />
( _error && echo "Comando valido solo per Wheezy" >> "$log" ) ;;<br />
<br />
# nasconde gli ESSID visualizzati da "nmcli device show" (da Jessie in poi)<br />
"/usr/bin/nmcli device show")<br />
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 || \<br />
( _error && echo "Comando valido solo per Jessie e versioni superiori" >> "$log" ) ;;<br />
<br />
/bin/dmesg*)<br />
# Il comando viene eseguito solo se è non installato systemd<br />
[ $systemd -eq 0 ] && $1 &>> "$log" && _ok || _error ;;<br />
<br />
"/usr/sbin/grub-mkdevicemap")<br />
local devicemaptempfile="$(mktemp)" && \<br />
grub-mkdevicemap -m "$devicemaptempfile" && \<br />
if [ -f "$devicemaptempfile" ]; then cat "$devicemaptempfile" >> "$log"; fi && _ok || _error ;;<br />
<br />
# lista dei pacchetti con stato diverso da ii<br />
"/usr/bin/dpkg -l")<br />
echo "Elenco dei pacchetti installati con stato diverso da ii" >> "$log"<br />
echo >> "$log"<br />
dpkg -l | egrep -v '^ii' >> "$log" && _ok || _error ;;<br />
<br />
*)<br />
# per tutti gli altri comandi non specificati in precedenza, l'output del comando è inviato inalterato al log<br />
$1 &>> "$log" && _ok || _error<br />
esac <br />
fi<br />
else<br />
echo "Comando \"${var2}\" non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# Funzione che invia il contenuto dei file di una directory al file di log<br />
function _dir {<br />
_nome_e_riga "$1"<br />
_prompt "$1"<br />
<br />
# Se la directory non esiste, stampa un output sul log ed esce.<br />
if [ ! -d "$1" ]; then<br />
echo "La directory non esiste" >> "$log" && _error<br />
return<br />
fi<br />
<br />
local file<br />
# numfile contiene il numero di file contenuti nella directory. Solo primo livello.<br />
local numfile=$(find "$1" -maxdepth 1 -type f | wc -l)<br />
# numdir contiene il numero di sottodirectory contenute nella directory. Solo primo livello.<br />
local numdir=$(find "$1" -maxdepth 1 -type d | wc -l)<br />
<br />
if [ "$numfile" -eq 0 ] && [ "$numdir" -eq 1 ]; then<br />
echo "La directory non contiene file o directory" >> "$log" && _error<br />
else<br />
echo "La directory contiene ${numfile} file e $((numdir - 1)) directory" >> "$log" && _ok<br />
ls -al "$1" >> "$log"<br />
# invia al log il contenuto dei file della directory<br />
for file in "$1"*; do<br />
if [ -f "$file" ]; then<br />
_nome_e_riga "$file"<br />
_prompt "$file"<br />
cat "$file" &>> "$log" && _ok || _error<br />
fi<br />
done<br />
<br />
# Funzione che invia al log il contenuto dei file presenti nelle sottodirectory<br />
# I due cicli "for" sono separati per permettere l'output di un file subito dopo<br />
# la directory a cui appartiene<br />
for file in "$1"*; do<br />
if [ -d "$file" ]; then<br />
_dir "$file/"<br />
fi<br />
done<br />
fi<br />
}<br />
<br />
# Funzione che elenca i pacchetti installati che contengono la parola<br />
# passata come parametro ($1)<br />
<br />
function _pack {<br />
_nome_e_riga "Pacchetti che contengono \"$1\""<br />
_prompt "Nomi di pacchetti con $1"<br />
<br />
# Variabile che contiene i pacchetti trovati<br />
local packages=$(dpkg -l | grep -i "$1")<br />
<br />
if [ -z "$packages" ]; then<br />
echo "Nessun pacchetto installato" >> "$log" && _error<br />
else<br />
echo "$packages" >> "$log" && _ok<br />
fi<br />
}<br />
<br />
# Funzione che verifica l'esistenza e l'esecuzione di alcuni demoni<br />
# Viene chiamata con due parametri:<br />
# $1 - percorso dell'eseguibile<br />
# $2 - nome da visualizzare<br />
# Se si vuol visualizzare la versione del demone, inserire il comando adatto<br />
# all'interno del ciclo 'case', allo stesso modo specificare al suo interno<br />
# anche il nome dello script d'avvio per fermare, avviare, etc il demone<br />
<br />
function _demone {<br />
<br />
# vers = versione del demone ; var = nome dello script d'avvio del demone<br />
local vers="" var=""<br />
_nome_e_riga "$2"<br />
_prompt "$2"<br />
if [ -f "$1" ]; then<br />
case "$1" in<br />
/usr/sbin/NetworkManager)<br />
vers=$(NetworkManager --version)<br />
var="network-manager"<br />
;;<br />
/usr/sbin/wicd)<br />
vers=$(wicd -h | head -2 | tail -1)<br />
var="wicd"<br />
;;<br />
esac<br />
<br />
echo "$2 è installato (versione "$vers")" >> "$log" && _ok<br />
invoke-rc.d "$var" status &>/dev/null<br />
[ $? -eq 0 ] && echo "$2 è in esecuzione" >> "$log" || echo "$2 non è in esecuzione" >> "$log"<br />
else<br />
echo "$2 non è installato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni utilizzate per tipo di problema (particolari)<br />
# --------------------------------------------------------------------------<br />
<br />
# comando 'cat /sys/class/dmi/id/{sys_vendor,product_name,product_version,bios_version}'<br />
function _dmi_decode {<br />
local var="/sys/class/dmi/id/*"<br />
_nome_e_riga "$var"<br />
_prompt "$var"<br />
if [ -f /sys/class/dmi/id/sys_vendor ]; then<br />
echo "Produttore: $(cat /sys/class/dmi/id/sys_vendor)" &>> "$log"<br />
echo "Prodotto: $(cat /sys/class/dmi/id/product_name)" &>> "$log"<br />
echo "Versione: $(cat /sys/class/dmi/id/product_version)" &>> "$log"<br />
echo "BIOS vers.: $(cat /sys/class/dmi/id/bios_version)" &>> "$log" && _ok || _error<br />
else<br />
echo "File /sys/class/dmi/id/sys_vendor non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# esistenza di pacchetti contenenti firmware e firmware presente sulla macchina<br />
function _firmware {<br />
local i var="Firmware"<br />
_prompt "$var"<br />
_nome_e_riga "$var"<br />
dpkg -l | grep -i firmware >> "$log" && _ok || _error<br />
echo >> "$log"<br />
<br />
# Elenca i file contenuti nelle directory specificate<br />
for i in "/usr/lib/firmware" "/usr/local/lib/firmware" "/lib/firmware" "/run/udev/firmware-missing"; do<br />
if [ -d "$i" ]; then<br />
echo "Contenuto di ${i}" >> "$log"<br />
ls -alR "$i" >> "$log"<br />
else<br />
echo "${i} non trovata" >> "$log"<br />
fi<br />
echo >> "$log"<br />
done<br />
}<br />
<br />
# Stampa sullo standard output l'eseguibile associato a x-session-manager (il default)<br />
function _x_session_manager {<br />
update-alternatives --query "x-session-manager" |<br />
awk '$1 ~ /^Value:$/ { print $2; exit 0 }'<br />
}<br />
<br />
# Stampa sullo standard output l'eseguibile associato a x-window-manager (il default)<br />
function _x_window_manager {<br />
update-alternatives --query "x-window-manager" |<br />
awk '$1 ~ /^Value:$/ { print $2; exit 0 }'<br />
}<br />
<br />
# Stampa la lista dei pacchetti installati che soddisfano una data dipendenza<br />
# con versione (del programma e in Debian) e archivio di provenienza<br />
# Viene chiamata con un parametro:<br />
# $1 - nome della dipendenza<br />
function _soddisfa {<br />
echo "Installati (${1}):"<br />
aptitude search '?installed?provides('"$1"')' --disable-columns \<br />
--display-format "- %p (versione: %v; archivio: %t)"<br />
}<br />
<br />
# Restituisce un exit status di 0 solo se l'eseguibile con il nome scelto è in esecuzione da parte dell'utente ($utente)<br />
# Viene chiamata con un parametro:<br />
# $1 - comando di cui controllare l'esecuzione da parte di $utente<br />
function _is_running {<br />
local list_pids_user list_pids_bin pid pid2<br />
list_pids_user=$(ps -U "$utente" -o pid) # lista di interi, separati da spazi, con i PID dei processi avviati da $utente<br />
list_pids_bin=$(pidof -- "$1") # lista di interi, separati da spazi, con i PID dei processi del comando $1<br />
for pid in $list_pids_user; do<br />
for pid2 in $list_pids_bin; do<br />
if [ "$pid" = "$pid2" ]; then<br />
return 0 # trovato<br />
fi<br />
done<br />
done<br />
return 1 # non trovato!<br />
}<br />
<br />
# Funzione che "cerca" di ricavare il nome e la versione del DE/WM utilizzato<br />
function _de_wm {<br />
_nome_e_riga "Desktop Environment - Window Manager"<br />
_prompt "DE/WM"<br />
{<br />
# impostazione di default<br />
echo -n $'Default:\n- x-session-manager: '<br />
_x_session_manager<br />
echo -n "- x-window-manager: "<br />
_x_window_manager<br />
# installati<br />
if [ "$(command -v aptitude)" ]; then<br />
_soddisfa "x-session-manager"<br />
# _soddisfa "x-window-manager" # non essenziale e impiega già tanto<br />
fi<br />
} >> "$log"<br />
# in esecuzione<br />
echo -n "In esecuzione: " >> "$log"<br />
if _is_running "ksmserver"; then<br />
kf5-config -v 2>/dev/null >> "$log" || # KDE5<br />
kde4-config -v 2>/dev/null >> "$log" && _ok || _error # KDE4<br />
elif _is_running "gnome-shell"; then gnome-shell --version >> "$log" && _ok || _error # GNOME Shell<br />
elif _is_running "xfdesktop"; then xfce4-about -V | head -n1 | cut -d ' ' -f2- >> "$log" && _ok || _error # Xfce4<br />
elif _is_running "openbox"; then<br />
if [ "$(_x_session_manager)" != "/usr/bin/openbox-session" ]; then<br />
echo -n "(altro x-session-manager) + " >> "$log" # Session manager (LXDE?) + Openbox<br />
fi<br />
openbox --version | head -n 1 >> "$log" && _ok || _error # Openbox<br />
else<br />
echo "Sconosciuto" >> "$log" && _error # NON TROVATO<br />
fi<br />
}<br />
<br />
# Funzione che elenca i pacchetti non appartenenti alla release di default utilizzata<br />
function _extpack {<br />
<br />
local var="Pacchetti esterni"<br />
_prompt "$var"<br />
<br />
# La funzione termina se aptitude non è installato<br />
if [ ! "$(command -v aptitude)" ]; then<br />
_nome_e_riga "$var"<br />
echo "Aptitude non è installato" >> "$log" && _error<br />
return 1<br />
fi<br />
<br />
local riga indirizzo rel linea release=""<br />
<br />
# variabile con il contenuto del file sources.list (solo righe che iniziano con deb<br />
# e che contengono "main" )<br />
local sourceslist="$(sed -e '/^deb /!d' -e '/.* main.*/!d' /etc/apt/sources.list)"<br />
<br />
# variabile che contiene l'output del comando "apt-cache policy"<br />
local aptcachepol="$(apt-cache policy)"<br />
<br />
# ciclo sulle righe della variabile "sourceslist"<br />
while read linea; do<br />
<br />
# variabile che contiene l'URL dell'archivio (es. http://ftp.it.debian.org/debian/)<br />
indirizzo="$(awk '{ print $2 }' <<< "$linea")"<br />
<br />
# sostituisce / con \/ (necessario per il successivo sed)<br />
indirizzo="$(_sed_quote "$indirizzo")"<br />
<br />
# release della riga corrente (es. wheezy o testing o sid)<br />
rel="$(awk '{ print $3 }' <<< "$linea")"<br />
<br />
# controlla che sia un nome di release valido<br />
if [ "$rel" = "oldstable" ] || [ "$rel" = "stable" ] || [ "$rel" = "testing" ] || [ "$rel" = "unstable" ] ||<br />
[ "$rel" = "$OLDSTABLE" ] || [ "$rel" = "$STABLE" ] || [ "$rel" = "$TESTING" ] || [ "$rel" = "sid" ] ||<br />
[ "$rel" = "oldoldstable" ] || [ "$rel" = "$OLDOLDSTABLE" ]; then<br />
<br />
# controlla che sia un repository di Debian<br />
# si basa sull'output di "apt-cache policy" e su o=Debian e l=Debian<br />
riga="$(echo "$aptcachepol" | sed -n '/'$indirizzo'*.*'$rel'\/main.*Packages$/ {N; /.*o=Debian,.*l=Debian,/p}')"<br />
<br />
# se è un archivio valido, aggiorna la variabile "release"<br />
if [ ! -z "$riga" ]; then<br />
if [ -z "$release" ]; then<br />
release="$rel"<br />
else<br />
release="$(printf %b "$release\n$rel")"<br />
fi<br />
fi<br />
fi<br />
done <<< "$sourceslist"<br />
<br />
# Lo script DEVE rilevare almeno una release. Se la variabile "release" è nulla, c'è un errore in "sources.list"<br />
# oppure non è stato eseguito un aggiornamento della lista dei pacchetti (update)<br />
# (vedere anche il modo in cui viene ricavata la variabile "release" in alto)<br />
if [ -z "$release" ]; then<br />
_nome_e_riga "${var} all'archivio \"NON RILEVATO!\""<br />
echo "Release non rilevata. Repository errati oppure è necessaria una modifica dello script" >> "$log" && _error<br />
return 1<br />
fi<br />
<br />
# Rimuove eventuali duplicati (esistono repository doppi in sources.list)<br />
release="$(echo "$release" | sort -u)"<br />
<br />
# Numero di release trovate<br />
local num=$(echo "$release" | wc -l)<br />
<br />
# Se il numero di release è diverso da 1 (pinning?), la funzione termina<br />
if [ "$num" -ne 1 ]; then<br />
_nome_e_riga "$var"<br />
echo "Sono presenti ${num} release in sources.list" >> "$log" && _error<br />
return<br />
fi<br />
<br />
local pkg=""<br />
<br />
# Se il numero di release è uguale a 1, la variabile pkg conterrà i pacchetti *non* facenti parte della release<br />
case "$release" in<br />
"$OLDOLDSTABLE"|oldoldstable)<br />
release="oldoldstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aoldoldstable') ;;<br />
"$OLDSTABLE"|oldstable)<br />
release="oldstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aoldstable') ;;<br />
"$STABLE"|stable)<br />
release="stable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Astable') ;;<br />
"$TESTING"|testing)<br />
release="testing"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Atesting') ;;<br />
sid|unstable) <br />
release="unstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aunstable') ;;<br />
esac<br />
<br />
# Invia al log il contenuto di pkg (se esiste)<br />
_nome_e_riga "${var} all'archivio \"${release}\""<br />
if [ -z "$pkg" ]; then<br />
echo "Nessun pacchetto esterno installato" >> "$log" && _error<br />
else<br />
if [ "$(command -v column)" ]; then<br />
echo "$pkg" | column -t >> "$log" && _ok<br />
else<br />
echo "$pkg" >> "$log" && _ok<br />
fi<br />
fi<br />
}<br />
<br />
<br />
# --------------------------------------------------------------------------<br />
# Main<br />
# --------------------------------------------------------------------------<br />
clear<br />
<br />
_intro<br />
<br />
if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then<br />
_debug<br />
_avvertenze<br />
_check<br />
_scelta<br />
_hide<br />
_upload<br />
_compress<br />
elif [ "$UPDATE" -eq 1 ]; then<br />
_self_update<br />
elif [ "$BASE64" -eq 1 ]; then<br />
_base64<br />
fi<br />
<br />
_exit<br />
</syntaxhighlight><br />
<br />
== Changelog ==<br />
<!-- 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) --><br />
;1.0.71<br />
:''Aggiunti "apt-mark showhold" e "dpkg -l" (solo per pacchetti con stato != ii)''<br />
:''Gestita la mancanza di column''<br />
:''Corretto typo "OLDOLDSTABLE" -> "$OLDOLDSTABLE"''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 08:54, 10 apr 2021 (UTC)<br />
;1.0.70<br />
:''Aggiunta oldoldstable''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] ([[Discussioni utente:S3v|discussioni]]) 21:08, 15 mar 2021 (UTC)<br />
;1.0.69<br />
:''http->https per paste.debian.net''<br />
:''Sostituito "which" con "command -v"''<br />
:''Aggiunto _pack "amdgpu"''<br />
:''Aggiunta funzione per quotare stringhe prima di passarle a sed''<br />
:''Rimosso comando "udisks --dump" (non più presente in Debian)''<br />
:''Gestita la mancanza di aptitude''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 13:21, 23 ott 2020 (CEST)<br />
<br />
;1.0.68<br />
:''Nascosti indirizzi MAC delle interfacce wireless''<br />
:''Sovrascrittura del comando cat per evitare che al file di''<br />
:''log venga inviato il contenuto di un file non di testo''<br />
:''Impostata a 'on' l'opzione 'extdebug' per consentire l'espansione''<br />
:''di ARGC per Bash >= 5''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 15:00, 23 mag 2020 (CEST)<br />
;1.0.67<br />
:''Aggiornamento per rilascio di Debian 10 ([[Buster]])''<br />
:[[Utente:HAL 9000|HAL 9000]] 09:39, 7 lug 2019 (CEST)<br />
;1.0.66<br />
:''Aggiunto problema per avvio del sistema (boot)''<br />
:''Aggiunta funzione _su (c'erano problemi con lo script ALSA)''<br />
:''Aggiunte directory <code>/etc/fstab/</code>, <code>/etc/modprobe.d/</code>'',<br />
:''<code>/etc/modules-load.d/</code>, <code>/etc/network/interfaces.d/</code> e il''<br />
:''file <code>/etc/modules</code>''<br />
:''dmesg dello script ALSA spostato nello script''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 10:37, 29 giu 2019 (CEST)<br />
;1.0.65<br />
:''Aggiunti "ip -s -d link show" e Xorg.0.log locale''<br />
:''Nascosti username, password e dominio per montaggi cifs''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 20:49, 20 feb 2018 (CET)<br />
;1.0.64<br />
:''Aggiornamento per rilascio di Debian 9 ([[Stretch]])''<br />
:[[Utente:HAL 9000|HAL 9000]] 10:46, 18 giu 2017 (CEST)<br />
;1.0.63<br />
:''Debug come parametro''<br />
:''KDE5 tra i DE rilevati''<br />
:[[Utente:S3v|S3v]] 22:38, 19 mag 2017 (CEST)<br />
;1.0.62<br />
:''Inserito debug''<br />
:''Inserita funzione _printdot (per evitare ripetizioni)''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 17:41, 26 feb 2017 (CET)<br />
;1.0.61<br />
:''Aggiunta funzione _header() (intestazione del file di log)''<br />
:''Aggiunto parametro "--versione"''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 13:53, 10 dic 2016 (CET)<br />
;1.0.60<br />
:''Elenco ricorsivo delle directory contenenti firmware''<br />
:''Nascosti (altri) ID di connessioni gestite da NM''<br />
:[[Utente:S3v|S3v]] 20:53, 6 dic 2016 (CET)<br />
;1.0.59<br />
:''Modificata funzione _hide() per nascondere completamente hostname contenuto nel''<br />
:''nome utente (e viceversa)''<br />
:[[Utente:S3v|S3v]] 21:33, 11 nov 2016 (CET)<br />
;1.0.58<br />
:''Rimossa precedente istruzione e modificata regexp per far funzionare la ricerca di''<br />
:''pacchetti esterni sia su stable che su testing''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 16:44, 10 lug 2016 (CEST)<br />
;1.0.57<br />
:''Istruzione per rimuovere eventuale slash alla fine dell'URL in "sources.list"''<br />
:''Aggiunti comandi "systemd-cgtop -b --iterations=5", "systemd-cgls" e "systemd-delta" a problemi comuni''<br />
:[[Utente:S3v|S3v]] 21:27, 9 lug 2016 (CEST)<br />
;1.0.56<br />
:''Rimosse dal file interfaces anche le chiavi relative a wep e a wpa-enterprise''<br />
:[[Utente:metaldaze|metaldaze]] 12:54, 04 feb 2016 (CET)<br />
;1.0.55<br />
:''Opzioni per aggiornare lo script o crearne una codifica base64''<br />
:''Corretti ESSID in "nmcli device show" non nascosti''<br />
:''Rimozione duplicati in "release" (pacchetti esterni)''<br />
:[[Utente:S3v|S3v]] 21:26, 15 giu 2015 (CEST)<br />
;1.0.54<br />
:''Correzioni minori legate alla compressione xz; semplificata lettura nome utente in caso di errori con logname''<br />
:[[Utente:HAL 9000|HAL 9000]] 18:41, 31 mag 2015 (CEST)<br />
;1.0.53<br />
:''Vengono rimosse dalla variabile "release" (pacchetti esterni) le linee duplicate''<br />
:[[Utente:S3v|S3v]] 18:22, 30 mag 2015 (CEST)<br />
;1.0.52<br />
:''Aggiunta compressione xz, se disponibile, con ripiego su bzip2 oppure gzip''<br />
:[[Utente:HAL 9000|HAL 9000]] 22:15, 17 mag 2015 (CEST)<br />
;1.0.51<br />
:''Aggiunti comandi "systemctl --failed", "journal -x -b --no-pager [-p [err, warning]]",''<br />
:''"blkid", "lsblk", "dpkg --audit"''<br />
:''"/var/log/syslog" e "dmesg" solo se non è installato systemd''<br />
:''Aggiunta variabile globale "oldstable" e aggiornate "testing" e "stable"''<br />
:''Modifiche minori''<br />
:[[Utente:HAL 9000|HAL 9000]] e [[Utente:S3v|S3v]] 17:12, 4 mag 2015 (CEST)<br />
;1.0.50<br />
:''Rivista la funzione _extpack (repository Debian''<br />
:''in base al comando "apt-cache policy")''<br />
:[[Utente:S3v|S3v]] 22:37, 22 dic 2014 (CET)<br />
;1.0.49<br />
:''Aggiunti trap INT e "dpkg --print-foreign-architectures"''<br />
:''Spostato "dkms status" nei comandi generali''<br />
:[[Utente:S3v|S3v]] 21:19, 20 dic 2014 (CET)<br />
;1.0.48<br />
:''Corretta la ricerca per i pacchetti esterni''<br />
:''Aggiunto _pack "linux-image"''<br />
:[[Utente:S3v|S3v]] 20:16, 19 nov 2014 (CET)<br />
;1.0.47<br />
:''Inseriti "nmcli dev list" (per Wheezy) e "nmcli device show" (per Jessie e superiori)''<br />
:''Inserito "udisksctl dump"''<br />
:[[Utente:S3v|S3v]] 15:55, 5 nov 2014 (CET)<br />
<br />
(Prosegue nella pagina di [[Discussione:Creazione automatica di un file di log per inviare quesiti al forum|discussione]]).<br />
<br />
{{Autori<br />
|Autore=[[Utente:S3v|S3v]] 23:38, 13 apr 2013 (CEST)<br />
}}<br />
<br />
[[Categoria: Bash Scripting]][[Categoria: Configurazione ethernet]][[Categoria: Configurazione wireless]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&diff=44376Creazione automatica di un file di log per inviare quesiti al forum2021-04-10T09:25:56Z<p>S3v: </p>
<hr />
<div><!-- <br />
NOTA DI COMMENTO RELATIVA A OGNI NUOVO RILASCIO DI DEBIAN:<br />
<br />
* modificare il codename nella riga "#ifeq" sottostante con quello della nuova stable, dopo aver aggiornato questa guida.<br />
* In caso contrario sarà mostrato un messaggio di avvertenza al posto del template "Versioni compatibili".<br />
* Il codename *deve* essere scritto tutto minuscolo (per esempio: jessie).<br />
<br />
--><br />
{{#ifeq: {{Codename|stable|IN_TEMPLATE}} | buster | <br />
{{Versioni compatibili}} |<br />
{{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. }}<br />
}} <br/><br />
<br />
== Introduzione ==<br />
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 [http://forum.debianizzati.org forum] per tentare di risolverlo insieme.<br/><br />
Le informazioni riguardano i seguenti tipi di problema:<br />
* Connessioni di rete<br />
* Video<br />
* Avvio del sistema (boot)<br />
* Audio (tramite lo script ALSA prelevabile [http://www.alsa-project.org/alsa-info.sh qui])<br />
* Sottosistema di gestione dei pacchetti (APT)<br />
* Mount/unmount di periferiche<br />
* Touchpad<br />
* Altro. Verranno inserite nel log solo informazioni generiche (già presenti nel log creato con tutte le tipologie di problema precedenti).<br />
<br />
Lo script crea due file:<br />
;log_''data'':contiene le informazioni in formato testo<br />
;log_''data''.{xz,bz2,gz}:il file precedente ma in formato compresso. Può essere allegato ad una discussione sul forum<br />
<br />
Se si vuole, attraverso lo script è anche possibile inviare il file direttamente a [https://paste.debian.net 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.<br/><br />
Prima di effettuare l'invio, lo script chiede un esplicito consenso all'utente.<br />
<br />
{{Box|Nota|Lo script è liberamente modificabile.<br/>Per ogni segnalazione, informazione o suggerimento fare riferimento a [http://forum.debianizzati.org/viewtopic.php?f{{=}}13&t{{=}}45098 questa] discussione sul forum.}}<br />
<br />
== Pacchetti opzionali ==<br />
Lo script utilizza alcuni comandi che potrebbero non essere installati di default sulla propria macchina. La loro installazione è del tutto facoltativa e non pregiudica in alcun modo le funzionalità messe a disposizione dallo script.<br><br />
;aptitude:Viene utilizzato per ricavare informazioni quali il gestore di sessione e i pacchetti non appartenenti alla [[release]] di Debian predefinita. Per installarlo:<pre># apt install aptitude</pre><br />
;pastebinit:Permette di usufruire del servizio offerto da paste.debian.net per la condivisione del testo. Per installarlo:<pre># apt install pastebinit</pre><br />
<br />
== Privacy dell'utente ==<br />
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).<br />
<br />
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.<br />
<br />
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''.<br />
<br />
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 [http://forum.debianizzati.org/viewtopic.php?f=13&t=45098 discussione apposita] o all'interno della pagina di discussione.<br />
<br />
== Utilizzo ==<br />
# Eseguire un upgrade del sistema, se possibile, in modo che le informazioni raccolte dallo script siano aggiornate.<br />
# 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 <code>scriptlog-debianizzati.org</code>.<br />
# Assegnare i permessi di esecuzione al file appena creato; ad esempio, da terminale o emulatore di terminale:<pre>$ chmod a+x scriptlog-debianizzati.org</pre>In alternativa, se si preferisce, è possibile eseguire il seguente comando:<pre>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</pre>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.<br />
# Eseguire da terminale (o emulatore di terminale) lo script con i permessi di [[root]]:<pre># ./scriptlog-debianizzati.org</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.<br />
# Leggere le informazioni a video.<br />
<br />
== Parametri dello script ==<br />
Lo script accetta, in maniera facoltativa, alcuni parametri:<br />
;--tipo={rete|video|boot|audio|apt|mount|touchpad|generico}:specifica il tipo di problema<br />
;--nocompress:non crea il file compresso del file di log<br />
;--nopaste:non invia il file di log a paste.debian.net<br />
;--update:aggiorna lo script se esiste una versione recente<br />
;--base64:crea un file contenente la codifica base64 dello script<br />
;--debug:crea un file contenente le informazioni utili per il debug dello script<br />
;--versione:visualizza la versione dello script<br />
;--help:visualizza informazioni sull'utilizzo dei parametri<br />
<br />
'''Esempi:'''<br />
<pre><br />
# ./scriptlog-debianizzati.org --tipo=rete<br />
# ./scriptlog-debianizzati.org --tipo=apt --nocompress --nopaste<br />
# ./scriptlog-debianizzati.org --versione<br />
# ./scriptlog-debianizzati.org --help<br />
</pre><br />
<br />
<!-- commento (leggibile per chi modifica la pagina)<br />
<br />
<br />
*IMPORTANTE*<br />
<br />
Se si modifica lo script è *necessario* seguire le istruzioni alla pagina:<br />
<br />
http://guide.debianizzati.org/index.php/Aiuto:LogScript<br />
<br />
in modo da aggiornare l'archivio in formato Base64<br />
<br />
<br />
--><br />
== Script ==<br />
<syntaxhighlight lang="bash"><br />
#! /bin/bash<br />
<br />
# --------------------------------------------------------------------------<br />
# Impostazioni<br />
# --------------------------------------------------------------------------<br />
<br />
# I file creati saranno leggibili e scrivibili da tutti<br />
umask 0011<br />
<br />
# Intercettazione Ctrl+C<br />
trap _exit INT<br />
<br />
# Abilitazione dell'opzione 'extdebug' necessaria per espandere ARGC in<br />
# Bash 5 e versioni successive<br />
shopt -s extdebug<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni che sovrascrivono comandi<br />
# --------------------------------------------------------------------------<br />
<br />
# Rimpiazza echo ed echo -n, impedendo echo -e e le possibili combinazioni<br />
# Sintassi accettata:<br />
# echo -n "testo" # stampa senza a capo finale<br />
# echo "testo" # stampa con a capo finale<br />
# echo # stampa una riga vuota<br />
function echo {<br />
if [ $# -gt 1 ] && [ "$1" = "-n" ]; then<br />
shift<br />
printf %s "$*"<br />
else<br />
printf %s\\n "$*"<br />
fi<br />
}<br />
<br />
# Sostituisce il comando 'cat' per controllare che al file di log<br />
# venga inviato effettivamente il contenuto di un file di testo<br />
function cat {<br />
if [ "$(file -bL $1)" = 'ASCII text' ]; then<br />
/bin/cat "$1"<br />
else<br />
echo "File non di testo"<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Costanti<br />
# --------------------------------------------------------------------------<br />
<br />
# Versione script<br />
readonly VERSIONE="1.0.71"<br />
<br />
# Path e nome dello script<br />
readonly PATH_NAME="$(readlink -f "${BASH_SOURCE[0]}")"<br />
<br />
# Codename per oldoldstable, oldstable, stable e testing.<br />
# Da modificare nei successivi rilasci di Debian<br />
readonly OLDOLDSTABLE="jessie"<br />
readonly OLDSTABLE="stretch"<br />
readonly STABLE="buster"<br />
readonly TESTING="bullseye"<br />
<br />
# Path dei comandi dello script<br />
readonly PATH="/bin:/sbin:/usr/bin:/usr/sbin"<br />
<br />
# Nome del file di log in base alla data corrente<br />
readonly log="log_$(date '+%d%b_%H%M%S')"<br />
<br />
# Nome del file di debug<br />
readonly script_debug="/tmp/script_debug_$(date '+%d%b_%H%M%S')"<br />
<br />
# File descriptor per il debug<br />
FD=9<br />
<br />
# URL remoto della pagina contenente lo script<br />
readonly SCRIPTURL="http://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&action=edit"<br />
<br />
# URL remoto della pagina contenente lo script codificato in base64<br />
readonly SCRIPTURL_BASE64="http://guide.debianizzati.org/index.php?title=Aiuto:LogScript&action=edit"<br />
<br />
# nome utente<br />
utente=$(logname) &&<br />
[ "$utente" != "root" ] || {<br />
# NOTA: "root" è permesso (solo) se scelto esplicitamente dall'utente<br />
tmputente2=$(getent passwd 1000 2> /dev/null | cut -d ":" -f 1) ||<br />
tmputente2=""<br />
echo -n "Inserisci il tuo nome utente"<br />
if [ -n "$tmputente2" ]; then<br />
echo -n " (lascia vuoto per \"$tmputente2\"): "<br />
else<br />
echo -n ": "<br />
fi<br />
read tmputente &&<br />
tmputente=${tmputente:-$tmputente2} &&<br />
# non può contenere: spazi, tabulazioni, nuove righe; né essere vuota<br />
[ -n "${tmputente##*[[:space:]]*}" ] &&<br />
# deve esistere in /etc/passwd (o equivalente)<br />
getent passwd "$tmputente" > /dev/null 2>&1 || {<br />
echo "Nome utente non valido o non esistente!" >&2<br />
exit 255<br />
}<br />
utente=$tmputente<br />
unset tmputente<br />
unset tmputente2<br />
}<br />
readonly utente<br />
<br />
# nome host<br />
readonly nomehost=$(hostname)<br />
<br />
# Codici stile carattere<br />
readonly ROSSO="\033[01;31m" # colore rosso e grassetto<br />
readonly VERDE="\033[01;32m" # colore verde e grassetto<br />
readonly BOLD="\033[01m" # grassetto<br />
readonly FINE="\033[0m" # reset<br />
<br />
# variabile che vale 1 se systemd è installato<br />
[ "$(ps -o comm= -p 1)" = "systemd" ] && systemd=1 || systemd=0<br />
readonly systemd<br />
<br />
# --------------------------------------------------------------------------<br />
# Sezione relativa ai parametri dello script<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che segnala un errato utilizzo dei parametri e termina lo script<br />
function _parm_err {<br />
echo "Parametri non validi" && _parm_uso<br />
}<br />
<br />
# Messaggio di errore se viene specificato più di un tipo di problema attraverso<br />
# i parametri.<br />
function _parm_tipo_err {<br />
echo "È possibile specificare un solo di tipo di problema" && _parm_uso<br />
}<br />
<br />
# Messaggio visualizzato nel caso in cui venga specificato lo stesso parametro<br />
function _parm_rip_err {<br />
echo "È stato immesso lo stesso parametro" && _parm_uso<br />
}<br />
<br />
# Messaggio visualizzato nel caso in cui --help non sia l'unico parametro specificato<br />
function _parm_uso_err {<br />
echo "Il parametro $1 non deve essere accompagnato da altri parametri" && _parm_uso<br />
}<br />
<br />
# Funzione che stampa informazioni sull'utilizzo dei parametri<br />
function _parm_uso {<br />
printf %b "<br />
Utilizzo dei parametri:<br />
<br />
$BOLD--tipo={rete|video|boot|audio|apt|mount|touchpad|generico}$FINE<br />
utilizzato per specificare un solo tipo di problema.<br />
Es: --tipo=apt<br />
<br />
$BOLD--nocompress$FINE<br />
non viene creato un file compresso del log<br />
<br />
$BOLD--nopaste$FINE<br />
non viene inviato il log a paste.debian.net<br />
<br />
$BOLD--update$FINE<br />
viene aggiornato lo script se è disponibile una nuova versione<br />
<br />
$BOLD--base64$FINE<br />
viene creato un file con la codifica base64 dello script<br />
<br />
$BOLD--debug$FINE<br />
crea un file contenente le informazioni utili per il debug dello script<br />
<br />
$BOLD--versione$FINE<br />
visualizza la versione dello script in esecuzione<br />
<br />
$BOLD--help$FINE<br />
visualizza queste informazioni<br />
<br />
" && exit<br />
}<br />
<br />
# Visualizza la versione corrente dello script<br />
function _showvers {<br />
echo "$VERSIONE" && exit<br />
}<br />
<br />
# Inizializzazione di variabili. La variabile TIPO serve ad evitare ripetizioni<br />
# nel passaggio del parametro tipo=blabla<br />
NOCOMPRESS=0 NOPASTE=0 TIPO=0 TIPO_RETE=0 TIPO_APT=0 TIPO_VIDEO=0 TIPO_BOOT=0<br />
TIPO_AUDIO=0 TIPO_MNT=0 TIPO_TOUCH=0 TIPO_COMM=0 UPDATE=0 BASE64=0<br />
DEBUG=0<br />
<br />
while [ $# -gt 0 ] ; do<br />
case "$1" in<br />
"--base64") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || BASE64=1 ;;<br />
"--update") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || UPDATE=1 ;;<br />
"--nocompress") [ "$NOCOMPRESS" -eq 1 ] && _parm_rip_err || NOCOMPRESS=1 ;;<br />
"--nopaste") [ "$NOPASTE" -eq 1 ] && _parm_rip_err || NOPASTE=1 ;;<br />
"--tipo=rete") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_RETE=1 ;;<br />
"--tipo=apt") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_APT=1 ;;<br />
"--tipo=video") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_VIDEO=1 ;;<br />
"--tipo=boot") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_BOOT=1 ;;<br />
"--tipo=audio") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_AUDIO=1 ;;<br />
"--tipo=mount") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_MNT=1 ;;<br />
"--tipo=touchpad") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_TOUCH=1 ;;<br />
"--tipo=generico") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_COMM=1 ;;<br />
"--debug") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || DEBUG=1 ;;<br />
"--versione") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _showvers ;;<br />
"--help") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _parm_uso ;;<br />
*) _parm_err<br />
esac<br />
shift<br />
done<br />
<br />
# --------------------------------------------------------------------------<br />
# Debug<br />
# --------------------------------------------------------------------------<br />
function _debug {<br />
[ "$DEBUG" -eq 1 ] && [ ! -e /proc/$$/fd/"$FD" ] &&<br />
{<br />
exec {FD}>"$script_debug"<br />
export BASH_XTRACEFD="$FD"<br />
set -x<br />
}<br />
}<br />
<br />
function _close_debug {<br />
set +x<br />
exec {FD}>&-<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni iniziali<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che stampa il messaggio introduttivo<br />
function _intro {<br />
echo "<br />
*********************************************************************************<br />
* www.debianizzati.org *<br />
* *<br />
* Script che crea un log utile alla risoluzione dei problemi più comuni *<br />
* Versione $VERSIONE *<br />
* *<br />
*********************************************************************************"<br />
}<br />
<br />
# Funzione che stampa alcune avvertenze sullo script<br />
function _avvertenze {<br />
local risp<br />
echo "<br />
-- Lo script richiede i permessi di root per essere eseguito<br />
-- Per inviare il log su paste.debian.net è necessario il pacchetto 'pastebinit'<br />
-- L'invio del log a paste.debian.net avverrà solo dopo esplicito consenso<br />
-- Verrà creato un file contenente l'output di questo script<br />
-- Verrà creato un file in formato compresso da inviare al forum"<br />
echo -n "Continuare [S/n]? "<br />
read risp || risp="ERROR"<br />
<br />
# Se non viene premuto "s" o "S" o [Invio], lo script termina<br />
[ -z "$risp" ] || [ "$risp" = "s" ] || [ "$risp" = "S" ] || _exit<br />
}<br />
<br />
# Funzione che esegue un check preliminare<br />
function _check {<br />
if [ $EUID -ne 0 ]; then # Lo script viene lanciato da root?<br />
echo "Lo script deve essere lanciato da root" && _exit<br />
fi<br />
<br />
# Se esiste già un file di log con lo stesso nome oppure file compressi con lo<br />
# stesso nome di quelli che verranno creati, lo script chiede se cancellarli o meno<br />
local risp<br />
if [ -f "$log" ] || [ -f "${log}.xz" ] || [ -f "${log}.bz2" ] || [ -f "${log}.gz" ]; then<br />
echo $'\n'"Esiste già un file ${log}, ${log}.xz, ${log}.bz2 o ${log}.gz nella directory corrente."<br />
echo -n "Sovrascivere [S/n]? "<br />
read risp<br />
case "$risp" in<br />
""|[Ss]) rm -f -- "$log" "${log}.xz" "${log}.bz2" "${log}.gz" > /dev/null 2>&1 ;;<br />
*) exit 1<br />
esac<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni per l'invio del log a paste.debian.net<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione per separare il log in parti per l'invio a paste.debian.net<br />
function _split_and_send { <br />
local paste_url='https://paste.debian.net'<br />
local chunk_prefix='pastebin'<br />
local chunk_num=1<br />
local paste_exit_status=0<br />
local chunkfile pastelink<br />
<br />
# dimensione massima del singolo file da inviare<br />
local chunk_size='60k'<br />
<br />
# termina la funzione se il log è più grande di chunk_size x 4 (numero di parti impostate)<br />
if [ "$(du -k "$log" | cut -f1)" -gt 240 ]; then<br />
echo "Log troppo grande per essere inviato a paste.debian.net"<br />
echo "Allegare il file compresso alla discussione sul forum."<br />
return 1<br />
fi<br />
<br />
# rinomina parti di log preesistenti (se ve ne sono)<br />
# scarta i messaggi di errore (se presenti)<br />
rename "s/${chunk_prefix}/old-${chunk_prefix}-$(date '+%s')/" "$chunk_prefix".* > /dev/null 2>&1<br />
<br />
# dividi il file di log in parti di $chunk_size bytes senza spezzare le linee<br />
# scarta i messaggi di errore (se presenti) per log di dimensione superiore a 10 parti<br />
# (max 10 parti con l'opzione -a)<br />
split -a 1 -d -C "$chunk_size" "$log" "${chunk_prefix}." > /dev/null 2>&1<br />
<br />
# comunica il numero di parti inviate<br />
chunk_num=$(find . -maxdepth 1 -type f -name "${chunk_prefix}.*" -printf x |<br />
wc -c)<br />
if [ "$chunk_num" = 1 ]; then<br />
echo $'\nIl log sarà inviato in un singolo file.'<br />
else<br />
echo $'\n'"Il log sarà inviato in ${chunk_num} parti."<br />
fi<br />
<br />
# invia al massimo 4 parti<br />
echo $'\nIl log è consultabile ai seguenti indirizzi:'<br />
for chunkfile in "${chunk_prefix}."[0-3]; do<br />
<br />
# verifica l'esistenza del file da inviare<br />
if [ -f "$chunkfile" ]; then<br />
<br />
# invia dati tramite pastebinit, l'output d'errore viene soppresso<br />
pastelink=$(pastebinit -a '' -b "$paste_url" -i "$chunkfile" 2>/dev/null)<br />
<br />
if [ $? = 0 ]; then<br />
# invio apparentemente riuscito (pastebinit exit status = 0)<br />
<br />
# controlla URL restituita da pastebinit<br />
case "$pastelink" in<br />
# verifica in caso di URL corretta<br />
"$paste_url"/[0-9]*)<br />
echo ".. inviato ${chunkfile} all'indirizzo ${pastelink}"<br />
;;<br />
# verifica in caso di URL non corretta<br />
*)<br />
echo ".. ${paste_url} ha restituito una URL non valida (${pastelink}) per ${chunkfile}!"<br />
paste_exit_status=1<br />
esac<br />
<br />
else<br />
# Invio fallito (pastebinit exit status = 1)<br />
echo ".. non riuscito invio ${chunkfile}"<br />
paste_exit_status=1<br />
fi<br />
<br />
fi<br />
<br />
done<br />
<br />
# cancella le parti di log inviate<br />
for chunkfile in "./${chunk_prefix}."[0-9]*; do<br />
if [ -f "$chunkfile" ]; then<br />
rm -f -- "$chunkfile"<br />
fi<br />
done<br />
<br />
return $paste_exit_status<br />
}<br />
<br />
# Funzione che invia il log a paste.debian.net<br />
function _upload {<br />
# Nessun invio a paste.debian.net se viene scelto "--nopaste"<br />
[ "$NOPASTE" -eq 1 ] && return<br />
<br />
local risp<br />
# Pastebinit è installato?<br />
if [ ! -f /usr/bin/pastebinit ]; then<br />
echo $'\nNon è possibile inviare il log a paste.debian.net\nIl pacchetto "pastebinit" non è installato.'<br />
return 1<br />
fi<br />
# Invia il file log.txt a paste.debian.net<br />
echo -n $'\nInviare il log a http://paste.debian.net [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
_split_and_send<br />
if [ $? = 0 ]; then<br />
echo $'\nIl log è stato inviato'<br />
else<br />
echo $'\nSi sono verificati errori nell\'invio del log!'<br />
fi<br />
;;<br />
*)<br />
echo "Il log non è stato inviato"<br />
esac<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni di creazione del file compresso e messaggi di successo/fallimento<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzioni richiamate in caso di corretta/scorretta creazione del file compresso<br />
function _compress_ok { echo "File compresso creato correttamente nella directory corrente."; }<br />
<br />
function _compress_err { echo "Errore nella creazione del file compresso."; }<br />
<br />
# Funzione che crea il file compresso<br />
# Prova a creare nell'ordine: un file .xz, un file .bz2 o un file .gz<br />
function _compress {<br />
# La funzione termina se è stato utilizzato il parametro "--nocompress"<br />
[ "$NOCOMPRESS" -eq 1 ] && return<br />
<br />
local risp<br />
echo -n $'\nCreare un file compresso [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
echo "Sta per essere creato un file compresso..."<br />
sleep 1<br />
if [ "$(command -v xz)" ]; then<br />
xz -e < "$log" > "${log}.xz" && _compress_ok || _compress_err<br />
elif [ "$(command -v bzip2)" ]; then<br />
bzip2 -9 < "$log" > "${log}.bz2" && _compress_ok || _compress_err<br />
elif [ "$(command -v gzip)" ]; then<br />
gzip -9 < "$log" > "${log}.gz" && _compress_ok || _compress_err<br />
else<br />
echo "Impossibile effettuare la compressione!" >&2<br />
fi<br />
;;<br />
*)<br />
echo "Non è stato creato un file compresso."<br />
esac<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzione di stampa menù e selezione del problema<br />
# --------------------------------------------------------------------------<br />
<br />
function _scelta {<br />
<br />
# Problemi selezionati in base al parametro passato allo script<br />
[ "$TIPO_RETE" -eq 1 ] && _wait && _header "rete" && _rete && return<br />
[ "$TIPO_VIDEO" -eq 1 ] && _wait && _header "video" && _video && return<br />
[ "$TIPO_BOOT" -eq 1 ] && _wait && _header "boot" && _boot && return<br />
[ "$TIPO_AUDIO" -eq 1 ] && _wait && _header "audio" && _audio && return<br />
[ "$TIPO_APT" -eq 1 ] && _wait && _header "APT" && _apt && return<br />
[ "$TIPO_MNT" -eq 1 ] && _wait && _header "mount-unmount" && _mount && return<br />
[ "$TIPO_TOUCH" -eq 1 ] && _wait && _header "touchpad" && _tpad && return<br />
[ "$TIPO_COMM" -eq 1 ] && _wait && _header "generico" && _common && return<br />
<br />
# La funzione presenta un menù di scelta nel caso non sia stato passato alcun parametro<br />
local num<br />
<br />
clear<br />
_intro<br />
echo "<br />
Selezionare il tipo di problema per il quale verrà generato il file di log<br />
[1] Problemi relativi alle connessioni di rete<br />
[2] Problemi video<br />
[3] Problemi di boot<br />
[4] Problemi audio<br />
[5] Problemi di gestione dei pacchetti (APT)<br />
[6] Problemi di mount/unmount<br />
[7] Problemi di funzionamento del touchpad<br />
[8] Altro tipo di problema<br />
[0] Uscita"<br />
<br />
while true; do<br />
echo -n "Scegliere il numero corrispondente: "<br />
read num<br />
case "$num" in<br />
[1-8]) _wait ;;& # ;;& -> va alla successiva occorrenza del carattere immesso<br />
1) _header "rete" && _rete ;;&<br />
2) _header "video" && _video ;;&<br />
3) _header "boot" && _boot ;;&<br />
4) _header "audio" && _audio ;;&<br />
5) _header "APT" && _apt ;;&<br />
6) _header "mount-unmount" && _mount ;;&<br />
7) _header "touchpad" && _tpad ;;&<br />
8) _header "generico" && _common ;;&<br />
[1-8]) break ;; # Termina il ciclo 'while'<br />
0) _exit ;; # È stato inserito '0' . Uscita dallo script<br />
*) # Tutti gli altri caratteri. Cancella l'input immesso e ripete la domanda<br />
tput cuu1 # in alto di una riga<br />
tput ed # cancella fino alla fine dello schermo<br />
esac<br />
done<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni varie<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che stampa solo parentesi e il nome del comando, prima di eseguirlo<br />
function _prompt {<br />
echo -n "[ ] $*"<br />
}<br />
<br />
# Funzione che stampa un pallino colorato in base al primo parametro<br />
function _printdot {<br />
echo<br />
tput cuu1 # in alto di una riga<br />
tput cuf1 # a destra di uno spazio<br />
printf %b "$1•${FINE}\n" # stampa pallino e va a capo<br />
}<br />
<br />
# Funzione che stampa un pallino di colore verde in caso di comando con output<br />
function _ok { _printdot "${VERDE}"; }<br />
<br />
# Funzione che stampa una pallino rosso in caso di comando privo di output<br />
function _error { _printdot "${ROSSO}"; }<br />
<br />
# Funzione che stampa in grassetto gli argomenti<br />
function _bold {<br />
printf %b "${BOLD}"<br />
echo -n "$*"<br />
printf %b\\n "${FINE}"<br />
}<br />
<br />
# Funzione che invia nel file di log due righe tra le quali viene visualizzato il<br />
# nome del comando (passato come primo parametro della funzione -> $1)<br />
function _nome_e_riga {<br />
echo "<br />
******************************************<br />
$1<br />
******************************************" >> "$log"<br />
}<br />
<br />
# Funzione che stampa un messaggio di attesa<br />
function _wait {<br />
echo $'\nCreazione del log in corso...\n'<br />
}<br />
<br />
# Intestazione del file di log<br />
function _header {<br />
echo "Tipo di problema: $1" >> "$log"<br />
_data<br />
_lastupd <br />
echo "Versione script: $VERSIONE" >> "$log"<br />
}<br />
<br />
# Stampa la data corrente nel file di log<br />
function _data {<br />
echo "Log creato il: $(date '+%d %B %Y alle %H.%M')" >> "$log"<br />
}<br />
<br />
# Quota i caratteri specificati per le parole da nascondere con sed<br />
# Es: abc.def -> abc\.def<br />
function _sed_quote {<br />
# array di caratteri da quotare<br />
local quotearr=("." "/")<br />
<br />
local retstr="$1"<br />
for char in "${quotearr[@]}"; do<br />
retstr="${retstr//$char/\\$char}"<br />
done<br />
echo "$retstr"<br />
}<br />
<br />
# Funzione che nasconde nel log alcune informazioni sensibili<br />
function _hide {<br />
<br />
# Sostituisce il nome utente e il nome host con 'nomeutente' e 'nomehost' se diversi da [dD]ebian<br />
if [[ "$nomehost" =~ .*"$utente".* ]]; then<br />
[ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log"<br />
[ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log"<br />
else<br />
[ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log"<br />
[ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log"<br />
fi <br />
<br />
# Nasconde gli ESSID gestiti attraverso Network Manager<br />
local var file mydir="/etc/NetworkManager/system-connections/"<br />
<br />
if [ -d "$mydir" ]; then # se esiste la directory /etc/NetworkManager/system-connections/ ...<br />
for file in "$mydir"/*; do # ciclo attraverso il contenuto della directory<br />
if [ -f "$file" ]; then # se l'elemento è un file...<br />
var=$(sed -n "s/ssid=//p" "$file") # ... var conterrà l'eventuale ESSID...<br />
if [ -n "$var" ]; then # ... e se è diverso dalla stringa vuota...<br />
sed -i "s/${var}/\*script-removed\*/g" "$log" # ... lo nasconde nel file di log<br />
fi<br />
fi<br />
done<br />
fi<br />
<br />
# Nasconde nel log i nomi delle connessioni gestite da NetworkManager<br />
sed -i -r "s/(NetworkManager.*keyfile.*((parsing)|(read connection))).*/\1 \*script-removed\*/" "$log"<br />
sed -i -r "s/(NetworkManager.*keyfile: new connection.*system-connections\/)(.*)( \(.*,\").*(\"\))/\1\*script-removed\*\3\*script-removed\*\4/g" "$log"<br />
sed -i -r "s/(NetworkManager.*policy: auto-activating connection ').*(')/\1\*script-removed\*\2/g" "$log"<br />
sed -i -r "s/(NetworkManager.*Activation: starting connection ').*(')/\1\*script-removed\*\2/g" "$log"<br />
sed -i -r "s/(NetworkManager.*policy: set ').*(')/\1\*script-removed\*\2/g" "$log"<br />
<br />
# Nasconde l'indirizzo MAC delle interfacce wireless<br />
local interfaces macaddress line<br />
if [ -f /proc/net/wireless ]; then<br />
# array che contiene i nomi delle interfacce wireless<br />
mapfile -s 2 interfaces < <(awk -F'[: ]+' '{ print $2 }' /proc/net/wireless)<br />
<br />
for i in "${interfaces[@]}"; do<br />
# indirizzo MAC dell'interfaccia solo se questa ne ha uno<br />
line="$(ip -br link show $i)"<br />
if [ "$(echo $line | wc -w)" -gt 3 ]; then<br />
macaddress="$(awk '{ print $3 }' <<< $line)"<br />
macaddress="$(_sed_quote $macaddress)"<br />
# l'indirizzo MAC viene nascosto nel file<br />
sed -i 's/'$macaddress'/\*script-removed\*/g' "$log"<br />
fi<br />
done<br />
fi<br />
}<br />
<br />
# Invia al log l'output del comando passato come primo parametro e<br />
# con i permessi utente<br />
function _su {<br />
echo "$(su -c "$1" $utente)" >> "$log"<br />
}<br />
<br />
# Stabilisce la data dell'ultimo aggiornamento effettuato. Viene preso in<br />
# considerazione il file /var/log/apt/history.log oppure il file /var/log/apt/history.log.1.gz<br />
function _lastupd {<br />
local convdate lastdate file=/var/log/apt/history.log<br />
<br />
if [ -f "$file" ]; then<br />
lastdate=$(sed -n '/^Start-Date/h ; $p' "$file" | cut -d ' ' -f 2)<br />
# se il file history.log non contiene la data dell'ultimo aggiornamento, viene utilizzato history.log.1.gz<br />
[ -z "$lastdate" ] && [ -f "${file}.1.gz" ] && lastdate=$(zcat "${file}.1.gz" | sed -n '/^Start-Date/h ; $p' | cut -d ' ' -f 2)<br />
<br />
# variabile che contiene la data in formato "giorno mese anno"<br />
convdate=$(date -d "$lastdate" '+%d %B %Y')<br />
<br />
echo $"Ultimo aggiornamento del sistema: ${convdate}" >> "$log"<br />
fi<br />
}<br />
<br />
# Funzione che effettua l'aggiornamento automatico dello script<br />
function _self_update {<br />
<br />
echo -n "Aggiornare questo script [S/n]? "<br />
local risp<br />
read risp<br />
[ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit || echo "Aggiornamento in corso..."<br />
<br />
# Controlla l'esistenza di wget<br />
[ ! "$(command -v wget)" ] && echo "Impossibile eseguire l'aggiornamento. Installare il pacchetto wget." && _exit<br />
<br />
# Ricava la versione remota dello script<br />
local vers="$(wget -q -O- "$SCRIPTURL" | sed -n '/^readonly VERSIONE.*/{p;q}' | cut -d '"' -f2)"<br />
if [ "$vers" = "" ]; then<br />
echo "Connessione non riuscita" && _exit<br />
fi<br />
<br />
if [ "$vers" = "$VERSIONE" ]; then<br />
echo "Lo script è gia alla versione più recente"<br />
else<br />
echo -n "È disponibile una nuova versione dello script: " && _bold "$vers"<br />
echo -n "Procedere con l'aggiornamento [S/n]? "<br />
read risp<br />
case "$risp" in<br />
[Ss]|"")<br />
local tempfile="$(mktemp)" # viene creato un file temporaneo<br />
# lo script in formato base64 viene copiato nel file temporaneo<br />
wget -q -O- "$SCRIPTURL_BASE64" | sed -n "/^=S=/{n; :a /^==Fine/ ! {p; n; ba}}" | base64 -d | tar xz -O > "$tempfile"<br />
if [ ! -s "$tempfile" ]; then # Controlla se il file è vuoto<br />
echo "Connessione non riuscita"<br />
else<br />
cp "$tempfile" "$PATH_NAME"<br />
[ $? -eq 0 ] && echo "Aggiornamento effettuato" || echo "Aggiornamento fallito"<br />
#rm -f "$tempfile" # Rimuove il file temporaneo<br />
fi ;;<br />
*)<br />
echo "Non è stato eseguito alcun aggiornamento"<br />
esac<br />
fi<br />
}<br />
<br />
# funzione che crea un file con la codifica base64 dello script<br />
# Da utilizzare in caso di aggiornamenti per modificare la pagina<br />
# http://guide.debianizzati.org/index.php/Aiuto:LogScript<br />
function _base64 {<br />
<br />
echo -n "Verrà creato un file con la codifica base64 di questo script. Continuare [S/n]? "<br />
local risp<br />
read risp<br />
[ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit ||<br />
local tempfile="$(mktemp)" # crea un file temporaneo<br />
tar cf - "${BASH_SOURCE[0]}" | gzip -9 | base64 > "$tempfile"<br />
if [ $? -eq 0 ]; then<br />
echo -n "Il file contenente la codifica base64 di questo script è " && _bold "$tempfile"<br />
else<br />
echo "Codifica non riuscita"<br />
fi<br />
# Modifica i permessi del file in modo che possa essere letto da tutti<br />
chmod 444 "$tempfile"<br />
}<br />
<br />
# Funzione che stampa un messaggio che indica i file creati e poi termina lo script<br />
function _exit {<br />
<br />
# se è stato effettuato un update o una codifica base64, stampa solo il messaggio finale<br />
if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then<br />
local complog=""<br />
<br />
if [ -f "$log" ]; then<br />
echo -n $'\nFile contenente il log dello script: '<br />
_bold "$log"<br />
else<br />
echo $'\nNon è stato creato un file di log'<br />
fi<br />
<br />
if [ -f "${log}.xz" ]; then<br />
complog="${log}.xz"<br />
elif [ -f "${log}.bz2" ]; then<br />
complog="${log}.bz2"<br />
elif [ -f "${log}.gz" ]; then<br />
complog="${log}.gz"<br />
fi<br />
<br />
if [ -z "$complog" ]; then <br />
echo "Non è stato creato un file compresso del log"<br />
else<br />
echo -n "File compresso da allegare alla discussione sul forum: "<br />
_bold "$complog"<br />
fi<br />
<br />
if [ -f "$script_debug" ]; then<br />
echo -n "File contenente l'output di debug: "<br />
_bold "$script_debug"<br />
fi<br />
fi<br />
<br />
echo $'Script terminato\n'<br />
_close_debug<br />
<br />
exit 0<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni relative a ciascun problema selezionato<br />
# --------------------------------------------------------------------------<br />
<br />
# Informazioni comuni a tutti i tipi di problema<br />
function _common {<br />
_dmi_decode<br />
_comando "/bin/uname -a"<br />
_file "/etc/debian_version"<br />
_de_wm<br />
_file "/etc/X11/default-display-manager"<br />
_comando "/usr/bin/groups" "su"<br />
_file "/var/log/syslog"<br />
_comando "/bin/systemctl --failed --no-pager"<br />
_comando "/bin/journalctl -x -b --no-pager -p err"<br />
_comando "/bin/journalctl -x -b --no-pager -p warning"<br />
_comando "/bin/journalctl -x -b --no-pager"<br />
_comando "/usr/bin/systemd-cgtop -b --iterations=5"<br />
_comando "/usr/bin/systemd-cgls -l"<br />
_comando "/usr/bin/systemd-delta"<br />
_comando "/bin/dmesg -l err"<br />
_comando "/bin/dmesg -l warn"<br />
_comando "/bin/lsmod"<br />
_comando "/usr/bin/lspci -knn"<br />
_comando "/usr/bin/lsusb"<br />
_comando "/sbin/fdisk -l"<br />
_comando "/sbin/blkid"<br />
_file "/etc/fstab"<br />
_dir "/etc/fstab.d/"<br />
_comando "/bin/findmnt"<br />
_comando "/bin/lsblk"<br />
_comando "/bin/df"<br />
_dir "/etc/modprobe.d/"<br />
_dir "/etc/modules-load.d/"<br />
_file "/etc/modules"<br />
_file "/etc/apt/sources.list"<br />
_dir "/etc/apt/sources.list.d/"<br />
_comando "/usr/bin/apt-cache policy"<br />
_comando "/usr/bin/apt-cache stats"<br />
_comando "/usr/bin/apt-mark showhold"<br />
_comando "/usr/bin/dpkg --audit"<br />
_comando "/usr/bin/dpkg -l"<br />
_comando "/usr/bin/apt-get check"<br />
_firmware<br />
_extpack<br />
_pack "linux-headers"<br />
_pack "linux-image"<br />
_comando "/usr/sbin/dkms status"<br />
}<br />
<br />
# Funzione relativa ai problemi di rete<br />
function _rete {<br />
_common<br />
_file "/etc/network/interfaces"<br />
_dir "/etc/network/interfaces.d/"<br />
_file "/etc/hosts"<br />
_comando "/sbin/ifconfig"<br />
_comando "/sbin/ifconfig -a"<br />
_comando "/sbin/ip -s -d link show"<br />
_comando "/usr/sbin/rfkill list all"<br />
_comando "/bin/ping -c3 -W5 8.8.8.8" #DNS di Google 8.8.8.8<br />
_comando "/bin/ip addr"<br />
_comando "/bin/ip route list"<br />
_comando "/sbin/iwconfig"<br />
_comando "/sbin/iwlist scan"<br />
_comando "/sbin/route -n"<br />
_pack "resolvconf"<br />
_file "/etc/resolv.conf"<br />
_pack "DHCP"<br />
_file "/etc/dhclient.conf"<br />
_file "/etc/NetworkManager/NetworkManager.conf"<br />
_comando "/usr/bin/nmcli dev list"<br />
_comando "/usr/bin/nmcli device show"<br />
_demone "/usr/sbin/NetworkManager" "Network Manager"<br />
_demone "/usr/sbin/wicd" "Wicd"<br />
}<br />
<br />
# Funzione relativa a problemi video<br />
function _video {<br />
_common<br />
_file "/etc/X11/xorg.conf"<br />
_dir "/etc/X11/xorg.conf.d/"<br />
_file "/var/log/Xorg.0.log"<br />
_file "${utente}/.local/share/xorg/Xorg.0.log"<br />
_pack "xserver-xorg"<br />
_pack "nouveau"<br />
_pack "nvidia"<br />
_pack "mesa"<br />
_pack "fglrx"<br />
_pack "amdgpu"<br />
}<br />
<br />
# Funzione relativa ai problemi di avvio del sistema<br />
function _boot {<br />
_common<br />
_file "/etc/default/grub"<br />
_file "/boot/grub/grub.cfg"<br />
_dir "/etc/default/grub.d/"<br />
_dir "/etc/grub.d/"<br />
_file "/boot/grub/device.map"<br />
_comando "/usr/sbin/grub-mkdevicemap"<br />
_pack grub<br />
}<br />
<br />
# Funzione relativa ai problemi audio. Scarica ed esegue lo script ALSA<br />
function _audio {<br />
_common<br />
_pack "alsa"<br />
_nome_e_riga "dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel'"<br />
_prompt "ALSA dmesg"<br />
dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel' >> "$log" && _ok || _error<br />
<br />
local risp alsaurl="http://www.alsa-project.org/alsa-info.sh"<br />
<br />
echo $'\nI log relativi ai problemi audio sono ricavati attraverso lo script di debug'<br />
echo "ALSA prelevabile all'indirizzo: ${alsaurl}"<br />
echo -n $'\nVerrà ora scaricato e eseguito lo script ALSA. Continuare [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
# wget esiste?<br />
if [ ! -f /usr/bin/wget ]; then<br />
echo "Impossibile scaricare lo script ALSA. Installare il pacchetto wget."<br />
return<br />
fi<br />
# Crea un file temporaneo in /tmp che conterrà lo script ALSA<br />
local tempfile=$(mktemp)<br />
# Scarica lo script ALSA<br />
_prompt "Download script ALSA"<br />
wget -q -O "$tempfile" "$alsaurl"<br />
# Se il download riesce...<br />
if [ $? -eq 0 ]; then<br />
_ok "Download script ALSA riuscito"<br />
# Imposta i permessi dello script scaricato<br />
chmod 777 "$tempfile"<br />
_nome_e_riga "Problemi audio"<br />
# rimuove il comando "dmesg" dallo script ALSA<br />
# perché non eseguibile da utente normale (il comando è<br />
# stato inserito a parte in questa funzione)<br />
sed -i "/^$(printf '\t')withdmesg/d" "$tempfile"<br />
# Esegue lo script ALSA<br />
_prompt "Esecuzione script ALSA"<br />
_su "$tempfile --stdout" && _ok || _error<br />
else<br />
_error "Download script ALSA fallito"<br />
fi<br />
<br />
# Rimuove il file temporaneo<br />
rm -- "$tempfile"<br />
;;<br />
*)<br />
echo "Lo script ALSA non è stato ancora eseguito."<br />
echo "Avviare manualmente lo script prelevabile a questo indirizzo:"<br />
_bold "$alsaurl"<br />
echo "Lo script ALSA va eseguito con i permessi di normale utente."<br />
esac<br />
<br />
}<br />
<br />
# Funzione relativa alla gestione dei pacchetti attraverso il sistema APT<br />
function _apt {<br />
_common<br />
_comando "/usr/bin/dpkg --print-architecture"<br />
_comando "/usr/bin/dpkg --print-foreign-architectures"<br />
_comando "/usr/bin/apt-get update"<br />
_comando "/usr/bin/apt-get -s -y upgrade"<br />
_comando "/usr/bin/apt-get -s -y dist-upgrade"<br />
_comando "/usr/bin/apt-get -s -y -f install"<br />
_comando "/usr/bin/apt-get -s -y autoremove"<br />
_comando "/usr/bin/apt-config dump"<br />
_file "/etc/apt/apt.conf"<br />
_dir "/etc/apt/apt.conf.d/"<br />
_file "/etc/apt/preferences"<br />
_dir "/etc/apt/preferences.d/"<br />
}<br />
<br />
# Funzione relativa a problemi di mount/unmount<br />
function _mount {<br />
_common<br />
_comando "/usr/bin/udisksctl dump"<br />
_pack "usbmount"<br />
}<br />
<br />
# Funzione relativa al funzionamento del touchpad<br />
function _tpad {<br />
_common<br />
_pack "xserver-xorg"<br />
_pack "touchpad"<br />
_file "/etc/X11/xorg.conf"<br />
_dir "/etc/X11/xorg.conf.d/"<br />
_file "/var/log/Xorg.0.log"<br />
_comando "/usr/bin/synclient -l" "su"<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni utilizzate per tipo di problema (generiche)<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che invia il contenuto di un file al file di log<br />
# La funzione va richiamata specificando il path completo del file che sarà assegnato a $1<br />
# Il contenuto dei file viene inviato inalterato al file di log. Se si ha necessità di<br />
# modificare questo comportamento, creare una entry nel ciclo "case"<br />
<br />
function _file {<br />
_nome_e_riga "$1"<br />
_prompt "$1"<br />
if [ -f "$1" ]; then<br />
case "$1" in<br />
/etc/fstab)<br />
# Nasconde username, password e dominio di mount CIFS<br />
sed -e "s/\( cifs.*username *= *\)[^,]*/\1\*script-removed\*/" \<br />
-e "s/\( cifs.*password *= *\)[^,]*/\1\*script-removed\*/" \<br />
-e "s/\( cifs.*domain *= *\)[^,]*/\1\*script-removed\*/" "$1" &>> "$log" && _ok || _error ;;<br />
/etc/network/interfaces)<br />
# Nasconde nel log gli ESSID e le password criptate contenute in /etc/network/interfaces<br />
sed -r "s/((wpa-ssid)|(wpa-psk)|(wpa-identity)|(wpa-password)|(wireless-key)).*/\1 \*script-removed\*/" "$1" &>> "$log" && _ok || _error ;;<br />
/var/log/syslog)<br />
# se è installato systemd, il log viene ricavato da "journalctl -x"<br />
if [ $systemd -eq 0 ]; then <br />
# se il file contiene la stringa "rsyslogd.*start" ...<br />
if [ "$(grep -sci 'rsyslogd.*start$' "$1")" -ne 0 ]; then<br />
# ... estrae da syslog tutto il contenuto dall'ultima occorrenza della stringa alla fine del file<br />
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1" >> "$log" && _ok || _error<br />
else<br />
# se syslog non contiene quella stringa, allora si effettuerà la stessa operazione su syslog.1 ($1.1)<br />
# in questo caso l'intero contenuto del file syslog viene inviato al log<br />
cat "$1" &>> "$log" && _ok || _error<br />
_nome_e_riga "$1".1<br />
_prompt "$1".1<br />
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1".1 >> "$log" && _ok || _error<br />
fi<br />
else _error # systemd è installato. I log vengono ricavati da "journalctl -x"<br />
fi ;;<br />
*)<br />
# per tutti i file non specificati sopra...<br />
cat "$1" &>> "$log" && _ok || _error<br />
esac<br />
else<br />
echo "File \"$1\" non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# Invia l'output di un comando al file di log<br />
# La funzione va richiamata specificando il path completo del comando (con eventuali opzioni)<br />
# che sarà assegnato a $1 . L'output dei comandi viene inviato interamente al file di log. Se<br />
# si ha necessità di modificare gli output, creare una entry nel ciclo "case"<br />
# Es. _comando "/usr/bin/apt-get update"<br />
#<br />
# Nel caso in cui il comando debba essere eseguito tramite 'su', richiamare la funzione con<br />
# due parametri:<br />
# $1 = il comando da eseguire attraverso 'su'<br />
# $2 = la stringa 'su'<br />
# Es. _comando "/usr/bin/groups" "su"<br />
<br />
function _comando {<br />
<br />
local var=${1##*/} # var conterrà il comando ($1) con le opzioni ma privo del path<br />
local var2=${1%% *} # var2 conterrà il comando ($1) privo di eventuali opzioni ma con il path<br />
_nome_e_riga "$var"<br />
_prompt "$var"<br />
<br />
if [ -f "$var2" ]; then # il comando esiste?<br />
if [ $# -eq 2 ]; then # Se vi sono 2 parametri, viene chiamata la funzione "_su"<br />
case "$1" in<br />
"/usr/bin/synclient -l")<br />
# se $DISPLAY è vuota, usa :0 (default per il primo server X)<br />
_su "DISPLAY=${DISPLAY:-:0} $1" && _ok || _error ;;<br />
*) <br />
_su "$1" && _ok || _error<br />
esac<br />
else # non viene utilizzato "su"<br />
case "$1" in<br />
# per "iwconfig" e "iwlist scan" gli ESSID non vengono inviati al log<br />
/sbin/iwconfig)<br />
(iwconfig | sed -e '/ESSID:/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error<br />
;;<br />
<br />
"/sbin/iwlist scan")<br />
(iwlist scan | sed -e '/ESSID:.*/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error<br />
;;<br />
<br />
# nasconde gli ESSID visualizzati da "nmcli dev list" (fino a Wheezy)<br />
# L'array PIPESTATUS mostra il codice d'uscita dei comandi della pipe. PIPESTATUS[0] è il codice d'uscita di "nmcli dev list" (0=successo)<br />
"/usr/bin/nmcli dev list")<br />
nmcli dev list 2>/dev/null | sed -r "s/(^AP[[:digit:]]*\.SSID:[[:space:]]*).*/\1\*script removed\*/" >> "$log" && [ "${PIPESTATUS[0]}" -eq 0 ] && _ok || \<br />
( _error && echo "Comando valido solo per Wheezy" >> "$log" ) ;;<br />
<br />
# nasconde gli ESSID visualizzati da "nmcli device show" (da Jessie in poi)<br />
"/usr/bin/nmcli device show")<br />
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 || \<br />
( _error && echo "Comando valido solo per Jessie e versioni superiori" >> "$log" ) ;;<br />
<br />
/bin/dmesg*)<br />
# Il comando viene eseguito solo se è non installato systemd<br />
[ $systemd -eq 0 ] && $1 &>> "$log" && _ok || _error ;;<br />
<br />
"/usr/sbin/grub-mkdevicemap")<br />
local devicemaptempfile="$(mktemp)" && \<br />
grub-mkdevicemap -m "$devicemaptempfile" && \<br />
if [ -f "$devicemaptempfile" ]; then cat "$devicemaptempfile" >> "$log"; fi && _ok || _error ;;<br />
<br />
# lista dei pacchetti con stato diverso da ii<br />
"/usr/bin/dpkg -l")<br />
echo "Elenco dei pacchetti installati con stato diverso da ii" >> "$log"<br />
echo >> "$log"<br />
dpkg -l | egrep -v '^ii' >> "$log" && _ok || _error ;;<br />
<br />
*)<br />
# per tutti gli altri comandi non specificati in precedenza, l'output del comando è inviato inalterato al log<br />
$1 &>> "$log" && _ok || _error<br />
esac <br />
fi<br />
else<br />
echo "Comando \"${var2}\" non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# Funzione che invia il contenuto dei file di una directory al file di log<br />
function _dir {<br />
_nome_e_riga "$1"<br />
_prompt "$1"<br />
<br />
# Se la directory non esiste, stampa un output sul log ed esce.<br />
if [ ! -d "$1" ]; then<br />
echo "La directory non esiste" >> "$log" && _error<br />
return<br />
fi<br />
<br />
local file<br />
# numfile contiene il numero di file contenuti nella directory. Solo primo livello.<br />
local numfile=$(find "$1" -maxdepth 1 -type f | wc -l)<br />
# numdir contiene il numero di sottodirectory contenute nella directory. Solo primo livello.<br />
local numdir=$(find "$1" -maxdepth 1 -type d | wc -l)<br />
<br />
if [ "$numfile" -eq 0 ] && [ "$numdir" -eq 1 ]; then<br />
echo "La directory non contiene file o directory" >> "$log" && _error<br />
else<br />
echo "La directory contiene ${numfile} file e $((numdir - 1)) directory" >> "$log" && _ok<br />
ls -al "$1" >> "$log"<br />
# invia al log il contenuto dei file della directory<br />
for file in "$1"*; do<br />
if [ -f "$file" ]; then<br />
_nome_e_riga "$file"<br />
_prompt "$file"<br />
cat "$file" &>> "$log" && _ok || _error<br />
fi<br />
done<br />
<br />
# Funzione che invia al log il contenuto dei file presenti nelle sottodirectory<br />
# I due cicli "for" sono separati per permettere l'output di un file subito dopo<br />
# la directory a cui appartiene<br />
for file in "$1"*; do<br />
if [ -d "$file" ]; then<br />
_dir "$file/"<br />
fi<br />
done<br />
fi<br />
}<br />
<br />
# Funzione che elenca i pacchetti installati che contengono la parola<br />
# passata come parametro ($1)<br />
<br />
function _pack {<br />
_nome_e_riga "Pacchetti che contengono \"$1\""<br />
_prompt "Nomi di pacchetti con $1"<br />
<br />
# Variabile che contiene i pacchetti trovati<br />
local packages=$(dpkg -l | grep -i "$1")<br />
<br />
if [ -z "$packages" ]; then<br />
echo "Nessun pacchetto installato" >> "$log" && _error<br />
else<br />
echo "$packages" >> "$log" && _ok<br />
fi<br />
}<br />
<br />
# Funzione che verifica l'esistenza e l'esecuzione di alcuni demoni<br />
# Viene chiamata con due parametri:<br />
# $1 - percorso dell'eseguibile<br />
# $2 - nome da visualizzare<br />
# Se si vuol visualizzare la versione del demone, inserire il comando adatto<br />
# all'interno del ciclo 'case', allo stesso modo specificare al suo interno<br />
# anche il nome dello script d'avvio per fermare, avviare, etc il demone<br />
<br />
function _demone {<br />
<br />
# vers = versione del demone ; var = nome dello script d'avvio del demone<br />
local vers="" var=""<br />
_nome_e_riga "$2"<br />
_prompt "$2"<br />
if [ -f "$1" ]; then<br />
case "$1" in<br />
/usr/sbin/NetworkManager)<br />
vers=$(NetworkManager --version)<br />
var="network-manager"<br />
;;<br />
/usr/sbin/wicd)<br />
vers=$(wicd -h | head -2 | tail -1)<br />
var="wicd"<br />
;;<br />
esac<br />
<br />
echo "$2 è installato (versione "$vers")" >> "$log" && _ok<br />
invoke-rc.d "$var" status &>/dev/null<br />
[ $? -eq 0 ] && echo "$2 è in esecuzione" >> "$log" || echo "$2 non è in esecuzione" >> "$log"<br />
else<br />
echo "$2 non è installato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni utilizzate per tipo di problema (particolari)<br />
# --------------------------------------------------------------------------<br />
<br />
# comando 'cat /sys/class/dmi/id/{sys_vendor,product_name,product_version,bios_version}'<br />
function _dmi_decode {<br />
local var="/sys/class/dmi/id/*"<br />
_nome_e_riga "$var"<br />
_prompt "$var"<br />
if [ -f /sys/class/dmi/id/sys_vendor ]; then<br />
echo "Produttore: $(cat /sys/class/dmi/id/sys_vendor)" &>> "$log"<br />
echo "Prodotto: $(cat /sys/class/dmi/id/product_name)" &>> "$log"<br />
echo "Versione: $(cat /sys/class/dmi/id/product_version)" &>> "$log"<br />
echo "BIOS vers.: $(cat /sys/class/dmi/id/bios_version)" &>> "$log" && _ok || _error<br />
else<br />
echo "File /sys/class/dmi/id/sys_vendor non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# esistenza di pacchetti contenenti firmware e firmware presente sulla macchina<br />
function _firmware {<br />
local i var="Firmware"<br />
_prompt "$var"<br />
_nome_e_riga "$var"<br />
dpkg -l | grep -i firmware >> "$log" && _ok || _error<br />
echo >> "$log"<br />
<br />
# Elenca i file contenuti nelle directory specificate<br />
for i in "/usr/lib/firmware" "/usr/local/lib/firmware" "/lib/firmware" "/run/udev/firmware-missing"; do<br />
if [ -d "$i" ]; then<br />
echo "Contenuto di ${i}" >> "$log"<br />
ls -alR "$i" >> "$log"<br />
else<br />
echo "${i} non trovata" >> "$log"<br />
fi<br />
echo >> "$log"<br />
done<br />
}<br />
<br />
# Stampa sullo standard output l'eseguibile associato a x-session-manager (il default)<br />
function _x_session_manager {<br />
update-alternatives --query "x-session-manager" |<br />
awk '$1 ~ /^Value:$/ { print $2; exit 0 }'<br />
}<br />
<br />
# Stampa sullo standard output l'eseguibile associato a x-window-manager (il default)<br />
function _x_window_manager {<br />
update-alternatives --query "x-window-manager" |<br />
awk '$1 ~ /^Value:$/ { print $2; exit 0 }'<br />
}<br />
<br />
# Stampa la lista dei pacchetti installati che soddisfano una data dipendenza<br />
# con versione (del programma e in Debian) e archivio di provenienza<br />
# Viene chiamata con un parametro:<br />
# $1 - nome della dipendenza<br />
function _soddisfa {<br />
echo "Installati (${1}):"<br />
aptitude search '?installed?provides('"$1"')' --disable-columns \<br />
--display-format "- %p (versione: %v; archivio: %t)"<br />
}<br />
<br />
# Restituisce un exit status di 0 solo se l'eseguibile con il nome scelto è in esecuzione da parte dell'utente ($utente)<br />
# Viene chiamata con un parametro:<br />
# $1 - comando di cui controllare l'esecuzione da parte di $utente<br />
function _is_running {<br />
local list_pids_user list_pids_bin pid pid2<br />
list_pids_user=$(ps -U "$utente" -o pid) # lista di interi, separati da spazi, con i PID dei processi avviati da $utente<br />
list_pids_bin=$(pidof -- "$1") # lista di interi, separati da spazi, con i PID dei processi del comando $1<br />
for pid in $list_pids_user; do<br />
for pid2 in $list_pids_bin; do<br />
if [ "$pid" = "$pid2" ]; then<br />
return 0 # trovato<br />
fi<br />
done<br />
done<br />
return 1 # non trovato!<br />
}<br />
<br />
# Funzione che "cerca" di ricavare il nome e la versione del DE/WM utilizzato<br />
function _de_wm {<br />
_nome_e_riga "Desktop Environment - Window Manager"<br />
_prompt "DE/WM"<br />
{<br />
# impostazione di default<br />
echo -n $'Default:\n- x-session-manager: '<br />
_x_session_manager<br />
echo -n "- x-window-manager: "<br />
_x_window_manager<br />
# installati<br />
if [ "$(command -v aptitude)" ]; then<br />
_soddisfa "x-session-manager"<br />
# _soddisfa "x-window-manager" # non essenziale e impiega già tanto<br />
fi<br />
} >> "$log"<br />
# in esecuzione<br />
echo -n "In esecuzione: " >> "$log"<br />
if _is_running "ksmserver"; then<br />
kf5-config -v 2>/dev/null >> "$log" || # KDE5<br />
kde4-config -v 2>/dev/null >> "$log" && _ok || _error # KDE4<br />
elif _is_running "gnome-shell"; then gnome-shell --version >> "$log" && _ok || _error # GNOME Shell<br />
elif _is_running "xfdesktop"; then xfce4-about -V | head -n1 | cut -d ' ' -f2- >> "$log" && _ok || _error # Xfce4<br />
elif _is_running "openbox"; then<br />
if [ "$(_x_session_manager)" != "/usr/bin/openbox-session" ]; then<br />
echo -n "(altro x-session-manager) + " >> "$log" # Session manager (LXDE?) + Openbox<br />
fi<br />
openbox --version | head -n 1 >> "$log" && _ok || _error # Openbox<br />
else<br />
echo "Sconosciuto" >> "$log" && _error # NON TROVATO<br />
fi<br />
}<br />
<br />
# Funzione che elenca i pacchetti non appartenenti alla release di default utilizzata<br />
function _extpack {<br />
<br />
local var="Pacchetti esterni"<br />
_prompt "$var"<br />
<br />
# La funzione termina se aptitude non è installato<br />
if [ ! "$(command -v aptitude)" ]; then<br />
_nome_e_riga "$var"<br />
echo "Aptitude non è installato" >> "$log" && _error<br />
return 1<br />
fi<br />
<br />
local riga indirizzo rel linea release=""<br />
<br />
# variabile con il contenuto del file sources.list (solo righe che iniziano con deb<br />
# e che contengono "main" )<br />
local sourceslist="$(sed -e '/^deb /!d' -e '/.* main.*/!d' /etc/apt/sources.list)"<br />
<br />
# variabile che contiene l'output del comando "apt-cache policy"<br />
local aptcachepol="$(apt-cache policy)"<br />
<br />
# ciclo sulle righe della variabile "sourceslist"<br />
while read linea; do<br />
<br />
# variabile che contiene l'URL dell'archivio (es. http://ftp.it.debian.org/debian/)<br />
indirizzo="$(awk '{ print $2 }' <<< "$linea")"<br />
<br />
# sostituisce / con \/ (necessario per il successivo sed)<br />
indirizzo="$(_sed_quote "$indirizzo")"<br />
<br />
# release della riga corrente (es. wheezy o testing o sid)<br />
rel="$(awk '{ print $3 }' <<< "$linea")"<br />
<br />
# controlla che sia un nome di release valido<br />
if [ "$rel" = "oldstable" ] || [ "$rel" = "stable" ] || [ "$rel" = "testing" ] || [ "$rel" = "unstable" ] ||<br />
[ "$rel" = "$OLDSTABLE" ] || [ "$rel" = "$STABLE" ] || [ "$rel" = "$TESTING" ] || [ "$rel" = "sid" ] ||<br />
[ "$rel" = "oldoldstable" ] || [ "$rel" = "$OLDOLDSTABLE" ]; then<br />
<br />
# controlla che sia un repository di Debian<br />
# si basa sull'output di "apt-cache policy" e su o=Debian e l=Debian<br />
riga="$(echo "$aptcachepol" | sed -n '/'$indirizzo'*.*'$rel'\/main.*Packages$/ {N; /.*o=Debian,.*l=Debian,/p}')"<br />
<br />
# se è un archivio valido, aggiorna la variabile "release"<br />
if [ ! -z "$riga" ]; then<br />
if [ -z "$release" ]; then<br />
release="$rel"<br />
else<br />
release="$(printf %b "$release\n$rel")"<br />
fi<br />
fi<br />
fi<br />
done <<< "$sourceslist"<br />
<br />
# Lo script DEVE rilevare almeno una release. Se la variabile "release" è nulla, c'è un errore in "sources.list"<br />
# oppure non è stato eseguito un aggiornamento della lista dei pacchetti (update)<br />
# (vedere anche il modo in cui viene ricavata la variabile "release" in alto)<br />
if [ -z "$release" ]; then<br />
_nome_e_riga "${var} all'archivio \"NON RILEVATO!\""<br />
echo "Release non rilevata. Repository errati oppure è necessaria una modifica dello script" >> "$log" && _error<br />
return 1<br />
fi<br />
<br />
# Rimuove eventuali duplicati (esistono repository doppi in sources.list)<br />
release="$(echo "$release" | sort -u)"<br />
<br />
# Numero di release trovate<br />
local num=$(echo "$release" | wc -l)<br />
<br />
# Se il numero di release è diverso da 1 (pinning?), la funzione termina<br />
if [ "$num" -ne 1 ]; then<br />
_nome_e_riga "$var"<br />
echo "Sono presenti ${num} release in sources.list" >> "$log" && _error<br />
return<br />
fi<br />
<br />
local pkg=""<br />
<br />
# Se il numero di release è uguale a 1, la variabile pkg conterrà i pacchetti *non* facenti parte della release<br />
case "$release" in<br />
"$OLDOLDSTABLE"|oldoldstable)<br />
release="oldoldstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aoldoldstable') ;;<br />
"$OLDSTABLE"|oldstable)<br />
release="oldstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aoldstable') ;;<br />
"$STABLE"|stable)<br />
release="stable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Astable') ;;<br />
"$TESTING"|testing)<br />
release="testing"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Atesting') ;;<br />
sid|unstable) <br />
release="unstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aunstable') ;;<br />
esac<br />
<br />
# Invia al log il contenuto di pkg (se esiste)<br />
_nome_e_riga "${var} all'archivio \"${release}\""<br />
if [ -z "$pkg" ]; then<br />
echo "Nessun pacchetto esterno installato" >> "$log" && _error<br />
else<br />
if [ "$(command -v column)" ]; then<br />
echo "$pkg" | column -t >> "$log" && _ok<br />
else<br />
echo "$pkg" >> "$log" && _ok<br />
fi<br />
fi<br />
}<br />
<br />
<br />
# --------------------------------------------------------------------------<br />
# Main<br />
# --------------------------------------------------------------------------<br />
clear<br />
<br />
_intro<br />
<br />
if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then<br />
_debug<br />
_avvertenze<br />
_check<br />
_scelta<br />
_hide<br />
_upload<br />
_compress<br />
elif [ "$UPDATE" -eq 1 ]; then<br />
_self_update<br />
elif [ "$BASE64" -eq 1 ]; then<br />
_base64<br />
fi<br />
<br />
_exit<br />
</syntaxhighlight><br />
<br />
== Changelog ==<br />
<!-- 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) --><br />
;1.0.71<br />
:''Aggiunti "apt-mark showhold" e "dpkg -l" (solo per pacchetti con stato != ii)''<br />
:''Gestita la mancanza di column''<br />
:''Corretto typo "OLDOLDSTABLE" -> "$OLDOLDSTABLE"''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 08:54, 10 apr 2021 (UTC)<br />
;1.0.70<br />
:''Aggiunta oldoldstable''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] ([[Discussioni utente:S3v|discussioni]]) 21:08, 15 mar 2021 (UTC)<br />
;1.0.69<br />
:''http->https per paste.debian.net''<br />
:''Sostituito "which" con "command -v"''<br />
:''Aggiunto _pack "amdgpu"''<br />
:''Aggiunta funzione per quotare stringhe prima di passarle a sed''<br />
:''Rimosso comando "udisks --dump" (non più presente in Debian)''<br />
:''Gestita la mancanza di aptitude''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 13:21, 23 ott 2020 (CEST)<br />
<br />
;1.0.68<br />
:''Nascosti indirizzi MAC delle interfacce wireless''<br />
:''Sovrascrittura del comando cat per evitare che al file di''<br />
:''log venga inviato il contenuto di un file non di testo''<br />
:''Impostata a 'on' l'opzione 'extdebug' per consentire l'espansione''<br />
:''di ARGC per Bash >= 5''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 15:00, 23 mag 2020 (CEST)<br />
;1.0.67<br />
:''Aggiornamento per rilascio di Debian 10 ([[Buster]])''<br />
:[[Utente:HAL 9000|HAL 9000]] 09:39, 7 lug 2019 (CEST)<br />
;1.0.66<br />
:''Aggiunto problema per avvio del sistema (boot)''<br />
:''Aggiunta funzione _su (c'erano problemi con lo script ALSA)''<br />
:''Aggiunte directory <code>/etc/fstab/</code>, <code>/etc/modprobe.d/</code>'',<br />
:''<code>/etc/modules-load.d/</code>, <code>/etc/network/interfaces.d/</code> e il''<br />
:''file <code>/etc/modules</code>''<br />
:''dmesg dello script ALSA spostato nello script''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 10:37, 29 giu 2019 (CEST)<br />
;1.0.65<br />
:''Aggiunti "ip -s -d link show" e Xorg.0.log locale''<br />
:''Nascosti username, password e dominio per montaggi cifs''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 20:49, 20 feb 2018 (CET)<br />
;1.0.64<br />
:''Aggiornamento per rilascio di Debian 9 ([[Stretch]])''<br />
:[[Utente:HAL 9000|HAL 9000]] 10:46, 18 giu 2017 (CEST)<br />
;1.0.63<br />
:''Debug come parametro''<br />
:''KDE5 tra i DE rilevati''<br />
:[[Utente:S3v|S3v]] 22:38, 19 mag 2017 (CEST)<br />
;1.0.62<br />
:''Inserito debug''<br />
:''Inserita funzione _printdot (per evitare ripetizioni)''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 17:41, 26 feb 2017 (CET)<br />
;1.0.61<br />
:''Aggiunta funzione _header() (intestazione del file di log)''<br />
:''Aggiunto parametro "--versione"''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 13:53, 10 dic 2016 (CET)<br />
;1.0.60<br />
:''Elenco ricorsivo delle directory contenenti firmware''<br />
:''Nascosti (altri) ID di connessioni gestite da NM''<br />
:[[Utente:S3v|S3v]] 20:53, 6 dic 2016 (CET)<br />
;1.0.59<br />
:''Modificata funzione _hide() per nascondere completamente hostname contenuto nel''<br />
:''nome utente (e viceversa)''<br />
:[[Utente:S3v|S3v]] 21:33, 11 nov 2016 (CET)<br />
;1.0.58<br />
:''Rimossa precedente istruzione e modificata regexp per far funzionare la ricerca di''<br />
:''pacchetti esterni sia su stable che su testing''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 16:44, 10 lug 2016 (CEST)<br />
;1.0.57<br />
:''Istruzione per rimuovere eventuale slash alla fine dell'URL in "sources.list"''<br />
:''Aggiunti comandi "systemd-cgtop -b --iterations=5", "systemd-cgls" e "systemd-delta" a problemi comuni''<br />
:[[Utente:S3v|S3v]] 21:27, 9 lug 2016 (CEST)<br />
;1.0.56<br />
:''Rimosse dal file interfaces anche le chiavi relative a wep e a wpa-enterprise''<br />
:[[Utente:metaldaze|metaldaze]] 12:54, 04 feb 2016 (CET)<br />
;1.0.55<br />
:''Opzioni per aggiornare lo script o crearne una codifica base64''<br />
:''Corretti ESSID in "nmcli device show" non nascosti''<br />
:''Rimozione duplicati in "release" (pacchetti esterni)''<br />
:[[Utente:S3v|S3v]] 21:26, 15 giu 2015 (CEST)<br />
;1.0.54<br />
:''Correzioni minori legate alla compressione xz; semplificata lettura nome utente in caso di errori con logname''<br />
:[[Utente:HAL 9000|HAL 9000]] 18:41, 31 mag 2015 (CEST)<br />
;1.0.53<br />
:''Vengono rimosse dalla variabile "release" (pacchetti esterni) le linee duplicate''<br />
:[[Utente:S3v|S3v]] 18:22, 30 mag 2015 (CEST)<br />
;1.0.52<br />
:''Aggiunta compressione xz, se disponibile, con ripiego su bzip2 oppure gzip''<br />
:[[Utente:HAL 9000|HAL 9000]] 22:15, 17 mag 2015 (CEST)<br />
;1.0.51<br />
:''Aggiunti comandi "systemctl --failed", "journal -x -b --no-pager [-p [err, warning]]",''<br />
:''"blkid", "lsblk", "dpkg --audit"''<br />
:''"/var/log/syslog" e "dmesg" solo se non è installato systemd''<br />
:''Aggiunta variabile globale "oldstable" e aggiornate "testing" e "stable"''<br />
:''Modifiche minori''<br />
:[[Utente:HAL 9000|HAL 9000]] e [[Utente:S3v|S3v]] 17:12, 4 mag 2015 (CEST)<br />
;1.0.50<br />
:''Rivista la funzione _extpack (repository Debian''<br />
:''in base al comando "apt-cache policy")''<br />
:[[Utente:S3v|S3v]] 22:37, 22 dic 2014 (CET)<br />
;1.0.49<br />
:''Aggiunti trap INT e "dpkg --print-foreign-architectures"''<br />
:''Spostato "dkms status" nei comandi generali''<br />
:[[Utente:S3v|S3v]] 21:19, 20 dic 2014 (CET)<br />
;1.0.48<br />
:''Corretta la ricerca per i pacchetti esterni''<br />
:''Aggiunto _pack "linux-image"''<br />
:[[Utente:S3v|S3v]] 20:16, 19 nov 2014 (CET)<br />
;1.0.47<br />
:''Inseriti "nmcli dev list" (per Wheezy) e "nmcli device show" (per Jessie e superiori)''<br />
:''Inserito "udisksctl dump"''<br />
:[[Utente:S3v|S3v]] 15:55, 5 nov 2014 (CET)<br />
<br />
(Prosegue nella pagina di [[Discussione:Creazione automatica di un file di log per inviare quesiti al forum|discussione]]).<br />
<br />
{{Autori<br />
|Autore=[[Utente:S3v|S3v]] 23:38, 13 apr 2013 (CEST)<br />
}}<br />
<br />
[[Categoria: Bash Scripting]][[Categoria: Configurazione ethernet]][[Categoria: Configurazione wireless]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Aiuto:LogScript&diff=44375Aiuto:LogScript2021-04-10T09:08:54Z<p>S3v: il codice precedente era quello vecchio</p>
<hr />
<div>__NOTOC__<br />
=Contenuto=<br />
Nella sezione successiva '''S''' è riportato in formato base64 un archivio tar compresso con gzip e contenente uno script eseguibile per la [[Creazione automatica di un file di log per inviare quesiti al forum]].<br />
<br />
Dopo ogni modifica dello script del punto precedente, andrà modificato il contenuto della sezione successiva. Si suppone che tale script si chiami <code>scriptlog-debianizzati.org</code>, si procederà come segue:<br />
* creazione di un archivio compresso (con <code>tar</code> e <code>gzip</code>, gli unici comandi essenziali) in formato base64<br />
<pre><br />
# ./scriptlog-debianizzati.org --base64<br />
</pre><br />
* sostituzione del contenuto della sezione successiva con il contenuto del file temporaneo creato;<br />
* aggiornamento della versione corrente dello script, nella riga successiva.<br />
<br />
<br/><br />
'''Versione corrente dello script:''' <code>1.0.71</code><br />
<br />
<!-- *NON* MODIFICARE IL NOME DELLA SEZIONE, deve restare *ESATTAMENTE* com'è --><br />
<br />
=S=<br />
H4sIAMNqcWACA9Q823LTypa8xl/RCINjNrbjQGDvcAwTkrBJFSSZOFAz5aRcitSxe5AloYsJuVTN<br />
43zG1DzNvM7beeZP5ktmrdUXtWQlDDnhVI0LYlnqXr26e93XanV7qZeIOAuiScfnJ8INxfm5m4lu<br />
lEzu3dFnBT4v1tbwu/9ibcX+hqtn/bX+6r3+s5Wnz1afr60+Xb0H956trt1jK/f+Dp88zdyEsXvp<br />
0/mN7X70/P/p58F91jsRYe/ETaeNxgPWubMPANuZxREs77mIQnG3sBE4OxUBZ17CgVxZ6iZuGEYs<br />
4JOJOBGBYJwhZc/lD99lWZ5lopHP3PQzA7LrE4ww44nHM4kjZ5tZEvy22cgSN2ZjfiYytrN7iA03<br />
EIpu5fMgaEWx/NHiZxkwTj5psZB7PAVEhMtinjCexm7o84SzjYM/N5kIAc4bWGa2BrjNeZLisrA0<br />
97CXmPNGOo3ijHVSpkHe+Ya8zUPaDOZNYXmieeLSGkWwcF40A2zvfpsOxCwWLsgUxr1pxLgvvzvh<br />
EwZPuM9DP1K3OKwL7CjQTCp3DXAC2jT0MxRh5sIz5nq0Z5m7Dnc1POZkPM0ih7EHDIhuFrss5SGM<br />
6zLPjSOgltANuOlgWjOrgxeF1zS3P6Z5HrosEROXzfMocxuneehlgKvscdFgTJyyEWvCkk4y1mfH<br />
7NEj+O00+w4bMKcTOuz4JcumPGwg2HQqTjO6ihOY6Sl7mELbxw7c4kHKy0+OjkL98FQ0rnClh8Br<br />
IstF6nEmArWhEWt5btYigoTZZUkUBC6QJBKAG0gW8gUD8Q8Q5jyEyYhwLtwMNuX0FFZZzN0ZBzaR<br />
IOEizOEZdMlD05uWspg+DFjM3mkuU7POyXvW7Ldx5q2N4ebODvQ6A8TsFSBJhL1xiexpyx17i3BC<br />
GEAPac/+TvlkE8VWmN09N3ySbC9lU5w1QHj5URh8Y5+2D4Y7e7vbA6ffXem+gOlD6303mzKc8kwK<br />
nWih2/7G4bvx7sYH6NdcxruBCD+zzims4MWbjeG78XDv48Hm9mjl+MppE8zNCFgOtpQoIgp8+Adz<br />
PQn4E2Zdym8YG9dZhJMu9Nxy2SzyxanwkIBCbskuAWwQgCwRuDVbZEYUOO6934J/w8ONN+8BzX/B<br />
DtwpPdbP0izhmTe1HuonJ6CmeWI9ONweHu7s/olPAqCSb7xYMJ8LLc1uWLWBg9S23kvpb54mPXOB<br />
twjcrlp4m02APRgoS+SewAW9kqHUSBJkkWIAaDdw4M+4uQwtQEn89tB/eDJ++O7hh4fDVrseuBT5<br />
BoZEekx3AdlsFvfsWzeBJkbxuWweJbTVwL5ygLdbgz+w0ceD9yzhswi5meNcYncCMk8xObF8zdIN<br />
Nw929g+h78CZZlm83utNcuHzbtV27AlQfWfdeBq/BqEU8MEmgCCNOXZBgMygmeeOfTHOwzEuAF7i<br />
ggGqYxJACR9/yXkqMjF2g/FplOSzRy7JlwH3Reb87BTgpqRdaKy28PmzmnmNgW22nz/72eltCJjV<br />
+vtoMqTRFlAlHs4zIhP5NWguw4SRFdugFxooKeUDh90H7ZBEUQb6gV1ekiwFetk73FjX97//J27q<br />
DHgpYstpFERtUHYwUx6g4E7jQHhgrkjB7QOlttTQjAEdyetVQGDC8RKWLU2/+qwP5jhbfcV6Pp/3<br />
QuArdsm8HCwSnznrDkqVfhvwaUgtaAFySFhrNbwTpjwRKAyA5rI8sufuaLWADZsFiLImtICxZZIr<br />
UsVGRMlHdscjpw2LYusKq7N8AhqCMdzoAmVccGsGg+aFuV7vWNCvZMMHpHXi/Pt/a9JK+DoD8+5c<br />
PGEgKfNA2ihPWJhHc442wZS/ZOH3/4K9SNEClAYC0xMvhnvw4PFotA6gPL5+fPz4yiErgcaEXQAJ<br />
nAqUfBxptgfCsaf2ahm2+UsOyjlAKG3oUN5La40cZm/p6qtHfU1UWrHuFhtEMwWoAiyHiH5IDODR<br />
fQD0aFV2Q9N4dW0NflzBf72KZki8B1SQsRvurILeNuynGmlGmYL+LR7iLbwDBItfxDJKlQGZg64i<br />
PwAcgAxXquh3sDcc7g2co5WnT0cr/ZdP+zOHLT2ALQwiWNAkQubhbAJGMCAGBoytjLe2rY6rpY5g<br />
uvu8vuMbUGam38wpDMaatm93ds0YRVNom3BoifOboytxQpMDaw23GoxIZPNvsCEzH4WACEFTg+QD<br />
wGRqxSnrkC0/G7BOzKS95agOkrZ09wGRgf6xYikeeevOjaohlx5TwgFfoFzmCqDWBHYzSyqa+q7N<br />
LuX3yIVMOUjdAK13xpME9UEOFASyPSLToUAJrZ9khgqlwMwYuWNoNxsDAOIkyUf7pqvhIuHgksvG<br />
eRpJW/UDuongp5IdDSCQqmBf54KjZRhzTyuqWHz/q7K1MxFT8ziJwDKbwepl4KaiGxkBRAvtbhVH<br />
7FlB9Pu/GS/LGhCwgIFQm5CFXRnw5onMRZq7ASlIEBtg1XhuSorWy4XyK+yJ4YJmpL003lEVbVju<br />
RayB2lF/z6Tmq4HyN2DZ6Ux5ENPWpaBwQGeGwrNA2xOoIgtjVZDdCayezb70W6REJ40APmwEPiSQ<br />
IlovsJ0B0o3Zxbp5lKlYuqAiBNNoJtUP2OOk6euIuQZhQlY7lCegKj/W9lxvNJoo1zodpIjBBZjo<br />
/HIORlF0eQK2yKWb+yK6dOPschblYXaZRbk3jV3/coJ6ElbwqomijtSE0GuPeryO7qpE14Vu2+k6<br />
U4PDKHBD4xNGuIQgLlM9ArEdcRGFhSLjpOqGZCiSt2uDAZ2Z8UUY2hEW1IOheQntlC3YDVFIKxB5<br />
jLa4hiB7E8UloaZ2aYQCl4PU9kUaw34R92EMAa0GV4eEuIEqbdQy1IV5hSxwjW2rzNqyMNXgyPzX<br />
0BCODcXYy7xMUrRnJQeiHrhGvsBWcxrip5+W+iLfgarzciJqa0OQDWvgoDuQldHDTqA6gVXQIpFc<br />
8ql+ZO2kldEvuCKdRl+xscXCTe2UO+URdsAREHIIFRAURleLLnvvWpr7cGd/D3Y9AcYHA5TPwSpH<br />
20PEPBM6roWCCM02pRK4LTmI7E8C8Mbdxu7e5t6H/YPt4XCwAu7A/sbwcBuucAj1NT7YNrfGG/uH<br />
+vLTzta2afNmbw8eNGSbj1s75sGHXdPhcO/j5jv9A0b9ANcf97c2CLrykFYaW9tvPv4J342vU5yr<br />
CXWtgKHxkvkR0hm6yhTxEtK2dzRdO222NDJxCgyRjv7hGOxfK1ZWlq0EBUwWNXyfvXypIUr+uzVE<br />
NTMbYiFbNNRi9QEi/1KGqJUVALN2qS9NOhsqiRCnrSDSFv4InNzn/lIVGJEGSmMFDveqBpZR/wCM<br />
SKWPzwpq6S/ABCl7a5BIdP1FNElf3BqoJN9+FSiqn1vDJC6omTtqs9vPnthpAVFSjLcGimxZs6Ra<br />
z94aruTxBWS12r41XBIXpZUlvQHwbsedUsqUAGqprnD8aZCFtC9gota5NY6FUaUAPgZIS8ZHQJWS<br />
ul5DB/l9UvN37F9tUXjvToEW6lGq/gsKYThN2pISVYzYfUzg9MBw83rNZu/U7znNt1smnMF0wOGM<br />
e+zi7dbVK6dphzMd9TSOkozR6v/T4cHG5vZb8KcRjsyQ8Ix1zujyClVxgZ4XRCm3kMSWv2HLYrxH<br />
nV+QKDAJNaFsgl/suiqjP2Az49MITOr4mNyc224J3ca1kLZM4/FdfxqPGfv69etCaJTd9kMQ7/RD<br />
EIcq/DvlxuhFaz6nqBEF8RMBvkeuc7vG+RDS/QY7ABzBEkiTxTEW4h3gedczv+uPc70T6gZejh7P<br />
HEQqOBLnnDzRGiPbaoFcGkSeG+Dyx8bmbnQ67L3xEEAPTQX3ORM63E0ZJoyBqxQ7+dLgRUxyAV45<br />
dN5HV0UmELTjluYLnht6YSZdTx5eDA75FCN0rEWNT4Cjsxah00J4xnOs8QPlzJPv/66CJ1FcBOEx<br />
GhemPEwJu0+y2aIXZ/yvVpRncZ7hNMnhMat4bW9wo8gjoqGMm+uaVcA0L6ZPSkH6TRhShDk+Hw17<br />
4fFrCpVTlBz3A3Uafg+c7YODvQN8RjHpIbf8YxhqhslgJ3UY/B3i39EOrtXxE8vnVUE0Gf0+B+2B<br />
gFVqY2R+DgjM4s2hujku/K8SCdLeUwABfnmfEalA4HgJt/UDPStS8tsfd7ZgHTi6KjLxAJMr6E7O<br />
L3BDT6jwDJLcaytkXrS1gzrVHjKKQ5jLPIReRBlUZxMB22kl0pG8yKU3gS0Kh0dxnAP0UiRDqIYN<br />
WY9QNJaEEwSyyAPpkgpjZJ2MvS+KtVKMnYce5s8S6BSBagmjKnPKnA2mlQFFs00yzwx3rrpn53V3<br />
T85X625Pzsv5HlrSZusobDnbNQsjez1hZihzCfABYQMVPWlMyoqEe1mUfDNOf9dplBJDQ1n6Iua8<br />
TP8WB9Av5b1KYhQ6OeU4l6NhetxmyQxnBYyplsVejNIS2BNfSMYoixFtRiW9Kb3SlyhLs/GXVDkY<br />
4wVFafBDKffrTBuKBnIMehRCG6Qa3MjKyNUgZUVwQOBmYzf0xyBufXZBIktSMfUa50kwaGFaN13v<br />
9aqAWqaxN83Dz2NgslNxNjDKoPo8zGeDfmUA3LcxhqjzdLBSbk+ETK2wQkMJAl8Ar0lLYoaFTTOX<br />
lj8V4QT1iJQKRpBXEEjFOR+0nq98bjUImMlVuOxUL2xqlhMTxmjNTBKsSUMhUUBhZ+wZW4YJ8UQG<br />
X2ndhSzek8lFXcrj56zzWZO7yg6fYpYJPaTVZyvlNK4WlRMGtmgMSlGNbqluHWNd3FnHhrERBHyi<br />
qKMS0JV1GCL18lSV1uRK4SmuB57O8iQkhjIyOBEgLHG55GSV7AWQOt0p2DKmZLDQBbR6GLWloPWg<br />
OeyIsb+tDA62R5ywc5uUKdXZOGmveWHT1FUvCvxO5V6nKOdIW+0eigz7udN9vCA4DBHNhS/MwhRV<br />
KmZmTWurT76BqlCFcWnMwWpPKOgLVMn5z01RciaMhbUrBSWnOdwX2Npl/RWJBQFenrln5o7UXqaK<br />
suPiihEHwzU4lR2fdTbNIiDqjiVlS0vXda5bGmm6e+QwLZA3ER5OueBnLFUDydFlHUDV53E2RUyy<br />
bzHoXtAbtJvVwR8D7askyhnTtRH689VjHc/iHzMUmjb9upoH1II7ymx10dgzSYiQkiSWaOi2asoe<br />
pBa9DoJGHjC4kuvQdWyuoKZoMEpxFIFc0PtXxQ4EChq2eZDJQLcrGFliIa0tqGDwCMU6ogi8aMlA<br />
EdZs4Gil8/RYRowbMgkOmllmNIKW4shz16qWsoWibZ2YcQoDQwGUU/OxVjhL3JnIlDgmO/+JZXe3<br />
FK2rbCzILZIzsvxSC3AglaI3UmyrxTongIDRNEAWoozQ6itDpG25ZWrjpEn6GkiikJ9LGmcQcDHs<br />
AVoxspwnEXlKfoWNAVkMUvMgGAWfSTCm7lMVTMky0QxXw1oDbKvsHTNNMnqWSvuByVJMmgIjITSy<br />
sLLMxVb27HuwpX8cP243lizidLpdQ42KBnBprlCGtzTR4CODwJXTKOLeNyKCbomNTM3QCi7id8Wm<br />
brESEWXhNBTK27ts2UZDCjsb5/sGs0Xd38dHynLTzIl8ShMgB4mdwpRv3sQ+TcAgj5iZrZeEYaND<br />
2NRhIodXHG4uKACphKQy/qn02laGhYRc5OBur46HYcNV2ucHPCmRssznoo3BssBR6e/mwvRq3EHJ<br />
5tdnbAtzMY+DCGx9VVwHLA7i9Tor06rOkCV2Vi5HhUTrkjkS8YZliCrPAitVzbaXynhea2VxH9dG<br />
16X2LCqpdZx2YUZo4pmijkoIZHFKJMiLoIdTjOAQrZWwIlWzYEgpYnaN7QEjdbOzrG7dC+eLdEgV<br />
O1VsubDuyjdrNcqeWZ1fpr0yRVwVd+AGUauVdY2GU+UmUmS1bFZe6DQUZCYa+ZQpo0mQU3pU9q7u<br />
tyy+tNN6j9u2Mtd6XO1HCRtH5xR+oV+IXoIu2y2Ub2F685KNqKrBox7JNlRW0a9yGYWMDLozlwoC<br />
jCLQCqCX6qsbJ2AHiNS9cfQZPEfrvEExWxV205ClNr4+4vCSlTMUegAqE1IjbEtTQwK5CVMFriLs<br />
KJ694BFhHXyCBSUSpILfihIfbPx1E1WhOIr5ISMp5ufkvAZ1JSvfWw6mdjplXYskUKvMR9ilDOWs<br />
uhGbtVl1JTlrY8RKhmzKuS1W+NxeZshNGWau7aFeV0nU7Wr/kqUB5zHr2zIGfGWswgTxwzpzdnbe<br />
dhbkzdk5Zsz+ot2aV6XwEcYNbZrECKhNQkYW1Yx2ci7i1ZoB6T7r/FE3JoWp/pZBJwC8Zky8fc2Q<br />
k5+ZZlXkOnS2UCk7eVKJgtlUDKUipECgVs3yD4Xtri1lr931Xy93yYdXmRUQMt//ikcZecAL2aCr<br />
4+5YvFqhNLRyXOB3aavofJjGwiUfTx+DsVicqpgyismYvIXkc1Nv4rBSMcFXF0wavJgCqwLTOVTQ<br />
YrnQ+AzvyUtjURmYVBvi3AxTVp+UYdK9a2BibciP8KTikwqeeO86PKk05Ad4yuKTMky6dx3MfUTz<br />
ZpiqTRlmnLHr8Pyw+2OYVM/SyUNZ1yJh0vU1MKnS5AdzN+UsFp4Z/L4OT6wy+dEemVIWCyaKLCDx<br />
inVe1moqxEW5YsmByJGSJ0zVsK4TlvKioHwvD62iZq3AwnxGvowXgNaCb5mfL9KeQ81a0ipeqPZW<br />
FZhfcjwFoJKNND2lZu2DnKP+ccGzqtpeIE9SpjGUolEmUoGxGqNVqzmxRWP01LoF7ZCwG6Nn1k0i<br />
y8Zordxugh61SaMr50KwZSDCdmP0vNyYKKanqKgxelF+qjaDzCxpN2sKaYx+P2Ybga6OtJepMVo5<br />
Zh/RR3YdWm5ZmJglOTeOaZEE8vgkEFwuuAoPovlGxbk+nQWyk0K0g0VOiIJ4olB0o37n9+P2kiRC<br />
VDGPgKjwb+cVQ1sMLTxzXtJlkSctRRXVMqdXdG17KZDYB7jXyEdLPMJgpV6rVq+KBLQEYLXXU6tX<br />
RcZZIq7a65nVqyLFLCFW7bVm9arIKUtMVXs9t3pVJJEliKq9Xli9KrLGEjXVXr9bvSrSxBImdi9F<br />
BydAM58JIJDBobKS8Qi18EA1toguW6WhVmAoigCpTsVpBzpPh4UJKy3WVeRNp/osHWuVfrSXYESs<br />
B2JA3upcgaYv0WWbJt4DPilGPPVpClWWTDaUT+dn3cbSEgVFvTzvUzwSwanT3/Lou27BfTuUdCpC<br />
lZiBq6LkegrrENlpTQrx/EIHFuuw+d+lJIsKP1ScNsWjQyhT9AlfdRT/CZ62wByfUBUrSVA6SJKA<br />
kZkV9ecoo0ag2ljzptob0jbgb9MrHIIosc63km2WYBi/9pANJi38qBgQT0Sazb5mt02TU2qCwivN<br />
Ele2ieSRyKh8rKTZ/59//Y/mBdbzXx2FTvH2BI02Z3P9kob/0zTJz7dO4pX8f/nOA0wuyXi+NWHy<br />
7ItpgxtC5/yual1r6w0Pelx5YLBmtBhfoYE3FoakCFB1VDqWeOOoMIY5MCiZOJlEqAjtYzwnUeBX<br />
j/A0L/AExVWp0ke+JMI0ki+OkNvhXBtADSuH3v1cnWrF5AlGitEQESomWjpVJQJ9iNOifApzp6pC<br />
iVeJUh3eNuYXaMxmv21NFcGN+ZhetVEcz/iJErdGs/8TrcFnfKXc1RsJcmYf40PxmlrvAJGGwIWd<br />
OdssBXhUlhbMAIolHIUtfboE37lQjQQp064Ar7SSKfA8rJhC6wxLk4uJsDG+qwC+AjfN8thnumPl<br />
lRTrzDr2UlmHoZx69b0HVWqxy4bdzN4yLAVQnrUIYKTiFQbs4Rv28J+lkfrwXffhh1Z7Yfh/xEPU<br />
zFJm1ok8VSdCKYxIZghDN/Ui+QIelAcp9wEGHiZzT7yuz0+RzuDyCK9t35f74y8wElfhLjdJ3G/E<br />
7mZYHw8jRZldk0E9oOlg2ek6zOk5bSt4xTMQkgP1UhOZTHETlQnVHanQ3BippsuFvOr1mtind3RE<br />
38ThMj+izyrJdnUEq9eBtonC7bJcs3x0ENP3eH7JJjGwECkGsPBuGetEv6Xq8HA2LfX/tndty20b<br />
aXpvxadoQ/LwMAJpKUnNlhxVSmPJGc3asstynGxFtgoiQAojEuAQpGRHUq73MfZy9jnyYvsf+gg0<br />
SGpiz+4FMZUxBTT+PqAP//H7m/gnP27C86YK4G6injBOyXsfB/Hn+PA9g4WQ0gxlO1U0EPu/im5H<br />
YyJ0O+K9pVtyiyJeAqOOBAZkx30c24/hE6N1NpTOGarkfU/96g0DvW64MhuaoVKV/XBRRVyOq+Hf<br />
dkVKyfUvqu5fOogDdKCmmXSiZiOea0enp8eHLDXOUiuiWZwks5t8eiVeRlk0TEBg5pUE/BxvNONP<br />
cQrLgxARZFlZtMfh6yFJujSRi17QaEh7JAIj0LuB5fdZaH9MR5W/InEBmzcbLfOpMC4OXEuPDKLI<br />
GhPfb/XQhVNyrQiKnzc2VMd8yk0eNZNRwtLxb/9QikrVFr5guPa3WvShMvxKIHrG+73eJFAU20AK<br />
XqFxpdaQXgEoXwNdUjXQF3KpGvwOeM1uFFJKdIgrdzNmwRdkkEzhZLnUKKyDZhJNIyB53zvr8FkU<br />
IrjLdRKfdcxckvXAYDr7mn38GMpa46t+8Z4JfzhTUW2MGLc/ZigCV1XCM5ROFXdCNPQymGL7W+7T<br />
bucq+USfpdMCDmiK3jvtO8JpEmYKtdvtbqd3tiM83TYraKV69qArNxbpbqc6Yc967Va3026JM/hn<br />
+yyAyltnwVm7DU2otuDsK8+9r+2lvbhhk3yU9j/BmQvTPERQnOsI8aSsNoomtqBZU/3u6lUdSOp5<br />
todM2vRL1aO6hDFGK9N05pvt7PLy4JmccCmuvwFi24kb2AlGMPnUvqceJYUYR/0ojskchz57Db1J<br />
cOhVlsx66m3bGKP4GDIbou8/Bbjb891bvYD6JozfVohdux3fim9b0c2VCJ83f94T7//YFM1bljLE<br />
1q64b3raQywRbZOpZH4MPZf9IemzPEJN3cJUyttFwjESKK+gQ888k6/jyCAiGtqeLqaCQNEw5E9s<br />
pW1ptFMmLObO8QVxR/56N9Kb9auyLcuMPJLGvpsef4U9/vbbb5mSqqP8jsVbbpknpvRmZWawgEU7<br />
XSEhK/BrNNyds1n0mhbBpncDbVonv9oP9XYoJQ/p/Yd7oXGIs8S4hVIcKlqQ+7NidSSsj8Vcz+34<br />
+hb8GfY5iFJyNW2f0IF8KXKeSvCg2TAfzbB+BbPAJ6GyBM7yrninglRIaufGwQGYTKVspbTmPThz<br />
elBfL5rMepfAB8AJ3MUhkGEXy8p1d1xzuRKwTIQTVHxNkg4+oh9IcL+OIJskag5/+nyKjjndm70P<br />
p7jnhYdwu3cpnoqtSVO/q3G8YJUizd229IosTPfsnrMzndwllo76tpymluG/MjykGuXwH9V4zWZy<br />
ZAi5sVFh+cDq5C8MCumUuRMLu+7psnItdWCVKt20wqkC6iRGxKAyLctyXjzqc+5L+ZW4StMrI842<br />
eZgtV63gB9+sZad/PKhRbL9V9O8d+V0vUzf8SU54WK8uTY2yl9ciXiSjwTkjJ7ClV6uMDiSlaeLG<br />
oNmhMo5fhu1nYaK3UGSwZAlzs/DePZV3WQt+d6dc/51uWRoTHZT2TPu3Os7CqbgZJmx/flRyVsAH<br />
bVmdx52AlbNJeUy7sEOyRxzvCsZ7Dul1nWAvatibtB9duzAkBFcYuZ9EDSYWwmMCqYnw7yJ8ha6R<br />
GpnQnfIV5FDgIW8nT/9+b0/9AKf+bjswHuhYB8XVeSKwMChQsryJ7W8alcPYPOQspVGVrgmWA8lg<br />
mEprmB4TCkwB0UcBBLqwrzghf/uvJZg5zoDuiUDaqkaxaqNL7zWwJonWDJWXzoMDwtCH6C4I2pbk<br />
wV8UVjRxT/hVx1f4VxsFGC+UDz7Np1GW2La/TeHA5aiNScL8SDr5JI0s5sBPqWZSSbhLa24FvQ/7<br />
p/u92+yp2IsE/LH/HFiaHqwhmF4C7l5E9/dYXjYC5tmdQAx19Gd6Rf49qttBWWp8hGyk9dwSHs0i<br />
ts4kmC6E++jIi0vmqlXWcRuizzdxag+2NH5u4JQjH1F0LXhi7xEHNaxGULdZSSdvl/Ymuz3b7SCU<br />
bEKOTBd9wkFqxwo2yiPi+C+pkGjpkOBM8MAXWTioOBY+BGOK0IHV+T91bDJ21ayltVCENWYrUFgR<br />
cLVXglq1TSLcslsy/evFXhtz7e1VKey6K/yR0l/++Gss30ecz1SeMrgk+wMR+qCgYcUqxzy9jj0L<br />
V3lLy5XgikMG73VUjWJfPrA4VZ1tulS3vXbVipcUPctdKXo2xUtVyoYMUDsjTEuYfDnNcTzvIx24<br />
Tce4zhLAm8UllBVff/2107jVDEJsSYu5HXaeAqw3XYgrSZ//FmuxnWrNboMVSa6N41ZKI73tmKQd<br />
qBCJaa9Pb8a9CuydDm+rI6H62ZU4M54QwnXQKIV6cHC4F8kXDWDPS9NEuv+7Z7fyilDzQsusvlC3<br />
RT6brA1sqoCSUlOtsHWnvbpzpkTDcnqtBLcvfBmL1Lw9XFrz8JfA03aUoGRJc3yKhzuyKhukf2xx<br />
XZfc3wmjUkbh1sfcKpcp8/1UY2u+gwMCVIcC/XwBSga9Wa22Ci5EewT9nzHKnjoQFbP8jOK8bTgh<br />
WRwX5ZMv6aoi/fQwarafRgV5ESrnP+N3+/kjKo5tK6DEupHboCAQ2NRxsHOiAtD3CbUc5/E4hdGC<br />
jSih0ZPaIkLY780pbjaknZqg3gWbbfiEP5ccPD2Nk/ObcanYTzs7UHQQzUezEGWAUfQpHLMqNnAr<br />
U7FSw2k+n8AZGxRzu06lbCk+FXI6lhrKqvL+bAQjPIjgJWCHwywPJ566sPzf8jmwNSN64SNGf5rS<br />
iL0MXMfDX7qJplmaDR/2Ys04SBznsD+c5RN+I52hwyhaAfa/WfrWqBDhaEmpGH1iPa2N4dAZwus1<br />
o6AfY389z0cFHL01VY+KST8V4VWW1RaYFxelZ5jSoTeA+XNV7RM9uxhdpXF5ig4wDQbPzHRq3+vG<br />
PU+rMXh8nM28/QH6vnEYlKhDt3GpJaoC58l8lBQhBi2qp1ZT5ePybdQsFjBz+knRHaXFrES0/Lja<br />
LzWoUDLsR8w3ofljaTE8fYoFpcbRlHXyl7Bf15SLJ1cwS0L0Hp0tLDJaUBHKvQT/I8dmOr5hxw3g<br />
tGaTqH+FP/FfEYyAz/8YsmcNt92+n45hsXkqovkTX40LGbtb5hEdvHPLw5mcr81+Sl68t5I87Kyl<br />
L5mxFapnTCalb1kt4JkmaJcvfPM/HcDxOkiHi56pTbz8eIJSfRgbM0vdIE0HV+kIuA6YachCeBbE<br />
BG12Yf8rEf74jfj3Lv0PJJ3Dk1Mcse/zfAhdkferb0NL0AQSeJ/AqYCcg1oE5U7cLOj/DbW46EeZ<br />
7zETDjNrwqDNYXSNFMsfgJ909SMuf/iXZ68r5+Nlf5QCt9P1kSm5JZRMlPqN6orIxn1Mh5Zc+0ai<br />
UijtJ+aDxskYp7P1Pd1q4cQtuW3UvHaT9mMo/CP+U7tWzFLhkASzUNhxvX6lIMfwMZ8OzTCYReI8<br />
K60PxSD8hM+fdBWTwE+NN02XhKBecQm7CNEqv8Cf9COBPk9DLGHdzvL5dRLN7TsI3xJZN+BstP8c<br />
DEfTj9bf0TgeTuarbjLRtQo7lgYGx4NUev/6x1FyXcBPzS/sccLX6Cb9X7c/GJYG2X6xepDZdysU<br />
ec51x9Gkbg/BYuH4iguqcjQy+GSVUaFghK447UdTlJoxIx1jyBlV68GL0wMbtpDCF0ojJb/GSH4s<br />
20c1YP7mDpqUwOb4bEeER6KJRO/+coj/vTy+K7L45/Pw/R0cv1l8dxlHXWSf+/QLt/BRk3vGTuEB<br />
viyILLn+fQ76xrhEahgZfUkuy2XIAoHdRPgslRUJgT/xXgjt+1vSn5GKjm6gV2G3uAwcMessOyZJ<br />
3wQjlb8HB89PyWDiuoKZr6KEvaa2INOoIOJfci1RaGwgEbSlyYY7LtHYHqkUzKcRAR5xVgqDJFma<br />
Cz4t4IPiiwn5g1TwbKD6Du94cB6oiIUB44t2le2dJpVGLjZPMT0Z9bZBojA165lfi0gZh2bjibaS<br />
Sucwd5EgyY2KmlJrKdXzTb3cPO9LwV1N9cP8JiNoDqscNd6YMEpafPmRA+7PKfU+VlSmaVL0yTFu<br />
o06jKYFccAl4a9fAKxrzRec2LakZrUwPalapV1id+Kc//clRJ6qqne3DjbKzKp0aM4HeGnlTcOKB<br />
eGj1W9DA/uVv/yOzOeEEv5AgSjrn03SMzn4ti+5v/zAESnFIDJpG2lTpfqOMBxpzR7n09T5stWTo<br />
QfNs1mzfpLNLanAPOYDqOKCDtm8vdmG19FQ50ukjKpOFMUDmViUgSRSzGJg1z363YRB66EUO3PBP<br />
Bm3V0WuI590CG84Gg92E5S6bQPSNqq2UKnOgP6KsjxuW2qR4Scud8JoRVeDjzaPRuJT7ztkilR7e<br />
7JNERynO7MXkbdK1aUHZ3ydO9VziqWXC5WGU6s5mVCbWRI66DrOShREHr9/ap/OkwsXUipI0F8MI<br />
1kM6g2NrPk2CFcoP8mmSDjPnvWKJyClTUiwuhHLTJyg6nILIuVLZGIYgfMgLcLpIHJ+ViqPbCDuN<br />
LZLwWRyM5+OJT+EA//l4b/uRRzTFxwgmlUyTrCrdlp7S+8tFh0qUsZk1HCa6dN7MUWdUoNZN95YZ<br />
v3lxwUGn9dN6UQyzaQhFnnp5yxoRQkevflm5x6f0y1gkRYULq1e/oEJce5MxXmglIr4l43Ev4dT5<br />
ohGeGlLMm/64kkTZBhK4jgxQkZUADYeVGLTZJVt9Ejk9BsorjZEbMQSQE4RFYmsHlfVu0IA0LZay<br />
VWXRaMa4AG7busgZwSZ9GUno83QGdVDKb8siLw8HbFY+nSkHv74C24G9P5tNPzEMAsU0BMj4BjZ6<br />
CNXJ6R5cvoYDoKzzW90w5qAdYwPaqOQOUpdRxLYbHvB7y9N6DksI198258XMpyDsYXBzmnHUHu8C<br />
z46fn/oIERdD8S1nLejtoOh2FEHR2Reds/bPH7bfd7ze371AnDVq0PlLNHXTPiNNDOAG/mwFijTA<br />
f6iXBSXyohz1qpZx2SdQwRUm3oezvKtOU4twlauZbXKdVitrbGyo78LO+a2bSRRiXEv7jn5Oiiv5<br />
K0UIh3T2ST2Q9eGf0h89vEo+LYm98A6Nb2xc61LNmLBB38DqqVSb28oSzitZSsFkcg0cu0/go8sy<br />
jUoK6kg2gser7Opr+7yq0Jxgyk2Pux0Knggorkm9rrzlWeGAuX2bpfJbTRoudJ63YfWBwoaMDMJA<br />
cZI6+EWyMZbjoCLlYlxGyLBa6uAKsDs8VKI8I//yVPTKTetdPhVbt8Onk6f33MpFqg/VZZYHsPWc<br />
crXiF00o+7pZ2wR6hOqEVDlrJCQvR4zODx2aaNdzkEuYYndHtLZ2uoj1iTUpiSpn7ykZ8pC7kWL8<br />
DWWL3L2fffeRFjtML17ZWK6yQXd36nYYZ9uGYg8ddOjrCsOOBnr6jeOvltmmP+dtV7BaCfOLOuoj<br />
z8IhmuxBt6Fkrg0lHmt7Nw0tIftYkcVFPplGejWsNrJS5ql6VrAvwxlQOGOgzRli9aEToUtO6eFE<br />
KTzDdn3ApBeSS/usbIiO2kfxTsUCpoLBulNkt+p4FNEVL0zgiIJISCssCjIoLKRWeRT0fKpyKTaP<br />
gkcJV7IKZ4I6he4qotpmA4Fg3aSwlkYkTi4uonLKGQ0m3SzmzW09zOzaaHwqc4w/QRAFK63qJo7X<br />
vlNDZHzPLckXSWPpXSht7YPydk3nHC8I122DSt6a+HQKE73d2dzs9O45PsLS91nNg52qzX6TiZoL<br />
AqGpGP4i4ZlkU91Fso8fi44ku7uArgbRqMw3rIP0DLqC0qaFYai2rlzdcIJosHrb39iqX6lk7eN0<br />
kw7SXeuFU2S0WU29az6jin3Rq8v+7ME5Dv5GKQum3Ohq5Kq2e2RvHR6fvn5x8J/KFRrOmTmcJXtP<br />
REuaWRQ0GIdjscgofjJkSAkmqcD3kL/2wr0n9wQRUcvvqYQkLiXfKxbctdryxKaVKMgKDAoWjAhv<br />
xYE2xQKjGNi2V4uFJNpy1+ddJdWHn5QRHLMuD0dL/am83WHZ9ojgXu+2lw8GZ70o+9R7JAp5F3hD<br />
/hGU2MNO0BvCsUYEPvws3neOj/bED9lVlt9k+FbcbC85eUn5Z+ZCxdCsW6xvVRuNIR//J80uM7ZZ<br />
NajfAoXh87hkeRYtBokSP14myS+f2hWaL5ocsfr6+PXR6duDtz+cwhFAYEO0dGO0TcfNuUTDss4a<br />
5hYn6STpWi8jMhwyD553U0/jnuwrOONyy2pt6T6m3y1ipwBQX5PFmA8Hr3/+eS9Oh+ls7/37zlmX<br />
Ph/cKiYg9uAtllOUmCJsMcX5YJS+0un2vePgKz9orRzZUtuADnt4JrdJwsXPJdIVLFT+cHb17d8/<br />
ObTHAexvkfgrnv8kD07ydIUPod/2fYsXByff7z8TlcK/56vcfX90cvTm4EX32auTk6Nnb49fnfw/<br />
/2pySBMVOpXqhC3psk9pXPck8ywVUrIi2uo1X6QCtDHRHh7eFaGXKFQFV+wB8EVLFBLeqeD3D+Cm<br />
Mk+i73oDKqCiMypcpiHCMTSm8rL1huEzPKUUD8GSg6eA7utTlFC8/dVHJO4jUclKQvBGZCEysBsi<br />
TauchvKW4zGRGOSjJOvnJYr6c9USt2NTNTH3lqwN1lTCeoNr0fyQposcD+y+6klmBDQL0FBu9mVZ<br />
DbcKDCWMUXGw7Y9iJxnSpyxl2VksmX+K29nQbvfkVF4R9NQKBFkPYU1271cT+Lxhvj4dtFL/Snw+<br />
A1wT1aJxpVO2NHi0so5OVqUpdPBw2HyMrPK2FfMixxcDAFAUJ2+aftK10ljErlrXCgv1U6+XhDVi<br />
L4cR8JqWeAibCNDqarecrE9WiBKwo2XcfpA7aYMkHnoE83w0yrs2eK90a6D8UNQdX4ooBpAYtVVz<br />
cLz9rSny2Sy3swYo1edD24UwSIubFZtmmcgf2aNK6A9T1FDNyz+Z7h6Nb26e1n1FN7jXJaiJbd3K<br />
Bt4zXbjTaskBDcVOu11fT37FkUqFCGGEghIInnCyXBHmj39NeQCZXHynncDkulkM1uCxg7jBsWbp<br />
uff5vJAnzUJnrTLCkeyoZwtZ2GuV2o1mYVKapJLmMakxUMECbDMMScAiMadvlAGe5A/AcMYldRWr<br />
LucXyCFgmlxJ1NlnIlK8UNYrmg0rDn5cGfwNNoDS3V7gGaY6TAU8Ecmzx3seKncolj4pgnWajzCC<br />
leFRIgmPooFRUL9hq2DIjFvdh1+b89ytgpWFziZ9krN12+UB9Nb9zg9xYZfnUyi1Mlj2r6JhUiCo<br />
hT63+dhOWbOvtw+KQVPlA1/KR5lOyXigGfZv6b6gwGFMBZ4F7v1u3pxxBJRm3ITQJRYjolECGAP3<br />
CzTeuQocHEifpi4kP6p8yqFzRFR6UrFuLpSop5El3UzxGVtdr+f5yHniwEIge8KO0tvSz2rqeHlF<br />
cTSj4K9I4SBlUlXLeNKoTmluy7wLnAyYAl01a8R5oIu5VL5mRCujfcEAFVuulk12HMbVPIDVDO9v<br />
ky8x/UhmfXKxowbbM1v6esu8Edg7se/rpHhKWsb9BTWbwiV8jID0lUHV6XZr1+VjdoNGjWXZQnKQ<br />
Cqg6n/Z2Y3mudWrWVgkmTISh7PdKJLBH0tppR7ctu1BV5/rVP6DBWFyEl7DMMeJFhLuE4wDfNdxZ<br />
uc3kyr9aQy3MAQsRBz5TySba0vNFQne0a454ONDyqySc9ruxwiKUyfP+YAT6Rj2cg6pZmO3Brklj<br />
OkA5nRDNX7bK1tjvLNv5vmxu56VuNHTM9uEAm6af35FG7V9N5GXQON7rj+CQ7MXjtJfGvVu4c36d<br />
QInpNrQonvdn5+Suof6Qc2H7Is0L9cd9095xdOSphbdFU7NaWydY3XagUfUqVEyTPfzxa2z3DF3o<br />
EN3Y32lDoK1SCbgcqiGFDNge3KkjZY8ZE/OSUhDPq5BSu1bgJ/Xn41entIF06ztof6xyq3zca2nt<br />
kIF04bg/QIp28KAcboljyZHz5YhAkZifkhGmuHY4psf4HoKU2D5OsqiZdSnPu+fyiXda+WdfleHS<br />
5BcPnKtzoUP3SDGvHoE3sbhsozRRGT4ZlJGOk1F60VNNCNQ9CnsqPyn/PZ2jzyRsvupmOE4LxD0N<br />
SplBcc9OvQH/CO1j/Oy2btP7sginxLs3TKM0T8t6GKRgTZmo/IKUCEqDaSenkLjnOBmQvcLMGNNY<br />
aT5sThCt4XlfJjT/GBYMUKROdPKvl1Y7G97+47kseK4K4qRiq3RI+qmMoAGgz+Hf5wl8vKBCO5C5<br />
pwmWErjVX0Xvw7toNE/2tnrCAHM+lUgG4r75+7p2k8JKvFneMy73kI65lH9nvxATzqMwLYlzRR7H<br />
aTGIMgZUYbTDdJJkpEWUsJaaLWnJFGxDkA/GKGDAsmHg7Db8QT7i16k6ZGHHSiURj5xhp4rSYobm<br />
iZ1GWLh9srUWkuax6U9r63bnvr2HEziaIGZ7jJDM2CrR/E72O4m/w6alcVK0msgDN9tN+ARANQKm<br />
IARmYD7OCmltCDXsAqOPiSAUjyeGTdsTj6+f6m7DX7O29At+kxjQeOipnd4YBueJNhE400xa+mkQ<br />
ZLLdMufFeasxAoUhKTmIpaUQRB8w1NrxIiWdg06UPS1LjbrCVAGVWh8kLc5h20PcBus0wGl3Pknj<br />
4hxdRq0/L1BFncb4HyYmdMthXnFYDT9YKO9hjkXbRvWfsgiXbhulCzrVYeqVbRmQ8fr4kGc84txh<br />
YAaJblxQtV+4bcKa0ziX+ZhB3HdseL+jalvzvrUjzxocAMxH7/ZeHxGyyG6pDDSzrPYJtuAJIxDi<br />
C1XNm8xZ/AR7IXkGryZI/qNSHFvmS8NsPPIoHYJ+Mu3DmRKn0v1sakTqqox/eNT78aXlD+HIzuc3<br />
Y49a6DAprhDA4yi7Tqd5NiY/EfEj7ZJOoLWOn8M68M6t0ndyqJpWgMiNuuHCMx3y3b2zLKweXQqW<br />
qXpWucCKYeVoUMg8lbNAK2PV1tWoSZ6qtrFKdlGzE3rOw4b6fk6p8uGyKe0OwO39kkakaYbRShMY<br />
+GH623+DPJzJ+UKz5d5hEDbdbcnGnDu2HyAepf0e9NHeM4KrYsxuO4HdvavBNyrQBgbBtlE7Murv<br />
vTbFfxwefSOrjJOvl9ZZMdn9c1V+3ZCoWM5QDHHqh8Ul7OtyMIR1yyhVHtqeTfH9yauXR+IUyXhr<br />
/jiIeaGpej8O+jAa0UWOWKrvtJYk2ylDC++Gi1qzKX5CQt46czjdL/KP9mdX87+60NoME6htufJl<br />
NfFrsbNaEaVKrKyQtvijPS//2dlzylSF5gRf/HR49B0Sf8UNtHls2WbrO+phFTufcY5tWpWXpMtT<br />
mN950UcMSa/sKD7Dijp5dSLevnn17uDtqwfYGHAnYquHlEzJ0R1DFaLC3rfN8RE5sIEzaVdo2FoQ<br />
Y1QAZgz47RQzQblSaaM+p7fmICvKrIYy766yV/ulXhW5WltHrSFYHdIyk4fCKRhGVtaAKYadpFmi<br />
R5BVxqLhIoAzt+nzr7dgkUSLWFVOgMa2tBSOi4zjX+PkAokmZbNNgBE4gWirBkqKSBDdTrQv3wcg<br />
IHqPYumX1+0IfLHboVtemKY2JTetRzL3OT0EHgQnbhc8oPtwmxIblMq1eYawoQHlRJUJjkUU04bA<br />
6iAQ59SrhJBA30FxbktQ2Js/vHnBfL2WpFrQbYUOO5hNuulMwsMS6gT/7LWlTlh+/2qKhl2VoiGg<br />
HA1R0A6UnbSwslv16Jue9USL3c+hmblysdX5W1FsiT01Wgkegi39xKpJr2YaO5qyOosadfOGnOpE<br />
LjAJHB4SUFUqq4KXF2SeqHZLizMs5Kbkr8HSZapbwv5h9tkDT4ihzkcxhtiRRRW3YvtZ7QPZbM+T<br />
eWa/1NBIy6bE1qsXh6dvD/784sjz+lb9k7dHp2+PT773NRNlg7rqoH+LuoitsRtkn64mYYd3jKew<br />
loqU1Gww0ocyxZn26k4RqZV1LpZ1vLpABQUK5ftMAKWJfZcWzp99lcMk2LIWsoMV3zRTsdnpdprY<br />
xeZZj3eZ19LMiuqUk6cCth9V4Xa3oyrc7k3umypPSaMUz4bw0mqp8mza1qDPwt0h5KQzFiPlI/QL<br />
IacMo6r85gCfqvd9pXiB8E5PH9F+WEECtwu37Aya8vZZRjTaDhWTTkr9xH9QcpQr0N0B+bAx6AmH<br />
R++O4JshEgOZY0GUY4WTrLMrXa48A0ZulKiLBjG7yWNOpyH7Q5QQ/jZV5pLMiwhehgOXm5FPT9Zi<br />
XV0babauGTFfW43JwCzDZJzAxbqvrjLKthvLPmmJYaCsYGT61hPtLEAm683xiyPksh6xe4RiKd7I<br />
vY2BonG8Z1FXvDGrEsYOdRdymHBs1V7PKV9VrJFjml7ml6b5EQMFYmJZ4vlkxB6KLTJJULiatU1A<br />
U0j/7hzzDXuS6jyPcrxggedTEEPmihs40d5lam9ntUXSMO5i+z462mmNyJyWXNUUMSepG3DrrUlK<br />
Ysx37W0n6EWyjw3L1YxjQl1/sjqmUPPpOELaIYkcwu51W0oDVf9ltMsgr1c1EpMriV69sLvzIaXA<br />
g85uuzMazTVWJJO1YDow5ToCQ5UJ7F4rKfUab2icKLMoGCrKPW/u7NOpxhyvJ4dzkvnLYo+Jt2Ne<br />
O3wumo8n4vG1eExZOVk//Oup+DUVj349sAk228p6bx/Qdw9p3OdtWbVZqk2rNegztqbaFMWL3ElG<br />
aFljFL/0OVojaZnmAPtzp9iutjm4a5qiGbTP0RZFTDaGHD9wuR3XeyGmtK5aOhsnDN0q5wCmyKUe<br />
3NMhYHmoXbmA4jWuaSwXr+CipngIj4qSLSZtry8ct+NOlhHhzOvNUnV/w7d8JXEnY5XC5/YZeRlR<br />
mrTPSLMPH2baaJynyCQ3Gv9c2gGNw34eXcP5g9Z8hhlHUF/8QWYizE1PGYvxXzhs8yiWKDaEX9+Q<br />
CPxu7faRZOfDMqXtRjmlOdlCAw98zoz0b+trfa2v9bW+1tf6Wl/ra32tr/W1vtbX+lpf62t9ra/1<br />
tb7W1/paX+trfa2v9bW+1tf6Wl/ra32tr/W1vtbX+lpf62t9ffHrfwHFL94iAPAAAA==<br />
==Fine Archivio Base64 ==<br />
<!-- *NON* RIMUOVERE LA RIGA PRECEDENTE --></div>S3vhttps://guide.debianizzati.org/index.php?title=Aiuto:LogScript&diff=44374Aiuto:LogScript2021-04-10T09:00:53Z<p>S3v: aggiornato a 1.0.71</p>
<hr />
<div>__NOTOC__<br />
=Contenuto=<br />
Nella sezione successiva '''S''' è riportato in formato base64 un archivio tar compresso con gzip e contenente uno script eseguibile per la [[Creazione automatica di un file di log per inviare quesiti al forum]].<br />
<br />
Dopo ogni modifica dello script del punto precedente, andrà modificato il contenuto della sezione successiva. Si suppone che tale script si chiami <code>scriptlog-debianizzati.org</code>, si procederà come segue:<br />
* creazione di un archivio compresso (con <code>tar</code> e <code>gzip</code>, gli unici comandi essenziali) in formato base64<br />
<pre><br />
# ./scriptlog-debianizzati.org --base64<br />
</pre><br />
* sostituzione del contenuto della sezione successiva con il contenuto del file temporaneo creato;<br />
* aggiornamento della versione corrente dello script, nella riga successiva.<br />
<br />
<br/><br />
'''Versione corrente dello script:''' <code>1.0.71</code><br />
<br />
<!-- *NON* MODIFICARE IL NOME DELLA SEZIONE, deve restare *ESATTAMENTE* com'è --><br />
<br />
=S=<br />
H4sIAM5ocWACA9Q823LbyHL7Kn7FGKZN0Wve5NuufGhHluS1qmxJEeWtpCgVCwJG5MQgAONCy7pU<br />
5TGfkcpT8pq38+w/yZeku+eCAQjJsY58qqLaNcHBTE/PTN+7h91e6iUizoJo2vH5iXBDcX7uZqIb<br />
JdNf7uivD38vnj3Dz8GLZ337E56eDgaD/i+Dp/21J9DYfwLtg6dPoYn1f/k7/OVp5iaM/ZI+WdzY<br />
73vv/5/+3b/Heici7J246azRuM86d/YHwHbmcQTbey6iUNwtbATOTkXAmZdwIFeWuokbhhEL+HQq<br />
TkQgGGdI2Qv5xXdZlmeZaORzN/3EgOwGBCPMeOLxTOLI2WaWBL9uNrLEjdmEn4mM7eweYscNhKJ7<br />
+TwIWlEsv7T4WQaMk09bLOQeTwER4bKYJ4ynsRv6POFs4+CPTSZCgPMGtpk9A9wWPElxW1iaezhK<br />
LHgjnUVxxjop0yDv/EDe5iEdBvNmsD3RInFpjyLYOC+aA7Z3f0wHYh4LF2QK494sYtyXn53wMYM3<br />
3OehH6kmDvsCJwo0k8pTA5yANg39jESYufCOuR6dWeauQ6uGx5yMp1nkMHafAdHNY5elPIR5Xea5<br />
cQTUEroBNwNMb2YN8KLwmu72n+mehy5LxNRlizzK3MZpHnoZ4CpHXDQYE6dszJqwpdOMDdgxe/gQ<br />
vjvNgcOGzOmEDjt+ybIZDxsINp2J04ye4gRWesoepND3kQNNPEh5+c3RUahfnorGFe70CHhNZLlI<br />
Pc5EoA40Yi3PzVpEkLC6LImCwAWSRAJwA8lCvmAg/gHCgoewGBEuhJvBoZyewi6LhTvnwCYSJDyE<br />
ObyDIXloRtNWFsuHCYvVO81V6tY5ec+agzauvLUx2tzZgVFngJi9AySJcDRukb1seWJvEU4IE+gp<br />
7dXfKZ9sotgKs7vnhj8l20vZFGcNEF5+FAZf2Z/bB6Odvd3toTPo9rsv+g723nezGcMlz6XQiZaG<br />
7W8cvpvsbnyAcc1VbA1E+Il1TmEHL95sjN5NRnsfDza3x/3jK6dNMDcjYDk4UqKIKPBhoScBf8zk<br />
J8yGOyvCaZdtuWwe+eJUeEgwIbdklQCyD0B2CDyKLTIbCpz23m/Bf6PDjTfvAa1/wQHcKb3W79Is<br />
4Zk3s17qNyeglnlivTjcHh3u7P6BbwKgiq+82CCfCy29btiloYPUtd5L6d88TXrmAZsI3K7aaJst<br />
gB0YKEfklsAFPZKhlEgSZIliAug3dOCfSXMVeoBS+PWB/+Bk8uDdgw8PRq12PXAp4g0MifSEWgHZ<br />
bB737KabQBNj+Fx2jxI6WmBXOcHbreHv2OnjwXuW8HmE3MtxLbE7BRmnmJpYvGbrRpsHO/uHMHbo<br />
zLIsXu/1prnwebdqK/YEqLqzbjyLX4MQCvhwE0CQhpy4IDDm0M1zJ76Y5OEENwAfccMA1QkJnIRP<br />
Puc8FZmYuMHkNEry+UOX5MmQ+yJzfnQJ0ChpFzqrI3z+tGZdE2CT7edPf3R5GwJWtf4+mo5otiVU<br />
iWfzjMhEfgybq7BgZL026IEGSkb5wmH3QBskUZSBPmCXlyQ7gV72DjfWdfu3/8RDnQMvRWw1jYKo<br />
DcoNVsoDFNRpHAgPzBMpqH2g1JaamjGgI/m8BghMOT7CtqXpF58NwPxma69Yz+eLXgh8xS6Zl4MF<br />
4jNn3UEpMmgDPg2p9SxADglnrXZ3wpQnAoUB0FyWR/baHa0GsGOzAFHWfBYwtkpyRarUiCj5yB54<br />
5LRhU2zdYA2Wb0AjMIYHXaCMG26tYNi8MM/rHQv6lex4n7RMnH/7b01aCV9nYM6di8cM5GQeSJvk<br />
MQvzaMHRBpjxlyz89l9wFilafNIgYHrhxXT37z8aj9cBlMfXj48fXTlkFdCccAogf1OBko8jzfZA<br />
OPbUWa3CMX/OQRkHCKUNA8pnae2Rw+wjXXv1cKCJSivS3eKAaKUAVYClENEXiQG8ugeAHq7JYWgK<br />
rz17Bl+u4H+9i2ZKbAMqyNgNLWugpw37qU6aUWagb4uX2IQtQLD4QSyjVBeQOWgqsvvB4M9wp4px<br />
B3uj0d7QOeo/eTLuD14+GcwdtnIfjjCIYEOTCJmHsykYvYAYGCy28t3atgaulQaCqe7z+oFvQJmZ<br />
cXOnMBBr+r7d2TVzFF2hb8KhJ65vga7DCS0OrDM8ajAakc2/woHMfRQCIgQ9DZIPAJNpFaesQ7b7<br />
fMg6MZP2laMGSNrSw4dEBvpL31I8sunOjagRlx5SwgFfoFzmCqDWBE4zSyqa+q7NLOXnyI1MOUjd<br />
AK11xpME9UEOFASyPSLToUAJbZ9kjgqlwMwYtRPoN58AAOIkyUf7ZqjhIuHglsvOeRpJ2/QDuoXg<br />
l5LdDCCQquBcF4KjJRhzTyuqWHz7q7KtMxFT9ziJwC6bw+5l4Jai2xgBRAvtbhVHHFlB9Nu/Ga/K<br />
mhCwgIlQm5BFXZnw5oUsRJq7ASlIEBtg1XhuSorWy4XyI+yF4YZmpL003lEVbdjuZayB2lF/z6Xm<br />
q4HyN2DZ6cx4ENPRpaBwQGeGwrNA2wuoIgtzVZDdCayRzYH0U6REJ40APmsEPiOQIlovcJwB0o05<br />
xbp1lKlYupwiBNNoLtUP2OOk6euIuQZhQlY7kCegKj/WjlxvNJoo1zodpIjhBZjo/HIBRlF0eQK2<br />
yKWb+yK6dOPsch7lYXaZRbk3i13/cop6EnbwqomijtSE0HuPeryO7qpE14Vh2+k6U5PDLNCg8Qkj<br />
3EIQl6megdiOuIjCQJFxSnVHMhTJu7XBgM7M+DIM7fgKGsHQvIR+yhbshiikFYg8RltcQ5CjieKS<br />
UFO7NEKBy0Fq+yKN4byI+zBmgFaDq0NA3ECVNmoZ6tK6Qha4xrZVZm1ZmGpwZP5raAjHhmLsZV4m<br />
KTqzkgNRD1wjX2CrOQ3x029LY5HvQNV5ORG1dSDIhjVw0B3IyujhIFCdwCpokUgu+bN+Zu2kldEv<br />
uCKdRV+ws8XCTe2EO+UZdsAREHIKFQAURleLLnvvWpr7cGd/D049AcYHA5QvwCpH20PEPBM6joWC<br />
CM02pRK4LTmI7E8C8MXdxu7e5t6H/YPt0WjYB3dgf2N0uA1POIX6mBxsm6bJxv6hfvxzZ2vb9Hmz<br />
twcvGrLPx60d8+LDrhlwuPdx853+ArN+gOeP+1sbBF15SP3G1vabj3/AZ+PLDNdqQlt9MDReMj9C<br />
OkNXmSJcQtr2jqZrp81WxiYugSHR8T8cg/1rxcbKspWggMmiph+wly81RMl/t4aoVmZDLGSLhlrs<br />
PkDkn8sQtbICYNYpDaRJZ0MlEeK0FUQ6wu+Bk+c8WKkCI9JAaazA4VnVwDLqH4ARqQzwXUEtgyWY<br />
IGVvDRKJbrCMJumLWwOV5DuoAkX1c2uYxAU1a0dtdvvVEzstIUqK8dZAkS1rtlTr2VvDlTy+hKxW<br />
27eGS+KitLOkNwDe7bhTSpkSQC3VFY4/DLKQ9gVM1Dq3xrEwqhTARwBpxfgIqFJS12vooL5Pav6O<br />
/astCu/dKdBCPUrVf0EhDKdJR1KiijG7hwmbHhhuXq/Z7J36Paf5dsuEM5gOOJxxj1283bp65TTt<br />
cKaj3sZRkjHa/X86PNjY3H4L/jTCkRkRnrHOGT1eoSou0POCKOUWktjzV+xZzPew8xMSAyaBJpRN<br />
8JNdV2X0B2xufBqBSRwfk5kL2y2hZtwLacs0Ht31X+MRY1++fFkKjbLb/hHEO/0jiCMV/p1xY/Si<br />
NZ9T1IiC+IkA3yPXuVzjfAjpfoMdAI5gCaTJ2hgL8Q7wvOuV3/Wfc70T6gZejh7PAkQqOBLnnDzR<br />
GiPb6oFcGkSeG+D2x8bmbnQ67L3xEEAPzQT3ORM63E0ZJoyBq5Q6+dLgRUxzAV45DN5HV0UmELTj<br />
luZLnht6YSY9Tx5eDA75DCN0rEWdT4Cjsxah00J4xnOs8QPlypNv/66CJ1FcBOExGhemPEwJuz9l<br />
t2UvzvhfrSjP4jzDZZLDY3bx2tHgRpFHRFMZN9c1u4BpXUyflIL0mzClCHN8Px71wuPXFCqnKDme<br />
B+o0/Bw62wcHewf4jmLSI275xzDVHJO/Tuow+HeE/453cK+OH1s+rwqiyej3OWgPBKxSG2PzdUhg<br />
lhtHqnFS+F8lEqSzpwACfPM+IVKBwPkSbusHelek4Lc/7mzBPnB0VWTiARZX0J1cX+CGnlDhGSS5<br />
11bIvOhrB3WqI2QUhzCXeQi9iTKozqYCjtNKnCN5kUtvAlsUDo/iOAfopUiGUB0bsv6g6CwJJwhk<br />
UQfSJRXCyLoY+1wUa6UYOw89zJ8lMCgC1RJGVeaUORtMIwOK5phkXhlarrpn53WtJ+drdc3T83K+<br />
h7a02ToKW852zcbIUY+Zmco8AnxA2EBFTxqTsiLhXhYlX43T33UapcTQSJa6iAUv07/FAfRNea+S<br />
GIVOTjnO5XiUHrdZMsdVAWOqbbE3o7QF9sKXkjHKYkSbUUlvSq8MJMrSbPwpVQ3GeEFRGnxXyv08<br />
04aigRyDHoXQBqkGDVkZuRqkrAgOCNxs4ob+BMStzy5IZEkqplGTPAmGLUzrpuu9XhVQy3T2Znn4<br />
aQJMdirOhkYZVN+H+Xw4qEyA5zbBEHWeDvvl/kTI1AsrMpQg8AXwmrQk5ljINHdp+1MRTlGPSKlg<br />
BHkFgVSc82Href9Tq0HATK7CZad6Y1OznZgwRmtmmmANGgqJAgo7Y0/ZKiyIJzL4SvsuZLGeTC7q<br />
0h0/Z51PmtxVdvgUs0zoIa097ZfTuFpUThnYojEoRTW7pbp1jHX5ZB0bxkYQ8KmijkpAV9ZhiNTL<br />
U1VKkyuFp7geeDrLk5AYysjgRICwxO2Si1WyF0DqdKdgq5iSwUIX0Oph1JaC1oPucCLG/rYyONgf<br />
ccLBbVKmVFfjpL3mhU1TV70o8DuVtk5RzpG22j0UGfZ7p/toSXAYIloIX5iNKapUzMqa1lGffAVV<br />
oQrh0piD1Z5Q0BeokvMfW6LkTJgLa1cKSk5zaBfY22WDvsSCAK/O3TPTIrWXqZrsuLhjxMHwDE5l<br />
x2edTbMJiLpjSdnS1nWd67ZGmu4eOUxL5E2Eh0su+BlL00BydFkHUPV5nM0Qk+xrDLoX9AadZnXy<br />
R0D7KolyxnRthP774rGOZ/GPmQpNm0FdzQNqwR1ltrpo7JkkREhJEks0dFs1ZQ9Si14HQSMPGFzJ<br />
feg6NldQVzQYpTiKQC7o86tiBwIFDds8yGSg2xWMLLGQ9hZUMHiEYh1RBF60ZKAIaw5w3O88OZYR<br />
44ZMgoNmlhmNoKU48ty1qqVsoWhbJ2aewsBQAOXSfKwNzhJ3LjIljsnOf2zZ3S1F6yobC3KL5Iws<br />
t9QCHEilGI0U22qxzgkgYDQNkIUoI7T2yhBpWx6ZOjhpkr4Gkijk54rGGQRcDGeAVows50lEnpJf<br />
YWNAFoPUPAhGwWcSjKnzVAVTsiw0w92w9gD7KnvHLJOMnpXSeWCyFJOmwEgIjSysLHOxl736Hhzp<br />
78eP2o0VizidbtdQo6IB3JorlOEtTTT4yiBw5TSKuPeNiKBbYiNTM7WCi/hdsZlb7EREWTgNhfL2<br />
Llu10ZDCzsb5nsFsWfcP8JWy3DRzIp/SAshBYqew5JsPcUALMMgjZuboJWHY6BA2dZjI6RWHmwcK<br />
QCohqYx/KrW2lWEhIZc5uNur42E4cJX2+Q5PSqQs87noY7AscFT6u7m0vBp3ULL59RnbwlzM4yAC<br />
W18V1wGLg3i9zsq0qjNkiZ2Vy1Eh0bpkjkS8YRmiyrPASlVz7KUyntdaWdzDvdF1qT2LSmodp11Y<br />
EZp4pqijEgJZXhIJ8iLo4RQzOERrJaxI1SwZUoqYXWN7wEzd7Cyr2/fC+SIdUsVOFVsu7bvyzVqN<br />
smdW55dpr0wRV8UduEHUamVdo+FUuYkUWS2blZcGjQSZiUY+ZcpoEuSUHpW9q3stiy/ttN6jtq3M<br />
tR5X51HCxtE5hZ/oF6KXoMt2C+VbmN68ZCOqavCoR7INlVX0s1xGISOD7tylggCjCLQC6KX66cYF<br />
2AEi1TaJPoHnaN0vKFarwm4astTG10ccXrJyhkJPQGVCaoZtaWpIIDdhqsBVhB3Fs5c8IqyDT7Cg<br />
RIJU8FtR4oONv26iKhRHMV9kJMV8nZ7XoK5k5XvLwdROp6xrkQRqlfkIu5ShnFU3YrM2q64kZ22M<br />
WMmQTbm25Qqf28sMeSijzLU91Osqibpd7V+yNOA8ZgNbxoCvjFWYIH5YZ8HOztvOkrw5O8eM2V+0<br />
W/OqFD7CuKFNkxgBtUnIyKKa2U7ORbxWMyG1s87vdXNSmOpvmXQKwGvmxOZrppz+yDKrItehu4RK<br />
2cmbSRTMpmIoFSEFArVqlr8rbHdtKXvtqf98uUs+vMqsgJD59le8usgDXsgGXR13x+LVCqWhleMC<br />
v0tbRefDNBYu+Xj6GozF4lTFlFFMxuQtJJ+behOHlYoJvrhg0uDDDFgVmM6hghbLhcZ32CYfjUVl<br />
YFJtiHMzTFl9UoZJbdfAxNqQ7+FJxScVPLHtOjypNOQ7eMrikzJMarsO5j6ieTNM1acMM87YdXh+<br />
2P0+TKpn6eShrGuRMOn5GphUafKdtZtyFgvPDL5fhydWmXzvjEwpiwUTRRaQeMU6L2s1FeKiXLHk<br />
QORIyROmaljXCUt5UVC+l4dWUbNWYGE+J1/GC0BrwafMzxdpz5FmLWkVL1V7qwrMzzneAlDJRlqe<br />
UrP2xc3x4LjgWVVtL5AnKdMYStEoE6nAWI3xmtWd2KIxfmI1QT8k7Mb4qdVIZNkYPyv3m6JHbdLo<br />
yrkQbBWIsN0YPy93JorpKSpqjF+U36rDIDNL2s2aQhrj347ZRqCrI+1taoz7x+wj+siuQ9stCxOz<br />
JOfGMS2SQB6fBoLLDVfhQTTfqDjXp7tAdlKITrDICVEQTxSKbjzo/HbcXpFEiCrmIRAV/tt5xdAW<br />
QwvP3Jd0WeRJS1FFtcztFV3bXgokDgDuNfLREo8wWWnUmjWqIgEtAVgd9cQaVZFxloirjnpqjapI<br />
MUuIVUc9s0ZV5JQlpqqjnlujKpLIEkTVUS+sURVZY4ma6qjfrFEVaWIJE3uUooMToJlPBBDI4FBZ<br />
yXhlWnigGltEl63SVH2YiiJAalBx24Hu02FhQr/Fuoq86VafpWOt0o/2CsyI9UAMyFvdK9D0Jbps<br />
08R7wCfFiKe+TaHKksmG8un+rNtYWaGgqJfnA4pHIjh121teddc9uG+Hkk5FqBIz8FSUXM9gHyI7<br />
rUkhnp/owGIdNv+7lGRR4YeK06Z4dQhlir7hq67eP8bbFpjjE6piJQlKF0kSMDKzov4cZdQYVBtr<br />
3lR7Q9oG/G36yYYgSqz7rWSbJRjGr71kg0kLPyomxBuR5rCvOW3T5ZS6oPBKs8SVfSJ5JTIqXytp<br />
Dv7nX/+jeYH1/FdHoVP8WoJGm7OF/lGG/9Myyc+3buKV/H/5GweYXJLxfGvB5NkXywY3hO75XdW6<br />
1tYvOuh55YXBmtli/MkMbFiakiJA1VnpWuKNs8Ic5sKgZOJkGqEitK/xnESBX73C07zAGxRXpUof<br />
+aMQppP8oQh5HM61AdSwcundz9WtVkyeYKQYDRGhYqKlW1Ui0Jc4LcqnMHeqKpR4lSjV5W1jfoHG<br />
bA7a1lIR3IRP6Kc1iusZP1Di1mgOfqA3+IyvlLt6I0HO7Wt8KF5T6zc/pCFwYWfONksBHpWlBTOA<br />
YglHYUvfLsFfXKhGgpRpV4BXWskUeB5WTKF1hqXJxULYBH+rAD4CN83y2Gd6YOUnKNaZde2lsg8j<br />
ufTq7x5UqcUuG3Yz+8iwFEB51iKAmYqfMGAP3rAH/yyN1Afvug8+tNpL0/8jXqJmljKzbuSpOhFK<br />
YUQyQxi6qRfJH9xBeZByH2DgZTL3xOv6/BTpDB6P8Nn2fbk/+QwzcRXucpPE/Ursbqb18TJSlNk1<br />
GTQCug5Xna7DnJ7TtoJXPAMhOVQ/YiKTKW6iMqF6IBWaGyPVDLmQT71eE8f0jo7okzhc5kf0XSXZ<br />
r45g9T7QMVG4XZZrlq8OYvoe7y/ZJAYWIsUAln5LxrrRb6k6vJxNW93Cr/J1C97/b3vX1ty2kaX3<br />
VfwVbUgeXkYgLSWp2ZKjSmksOaNZW3ZZjpOtyFZBBEhhRAIcgpTsSMrz/ox9nP0d+WN7Ln0FGiQ1<br />
sWf3gZjKmAK6T9+7zzl9zneayoG7iXrCOCXrfezEn+PD9wwWQkozlO1U0kDs/yq6HY2J0O2I95Zu<br />
yU2KeAmMOhIYUB33c2x/hiHG29lQGmeolPc99as3DPS64cJsaIZKUfbHRQVxOi6Gf9sFKSXXv6i4<br />
f2knDtCAmmbSiZqNeK4dnZ4eH7LUOEstj2Zxksxu8umVeBll0TABgZlXEvBzvNGMP8UpLA9CRJBp<br />
ZdIeu6+HJOnSRC56QaMh7yMRGIHyBpbdZ6HtMR1V/orEBWzefGmZT4UxceBSenQhiqwx8f1WC134<br />
JPcWQfHz5g7VuT7lKo+ayShh6fi3fyhFpaoLP9Bd+1stGqgMRwlEz3i/15sEimIbSEEW6leqDekV<br />
gPI10CVVA42QS9Xgd0A2u1JIKdEurtzMmAVfkEEyhYvlUiO3DppJNI2A5H3vrMNnUYjgLtdJfNYx<br />
c0mWA53p7Gv28WMoa42v+sV7JvzhTEW1MaLf/pihCFxVCc9QOlXcCdHQy2CK9W+5X7udq+QTDUun<br />
BRzQFK132neEyyTMFGq3291O72xHeJptVtBK5exBU24s0t1OdcKe9dqtbqfdEmfwz/ZZAIW3zoKz<br />
dhuqUK3B2Veed1/bS3txxSb5KO1/gjMXpnmIoDjXEaJJWXUUTaxBs6b43dWLOpDU82wPmbTplypH<br />
NQl9jFam6cw329jl5cEzOeFSXH8DxLITN7ATjGDyqX1PfUoKMY76URzTdRza7DX0JsGuV1ky66nc<br />
9mWM4mPo2hBt/8nB3Z7v3uIFlDdhvLZC7Nr1+FZ824purkT4vPnznnj/x6Zo3rKUIbZ2xX3TUx9i<br />
iWibTCXzY+i57A9Jn+UeauoaplLeLhL2kUB5BQ165pnMjj2DCGh493QxFQSChi5/Yitty0s7dYXF<br />
3DlmEHdkr3cjrVm/Kt9lmZ5H0th20+KvsMXffvstU1JllPNYvOWW+WJSb1ZmBgtYtNMVErICR6Ph<br />
7pzNote0CDa9G2jTOvnVfqi3Qyl5SOs/3AuNQZwlxi2U4lDRgtyf5asjYX0s5npu+9e34M+wz06U<br />
kqtp+4QO5EuR81SCB82G+WiG5SuYBT4J1U3gLO+Kd8pJhaR2rhwcgMlUylZKa96DM6cH5fWiyax3<br />
CXwAnMBd7ALpdrEsXXfHvS5XApbxcIKCr0nSwU/0Awnu1xHkK4maw5+GT9Exp3uz9+EU97zwEF73<br />
LsVTsTVp6rwaxwtWKdLcbUuryMI0z245G9PJXWJpr2/LaWpd/Fe6h1Sj7P6jKq/ZTPYMITM2Siw/<br />
WI38hUEgnTR3YmHTPU1WpqUOrFKlmZY7VUCNRI8YVKZlWc6LRw3nvpRfias0rTLibJO72TLVCn7w<br />
zVo2+seDGsX2W0X/3pHf9TJ13Z/khIf16tLUKHt5LeJFMhqcM3IC3/RqldGBpDRNXB8021XGscuw<br />
7SyM9xaKDJYsYV4W3ren8i1rwe/ulOm/0yxLY6Kd0p5p+1bHWDgVN8OE758flYwV8ENbFucxJ2Dl<br />
bFLu0y7skGwRx7uCsZ5Del3H2Ysq9ibtR9cuDAnBFUbukKjOxER4TCA1Ef5dhK/QNFIjE7pTvoIU<br />
Cjzk7eTp3+/tqR/g1N9tB8YCHcsgvzqPBxY6BUqWN7HtTaOyG5uHnKU0qtI1znIgGQxTeRum+4Qc<br />
U0D0UQCBLswrTsjf/msJZo7ToXsikHdVo1jV0aX3GliTRGuGykvnwQ5haEN0FwRtS/LgEYUVTdwT<br />
jur4Cv9qowDjhfLBr/k0yhL77m9TOHA5amOSMD+STj5JI4s58FOqmVQS7tKaW0Hvw/7pfu82eyr2<br />
IgF/7D8HlqYHawiml4C3F9H9PaaXlYB5dicQMx3tmV6RfY9qdlCWGh8hG2l9t4RHs4itMwmmC+E+<br />
OvLikrlqpXXMhmj4Jk7pwZbGyw2cdGQjiqYFT+w94qCG1QjqNitp5O3S3mSzZ7sehIpNyJHpoiEc<br />
pLavYKPcI479knKJlgYJzgQPfJ6Fg4ph4UMwpjYRHVid/1PnTsYumrW0FoqwxmwFCisCrvZKUKv2<br />
lQjX7Jau/vVir/W59raq5HbdFX5P6S9//DWW7yPOMJWnDC7J/kCEPuhnWLHKME+vY8/CVdbSciW4<br />
4pDBex1VvdiXdyxOVWebLpVtr1214iVFz3JXip5N8VKlsiED1M4I0xImX05zHM/7SDtu0zGuowLw<br />
ZnEJacXXX3/tVG61CyG+SYu5HnZcAiw3XYgrScN/i6XYRrVmt8GCJNfGfiulnt52rqQdqBCJYa9P<br />
b8a9CuydDl+rI6E67EqcGU8I4TpolFw92Dnci+SLF2DPS9NEmv+7Z7eyilDzQsusPle3RTabrA1s<br />
KoeSUlUtt3WnvrpxJkXDMnqtOLcvzIxJanIPl5Y8/CXw1B0lKJnSHJ/i4Yas6g7S37e4rkvm74RR<br />
Kb1w631ulcmUGT9V2ZpxcECA6lCgny9AyaCc1WKr4EK0R9D/mUvZUweiYpafkZ+3DSckk+OifPIl<br />
TVWknR56zfbTqCArQmX8Z+xuP79HxbF9CyixbuQ2KAgENnUM7ByvALR9Qi3HeTxOobdgI0qo96S2<br />
iBD2e3Pymw1ppyaod8HXNnzCn0sOnr7GyfnNuJTsp50dSDqI5qNZiDLAKPoUjlkVG7iFKV+p4TSf<br />
T+CMDYq5XaZSthSfCjkdSxVlVXl/NoIeHkSQCdjhMMvDiacsTP+3fA5szYgyfETvT5MasZeB63h4<br />
pptomqXZ8GEZa/pB4jiH/eEsn3COdIYGo3gLsP/N0lyjQoSjJalitIn11DaGQ2cI2Wt6QX/G9nq+<br />
jwo4emuKHhWTfirCqyyrTTAvLkrfMKRDbwDz56raJvp2MbpK4/IUHWAQDJ6Z6dR+1417nlqj8/g4<br />
m3nbA/R9/TAoUYdm41JLVAHOl/koKUJ0WlRfrarKz+XXqFksYOb0k6I7SotZiWj5c7VdqlMhZdiP<br />
mG/C64+lyfD0KWpSxZMrGP0QrUJnCwihxErAPbJV0/ENm1wAjzSbRP0r/In/imAEHPrHkG1iuFT7<br />
fTqGZeIpiEY+vhoX0uu2zN05SOWWbTKZTZudkOxvbyV52BNLY5Dx/VHPXHaURqGawDPAeKNe+GZu<br />
OoCDcZAOF31T22/58wTlcRDg9QVJXSdNB1fpCPgFmCN4+Hum8gRv28L+VyL88Rvx7136H8gohyen<br />
2GPf5/kQmiLfV3NDTfDyIvB+gf0cz3w1fcuNuFnQ/huqcdGPMt9nJhxm1oTB24LRNVIsDwB/6epP<br />
nP7wL89eV062y/4oBT6l6yNTMigoXS7qHNUVkY37GLgsufb1RCVR2k/MgMbJGKezNZ5usXBWlgwu<br />
arLdpP0YEv+I/9SuFbNU2JnALBQ2Oa9fKXjWfwRh33SDWSTOt9L6UEf7T/j9SVcd7/zV2MF0SXzp<br />
FZewixCtcgYe0o8E1zwNMYX1Osvn10k0t98g8EpkvYBTzf5zMBxNP1p/R+N4OJmvuslE18phWF4N<br />
OLaf0m7X34+SXwJOaH5h9xNmo5f0f93+YFjqZDtj9Qiy31Yo8pzrjqNJ3R6CycLxFSdU6ahn8Msq<br />
vUJuBF1x2o+mKO9i7DhGfzNK0oMXpwc24CA5HpR6So7GSA6WbV0aMGdyB1VKYHN8tiPCI9FEond/<br />
OcT/Xh7fFVn883n4/g4Oziy+u4yjLjK+ffqFW/ioyS1jc+4AMwsiS0Z7n4O+uRYiBYr0myRj4zLY<br />
gMBmIvCVimeEkJ34LoT6/S3pz0i5Ri/QHrBbXAaOgHSWHZOMbtyIyuPBbu9TuupwjbjMqCgxranv<br />
fqlXEKsvuZb4MTYECN6CyYo7xsxYH6nOy6cRQRVxPAmDAVmaCz793YM8gwmzg5TnfLX0Hb7xIDRQ<br />
Egu9xeenKus7TSqVXHyxxPSkv9oGCbFUrWd+/R/FCpqNJ/p+U5p1uYsESW5UFIxav6i+b+rl5skv<br />
RW411Q/zm4xANax0VHlz+VDSv8tBDrg9p9T6WFGZpknRJ5O2jTpdpIRgwSXgLV1Dpmi0Fh2FtKQg<br />
tGI0qFmlsrAi8E9/+pOjCFRFO9uH6x9nFTo1Cn69NfKm4HjycNfqXFDB/uVv/yPjMOEEv5DwRzpa<br />
E8ju8KZl0f3tH4ZAyYOI4c5IDyoNZ5TaX6PlKGO83oetlnQaaJ7Nmu2bdHZJFe4hB1DtBzSt9u3F<br />
LiCWnipHOvBDZbIwesfcKgRkhWIWA7Pm2e82DLYOZWSXC/9k0Pcxeg3xvFtw+7LBMDVhucnGhXyj<br />
estJhTmgHVHWxw1LbVK8pOVOeM1YKDB482g0LkWtc7ZIpUE3+yTRUSovezF5q3RtalC21IlTPZd4<br />
ahlHd+ilurMZ1YA1Pp+uqatkYcTB67f26TypcDG1wiLNxTCC9ZDO4NiaT5NghfSDfJqkw8zJVywR<br />
OWUwicWJUG76BEmHUxA5V0obQxeED8kAp4tE4FkpORp8sLnXItmcxcF4Pp74VAXwn4/3tj95RFP8<br />
jDBQyTTJqtJt6SvlXy46VPyDzaxhB8+l82aO2p4C9WW6tcz4zYsLdhetn9aLvI9NRchn1Mtb1ogQ<br />
2u/0y8o9PnVdxiIpar9YMfoFVdnaDoyRPiu+7C3pSXsJp84X9c3UYGDeQMWVcMc2BMB1ZCCGrNBl<br />
2K3EoM0u+b4mkdNjoOzJGHMRnfc4tFcktnZQze6a+8tLwVKcqSwazdij361bFzkj2KQvIwlans6g<br />
DArObd2ly8MBq5VPZ8o0r69gcmDvz2bTTwxgQN4IATK+gY37QWVyoAaXr2HXJev8Vi/MRc6Oub3Z<br />
qET9UY9RobYbHth6y0Z6DksI1982R7TMpyDsoVtymrG/He8Cz46fn/oIERdDnilnLWjtoOh2FEHR<br />
2Reds/bPH7bfd7x2271AnDVqcPVLNHXVPiNNdL0G/mwFitTBf6iXBSVmouz1qpZx2RAotwjjqcPx<br />
2FWjqUa4ytXMNlFKq4U1NjbUuLBZfetmEoXokdK+o5+T4kr+ShF8IZ19Uh9kefintCQPr5JPS7wm<br />
vF3j6xv3XqimT/gq3gDiqSCZ2+oOm1eylILpsjRwbmwCH12WaVQ4T0eyEdxfZSNd21pVOdUEU656<br />
3O2Q20NAHkkqu7JzZ4UDRuVtltJvNam70OzdBsQHChvSpwddvEnq4Ix0O1j2YIqUcXAZ28KqqYMI<br />
wIbsUIiyafzLU9ErV613+VRs3Q6fTp7ecy0XqT5Uk1kewNpzsNSKRTPh4+tqbRNcEaoTUmVmkZC8<br />
HDGuPjRooo3GQS5hit0d0dra6SJKJ5akJKqc7Z6ks0Lu+njxGMoauXs/W90jLRXvftHKxnSVDbq7<br />
U7fDONs2JHtop0NbV+h2vFqn39j/aplt+qPVdgWrlTAyqKM+8iwcosm2bxtK5tpQ4rG+qaauJUwe<br />
yye4yCfTSK+G1XpWyjxVmwi2QjgDCmcMkTlDlD00/3PJKT2cKDlW2EYLGK5CcmmflQ3R/vYo3ikv<br />
vlQwzHaK7FYdjyK64oVx+VDgBmmFRUEGhYXUKo+CNktVLsXmUfAo4UJW4UxQp9BdRVTbbCCEqxvO<br />
1dKIxMnFRVQOFqNhoJvFvLmtu5mNEo01ZI6eIwh/YAVE3cT+2ndKiIzVuCX5ImlMvQuprX1Qvq5p<br />
nGO/4BpcUMpb41lODp63O5ubnd49ezZY+j6rerBTtdniMVFzQSCoFANXJDyTbKq7SPbxY9GRZHcX<br />
0NXwF5X5hmWQnkEXUNq00IHU1pWrF477CxZvWwpb5SuVrH2cbtJBumtlOEVGm9XUu2YYldeKXl32<br />
sAfn2PkbpfiVcqOrkava7pG9dXh8+vrFwX8qI2Y4Z+Zwluw9ES15zaJAvdiRikVG8ZMhQ0owSQXG<br />
Q/7aC/ee3BO4Qy2/p0KJuJR8WSygarXlyWj3FZeeYEGP8FYc6KtYYBQD++7VYiGJttz1eVdJ9eEn<br />
ZQTnWpe7o6X+VHbqsGx7RHCvd9vLB4OzXpR96j0ShXwLvCH/CErsYSfoDeFYIwIffhbvO8dHe+KH<br />
7CrLbzLMFTfbS05eYfWz555ZV1i/qtYZfTX+L2pdZmuzqjO+BebCp3Hp3lm0GNxJ/HiZJL98aldo<br />
vmiyp+nr49dHp28P3v5wCgcAgQTRwo3xZjpuziWKlXXSMK84SSdJ18qMiG7IOnjypp7KPdlXMMTl<br />
mtXepPtYfjeJDd2vBpOFmA8Hr3/+eS9Oh+ls7/37zlmXRg9eFRMQevAVSylKSBG2kOKMF4WddJp9<br />
7xjmyvGslSJbahPQ7grP5CZJePa5RKiCZcoDZxff/t1zQ5sbwOYWib/i4U/C4CRPVxgHnds3FC8O<br />
Tr7ffyYqiX/PoNx9f3Ry9ObgRffZq5OTo2dvj1+d/D8fNNmlifJ4SnWclXTJSBqDO8k4S2WULIe2<br />
ec0TKbdqDI+HB3dF4CUKVaEVGwA80RJlhG8i+E0DuKbMjui3Xi8IKOeMEpdpiHAMdalktnIYFsOT<br />
SrEPLDR4EuimPkXhZOFZLLvdiCsWMJ/c/MqSC64ddImLUYze9ntjk0TlUx2yJCmWjIg6+ze0+TgZ<br />
R1fEHjUlQfJBeI7d+9XEH6+7qk8jq5ShEmfOALBEtahS6ZT17h4dpaOhVOH2HFwXvkxFxnHb8t2Q<br />
/YuG7CiYkm1JP+la4RhiV8lpuTf6qdfLhRp5ls3heZpLv/5NBBp1dT1O9CLL1QaYszL+PEhhtGMQ<br />
RzlKr/Feu2uD0MpLfopzRM3xhTpiIIRRW1UH+9tfmyKfzXIb/V4pAh9aL4TzWVyt2FTLeLDIFlVc<br />
WJiihhxePmS6edS/uflaN4quk6pLUBPbupUVvGe68KbVkh0aip12u76c/Io9bgoRQg8FJTA34URr<br />
Iuwa/5ryAAu5OEU7gYnZshh0wHMr4Dp5mqXnvuctVG6+C02Xykg9sqGeLWRhq1WIMpqFSWmSSprH<br />
JNSjugHYSOiSgAVEDkMoHRXpdpxheUvKG1bkzS/wzMRwr5Kos89EpIag6E00G1bs/LjS+Rt8HUhv<br />
e4Gnm+qwAUZJxo5w+lZeH+ipMQ5iWYw8Maf5CD0xGeYjkjAfGuADpX1bIUGXmtV9+LUurVQEq86c<br />
Tfok57teU0PUF+it+50fqsFOz6dQakVi7F9Fw6RAcAayBBhpa7uU9dx6+yBfKpU+8IUulGGBjD2W<br />
YYiW7gsK5MQU4Fng3nHzxj4jwC9jNIMGoujZiyzxGNhBoPHOVWdgR/r0ViFZFeVTdgEjotKuiDVV<br />
oUTvjCx2f4rf+A7yep6PnC8OvAGyJ2w2vC2tjqaOzVMURzNyYooUnk8mFZeMi4zKhea2jB/AQW3J<br />
YVOzRhzPuJhLVWRGtDLaFwzgrmV42GQzWlzNA1jNkH+bLGvpRzLrk8EZVbjhRLsny2cZ/wBbJ/Z9<br />
jRRPSee2v6Bkk7iE8xCQ9i6omqBu7bp8zG7QqLlntRAJpDqmzsK73VgeM5yqtVWCuxJhKNu9Egls<br />
kbz7s720lj3ILLtW5g+oMCYX4SUsc/T/EOEu4RHAuIY7K9eZDNtXq6jlO28hu8AwlW4IW3q+SAiK<br />
ds0RDwdafpWE0343Vph6MgjcH4yE26iHJVAlC7M92CVpbAJIpwN7+dNW2Ro7z7Kd78vGKF5qVELH<br />
bB8OsGn6+c1K1P7VRF4Gr4p7/REckiBXp7007t3Cm/PrBFJMt6FG8bw/OyfjBfWHnAvbF2leqD/u<br />
m/aOoz0oLdwomprV0jrB6pp0jQ5XoWKq7OGPX2O9Z2hQhii9/kYbAm0Fie9yqIYUMmB78KaOlN1n<br />
TMxLSkEVr0JK7VqBn9Sfj1+d0gbSrW+gPVjlWvm419LaoevChf3+ACnawTVyuCX2iUbOl/3jRGJ+<br />
SkaY/LPhmB5jPgTbsC1+ZFIz61Ked8/lF++08s++KsOlyS/uOOwvM0p06B4p5tUj8CYWl22UJipS<br />
JYML0nEySi96qgqBekdOQOUv5b+nc7QghM1XvQzHaYH4nUEpwiXu2anXcR0haozV2dZtel8W4ZR4<br />
94ZplOZpWQ+DFKwpE5UzSImg1Jl2kAWJ342TAdkrjPAwjZXmw+YE8W4478vA3B/DgoF21IlO1uby<br />
DsuGaf94LhOeq4Q4qfiONiT9VEYu7tDm8O/zBAYvqNAOZAxlglcEbvVX0fvwLhrNk72tnjAAk0+l<br />
R764b/6+pt2ksBJvlreM0z2kYS7l39kuxDZLC3lhUivOFXkcp8UgyhgYhFH70kmSkRZRwjNqtqQl<br />
Q4kNQT4Yo4ABy4YBoNvwB1lMX6fqkIUdK5VEPHKGHfJIixmaJ3YqYeHPydpaiJDHpj2trdud+/Ye<br />
TuBogtjjMUILY61E8zvZ7iT+DquWxknRaiIP3Gw3YQiAagRMQQjMwHycFVL9Hmr4AEbREkEoHk8M<br />
m7YnHl8/1c2Gv2ZtaSX7JjHg59BSO0wvdM4TrTR3ppm896ZOkEFjy5wXx19GfwyGVmSXjpZCwnxA<br />
V2szhJR0Djrg87QsNeoCUwW4aQ1IWpzDtof4A9ZpgNPufJLGxTkaUFp/XqCKOo3xPwyw56bD+Niw<br />
Gn6w0MrDHJMi4rScySmLcOm2UbqgiRmGENmW7gmvjw95xiNeG7opkOjGCVX9hVsnLDmNcxlXGMR9<br />
51LrdxRta963duRZgx2AcdXd1usjQibZLaWBapbVPsEWfGEkPcxQ1bzJ2LtPsBWSZ/BqguQ/KlSv<br />
dZ9nmI1HHqVD0E+mfThT4lQaY02NSF2V8Q+Pej++tKwDHNn5/GbsUQsdJsUVAlEcZdfpNM/GZDUh<br />
fqRd0nE71t5kWAa+uVX6Tnbc0goQuVE3XJihQ367d5aF1aNLwQtVzyoXIDCsHA0KYaZyFmhlrNq6<br />
GjVBQNU2VomSaXZCz3nYUOPnpCofLpvy3gG4vV/SiDTN0FtpAh0/TH/7b5CHMzlfaLbcOwzCprst<br />
2dhpx/YHxFW080Eb7T0juCrGbMQS2M27Gnyj3E6gE+xLW0dG/b3PpviPw6NvZJFx8vXSMis3dv9c<br />
kV83JLqT0xVDnPphcQn7uuwMYb0ySpWH1mdTfH/y6uWROEUy3pI/DmJeaKrcj4M+9EZ0kSMm6Dut<br />
Jcl2yhC5u+Gi2myKn5CQt8wcTveL/KM97Gr+Vxdam+HutBWAzKwmfi0GVCuikH+VFdIWf7Tn5T87<br />
e06ZqtCc4IufDo++Q+KvuII2jy3rbI2j7lax8xnn2KZVeEm6PIX5nRd9xEL0yo7iM6yok1cn4u2b<br />
V+8O3r56wB0D7kR86yElUzL7RsP9qLD3bXN8RA783UzeKzRsLYi5VABmDPjtFCMauVJpoz42teYg<br />
K8qshrreXWWv9ku9yo+ztozai2B1SMuIFMprfxhZ6PdTdMJIs0T3IKuMRcNFsmZu02dtbsH7iBax<br />
qhzIi+/SUjguMvYGjZMLJJqUr20C9EcJRFtVUFJEgmiJoU3bPgAB0XsUSzO1bkdgxm6HXnnhhtoU<br />
pLMekdtn9BB4kIi4XvCB3sNrAugvpWvzDOGLBpQTVUQzFlFMHQKrgUCcQ4gSXgCNg+LclqCJN394<br />
84L5ei1JtaDZCuV0MJt005mEOSUMBv7Za0udsBz/aqiBXRVqIKBYA1HQDtQ9aWFFaerRmJ71RIuN<br />
saGauTI41XFIUWyJPSVagQqCLf3FKkmvZuo7mrI6Ghg184aMzEQuMJgZHhJQVCqLgswLIihUm6XF<br />
GRZyU7LXYOky1TVhgyn77IEvxFDnoxgdzuhGFbdi+1vtB1ltz5d5ZmdqaMRgk2Lr1YvD07cHf35x<br />
5Mm+Vf/l7dHp2+OT733VRNmgrjho36ImQmXs+tiHq4k74e3iKSylIiUtG3T0oYzUpU2cUwQcZZWL<br />
dTleXZ+CvGbyfSaAwsS+Swunz74KxRFsWevYgTxvmpnY7HQ7TWxh86zHm8xrecuK2pSTpwJ2H1Xg<br />
drejCtzuTe6bKtxGo+TchSjJaqXyZNrW2MXC3SDknDMXRspE6BeCERlGVfHNwe9U+X2peH3wRk9j<br />
aH+sAFrbiVt2IEj5+iwjGm2HiomKpH7iPyg4ygXoboB81hgogcOjd0cwZghLQLexIMmxvkmW2ZUW<br />
V54OI7tCVEWDlN3kPqfDkM0hSkB1myoAR+YFti6jWsu9yKcma7Gqro00W9cM/K4vjel+WfqMOF58<br />
daOuAqO2G8uGtMQvUHAruvnWE+0sQB7rzfGLI2SyHrF1hOIo3sitjfGOsb9nUVe8MasS+g5VF7Kb<br />
sG/VVs+RS5XjjXMzvcwsTbMjBhfDOHbE88mIDRRbdCNBvlvWNgFVIfW7c8o37EmqwxXK/oIFnk9B<br />
CpkrZuBEG5eprZ21FknDWIvt++homzUic1qyVFPEnNhkwKy3JilJMd+1tx0PEMk9NixLM3aQdM3J<br />
6nhCzaZjD2l7JLIHu9d1KXVU/choi0Fer6onJlcShHlhc+dDiuQGjd12ZzTe1lhuPdaC6cCU6wj0<br />
2yXMdq2j1Gu8oUGTzKJg3KQt57y5sw+nmtt4PTmcg8yfFltMrB2z2uFz0Xw8EY+vxWMKLsnq4V9P<br />
xa+pePTrgU3Qpxi+E/xLhDNtOG2f3ncPqfrnrbeqtFJcr1BvVenVavwZq2vV9QHVVdzOnWS1llVY<br />
cWSfo8aSVvMhNQYe7E7xfm3DPtTUVnOJn6O6ilhz1eqSfQpuC8f1xpIprf+WDn4J/b/KeYURaamN<br />
93RYWYZ0V8PVbOhYgF/Blq5qSodFVG1oWDHxuS1PXkYUNOwz0uxDv00bjfMUee1G458D4deo5OfR<br />
NRxjaBPAoNsIlIs/6LIJI7VT/F78F87sPIolMgyhuTckHr1bun2y2dGhTGq7Uk5qDj3QQL6B4wT9<br />
2/pZP+tn/ayf9bN+1s/6WT/rZ/2sn/WzftbP+lk/62f9rJ/1s37Wz/pZP+tn/ayf9bN+1s/6WT/r<br />
Z/2sn/WzftbP+lk/6+eLP/8LAUE9RwDwAAA=<br />
==Fine Archivio Base64 ==<br />
<!-- *NON* RIMUOVERE LA RIGA PRECEDENTE --></div>S3vhttps://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&diff=44373Creazione automatica di un file di log per inviare quesiti al forum2021-04-10T08:54:19Z<p>S3v: 1.0.71</p>
<hr />
<div><!-- <br />
NOTA DI COMMENTO RELATIVA A OGNI NUOVO RILASCIO DI DEBIAN:<br />
<br />
* modificare il codename nella riga "#ifeq" sottostante con quello della nuova stable, dopo aver aggiornato questa guida.<br />
* In caso contrario sarà mostrato un messaggio di avvertenza al posto del template "Versioni compatibili".<br />
* Il codename *deve* essere scritto tutto minuscolo (per esempio: jessie).<br />
<br />
--><br />
{{#ifeq: {{Codename|stable|IN_TEMPLATE}} | buster | <br />
{{Versioni compatibili}} |<br />
{{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. }}<br />
}} <br/><br />
<br />
== Introduzione ==<br />
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 [http://forum.debianizzati.org forum] per tentare di risolverlo insieme.<br/><br />
Le informazioni riguardano i seguenti tipi di problema:<br />
* Connessioni di rete<br />
* Video<br />
* Avvio del sistema (boot)<br />
* Audio (tramite lo script ALSA prelevabile [http://www.alsa-project.org/alsa-info.sh qui])<br />
* Sottosistema di gestione dei pacchetti (APT)<br />
* Mount/unmount di periferiche<br />
* Touchpad<br />
* Altro. Verranno inserite nel log solo informazioni generiche (già presenti nel log creato con tutte le tipologie di problema precedenti).<br />
<br />
Lo script crea due file:<br />
;log_''data'':contiene le informazioni in formato testo<br />
;log_''data''.{xz,bz2,gz}:il file precedente ma in formato compresso. Può essere allegato ad una discussione sul forum<br />
<br />
Se si vuole, attraverso lo script è anche possibile inviare il file direttamente a [https://paste.debian.net 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.<br/><br />
Prima di effettuare l'invio, e nel caso sia installato il pacchetto facoltativo <code>pastebinit</code>, lo script chiede un esplicito consenso all'utente.<br />
<br />
== Pacchetti opzionali ==<br />
Lo script utilizza alcuni comandi che potrebbero non essere installati di default sulla propria macchina. La loro installazione è del tutto facoltativa e non pregiudica in alcun modo le funzionalità messe a disposizione dallo script.<br><br />
;aptitude:Viene utilizzato per ricavare informazioni quali il gestore di sessione e i pacchetti non appartenenti alla [[release]] di Debian predefinita. Per installarlo:<pre># apt install aptitude</pre><br />
;pastebinit:Permette di usufruire del servizio offerto da paste.debian.net per la condivisione del testo. Per installarlo:<pre># apt install pastebinit</pre><br />
<br />
{{Box|Nota|Lo script è liberamente modificabile.<br/>Per ogni segnalazione, informazione o suggerimento fare riferimento a [http://forum.debianizzati.org/viewtopic.php?f{{=}}13&t{{=}}45098 questa] discussione sul forum.}}<br />
<br />
== Privacy dell'utente ==<br />
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).<br />
<br />
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.<br />
<br />
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''.<br />
<br />
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 [http://forum.debianizzati.org/viewtopic.php?f=13&t=45098 discussione apposita] o all'interno della pagina di discussione.<br />
<br />
== Utilizzo ==<br />
# Eseguire un upgrade del sistema, se possibile, in modo che le informazioni raccolte dallo script siano aggiornate.<br />
# 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 <code>scriptlog-debianizzati.org</code>.<br />
# Assegnare i permessi di esecuzione al file appena creato; ad esempio, da terminale o emulatore di terminale:<pre>$ chmod a+x scriptlog-debianizzati.org</pre>In alternativa, se si preferisce, è possibile eseguire il seguente comando:<pre>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</pre>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.<br />
# Eseguire da terminale (o emulatore di terminale) lo script con i permessi di [[root]]:<pre># ./scriptlog-debianizzati.org</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.<br />
# Leggere le informazioni a video.<br />
<br />
== Parametri dello script ==<br />
Lo script accetta, in maniera facoltativa, alcuni parametri:<br />
;--tipo={rete|video|boot|audio|apt|mount|touchpad|generico}:specifica il tipo di problema<br />
;--nocompress:non crea il file compresso del file di log<br />
;--nopaste:non invia il file di log a paste.debian.net<br />
;--update:aggiorna lo script se esiste una versione recente<br />
;--base64:crea un file contenente la codifica base64 dello script<br />
;--debug:crea un file contenente le informazioni utili per il debug dello script<br />
;--versione:visualizza la versione dello script<br />
;--help:visualizza informazioni sull'utilizzo dei parametri<br />
<br />
'''Esempi:'''<br />
<pre><br />
# ./scriptlog-debianizzati.org --tipo=rete<br />
# ./scriptlog-debianizzati.org --tipo=apt --nocompress --nopaste<br />
# ./scriptlog-debianizzati.org --versione<br />
# ./scriptlog-debianizzati.org --help<br />
</pre><br />
<br />
<!-- commento (leggibile per chi modifica la pagina)<br />
<br />
<br />
*IMPORTANTE*<br />
<br />
Se si modifica lo script è *necessario* seguire le istruzioni alla pagina:<br />
<br />
http://guide.debianizzati.org/index.php/Aiuto:LogScript<br />
<br />
in modo da aggiornare l'archivio in formato Base64<br />
<br />
<br />
--><br />
== Script ==<br />
<syntaxhighlight lang="bash"><br />
#! /bin/bash<br />
<br />
# --------------------------------------------------------------------------<br />
# Impostazioni<br />
# --------------------------------------------------------------------------<br />
<br />
# I file creati saranno leggibili e scrivibili da tutti<br />
umask 0011<br />
<br />
# Intercettazione Ctrl+C<br />
trap _exit INT<br />
<br />
# Abilitazione dell'opzione 'extdebug' necessaria per espandere ARGC in<br />
# Bash 5 e versioni successive<br />
shopt -s extdebug<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni che sovrascrivono comandi<br />
# --------------------------------------------------------------------------<br />
<br />
# Rimpiazza echo ed echo -n, impedendo echo -e e le possibili combinazioni<br />
# Sintassi accettata:<br />
# echo -n "testo" # stampa senza a capo finale<br />
# echo "testo" # stampa con a capo finale<br />
# echo # stampa una riga vuota<br />
function echo {<br />
if [ $# -gt 1 ] && [ "$1" = "-n" ]; then<br />
shift<br />
printf %s "$*"<br />
else<br />
printf %s\\n "$*"<br />
fi<br />
}<br />
<br />
# Sostituisce il comando 'cat' per controllare che al file di log<br />
# venga inviato effettivamente il contenuto di un file di testo<br />
function cat {<br />
if [ "$(file -bL $1)" = 'ASCII text' ]; then<br />
/bin/cat "$1"<br />
else<br />
echo "File non di testo"<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Costanti<br />
# --------------------------------------------------------------------------<br />
<br />
# Versione script<br />
readonly VERSIONE="1.0.71"<br />
<br />
# Path e nome dello script<br />
readonly PATH_NAME="$(readlink -f "${BASH_SOURCE[0]}")"<br />
<br />
# Codename per oldoldstable, oldstable, stable e testing.<br />
# Da modificare nei successivi rilasci di Debian<br />
readonly OLDOLDSTABLE="jessie"<br />
readonly OLDSTABLE="stretch"<br />
readonly STABLE="buster"<br />
readonly TESTING="bullseye"<br />
<br />
# Path dei comandi dello script<br />
readonly PATH="/bin:/sbin:/usr/bin:/usr/sbin"<br />
<br />
# Nome del file di log in base alla data corrente<br />
readonly log="log_$(date '+%d%b_%H%M%S')"<br />
<br />
# Nome del file di debug<br />
readonly script_debug="/tmp/script_debug_$(date '+%d%b_%H%M%S')"<br />
<br />
# File descriptor per il debug<br />
FD=9<br />
<br />
# URL remoto della pagina contenente lo script<br />
readonly SCRIPTURL="http://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&action=edit"<br />
<br />
# URL remoto della pagina contenente lo script codificato in base64<br />
readonly SCRIPTURL_BASE64="http://guide.debianizzati.org/index.php?title=Aiuto:LogScript&action=edit"<br />
<br />
# nome utente<br />
utente=$(logname) &&<br />
[ "$utente" != "root" ] || {<br />
# NOTA: "root" è permesso (solo) se scelto esplicitamente dall'utente<br />
tmputente2=$(getent passwd 1000 2> /dev/null | cut -d ":" -f 1) ||<br />
tmputente2=""<br />
echo -n "Inserisci il tuo nome utente"<br />
if [ -n "$tmputente2" ]; then<br />
echo -n " (lascia vuoto per \"$tmputente2\"): "<br />
else<br />
echo -n ": "<br />
fi<br />
read tmputente &&<br />
tmputente=${tmputente:-$tmputente2} &&<br />
# non può contenere: spazi, tabulazioni, nuove righe; né essere vuota<br />
[ -n "${tmputente##*[[:space:]]*}" ] &&<br />
# deve esistere in /etc/passwd (o equivalente)<br />
getent passwd "$tmputente" > /dev/null 2>&1 || {<br />
echo "Nome utente non valido o non esistente!" >&2<br />
exit 255<br />
}<br />
utente=$tmputente<br />
unset tmputente<br />
unset tmputente2<br />
}<br />
readonly utente<br />
<br />
# nome host<br />
readonly nomehost=$(hostname)<br />
<br />
# Codici stile carattere<br />
readonly ROSSO="\033[01;31m" # colore rosso e grassetto<br />
readonly VERDE="\033[01;32m" # colore verde e grassetto<br />
readonly BOLD="\033[01m" # grassetto<br />
readonly FINE="\033[0m" # reset<br />
<br />
# variabile che vale 1 se systemd è installato<br />
[ "$(ps -o comm= -p 1)" = "systemd" ] && systemd=1 || systemd=0<br />
readonly systemd<br />
<br />
# --------------------------------------------------------------------------<br />
# Sezione relativa ai parametri dello script<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che segnala un errato utilizzo dei parametri e termina lo script<br />
function _parm_err {<br />
echo "Parametri non validi" && _parm_uso<br />
}<br />
<br />
# Messaggio di errore se viene specificato più di un tipo di problema attraverso<br />
# i parametri.<br />
function _parm_tipo_err {<br />
echo "È possibile specificare un solo di tipo di problema" && _parm_uso<br />
}<br />
<br />
# Messaggio visualizzato nel caso in cui venga specificato lo stesso parametro<br />
function _parm_rip_err {<br />
echo "È stato immesso lo stesso parametro" && _parm_uso<br />
}<br />
<br />
# Messaggio visualizzato nel caso in cui --help non sia l'unico parametro specificato<br />
function _parm_uso_err {<br />
echo "Il parametro $1 non deve essere accompagnato da altri parametri" && _parm_uso<br />
}<br />
<br />
# Funzione che stampa informazioni sull'utilizzo dei parametri<br />
function _parm_uso {<br />
printf %b "<br />
Utilizzo dei parametri:<br />
<br />
$BOLD--tipo={rete|video|boot|audio|apt|mount|touchpad|generico}$FINE<br />
utilizzato per specificare un solo tipo di problema.<br />
Es: --tipo=apt<br />
<br />
$BOLD--nocompress$FINE<br />
non viene creato un file compresso del log<br />
<br />
$BOLD--nopaste$FINE<br />
non viene inviato il log a paste.debian.net<br />
<br />
$BOLD--update$FINE<br />
viene aggiornato lo script se è disponibile una nuova versione<br />
<br />
$BOLD--base64$FINE<br />
viene creato un file con la codifica base64 dello script<br />
<br />
$BOLD--debug$FINE<br />
crea un file contenente le informazioni utili per il debug dello script<br />
<br />
$BOLD--versione$FINE<br />
visualizza la versione dello script in esecuzione<br />
<br />
$BOLD--help$FINE<br />
visualizza queste informazioni<br />
<br />
" && exit<br />
}<br />
<br />
# Visualizza la versione corrente dello script<br />
function _showvers {<br />
echo "$VERSIONE" && exit<br />
}<br />
<br />
# Inizializzazione di variabili. La variabile TIPO serve ad evitare ripetizioni<br />
# nel passaggio del parametro tipo=blabla<br />
NOCOMPRESS=0 NOPASTE=0 TIPO=0 TIPO_RETE=0 TIPO_APT=0 TIPO_VIDEO=0 TIPO_BOOT=0<br />
TIPO_AUDIO=0 TIPO_MNT=0 TIPO_TOUCH=0 TIPO_COMM=0 UPDATE=0 BASE64=0<br />
DEBUG=0<br />
<br />
while [ $# -gt 0 ] ; do<br />
case "$1" in<br />
"--base64") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || BASE64=1 ;;<br />
"--update") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || UPDATE=1 ;;<br />
"--nocompress") [ "$NOCOMPRESS" -eq 1 ] && _parm_rip_err || NOCOMPRESS=1 ;;<br />
"--nopaste") [ "$NOPASTE" -eq 1 ] && _parm_rip_err || NOPASTE=1 ;;<br />
"--tipo=rete") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_RETE=1 ;;<br />
"--tipo=apt") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_APT=1 ;;<br />
"--tipo=video") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_VIDEO=1 ;;<br />
"--tipo=boot") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_BOOT=1 ;;<br />
"--tipo=audio") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_AUDIO=1 ;;<br />
"--tipo=mount") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_MNT=1 ;;<br />
"--tipo=touchpad") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_TOUCH=1 ;;<br />
"--tipo=generico") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_COMM=1 ;;<br />
"--debug") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || DEBUG=1 ;;<br />
"--versione") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _showvers ;;<br />
"--help") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _parm_uso ;;<br />
*) _parm_err<br />
esac<br />
shift<br />
done<br />
<br />
# --------------------------------------------------------------------------<br />
# Debug<br />
# --------------------------------------------------------------------------<br />
function _debug {<br />
[ "$DEBUG" -eq 1 ] && [ ! -e /proc/$$/fd/"$FD" ] &&<br />
{<br />
exec {FD}>"$script_debug"<br />
export BASH_XTRACEFD="$FD"<br />
set -x<br />
}<br />
}<br />
<br />
function _close_debug {<br />
set +x<br />
exec {FD}>&-<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni iniziali<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che stampa il messaggio introduttivo<br />
function _intro {<br />
echo "<br />
*********************************************************************************<br />
* www.debianizzati.org *<br />
* *<br />
* Script che crea un log utile alla risoluzione dei problemi più comuni *<br />
* Versione $VERSIONE *<br />
* *<br />
*********************************************************************************"<br />
}<br />
<br />
# Funzione che stampa alcune avvertenze sullo script<br />
function _avvertenze {<br />
local risp<br />
echo "<br />
-- Lo script richiede i permessi di root per essere eseguito<br />
-- Per inviare il log su paste.debian.net è necessario il pacchetto 'pastebinit'<br />
-- L'invio del log a paste.debian.net avverrà solo dopo esplicito consenso<br />
-- Verrà creato un file contenente l'output di questo script<br />
-- Verrà creato un file in formato compresso da inviare al forum"<br />
echo -n "Continuare [S/n]? "<br />
read risp || risp="ERROR"<br />
<br />
# Se non viene premuto "s" o "S" o [Invio], lo script termina<br />
[ -z "$risp" ] || [ "$risp" = "s" ] || [ "$risp" = "S" ] || _exit<br />
}<br />
<br />
# Funzione che esegue un check preliminare<br />
function _check {<br />
if [ $EUID -ne 0 ]; then # Lo script viene lanciato da root?<br />
echo "Lo script deve essere lanciato da root" && _exit<br />
fi<br />
<br />
# Se esiste già un file di log con lo stesso nome oppure file compressi con lo<br />
# stesso nome di quelli che verranno creati, lo script chiede se cancellarli o meno<br />
local risp<br />
if [ -f "$log" ] || [ -f "${log}.xz" ] || [ -f "${log}.bz2" ] || [ -f "${log}.gz" ]; then<br />
echo $'\n'"Esiste già un file ${log}, ${log}.xz, ${log}.bz2 o ${log}.gz nella directory corrente."<br />
echo -n "Sovrascivere [S/n]? "<br />
read risp<br />
case "$risp" in<br />
""|[Ss]) rm -f -- "$log" "${log}.xz" "${log}.bz2" "${log}.gz" > /dev/null 2>&1 ;;<br />
*) exit 1<br />
esac<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni per l'invio del log a paste.debian.net<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione per separare il log in parti per l'invio a paste.debian.net<br />
function _split_and_send { <br />
local paste_url='https://paste.debian.net'<br />
local chunk_prefix='pastebin'<br />
local chunk_num=1<br />
local paste_exit_status=0<br />
local chunkfile pastelink<br />
<br />
# dimensione massima del singolo file da inviare<br />
local chunk_size='60k'<br />
<br />
# termina la funzione se il log è più grande di chunk_size x 4 (numero di parti impostate)<br />
if [ "$(du -k "$log" | cut -f1)" -gt 240 ]; then<br />
echo "Log troppo grande per essere inviato a paste.debian.net"<br />
echo "Allegare il file compresso alla discussione sul forum."<br />
return 1<br />
fi<br />
<br />
# rinomina parti di log preesistenti (se ve ne sono)<br />
# scarta i messaggi di errore (se presenti)<br />
rename "s/${chunk_prefix}/old-${chunk_prefix}-$(date '+%s')/" "$chunk_prefix".* > /dev/null 2>&1<br />
<br />
# dividi il file di log in parti di $chunk_size bytes senza spezzare le linee<br />
# scarta i messaggi di errore (se presenti) per log di dimensione superiore a 10 parti<br />
# (max 10 parti con l'opzione -a)<br />
split -a 1 -d -C "$chunk_size" "$log" "${chunk_prefix}." > /dev/null 2>&1<br />
<br />
# comunica il numero di parti inviate<br />
chunk_num=$(find . -maxdepth 1 -type f -name "${chunk_prefix}.*" -printf x |<br />
wc -c)<br />
if [ "$chunk_num" = 1 ]; then<br />
echo $'\nIl log sarà inviato in un singolo file.'<br />
else<br />
echo $'\n'"Il log sarà inviato in ${chunk_num} parti."<br />
fi<br />
<br />
# invia al massimo 4 parti<br />
echo $'\nIl log è consultabile ai seguenti indirizzi:'<br />
for chunkfile in "${chunk_prefix}."[0-3]; do<br />
<br />
# verifica l'esistenza del file da inviare<br />
if [ -f "$chunkfile" ]; then<br />
<br />
# invia dati tramite pastebinit, l'output d'errore viene soppresso<br />
pastelink=$(pastebinit -a '' -b "$paste_url" -i "$chunkfile" 2>/dev/null)<br />
<br />
if [ $? = 0 ]; then<br />
# invio apparentemente riuscito (pastebinit exit status = 0)<br />
<br />
# controlla URL restituita da pastebinit<br />
case "$pastelink" in<br />
# verifica in caso di URL corretta<br />
"$paste_url"/[0-9]*)<br />
echo ".. inviato ${chunkfile} all'indirizzo ${pastelink}"<br />
;;<br />
# verifica in caso di URL non corretta<br />
*)<br />
echo ".. ${paste_url} ha restituito una URL non valida (${pastelink}) per ${chunkfile}!"<br />
paste_exit_status=1<br />
esac<br />
<br />
else<br />
# Invio fallito (pastebinit exit status = 1)<br />
echo ".. non riuscito invio ${chunkfile}"<br />
paste_exit_status=1<br />
fi<br />
<br />
fi<br />
<br />
done<br />
<br />
# cancella le parti di log inviate<br />
for chunkfile in "./${chunk_prefix}."[0-9]*; do<br />
if [ -f "$chunkfile" ]; then<br />
rm -f -- "$chunkfile"<br />
fi<br />
done<br />
<br />
return $paste_exit_status<br />
}<br />
<br />
# Funzione che invia il log a paste.debian.net<br />
function _upload {<br />
# Nessun invio a paste.debian.net se viene scelto "--nopaste"<br />
[ "$NOPASTE" -eq 1 ] && return<br />
<br />
local risp<br />
# Pastebinit è installato?<br />
if [ ! -f /usr/bin/pastebinit ]; then<br />
echo $'\nNon è possibile inviare il log a paste.debian.net\nIl pacchetto "pastebinit" non è installato.'<br />
return 1<br />
fi<br />
# Invia il file log.txt a paste.debian.net<br />
echo -n $'\nInviare il log a http://paste.debian.net [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
_split_and_send<br />
if [ $? = 0 ]; then<br />
echo $'\nIl log è stato inviato'<br />
else<br />
echo $'\nSi sono verificati errori nell\'invio del log!'<br />
fi<br />
;;<br />
*)<br />
echo "Il log non è stato inviato"<br />
esac<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni di creazione del file compresso e messaggi di successo/fallimento<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzioni richiamate in caso di corretta/scorretta creazione del file compresso<br />
function _compress_ok { echo "File compresso creato correttamente nella directory corrente."; }<br />
<br />
function _compress_err { echo "Errore nella creazione del file compresso."; }<br />
<br />
# Funzione che crea il file compresso<br />
# Prova a creare nell'ordine: un file .xz, un file .bz2 o un file .gz<br />
function _compress {<br />
# La funzione termina se è stato utilizzato il parametro "--nocompress"<br />
[ "$NOCOMPRESS" -eq 1 ] && return<br />
<br />
local risp<br />
echo -n $'\nCreare un file compresso [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
echo "Sta per essere creato un file compresso..."<br />
sleep 1<br />
if [ "$(command -v xz)" ]; then<br />
xz -e < "$log" > "${log}.xz" && _compress_ok || _compress_err<br />
elif [ "$(command -v bzip2)" ]; then<br />
bzip2 -9 < "$log" > "${log}.bz2" && _compress_ok || _compress_err<br />
elif [ "$(command -v gzip)" ]; then<br />
gzip -9 < "$log" > "${log}.gz" && _compress_ok || _compress_err<br />
else<br />
echo "Impossibile effettuare la compressione!" >&2<br />
fi<br />
;;<br />
*)<br />
echo "Non è stato creato un file compresso."<br />
esac<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzione di stampa menù e selezione del problema<br />
# --------------------------------------------------------------------------<br />
<br />
function _scelta {<br />
<br />
# Problemi selezionati in base al parametro passato allo script<br />
[ "$TIPO_RETE" -eq 1 ] && _wait && _header "rete" && _rete && return<br />
[ "$TIPO_VIDEO" -eq 1 ] && _wait && _header "video" && _video && return<br />
[ "$TIPO_BOOT" -eq 1 ] && _wait && _header "boot" && _boot && return<br />
[ "$TIPO_AUDIO" -eq 1 ] && _wait && _header "audio" && _audio && return<br />
[ "$TIPO_APT" -eq 1 ] && _wait && _header "APT" && _apt && return<br />
[ "$TIPO_MNT" -eq 1 ] && _wait && _header "mount-unmount" && _mount && return<br />
[ "$TIPO_TOUCH" -eq 1 ] && _wait && _header "touchpad" && _tpad && return<br />
[ "$TIPO_COMM" -eq 1 ] && _wait && _header "generico" && _common && return<br />
<br />
# La funzione presenta un menù di scelta nel caso non sia stato passato alcun parametro<br />
local num<br />
<br />
clear<br />
_intro<br />
echo "<br />
Selezionare il tipo di problema per il quale verrà generato il file di log<br />
[1] Problemi relativi alle connessioni di rete<br />
[2] Problemi video<br />
[3] Problemi di boot<br />
[4] Problemi audio<br />
[5] Problemi di gestione dei pacchetti (APT)<br />
[6] Problemi di mount/unmount<br />
[7] Problemi di funzionamento del touchpad<br />
[8] Altro tipo di problema<br />
[0] Uscita"<br />
<br />
while true; do<br />
echo -n "Scegliere il numero corrispondente: "<br />
read num<br />
case "$num" in<br />
[1-8]) _wait ;;& # ;;& -> va alla successiva occorrenza del carattere immesso<br />
1) _header "rete" && _rete ;;&<br />
2) _header "video" && _video ;;&<br />
3) _header "boot" && _boot ;;&<br />
4) _header "audio" && _audio ;;&<br />
5) _header "APT" && _apt ;;&<br />
6) _header "mount-unmount" && _mount ;;&<br />
7) _header "touchpad" && _tpad ;;&<br />
8) _header "generico" && _common ;;&<br />
[1-8]) break ;; # Termina il ciclo 'while'<br />
0) _exit ;; # È stato inserito '0' . Uscita dallo script<br />
*) # Tutti gli altri caratteri. Cancella l'input immesso e ripete la domanda<br />
tput cuu1 # in alto di una riga<br />
tput ed # cancella fino alla fine dello schermo<br />
esac<br />
done<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni varie<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che stampa solo parentesi e il nome del comando, prima di eseguirlo<br />
function _prompt {<br />
echo -n "[ ] $*"<br />
}<br />
<br />
# Funzione che stampa un pallino colorato in base al primo parametro<br />
function _printdot {<br />
echo<br />
tput cuu1 # in alto di una riga<br />
tput cuf1 # a destra di uno spazio<br />
printf %b "$1•${FINE}\n" # stampa pallino e va a capo<br />
}<br />
<br />
# Funzione che stampa un pallino di colore verde in caso di comando con output<br />
function _ok { _printdot "${VERDE}"; }<br />
<br />
# Funzione che stampa una pallino rosso in caso di comando privo di output<br />
function _error { _printdot "${ROSSO}"; }<br />
<br />
# Funzione che stampa in grassetto gli argomenti<br />
function _bold {<br />
printf %b "${BOLD}"<br />
echo -n "$*"<br />
printf %b\\n "${FINE}"<br />
}<br />
<br />
# Funzione che invia nel file di log due righe tra le quali viene visualizzato il<br />
# nome del comando (passato come primo parametro della funzione -> $1)<br />
function _nome_e_riga {<br />
echo "<br />
******************************************<br />
$1<br />
******************************************" >> "$log"<br />
}<br />
<br />
# Funzione che stampa un messaggio di attesa<br />
function _wait {<br />
echo $'\nCreazione del log in corso...\n'<br />
}<br />
<br />
# Intestazione del file di log<br />
function _header {<br />
echo "Tipo di problema: $1" >> "$log"<br />
_data<br />
_lastupd <br />
echo "Versione script: $VERSIONE" >> "$log"<br />
}<br />
<br />
# Stampa la data corrente nel file di log<br />
function _data {<br />
echo "Log creato il: $(date '+%d %B %Y alle %H.%M')" >> "$log"<br />
}<br />
<br />
# Quota i caratteri specificati per le parole da nascondere con sed<br />
# Es: abc.def -> abc\.def<br />
function _sed_quote {<br />
# array di caratteri da quotare<br />
local quotearr=("." "/")<br />
<br />
local retstr="$1"<br />
for char in "${quotearr[@]}"; do<br />
retstr="${retstr//$char/\\$char}"<br />
done<br />
echo "$retstr"<br />
}<br />
<br />
# Funzione che nasconde nel log alcune informazioni sensibili<br />
function _hide {<br />
<br />
# Sostituisce il nome utente e il nome host con 'nomeutente' e 'nomehost' se diversi da [dD]ebian<br />
if [[ "$nomehost" =~ .*"$utente".* ]]; then<br />
[ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log"<br />
[ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log"<br />
else<br />
[ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log"<br />
[ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log"<br />
fi <br />
<br />
# Nasconde gli ESSID gestiti attraverso Network Manager<br />
local var file mydir="/etc/NetworkManager/system-connections/"<br />
<br />
if [ -d "$mydir" ]; then # se esiste la directory /etc/NetworkManager/system-connections/ ...<br />
for file in "$mydir"/*; do # ciclo attraverso il contenuto della directory<br />
if [ -f "$file" ]; then # se l'elemento è un file...<br />
var=$(sed -n "s/ssid=//p" "$file") # ... var conterrà l'eventuale ESSID...<br />
if [ -n "$var" ]; then # ... e se è diverso dalla stringa vuota...<br />
sed -i "s/${var}/\*script-removed\*/g" "$log" # ... lo nasconde nel file di log<br />
fi<br />
fi<br />
done<br />
fi<br />
<br />
# Nasconde nel log i nomi delle connessioni gestite da NetworkManager<br />
sed -i -r "s/(NetworkManager.*keyfile.*((parsing)|(read connection))).*/\1 \*script-removed\*/" "$log"<br />
sed -i -r "s/(NetworkManager.*keyfile: new connection.*system-connections\/)(.*)( \(.*,\").*(\"\))/\1\*script-removed\*\3\*script-removed\*\4/g" "$log"<br />
sed -i -r "s/(NetworkManager.*policy: auto-activating connection ').*(')/\1\*script-removed\*\2/g" "$log"<br />
sed -i -r "s/(NetworkManager.*Activation: starting connection ').*(')/\1\*script-removed\*\2/g" "$log"<br />
sed -i -r "s/(NetworkManager.*policy: set ').*(')/\1\*script-removed\*\2/g" "$log"<br />
<br />
# Nasconde l'indirizzo MAC delle interfacce wireless<br />
local interfaces macaddress line<br />
if [ -f /proc/net/wireless ]; then<br />
# array che contiene i nomi delle interfacce wireless<br />
mapfile -s 2 interfaces < <(awk -F'[: ]+' '{ print $2 }' /proc/net/wireless)<br />
<br />
for i in "${interfaces[@]}"; do<br />
# indirizzo MAC dell'interfaccia solo se questa ne ha uno<br />
line="$(ip -br link show $i)"<br />
if [ "$(echo $line | wc -w)" -gt 3 ]; then<br />
macaddress="$(awk '{ print $3 }' <<< $line)"<br />
macaddress="$(_sed_quote $macaddress)"<br />
# l'indirizzo MAC viene nascosto nel file<br />
sed -i 's/'$macaddress'/\*script-removed\*/g' "$log"<br />
fi<br />
done<br />
fi<br />
}<br />
<br />
# Invia al log l'output del comando passato come primo parametro e<br />
# con i permessi utente<br />
function _su {<br />
echo "$(su -c "$1" $utente)" >> "$log"<br />
}<br />
<br />
# Stabilisce la data dell'ultimo aggiornamento effettuato. Viene preso in<br />
# considerazione il file /var/log/apt/history.log oppure il file /var/log/apt/history.log.1.gz<br />
function _lastupd {<br />
local convdate lastdate file=/var/log/apt/history.log<br />
<br />
if [ -f "$file" ]; then<br />
lastdate=$(sed -n '/^Start-Date/h ; $p' "$file" | cut -d ' ' -f 2)<br />
# se il file history.log non contiene la data dell'ultimo aggiornamento, viene utilizzato history.log.1.gz<br />
[ -z "$lastdate" ] && [ -f "${file}.1.gz" ] && lastdate=$(zcat "${file}.1.gz" | sed -n '/^Start-Date/h ; $p' | cut -d ' ' -f 2)<br />
<br />
# variabile che contiene la data in formato "giorno mese anno"<br />
convdate=$(date -d "$lastdate" '+%d %B %Y')<br />
<br />
echo $"Ultimo aggiornamento del sistema: ${convdate}" >> "$log"<br />
fi<br />
}<br />
<br />
# Funzione che effettua l'aggiornamento automatico dello script<br />
function _self_update {<br />
<br />
echo -n "Aggiornare questo script [S/n]? "<br />
local risp<br />
read risp<br />
[ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit || echo "Aggiornamento in corso..."<br />
<br />
# Controlla l'esistenza di wget<br />
[ ! "$(command -v wget)" ] && echo "Impossibile eseguire l'aggiornamento. Installare il pacchetto wget." && _exit<br />
<br />
# Ricava la versione remota dello script<br />
local vers="$(wget -q -O- "$SCRIPTURL" | sed -n '/^readonly VERSIONE.*/{p;q}' | cut -d '"' -f2)"<br />
if [ "$vers" = "" ]; then<br />
echo "Connessione non riuscita" && _exit<br />
fi<br />
<br />
if [ "$vers" = "$VERSIONE" ]; then<br />
echo "Lo script è gia alla versione più recente"<br />
else<br />
echo -n "È disponibile una nuova versione dello script: " && _bold "$vers"<br />
echo -n "Procedere con l'aggiornamento [S/n]? "<br />
read risp<br />
case "$risp" in<br />
[Ss]|"")<br />
local tempfile="$(mktemp)" # viene creato un file temporaneo<br />
# lo script in formato base64 viene copiato nel file temporaneo<br />
wget -q -O- "$SCRIPTURL_BASE64" | sed -n "/^=S=/{n; :a /^==Fine/ ! {p; n; ba}}" | base64 -d | tar xz -O > "$tempfile"<br />
if [ ! -s "$tempfile" ]; then # Controlla se il file è vuoto<br />
echo "Connessione non riuscita"<br />
else<br />
cp "$tempfile" "$PATH_NAME"<br />
[ $? -eq 0 ] && echo "Aggiornamento effettuato" || echo "Aggiornamento fallito"<br />
#rm -f "$tempfile" # Rimuove il file temporaneo<br />
fi ;;<br />
*)<br />
echo "Non è stato eseguito alcun aggiornamento"<br />
esac<br />
fi<br />
}<br />
<br />
# funzione che crea un file con la codifica base64 dello script<br />
# Da utilizzare in caso di aggiornamenti per modificare la pagina<br />
# http://guide.debianizzati.org/index.php/Aiuto:LogScript<br />
function _base64 {<br />
<br />
echo -n "Verrà creato un file con la codifica base64 di questo script. Continuare [S/n]? "<br />
local risp<br />
read risp<br />
[ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit ||<br />
local tempfile="$(mktemp)" # crea un file temporaneo<br />
tar cf - "${BASH_SOURCE[0]}" | gzip -9 | base64 > "$tempfile"<br />
if [ $? -eq 0 ]; then<br />
echo -n "Il file contenente la codifica base64 di questo script è " && _bold "$tempfile"<br />
else<br />
echo "Codifica non riuscita"<br />
fi<br />
# Modifica i permessi del file in modo che possa essere letto da tutti<br />
chmod 444 "$tempfile"<br />
}<br />
<br />
# Funzione che stampa un messaggio che indica i file creati e poi termina lo script<br />
function _exit {<br />
<br />
# se è stato effettuato un update o una codifica base64, stampa solo il messaggio finale<br />
if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then<br />
local complog=""<br />
<br />
if [ -f "$log" ]; then<br />
echo -n $'\nFile contenente il log dello script: '<br />
_bold "$log"<br />
else<br />
echo $'\nNon è stato creato un file di log'<br />
fi<br />
<br />
if [ -f "${log}.xz" ]; then<br />
complog="${log}.xz"<br />
elif [ -f "${log}.bz2" ]; then<br />
complog="${log}.bz2"<br />
elif [ -f "${log}.gz" ]; then<br />
complog="${log}.gz"<br />
fi<br />
<br />
if [ -z "$complog" ]; then <br />
echo "Non è stato creato un file compresso del log"<br />
else<br />
echo -n "File compresso da allegare alla discussione sul forum: "<br />
_bold "$complog"<br />
fi<br />
<br />
if [ -f "$script_debug" ]; then<br />
echo -n "File contenente l'output di debug: "<br />
_bold "$script_debug"<br />
fi<br />
fi<br />
<br />
echo $'Script terminato\n'<br />
_close_debug<br />
<br />
exit 0<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni relative a ciascun problema selezionato<br />
# --------------------------------------------------------------------------<br />
<br />
# Informazioni comuni a tutti i tipi di problema<br />
function _common {<br />
_dmi_decode<br />
_comando "/bin/uname -a"<br />
_file "/etc/debian_version"<br />
_de_wm<br />
_file "/etc/X11/default-display-manager"<br />
_comando "/usr/bin/groups" "su"<br />
_file "/var/log/syslog"<br />
_comando "/bin/systemctl --failed --no-pager"<br />
_comando "/bin/journalctl -x -b --no-pager -p err"<br />
_comando "/bin/journalctl -x -b --no-pager -p warning"<br />
_comando "/bin/journalctl -x -b --no-pager"<br />
_comando "/usr/bin/systemd-cgtop -b --iterations=5"<br />
_comando "/usr/bin/systemd-cgls -l"<br />
_comando "/usr/bin/systemd-delta"<br />
_comando "/bin/dmesg -l err"<br />
_comando "/bin/dmesg -l warn"<br />
_comando "/bin/lsmod"<br />
_comando "/usr/bin/lspci -knn"<br />
_comando "/usr/bin/lsusb"<br />
_comando "/sbin/fdisk -l"<br />
_comando "/sbin/blkid"<br />
_file "/etc/fstab"<br />
_dir "/etc/fstab.d/"<br />
_comando "/bin/findmnt"<br />
_comando "/bin/lsblk"<br />
_comando "/bin/df"<br />
_dir "/etc/modprobe.d/"<br />
_dir "/etc/modules-load.d/"<br />
_file "/etc/modules"<br />
_file "/etc/apt/sources.list"<br />
_dir "/etc/apt/sources.list.d/"<br />
_comando "/usr/bin/apt-cache policy"<br />
_comando "/usr/bin/apt-cache stats"<br />
_comando "/usr/bin/apt-mark showhold"<br />
_comando "/usr/bin/dpkg --audit"<br />
_comando "/usr/bin/dpkg -l"<br />
_comando "/usr/bin/apt-get check"<br />
_firmware<br />
_extpack<br />
_pack "linux-headers"<br />
_pack "linux-image"<br />
_comando "/usr/sbin/dkms status"<br />
}<br />
<br />
# Funzione relativa ai problemi di rete<br />
function _rete {<br />
_common<br />
_file "/etc/network/interfaces"<br />
_dir "/etc/network/interfaces.d/"<br />
_file "/etc/hosts"<br />
_comando "/sbin/ifconfig"<br />
_comando "/sbin/ifconfig -a"<br />
_comando "/sbin/ip -s -d link show"<br />
_comando "/usr/sbin/rfkill list all"<br />
_comando "/bin/ping -c3 -W5 8.8.8.8" #DNS di Google 8.8.8.8<br />
_comando "/bin/ip addr"<br />
_comando "/bin/ip route list"<br />
_comando "/sbin/iwconfig"<br />
_comando "/sbin/iwlist scan"<br />
_comando "/sbin/route -n"<br />
_pack "resolvconf"<br />
_file "/etc/resolv.conf"<br />
_pack "DHCP"<br />
_file "/etc/dhclient.conf"<br />
_file "/etc/NetworkManager/NetworkManager.conf"<br />
_comando "/usr/bin/nmcli dev list"<br />
_comando "/usr/bin/nmcli device show"<br />
_demone "/usr/sbin/NetworkManager" "Network Manager"<br />
_demone "/usr/sbin/wicd" "Wicd"<br />
}<br />
<br />
# Funzione relativa a problemi video<br />
function _video {<br />
_common<br />
_file "/etc/X11/xorg.conf"<br />
_dir "/etc/X11/xorg.conf.d/"<br />
_file "/var/log/Xorg.0.log"<br />
_file "${utente}/.local/share/xorg/Xorg.0.log"<br />
_pack "xserver-xorg"<br />
_pack "nouveau"<br />
_pack "nvidia"<br />
_pack "mesa"<br />
_pack "fglrx"<br />
_pack "amdgpu"<br />
}<br />
<br />
# Funzione relativa ai problemi di avvio del sistema<br />
function _boot {<br />
_common<br />
_file "/etc/default/grub"<br />
_file "/boot/grub/grub.cfg"<br />
_dir "/etc/default/grub.d/"<br />
_dir "/etc/grub.d/"<br />
_file "/boot/grub/device.map"<br />
_comando "/usr/sbin/grub-mkdevicemap"<br />
_pack grub<br />
}<br />
<br />
# Funzione relativa ai problemi audio. Scarica ed esegue lo script ALSA<br />
function _audio {<br />
_common<br />
_pack "alsa"<br />
_nome_e_riga "dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel'"<br />
_prompt "ALSA dmesg"<br />
dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel' >> "$log" && _ok || _error<br />
<br />
local risp alsaurl="http://www.alsa-project.org/alsa-info.sh"<br />
<br />
echo $'\nI log relativi ai problemi audio sono ricavati attraverso lo script di debug'<br />
echo "ALSA prelevabile all'indirizzo: ${alsaurl}"<br />
echo -n $'\nVerrà ora scaricato e eseguito lo script ALSA. Continuare [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
# wget esiste?<br />
if [ ! -f /usr/bin/wget ]; then<br />
echo "Impossibile scaricare lo script ALSA. Installare il pacchetto wget."<br />
return<br />
fi<br />
# Crea un file temporaneo in /tmp che conterrà lo script ALSA<br />
local tempfile=$(mktemp)<br />
# Scarica lo script ALSA<br />
_prompt "Download script ALSA"<br />
wget -q -O "$tempfile" "$alsaurl"<br />
# Se il download riesce...<br />
if [ $? -eq 0 ]; then<br />
_ok "Download script ALSA riuscito"<br />
# Imposta i permessi dello script scaricato<br />
chmod 777 "$tempfile"<br />
_nome_e_riga "Problemi audio"<br />
# rimuove il comando "dmesg" dallo script ALSA<br />
# perché non eseguibile da utente normale (il comando è<br />
# stato inserito a parte in questa funzione)<br />
sed -i "/^$(printf '\t')withdmesg/d" "$tempfile"<br />
# Esegue lo script ALSA<br />
_prompt "Esecuzione script ALSA"<br />
_su "$tempfile --stdout" && _ok || _error<br />
else<br />
_error "Download script ALSA fallito"<br />
fi<br />
<br />
# Rimuove il file temporaneo<br />
rm -- "$tempfile"<br />
;;<br />
*)<br />
echo "Lo script ALSA non è stato ancora eseguito."<br />
echo "Avviare manualmente lo script prelevabile a questo indirizzo:"<br />
_bold "$alsaurl"<br />
echo "Lo script ALSA va eseguito con i permessi di normale utente."<br />
esac<br />
<br />
}<br />
<br />
# Funzione relativa alla gestione dei pacchetti attraverso il sistema APT<br />
function _apt {<br />
_common<br />
_comando "/usr/bin/dpkg --print-architecture"<br />
_comando "/usr/bin/dpkg --print-foreign-architectures"<br />
_comando "/usr/bin/apt-get update"<br />
_comando "/usr/bin/apt-get -s -y upgrade"<br />
_comando "/usr/bin/apt-get -s -y dist-upgrade"<br />
_comando "/usr/bin/apt-get -s -y -f install"<br />
_comando "/usr/bin/apt-get -s -y autoremove"<br />
_comando "/usr/bin/apt-config dump"<br />
_file "/etc/apt/apt.conf"<br />
_dir "/etc/apt/apt.conf.d/"<br />
_file "/etc/apt/preferences"<br />
_dir "/etc/apt/preferences.d/"<br />
}<br />
<br />
# Funzione relativa a problemi di mount/unmount<br />
function _mount {<br />
_common<br />
_comando "/usr/bin/udisksctl dump"<br />
_pack "usbmount"<br />
}<br />
<br />
# Funzione relativa al funzionamento del touchpad<br />
function _tpad {<br />
_common<br />
_pack "xserver-xorg"<br />
_pack "touchpad"<br />
_file "/etc/X11/xorg.conf"<br />
_dir "/etc/X11/xorg.conf.d/"<br />
_file "/var/log/Xorg.0.log"<br />
_comando "/usr/bin/synclient -l" "su"<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni utilizzate per tipo di problema (generiche)<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che invia il contenuto di un file al file di log<br />
# La funzione va richiamata specificando il path completo del file che sarà assegnato a $1<br />
# Il contenuto dei file viene inviato inalterato al file di log. Se si ha necessità di<br />
# modificare questo comportamento, creare una entry nel ciclo "case"<br />
<br />
function _file {<br />
_nome_e_riga "$1"<br />
_prompt "$1"<br />
if [ -f "$1" ]; then<br />
case "$1" in<br />
/etc/fstab)<br />
# Nasconde username, password e dominio di mount CIFS<br />
sed -e "s/\( cifs.*username *= *\)[^,]*/\1\*script-removed\*/" \<br />
-e "s/\( cifs.*password *= *\)[^,]*/\1\*script-removed\*/" \<br />
-e "s/\( cifs.*domain *= *\)[^,]*/\1\*script-removed\*/" "$1" &>> "$log" && _ok || _error ;;<br />
/etc/network/interfaces)<br />
# Nasconde nel log gli ESSID e le password criptate contenute in /etc/network/interfaces<br />
sed -r "s/((wpa-ssid)|(wpa-psk)|(wpa-identity)|(wpa-password)|(wireless-key)).*/\1 \*script-removed\*/" "$1" &>> "$log" && _ok || _error ;;<br />
/var/log/syslog)<br />
# se è installato systemd, il log viene ricavato da "journalctl -x"<br />
if [ $systemd -eq 0 ]; then <br />
# se il file contiene la stringa "rsyslogd.*start" ...<br />
if [ "$(grep -sci 'rsyslogd.*start$' "$1")" -ne 0 ]; then<br />
# ... estrae da syslog tutto il contenuto dall'ultima occorrenza della stringa alla fine del file<br />
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1" >> "$log" && _ok || _error<br />
else<br />
# se syslog non contiene quella stringa, allora si effettuerà la stessa operazione su syslog.1 ($1.1)<br />
# in questo caso l'intero contenuto del file syslog viene inviato al log<br />
cat "$1" &>> "$log" && _ok || _error<br />
_nome_e_riga "$1".1<br />
_prompt "$1".1<br />
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1".1 >> "$log" && _ok || _error<br />
fi<br />
else _error # systemd è installato. I log vengono ricavati da "journalctl -x"<br />
fi ;;<br />
*)<br />
# per tutti i file non specificati sopra...<br />
cat "$1" &>> "$log" && _ok || _error<br />
esac<br />
else<br />
echo "File \"$1\" non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# Invia l'output di un comando al file di log<br />
# La funzione va richiamata specificando il path completo del comando (con eventuali opzioni)<br />
# che sarà assegnato a $1 . L'output dei comandi viene inviato interamente al file di log. Se<br />
# si ha necessità di modificare gli output, creare una entry nel ciclo "case"<br />
# Es. _comando "/usr/bin/apt-get update"<br />
#<br />
# Nel caso in cui il comando debba essere eseguito tramite 'su', richiamare la funzione con<br />
# due parametri:<br />
# $1 = il comando da eseguire attraverso 'su'<br />
# $2 = la stringa 'su'<br />
# Es. _comando "/usr/bin/groups" "su"<br />
<br />
function _comando {<br />
<br />
local var=${1##*/} # var conterrà il comando ($1) con le opzioni ma privo del path<br />
local var2=${1%% *} # var2 conterrà il comando ($1) privo di eventuali opzioni ma con il path<br />
_nome_e_riga "$var"<br />
_prompt "$var"<br />
<br />
if [ -f "$var2" ]; then # il comando esiste?<br />
if [ $# -eq 2 ]; then # Se vi sono 2 parametri, viene chiamata la funzione "_su"<br />
case "$1" in<br />
"/usr/bin/synclient -l")<br />
# se $DISPLAY è vuota, usa :0 (default per il primo server X)<br />
_su "DISPLAY=${DISPLAY:-:0} $1" && _ok || _error ;;<br />
*) <br />
_su "$1" && _ok || _error<br />
esac<br />
else # non viene utilizzato "su"<br />
case "$1" in<br />
# per "iwconfig" e "iwlist scan" gli ESSID non vengono inviati al log<br />
/sbin/iwconfig)<br />
(iwconfig | sed -e '/ESSID:/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error<br />
;;<br />
<br />
"/sbin/iwlist scan")<br />
(iwlist scan | sed -e '/ESSID:.*/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error<br />
;;<br />
<br />
# nasconde gli ESSID visualizzati da "nmcli dev list" (fino a Wheezy)<br />
# L'array PIPESTATUS mostra il codice d'uscita dei comandi della pipe. PIPESTATUS[0] è il codice d'uscita di "nmcli dev list" (0=successo)<br />
"/usr/bin/nmcli dev list")<br />
nmcli dev list 2>/dev/null | sed -r "s/(^AP[[:digit:]]*\.SSID:[[:space:]]*).*/\1\*script removed\*/" >> "$log" && [ "${PIPESTATUS[0]}" -eq 0 ] && _ok || \<br />
( _error && echo "Comando valido solo per Wheezy" >> "$log" ) ;;<br />
<br />
# nasconde gli ESSID visualizzati da "nmcli device show" (da Jessie in poi)<br />
"/usr/bin/nmcli device show")<br />
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 || \<br />
( _error && echo "Comando valido solo per Jessie e versioni superiori" >> "$log" ) ;;<br />
<br />
/bin/dmesg*)<br />
# Il comando viene eseguito solo se è non installato systemd<br />
[ $systemd -eq 0 ] && $1 &>> "$log" && _ok || _error ;;<br />
<br />
"/usr/sbin/grub-mkdevicemap")<br />
local devicemaptempfile="$(mktemp)" && \<br />
grub-mkdevicemap -m "$devicemaptempfile" && \<br />
if [ -f "$devicemaptempfile" ]; then cat "$devicemaptempfile" >> "$log"; fi && _ok || _error ;;<br />
<br />
# lista dei pacchetti con stato diverso da ii<br />
"/usr/bin/dpkg -l")<br />
echo "Elenco dei pacchetti installati con stato diverso da ii" >> "$log"<br />
echo >> "$log"<br />
dpkg -l | egrep -v '^ii' >> "$log" && _ok || _error ;;<br />
<br />
*)<br />
# per tutti gli altri comandi non specificati in precedenza, l'output del comando è inviato inalterato al log<br />
$1 &>> "$log" && _ok || _error<br />
esac <br />
fi<br />
else<br />
echo "Comando \"${var2}\" non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# Funzione che invia il contenuto dei file di una directory al file di log<br />
function _dir {<br />
_nome_e_riga "$1"<br />
_prompt "$1"<br />
<br />
# Se la directory non esiste, stampa un output sul log ed esce.<br />
if [ ! -d "$1" ]; then<br />
echo "La directory non esiste" >> "$log" && _error<br />
return<br />
fi<br />
<br />
local file<br />
# numfile contiene il numero di file contenuti nella directory. Solo primo livello.<br />
local numfile=$(find "$1" -maxdepth 1 -type f | wc -l)<br />
# numdir contiene il numero di sottodirectory contenute nella directory. Solo primo livello.<br />
local numdir=$(find "$1" -maxdepth 1 -type d | wc -l)<br />
<br />
if [ "$numfile" -eq 0 ] && [ "$numdir" -eq 1 ]; then<br />
echo "La directory non contiene file o directory" >> "$log" && _error<br />
else<br />
echo "La directory contiene ${numfile} file e $((numdir - 1)) directory" >> "$log" && _ok<br />
ls -al "$1" >> "$log"<br />
# invia al log il contenuto dei file della directory<br />
for file in "$1"*; do<br />
if [ -f "$file" ]; then<br />
_nome_e_riga "$file"<br />
_prompt "$file"<br />
cat "$file" &>> "$log" && _ok || _error<br />
fi<br />
done<br />
<br />
# Funzione che invia al log il contenuto dei file presenti nelle sottodirectory<br />
# I due cicli "for" sono separati per permettere l'output di un file subito dopo<br />
# la directory a cui appartiene<br />
for file in "$1"*; do<br />
if [ -d "$file" ]; then<br />
_dir "$file/"<br />
fi<br />
done<br />
fi<br />
}<br />
<br />
# Funzione che elenca i pacchetti installati che contengono la parola<br />
# passata come parametro ($1)<br />
<br />
function _pack {<br />
_nome_e_riga "Pacchetti che contengono \"$1\""<br />
_prompt "Nomi di pacchetti con $1"<br />
<br />
# Variabile che contiene i pacchetti trovati<br />
local packages=$(dpkg -l | grep -i "$1")<br />
<br />
if [ -z "$packages" ]; then<br />
echo "Nessun pacchetto installato" >> "$log" && _error<br />
else<br />
echo "$packages" >> "$log" && _ok<br />
fi<br />
}<br />
<br />
# Funzione che verifica l'esistenza e l'esecuzione di alcuni demoni<br />
# Viene chiamata con due parametri:<br />
# $1 - percorso dell'eseguibile<br />
# $2 - nome da visualizzare<br />
# Se si vuol visualizzare la versione del demone, inserire il comando adatto<br />
# all'interno del ciclo 'case', allo stesso modo specificare al suo interno<br />
# anche il nome dello script d'avvio per fermare, avviare, etc il demone<br />
<br />
function _demone {<br />
<br />
# vers = versione del demone ; var = nome dello script d'avvio del demone<br />
local vers="" var=""<br />
_nome_e_riga "$2"<br />
_prompt "$2"<br />
if [ -f "$1" ]; then<br />
case "$1" in<br />
/usr/sbin/NetworkManager)<br />
vers=$(NetworkManager --version)<br />
var="network-manager"<br />
;;<br />
/usr/sbin/wicd)<br />
vers=$(wicd -h | head -2 | tail -1)<br />
var="wicd"<br />
;;<br />
esac<br />
<br />
echo "$2 è installato (versione "$vers")" >> "$log" && _ok<br />
invoke-rc.d "$var" status &>/dev/null<br />
[ $? -eq 0 ] && echo "$2 è in esecuzione" >> "$log" || echo "$2 non è in esecuzione" >> "$log"<br />
else<br />
echo "$2 non è installato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni utilizzate per tipo di problema (particolari)<br />
# --------------------------------------------------------------------------<br />
<br />
# comando 'cat /sys/class/dmi/id/{sys_vendor,product_name,product_version,bios_version}'<br />
function _dmi_decode {<br />
local var="/sys/class/dmi/id/*"<br />
_nome_e_riga "$var"<br />
_prompt "$var"<br />
if [ -f /sys/class/dmi/id/sys_vendor ]; then<br />
echo "Produttore: $(cat /sys/class/dmi/id/sys_vendor)" &>> "$log"<br />
echo "Prodotto: $(cat /sys/class/dmi/id/product_name)" &>> "$log"<br />
echo "Versione: $(cat /sys/class/dmi/id/product_version)" &>> "$log"<br />
echo "BIOS vers.: $(cat /sys/class/dmi/id/bios_version)" &>> "$log" && _ok || _error<br />
else<br />
echo "File /sys/class/dmi/id/sys_vendor non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# esistenza di pacchetti contenenti firmware e firmware presente sulla macchina<br />
function _firmware {<br />
local i var="Firmware"<br />
_prompt "$var"<br />
_nome_e_riga "$var"<br />
dpkg -l | grep -i firmware >> "$log" && _ok || _error<br />
echo >> "$log"<br />
<br />
# Elenca i file contenuti nelle directory specificate<br />
for i in "/usr/lib/firmware" "/usr/local/lib/firmware" "/lib/firmware" "/run/udev/firmware-missing"; do<br />
if [ -d "$i" ]; then<br />
echo "Contenuto di ${i}" >> "$log"<br />
ls -alR "$i" >> "$log"<br />
else<br />
echo "${i} non trovata" >> "$log"<br />
fi<br />
echo >> "$log"<br />
done<br />
}<br />
<br />
# Stampa sullo standard output l'eseguibile associato a x-session-manager (il default)<br />
function _x_session_manager {<br />
update-alternatives --query "x-session-manager" |<br />
awk '$1 ~ /^Value:$/ { print $2; exit 0 }'<br />
}<br />
<br />
# Stampa sullo standard output l'eseguibile associato a x-window-manager (il default)<br />
function _x_window_manager {<br />
update-alternatives --query "x-window-manager" |<br />
awk '$1 ~ /^Value:$/ { print $2; exit 0 }'<br />
}<br />
<br />
# Stampa la lista dei pacchetti installati che soddisfano una data dipendenza<br />
# con versione (del programma e in Debian) e archivio di provenienza<br />
# Viene chiamata con un parametro:<br />
# $1 - nome della dipendenza<br />
function _soddisfa {<br />
echo "Installati (${1}):"<br />
aptitude search '?installed?provides('"$1"')' --disable-columns \<br />
--display-format "- %p (versione: %v; archivio: %t)"<br />
}<br />
<br />
# Restituisce un exit status di 0 solo se l'eseguibile con il nome scelto è in esecuzione da parte dell'utente ($utente)<br />
# Viene chiamata con un parametro:<br />
# $1 - comando di cui controllare l'esecuzione da parte di $utente<br />
function _is_running {<br />
local list_pids_user list_pids_bin pid pid2<br />
list_pids_user=$(ps -U "$utente" -o pid) # lista di interi, separati da spazi, con i PID dei processi avviati da $utente<br />
list_pids_bin=$(pidof -- "$1") # lista di interi, separati da spazi, con i PID dei processi del comando $1<br />
for pid in $list_pids_user; do<br />
for pid2 in $list_pids_bin; do<br />
if [ "$pid" = "$pid2" ]; then<br />
return 0 # trovato<br />
fi<br />
done<br />
done<br />
return 1 # non trovato!<br />
}<br />
<br />
# Funzione che "cerca" di ricavare il nome e la versione del DE/WM utilizzato<br />
function _de_wm {<br />
_nome_e_riga "Desktop Environment - Window Manager"<br />
_prompt "DE/WM"<br />
{<br />
# impostazione di default<br />
echo -n $'Default:\n- x-session-manager: '<br />
_x_session_manager<br />
echo -n "- x-window-manager: "<br />
_x_window_manager<br />
# installati<br />
if [ "$(command -v aptitude)" ]; then<br />
_soddisfa "x-session-manager"<br />
# _soddisfa "x-window-manager" # non essenziale e impiega già tanto<br />
fi<br />
} >> "$log"<br />
# in esecuzione<br />
echo -n "In esecuzione: " >> "$log"<br />
if _is_running "ksmserver"; then<br />
kf5-config -v 2>/dev/null >> "$log" || # KDE5<br />
kde4-config -v 2>/dev/null >> "$log" && _ok || _error # KDE4<br />
elif _is_running "gnome-shell"; then gnome-shell --version >> "$log" && _ok || _error # GNOME Shell<br />
elif _is_running "xfdesktop"; then xfce4-about -V | head -n1 | cut -d ' ' -f2- >> "$log" && _ok || _error # Xfce4<br />
elif _is_running "openbox"; then<br />
if [ "$(_x_session_manager)" != "/usr/bin/openbox-session" ]; then<br />
echo -n "(altro x-session-manager) + " >> "$log" # Session manager (LXDE?) + Openbox<br />
fi<br />
openbox --version | head -n 1 >> "$log" && _ok || _error # Openbox<br />
else<br />
echo "Sconosciuto" >> "$log" && _error # NON TROVATO<br />
fi<br />
}<br />
<br />
# Funzione che elenca i pacchetti non appartenenti alla release di default utilizzata<br />
function _extpack {<br />
<br />
local var="Pacchetti esterni"<br />
_prompt "$var"<br />
<br />
# La funzione termina se aptitude non è installato<br />
if [ ! "$(command -v aptitude)" ]; then<br />
_nome_e_riga "$var"<br />
echo "Aptitude non è installato" >> "$log" && _error<br />
return 1<br />
fi<br />
<br />
local riga indirizzo rel linea release=""<br />
<br />
# variabile con il contenuto del file sources.list (solo righe che iniziano con deb<br />
# e che contengono "main" )<br />
local sourceslist="$(sed -e '/^deb /!d' -e '/.* main.*/!d' /etc/apt/sources.list)"<br />
<br />
# variabile che contiene l'output del comando "apt-cache policy"<br />
local aptcachepol="$(apt-cache policy)"<br />
<br />
# ciclo sulle righe della variabile "sourceslist"<br />
while read linea; do<br />
<br />
# variabile che contiene l'URL dell'archivio (es. http://ftp.it.debian.org/debian/)<br />
indirizzo="$(awk '{ print $2 }' <<< "$linea")"<br />
<br />
# sostituisce / con \/ (necessario per il successivo sed)<br />
indirizzo="$(_sed_quote "$indirizzo")"<br />
<br />
# release della riga corrente (es. wheezy o testing o sid)<br />
rel="$(awk '{ print $3 }' <<< "$linea")"<br />
<br />
# controlla che sia un nome di release valido<br />
if [ "$rel" = "oldstable" ] || [ "$rel" = "stable" ] || [ "$rel" = "testing" ] || [ "$rel" = "unstable" ] ||<br />
[ "$rel" = "$OLDSTABLE" ] || [ "$rel" = "$STABLE" ] || [ "$rel" = "$TESTING" ] || [ "$rel" = "sid" ] ||<br />
[ "$rel" = "oldoldstable" ] || [ "$rel" = "$OLDOLDSTABLE" ]; then<br />
<br />
# controlla che sia un repository di Debian<br />
# si basa sull'output di "apt-cache policy" e su o=Debian e l=Debian<br />
riga="$(echo "$aptcachepol" | sed -n '/'$indirizzo'*.*'$rel'\/main.*Packages$/ {N; /.*o=Debian,.*l=Debian,/p}')"<br />
<br />
# se è un archivio valido, aggiorna la variabile "release"<br />
if [ ! -z "$riga" ]; then<br />
if [ -z "$release" ]; then<br />
release="$rel"<br />
else<br />
release="$(printf %b "$release\n$rel")"<br />
fi<br />
fi<br />
fi<br />
done <<< "$sourceslist"<br />
<br />
# Lo script DEVE rilevare almeno una release. Se la variabile "release" è nulla, c'è un errore in "sources.list"<br />
# oppure non è stato eseguito un aggiornamento della lista dei pacchetti (update)<br />
# (vedere anche il modo in cui viene ricavata la variabile "release" in alto)<br />
if [ -z "$release" ]; then<br />
_nome_e_riga "${var} all'archivio \"NON RILEVATO!\""<br />
echo "Release non rilevata. Repository errati oppure è necessaria una modifica dello script" >> "$log" && _error<br />
return 1<br />
fi<br />
<br />
# Rimuove eventuali duplicati (esistono repository doppi in sources.list)<br />
release="$(echo "$release" | sort -u)"<br />
<br />
# Numero di release trovate<br />
local num=$(echo "$release" | wc -l)<br />
<br />
# Se il numero di release è diverso da 1 (pinning?), la funzione termina<br />
if [ "$num" -ne 1 ]; then<br />
_nome_e_riga "$var"<br />
echo "Sono presenti ${num} release in sources.list" >> "$log" && _error<br />
return<br />
fi<br />
<br />
local pkg=""<br />
<br />
# Se il numero di release è uguale a 1, la variabile pkg conterrà i pacchetti *non* facenti parte della release<br />
case "$release" in<br />
"$OLDOLDSTABLE"|oldoldstable)<br />
release="oldoldstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aoldoldstable') ;;<br />
"$OLDSTABLE"|oldstable)<br />
release="oldstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aoldstable') ;;<br />
"$STABLE"|stable)<br />
release="stable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Astable') ;;<br />
"$TESTING"|testing)<br />
release="testing"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Atesting') ;;<br />
sid|unstable) <br />
release="unstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aunstable') ;;<br />
esac<br />
<br />
# Invia al log il contenuto di pkg (se esiste)<br />
_nome_e_riga "${var} all'archivio \"${release}\""<br />
if [ -z "$pkg" ]; then<br />
echo "Nessun pacchetto esterno installato" >> "$log" && _error<br />
else<br />
if [ "$(command -v column)" ]; then<br />
echo "$pkg" | column -t >> "$log" && _ok<br />
else<br />
echo "$pkg" >> "$log" && _ok<br />
fi<br />
fi<br />
}<br />
<br />
<br />
# --------------------------------------------------------------------------<br />
# Main<br />
# --------------------------------------------------------------------------<br />
clear<br />
<br />
_intro<br />
<br />
if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then<br />
_debug<br />
_avvertenze<br />
_check<br />
_scelta<br />
_hide<br />
_upload<br />
_compress<br />
elif [ "$UPDATE" -eq 1 ]; then<br />
_self_update<br />
elif [ "$BASE64" -eq 1 ]; then<br />
_base64<br />
fi<br />
<br />
_exit<br />
</syntaxhighlight><br />
<br />
== Changelog ==<br />
<!-- 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) --><br />
;1.0.71<br />
:''Aggiunti "apt-mark showhold" e "dpkg -l" (solo per pacchetti con stato != ii)''<br />
:''Gestita la mancanza di column''<br />
:''Corretto typo "OLDOLDSTABLE" -> "$OLDOLDSTABLE"''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 08:54, 10 apr 2021 (UTC)<br />
;1.0.70<br />
:''Aggiunta oldoldstable''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] ([[Discussioni utente:S3v|discussioni]]) 21:08, 15 mar 2021 (UTC)<br />
;1.0.69<br />
:''http->https per paste.debian.net''<br />
:''Sostituito "which" con "command -v"''<br />
:''Aggiunto _pack "amdgpu"''<br />
:''Aggiunta funzione per quotare stringhe prima di passarle a sed''<br />
:''Rimosso comando "udisks --dump" (non più presente in Debian)''<br />
:''Gestita la mancanza di aptitude''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 13:21, 23 ott 2020 (CEST)<br />
<br />
;1.0.68<br />
:''Nascosti indirizzi MAC delle interfacce wireless''<br />
:''Sovrascrittura del comando cat per evitare che al file di''<br />
:''log venga inviato il contenuto di un file non di testo''<br />
:''Impostata a 'on' l'opzione 'extdebug' per consentire l'espansione''<br />
:''di ARGC per Bash >= 5''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 15:00, 23 mag 2020 (CEST)<br />
;1.0.67<br />
:''Aggiornamento per rilascio di Debian 10 ([[Buster]])''<br />
:[[Utente:HAL 9000|HAL 9000]] 09:39, 7 lug 2019 (CEST)<br />
;1.0.66<br />
:''Aggiunto problema per avvio del sistema (boot)''<br />
:''Aggiunta funzione _su (c'erano problemi con lo script ALSA)''<br />
:''Aggiunte directory <code>/etc/fstab/</code>, <code>/etc/modprobe.d/</code>'',<br />
:''<code>/etc/modules-load.d/</code>, <code>/etc/network/interfaces.d/</code> e il''<br />
:''file <code>/etc/modules</code>''<br />
:''dmesg dello script ALSA spostato nello script''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 10:37, 29 giu 2019 (CEST)<br />
;1.0.65<br />
:''Aggiunti "ip -s -d link show" e Xorg.0.log locale''<br />
:''Nascosti username, password e dominio per montaggi cifs''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 20:49, 20 feb 2018 (CET)<br />
;1.0.64<br />
:''Aggiornamento per rilascio di Debian 9 ([[Stretch]])''<br />
:[[Utente:HAL 9000|HAL 9000]] 10:46, 18 giu 2017 (CEST)<br />
;1.0.63<br />
:''Debug come parametro''<br />
:''KDE5 tra i DE rilevati''<br />
:[[Utente:S3v|S3v]] 22:38, 19 mag 2017 (CEST)<br />
;1.0.62<br />
:''Inserito debug''<br />
:''Inserita funzione _printdot (per evitare ripetizioni)''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 17:41, 26 feb 2017 (CET)<br />
;1.0.61<br />
:''Aggiunta funzione _header() (intestazione del file di log)''<br />
:''Aggiunto parametro "--versione"''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 13:53, 10 dic 2016 (CET)<br />
;1.0.60<br />
:''Elenco ricorsivo delle directory contenenti firmware''<br />
:''Nascosti (altri) ID di connessioni gestite da NM''<br />
:[[Utente:S3v|S3v]] 20:53, 6 dic 2016 (CET)<br />
;1.0.59<br />
:''Modificata funzione _hide() per nascondere completamente hostname contenuto nel''<br />
:''nome utente (e viceversa)''<br />
:[[Utente:S3v|S3v]] 21:33, 11 nov 2016 (CET)<br />
;1.0.58<br />
:''Rimossa precedente istruzione e modificata regexp per far funzionare la ricerca di''<br />
:''pacchetti esterni sia su stable che su testing''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 16:44, 10 lug 2016 (CEST)<br />
;1.0.57<br />
:''Istruzione per rimuovere eventuale slash alla fine dell'URL in "sources.list"''<br />
:''Aggiunti comandi "systemd-cgtop -b --iterations=5", "systemd-cgls" e "systemd-delta" a problemi comuni''<br />
:[[Utente:S3v|S3v]] 21:27, 9 lug 2016 (CEST)<br />
;1.0.56<br />
:''Rimosse dal file interfaces anche le chiavi relative a wep e a wpa-enterprise''<br />
:[[Utente:metaldaze|metaldaze]] 12:54, 04 feb 2016 (CET)<br />
;1.0.55<br />
:''Opzioni per aggiornare lo script o crearne una codifica base64''<br />
:''Corretti ESSID in "nmcli device show" non nascosti''<br />
:''Rimozione duplicati in "release" (pacchetti esterni)''<br />
:[[Utente:S3v|S3v]] 21:26, 15 giu 2015 (CEST)<br />
;1.0.54<br />
:''Correzioni minori legate alla compressione xz; semplificata lettura nome utente in caso di errori con logname''<br />
:[[Utente:HAL 9000|HAL 9000]] 18:41, 31 mag 2015 (CEST)<br />
;1.0.53<br />
:''Vengono rimosse dalla variabile "release" (pacchetti esterni) le linee duplicate''<br />
:[[Utente:S3v|S3v]] 18:22, 30 mag 2015 (CEST)<br />
;1.0.52<br />
:''Aggiunta compressione xz, se disponibile, con ripiego su bzip2 oppure gzip''<br />
:[[Utente:HAL 9000|HAL 9000]] 22:15, 17 mag 2015 (CEST)<br />
;1.0.51<br />
:''Aggiunti comandi "systemctl --failed", "journal -x -b --no-pager [-p [err, warning]]",''<br />
:''"blkid", "lsblk", "dpkg --audit"''<br />
:''"/var/log/syslog" e "dmesg" solo se non è installato systemd''<br />
:''Aggiunta variabile globale "oldstable" e aggiornate "testing" e "stable"''<br />
:''Modifiche minori''<br />
:[[Utente:HAL 9000|HAL 9000]] e [[Utente:S3v|S3v]] 17:12, 4 mag 2015 (CEST)<br />
;1.0.50<br />
:''Rivista la funzione _extpack (repository Debian''<br />
:''in base al comando "apt-cache policy")''<br />
:[[Utente:S3v|S3v]] 22:37, 22 dic 2014 (CET)<br />
;1.0.49<br />
:''Aggiunti trap INT e "dpkg --print-foreign-architectures"''<br />
:''Spostato "dkms status" nei comandi generali''<br />
:[[Utente:S3v|S3v]] 21:19, 20 dic 2014 (CET)<br />
;1.0.48<br />
:''Corretta la ricerca per i pacchetti esterni''<br />
:''Aggiunto _pack "linux-image"''<br />
:[[Utente:S3v|S3v]] 20:16, 19 nov 2014 (CET)<br />
;1.0.47<br />
:''Inseriti "nmcli dev list" (per Wheezy) e "nmcli device show" (per Jessie e superiori)''<br />
:''Inserito "udisksctl dump"''<br />
:[[Utente:S3v|S3v]] 15:55, 5 nov 2014 (CET)<br />
<br />
(Prosegue nella pagina di [[Discussione:Creazione automatica di un file di log per inviare quesiti al forum|discussione]]).<br />
<br />
{{Autori<br />
|Autore=[[Utente:S3v|S3v]] 23:38, 13 apr 2013 (CEST)<br />
}}<br />
<br />
[[Categoria: Bash Scripting]][[Categoria: Configurazione ethernet]][[Categoria: Configurazione wireless]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Aiuto:Categorie&diff=44372Aiuto:Categorie2021-04-09T16:07:15Z<p>S3v: /* Modificare e cancellare una categoria */</p>
<hr />
<div>{{Help}}<br />
Le categorie sono delle pagine del Wiki, create nel corrispondente [[Aiuto:Varie#Namespace|namespace]], che permettono di riunire logicamente più guide.<br/><br />
Ci son due tipi di categorie: quelle che indicano '''l'argomento della guida''' e quelle ''di gestione'' che indicano una sorta di '''stato dell'articolo'''.<br/><br />
Nel seguito sono illustrate entrambe.<br />
<br />
== Categorie di argomenti ==<br />
Le categorie che indicano l'argomento della guida sono come dei tag affissi alla guida che permettono di catalogarla. Ogni guida può appartenere a più categorie contemporaneamente a seconda dell'argomento trattato.<br />
<br />
Una categoria può appartenere essa stessa ad un'altra categoria: in questo caso viene chiamata '''sotto-categoria'''. Una sotto-categoria è una normalissima categoria, con la sola differenza che viene elencata nella pagina delle categorie a cui appartiene ([[:Categoria:Apt|esempio]]). Una sotto-categoria può appartenere a più categorie contemporaneamente.<br />
<br />
L'elenco completo delle ''categorie di argomenti'' presenti nel Wiki e delle loro relazioni gerarchiche (notare che ''alcune categorie sono elencate più volte perché sono sotto-categorie di più d'una categoria'') è consultabile in [[Lista Categorie|questa pagina]].<br/><br />
L'elenco delle categorie in ordine alfabetico è, invece, disponibile [[Speciale:Categorie|qui]].<br />
<br />
== Categorie per la gestione ==<br />
Questo è invece l'elenco delle categorie ''di gestione'' del Wiki:<br />
* [[:Categoria:Debianized|Debianized]]<br />
* [[:Categoria:Stub|Stub]]<br />
* [[:Categoria:Da_Adottare|Da Adottare]]<br />
* [[:Categoria:Old|Old]]<br />
* [[:Categoria:Da_Cancellare|Da Cancellare]]<br />
<br />
Contrariamente alle altre '''non''' vanno scritte esplicitamente, perché sono tutte inserite automaticamente dai [[Aiuto:I template|relativi template]].<br />
<br />
== Come inserire una guida in una categoria? ==<br />
<br />
Niente di più semplice. Basta aggiungere in fondo alla guida stessa il testo <code><nowiki>[[Categoria:nome categoria]]</nowiki></code>, dove appunto ''nome categoria'' è il nome della categoria nella quale si vuole inserire la guida. È possibile anche aggiungere più di una categoria per ciascuna guida se si ritiene che questa vada a coprire argomenti diversi.<br/><br />
Ci si può accertare del corretto inserimento della guida nella giusta categoria (o nelle giuste categorie) guardando in fondo alla pagina della guida stessa nel riquadro apposito.<br />
<br />
Se la categoria appare scritta in rosso oppure non appare nessuna categoria, si è verificato uno dei seguenti problemi:<br />
# Non è stato inserito correttamente il tag per la categoria; in questo caso accertarsi della corretta ortografia (ad esempio controllare le doppie parentesi quadre, il carattere "due punti" etc.) e modificare nuovamente la guida.<br />
# La categoria immessa ha un nome errato; in questo caso guardare la pagina delle [[Lista Categorie|categorie]] per controllare il nome corretto e facendo attenzione alla distinzione tra lettere maiuscole e minuscole.<br />
<br />
Un aspetto molto importante di cui tenere conto è quello di '''non inserire''' una guida contemporaneamente sia in una categoria-madre che in una categoria-figlia. Ad esempio non si deve inserire una guida sia nella categoria "Internet" che nella categoria "Browser".<br />
<br />
== Categorie richieste ==<br />
Le categorie del Wiki non coprono tutte gli argomenti possibili, pertanto può accadere di dover inserire la propria guida in una categoria che ancora non esiste.<br/><br />
In questo caso contattare lo staff del Wiki sul [http://forum.debianizzati.org forum] oppure inserire una descrizione del problema nella pagina di [[Aiuto:Discussioni|discussione]] relativa alla guida.<br/><br />
L'elenco delle categorie richieste è visibile [[Speciale:CategorieRichieste|qui]].<br />
<br />
== Categorie nascoste ==<br />
Le categorie nascoste sono normali categorie con la sola differenza che non vengono mostrate tra le categorie a cui appartiene una pagina in calce alla pagina stessa.<br><br />
Tipicamente vengono utilizzate per compiti di amministrazione delle pagine del Wiki e sono di scarsa utilità per gli utenti,<br><br />
Affinché una categoria sia contrassegnata come "nascosta", è necessario inserire al suo interno la stringa ''<nowiki>__HIDDENCAT__</nowiki>''.<br><br />
L'elenco delle categorie nascoste è visibile [[:Categoria:Categorie_nascoste|qui]].<br />
<br />
== Creare una categoria ==<br />
Una categoria può essere [[Aiuto:Creare e modificare una pagina|creata]] con la stessa procedura con cui si creano le altre pagine del Wiki. L'unico accorgimento è specificare il relativo [[Aiuto:Varie#Namespace|namespace]]:<br />
<pre><br />
http://guide.debianizzati.org/index.php/Categoria:Nome della categoria<br />
</pre><br />
Nel caso si stia creando una sotto-categoria, ricordarsi di inserire in fondo alla pagina la categoria a cui appartiene allo stesso modo con cui si procederebbe per le altre guide.<br/><br />
Per creare ad esempio la sotto-categoria "Browser" appartenente alla categoria "Internet":<br />
* Creare la pagina "<nowiki>http://guide.debianizzati.org/index.php/Categoria:Browser</nowiki><br />
* Modificare la pagina appena creata in modo che contenga:<pre>[[Categoria:Internet]]</pre><br />
<br />
Le categorie (o sotto-categorie) create vanno inserite anche all'interno della [[Lista Categorie|lista delle categorie]], questo è fondamentale per ricercare una particolare guida e per consentire anche ad altri di individuare e utilizzare la categoria appena creata.<br />
<br />
== Modificare e cancellare una categoria ==<br />
La [[Aiuto:Spostare e cancellare una pagina|cancellazione o il cambiamento del nome]] di una categoria avvengono come per le altre pagine.<br><br />
Queste due operazioni vanno eseguite con particolare cautela poiché potrebbe capitare di lasciare guide prive di una categoria valida. Utilizzare la funzione '''"Strumenti -> Puntano qui"''' (nella sidebar a sinistra) per accertarsi che non vi siano pagine appartenenti alla categoria che si sta per cancellare o che contengano [[Aiuto:Sintassi#Link|link]] che puntino ad essa.<br><br />
Prestare attenzione al fatto che, in caso di cambiamento del nome, le guide che appartenevano alla categoria rinominata non apparterranno automaticamente alla nuova categoria.</div>S3vhttps://guide.debianizzati.org/index.php?title=Aiuto:Categorie&diff=44371Aiuto:Categorie2021-04-09T16:06:08Z<p>S3v: /* Modificare e cancellare una categoria */</p>
<hr />
<div>{{Help}}<br />
Le categorie sono delle pagine del Wiki, create nel corrispondente [[Aiuto:Varie#Namespace|namespace]], che permettono di riunire logicamente più guide.<br/><br />
Ci son due tipi di categorie: quelle che indicano '''l'argomento della guida''' e quelle ''di gestione'' che indicano una sorta di '''stato dell'articolo'''.<br/><br />
Nel seguito sono illustrate entrambe.<br />
<br />
== Categorie di argomenti ==<br />
Le categorie che indicano l'argomento della guida sono come dei tag affissi alla guida che permettono di catalogarla. Ogni guida può appartenere a più categorie contemporaneamente a seconda dell'argomento trattato.<br />
<br />
Una categoria può appartenere essa stessa ad un'altra categoria: in questo caso viene chiamata '''sotto-categoria'''. Una sotto-categoria è una normalissima categoria, con la sola differenza che viene elencata nella pagina delle categorie a cui appartiene ([[:Categoria:Apt|esempio]]). Una sotto-categoria può appartenere a più categorie contemporaneamente.<br />
<br />
L'elenco completo delle ''categorie di argomenti'' presenti nel Wiki e delle loro relazioni gerarchiche (notare che ''alcune categorie sono elencate più volte perché sono sotto-categorie di più d'una categoria'') è consultabile in [[Lista Categorie|questa pagina]].<br/><br />
L'elenco delle categorie in ordine alfabetico è, invece, disponibile [[Speciale:Categorie|qui]].<br />
<br />
== Categorie per la gestione ==<br />
Questo è invece l'elenco delle categorie ''di gestione'' del Wiki:<br />
* [[:Categoria:Debianized|Debianized]]<br />
* [[:Categoria:Stub|Stub]]<br />
* [[:Categoria:Da_Adottare|Da Adottare]]<br />
* [[:Categoria:Old|Old]]<br />
* [[:Categoria:Da_Cancellare|Da Cancellare]]<br />
<br />
Contrariamente alle altre '''non''' vanno scritte esplicitamente, perché sono tutte inserite automaticamente dai [[Aiuto:I template|relativi template]].<br />
<br />
== Come inserire una guida in una categoria? ==<br />
<br />
Niente di più semplice. Basta aggiungere in fondo alla guida stessa il testo <code><nowiki>[[Categoria:nome categoria]]</nowiki></code>, dove appunto ''nome categoria'' è il nome della categoria nella quale si vuole inserire la guida. È possibile anche aggiungere più di una categoria per ciascuna guida se si ritiene che questa vada a coprire argomenti diversi.<br/><br />
Ci si può accertare del corretto inserimento della guida nella giusta categoria (o nelle giuste categorie) guardando in fondo alla pagina della guida stessa nel riquadro apposito.<br />
<br />
Se la categoria appare scritta in rosso oppure non appare nessuna categoria, si è verificato uno dei seguenti problemi:<br />
# Non è stato inserito correttamente il tag per la categoria; in questo caso accertarsi della corretta ortografia (ad esempio controllare le doppie parentesi quadre, il carattere "due punti" etc.) e modificare nuovamente la guida.<br />
# La categoria immessa ha un nome errato; in questo caso guardare la pagina delle [[Lista Categorie|categorie]] per controllare il nome corretto e facendo attenzione alla distinzione tra lettere maiuscole e minuscole.<br />
<br />
Un aspetto molto importante di cui tenere conto è quello di '''non inserire''' una guida contemporaneamente sia in una categoria-madre che in una categoria-figlia. Ad esempio non si deve inserire una guida sia nella categoria "Internet" che nella categoria "Browser".<br />
<br />
== Categorie richieste ==<br />
Le categorie del Wiki non coprono tutte gli argomenti possibili, pertanto può accadere di dover inserire la propria guida in una categoria che ancora non esiste.<br/><br />
In questo caso contattare lo staff del Wiki sul [http://forum.debianizzati.org forum] oppure inserire una descrizione del problema nella pagina di [[Aiuto:Discussioni|discussione]] relativa alla guida.<br/><br />
L'elenco delle categorie richieste è visibile [[Speciale:CategorieRichieste|qui]].<br />
<br />
== Categorie nascoste ==<br />
Le categorie nascoste sono normali categorie con la sola differenza che non vengono mostrate tra le categorie a cui appartiene una pagina in calce alla pagina stessa.<br><br />
Tipicamente vengono utilizzate per compiti di amministrazione delle pagine del Wiki e sono di scarsa utilità per gli utenti,<br><br />
Affinché una categoria sia contrassegnata come "nascosta", è necessario inserire al suo interno la stringa ''<nowiki>__HIDDENCAT__</nowiki>''.<br><br />
L'elenco delle categorie nascoste è visibile [[:Categoria:Categorie_nascoste|qui]].<br />
<br />
== Creare una categoria ==<br />
Una categoria può essere [[Aiuto:Creare e modificare una pagina|creata]] con la stessa procedura con cui si creano le altre pagine del Wiki. L'unico accorgimento è specificare il relativo [[Aiuto:Varie#Namespace|namespace]]:<br />
<pre><br />
http://guide.debianizzati.org/index.php/Categoria:Nome della categoria<br />
</pre><br />
Nel caso si stia creando una sotto-categoria, ricordarsi di inserire in fondo alla pagina la categoria a cui appartiene allo stesso modo con cui si procederebbe per le altre guide.<br/><br />
Per creare ad esempio la sotto-categoria "Browser" appartenente alla categoria "Internet":<br />
* Creare la pagina "<nowiki>http://guide.debianizzati.org/index.php/Categoria:Browser</nowiki><br />
* Modificare la pagina appena creata in modo che contenga:<pre>[[Categoria:Internet]]</pre><br />
<br />
Le categorie (o sotto-categorie) create vanno inserite anche all'interno della [[Lista Categorie|lista delle categorie]], questo è fondamentale per ricercare una particolare guida e per consentire anche ad altri di individuare e utilizzare la categoria appena creata.<br />
<br />
== Modificare e cancellare una categoria ==<br />
La [[Aiuto:Spostare e cancellare una pagina|cancellazione o il cambiamento del nome]] di una categoria avvengono come per le altre pagine.<br><br />
Queste due operazioni vanno eseguite con particolare cautela poiché potrebbe capitare di lasciare guide prive di una categoria valida. Utilizzare la funzione '''"Strumenti -> Puntano qui"''' (nella sidebar a sinistra) per accertarsi che non vi siano pagine appartenenti alla categoria che si sta per cancellare o che contengano [[Aiuto:Sintassi#Link|link]] che puntino ad essa.<br />
Prestare attenzione al fatto che, in caso di cambiamento del nome, le guide che appartenevano alla categoria rinominata non apparterranno automaticamente alla nuova categoria.</div>S3vhttps://guide.debianizzati.org/index.php?title=Aiuto:Categorie&diff=44370Aiuto:Categorie2021-04-09T15:42:21Z<p>S3v: aggiunto paragrafo "Categorie nascoste"</p>
<hr />
<div>{{Help}}<br />
Le categorie sono delle pagine del Wiki, create nel corrispondente [[Aiuto:Varie#Namespace|namespace]], che permettono di riunire logicamente più guide.<br/><br />
Ci son due tipi di categorie: quelle che indicano '''l'argomento della guida''' e quelle ''di gestione'' che indicano una sorta di '''stato dell'articolo'''.<br/><br />
Nel seguito sono illustrate entrambe.<br />
<br />
== Categorie di argomenti ==<br />
Le categorie che indicano l'argomento della guida sono come dei tag affissi alla guida che permettono di catalogarla. Ogni guida può appartenere a più categorie contemporaneamente a seconda dell'argomento trattato.<br />
<br />
Una categoria può appartenere essa stessa ad un'altra categoria: in questo caso viene chiamata '''sotto-categoria'''. Una sotto-categoria è una normalissima categoria, con la sola differenza che viene elencata nella pagina delle categorie a cui appartiene ([[:Categoria:Apt|esempio]]). Una sotto-categoria può appartenere a più categorie contemporaneamente.<br />
<br />
L'elenco completo delle ''categorie di argomenti'' presenti nel Wiki e delle loro relazioni gerarchiche (notare che ''alcune categorie sono elencate più volte perché sono sotto-categorie di più d'una categoria'') è consultabile in [[Lista Categorie|questa pagina]].<br/><br />
L'elenco delle categorie in ordine alfabetico è, invece, disponibile [[Speciale:Categorie|qui]].<br />
<br />
== Categorie per la gestione ==<br />
Questo è invece l'elenco delle categorie ''di gestione'' del Wiki:<br />
* [[:Categoria:Debianized|Debianized]]<br />
* [[:Categoria:Stub|Stub]]<br />
* [[:Categoria:Da_Adottare|Da Adottare]]<br />
* [[:Categoria:Old|Old]]<br />
* [[:Categoria:Da_Cancellare|Da Cancellare]]<br />
<br />
Contrariamente alle altre '''non''' vanno scritte esplicitamente, perché sono tutte inserite automaticamente dai [[Aiuto:I template|relativi template]].<br />
<br />
== Come inserire una guida in una categoria? ==<br />
<br />
Niente di più semplice. Basta aggiungere in fondo alla guida stessa il testo <code><nowiki>[[Categoria:nome categoria]]</nowiki></code>, dove appunto ''nome categoria'' è il nome della categoria nella quale si vuole inserire la guida. È possibile anche aggiungere più di una categoria per ciascuna guida se si ritiene che questa vada a coprire argomenti diversi.<br/><br />
Ci si può accertare del corretto inserimento della guida nella giusta categoria (o nelle giuste categorie) guardando in fondo alla pagina della guida stessa nel riquadro apposito.<br />
<br />
Se la categoria appare scritta in rosso oppure non appare nessuna categoria, si è verificato uno dei seguenti problemi:<br />
# Non è stato inserito correttamente il tag per la categoria; in questo caso accertarsi della corretta ortografia (ad esempio controllare le doppie parentesi quadre, il carattere "due punti" etc.) e modificare nuovamente la guida.<br />
# La categoria immessa ha un nome errato; in questo caso guardare la pagina delle [[Lista Categorie|categorie]] per controllare il nome corretto e facendo attenzione alla distinzione tra lettere maiuscole e minuscole.<br />
<br />
Un aspetto molto importante di cui tenere conto è quello di '''non inserire''' una guida contemporaneamente sia in una categoria-madre che in una categoria-figlia. Ad esempio non si deve inserire una guida sia nella categoria "Internet" che nella categoria "Browser".<br />
<br />
== Categorie richieste ==<br />
Le categorie del Wiki non coprono tutte gli argomenti possibili, pertanto può accadere di dover inserire la propria guida in una categoria che ancora non esiste.<br/><br />
In questo caso contattare lo staff del Wiki sul [http://forum.debianizzati.org forum] oppure inserire una descrizione del problema nella pagina di [[Aiuto:Discussioni|discussione]] relativa alla guida.<br/><br />
L'elenco delle categorie richieste è visibile [[Speciale:CategorieRichieste|qui]].<br />
<br />
== Categorie nascoste ==<br />
Le categorie nascoste sono normali categorie con la sola differenza che non vengono mostrate tra le categorie a cui appartiene una pagina in calce alla pagina stessa.<br><br />
Tipicamente vengono utilizzate per compiti di amministrazione delle pagine del Wiki e sono di scarsa utilità per gli utenti,<br><br />
Affinché una categoria sia contrassegnata come "nascosta", è necessario inserire al suo interno la stringa ''<nowiki>__HIDDENCAT__</nowiki>''.<br><br />
L'elenco delle categorie nascoste è visibile [[:Categoria:Categorie_nascoste|qui]].<br />
<br />
== Creare una categoria ==<br />
Una categoria può essere [[Aiuto:Creare e modificare una pagina|creata]] con la stessa procedura con cui si creano le altre pagine del Wiki. L'unico accorgimento è specificare il relativo [[Aiuto:Varie#Namespace|namespace]]:<br />
<pre><br />
http://guide.debianizzati.org/index.php/Categoria:Nome della categoria<br />
</pre><br />
Nel caso si stia creando una sotto-categoria, ricordarsi di inserire in fondo alla pagina la categoria a cui appartiene allo stesso modo con cui si procederebbe per le altre guide.<br/><br />
Per creare ad esempio la sotto-categoria "Browser" appartenente alla categoria "Internet":<br />
* Creare la pagina "<nowiki>http://guide.debianizzati.org/index.php/Categoria:Browser</nowiki><br />
* Modificare la pagina appena creata in modo che contenga:<pre>[[Categoria:Internet]]</pre><br />
<br />
Le categorie (o sotto-categorie) create vanno inserite anche all'interno della [[Lista Categorie|lista delle categorie]], questo è fondamentale per ricercare una particolare guida e per consentire anche ad altri di individuare e utilizzare la categoria appena creata.<br />
<br />
== Modificare e cancellare una categoria ==<br />
La [[Aiuto:Spostare e cancellare una pagina|cancellazione]] di una categoria avviene come per le altre pagine mentre la sua modifica (cambiamento del nome) non è putroppo possibile e bisogna necessariamente creare una nuova categoria a cui far appartenere le guide della categoria che si vuol rinominare.<br/><br />
Queste due operazioni vanno eseguite con particolare cautela poiché potrebbe capitare di lasciare guide prive di una categoria valida. Utilizzare la funzione '''"Strumenti -> Puntano qui"''' (nella sidebar a sinistra) per accertarsi che non vi siano pagine appartenenti alla categoria che si sta per cancellare o che contengano [[Aiuto:Sintassi#Link|link]] che puntino ad essa.</div>S3vhttps://guide.debianizzati.org/index.php?title=Categoria:Categorie_nascoste&diff=44369Categoria:Categorie nascoste2021-04-09T15:39:12Z<p>S3v: nuova pagina</p>
<hr />
<div>Questa pagina raccoglie le categorie nascoste.<br><br />
Si veda anche [[Aiuto:Categorie]].</div>S3vhttps://guide.debianizzati.org/index.php?title=Utilizzo_del_servizio_di_scheduling_Cron&diff=44368Utilizzo del servizio di scheduling Cron2021-04-09T14:58:35Z<p>S3v: aggiunto paragrafo "Strumenti grafici"</p>
<hr />
<div>{{Versioni compatibili}}<br />
== Introduzione al servizio di scheduling Cron ==<br />
Alcuni processi devono essere eseguiti a determinati orari, un determinato numero di volte. Esempi possono essere i processi di backup che vengono lanciati ogni notte, oppure un analizzatore di log che deve girare ogni minuto.<br/><br />
Questi processi devono girare un certo numero di volte oppure in determinati giorni; il resto del tempo essi stanno fermi fino a quando un utente non interagisce con essi e li richiama (con gli appositi comandi). Questi sono i casi in cui il demone CRON si rende utile. Vi permette di programmare (o "schedulare", come si dice in gergo) l'esecuzione di un lavoro ("job" o "cronjob") in qualsiasi momento desideriate, ogni minuto, ogni ora, giornalmente, settimanalmente, mensilmente, annualmente.<br />
<br />
== Le basi ==<br />
Cron viene lanciato in background all'avvio del sistema sicché non c'è bisogno di lanciarlo manualmente. All'avvio Cron legge il file <code>/etc/crontab</code> per le voci (le cosiddette "entry") di sistema, i file contenuti nella directory <code>/etc/cron.d/</code> e i file in <code>/var/spool/cron/crontabs</code> per le voci relative agli utenti che si trovano nel file <code>/etc/passwd</code>. Tutti i job di ciascuna voce (crontab) sono caricati nella memoria del demone Cron.<br />
<br />
Ciascun utente, compreso [[root]], ha il proprio file crontab nella directory <code>/var/spool/cron/crontabs/</code>; ogni crontab può contenere uno o più cronjobs.<br />
<br />
Il [[demone]] Cron esegue diversi compiti:<br />
* Controlla eventuali cambiamenti nei file contenuti in <code>/etc/cron.d/</code> o nel file<code>/etc/crontab</code>. In questo caso aggiorna il modtime (vale a dire la data e l'ora dell'ultima modifica) per questi crontab e li ricarica nella sua memoria interna;<br />
* Monitora il comando <code>crontab</code> che si occupa, per ciascun utente, di modificare i lavori di Cron contenuti in <code>/var/spool/cron/crontabs</code>. Le modifiche effettuate con il comando <code>crontab</code> comportano, da parte di Cron, l'aggiornamento dei crontab in memoria e del loro modtime;<br />
* Confronta l'ora/data dei job contenuti in memoria (modtime) con l'ora/data corrente per stabilire se il comando schedulato debba essere avviato oppure no;<br />
<br />
In base a questo modo di operare, non è necessario far ripartire Cron ogni volta che vengono effettuati dei cambiamenti tramite il comando <code>crontab</code>.<br />
<br />
== Utilizzare il comando crontab ==<br />
Il demone Cron legge i file contenuti in <code>/var/spool/cron/crontabs/</code> relativi ai cronjobs che ogni specifico utente vuole eseguire. È importante sapere che <u>questi file non vanno modificati direttamente</u>, ma solo attraverso il comando <code>crontab</code> seguito dagli appropriati flag che specificano se lanciare <code>crontab</code> per avere la lista o per aggiungere, rimuovere e modificare compiti.<br />
<br />
La sintassi per il programma <code>crontab</code> è la seguente:<br />
<pre><br />
crontab [-u user] file<br />
</pre><br />
<pre><br />
crontab [-u user] -l -e -r<br />
</pre><br />
I parametri significano:<br />
* <code>'''-u'''</code> : questa opzione comunica al sistema il nome dell'utente che "possiede" il file. Se l'opzione <code>-u</code> è omessa, il sistema deduce per default che si sta operando sul crontab dell'utente che lancia il comando. NOTA: Il comando switch user (<code>su</code>) può confondere il <code>crontab</code>, così se siete nello switch <code>su</code> assicuratevi di utilizzare l'opzione <code>-u</code>.<br />
* <code>'''-l'''</code> : questa opzione dice a <code>crontab</code> di elencare i file nello standard output, cioè di visualizzare il file.<br />
* <code>'''-e'''</code> : questa opzione dice a <code>crontab</code> di editare il file. Cron usa l'editor definito dalle variabili <code>EDITOR</code> o <code>VISUAL</code>. Se nessuna di queste due variabili è definita, parte in automatico [[Impostare_l%27editor_predefinito_della_shell|l'editor di default]]. L'editor salva il file in <code>/tmp</code>; quando si esce dall'editor, il file è immediatamente salvato in <code>/var/spool/cron/crontabs</code> e viene aggiornato il campo data/ora. '''Questo è il comando principale da utilizzare se si vuole modificare il proprio file crontab per cancellare o inserirvi i lavori da assegnare a Cron.'''<br />
* <code>'''-r'''</code> : questa opzione rimuove il file crontab. Se nessun utente viene specificato attraverso l'opzione '-u', rimuove il file crontab dell'utente che lancia il comando.<br />
* <code>'''file'''</code> : inserisce il contenuto del file nel crontab dell'utente specificato tramite l'opzione '-u'. Se non viene specificato nessun utente, allora il contenuto del file sarà inserito nel crontab dell'utente che lancia il comando (vedi anche: [[Utilizzo_del_servizio_di_scheduling_Cron#Importare_un_file_crontab | Importare un file crontab]])<br />
<br />
== cron.allow & cron.deny ==<br />
In un sistema Debian, di default, tutti gli utenti, oltre root, possono eseguire il comando <code>crontab</code>.<br/><br />
Questo comportamento può essere modificato attraverso la creazione di due file:<br />
;<code>'''/etc/cron.allow'''</code> : se questo file esiste, allora solo gli utenti qui specificati sono abilitati all'utilizzo di <code>crontab</code>. Su ogni riga del file va specificato un solo utente. <br />
;<code>'''/etc/cron.deny'''</code> : se questo file esiste, allora gli utenti qui specificati non potranno utilizzare <code>crontab</code>. Anche per questo file su ogni riga va specificato un solo utente. <br />
<br />
Se entrambi i file sono presenti, verrà preso in considerazione solo il file <code>/etc/cron.allow</code>.<br/><br />
Root è sempre abilitato all'utilizzo di <code>crontab</code>, indipendentemente dall'esistenza o meno di questi due file e dal loro contenuto.<br />
<br />
== Voci in un file crontab ==<br />
Solo due tipi di voci sono permesse in un file crontab: i settaggi ambientali (Crontab Environmental settings) e i settaggi di comando (Crontab Command settings).<br />
<br />
=== Crontab Environmental settings ===<br />
I settaggi ambientali utilizzano la seguente forma:<br />
<pre><br />
NOME = valore<br />
</pre><br />
che, per motivi di leggibilità, dovrebbero essere inseriti in testa al file generato dal comando <code>crontab</code>.<br/><br />
Le variabili a cui è possibile assegnare un valore sono: <br />
* <code>'''SHELL'''</code>: se non assegnata viene settata automaticamente da Cron a <code>/bin/sh</code> .<br/>Poiché in Debian l'interprete dei comandi a cui punta <code>/bin/sh</code> è <code>/bin/dash</code>, accertarsi che la sintassi dei comandi sia compatibile con '''dash'''; altrimenti modificare la variabile SHELL in maniera conforme all'interprete utilizzato, ad esempio:<pre>SHELL=/bin/bash</pre>Questa modifica potrebbe essere necessaria nel caso in cui si voglia eseguire attraverso Cron uno [[script]] Bash.<br />
* <code>'''PATH'''</code>: anche questa variabile, se non le viene assegnato un valore, è settata automaticamente da Cron a <code>/usr/bin:/bin</code> . È utile cambiare questo valore se i comandi contenuti all'interno di uno script lanciato da ''Cron'' utilizzano a loro volta comandi non presenti in ''/usr/bin'' o ''/bin'' oppure se si vuole inserire un comando senza specificarne il [[path]]. Per i comandi in <code>/usr/bin</code> e <code>/bin</code>, presenti cioè nel path di default, non è necessario specificarne il path completo.<br />
* <code>'''LOGNAME'''</code>: contiene il login name dell'utente che esegue il comando <code>crontab</code>. Non può essere cambiata.<br />
* <code>'''HOME'''</code>: contiene il path della home directory associata all'utente che esegue <code>crontab</code>.<br />
* <code>'''MAILTO'''</code>: di default Cron invia un'email con l'output dei comandi presenti nel crontab all'utente che ne è proprietario.<br/><br />
#se questa variabile è settata, il demone Cron invierà un'email, con l'output del/dei comando/comandi specificati in <code>crontab</code>, all'utente specificato. È possibile specificare più utenti separandoli con una virgola;<br />
#se la variabile è settata a "", allora non verranno inviate email;<br/><br />
#se la variabile non è specificata, verrà inviata un'email all'utente a cui appartiene il crontab.<br/>La seguente riga mostra la variabile MAILTO settata ad uno specifico utente (luca):<pre># spedisce tutti gli output all'utente *luca*&#10;MAILTO=luca</pre>mentre la successiva riga informa Cron di non inviare email:<pre># non viene inviata nessuna email &#10;MAILTO=""</pre>ovviamente, affinché Cron possa inviare con successo le email, bisogna avere un MTA installato e funzionante sulla propria macchina.<br />
<br />
=== Crontab Command settings ===<br />
I settaggi di comando usano un formato standard: ogni riga è composta da cinque campi ora/data seguiti da un campo contenente il comando da eseguire.<br/><br />
Per il crontab di sistema ('''<code>/etc/crontab</code>''') e per i lavori di Cron presenti in <code>/'''etc/cron.d/'''</code>, vi è un settimo campo, compreso tra i primi cinque e il comando da eseguire, che contiene lo username dell'utente con i cui permessi verrà lanciato il comando.<br/><br />
Vedremo in seguito che sono possibili alcune eccezioni a questa regola.<br />
<br />
I campi disponibili per la data e l'ora sono i seguenti:<br />
<pre><br />
Campi | Valori ammessi<br />
----------------<br />
minuti | 0-59<br />
ore | 0-23<br />
giorno | 1-31<br />
mese | 1-12<br />
giorno della settimana | 0-7 (0 & 7 indicano la domenica)<br />
</pre><br />
<br />
Ecco lo schema per una generica linea presente in un file crontab:<br />
<pre><br />
.---------------- [m]inute: minuto (0 - 59) <br />
| .------------- [h]our: ora (0 - 23)<br />
| | .---------- [d]ay [o]f [m]onth: giorno del mese (1 - 31)<br />
| | | .------- [mon]th: mese (1 - 12) OPPURE jan,feb,mar,apr... <br />
| | | | .---- [d]ay [o]f [w]eek: giorno della settimana (0 - 7) (la domenica vale 0 o 7) OPPURE sun,mon,tue,wed,thu,fri,sat <br />
| | | | |<br />
<br />
* * * * * comando da eseguire<br />
</pre><br />
<br />
== Sintassi ==<br />
Ogni file crontab specifica su ogni riga un compito da assegnare al demone Cron.<br/><br />
Una riga può contenere dei commenti (la riga inizia con il carattere "#") ed essere posizionata in qualunque punto del file. Non è possibile inserire un commento alla fine di una riga che già contiene un comando. <br/><br />
Le righe contenenti i command settings sono costituite da campi separati da spazi o caratteri di tabulazione.<br/><br />
I primi cinque campi possono contenere un numero, un intervallo di valori, stringhe particolari o un asterisco (*). Quest'ultimo sta a indicare ogni possibile valore ammesso dell'intervallo; quindi un asterisco nel terzo campo indica che il comando verrà eseguito ogni giorno.<br/><br />
Se tutti i primi cinque campi contengono un asterisco, il comando verrà eseguito ogni minuto.<br/><br />
Questo è un semplice esempio di crontab editabile attraverso il comando <code>crontab -e</code> :<br />
<pre><br />
00 3 1 7 * /comando/da/eseguire<br />
</pre><br />
tenendo conto di quest'esempio, il comando verrà eseguito:<br />
; <code>'''Campo 1'''</code>: quando i minuti sono 0.<br />
; <code>'''Campo 2'''</code>: quando l'ora vale 3.<br />
; <code>'''Campo 3'''</code>: quando il giorno del mese vale 1.<br />
; <code>'''Campo 4'''</code>: quando il mese è il settimo dell'anno ossia luglio.<br />
; <code>'''Campo 5'''</code>: ogni giorno della settimana. Poiché è specificato il giorno del mese, questo campo viene ignorato (vale anche il caso opposto; più avanti sarà spiegato in che modo Cron interpreta le righe di un file crontab in cui sono specificati sia il giorno del mese che quello della settimana).<br/><br />
Quindi, in breve, il comando è eseguito il primo luglio alle ore 3,00.<br />
<br />
Naturalmente è possibile specificare intervalli di tempo, intervalli di date o combinazioni di questi:<br />
*Esempio 1<br />
<pre><br />
1-30 * * * * /comando/da/eseguire<br />
</pre><br />
il comando verrà eseguito ogni giorno, ogni ora e quando i minuti vanno da 1 a 30.<br />
<br />
*Esempio 2<br />
<pre><br />
*/10 * * * * /comando/da/eseguire<br />
</pre><br />
il comando verrà eseguito ogni 10 minuti, quando i minuti sono 00, 10, 20, 30, 40 e 50.<br />
<br />
*Esempio 3<br />
<pre><br />
30 * 1-7 * * /comando/da/eseguire<br />
</pre><br />
il comando verrà eseguito i primi sette giorni di ogni mese, ad ogni ora e quando i minuti valgono 30.<br />
<br />
*Esempio 4<br />
<pre><br />
00 */2 15 * * /comando/da/eseguire<br />
</pre><br />
il comando verrà eseguito il quindicesimo giorno di ogni mese, ogni due ore.<br />
<br />
*Esempio 5<br />
<pre><br />
00 1-9/2 1 5 * /comando/da/eseguire<br />
</pre><br />
il comando viene eseguito il primo maggio alle 1,00 - 3,00 - 5,00 - 7,00 - 9,00. Cioè ogni due ore dalle 1,00 alle 9,00.<br />
<br />
*Esempio 6<br />
<pre><br />
00 1-10/2 1 5 * /comando/da/eseguire<br />
</pre><br />
il comando viene eseguito il primo maggio alle 1,00 - 3,00 - 5,00 - 7,00 - 9,00. Cioè ogni due ore dalle 1,00 alle 10,00. Si noti come l'ultimo valore utile dell'intervallo non coincida, in questo caso, con l'ora in cui viene fatta partire l'ultima esecuzione giornaliera del comando.<br />
<br />
*Esempio 7<br />
<pre><br />
00 13 2,8,14 * * /comando/da/eseguire<br />
</pre><br />
il comando verrà eseguito il secondo, l'ottavo e il quattordicesimo giorno di ogni mese alle 13.00<br />
<br />
*Esempio 8<br />
<pre><br />
30 13 1-15 4,10 * /comando/da/eseguire<br />
</pre><br />
il comando verrà eseguito i primi quindici giorni di aprile e ottobre alle 13,30.<br />
<br />
*Esempio 9<br />
<pre><br />
*/30 13,20 * 1-7,9-12 1-5 /comando/da/eseguire<br />
</pre><br />
il comando verrà eseguito nei giorni feriali (da lunedì a venerdì) di tutti i mesi tranne agosto, alle 13,00 - 13,30 - 20,00 - 20,30.<br />
<br />
*Esempio 10<br />
<pre><br />
00 14,19 1-15 * 5 /comando/da/eseguire<br />
</pre><br />
il comando verrà eseguito alle 14,00 e alle 19,00 dei primi quindici giorni di ogni mese e anche ogni venerdì.<br/><br />
'''Attenzione.'''<br/><br />
Poiché i giorni possono essere specificati sia nel terzo che nel quinto campo e nel caso in cui questi due campi abbiano entrambi un valore diverso dall'asterisco, il demone Cron lancia il comando quando i campi corrispondono alla data corrente e in maniera indipendente l'uno dall'altro. In questo caso, dunque, verrà eseguito il comando sia negli specificati giorni del mese sia nei giorni specificati della settimana.<br/><br />
Quindi l'esempio precedente '''non''' porta al risultato di lanciare il comando solo nei primi quindici giorni di ogni mese quando il giorno è venerdì, ma al risultato di lanciare il comando nei primi quindici giorni di ciascun mese e anche ogni venerdì di ogni settimana dell'anno.<br />
<br />
Se si vuole ottenere il risultato di lanciare un comando in un particolare giorno della settimana solo se questo coincide con un giorno del mese o se appartiene a un intervallo di giorni del mese, bisogna eseguire un test separato sulla data. Il test può essere fatto sia all'interno di <code>crontab</code>, sia all'interno di uno script lanciato da <code>crontab</code>.<br />
<br />
* Esempio 10<br />
Questo è un esempio che mostra come eseguire un comando solo alla mezzanotte della prima domenica di ogni mese:<br />
<pre><br />
00 00 1-7 * * [ $(/bin/date '+\%u') -eq 7 ] && /comando/da/eseguire<br />
</pre><br />
* Esempio 11<br />
Quest'altro esempio mostra come eseguire un comando alle 20,00 nei giorni che vanno dal 5 al 10 di ogni mese e solo se questi giorni corrispondono a martedì o venerdì:<br />
<pre><br />
00 20 5-10 * * [ $(/bin/date '+\%u') -eq 2 -o $(/bin/date '+\%u') -eq 5 ] && /comando/da/eseguire<br />
</pre><br />
''notare in entrambi i casi l'uso dell'escape del carattere '%'''.<br/><br />
Consultare le manpages dei comandi '''date''' e '''test''' per ottenere informazioni sul loro funzionamento.<br />
<br />
=== Stringhe speciali ===<br />
Al posto dei primi cinque campi è possibile inserire particolari stringhe che il demone Cron interpreta come valori corretti per i campi data/ora. Vediamole:<br />
<pre><br />
stringa significato<br />
------ -------<br />
@reboot Lancia il comando all'avvio del sistema<br />
@yearly Lancia il comando una volta all'anno. Uguale a "0 0 1 1 *"<br />
@annually (come @yearly)<br />
@monthly Lancia il comando una volta al mese. Uguale a "0 0 1 * *"<br />
@weekly Lancia il comando una volta alla settimana. Uguale a "0 0 * * 0"<br />
@daily Lancia il comando una volta al giorno. Uguale a "0 0 * * *"<br />
@midnight (come @daily)<br />
@hourly Lancia il comando una volta all'ora. Uguale a "0 * * * *"<br />
</pre><br />
in base a questa tabella sono perfettamente ammissibili le seguenti righe per il file crontab:<br />
<pre><br />
@daily /comando/da/eseguire<br />
</pre><br />
con cui il comando verrà eseguito una volta al giorno; in particolare a mezzanotte di ogni giorno.<br />
<pre><br />
@monthly /comando/da/eseguire<br />
</pre><br />
con cui il comando verrà eseguito ogni mese; in particolare il primo giorno di ogni mese, a mezzanotte.<br />
<br />
=== Messaggi di output ===<br />
L'esecuzione di comandi o script può comportare l'invio allo standard output o allo standard error dei loro messaggi d'esecuzione.<br/> Normalmente tali messaggi vengono inviati allo schermo ma, nel caso vengano eseguiti tramite ''Cron'', l'output sarà reindirizzato attraverso l'[[MTA]] di sistema all'utente specificato tramite la variabile ''MAILTO''.<br/><br />
Questo può portare all'invio di messaggi con output indesiderato, o perché totalmente non richiesto per un determinato cronjob o perché si desidera soltanto la notifica dei messaggi d'errore nel caso il comando abbia avuto problemi.<br/><br />
Per operare su questo aspetto si può reindirizzare l'output del comando specificato in ''Cron'' come si farebbe normalmente per la shell.<br />
* Notifica solo dei messaggi d'errore. Si reindirizza lo standard output verso "/dev/null", ad esempio:<br />
: <pre>00 3 1 7 * /comando/da/eseguire > /dev/null</pre><br />
* Soppressione totale dei messaggi. Si reindirizza sia lo standard output che lo standard error verso "/dev/null", ad esempio:<br />
: <pre>00 3 1 7 * /comando/da/eseguire > /dev/null 2>&1</pre>Si noti che, in questo caso, l'impostazione:<pre>MAILTO = ""</pre><br />
: avrebbe effetto su tutti i cronjob e non solo su quello voluto.<br />
* Utilizzo di un file di log personale<br />
: <pre>00 3 1 7 * /comando/da/eseguire >> /percorso/desiderato/mio_file.log 2>&1</pre><br />
<br />
=== Esempio di crontab ===<br />
Di seguito un esempio di file crontab in cui sono specificate le variabili d'ambiente e i settaggi di comando:<br />
<pre><br />
# Crontab Environmental settings<br />
SHELL=/bin/bash<br />
PATH=/sbin:/bin:/usr/sbin:/usr/bin<br />
MAILTO=root<br />
<br />
# Crontab Command settings<br />
<br />
# m h dom m dow command<br />
00 3 * 7 0 /comando/da/eseguire<br />
15 20 * 1-7 * /comando/da/eseguire2<br />
*/30 7,21 1-15 1 * /comando/da/eseguire3<br />
@reboot /comando/da/eseguire4<br />
</pre><br />
<br />
== Crontab di sistema: /etc/crontab ==<br />
Anche la nostra macchina ha il proprio file crontab in cui sono specificati i comandi di sistema da lanciare ad intervalli regolari. Il file è contenuto in <code>/etc/crontab</code> e le sue modifiche sono automaticamente intercettate da Cron.<br/><br />
In questo file è utilizzato un campo aggiuntivo, dopo i primi cinque campi data/ora e prima del comando, che specifica l'utente con i cui permessi verrà eseguito il comando.<br />
<br />
Guardiamo i settaggi di comando al suo interno:<br />
<pre><br />
# m h dom mon dow user command<br />
21 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
</pre><br />
Sono presenti quattro righe relative ad altrettanti compiti per Cron. Se sul nostro sistema non è installato <code>anacron</code>, il demone Cron eseguirà il comando <code>run-parts</code> che ha il compito di lanciare tutti gli script presenti nelle cartelle <code>/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly .</code><br/><br />
; <code>'''Prima riga'''</code>:<br />
il comando <code>run-parts</code> lancia gli script presenti in <code>/etc/cron.hourly</code> ogni ora e quando i minuti valgono 21<br />
; <code>'''Seconda riga'''</code>:<br />
il comando <code>run-parts</code> lancia gli script presenti in <code>/etc/cron.daily</code> alle 6,25 di ogni giorno.<br />
; <code>'''Terza riga'''</code>:<br />
il comando <code>run-parts</code> lancia gli script presenti in <code>/etc/cron.weekly</code> ogni domenica alle 6,47.<br />
; <code>'''Quarta riga'''</code>:<br />
il comando <code>run-parts</code> lancia gli script presenti in <code>/etc/cron.monthly</code> il primo di ogni mese alle 6,52<br />
<br />
In breve, il crontab di sistema indica a Cron di lanciare ad intervalli regolari gli script di sistema contenuti nelle cartelle sopra indicate.<br/><br />
Tipicamente questo file non necessita di essere editato, a meno che non ci si accorga che gli script non possono essere lanciati a causa dell'inattività della macchina alla data/ora specificata. Come si può ben notare, il comando <code>run-parts</code> viene lanciato con i permessi di root (sesto campo).<br />
<br />
È importante sottolineare che, di default, nel file <code>/etc/crontab</code> è indicata un'ora durante la quale è molto probabile che una macchina desktop sia spenta e che, quindi, Cron sia impossibilitato ad eseguire gli script presenti nelle directory <code>/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly .</code><br/><br />
Poiché in queste directory sono contenuti script che <u>necessitano</u> di essere eseguiti in quanto permettono, tra le altre cose, la rotazione dei log e il backup di file importanti di sistema, è vivamente consigliato editare il file modificando le ore/minuti del cronjob in modo da essere sicuri che il sistema sia attivo all'ora specificata.<br/><br />
Ad esempio:<br />
<pre><br />
# m h dom mon dow user command<br />
21 * * * * root cd / && run-parts --report /etc/cron.hourly<br />
25 8 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )<br />
47 8 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )<br />
52 8 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )<br />
</pre><br />
Se non si vuole editare il file <code>/etc/crontab</code> si può, più semplicemente, installare [[anacron]].<br/><br />
Ovviamente per un server sempre acceso, e con Cron attivo e funzionante, non c'è bisogno di alcuna modifica né di installare anacron.<br />
<br />
== Le directory /etc/cron.*/ ==<br />
Per completezza d'informazione si tratterà brevemente delle directory viste nel paragrafo precedente in cui sono contenuti gli script di sistema, o forniti da applicazioni, che necessitano di essere eseguiti ad intervalli regolari.<br/><br />
*<code>'''/etc/cron.hourly'''</code>: in questa directory sono contenuti gli script da eseguire ogni ora;<br />
*<code>'''/etc/cron.daily'''</code>: in questa directory sono contenuti gli script da eseguire ogni giorno;<br />
*<code>'''/etc/cron.weekly'''</code>: in questa directory sono contenuti gli script da eseguire ogni settimana;<br />
*<code>'''/etc/cron.monthly'''</code>: in questa directory sono contenuti gli script da eseguire ogni mese;<br />
<br />
La data/ora in cui vengono eseguiti gli script contenuti in queste directory è quella specificata nel file <code>/etc/crontab</code>.<br />
<br />
*<code>'''/etc/cron.d/'''</code>: in questa directory sono vi sono script ma file nel formato di <code>crontab</code>. Qui il sistema specifica i lavori da passare a Cron per intervalli temporali diversi dall'ora o dal giorno o dal mese o dalla settimana.<br/>Le righe presenti nei file contenuti in quest'ultima directory devono seguire il seguente schema:<pre>* * * * * utente comando</pre>Le modifiche ai file di questa directory vengono automaticamente intercettate da Cron e, come per il file <code>/etc/crontab</code>, anche per i file contenuti in questa directory viene specificato l'utente con i cui permessi deve essere eseguito il comando.<br/> Anacron non esegue i cronjob contenuti in questa directory.<br />
<br />
Tutte queste cinque directory, per una questione di pulizia del sistema, non dovrebbero essere utilizzate per inserirvi script da parte degli utenti, anche se nulla vieta di farlo. Le controindicazioni sono quelle di "dimenticarsi" qualche script o di lanciare, coi permessi di root, qualche comando che necessiterebbe solo dei semplici permessi utente.<br/><br />
Se non si hanno esigenze particolari, la strada per assegnare dei lavori a Cron è sempre quella di avvalersi del comando:<br />
<pre><br />
crontab -e<br />
</pre><br />
sia per root che per un normale utente.<br />
<br />
== Esportare un file crontab ==<br />
Se si vuole salvare il proprio crontab per esportarlo su un'altra macchina o semplicemente per farne una copia di backup, la procedura è semplicissima:<br />
<pre>$ crontab -l > mycrontab </pre><br />
in questo modo il file <code>crontab</code> verrà salvato nel file <code>mycrontab</code>.<br/><br />
Per salvare il crontab di root è sufficiente lanciare lo stesso comando con i permessi di root.<br/><br />
Se si vuole salvare il crontab di un altro utente, eseguire con i permessi di root:<br />
<pre># crontab -u utente -l > usercrontab </pre><br />
I nomi scelti per i file sono puramente indicativi.<br />
<br />
== Importare un file crontab ==<br />
Questa procedura è utile per importare un file in cui si è precedentemente salvato il contenuto di un file crontab oppure per importare un file editato a mano attraverso un qualsiasi altro editor, testuale o grafico:<br />
<pre>$ crontab mycrontab</pre><br />
in questo modo il contenuto di <code>mycrontab</code> verrà inserito nel crontab dell'utente che lancia il comando.<br/><br />
Per un diverso utente, eseguire da root:<br />
<pre># crontab -u utente usercrontab</pre><br />
Anche in questo caso i nomi dei file sono puramente indicativi.<br/><br />
'''Attenzione''': il file crontab, se presente, verrà sovrascritto!<br />
<br />
== Logging ==<br />
<br />
;File di log:Nel caso si abbiano problemi nel far funzionare correttamente il servizio di scheduling, si può in qualsiasi momento dare un'occhiata al file di log <code>/var/log/syslog</code> in cui il demone Cron invia i propri messaggi di sistema.<br/>Alternativamente è possibile avere un file di log separato per contenere i messaggi di Cron.<br/>Basta decommentare la riga del file <code>/etc/rsyslog.conf</code> :<pre>cron.* /var/log/cron.log</pre>e riavviare "rsyslog":<pre># service rsyslog restart</pre>per avere tutti i messaggi in <code>/var/log/cron.log</code> .<br />
<br />
<br />
;Log level:Il livello di logging (cioè le informazioni che vengono scritte nei log prodotti da ''Cron'') può essere impostato nel file <code>/etc/default/cron</code> agendo sulla direttiva "EXTRA_OPTS". Ad esempio:<pre>EXTRA_OPTS="-L 8"</pre>I valori possibili sono:<pre>0 nessun log a meno che non avvenga un errore &#10;1 avvio del cronjob &#10;2 fine del cronjob &#10;4 log del cronjob con stato d'uscita diverso da 0 &#10;8 log anche dei processi-figlio del processo eseguito da Cron &#10;</pre>I valori possono essere sommati se si vuol loggare più di un evento.<br/>Con:<pre>EXTRA_OPTS="-L 15"</pre>si ottiene la massima "verbosità" del log.<br/>Per rendere effettive queste modifiche, servirà riavviare ''Cron'':<pre># service cron restart</pre><br />
<br />
== Strumenti grafici ==<br />
Benché il comando <code>crontab</code> sia assoultamente sufficiente per gestire i lavori da assegnare a Cron, a volte può essere comodo avere a disposizione un'interfaccia grafica anziché utilizzare la riga di comado soprattutto quando si utilizza Cron per la prima volta.<br/><br />
{{Warningbox | Fare un backup del propri cronjob. Questi strumenti sovrascrivono i file corrispondenti in <code>/var/spool/cron/crontabs</code> e quindi le informazioni qui contenute (ad esempio i commenti) potrebbero andare perse.}}<br />
{| class="wikitable"<br />
!Pacchetto<br />
!Ambiente grafico<br />
!Note<br />
|-<br />
|kde-config-cron || KDE || crea una voce in "Avvio e Spegnimento" all'interno delle impostazioni di KDE<br />
|}<br />
<br />
== Problemi comuni ==<br />
;<u>Lo script viene eseguito normalmente ma non attraverso Cron</u>:Il problema può essere in larga parte dovuto a due fattori: lo script fa uso di una sintassi diversa da quella usata da dash (leggere a tal proposito il paragrafo relativo ai "Crontab Environmental settings" e, in particolare, l'uso della variabile SHELL) oppure lo script esegue comandi che non ricadono all'interno dei percorsi definiti dalla variabile PATH. In quest'ultimo caso si può far ricorso al comando "strace" (presente nel pacchetto omonimo):<pre>$ strace -f -e trace=execve ./nomescript</pre> che mostrerà il percorso dei comandi eseguiti dallo script. Modificare, se necessario, la variabile PATH affinché preveda percorsi diversi da <code>/usr/bin</code> o <code>/bin</code> .<br />
<br />
==Note==<br />
Il sistema non va indietro nel tempo a raccogliere i lavori di Cron, ma li esegue solo se la data e l'ora sono uguali alla voce nel file. Se il computer è spento quando dovrebbe essere eseguito un comando in Cron ed [[anacron]] non è installato, quel comando non viene eseguito.<br />
<br />
{{Autori<br />
|Autore = [[Utente:Ferdybassi|Ferdybassi]]<br />
|Verificata_da =<br />
: [[Utente:S3v|S3v]]<br />
: [[Utente:Ferdybassi|Ferdybassi]] (dopo l'estensione)<br />
: [[Utente:Stemby|Stemby]]<br />
: [[Utente:HAL 9000|HAL 9000]] 19:40, 31 mar 2015 (CEST)<br />
|Numero_revisori = 4<br />
|Estesa_da = <br />
: [[Utente:S3v|S3v]]<br />
}}<br />
<br />
[[Categoria:Servizi di sistema]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Dual_boot_con_Debian_e_Windows_10&diff=44362Dual boot con Debian e Windows 102021-04-07T11:25:50Z<p>S3v: tolto stub</p>
<hr />
<div>{{Cautionbox|Questa guida è stata testata per un dual boot Debian-Windows 10 basato su uno schema di partizioni [[GPT]]. Se la propria macchina utilizza uno schema [[MBR]], estendere liberamente questa guida con tutte le informazioni che si ritengono necessarie.}}<br />
{{Versioni_compatibili | Buster | Bullseye}}<br />
In questa guida verranno indicati i diversi passi per installare Debian partendo da un'installazione già esistente e funzionante di Windows 10.<br /><br />
Al termine si otterrà un sistema con entrambi i sistemi operativi installati e con la possibilità di scegliere, al momento della fase di boot della macchina, quale dei due avviare.<br />
<br />
__toc__<br />
== Prima di iniziare ==<br />
Operazioni preliminari all'applicazione di questa guida:<br />
;Aggiornare Windows 10: è importante che Windows 10 sia aggiornato in modo da correggere eventuali problemi che possano influire nella procedura indicata all'interno di questa guida.<br/>Notare che alcuni aggiornamenti potrebbero non essere rilevati fino a quando altri aggiornamenti non siano stati precedentemente installati. Ricercare tutti gli aggiornamenti non facoltativi fino a quando si è sicuri di averli installati tutti.<br />
; Eseguire un backup: è fondamentale che sia stata approntata una copia di tutti i file ritenuti importanti. Le operazioni descritte, benché non complesse, riguardano procedure che coinvolgono i dischi di sistema e i [[File System]] e quindi i file che vi si trovano. È assolutamente vitale avere una copia dei file che non si vuole perdere nel caso qualcosa andasse storto. Siete stati avvertiti ;)<br />
;Boot da USB o CD(DVD)-ROM: assicurarsi che la propria macchina consenta l'avvio tramite USB o CD-ROM (o DVD-ROM).<br />
<br />
== Creare spazio per Debian ==<br />
Ovviamente Debian richiede dello spazio libero sul disco per essere installata. Questo può essere creato in molti modi, ma il più semplice consiste nell'utilizzare "Disk Management", uno strumento di gestione delle partizioni incorporato in Windows 10.<br />
<br />
Utilizzare la combinazione di tasti "Win+r" e digitare:<br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
Si aprirà una finestra simile alla seguente in cui vengono elencate tutte le partizioni presenti sul disco (o sui dischi) di sistema.<br />
[[File:Shrink part win10 1.png|centro|miniatura|700x700px]]<br />
Individuare la partizione contenente il filesystem NTFS (tipicamente contrassegnata con l'etichetta "C:"), fare clic su di essa con il tasto destro del mouse e scegliere "Riduci..." dal menù a comparsa che verrà visualizzato.<br />
Verrà aperta un'altra finestra attraverso la quale ci verrà chiesto lo spazio da liberare sulla partizione scelta.<br/><br />
In questo caso è stato scelto il valore 200000 MB che corrisponde a circa 195 GB. Scegliere il valore che si ritiene più adatto alle proprie esigenze considerando che non è possibile andare oltre la soglia massima indicata.<br />
[[File:Shrink part win10 2.png|centro|miniatura|700x700px]]<br />
Al termine dell'operazione verrà creato uno spazio non partizionato sul disco.<br/><br />
[[File:Shrink part win10 3.png|centro|miniatura|700x700px]]<br />
{{Warningbox | Prima di installare Debian, è consigliato riavviare la macchina e utilizzare il sistema normalmente per tutto il tempo che si ritiene necessario a controllare non siano stati introdotti problemi che abbiano intaccato le funzionalità di Windows.}}<br />
<br />
== Ottenere Debian ==<br />
Debian può essere ottenuta utilizzando le immagini .iso presenti sul sito ufficiale.<br/><br />
Consultare [[Installare Debian|questa guida]] per maggiori informazioni su come ottenere Debian, quale immagine scaricare e come creare un supporto da cui avviare l'installazione.<br />
== Installazione ==<br />
Dopo aver avviato la propria macchina dal supporto contenente Debian, verrà avviato l'[[installer]] Debian che si occuperà di tutte le fasi di installazione.<br/><br />
L'installazione (grafica o testuale) non richiede particolari raccomandazioni se non rispondere alle domande che verranno poste di volta in volta (nazione, lingua, tastiera, configurazione della rete, etc e potrebbe inoltre essere necessario installare [[firmware]] aggiuntivo) e proseguire con il [[wizard]] fino a quando non compare questa schermata in cui possiamo scegliere dove installare Debian; ci accorgiamo subito che l'installer ci propone, come prima opzione, di utilizzare lo spazio libero precedentemente creato:<br />
[[File:Partman-auto automatically partition.png|centro|miniatura|500x500px]]<br />
Nella schermata successiva viene chiesto se debbano essere create altre partizioni diverse da quella di [[root]] "/".<br/><br />
La scelta è a discrezione dell'utente; se si sta installando Debian per la prima volta, è consigliato scegliere "Tutti i file in una partizione".<br />
[[File:Partman-auto choose recipe.png|centro|miniatura|500x500px]]<br />
Infine confermare i cambiamenti:<br />
[[File:Partman choose partition.png|centro|miniatura|500x500px]]<br />
Dopo questo passaggio, l'installazione prosegue normalmente chiedendo i pacchetti da installare, scaricando aggiornamenti di sicurezza (se presenti) e terminando con la schermata in cui viene chiesto di riavviare la macchina.<br />
<br />
== Scelta del SO all'avvio ==<br />
Al boot della macchina, comparirà la schermata di [[GRUB]] in cui verranno elencati i sistemi operativi che è possibile avviare (nel nostro caso Debian e Windows 10).<br />
[[File:Grub-w10-deb.png|centro|miniatura|500x500px]]<br />
{{Suggerimento|Nel caso si volesse avviare Windows 10 come sistema predefinito di avvio è sufficiente da Debian dare il seguente comando<br />
<pre># mv /etc/grub.d/30_os-prober /etc/grub.d/08_os-prober<br />
# update-grub2</pre>}}<br />
== Ripristino ==<br />
Il ripristino dello stato antecedente l'installazione di Debian è possibile seguendo queste tre fasi successive:<br />
# rimozione di GRUB;<br />
# rimozione o modifica della voce relativa a Debian da UEFI;<br />
# rimozione delle partizioni.<br />
Non tutte le fasi sono strettamente necessarie. Se si vuole "nascondere" Debian dal boot, basta seguire solo il secondo passaggio.<br />
=== Rimozione boot loader ===<br />
GRUB può essere rimosso tramite la cancellazione della directory relativa a Debian che si trova nella partizione EFI. È possibile rimuovere completamente Debian dal dispositivo e ripristinare Windows 10 sia da Debian che da Windows.<br/><br />
Dopo aver completato questa operazione e riavviato la macchina, il sistema utilizzerà il boot manager di Windows che, a sua volta e a meno di altre configurazioni, avvierà automaticamente Windows 10.<br />
==== In Debian ====<br />
Dopo il login in Debian, accertarsi che la partizione <code>/dev/sda1</code> sia montata:<br />
<pre><br />
# mount /dev/sda1<br />
mount: /boot/efi: /dev/sda1 already mounted on /boot/efi<br />
</pre><br />
il precedente output visualizza il [[mountpoint]], in questo caso <code>/boot/efi</code> .<br/><br />
Controllare che esista la directory <code>/boot/efi/EFI/debian</code>:<br />
<pre><br />
# ls /boot/efi/EFI<br />
boot debian Microsoft<br />
</pre><br />
e infine cancellarla:<br />
<pre><br />
# cd /boot/efi/EFI<br />
# rm -rf debian<br />
</pre><br />
==== In Windows ====<br />
È necessario avviare come amministratore Windows PowerShell e dare i seguenti comandi<br />
<pre><br />
mountvol S: /S<br />
S:<br />
cd .\EFI\<br />
dir<br />
rd /S debian<br />
</pre><br />
=== Rimozione o modifica voci da UEFI ===<br />
Questo passo non è fondamentale e serve soltanto per non lasciare voci relative a Debian nell'UEFI (noto in precedenza come [[BIOS]]) della macchina.<br/><br />
La procedura varia da macchina a macchina e consiste nell'avviare UEFI al boot tramite i tasti specificati nel manuale del produttore e rimuovere la voce dalla sequenza di boot.<br/><br />
Notare che, anche se non si elimina la voce relativa a Debian dalla sequenza di boot, questa non verrà comunque considerata in quanto fa riferimento ad un boot loader (GRUB) cancellato in precedenza.<br />
<br />
Se si desidera semplicemente utilizzare il boot manager di Windows senza rimuovere Debian, è sufficiente modificare la sequenza di boot facendo in modo che il boot manager di Windows sia al primo posto. In quest'ultimo caso, ovviamente, non va né rimosso GRUB né cancellate le partizioni relative a Debian.<br />
=== Rimozione partizioni ===<br />
{{Warningbox|Non cancellare le partizioni Debian prima di aver rimosso GRUB, pena l'impossibilità di riavviare la macchina.<br/><br />
Se si fosse verificato questo spiacevole caso, rimuovere Debian dalla sequenza di boot come spiegato nel secondo passaggio.}}<br />
Da Windows utilizzare la combinazione di tasti "Win+r" e digitare: <br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
A questo punto rimuovere le partizioni create dall'installer Debian (sono due, una del sistema e una per la swap). In seguito si può estendere la dimensione della partizione C:\ per riavere lo spazio su Windows.<br />
<gallery><br />
File:Restore win10 part1.png|Partizioni Debian che si vuole rimuovere<br />
File:Restore win10 part2.png|Rimuovere la prima partizione<br />
File:Restore win10 part3.png|Verrà liberato lo spazio corrispondente<br />
File:Restore win10 part4.png|Rimuovere la seconda partizione<br />
File:Restore win10 part5.png|In nero lo spazio liberato dopo aver rimosso entrambe le partizioni<br />
File:Restore win10 part6.png|Estendere il volume C:<br />
File:Restore win10 part7.png|Scegliere lo spazio massimo da utilizzare<br />
</gallery><br />
<br />
== Domande frequenti ==<br />
=== Sto usando GPT o MBR? ===<br />
Per conoscere lo schema di partizioni utilizzato, premere la combinazione di tasti "Win+r" ed eseguire:<br />
<pre><br />
diskpart<br />
</pre><br />
Dal prompt che compare:<br />
<pre><br />
list disk<br />
</pre><br />
Se si sta utilizzando GPT, comparirà nell'ultima colonna un asterisco:<br />
<pre><br />
N.Disco Stato Dimensioni Disponibile Din GPT<br />
------- -------- -------------- -------------- ----- ---<br />
Disco 0 Online 931 Gbytes 1024 Kbytes *<br />
</pre><br />
Altrimenti, in caso di MBR, l'ultima colonna sarà vuota:<br />
<pre><br />
N.Disco Stato Dimensioni Disponibile Din GPT<br />
------- -------- -------------- -------------- ----- ---<br />
Disco 0 Online 455 Gbytes 0 byte<br />
</pre><br />
I valori indicati in questo esempio variano chiaramente in base alla propria macchina.<br />
{{Autori<br />
|Autore= [[Utente:S3v|S3v]]<br />
|Verificata_da=<br />
: [[Utente:Marcomg|marcomg]]<br />
}}<br />
[[Categoria: Installazione]]</div>S3vhttps://guide.debianizzati.org/index.php?title=VirtualBox:_installazione&diff=44361VirtualBox: installazione2021-04-07T10:31:09Z<p>S3v: rimosso da Buster e Bullseye</p>
<hr />
<div>{{Virtualbox}}<br />
__TOC__<br />
L'installazione di VirtualBox può essere effettuata in due modi:<br />
* dai [[repository]] ufficiali<br />
* dal repository<sup>[[#Link esterni|[2]]]</sup> messo a disposizione da Oracle<br />
<br />
Attualmente VirtualBox è contenuto nella [[sezione]] "[[contrib]]" dei repository Debian in quanto è necessario il compilatore non-free Open Watcom per la creazione del BIOS<sup>[[#Link esterni|[1]]]</sup>.<br/><br />
La differenza tra i pacchetti di VirtualBox in Debian e il pacchetto fornito da Oracle è sostanzialmente solo la diversa versione del software.<br/><br />
Nei repository di Oracle è possibile trovare sempre l'ultima versione disponibile, mentre per Debian si avranno aggiornamenti leggermente più lenti ma con la garanzia che il software installato sia perfettamente compatibile con il sistema operativo e con gli altri pacchetti presenti sulle propria macchina oltre ad assicurare la sua piena aderenza alla [[policy]] di Debian. Questo non viene garantito installando VirtualBox da repository esterni come quello messo a disposizione da Oracle.<br />
<br />
== Repository di Debian ==<br />
<br />
=== Premessa ===<br />
<br />
L'installazione dei pacchetti raccomandati da VirtualBox implica l'installazione di un ingente quantitativo di pacchetti legati ad ambienti grafici.<br/><br />
Questo non è evidentemente un problema se la macchina su cui si sta per installare VirtualBox è già dotata di un ambiente grafico e/o si prevede di gestire sistemi guest con ambiente grafico, tipo Windows, ma in caso contrario i pacchetti raccomandati finiscono solo per appesantire inutilmente il sistema.<br/><br />
La differenza è notevole, si va da più di 500 MB di pacchetti da scaricare nel primo caso a meno di 100 nel secondo, pertanto se si ricade nel secondo caso accertarsi di non aver abilitato l'installazione automatica dei pacchetti raccomandati.<br />
<br />
=== Jessie e Sid ===<br />
<br />
È sufficiente un:<br />
<pre># apt-get install virtualbox virtualbox-qt</pre><br />
Il [[pacchetto]] "virtualbox-qt" non è indispensabile e serve solo per ottenere un'interfaccia basata sulle librerie Qt (ad esempio per chi utilizza KDE).<br />
<br />
=== Buster e Bullseye ===<br />
VirtualBox è stato rimosso da [[Buster]] e [[Bullseye]] e non è presente neanche nel rispettivi [[repository]] ''backports''. Se si desidera installarlo, lo si può prelevare da Sid oppure installare la versione presente nei repository di Oracle.<br/><br />
Poiché potrebbe essere necessario risolvere manualmente le [[dipendenze]] e dover installare o sostituire un'ingente quantità di pacchetti, si consiglia l'utilizzo di alternative quali [[Qemu]].<br />
<br />
=== Stretch backport ===<br />
VirtualBox, rimosso dai repository di Stretch per motivi di sicurezza (vedere [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=794466 questo] [[bug]]) prima del rilascio dell'attuale stable, é disponibile nei [[repository]] [[backport]] di [[Stretch]].<br /><br />
Per procedere con l'installazione, [[Il_repository_Backports#Configurazione | configurare]] il proprio sources.list abilitando tale repository e procedere con:<br />
<pre># apt-get update<br />
<br />
# apt-get install -t stretch-backports virtualbox virtualbox-qt</pre><br />
<br />
=== Wheezy e Squeeze ===<br />
Squeeze e Wheezy non sono più supportate da Debian e si consiglia un aggiornamento a versioni più recenti. La versione di VirtualBox presente negli [[Archivi Debian]] è:<br />
* VirtualBox 3.2 (pacchetto ''virtualbox-ose'') per Squeeze<br />
* VirtualBox 4.3 (pacchetto ''virtualbox'') per Wheezy (wheezy-backports)<br />
<br />
== Repository di Oracle ==<br />
VirtualBox è anche presente nei repository messi a disposizione da Oracle<sup>[[#Link esterni|[1]]]</sup>. Dalla versione 4 l'unica differenza rispetto ai repository di Debian è data da un'eventuale versione più recente.<br/><br />
<br />
In caso si decida di scegliere questa via, inserire in <code>/etc/apt/sources.list</code> le seguenti righe per la versione Debian che si sta utilizzando.<br />
<br />
=== Buster ===<br />
<pre><br />
### Repository di VirtualBox ###<br />
deb https://download.virtualbox.org/virtualbox/debian buster contrib<br />
</pre><br />
<br />
=== Stretch ===<br />
<pre><br />
### Repository di VirtualBox ###<br />
deb https://download.virtualbox.org/virtualbox/debian stretch contrib<br />
</pre><br />
<br />
=== Jessie ===<br />
<pre><br />
### Repository di VirtualBox ###<br />
deb https://download.virtualbox.org/virtualbox/debian jessie contrib<br />
</pre><br />
<br />
=== Wheezy ===<br />
<pre><br />
### Repository di VirtualBox ###<br />
deb https://download.virtualbox.org/virtualbox/debian wheezy contrib<br />
</pre><br />
<br />
=== Squeeze ===<br />
<pre><br />
### Repository di VirtualBox ###<br />
deb https://download.virtualbox.org/virtualbox/debian squeeze contrib non-free<br />
</pre><br />
<br />
=== Lenny ===<br />
<pre><br />
### Repository di VirtualBox ###<br />
deb https://download.virtualbox.org/virtualbox/debian lenny contrib non-free<br />
</pre><br />
<br />
=== Installazione ===<br />
Per installare VirtualBox dai repository di Oracle, bisogna innanzitutto prelevare due chiavi pubbliche necessarie per controllare l'autenticità dei pacchetti:<br />
<pre><br />
# apt-key adv --fetch-keys http://download.virtualbox.org/virtualbox/debian/oracle_vbox_2016.asc<br />
# apt-key adv --fetch-keys http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc<br />
</pre><br />
e quindi controllare che l'impronta digitale ([[fingerprint]]) delle chiavi appena importate sia corretta. Ad esempio, se il comando:<br />
<pre><br />
# apt-key list<br />
</pre><br />
restituisce, tra le altre cose, qualcosa di simile a:<br />
pub 1024D/'''98AB5139''' 2010-05-18<br />
uid Oracle Corporation (VirtualBox archive signing key) <info@virtualbox.org><br />
sub 2048g/281DDC4B 2010-05-18<br />
<br />
pub 4096R/'''2980AECF''' 2016-04-22<br />
uid Oracle Corporation (VirtualBox archive signing key) <info@virtualbox.org><br />
sub 4096R/920E471F 2016-04-22<br />
<br />
il fingerprint per le due chiavi pubbliche con ID uguale a '''98AB5139''' e '''2980AECF''' deve essere ricavato con il comando [[apt-key]]:<br />
<pre># apt-key finger 98AB5139 2980AECF</pre><br />
che restituirà in output:<br />
pub 1024D/98AB5139 2010-05-18<br />
Impronta digitale della chiave = '''7B0F AB3A 13B9 0743 5925 D9C9 5442 2A4B 98AB 5139'''<br />
uid Oracle Corporation (VirtualBox archive signing key) <info@virtualbox.org><br />
sub 2048g/281DDC4B 2010-05-18<br />
<br />
pub 4096R/2980AECF 2016-04-22<br />
Impronta digitale della chiave = '''B9F8 D658 297A F3EF C18D 5CDF A2F6 83C5 2980 AECF'''<br />
uid Oracle Corporation (VirtualBox archive signing key) <info@virtualbox.org><br />
sub 4096R/920E471F 2016-04-22<br />
<br />
I due fingerprint ottenuti vanno confrontati con quelli contenuti in questa pagina<sup>[[#Link esterni|[2]]]</sup>. Installare i pacchetti provenienti dal repository di Oracle <u>'''solo'''</u> nel caso in cui i valori siano identici.<br />
<br />
Una volta verificate con successo la chiavi pubbliche, si può passare ad aggiornare la lista dei pacchetti prelevabili dai repository:<br />
<pre># apt-get update</pre><br />
<br />
ed infine a installare VirtualBox in base alla versione di Debian utilizzata:<br />
* '''Jessie, Stretch, Buster e Sid'''<pre># apt-get install virtualbox-6.1</pre>Altre versioni:<br>Buster e Sid: ''virtualbox-5.2, virtualbox-6.0''<br>Stretch: ''virtualbox-5.0, virtualbox-5.1, virtualbox-5.2, virtualbox-6.0''<br>Jessie: ''virtualbox-4.3, virtualbox-5.0, virtualbox-5.1, virtualbox-5.2, virtualbox-6.0''<br />
* '''Wheezy'''<pre># apt-get install virtualbox-5.2</pre>{{Warningbox | Nel caso in cui venga visualizzato un messaggio simile a questo durante l'installazione:<pre>I seguenti pacchetti hanno dipendenze non soddisfatte:<br />
virtualbox-5.2 : Dipende: libcurl3 (>= 7.16.2) ma non sta per essere installato<br />
E: Impossibile correggere i problemi, ci sono pacchetti danneggiati bloccati.</pre>si consiglia di attendere che il problema vanga risolto oppure di installare la versione 5.1 di VirtualBox:<pre># apt-get install virtualbox-5.1</pre> oppure, se abbastanza esperti e nel caso in cui le altre applicazioni lo consentano, di risolvere manualmente le dipendenze.}}<br />
* '''Squeeze'''<pre># apt-get install virtualbox-5.0</pre><br />
* '''Lenny'''<pre># apt-get install virtualbox-4.1</pre><br />
<br />
== Link esterni ==<br />
[1] [http://metadata.ftp-master.debian.org/changelogs/contrib/v/virtualbox/stable_copyright Copyright di VirtualBox]<br/><br />
[2] [https://www.virtualbox.org/wiki/Linux_Downloads Download di VirtualBox dal sito Oracle (pacchetti .deb e repository)]<br/><br />
<br />
[[Categoria:Virtualizzazione]] [[Categoria:Non-Free]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Dual_boot_con_Debian_e_Windows_10&diff=44349Dual boot con Debian e Windows 102021-04-02T21:46:22Z<p>S3v: aggiunto paragrafo "Domande frequenti"</p>
<hr />
<div>{{Stub}}<br />
{{Versioni_compatibili | Buster | Bullseye}}<br />
In questa guida verranno indicati i diversi passi per installare Debian partendo da un'installazione già esistente e funzionante di Windows 10.<br/><br />
Al termine si otterrà un sistema con entrambi i sistemi operativi installati e con la possibilità di scegliere, al momento della fase di boot della macchina. quale dei due avviare.<br />
<br />
__toc__<br />
== Caveat ==<br />
Questa guida è stata testata per un dual boot Debian-Windows 10 basato su uno schema di partizioni [[GPT]]. Se la propria macchina utilizza uno schema [[MBR]], estendere liberamente questa guida con tutte le informazioni che si ritengono necessarie.<br />
== Prima di iniziare ==<br />
Operazioni preliminari all'applicazione di questa guida:<br />
;Aggiornare Windows 10: è importante che Windows 10 sia aggiornato in modo da correggere eventuali problemi che possano influire nella procedura indicata all'interno di questa guida.<br/>Notare che alcuni aggiornamenti potrebbero non essere rilevati fino a quando altri aggiornamenti non siano stati precedentemente installati. Ricercare tutti gli aggiornamenti non facoltativi fino a quando si è sicuri di averli installati tutti.<br />
; Eseguire un backup: è fondamentale che sia stata approntata una copia di tutti i file ritenuti importanti. Le operazioni descritte, benché non complesse, riguardano procedure che coinvolgono i dischi di sistema e i [[File System]] (e, quindi, i file) che vi si trovano. È assolutamente vitale avere una copia dei file che non si vuole perdere nel caso qualcosa andasse storto. Siete avvertiti ;)<br />
;Boot da USB o CD(DVD)-ROM: assicurarsi che la propria macchina consenta l'avvio tramite USB o CD-ROM (o DVD-ROM).<br />
== Creare spazio per Debian ==<br />
Ovviamente Debian richiede spazio libero per essere installata questo può essere creato in molti modi ma il più semplice consiste nell'utilizzare "Disk Management", uno strumento di gestione delle partizioni incorporato in Windows 10.<br />
<br />
Utilizzare la combinazione di tasti "Win+r" e digitare:<br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
Si aprirà una finestra simile alla seguente in cui vengono elencate tutte le partizioni presenti sul disco (o sui dischi) di sistema.<br />
[[File:Shrink part win10 1.png|centro|miniatura|700x700px]]<br />
Individuare la partizione contenente il filesystem NTFS (tipicamente contrassegnata con l'etichetta "C:"), fare clic su di essa con il tasto destro del mouse e scegliere "Riduci..." dal menù a comparsa che verrà visualizzato.<br />
Verrà aperta un'altra finestra attraverso la quale ci verrà chiesto lo spazio da liberare sulla partizione scelta.<br/><br />
In questo caso è stato scelto il valore 200000 MB che corrisponde a circa 195 GB. Scegliere il valore che si ritiene più adatto alle proprie esigenze considerando che non è possibile andare oltre la soglia massima indicata.<br />
[[File:Shrink part win10 2.png|centro|miniatura|700x700px]]<br />
Al termine dell'operazione verrà creato uno spazio non partizionato sul disco.<br/><br />
[[File:Shrink part win10 3.png|centro|miniatura|700x700px]]<br />
{{Warningbox | Prima di installare Debian, è consigliato riavviare la macchina e utilizzare il sistema normalmente per tutto il tempo che si ritiene necessario a controllare non siano stati introdotti problemi che abbiano intaccato le funzionalità di Windows.}}<br />
== Ottenere Debian ==<br />
Debian può essere ottenuta utilizzando le immagini .iso presenti sul sito ufficiale.<br/><br />
Consultare [[Installare Debian|questa guida]] per maggiori informazioni su come ottenere Debian, quale immagine scaricare e come creare un supporto da cui avviare l'installazione.<br />
== Installazione ==<br />
Dopo aver avviato la propria macchina dal supporto contenente Debian, verrà avviato l'[[installer]] Debian che si occuperà di tutte le fasi di installazione.<br/><br />
L'installazione (grafica o testuale) non richiede particolari raccomandazioni se non rispondere alle domande che verranno poste di volta in volta (nazione, lingua, tastiera, configurazione della rete - potrebbe essere necessario installare [[firmware]] aggiuntivo) e attendere che compaia questa schermata dove possiamo scegliere dove installare Debian; ci accorgiamo subito che l'installer ci propone, come prima opzione, di utilizzare lo spazio libero precedentemente creato:<br />
[[File:Partman-auto automatically partition.png|centro|miniatura|500x500px]]<br />
Nella schermata successiva viene chiesto se debbano essere create altre partizioni diverse da quella di [[root]] "/".<br/><br />
La scelta è a discrezione dell'utente; se si sta installando Debian per la prima volta, è consigliato scegliere "Tutti i file in una partizione".<br />
[[File:Partman-auto choose recipe.png|centro|miniatura|500x500px]]<br />
Infine confermare i cambiamenti:<br />
[[File:Partman choose partition.png|centro|miniatura|500x500px]]<br />
Dopo questo passaggio, l'installazione prosegue normalmente chiedendo i pacchetti da installare, scaricando aggiornamenti di sicurezza (se presenti) e terminando con la schermata in cui viene chiesto di riavviare la macchina.<br />
== Scelta del SO all'avvio ==<br />
Al boot della macchina, comparirà la schermata di [[GRUB]] in cui verranno elencati i sistemi operativi che è possibile avviare (nel nostro caso Debian e Windows 10).<br />
[[File:Grub-w10-deb.png|centro|miniatura|500x500px]]<br />
{{Suggerimento|Nel caso si volesse avviare Windows 10 come sistema predefinito di avvio è sufficiente da Debian dare il seguente comando<br />
<pre># mv /etc/grub.d/30_os-prober /etc/grub.d/08_os-prober<br />
# update-grub2</pre>}}<br />
<br />
== Ripristino ==<br />
Il ripristino dello stato antecedente l'installazione di Debian è possibile tramite:<br />
# Rimozione di GRUB<br />
# Rimozione o modifica delle voce relativa a Debian da UEFI<br />
# Rimozione delle partizioni<br />
Non tutte le fasi sono strettamente necessarie. Se si vuole "nascondere" Debian dal boot, basta seguire solo il secondo passaggio.<br />
<br />
=== Rimozione boot loader ===<br />
GRUB può essere rimosso tramite la cancellazione della directory relativa a Debian che si trova nella partizione EFI. È possibile rimuovere completamente Debian dal dispositivo e ripristinare Windows 10 sia da Debian che da Windows.<br/><br />
Dopo aver completato questa operazione e riavviato la macchina, il sistema utilizzerà il boot manager di Windows che, a sua volta e a meno di altre configurazioni, avvierà automaticamente Windows 10.<br />
<br />
==== Debian ====<br />
Dopo il login in Debian, accertarsi che la partizione <code>/dev/sda1</code> sia montata:<br />
<pre><br />
# mount /dev/sda1<br />
mount: /boot/efi: /dev/sda1 already mounted on /boot/efi<br />
</pre><br />
il precedente output visualizza il [[mountpoint]], in questo caso <code>/boot/efi</code> .<br/><br />
Controllare che esista la directory <code>/boot/efi/EFI/debian</code>;<br />
<pre><br />
# ls /boot/efi/EFI<br />
boot debian Microsoft<br />
</pre><br />
e infine cancellarla:<br />
<pre><br />
# cd /boot/efi/EFI<br />
# rm -rf debian<br />
</pre><br />
<br />
==== Windows ====<br />
È necessario avviare come amministratore Windows PowerShell e dare i seguenti comandi<br />
<pre><br />
mountvol S: /S<br />
S:<br />
cd .\EFI\<br />
dir<br />
rd /S debian<br />
</pre><br />
<br />
=== Rimozione o modifica voci da UEFI ===<br />
Questo passo non è fondamentale e serve soltanto per non lasciare voci relative a Debian nell'UEFI (noto in precedenza come [[BIOS]]) della macchina.<br/><br />
La procedura varia da macchina a macchina e consiste nell'avviare UEFI al boot tramite i tasti specificati nel manuale del produttore e rimuovere la voce dalla sequenza di boot.<br/><br />
Notare che, anche se si lascia la voce relativa a Debian nella sequenza di boot, questa non verrà comunque considerata in quanto fa riferimento ad un boot loader (GRUB) cancellato in precedenza.<br />
<br />
Se si desidera semplicemente utilizzare il boot manager di Windows senza rimuovere Debian, è sufficiente modificare la sequenza di boot facendo in modo che il boot manager di Windows sia al primo posto; in quest'ultimo caso, ovviamente, non va rimosso GRUB né cancellate le partizioni relative a Debian.<br />
<br />
=== Rimozione partizioni ===<br />
Utilizzare la combinazione di tasti "Win+r" e digitare: <br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
A questo punto rimuovere le partizioni create dall'installer Debian (sono due, una del sistema e una per la swap). In seguito si può estendere la dimensione della partizione C:\ per riavere lo spazio su Windows.<br />
<br />
<gallery><br />
File:Restore win10 part1.png|Partizioni Debian che si vuole rimuovere<br />
File:Restore win10 part2.png|Rimuovere la prima partizione<br />
File:Restore win10 part3.png|Verrà liberato lo spazio corrispondente<br />
File:Restore win10 part4.png|Rimuovere la seconda partizione<br />
File:Restore win10 part5.png|In nero lo spazio liberato dopo aver rimosso entrambe le partizioni<br />
File:Restore win10 part6.png|Estendere il volume C:<br />
File:Restore win10 part7.png|Scegliere lo spazio massimo da utilizzare<br />
</gallery><br />
<br />
== Domande frequenti ==<br />
<br />
=== Sto usando GPT o MBR? ===<br />
Per conoscere lo schema di partizioni utilizzato, premere la combinazione di tasti "Win+r" ed eseguire:<br />
<pre><br />
diskpart<br />
</pre><br />
Dal prompt che compare:<br />
<pre><br />
list disk<br />
</pre><br />
Se si sta utilizzando GPT, comparirà nell'ultima colonna un asterisco:<br />
<pre><br />
N.Disco Stato Dimensioni Disponibile Din GPT<br />
------- -------- -------------- -------------- ----- ---<br />
Disco 0 Online 931 Gbytes 1024 Kbytes *<br />
</pre><br />
Altrimenti, in caso di MBR, l'ultima colonna sarà vuota:<br />
<pre><br />
N.Disco Stato Dimensioni Disponibile Din GPT<br />
------- -------- -------------- -------------- ----- ---<br />
Disco 0 Online 455 Gbytes 0 byte<br />
</pre><br />
I valori indicati in questo esempio variano chiaramente in base alla propria macchina.<br />
<br />
{{Autori<br />
|Autore= [[Utente:S3v|S3v]]<br />
}}<br />
[[Categoria: Installazione]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Dual_boot_con_Debian_e_Windows_10&diff=44348Dual boot con Debian e Windows 102021-04-02T18:13:43Z<p>S3v: </p>
<hr />
<div>{{Stub}}<br />
{{Versioni_compatibili | Buster | Bullseye}}<br />
In questa guida verranno indicati i diversi passi per installare Debian partendo da un'installazione già esistente e funzionante di Windows 10.<br/><br />
Al termine si otterrà un sistema con entrambi i sistemi operativi installati e con la possibilità di scegliere, al momento della fase di boot della macchina. quale dei due avviare.<br />
<br />
__toc__<br />
== Caveat ==<br />
Questa guida è stata testata per un dual boot Debian-Windows 10 basato su uno schema di partizioni [[GPT]]. Se la propria macchina utilizza uno schema [[MBR]], estendere liberamente questa guida con tutte le informazioni che si ritengono necessarie.<br />
== Prima di iniziare ==<br />
Operazioni preliminari all'applicazione di questa guida:<br />
;Aggiornare Windows 10: è importante che Windows 10 sia aggiornato in modo da correggere eventuali problemi che possano influire nella procedura indicata all'interno di questa guida.<br/>Notare che alcuni aggiornamenti potrebbero non essere rilevati fino a quando altri aggiornamenti non siano stati precedentemente installati. Ricercare tutti gli aggiornamenti non facoltativi fino a quando si è sicuri di averli installati tutti.<br />
; Eseguire un backup: è fondamentale che sia stata approntata una copia di tutti i file ritenuti importanti. Le operazioni descritte, benché non complesse, riguardano procedure che coinvolgono i dischi di sistema e i [[File System]] (e, quindi, i file) che vi si trovano. È assolutamente vitale avere una copia dei file che non si vuole perdere nel caso qualcosa andasse storto. Siete avvertiti ;)<br />
;Boot da USB o CD(DVD)-ROM: assicurarsi che la propria macchina consenta l'avvio tramite USB o CD-ROM (o DVD-ROM).<br />
== Creare spazio per Debian ==<br />
Ovviamente Debian richiede spazio libero per essere installata questo può essere creato in molti modi ma il più semplice consiste nell'utilizzare "Disk Management", uno strumento di gestione delle partizioni incorporato in Windows 10.<br />
<br />
Utilizzare la combinazione di tasti "Win+r" e digitare:<br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
Si aprirà una finestra simile alla seguente in cui vengono elencate tutte le partizioni presenti sul disco (o sui dischi) di sistema.<br />
[[File:Shrink part win10 1.png|centro|miniatura|700x700px]]<br />
Individuare la partizione contenente il filesystem NTFS (tipicamente contrassegnata con l'etichetta "C:"), fare clic su di essa con il tasto destro del mouse e scegliere "Riduci..." dal menù a comparsa che verrà visualizzato.<br />
Verrà aperta un'altra finestra attraverso la quale ci verrà chiesto lo spazio da liberare sulla partizione scelta.<br/><br />
In questo caso è stato scelto il valore 200000 MB che corrisponde a circa 195 GB. Scegliere il valore che si ritiene più adatto alle proprie esigenze considerando che non è possibile andare oltre la soglia massima indicata.<br />
[[File:Shrink part win10 2.png|centro|miniatura|700x700px]]<br />
Al termine dell'operazione verrà creato uno spazio non partizionato sul disco.<br/><br />
[[File:Shrink part win10 3.png|centro|miniatura|700x700px]]<br />
{{Warningbox | Prima di installare Debian, è consigliato riavviare la macchina e utilizzare il sistema normalmente per tutto il tempo che si ritiene necessario a controllare non siano stati introdotti problemi che abbiano intaccato le funzionalità di Windows.}}<br />
== Ottenere Debian ==<br />
Debian può essere ottenuta utilizzando le immagini .iso presenti sul sito ufficiale.<br/><br />
Consultare [[Installare Debian|questa guida]] per maggiori informazioni su come ottenere Debian, quale immagine scaricare e come creare un supporto da cui avviare l'installazione.<br />
== Installazione ==<br />
Dopo aver avviato la propria macchina dal supporto contenente Debian, verrà avviato l'[[installer]] Debian che si occuperà di tutte le fasi di installazione.<br/><br />
L'installazione (grafica o testuale) non richiede particolari raccomandazioni se non rispondere alle domande che verranno poste di volta in volta (nazione, lingua, tastiera, configurazione della rete - potrebbe essere necessario installare [[firmware]] aggiuntivo) e attendere che compaia questa schermata dove possiamo scegliere dove installare Debian; ci accorgiamo subito che l'installer ci propone, come prima opzione, di utilizzare lo spazio libero precedentemente creato:<br />
[[File:Partman-auto automatically partition.png|centro|miniatura|500x500px]]<br />
Nella schermata successiva viene chiesto se debbano essere create altre partizioni diverse da quella di [[root]] "/".<br/><br />
La scelta è a discrezione dell'utente; se si sta installando Debian per la prima volta, è consigliato scegliere "Tutti i file in una partizione".<br />
[[File:Partman-auto choose recipe.png|centro|miniatura|500x500px]]<br />
Infine confermare i cambiamenti:<br />
[[File:Partman choose partition.png|centro|miniatura|500x500px]]<br />
Dopo questo passaggio, l'installazione prosegue normalmente chiedendo i pacchetti da installare, scaricando aggiornamenti di sicurezza (se presenti) e terminando con la schermata in cui viene chiesto di riavviare la macchina.<br />
== Scelta del SO all'avvio ==<br />
Al boot della macchina, comparirà la schermata di [[GRUB]] in cui verranno elencati i sistemi operativi che è possibile avviare (nel nostro caso Debian e Windows 10).<br />
[[File:Grub-w10-deb.png|centro|miniatura|500x500px]]<br />
{{Suggerimento|Nel caso si volesse avviare Windows 10 come sistema predefinito di avvio è sufficiente da Debian dare il seguente comando<br />
<pre># mv /etc/grub.d/30_os-prober /etc/grub.d/08_os-prober<br />
# update-grub2</pre>}}<br />
<br />
== Ripristino ==<br />
Il ripristino dello stato antecedente l'installazione di Debian è possibile tramite:<br />
# Rimozione di GRUB<br />
# Rimozione o modifica delle voce relativa a Debian da UEFI<br />
# Rimozione delle partizioni<br />
Non tutte le fasi sono strettamente necessarie. Se si vuole "nascondere" Debian dal boot, basta seguire solo il secondo passaggio.<br />
<br />
=== Rimozione boot loader ===<br />
GRUB può essere rimosso tramite la cancellazione della directory relativa a Debian che si trova nella partizione EFI. È possibile rimuovere completamente Debian dal dispositivo e ripristinare Windows 10 sia da Debian che da Windows.<br/><br />
Dopo aver completato questa operazione e riavviato la macchina, il sistema utilizzerà il boot manager di Windows che, a sua volta e a meno di altre configurazioni, avvierà automaticamente Windows 10.<br />
<br />
==== Debian ====<br />
Dopo il login in Debian, accertarsi che la partizione <code>/dev/sda1</code> sia montata:<br />
<pre><br />
# mount /dev/sda1<br />
mount: /boot/efi: /dev/sda1 already mounted on /boot/efi<br />
</pre><br />
il precedente output visualizza il [[mountpoint]], in questo caso <code>/boot/efi</code> .<br/><br />
Controllare che esista la directory <code>/boot/efi/EFI/debian</code>;<br />
<pre><br />
# ls /boot/efi/EFI<br />
boot debian Microsoft<br />
</pre><br />
e infine cancellarla:<br />
<pre><br />
# cd /boot/efi/EFI<br />
# rm -rf debian<br />
</pre><br />
<br />
==== Windows ====<br />
È necessario avviare come amministratore Windows PowerShell e dare i seguenti comandi<br />
<pre><br />
mountvol S: /S<br />
S:<br />
cd .\EFI\<br />
dir<br />
rd /S debian<br />
</pre><br />
<br />
=== Rimozione o modifica voci da UEFI ===<br />
Questo passo non è fondamentale e serve soltanto per non lasciare voci relative a Debian nell'UEFI (noto in precedenza come [[BIOS]]) della macchina.<br/><br />
La procedura varia da macchina a macchina e consiste nell'avviare UEFI al boot tramite i tasti specificati nel manuale del produttore e rimuovere la voce dalla sequenza di boot.<br/><br />
Notare che, anche se si lascia la voce relativa a Debian nella sequenza di boot, questa non verrà comunque considerata in quanto fa riferimento ad un boot loader (GRUB) cancellato in precedenza.<br />
<br />
Se si desidera semplicemente utilizzare il boot manager di Windows senza rimuovere Debian, è sufficiente modificare la sequenza di boot facendo in modo che il boot manager di Windows sia al primo posto; in quest'ultimo caso, ovviamente, non va rimosso GRUB né cancellate le partizioni relative a Debian.<br />
<br />
=== Rimozione partizioni ===<br />
Utilizzare la combinazione di tasti "Win+r" e digitare: <br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
A questo punto rimuovere le partizioni create dall'installer Debian (sono due, una del sistema e una per la swap). In seguito si può estendere la dimensione della partizione C:\ per riavere lo spazio su Windows.<br />
<br />
<gallery><br />
File:Restore win10 part1.png|Partizioni Debian che si vuole rimuovere<br />
File:Restore win10 part2.png|Rimuovere la prima partizione<br />
File:Restore win10 part3.png|Verrà liberato lo spazio corrispondente<br />
File:Restore win10 part4.png|Rimuovere la seconda partizione<br />
File:Restore win10 part5.png|In nero lo spazio liberato dopo aver rimosso entrambe le partizioni<br />
File:Restore win10 part6.png|Estendere il volume C:<br />
File:Restore win10 part7.png|Scegliere lo spazio massimo da utilizzare<br />
</gallery><br />
<br />
{{Autori<br />
|Autore= [[Utente:S3v|S3v]]<br />
}}<br />
[[Categoria: Installazione]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Dual_boot_con_Debian_e_Windows_10&diff=44347Dual boot con Debian e Windows 102021-04-02T18:11:01Z<p>S3v: aggiunte immagini per estendere partizione Win</p>
<hr />
<div>{{Stub}}<br />
{{Versioni_compatibili | Buster | Bullseye}}<br />
In questa guida verranno indicati i diversi passi per installare Debian partendo da un'installazione già esistente e funzionante di Windows 10.<br/><br />
Al termine si otterrà un sistema con entrambi i sistemi operativi installati e con la possibilità di scegliere, al momento della fase di boot della macchina. quale dei due avviare.<br />
<br />
__toc__<br />
== Caveat ==<br />
Questa guida è stata testata per un dual boot Debian-Windows 10 basato su uno schema di partizioni [[GPT]]. Se la propria macchina utilizza uno schema [[MBR]], estendere liberamente questa guida con tutte le informazioni che si ritengono necessarie.<br />
== Prima di iniziare ==<br />
Operazioni preliminari all'applicazione di questa guida:<br />
;Aggiornare Windows 10: è importante che Windows 10 sia aggiornato in modo da correggere eventuali problemi che possano influire nella procedura indicata all'interno di questa guida.<br/>Notare che alcuni aggiornamenti potrebbero non essere rilevati fino a quando altri aggiornamenti non siano stati precedentemente installati. Ricercare tutti gli aggiornamenti non facoltativi fino a quando si è sicuri di averli installati tutti.<br />
; Eseguire un backup: è fondamentale che sia stata approntata una copia di tutti i file ritenuti importanti. Le operazioni descritte, benché non complesse, riguardano procedure che coinvolgono i dischi di sistema e i [[File System]] (e, quindi, i file) che vi si trovano. È assolutamente vitale avere una copia dei file che non si vuole perdere nel caso qualcosa andasse storto. Siete avvertiti ;)<br />
;Boot da USB o CD(DVD)-ROM: assicurarsi che la propria macchina consenta l'avvio tramite USB o CD-ROM (o DVD-ROM).<br />
== Creare spazio per Debian ==<br />
Ovviamente Debian richiede spazio libero per essere installata questo può essere creato in molti modi ma il più semplice consiste nell'utilizzare "Disk Management", uno strumento di gestione delle partizioni incorporato in Windows 10.<br />
<br />
Utilizzare la combinazione di tasti "Win+r" e digitare:<br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
Si aprirà una finestra simile alla seguente in cui vengono elencate tutte le partizioni presenti sul disco (o sui dischi) di sistema.<br />
[[File:Shrink part win10 1.png|centro|miniatura|700x700px]]<br />
Individuare la partizione contenente il filesystem NTFS (tipicamente contrassegnata con l'etichetta "C:"), fare clic su di essa con il tasto destro del mouse e scegliere "Riduci..." dal menù a comparsa che verrà visualizzato.<br />
Verrà aperta un'altra finestra attraverso la quale ci verrà chiesto lo spazio da liberare sulla partizione scelta.<br/><br />
In questo caso è stato scelto il valore 200000 MB che corrisponde a circa 195 GB. Scegliere il valore che si ritiene più adatto alle proprie esigenze considerando che non è possibile andare oltre la soglia massima indicata.<br />
[[File:Shrink part win10 2.png|centro|miniatura|700x700px]]<br />
Al termine dell'operazione verrà creato uno spazio non partizionato sul disco.<br/><br />
[[File:Shrink part win10 3.png|centro|miniatura|700x700px]]<br />
{{Warningbox | Prima di installare Debian, è consigliato riavviare la macchina e utilizzare il sistema normalmente per tutto il tempo che si ritiene necessario a controllare non siano stati introdotti problemi che abbiano intaccato le funzionalità di Windows.}}<br />
== Ottenere Debian ==<br />
Debian può essere ottenuta utilizzando le immagini .iso presenti sul sito ufficiale.<br/><br />
Consultare [[Installare Debian|questa guida]] per maggiori informazioni su come ottenere Debian, quale immagine scaricare e come creare un supporto da cui avviare l'installazione.<br />
== Installazione ==<br />
Dopo aver avviato la propria macchina dal supporto contenente Debian, verrà avviato l'[[installer]] Debian che si occuperà di tutte le fasi di installazione.<br/><br />
L'installazione (grafica o testuale) non richiede particolari raccomandazioni se non rispondere alle domande che verranno poste di volta in volta (nazione, lingua, tastiera, configurazione della rete - potrebbe essere necessario installare [[firmware]] aggiuntivo) e attendere che compaia questa schermata dove possiamo scegliere dove installare Debian; ci accorgiamo subito che l'installer ci propone, come prima opzione, di utilizzare lo spazio libero precedentemente creato:<br />
[[File:Partman-auto automatically partition.png|centro|miniatura|500x500px]]<br />
Nella schermata successiva viene chiesto se debbano essere create altre partizioni diverse da quella di [[root]] "/".<br/><br />
La scelta è a discrezione dell'utente; se si sta installando Debian per la prima volta, è consigliato scegliere "Tutti i file in una partizione".<br />
[[File:Partman-auto choose recipe.png|centro|miniatura|500x500px]]<br />
Infine confermare i cambiamenti:<br />
[[File:Partman choose partition.png|centro|miniatura|500x500px]]<br />
Dopo questo passaggio, l'installazione prosegue normalmente chiedendo i pacchetti da installare, scaricando aggiornamenti di sicurezza (se presenti) e terminando con la schermata in cui viene chiesto di riavviare la macchina.<br />
== Scelta del SO all'avvio ==<br />
Al boot della macchina, comparirà la schermata di [[GRUB]] in cui verranno elencati i sistemi operativi che è possibile avviare (nel nostro caso Debian e Windows 10).<br />
[[File:Grub-w10-deb.png|centro|miniatura|500x500px]]<br />
{{Suggerimento|Nel caso si volesse avviare Windows 10 come sistema predefinito di avvio è sufficiente da Debian dare il seguente comando<br />
<pre># mv /etc/grub.d/30_os-prober /etc/grub.d/08_os-prober<br />
# update-grub2</pre>}}<br />
== Ripristino ==<br />
Il ripristino dello stato antecedente l'installazione di Debian è possibile tramite:<br />
# Rimozione di GRUB<br />
# Rimozione o modifica delle voce relativa a Debian da UEFI<br />
# Rimozione delle partizioni<br />
Non tutte le fasi sono strettamente necessarie. Se si vuole "nascondere" Debian dal boot, basta seguire solo il secondo passaggio.<br />
=== Rimozione boot loader ===<br />
GRUB può essere rimosso tramite la cancellazione della directory relativa a Debian che si trova nella partizione EFI. È possibile rimuovere completamente Debian dal dispositivo e ripristinare Windows 10 sia da Debian che da Windows.<br/><br />
Dopo aver completato questa operazione e riavviato la macchina, il sistema utilizzerà il boot manager di Windows che, a sua volta e a meno di altre configurazioni, avvierà automaticamente Windows 10.<br />
==== Debian ====<br />
Dopo il login in Debian, accertarsi che la partizione <code>/dev/sda1</code> sia montata:<br />
<pre><br />
# mount /dev/sda1<br />
mount: /boot/efi: /dev/sda1 already mounted on /boot/efi<br />
</pre><br />
il precedente output visualizza il [[mountpoint]], in questo caso <code>/boot/efi</code> .<br/><br />
Controllare che esista la directory <code>/boot/efi/EFI/debian</code>;<br />
<pre><br />
# ls /boot/efi/EFI<br />
boot debian Microsoft<br />
</pre><br />
e infine cancellarla:<br />
<pre><br />
# cd /boot/efi/EFI<br />
# rm -rf debian<br />
</pre><br />
==== Windows ====<br />
È necessario avviare come amministratore Windows PowerShell e dare i seguenti comandi<br />
<pre><br />
mountvol S: /S<br />
S:<br />
cd .\EFI\<br />
dir<br />
rd /S debian<br />
</pre><br />
=== Rimozione o modifica voci da UEFI ===<br />
Questo passo non è fondamentale e serve soltanto per non lasciare voci relative a Debian nell'UEFI (noto in precedenza come [[BIOS]]) della macchina.<br/><br />
La procedura varia da macchina a macchina e consiste nell'avviare UEFI al boot tramite i tasti specificati nel manuale del produttore e rimuovere la voce dalla sequenza di boot.<br/><br />
Notare che, anche se si lascia la voce relativa a Debian nella sequenza di boot, questa non verrà comunque considerata in quanto fa riferimento ad boot loader (GRUB) cancellato in precedenza.<br />
<br />
Se si desidera semplicemente utilizzare il boot manager di Windows senza rimuovere Debian, è sufficiente modificare la sequenza di boot facendo in modo che il boot manager di Windows sia al primo posto; in quest'ultimo caso, ovviamente, non va rimosso GRUB né cancellate le partizioni relative a Debian.<br />
=== Rimozione partizioni ===<br />
Utilizzare la combinazione di tasti "Win+r" e digitare: <br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
A questo punto rimuovere le partizioni create dall'installer Debian (sono due, una del sistema e una per la swap). In seguito si può estendere la dimensione della partizione C:\ per riavere lo spazio su Windows.<br />
<br />
<gallery><br />
File:Restore win10 part1.png|Partizioni Debian che si vuole rimuovere<br />
File:Restore win10 part2.png|Rimuovere la prima partizione<br />
File:Restore win10 part3.png|Verrà liberato lo spazio corrispondente<br />
File:Restore win10 part4.png|Rimuovere la seconda partizione<br />
File:Restore win10 part5.png|In nero lo spazio liberato dopo aver rimosso entrambe le partizioni<br />
File:Restore win10 part6.png|Estendere il volume C:<br />
File:Restore win10 part7.png|Scegliere lo spazio massimo da utilizzare<br />
</gallery><br />
<br />
{{Autori<br />
|Autore= [[Utente:S3v|S3v]]<br />
}}<br />
[[Categoria: Installazione]]</div>S3vhttps://guide.debianizzati.org/index.php?title=File:Restore_win10_part7.png&diff=44346File:Restore win10 part7.png2021-04-02T18:00:37Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=File:Restore_win10_part6.png&diff=44345File:Restore win10 part6.png2021-04-02T18:00:21Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=File:Restore_win10_part5.png&diff=44344File:Restore win10 part5.png2021-04-02T18:00:08Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=File:Restore_win10_part4.png&diff=44343File:Restore win10 part4.png2021-04-02T17:59:53Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=File:Restore_win10_part3.png&diff=44342File:Restore win10 part3.png2021-04-02T17:59:41Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=File:Restore_win10_part2.png&diff=44341File:Restore win10 part2.png2021-04-02T17:59:25Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=File:Restore_win10_part1.png&diff=44340File:Restore win10 part1.png2021-04-02T17:59:06Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=Dual_boot_con_Debian_e_Windows_10&diff=44339Dual boot con Debian e Windows 102021-04-02T16:49:10Z<p>S3v: /* Ripristino */</p>
<hr />
<div>{{Stub}}<br />
{{Versioni_compatibili | Buster | Bullseye}}<br />
In questa guida verranno indicati i diversi passi per installare Debian partendo da un'installazione già esistente e funzionante di Windows 10.<br/><br />
Al termine si otterrà un sistema con entrambi i sistemi operativi installati e con la possibilità di scegliere, al momento della fase di boot della macchina. quale dei due avviare.<br />
<br />
__toc__<br />
== Caveat ==<br />
Questa guida è stata testata per un dual boot Debian-Windows 10 basato su uno schema di partizioni [[GPT]]. Se la propria macchina utilizza uno schema [[MBR]], estendere liberamente questa guida con tutte le informazioni che si ritengono necessarie.<br />
== Prima di iniziare ==<br />
Operazioni preliminari all'applicazione di questa guida:<br />
;Aggiornare Windows 10: è importante che Windows 10 sia aggiornato in modo da correggere eventuali problemi che possano influire nella procedura indicata all'interno di questa guida.<br/>Notare che alcuni aggiornamenti potrebbero non essere rilevati fino a quando altri aggiornamenti non siano stati precedentemente installati. Ricercare tutti gli aggiornamenti non facoltativi fino a quando si è sicuri di averli installati tutti.<br />
; Eseguire un backup: è fondamentale che sia stata approntata una copia di tutti i file ritenuti importanti. Le operazioni descritte, benché non complesse, riguardano procedure che coinvolgono i dischi di sistema e i [[File System]] (e, quindi, i file) che vi si trovano. È assolutamente vitale avere una copia dei file che non si vuole perdere nel caso qualcosa andasse storto. Siete avvertiti ;)<br />
;Boot da USB o CD(DVD)-ROM: assicurarsi che la propria macchina consenta l'avvio tramite USB o CD-ROM (o DVD-ROM).<br />
== Creare spazio per Debian ==<br />
Ovviamente Debian richiede spazio libero per essere installata questo può essere creato in molti modi ma il più semplice consiste nell'utilizzare "Disk Management", uno strumento di gestione delle partizioni incorporato in Windows 10.<br />
<br />
Utilizzare la combinazione di tasti "Win+r" e digitare:<br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
Si aprirà una finestra simile alla seguente in cui vengono elencate tutte le partizioni presenti sul disco (o sui dischi) di sistema.<br />
[[File:Shrink part win10 1.png|centro|miniatura|700x700px]]<br />
Individuare la partizione contenente il filesystem NTFS (tipicamente contrassegnata con l'etichetta "C:"), fare clic su di essa con il tasto destro del mouse e scegliere "Riduci..." dal menù a comparsa che verrà visualizzato.<br />
Verrà aperta un'altra finestra attraverso la quale ci verrà chiesto lo spazio da liberare sulla partizione scelta.<br/><br />
In questo caso è stato scelto il valore 200000 MB che corrisponde a circa 195 GB. Scegliere il valore che si ritiene più adatto alle proprie esigenze considerando che non è possibile andare oltre la soglia massima indicata.<br />
[[File:Shrink part win10 2.png|centro|miniatura|700x700px]]<br />
Al termine dell'operazione verrà creato uno spazio non partizionato sul disco.<br/><br />
[[File:Shrink part win10 3.png|centro|miniatura|700x700px]]<br />
{{Warningbox | Prima di installare Debian, è consigliato riavviare la macchina e utilizzare il sistema normalmente per tutto il tempo che si ritiene necessario a controllare non siano stati introdotti problemi che abbiano intaccato le funzionalità di Windows.}}<br />
== Ottenere Debian ==<br />
Debian può essere ottenuta utilizzando le immagini .iso presenti sul sito ufficiale.<br/><br />
Consultare [[Installare Debian|questa guida]] per maggiori informazioni su come ottenere Debian, quale immagine scaricare e come creare un supporto da cui avviare l'installazione.<br />
== Installazione ==<br />
Dopo aver avviato la propria macchina dal supporto contenente Debian, verrà avviato l'[[installer]] Debian che si occuperà di tutte le fasi di installazione.<br/><br />
L'installazione (grafica o testuale) non richiede particolari raccomandazioni se non rispondere alle domande che verranno poste di volta in volta (nazione, lingua, tastiera, configurazione della rete - potrebbe essere necessario installare [[firmware]] aggiuntivo) e attendere che compaia questa schermata dove possiamo scegliere dove installare Debian; ci accorgiamo subito che l'installer ci propone, come prima opzione, di utilizzare lo spazio libero precedentemente creato:<br />
[[File:Partman-auto automatically partition.png|centro|miniatura|500x500px]]<br />
Nella schermata successiva viene chiesto se debbano essere create altre partizioni diverse da quella di [[root]] "/".<br/><br />
La scelta è a discrezione dell'utente; se si sta installando Debian per la prima volta, è consigliato scegliere "Tutti i file in una partizione".<br />
[[File:Partman-auto choose recipe.png|centro|miniatura|500x500px]]<br />
Infine confermare i cambiamenti:<br />
[[File:Partman choose partition.png|centro|miniatura|500x500px]]<br />
Dopo questo passaggio, l'installazione prosegue normalmente chiedendo i pacchetti da installare, scaricando aggiornamenti di sicurezza (se presenti) e terminando con la schermata in cui viene chiesto di riavviare la macchina.<br />
== Scelta del SO all'avvio ==<br />
Al boot della macchina, comparirà la schermata di [[GRUB]] in cui verranno elencati i sistemi operativi che è possibile avviare (nel nostro caso Debian e Windows 10).<br />
[[File:Grub-w10-deb.png|centro|miniatura|500x500px]]<br />
{{Suggerimento|Nel caso si volesse avviare Windows 10 come sistema predefinito di avvio è sufficiente da Debian dare il seguente comando<br />
<pre># mv /etc/grub.d/30_os-prober /etc/grub.d/08_os-prober<br />
# update-grub2</pre>}}<br />
== Ripristino ==<br />
Il ripristino dello stato antecedente l'installazione di Debian è possibile tramite:<br />
# Rimozione di GRUB<br />
# Rimozione o modifica delle voce relativa a Debian da UEFI<br />
# Rimozione delle partizioni<br />
Non tutte le fasi sono strettamente necessarie. Se si vuole "nascondere" Debian dal boot, basta seguire solo il secondo passaggio.<br />
<br />
=== Rimozione boot loader ===<br />
GRUB può essere rimosso tramite la cancellazione della directory relativa a Debian che si trova nella partizione EFI. È possibile rimuovere completamente Debian dal dispositivo e ripristinare Windows 10 sia da Debian che da Windows.<br/><br />
Dopo aver completato questa operazione e riavviato la macchina, il sistema utilizzerà il boot manager di Windows che, a sua volta e a meno di altre configurazioni, avvierà automaticamente Windows 10.<br />
==== Debian ====<br />
Dopo il login in Debian, accertarsi che la partizione <code>/dev/sda1</code> sia montata:<br />
<pre><br />
# mount /dev/sda1<br />
mount: /boot/efi: /dev/sda1 already mounted on /boot/efi<br />
</pre><br />
il precedente output visualizza il [[mountpoint]], in questo caso <code>/boot/efi</code> .<br/><br />
Controllare che esista la directory <code>/boot/efi/EFI/debian</code>;<br />
<pre><br />
# ls /boot/efi/EFI<br />
boot debian Microsoft<br />
</pre><br />
e infine cancellarla:<br />
<pre><br />
# cd /boot/efi/EFI<br />
# rm -rf debian<br />
</pre><br />
==== Windows ====<br />
È necessario avviare come amministratore Windows PowerShell e dare i seguenti comandi<br />
<pre><br />
mountvol S: /S<br />
S:<br />
cd .\EFI\<br />
dir<br />
rd /S debian<br />
</pre><br />
=== Rimozione o modifica voci da UEFI ===<br />
Questo passo non è fondamentale e serve soltanto per non lasciare voci relative a Debian nell'UEFI (noto in precedenza come [[BIOS]]) della macchina.<br/><br />
La procedura varia da macchina a macchina e consiste nell'avviare UEFI al boot tramite i tasti specificati nel manuale del produttore e rimuovere la voce dalla sequenza di boot.<br/><br />
Notare che, anche se si lascia la voce relativa a Debian nella sequenza di boot, questa non verrà comunque considerata in quanto fa riferimento ad boot loader (GRUB) cancellato in precedenza.<br />
<br />
Se si desidera semplicemente utilizzare il boot manager di Windows senza rimuovere Debian, è sufficiente modificare la sequenza di boot facendo in modo che il boot manager di Windows sia al primo posto; in quest'ultimo caso, ovviamente, non va rimosso GRUB né cancellate le partizioni relative a Debian.<br />
=== Rimozione partizioni ===<br />
Utilizzare la combinazione di tasti "Win+r" e digitare: <br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
A questo punto rimuovere le partizioni create dall'installer debian (sono due, una del sistema e una per la swap). In seguito si può estendere la dimensione della partizione C:\ per riavere lo spazio su Windows.<br />
<br />
TODO image<br />
{{Autori<br />
|Autore= [[Utente:S3v|S3v]]<br />
}}<br />
[[Categoria: Installazione]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Dual_boot_con_Debian_e_Windows_10&diff=44338Dual boot con Debian e Windows 102021-04-02T16:34:53Z<p>S3v: </p>
<hr />
<div>{{Stub}}<br />
{{Versioni_compatibili | Buster | Bullseye}}<br />
In questa guida verranno indicati i diversi passi per installare Debian partendo da un'installazione già esistente e funzionante di Windows 10.<br/><br />
Al termine si otterrà un sistema con entrambi i sistemi operativi installati e con la possibilità di scegliere, al momento della fase di boot della macchina. quale dei due avviare.<br />
<br />
__toc__<br />
<br />
== Caveat ==<br />
Questa guida è stata testata per un dual boot Debian-Windows 10 basato su uno schema di partizioni [[GPT]]. Se la propria macchina utilizza uno schema [[MBR]], estendere liberamente questa guida con tutte le informazioni che si ritengono necessarie.<br />
<br />
== Prima di iniziare ==<br />
Operazioni preliminari all'applicazione di questa guida:<br />
;Aggiornare Windows 10: è importante che Windows 10 sia aggiornato in modo da correggere eventuali problemi che possano influire nella procedura indicata all'interno di questa guida.<br/>Notare che alcuni aggiornamenti potrebbero non essere rilevati fino a quando altri aggiornamenti non siano stati precedentemente installati. Ricercare tutti gli aggiornamenti non facoltativi fino a quando si è sicuri di averli installati tutti.<br />
; Eseguire un backup: è fondamentale che sia stata approntata una copia di tutti i file ritenuti importanti. Le operazioni descritte, benché non complesse, riguardano procedure che coinvolgono i dischi di sistema e i [[File System]] (e, quindi, i file) che vi si trovano. È assolutamente vitale avere una copia dei file che non si vuole perdere nel caso qualcosa andasse storto. Siete avvertiti ;)<br />
;Boot da USB o CD(DVD)-ROM: assicurarsi che la propria macchina consenta l'avvio tramite USB o CD-ROM (o DVD-ROM).<br />
<br />
== Creare spazio per Debian ==<br />
Ovviamente Debian richiede spazio libero per essere installata questo può essere creato in molti modi ma il più semplice consiste nell'utilizzare "Disk Management", uno strumento di gestione delle partizioni incorporato in Windows 10.<br />
<br />
Utilizzare la combinazione di tasti "Win+r" e digitare:<br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
Si aprirà una finestra simile alla seguente in cui vengono elencate tutte le partizioni presenti sul disco (o sui dischi) di sistema.<br />
[[File:Shrink part win10 1.png|centro|miniatura|700x700px]]<br />
Individuare la partizione contenente il filesystem NTFS (tipicamente contrassegnata con l'etichetta "C:"), fare clic su di essa con il tasto destro del mouse e scegliere "Riduci..." dal menù a comparsa che verrà visualizzato.<br />
Verrà aperta un'altra finestra attraverso la quale ci verrà chiesto lo spazio da liberare sulla partizione scelta.<br/><br />
In questo caso è stato scelto il valore 200000 MB che corrisponde a circa 195 GB. Scegliere il valore che si ritiene più adatto alle proprie esigenze considerando che non è possibile andare oltre la soglia massima indicata.<br />
[[File:Shrink part win10 2.png|centro|miniatura|700x700px]]<br />
Al termine dell'operazione verrà creato uno spazio non partizionato sul disco.<br/><br />
[[File:Shrink part win10 3.png|centro|miniatura|700x700px]]<br />
{{Warningbox | Prima di installare Debian, è consigliato riavviare la macchina e utilizzare il sistema normalmente per tutto il tempo che si ritiene necessario a controllare non siano stati introdotti problemi che abbiano intaccato le funzionalità di Windows.}}<br />
<br />
== Ottenere Debian ==<br />
Debian può essere ottenuta utilizzando le immagini .iso presenti sul sito ufficiale.<br/><br />
Consultare [[Installare Debian|questa guida]] per maggiori informazioni su come ottenere Debian, quale immagine scaricare e come creare un supporto da cui avviare l'installazione.<br />
<br />
== Installazione ==<br />
Dopo aver avviato la propria macchina dal supporto contenente Debian, verrà avviato l'[[installer]] Debian che si occuperà di tutte le fasi di installazione.<br/><br />
L'installazione (grafica o testuale) non richiede particolari raccomandazioni se non rispondere alle domande che verranno poste di volta in volta (nazione, lingua, tastiera, configurazione della rete - potrebbe essere necessario installare [[firmware]] aggiuntivo) e attendere che compaia questa schermata dove possiamo scegliere dove installare Debian; ci accorgiamo subito che l'installer ci propone, come prima opzione, di utilizzare lo spazio libero precedentemente creato:<br />
[[File:Partman-auto automatically partition.png|centro|miniatura|500x500px]]<br />
Nella schermata successiva viene chiesto se debbano essere create altre partizioni diverse da quella di [[root]] "/".<br/><br />
La scelta è a discrezione dell'utente; se si sta installando Debian per la prima volta, è consigliato scegliere "Tutti i file in una partizione".<br />
[[File:Partman-auto choose recipe.png|centro|miniatura|500x500px]]<br />
Infine confermare i cambiamenti:<br />
[[File:Partman choose partition.png|centro|miniatura|500x500px]]<br />
Dopo questo passaggio, l'installazione prosegue normalmente chiedendo i pacchetti da installare, scaricando aggiornamenti di sicurezza (se presenti) e terminando con la schermata in cui viene chiesto di riavviare la macchina.<br />
<br />
== Scelta del SO all'avvio ==<br />
Al boot della macchina, comparirà la schermata di [[GRUB]] in cui verranno elencati i sistemi operativi che è possibile avviare (nel nostro caso Debian e Windows 10).<br />
[[File:Grub-w10-deb.png|centro|miniatura|500x500px]]<br />
<br />
{{Suggerimento|Nel caso si volesse avviare Windows 10 come sistema predefinito di avvio è sufficiente da Debian dare il seguente comando<br />
<pre># mv /etc/grub.d/30_os-prober /etc/grub.d/08_os-prober<br />
# update-grub2</pre>}}<br />
<br />
== Ripristino ==<br />
È possibile rimuovere completamente [[Debian]] dal dispositivo e ripristinare Windows 10 sia da Debian che da Windows.<br/><br />
La rimozione completa consiste di tre fasi.<br />
# Rimozione di GRUB<br />
# Rimozione delle voce relativa a Debian da UEFI<br />
# Rimozione delle partizioni<br />
<br />
=== Rimozione boot loader ===<br />
GRUB può essere rimosso tramite la cancellazione della directory relativa a Debian che si trova nella partizione EFI.<br/><br />
Dopo aver completato questa operazione e riavviato la macchina, il sistema utilizzerà il boot manager di Windows che, a sua volta e a meno di altre configurazioni, avvierà automaticamente Windows 10.<br />
<br />
==== Debian ====<br />
Dopo il login in Debian, accertarsi che la partizione <code>/dev/sda1</code> sia montata:<br />
<pre><br />
# mount /dev/sda1<br />
mount: /boot/efi: /dev/sda1 already mounted on /boot/efi<br />
</pre><br />
il precedente output visualizza il [[mountpoint]], in questo caso <code>/boot/efi</code> .<br/><br />
Controllare che esista la directory <code>/boot/efi/EFI/debian</code>;<br />
<pre><br />
# ls /boot/efi/EFI<br />
boot debian Microsoft<br />
</pre><br />
e infine cancellarla:<br />
<pre><br />
# cd /boot/efi/EFI<br />
# rm -rf debian<br />
</pre><br />
<br />
==== Windows ====<br />
È necessario avviare come amministratore Windows PowerShell e dare i seguenti comandi<br />
<pre><br />
mountvol S: /S<br />
S:<br />
cd .\EFI\<br />
dir<br />
rd /S debian<br />
</pre><br />
<br />
=== Rimozione voci da UEFI ===<br />
Questo passo non è fondamentale e serve soltanto per non lasciare voci relative a Debian nell'UEFI (noto in precedenza come [[BIOS]]) della macchina.<br/><br />
La procedura varia da macchina a macchina e consiste nell'avviare UEFI al boot tramite i tasti specificati nel manuale del produttore e rimuovere la voce dalla sequenza di boot.<br/><br />
Notare che, anche se si lascia la voce relativa a Debian nella sequenza di boot, questa non verrà comunque considerata in quanto fa riferimento ad boot loader (GRUB) cancellato in precedenza.<br />
<br />
=== Rimozione partizioni ===<br />
Utilizzare la combinazione di tasti "Win+r" e digitare: <br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
A questo punto rimuovere le partizioni create dall'installer debian (sono due, una del sistema e una per la swap). In seguito si può estendere la dimensione della partizione C:\ per riavere lo spazio su Windows.<br />
<br />
TODO image<br />
<br />
{{Autori<br />
|Autore= [[Utente:S3v|S3v]]<br />
}}<br />
[[Categoria: Installazione]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Template:Autori&diff=44331Template:Autori2021-03-28T10:37:42Z<p>S3v: </p>
<hr />
<div><includeonly><br />
----<br/><br />
{|style="width: 500px; border-radius: 0.5em; background:#f8fbfd; border:1px solid #4e88d0; padding:5px;"<br />
| width="40%" valign="top" | '''Guida scritta da:''' {{<br />
#ifeq: {{{Autore|}}} | Debianizzati.org | {{<br />
#if: {{{Link|}}} | [{{{Link}}} Debianizzati.org] | Debianizzati.org<br />
}} | {{{Autore}}}<br />
}}<br />
|rowspan="3" width="5%" align="center" valign="top" | {{ #invoke: Autori_Lua | getimage }}<br />
|-<br />
| ''Estesa da:''<br />
{{{Estesa_da|}}}<br />
|-<br />
| ''Verificata da:''<br />
{{{Verificata_da|}}}<br />
|-<br />
| colspan="2" |<br />
<small>[[Template:Autori|Verificare ed estendere la guida]] | [[Debianized|Cos'è una guida Debianized]]</small><br />
|}<br />
</includeonly><br />
<noinclude><br />
== Anteprima ==<br />
{|style="width: 500px; border-radius: 0.5em; background:#f8fbfd; border:1px solid #4e88d0; padding:5px;"<br />
| width="40%" valign="top" | '''Guida scritta da: ''' Socrate<br />
|rowspan="3" width="5%" align="center" valign="top" | [[image:Swirl-auth60.png|60px|link=]] <small>Debianized 60%</small><br />
|-<br />
| ''Estesa da:''<br />
: Aristofane 21:21, 14 gen 2014 (CEST) (aggiunto un capitolo alla storia)<br />
|-<br />
| <br/>''Verificata da:''<br />
: Alcibiade 19:11, 9 ago 2013 (CEST) <br />
: Fedro 11:29, 6 lug 2014 (CEST) <br />
|-<br />
| colspan="2" |<br />
<small>[[Template:Autori|Verificare ed estendere la guida]] | [[Debianized|Cos'è una guida Debianized]]</small><br />
|}<br />
<br />
== Cos'è ==<br />
Questo template consente di firmare una guida e, al tempo stesso, tenere traccia di tutte le sue revisioni significative e verifiche. Tutti possono aggiungere il proprio nome utente al template in caso di revisione o estensione della guida. Così facendo si fa in modo che la maturità della guida le permetta di essere contrassegnata come '''[[Debianized]]''', ossia che raggiunga un alto grado di accuratezza e completezza per poter essere di maggior aiuto a tutte le persone che fanno parte della comunità Debian.<br />
<br />
== Utilizzo ==<br />
L'utilizzo è il seguente:<br />
<pre><br />
{{Autori<br />
|Autore = Firma dell'autore della guida<br />
|Estesa_da =<br />
: Firma di Utente1<br />
: Firma di Utente2<br />
: Firma di Utente3<br />
|Verificata_da=<br />
: Firma di Utente4<br />
: Firma di Utente5<br />
: Firma di Utente6<br />
}}<br />
</pre><br />
Da tener presente che:<br />
# Il template va inserito in fondo alla guida.<br />
# In caso di pagine riunite sotto lo stesso argomento tramite il [[Aiuto:I template#Template di sommario|template "Sommario"]], questo template va inserito solo sulla pagina principale.<br />
<br />
=== Autore ===<br />
Se la guida è stata appena creata e dunque non vi sono revisioni o verifiche, è sufficiente firmarla:<br />
<pre><br />
{{Autori<br />
|Autore = ~~~~<br />
}}<br />
</pre><br />
a tal proposito, vedere anche [[Aiuto:Creare e modificare una pagina#Firmare_una_guida|come firmare una guida]].<br />
<br />
Nel caso si trattasse di una guida il cui contenuto è stato il risultato dell'impegno di più membri della comunità, specificare l'autore come "'''Debianizzati.org'''". In tal caso sarà anche possibile specificare il link alla discussione che ha originato la guida. Ad esempio:<br />
<pre><br />
{{Autori<br />
|Autore = Debianizzati.org<br />
|Link = http://forum.debianizzati.org/viewtopic.php?...<br />
}}<br />
</pre><br />
È consigliato specificare separatamente per le verifiche i nominativi di coloro che hanno contribuito alla stesura della guida, in modo che il livello di debianizzazione rifletta il suo livello di affidabilità. Purtroppo, senza verifiche, una guida che avesse come autore la comunità di Debianizzati risulterebbe perfino meno testata di quella scritta da una singola persona.<br />
<br />
Si ricorda inoltre che ogni carattere '''<code>=</code>''', per esempio all'interno del link, dovrebbe essere sostituito con '''<code><nowiki>{{=}}</nowiki></code>''' in quanto '''<code>=</code>''' è un carattere speciale all'interno di un [[template]].<br />
<br />
=== Verifiche ===<br />
Se avete seguito la guida e ne avete accertato la validità, allora potete aggiungere il vostro nome utente al template semplicemente inserendo la firma attraverso il parametro '''Verificata_da'''.<br/><br />
Quindi le modifiche ad esempio a:<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
}}<br />
</pre><br />
saranno, per una verifica di ''nomeutente'':<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Verificata_da =<br />
:~~~~<br />
}}<br />
</pre><br />
oppure, se esistono già delle verifiche da parte di altri utenti, le modifiche saranno, ad esempio, da:<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Verificata_da =<br />
: pluto 10:22, 22 feb 2013 (CEST) <br />
}}<br />
</pre><br />
a:<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Verificata_da =<br />
: pluto 10:22, 22 feb 2013 (CEST) <br />
: ~~~~<br />
}}<br />
</pre><br />
# Ciascuno può verificare la guida in ogni momento e, nel caso di modifiche successive da parte di altri utenti, decidere se lasciare il proprio nome utente tra i revisori o rimuoverlo.<br />
# Anche in caso di più verifiche, ognuno può aggiungere il proprio nome alla lista dei revisori soltanto una volta.<br />
# È importante che ogni aggiunta di una firma alla lista dei revisori avvenga su una riga separata e preceduta dal carattere "due punti" ":"<br />
<br />
=== Estensione della guida ===<br />
Se estendete la guida in maniera significativa, ad esempio con l'aggiunta di paragrafi o intere sezioni, potete inserire il vostro nome utente attraverso il parametro '''Estesa_da''' in modo simile agli esempi precedenti.<br/><br />
Se la modifica interessasse la maggior parte della guida, tanto da risultare quasi in una sua riscrittura, tutte le precedenti verifiche sono da rimuovere. In caso di dubbi, utilizzare la pagina di discussione della guida. Per questo motivo, prima di modificare una guida '''Debianized''', si raccomanda la lettura di [[Debianized|questa pagina]].<br />
<br />
Ovviamente è anche possibile aggiungere il proprio nome utente sia alla lista dei revisori, come visto prima, sia alla lista degli estensori.<br />
<br />
* Per aggiungere il proprio nome utente nel caso esista solo l'indicazione dell'autore:<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
}}<br />
</pre><br />
diventa:<br />
<pre><br />
{{Autori <br />
|Autore = pippo<br />
|Estesa_da = <br />
: ~~~~<br />
}}<br />
</pre><br />
* Nel caso esistano revisioni e altre estensioni:<br />
<pre><br />
{{Autori <br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Estesa_da = <br />
: sempronio 20:01, 03 apr 2013 (CEST) <br />
|Verificata_da = <br />
: tizio 23:07, 21 lug 2014 (CEST) <br />
: caio 18:10, 21 feb 2015 (CEST) <br />
}}<br />
</pre><br />
diventerà:<br />
<pre><br />
{{Autori <br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Estesa_da = <br />
: sempronio 20:01, 03 apr 2013 (CEST) <br />
: ~~~~<br />
|Verificata_da = <br />
: tizio 23:07, 21 lug 2014 (CEST) <br />
: caio 18:10, 21 feb 2015 (CEST) <br />
}}<br />
</pre><br />
* Nel caso di estensione della guida e sua contemporanea verifica:<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Estesa_da =<br />
: sempronio 20:01, 03 apr 2013 (CEST) <br />
|Verificata_da =<br />
: tizio 23:07, 21 lug 2014 (CEST) <br />
: caio 18:10, 21 feb 2015 (CEST) <br />
}}<br />
</pre><br />
diventa:<br />
<pre><br />
{{Autori <br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Estesa_da = <br />
: sempronio 20:01, 03 apr 2013 (CEST) <br />
: ~~~~<br />
|Verificata_da = <br />
: tizio 23:07, 21 lug 2014 (CEST) <br />
: caio 18:10, 21 feb 2015 (CEST) <br />
: ~~~~<br />
}}<br />
</pre><br />
si ricorda sempre che le quattro [[tilde]] (<nowiki>~~~~</nowiki>) vengono convertite automaticamente nel nome utente dell'utente e nella data corrente.<br />
<br />
=== Numero di revisori ===<br />
Il numero dei revisori, e il conseguente incremento delle percentuale di "debianizzazione" della guida, viene automaticamente ricavato da [[Modulo:Autori_Lua | questo script Lua]] a partire dal numero di coloro che hanno aggiunto il proprio nickname tramite il parametro "Verificata_da".<br/><br />
Il parametro "Numero_revisori", utilizzato in precedenza a tale scopo, non viene più considerato e può essere tranquillamente rimosso se lo si trova all'interno del template sulle pagine del wiki.<br />
<br />
== Guide adottate ==<br />
Nel caso si sia [[Adozione Guide|adottata una guida]], al termine del suo completamento bisogna rimuovere le precedenti revisioni/estensioni dal template e aggiungervi solo il proprio nome utente oltre a un breve richiamo all'autore originario come piccola forma di riconoscenza per aver messo a disposizione parte del proprio tempo per affrontare l'argomento:<br />
<pre><br />
{{Autori<br />
|Autore = ~~~~<br/><br />
(guida originariamente scritta da pluto)<br />
}}<br />
</pre><br />
<br />
== Dove non inserire il template ==<br />
Su diverse guide il template non va inserito.<br />
*[[Pagina principale]]<br />
*[[Indice Guide]]<br />
*[[FAQ]]<br />
*[[Tabella Software]] e [[Lista Hardware]]<br />
*Pagine di help: [[Aiuto:Linee guida su come contribuire al Wiki]]<br />
*[[:Categoria:Libri | Recensioni di libri]]<br />
*[[:Categoria:Glossario | Pagine di glossario]]<br />
*[[:Categoria:Main | Categorie]] e [[Lista Categorie | pagina delle categorie]]<br />
*[[:Categoria:Template | Template]]<br />
* Pagine che appartengono esclusivamente a una o più delle seguenti categorie: [[:Categoria:Wiki | "Wiki"]], [[:Categoria:Debianizzati | "Debianizzati"]], [[:Categoria:Filosofia di Debian | "Filosofia di Debian"]] o [[:Categoria:Storia di Debian | "Storia di Debian"]]<br />
*[[:Categoria:Da Cancellare | Pagine da cancellare]]<br />
*[[Installazione Debian: pagine utili]]<br />
*[[Installare Debian]]<br />
*[[Elenco laptop debianizzati]]<br />
*[[Elenco programmi senza interfaccia grafica]]<br />
*Pagine successive ad una guida con [[Template:Sommario_verticale | sommario verticale]] ([[Linux_Kernel_in_a_Nutshell |esempio]])<br />
* Guide che rimandano agli articoli dell'e-zine ([[Debian_trip |esempio]])<br />
*[[Revisione Wiki]]<br />
*[[Adozione Guide]]<br />
*[[:Categoria:Stub|Pagine incomplete]]<br />
*[[:Categoria:Da Adottare|Guide da adottare]]<br />
<br />
[[Categoria:Template]]<br />
</noinclude></div>S3vhttps://guide.debianizzati.org/index.php?title=Template:Autori&diff=44330Template:Autori2021-03-28T10:21:17Z<p>S3v: Modificato per usare lo script Lua in Autori_Lua</p>
<hr />
<div><includeonly><br />
----<br/><br />
{|style="width: 500px; border-radius: 0.5em; background:#f8fbfd; border:1px solid #4e88d0; padding:5px;"<br />
| width="40%" valign="top" | '''Guida scritta da:''' {{<br />
#ifeq: {{{Autore|}}} | Debianizzati.org | {{<br />
#if: {{{Link|}}} | [{{{Link}}} Debianizzati.org] | Debianizzati.org<br />
}} | {{{Autore}}}<br />
}}<br />
|rowspan="3" width="5%" align="center" valign="top" | {{ #invoke: Autori_Lua | getimage }}<br />
|-<br />
| ''Estesa da:''<br />
{{{Estesa_da|}}}<br />
|-<br />
| ''Verificata da:''<br />
{{{Verificata_da|}}}<br />
|-<br />
| colspan="2" |<br />
<small>[[Template:Autori|Verificare ed estendere la guida]] | [[Debianized|Cos'è una guida Debianized]]</small><br />
|}<br />
</includeonly><br />
<noinclude><br />
== Anteprima ==<br />
{|style="width: 500px; border-radius: 0.5em; background:#f8fbfd; border:1px solid #4e88d0; padding:5px;"<br />
| width="40%" valign="top" | '''Guida scritta da: ''' Socrate<br />
|rowspan="3" width="5%" align="center" valign="top" | [[image:Swirl-auth60.png|60px|link=]] <small>Debianized 60%</small><br />
|-<br />
| ''Estesa da:''<br />
: Aristofane 21:21, 14 gen 2014 (CEST) (aggiunto un capitolo alla storia)<br />
|-<br />
| <br/>''Verificata da:''<br />
: Alcibiade 19:11, 9 ago 2013 (CEST) <br />
: Fedro 11:29, 6 lug 2014 (CEST) <br />
|-<br />
| colspan="2" |<br />
<small>[[Template:Autori|Verificare ed estendere la guida]] | [[Debianized|Cos'è una guida Debianized]]</small><br />
|}<br />
<br />
== Cos'è ==<br />
Questo template consente di firmare una guida e, al tempo stesso, tenere traccia di tutte le sue revisioni significative e verifiche. Tutti possono aggiungere il proprio nome utente al template in caso di revisione o estensione della guida. Così facendo si fa in modo che la maturità della guida le permetta di essere contrassegnata come '''[[Debianized]]''', ossia che raggiunga un alto grado di accuratezza e completezza per poter essere di maggior aiuto a tutte le persone che fanno parte della comunità Debian.<br />
<br />
== Utilizzo ==<br />
L'utilizzo è il seguente:<br />
<pre><br />
{{Autori<br />
|Autore = Firma dell'autore della guida<br />
|Estesa_da =<br />
: Firma di Utente1<br />
: Firma di Utente2<br />
: Firma di Utente3<br />
|Verificata_da=<br />
: Firma di Utente4<br />
: Firma di Utente5<br />
: Firma di Utente6<br />
}}<br />
</pre><br />
Da tener presente che:<br />
# Il template va inserito in fondo alla guida.<br />
# In caso di pagine riunite sotto lo stesso argomento tramite il [[Aiuto:I template#Template di sommario|template "Sommario"]], questo template va inserito solo sulla pagina principale.<br />
<br />
=== Autore ===<br />
Se la guida è stata appena creata e dunque non vi sono revisioni o verifiche, è sufficiente firmarla:<br />
<pre><br />
{{Autori<br />
|Autore = ~~~~<br />
}}<br />
</pre><br />
a tal proposito, vedere anche [[Aiuto:Creare e modificare una pagina#Firmare_una_guida|come firmare una guida]].<br />
<br />
Nel caso si trattasse di una guida il cui contenuto è stato il risultato dell'impegno di più membri della comunità, specificare l'autore come "'''Debianizzati.org'''". In tal caso sarà anche possibile specificare il link alla discussione che ha originato la guida. Ad esempio:<br />
<pre><br />
{{Autori<br />
|Autore = Debianizzati.org<br />
|Link = http://forum.debianizzati.org/viewtopic.php?...<br />
}}<br />
</pre><br />
È consigliato specificare separatamente per le verifiche i nominativi di coloro che hanno contribuito alla stesura della guida, in modo che il livello di debianizzazione rifletta il suo livello di affidabilità. Purtroppo, senza verifiche, una guida che avesse come autore la comunità di Debianizzati risulterebbe perfino meno testata di quella scritta da una singola persona.<br />
<br />
Si ricorda inoltre che ogni carattere '''<code>=</code>''', per esempio all'interno del link, dovrebbe essere sostituito con '''<code><nowiki>{{=}}</nowiki></code>''' in quanto '''<code>=</code>''' è un carattere speciale all'interno di un [[template]].<br />
<br />
=== Verifiche ===<br />
Se avete seguito la guida e ne avete accertato la validità, allora potete aggiungere il vostro nome utente al template semplicemente inserendo la firma attraverso il parametro '''Verificata_da'''..<br/><br />
Quindi le modifiche ad esempio a:<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
}}<br />
</pre><br />
saranno, per una verifica di ''nomeutente'':<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Verificata_da =<br />
:~~~~<br />
}}<br />
</pre><br />
oppure, se esistono già delle verifiche da parte di altri utenti, le modifiche saranno, ad esempio, da:<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Verificata_da =<br />
: pluto 10:22, 22 feb 2013 (CEST) <br />
}}<br />
</pre><br />
a:<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Verificata_da =<br />
: pluto 10:22, 22 feb 2013 (CEST) <br />
: ~~~~<br />
}}<br />
</pre><br />
# Ciascuno può verificare la guida in ogni momento e, nel caso di modifiche successive da parte di altri utenti, decidere se lasciare il proprio nome utente tra i revisori o rimuoverlo.<br />
# Anche in caso di più verifiche, ognuno può aggiungere il proprio nome alla lista dei revisori soltanto una volta.<br />
# È importante che ogni aggiunta di una firma alla lista dei revisori avvenga su una riga separata e preceduta dal carattere "due punti" ":"<br />
<br />
=== Estensione della guida ===<br />
Se estendete la guida in maniera significativa, ad esempio con l'aggiunta di paragrafi o intere sezioni, potete inserire il vostro nome utente attraverso il parametro '''Estesa_da''' in modo simile agli esempi precedenti.<br/><br />
Se la modifica interessasse la maggior parte della guida, tanto da risultare quasi in una sua riscrittura, tutte le precedenti verifiche sono da rimuovere. In caso di dubbi, utilizzare la pagina di discussione della guida. Per questo motivo, prima di modificare una guida '''Debianized''', si raccomanda la lettura di [[Debianized|questa pagina]].<br />
<br />
Ovviamente è anche possibile aggiungere il proprio nome utente sia alla lista dei revisori, come visto prima, sia alla lista degli estensori.<br />
<br />
* Per aggiungere il proprio nome utente nel caso esista solo l'indicazione dell'autore:<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
}}<br />
</pre><br />
diventa:<br />
<pre><br />
{{Autori <br />
|Autore = pippo<br />
|Estesa_da = <br />
: ~~~~<br />
}}<br />
</pre><br />
* Nel caso esistano revisioni e altre estensioni:<br />
<pre><br />
{{Autori <br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Estesa_da = <br />
: sempronio 20:01, 03 apr 2013 (CEST) <br />
|Verificata_da = <br />
: tizio 23:07, 21 lug 2014 (CEST) <br />
: caio 18:10, 21 feb 2015 (CEST) <br />
}}<br />
</pre><br />
diventerà:<br />
<pre><br />
{{Autori <br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Estesa_da = <br />
: sempronio 20:01, 03 apr 2013 (CEST) <br />
: ~~~~<br />
|Verificata_da = <br />
: tizio 23:07, 21 lug 2014 (CEST) <br />
: caio 18:10, 21 feb 2015 (CEST) <br />
}}<br />
</pre><br />
* Nel caso di estensione della guida e sua contemporanea verifica:<br />
<pre><br />
{{Autori<br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Estesa_da =<br />
: sempronio 20:01, 03 apr 2013 (CEST) <br />
|Verificata_da =<br />
: tizio 23:07, 21 lug 2014 (CEST) <br />
: caio 18:10, 21 feb 2015 (CEST) <br />
}}<br />
</pre><br />
diventa:<br />
<pre> <br />
{{Autori <br />
|Autore = pippo 10:11, 21 feb 2013 (CEST) <br />
|Estesa_da = <br />
: sempronio 20:01, 03 apr 2013 (CEST) <br />
: ~~~~<br />
|Verificata_da = <br />
: tizio 23:07, 21 lug 2014 (CEST) <br />
: caio 18:10, 21 feb 2015 (CEST) <br />
: ~~~~<br />
}}<br />
</pre><br />
si ricorda sempre che le quattro [[tilde]] (<nowiki>~~~~</nowiki>) vengono convertite automaticamente nel nome utente dell'utente e nella data corrente.<br />
<br />
=== Numero di revisori ===<br />
Il numero dei revisori, e il conseguente incremento delle percentuale di "debianizzazione" della guida, viene automaticamente ricavato a partire dal numero di coloro che hanno aggiunto il proprio nickname tramite il parametro "Verificata_da".<br/><br />
Il parametro "Numero_revisori", utilizzato in precedenza a tale scopo, non viene più considerato e può essere tranquillamente rimosso se lo si trova all'interno del template sulle pagine del wiki.<br />
<br />
== Guide adottate ==<br />
Nel caso si sia [[Adozione Guide|adottata una guida]], al termine del suo completamento bisogna rimuovere le precedenti revisioni/estensioni dal template e aggiungervi solo il proprio nome utente oltre a un breve richiamo all'autore originario come piccola forma di riconoscenza per aver messo a disposizione parte del proprio tempo per affrontare l'argomento:<br />
<pre><br />
{{Autori<br />
|Autore = ~~~~<br/><br />
(guida originariamente scritta da pluto)<br />
}}<br />
</pre><br />
<br />
== Dove non inserire il template ==<br />
Su diverse guide il template non va inserito.<br />
*[[Pagina principale]]<br />
*[[Indice Guide]]<br />
*[[FAQ]]<br />
*[[Tabella Software]] e [[Lista Hardware]]<br />
*Pagine di help: [[Aiuto:Linee guida su come contribuire al Wiki]]<br />
*[[:Categoria:Libri | Recensioni di libri]]<br />
*[[:Categoria:Glossario | Pagine di glossario]]<br />
*[[:Categoria:Main | Categorie]] e [[Lista Categorie | pagina delle categorie]]<br />
*[[:Categoria:Template | Template]]<br />
* Pagine che appartengono esclusivamente a una o più delle seguenti categorie: [[:Categoria:Wiki | "Wiki"]], [[:Categoria:Debianizzati | "Debianizzati"]], [[:Categoria:Filosofia di Debian | "Filosofia di Debian"]] o [[:Categoria:Storia di Debian | "Storia di Debian"]]<br />
*[[:Categoria:Da Cancellare | Pagine da cancellare]]<br />
*[[Installazione Debian: pagine utili]]<br />
*[[Installare Debian]]<br />
*[[Elenco laptop debianizzati]]<br />
*[[Elenco programmi senza interfaccia grafica]]<br />
*Pagine successive ad una guida con [[Template:Sommario_verticale | sommario verticale]] ([[Linux_Kernel_in_a_Nutshell |esempio]])<br />
* Guide che rimandano agli articoli dell'e-zine ([[Debian_trip |esempio]])<br />
*[[Revisione Wiki]]<br />
*[[Adozione Guide]]<br />
*[[:Categoria:Stub|Pagine incomplete]]<br />
*[[:Categoria:Da Adottare|Guide da adottare]]<br />
<br />
[[Categoria:Template]]<br />
</noinclude></div>S3vhttps://guide.debianizzati.org/index.php?title=Dual_boot_con_Debian_e_Windows_10&diff=44327Dual boot con Debian e Windows 102021-03-26T14:29:29Z<p>S3v: verificata per Bullseye</p>
<hr />
<div>{{Stub}}<br />
{{Versioni_compatibili | Buster | Bullseye}}<br />
In questa guida verranno indicati i diversi passi per installare Debian partendo da un'installazione già esistente e funzionante di Windows 10.<br/><br />
Al termine si otterrà un sistema con entrambi i sistemi operativi installati e con la possibilità di scegliere, al momento della fase di boot della macchina. quale dei due avviare.<br />
<br />
__toc__<br />
<br />
== Caveat ==<br />
Questa guida è stata testata per un dual boot Debian-Windows 10 basato su uno schema di partizioni [[GPT]]. Se la propria macchina utilizza uno schema [[MBR]], estendere liberamente questa guida con tutte le informazioni che si ritengono necessarie.<br />
<br />
== Prima di iniziare ==<br />
Operazioni preliminari all'applicazione di questa guida:<br />
;Aggiornare Windows 10: è importante che Windows 10 sia aggiornato in modo da correggere eventuali problemi che possano influire nella procedura indicata all'interno di questa guida.<br/>Notare che alcuni aggiornamenti potrebbero non essere rilevati fino a quando altri aggiornamenti non siano stati precedentemente installati. Ricercare tutti gli aggiornamenti non facoltativi fino a quando si è sicuri di averli installati tutti.<br />
; Eseguire un backup: è fondamentale che sia stata approntata una copia di tutti i file ritenuti importanti. Le operazioni descritte, benché non complesse, riguardano procedure che coinvolgono i dischi di sistema e i [[File System]] (e, quindi, i file) che vi si trovano. È assolutamente vitale avere una copia dei file che non si vuole perdere nel caso qualcosa andasse storto. Siete avvertiti ;)<br />
;Boot da USB o CD(DVD)-ROM: assicurarsi che la propria macchina consenta l'avvio tramite USB o CD-ROM (o DVD-ROM).<br />
<br />
== Creare spazio per Debian ==<br />
Ovviamente Debian richiede spazio libero per essere installata questo può essere creato in molti modi ma il più semplice consiste nell'utilizzare "Disk Management", uno strumento di gestione delle partizioni incorporato in Windows 10.<br />
<br />
Utilizzare la combinazione di tasti "Win+r" e digitare:<br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
Si aprirà una finestra simile alla seguente in cui vengono elencate tutte le partizioni presenti sul disco (o sui dischi) di sistema.<br />
[[File:Shrink part win10 1.png|centro|miniatura|700x700px]]<br />
Individuare la partizione contenente il filesystem NTFS (tipicamente contrassegnata con l'etichetta "C:"), fare clic su di essa con il tasto destro del mouse e scegliere "Riduci..." dal menù a comparsa che verrà visualizzato.<br />
Verrà aperta un'altra finestra attraverso la quale ci verrà chiesto lo spazio da liberare sulla partizione scelta.<br/><br />
In questo caso è stato scelto il valore 200000 MB che corrisponde a circa 195 GB. Scegliere il valore che si ritiene più adatto alle proprie esigenze considerando che non è possibile andare oltre la soglia massima indicata.<br />
[[File:Shrink part win10 2.png|centro|miniatura|700x700px]]<br />
Al termine dell'operazione verrà creato uno spazio non partizionato sul disco.<br/><br />
[[File:Shrink part win10 3.png|centro|miniatura|700x700px]]<br />
{{Warningbox | Prima di installare Debian, è consigliato riavviare la macchina e utilizzare il sistema normalmente per tutto il tempo che si ritiene necessario a controllare non siano stati introdotti problemi che abbiano intaccato le funzionalità di Windows.}}<br />
<br />
== Ottenere Debian ==<br />
Debian può essere ottenuta utilizzando le immagini .iso presenti sul sito ufficiale.<br/><br />
Consultare [[Installare Debian|questa guida]] per maggiori informazioni su come ottenere Debian, quale immagine scaricare e come creare un supporto da cui avviare l'installazione.<br />
<br />
== Installazione ==<br />
Dopo aver avviato la propria macchina dal supporto contenente Debian, verrà avviato l'[[installer]] Debian che si occuperà di tutte le fasi di installazione.<br/><br />
L'installazione (grafica o testuale) non richiede particolari raccomandazioni se non rispondere alle domande che verranno poste di volta in volta (nazione, lingua, tastiera, configurazione della rete - potrebbe essere necessario installare [[firmware]] aggiuntivo) e attendere che compaia questa schermata dove possiamo scegliere dove installare Debian; ci accorgiamo subito che l'installer ci propone, come prima opzione, di utilizzare lo spazio libero precedentemente creato:<br />
[[File:Partman-auto automatically partition.png|centro|miniatura|500x500px]]<br />
Nella schermata successiva viene chiesto se debbano essere create altre partizioni diverse da quella di [[root]] "/".<br/><br />
La scelta è a discrezione dell'utente; se si sta installando Debian per la prima volta, è consigliato scegliere "Tutti i file in una partizione".<br />
[[File:Partman-auto choose recipe.png|centro|miniatura|500x500px]]<br />
Infine confermare i cambiamenti:<br />
[[File:Partman choose partition.png|centro|miniatura|500x500px]]<br />
Dopo questo passaggio, l'installazione prosegue normalmente chiedendo i pacchetti da installare, scaricando aggiornamenti di sicurezza (se presenti) e terminando con la schermata in cui viene chiesto di riavviare la macchina.<br />
<br />
== Scelta del SO all'avvio ==<br />
Al boot della macchina, comparirà la schermata di [[GRUB]] in cui verranno elencati i sistemi operativi che è possibile avviare (nel nostro caso Debian e Windows 10).<br />
[[File:Grub-w10-deb.png|centro|miniatura|500x500px]]<br />
<br />
{{Suggerimento|Nel caso si volesse avviare Windows 10 come sistema predefinito di avvio è sufficiente da Debian dare il seguente comando<br />
<pre># mv /etc/grub.d/30_os-prober /etc/grub.d/08_os-prober<br />
# update-grub2</pre>}}<br />
<br />
== Ripristino ==<br />
TODO<br />
<br />
{{Autori<br />
|Autore= [[Utente:S3v|S3v]]<br />
}}<br />
[[Categoria: Installazione]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Aiuto:Varie&diff=44318Aiuto:Varie2021-03-23T19:51:49Z<p>S3v: Aggiunto namespace "Modulo"</p>
<hr />
<div>{{Help}}<br />
== Redirect ==<br />
I redirect sono pagine che hanno il solo compito di reindirizzare l'utente ad un'altra pagina del Wiki.<br />
=== Creare un redirect ===<br />
La creazione di un redirect avviene inserendo all'interno di una pagina esclusivamente questa riga:<br />
<pre>#REDIRECT [[Altra pagina]]</pre><br />
oppure, in maniera del tutto equivalente:<br />
<pre>#RINVIA [[Altra pagina]]</pre><br />
in questo modo l'utente che apre una pagina con redirect sarà automaticamente reindirizzato a "Altra pagina".<br/><br />
Evitare la creazione di redirect ad altri redirect (redirect doppi) in modo da facilitare la manutenzione delle guide.<br />
<br />
Ogni volta che viene [[Aiuto:Creare e modificare una pagina|rinominata]] una pagina, questa diventerà automaticamente un redirect verso la nuova guida.<br />
<br />
=== Cancellare un redirect ===<br />
La cancellazione di una pagina di redirect è identica alla [[Aiuto:Spostare e cancellare una pagina|cancellazione]] delle altre pagine del Wiki,<br/><br />
Accertarsi, attraverso la pagina "Strumenti -> Puntano qui" (nella sidebar a sinistra) che non vi siano guide che puntino al redirect che ci si appresta a cancellare.<br />
<br />
== Estensioni ==<br />
In questo Wiki sono presenti diverse estensioni che consentono di effettuare operazioni altrimenti non possibili. Alcune estensioni sono fornite direttamente dal motore MediaWiki, altre sono installabili separatamente; tutte, però, introducono delle funzionalità aggiuntive che possono arricchire il Wiki e rendere più facile l'inserimento dei contenuti.<br/><br />
La lista delle estensioni attualmente installate è visibile in [[Speciale:Versione|questa pagina]].<br />
<br />
=== Labeled Section Transclusion ===<br />
Estensione che consente di inserire in una pagina il contenuto di un'altra pagina. La comodità risiede nel fatto che il contenuto va ''effettivamente'' cambiato solo in una guida, in questo modo tutte le pagine che la "trascludono" saranno modificate automaticamente di conseguenza.<br/><br />
Il funzionamento è molto simile a quello dei [[Aiuto:I template|template]] se non per il fatto che non è necessario crearli!<br />
<br />
La "trasclusione" avviene inserendo il testo all'interno dei tag '''<nowiki><section/>..<section/></nowiki>''' in una qualunque pagina. Questo contenuto può essere richiamato ora in tutte le guide che si vuole attraverso <nowiki>{{#lst:NomePagina}}</nowiki>, dove "NomePagina" è il nome esatto della pagina che contiene il testo da trascludere. Da questo momento in poi tutti i cambiamenti del testo trascluso in "NomePagina" si propagheranno alle altre guide.<br />
<br />
Se in una pagina ci sono più informazioni da trascludere, si possono utilizzare delle ''etichette'' attraverso la sintassi '''<nowiki><section begin=Etichetta />..<section end=Etichetta /></nowiki>'''; ovviamente "Etichetta" è solo un esempio, il nome può essere scelto liberamente.<br/><br />
Per richiamare il testo, la sintassi varia leggermente: <nowiki>{{#lst:NomePagina|Etichetta}}</nowiki> .<br/><br />
<br />
Da notare che la trasclusione può avvenire anche all'interno della stessa pagina, ad esempio per ripetere in più punti uno stesso testo; in questo caso "NomePagina" è il nome della guida in cui si sta scrivendo.<br />
<br />
Queste e altre informazioni possono essere lette più approfonditamente nella pagina dell'estensione<sup>[[#Link esterni|1]]</sup><br />
<br />
== I namespace ==<br />
I namespace sono delle sezioni fisiche del Wiki che contengono tutte le pagine scritte. Essi sono differenti dalle [[Aiuto:Categorie|categorie]] in quanto queste ultime possono coinvolgere guide presenti in differenti namespace.<br/><br />
In questo Wiki esistono diversi namespace:<br />
;Principale:È il namespace che comprende, di default, tutte le guide.<br />
;Utente:È il namespace che comprende le pagine personali degli utenti del Wiki.<br/>Il nome delle pagine di questo namespace inizia con <u>''Utente:''</u><br />
;File:È il namespace in cui sono inserite le pagine riguardanti le immagini e in genere tutti i file caricati.<br/>Il nome delle pagine di questo namespace inizia con <u>''File:''</u><br />
;Template:Comprende tutti i [[Aiuto:I template|template]] presenti sul Wiki.<br/>Il nome delle pagine di questo namespace inizia con <u>''Template:''</u><br />
;Aiuto:È il namespace in cui si trovano le pagine di aiuto al Wiki.<br/>Il nome delle pagine di questo namespace inizia con <u>''Aiuto:''</u><br />
;Guide@Debianizzati.org:È il namespace che comprende le pagine riservate a progetti interni al Wiki, a licenze, avvertenze generali e, in genere, a tutto ciò che riguarda il Wiki e il suo funzionamento.<br/>Il nome delle pagine di questo namespace inizia con <u>''Guide@Debianizzati.org:''</u><br />
;Categoria:È il namespace che comprende le [[Aiuto:Categorie|categorie]] presenti sul Wiki.<br/>Il nome delle pagine di questo namespace inizia con <u>''Categoria:''</u><br />
;Accademia:È il namespace in cui si trovano le pagine relative all'[[Accademia:Indice|Accademia]].<br/>Il nome delle pagine di questo namespace inizia con <u>''Accademia:''</u><br />
;Old:È il namespace che comprende le guide ormai superate e presenti solo per motivi di natura storica o didattica.<br/>Il nome delle pagine di questo namespace inizia con <u>''Old:''</u><br />
;Modulo:In questo namespace vengono raccolti tutti i moduli creati con il linguaggio di scripting [[Lua]].<br/>Il nome delle pagine di questo namespace inizia con <u>''Modulo:''</u><br />
;Mediawiki:È il namespace che comprende pagine riguardanti strettamente l'interfaccia tra Wiki e motore MediaWiki; non sono modificabili da tutti.<br/>Il nome delle pagine di questo namespace inizia con <u>''Mediawiki:''</u><br />
<br />
Oltre a questi namespace, ne esistono altrettanti relativi alle [[Aiuto:Discussioni|discussioni]] per ogni pagina. Questi iniziano con la parola <u>''Discussione:''</u> (se ci si sta riferendo ad una guida del namespace principale) o con <u>''Discussioni_Namespace:''</u> se riguardano altre pagine di altri namespace.<br />
<br />
Le guide relative a tutti i namespace possono essere visualizzate [[Speciale:TutteLePagine | qui]].<br />
<br />
;Speciale:È un namespace "sui generis" poiché non è possibile inserire al suo interno nuove pagine. Contiene le pagine visualizzabili [[Speciale:PagineSpeciali | qui]] a cui si può accedere anche attraverso il link "'''''Pagine speciali'''''" nella sidebar sinistra.<br/>Le pagine di questo namespace iniziano con <u>''Speciale:''</u><br />
<br />
== Link esterni ==<br />
[1] - [http://www.mediawiki.org/wiki/Extension:Labeled_Section_Transclusion Pagina dell'estensione "Labeled Section Transclusion"]</div>S3vhttps://guide.debianizzati.org/index.php?title=Dual_boot_con_Debian_e_Windows_10&diff=44317Dual boot con Debian e Windows 102021-03-23T19:31:56Z<p>S3v: /* Ripristino */</p>
<hr />
<div>{{Stub}}<br />
{{Versioni_compatibili | Buster}}<br />
In questa guida verranno indicati i diversi passi per installare Debian partendo da un'installazione già esistente e funzionante di Windows 10.<br/><br />
Al termine si otterrà un sistema con entrambi i sistemi operativi installati e con la possibilità di scegliere, al momento della fase di boot della macchina. quale dei due avviare.<br />
<br />
__toc__<br />
== Caveat ==<br />
Questa guida è stata testata per un dual boot Debian-Windows 10 basato su uno schema di partizioni [[GPT]]. Se la propria macchina utilizza uno schema [[MBR]], estendere liberamente questa guida con tutte le informazioni che si ritengono necessarie.<br />
== Prima di iniziare ==<br />
Operazioni preliminari all'applicazione di questa guida:<br />
;Aggiornare Windows 10: è importante che Windows 10 sia aggiornato in modo da correggere eventuali problemi che possano influire nella procedura indicata all'interno di questa guida.<br/>Notare che alcuni aggiornamenti potrebbero non essere rilevati fino a quando altri aggiornamenti non siano stati precedentemente installati. Ricercare tutti gli aggiornamenti non facoltativi fino a quando si è sicuri di averli installati tutti.<br />
; Eseguire un backup: è fondamentale che sia stata approntata una copia di tutti i file ritenuti importanti. Le operazioni descritte, benché non complesse, riguardano procedure che coinvolgono i dischi di sistema e i [[filesystem]] (e, quindi, i file) che vi si trovano. È assolutamente vitale avere una copia dei file che non si vuole perdere nel caso qualcosa andasse storto. Siete avvertiti ;)<br />
;Boot da USB o CD(DVD)-ROM: assicurarsi che la propria macchina consenta l'avvio tramite USB o CD-ROM (o DVD-ROM).<br />
== Creare spazio per Debian ==<br />
Ovviamente Debian richiede spazio libero per essere installato; questo può essere creato in molti modi ma il più semplice consiste nell'utilizzare "Disk Managment", uno strumento di gestione delle partizioni incorporato in Windows 10.<br />
<br />
Utilizzare la combinazione di tasti "Win+r" e digitare:<br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
Si aprirà una finestra simile alla seguente in cui vengono elencate tutte le partizioni presenti sul disco (o sui dischi) di sistema.<br />
[[File:Shrink part win10 1.png|centro|miniatura|700x700px]]<br />
Individuare la partizione contenente il filesystem NTFS (tipicamente contrassegnata con l'etichetta "C:"), fare clic su di essa con il tasto destro del mouse e scegliere "Riduci..." dal menù a comparsa che verrà visualizzato.<br />
Verrà aperta un'altra finestra attraverso la quale ci verrà chiesto lo spazio da liberare sulla partizione scelta.<br/><br />
In questo caso è stato scelto il valore 200000 MB che corrisponde a circa 195 GB. Scegliere il valore che si ritiene più adatto alle proprie esigenze considerando che non è possibile andare oltre la soglia massima indicata.<br />
[[File:Shrink part win10 2.png|centro|miniatura|700x700px]]<br />
Al termine dell'operazione verrà creato uno spazio non partizionato sul disco.<br/><br />
[[File:Shrink part win10 3.png|centro|miniatura|700x700px]]<br />
{{Warningbox | Prima di installare Debian, è consigliato riavviare la macchina e utilizzare il sistema normalmente per tutto il tempo che si ritiene necessario a controllare non siano stati introdotti problemi che abbiano intaccato le funzionalità di Windows.}}<br />
== Ottenere Debian ==<br />
Debian può essere ottenuta utilizzando le immagini .iso presenti sul sito ufficiale.<br/><br />
Consultare [[Installare Debian|questa guida]] per maggiori informazioni su come ottenere Debian, quale immagine scaricare e come creare un supporto da cui avviare l'installazione.<br />
== Installazione ==<br />
Dopo aver avviato la propria macchina dal supporto contenente Debian, verrà avviato l'[[installer]] Debian che si occuperà di tutte le fasi di installazione.<br/><br />
L'installazione (grafica o testuale) non richiede particolari raccomandazioni se non rispondere alle domande che verranno poste di volta in volta (nazione, lingua, tastiera, configurazione della rete - potrebbe essere necessario installare [[firmware]] aggiuntivo) e attendere che compaia questa schermata dove possiamo scegliere dove installare Debian; ci accorgiamo subito che l'installer ci propone, come prima opzione, di utilizzare lo spazio libero precedentemente creato:<br />
[[File:Partman-auto automatically partition.png|centro|miniatura|500x500px]]<br />
Nella schermata successiva viene chiesto se debbano essere create altre partizioni diverse da quella di [[root]] "/".<br/><br />
La scelta è a discrezione dell'utente; se si sta installando Debian per la prima volta, è consigliato scegliere "Tutti i file in una partizione".<br />
[[File:Partman-auto choose recipe.png|centro|miniatura|500x500px]]<br />
Infine confermare i cambiamenti:<br />
[[File:Partman choose partition.png|centro|miniatura|500x500px]]<br />
Dopo questo passaggio, l'installazione prosegue normalmente chiedendo i pacchetti da installare, scaricando aggiornamenti di sicurezza (se presenti) e terminando con la schermata in cui viene chiesto di riavviare la macchina.<br />
== Scelta del SO all'avvio ==<br />
Al boot della macchina, comparirà la schermata di [[GRUB]] in cui verranno elencati i sistemi operativi che è possibile avviare (nel nostro caso Debian e Windows 10).<br />
[[File:Grub-w10-deb.png|centro|miniatura|500x500px]]<br />
== Ripristino ==<br />
TODO<br />
{{Autori<br />
|Autore= [[Utente:S3v|S3v]] 19:31, 23 mar 2021 (UTC)<br />
}}<br />
[[Categoria: Installazione]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Dual_boot_con_Debian_e_Windows_10&diff=44316Dual boot con Debian e Windows 102021-03-23T19:31:26Z<p>S3v: Aggiunte immagini</p>
<hr />
<div>{{Stub}}<br />
{{Versioni_compatibili | Buster}}<br />
In questa guida verranno indicati i diversi passi per installare Debian partendo da un'installazione già esistente e funzionante di Windows 10.<br/><br />
Al termine si otterrà un sistema con entrambi i sistemi operativi installati e con la possibilità di scegliere, al momento della fase di boot della macchina. quale dei due avviare.<br />
<br />
__toc__<br />
== Caveat ==<br />
Questa guida è stata testata per un dual boot Debian-Windows 10 basato su uno schema di partizioni [[GPT]]. Se la propria macchina utilizza uno schema [[MBR]], estendere liberamente questa guida con tutte le informazioni che si ritengono necessarie.<br />
== Prima di iniziare ==<br />
Operazioni preliminari all'applicazione di questa guida:<br />
;Aggiornare Windows 10: è importante che Windows 10 sia aggiornato in modo da correggere eventuali problemi che possano influire nella procedura indicata all'interno di questa guida.<br/>Notare che alcuni aggiornamenti potrebbero non essere rilevati fino a quando altri aggiornamenti non siano stati precedentemente installati. Ricercare tutti gli aggiornamenti non facoltativi fino a quando si è sicuri di averli installati tutti.<br />
; Eseguire un backup: è fondamentale che sia stata approntata una copia di tutti i file ritenuti importanti. Le operazioni descritte, benché non complesse, riguardano procedure che coinvolgono i dischi di sistema e i [[filesystem]] (e, quindi, i file) che vi si trovano. È assolutamente vitale avere una copia dei file che non si vuole perdere nel caso qualcosa andasse storto. Siete avvertiti ;)<br />
;Boot da USB o CD(DVD)-ROM: assicurarsi che la propria macchina consenta l'avvio tramite USB o CD-ROM (o DVD-ROM).<br />
== Creare spazio per Debian ==<br />
Ovviamente Debian richiede spazio libero per essere installato; questo può essere creato in molti modi ma il più semplice consiste nell'utilizzare "Disk Managment", uno strumento di gestione delle partizioni incorporato in Windows 10.<br />
<br />
Utilizzare la combinazione di tasti "Win+r" e digitare:<br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
Si aprirà una finestra simile alla seguente in cui vengono elencate tutte le partizioni presenti sul disco (o sui dischi) di sistema.<br />
[[File:Shrink part win10 1.png|centro|miniatura|700x700px]]<br />
Individuare la partizione contenente il filesystem NTFS (tipicamente contrassegnata con l'etichetta "C:"), fare clic su di essa con il tasto destro del mouse e scegliere "Riduci..." dal menù a comparsa che verrà visualizzato.<br />
Verrà aperta un'altra finestra attraverso la quale ci verrà chiesto lo spazio da liberare sulla partizione scelta.<br/><br />
In questo caso è stato scelto il valore 200000 MB che corrisponde a circa 195 GB. Scegliere il valore che si ritiene più adatto alle proprie esigenze considerando che non è possibile andare oltre la soglia massima indicata.<br />
[[File:Shrink part win10 2.png|centro|miniatura|700x700px]]<br />
Al termine dell'operazione verrà creato uno spazio non partizionato sul disco.<br/><br />
[[File:Shrink part win10 3.png|centro|miniatura|700x700px]]<br />
{{Warningbox | Prima di installare Debian, è consigliato riavviare la macchina e utilizzare il sistema normalmente per tutto il tempo che si ritiene necessario a controllare non siano stati introdotti problemi che abbiano intaccato le funzionalità di Windows.}}<br />
== Ottenere Debian ==<br />
Debian può essere ottenuta utilizzando le immagini .iso presenti sul sito ufficiale.<br/><br />
Consultare [[Installare Debian|questa guida]] per maggiori informazioni su come ottenere Debian, quale immagine scaricare e come creare un supporto da cui avviare l'installazione.<br />
== Installazione ==<br />
Dopo aver avviato la propria macchina dal supporto contenente Debian, verrà avviato l'[[installer]] Debian che si occuperà di tutte le fasi di installazione.<br/><br />
L'installazione (grafica o testuale) non richiede particolari raccomandazioni se non rispondere alle domande che verranno poste di volta in volta (nazione, lingua, tastiera, configurazione della rete - potrebbe essere necessario installare [[firmware]] aggiuntivo) e attendere che compaia questa schermata dove possiamo scegliere dove installare Debian; ci accorgiamo subito che l'installer ci propone, come prima opzione, di utilizzare lo spazio libero precedentemente creato:<br />
[[File:Partman-auto automatically partition.png|centro|miniatura|500x500px]]<br />
Nella schermata successiva viene chiesto se debbano essere create altre partizioni diverse da quella di [[root]] "/".<br/><br />
La scelta è a discrezione dell'utente; se si sta installando Debian per la prima volta, è consigliato scegliere "Tutti i file in una partizione".<br />
[[File:Partman-auto choose recipe.png|centro|miniatura|500x500px]]<br />
Infine confermare i cambiamenti:<br />
[[File:Partman choose partition.png|centro|miniatura|500x500px]]<br />
Dopo questo passaggio, l'installazione prosegue normalmente chiedendo i pacchetti da installare, scaricando aggiornamenti di sicurezza (se presenti) e terminando con la schermata in cui viene chiesto di riavviare la macchina.<br />
== Scelta del SO all'avvio ==<br />
Al boot della macchina, comparirà la schermata di [[GRUB]] in cui verranno elencati i sistemi operativi che è possibile avviare (nel nostro caso Debian e Windows 10).<br />
[[File:Grub-w10-deb.png|centro|miniatura|500x500px]]<br />
== Ripristino ==<br />
TODO<br />
{{Autori<br />
|Autore=:[[Utente:S3v|S3v]] ([[Discussioni utente:S3v|discussioni]]) 17:42, 20 mar 2021 (UTC)<br />
}}<br />
[[Categoria: Installazione]]</div>S3vhttps://guide.debianizzati.org/index.php?title=File:Partman_choose_partition.png&diff=44315File:Partman choose partition.png2021-03-23T19:28:38Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=File:Partman-auto_choose_recipe.png&diff=44314File:Partman-auto choose recipe.png2021-03-23T19:26:57Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=File:Partman-auto_automatically_partition.png&diff=44313File:Partman-auto automatically partition.png2021-03-23T19:24:56Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=File:Grub-w10-deb.png&diff=44312File:Grub-w10-deb.png2021-03-23T19:21:21Z<p>S3v: Menu GRUB per dual boot Debian - Windows 10</p>
<hr />
<div>== Dettagli ==<br />
Menu GRUB per dual boot Debian - Windows 10</div>S3vhttps://guide.debianizzati.org/index.php?title=Dual_boot_con_Debian_e_Windows_10&diff=44302Dual boot con Debian e Windows 102021-03-20T18:40:36Z<p>S3v: aggiunte immagini Disk Management</p>
<hr />
<div>{{Stub}}<br />
{{Versioni_compatibili | Buster}}<br />
In questa guida verranno indicati i diversi passi per installare Debian partendo da un'installazione già esistente e funzionante di Windows 10.<br/><br />
Al termine si otterrà un sistema con entrambi i sistemi operativi installati e con la possibilità di scegliere, al momento della fase di boot della macchina. quale dei due avviare.<br />
<br />
__toc__<br />
== Caveat ==<br />
Questa guida è stata testata per un dual boot Debian-Windows 10 basato su uno schema di partizioni [[GPT]]. Se la propria macchina utilizza uno schema [[MBR]], estendere liberamente questa guida con tutte le informazioni che si ritengono necessarie.<br />
== Prima di iniziare ==<br />
Operazioni preliminari all'applicazione di questa guida:<br />
;Aggiornare Windows 10: è importante che Windows 10 sia aggiornato in modo da correggere eventuali problemi che possano influire nella procedura indicata all'interno di questa guida.<br/>Notare che alcuni aggiornamenti potrebbero non essere rilevati fino a quando altri aggiornamenti non siano stati precedentemente installati. Ricercare tutti gli aggiornamenti non facoltativi fino a quando si è sicuri di averli installati tutti.<br />
; Eseguire un backup: è fondamentale che sia stata approntata una copia di tutti i file ritenuti importanti. Le operazioni descritte, benché non complesse, riguardano procedure che coinvolgono i dischi di sistema e i [[filesystem]] (e, quindi, i file) che vi si trovano. È assolutamente vitale avere una copia dei file che non si vuole perdere nel caso qualcosa andasse storto. Siete avvertiti ;)<br />
;Boot da USB o CD(DVD)-ROM: assicurarsi che la propria macchina consenta l'avvio tramite USB o CD-ROM (o DVD-ROM).<br />
== Creare spazio per Debian ==<br />
Ovviamente Debian richiede spazio libero per essere installato; questo può essere creato in molti modi ma il più semplice consiste nell'utilizzare "Disk Managment", uno strumento di gestione delle partizioni incorporato in Windows 10.<br />
<br />
Utilizzare la combinazione di tasti "Win+r" e digitare:<br />
<pre><br />
diskmgmt.msc<br />
</pre><br />
Si aprirà una finestra simile alla seguente in cui vengono elencate tutte le partizioni presenti sul disco (o sui dischi) di sistema.<br />
[[File:Shrink part win10 1.png|centro|miniatura|700x700px]]<br />
Individuare la partizione contenente il filesystem NTFS (tipicamente contrassegnata con l'etichetta "C:"), fare clic su di essa con il tasto destro del mouse e scegliere "Riduci..." dal menù a comparsa che verrà visualizzato.<br />
Verrà aperta un'altra finestra attraverso la quale ci verrà chiesto lo spazio da liberare sulla partizione scelta.<br/><br />
In questo caso è stato scelto il valore 200000 MB che corrisponde a circa 195 GB. Scegliere il valore che si ritiene più adatto alle proprie esigenze considerando che non è possibile andare oltre la soglia massima indicata.<br />
[[File:Shrink part win10 2.png|centro|miniatura|700x700px]]<br />
Al termine dell'operazione verrà creato uno spazio non partizionato sul disco.<br/><br />
[[File:Shrink part win10 3.png|centro|miniatura|700x700px]]<br />
{{Warningbox | Prima di installare Debian, è consigliato riavviare la macchina e utilizzare il sistema normalmente per tutto il tempo che si ritiene necessario a controllare non siano stati introdotti problemi che abbiano intaccato le funzionalità di Windows.}}<br />
== Ottenere Debian ==<br />
Debian può essere ottenuta utilizzando le immagini .iso presenti sul sito ufficiale.<br/><br />
Consultare [[Installare Debian|questa guida]] per maggiori informazioni su come ottenere Debian, quale immagine scaricare e come creare un supporto da cui avviare l'installazione.<br />
== Installazione ==<br />
Dopo aver avviato la propria macchina dal supporto contenente Debian, verrà avviato l'[[installer]] Debian che si occuperà di tutte le fasi di installazione.<br/><br />
L'installazione (grafica o testuale) non richiede particolari raccomandazioni se non rispondere alle domande che verranno poste di volta in volta (nazione, lingua, tastiera, configurazione della rete - potrebbe essere necessario installare [[firmware]] aggiuntivo) e attendere che compaia questa schermata dove possiamo scegliere dove installare Debian; ci accorgiamo subito che l'installer ci propone, come prima opzione, di utilizzare lo spazio libero precedentemente creato:<br />
<br />
TODO Image<br />
<br />
Nella schermata successiva viene chiesto se debbano essere create altre partizioni diverse da quella di [[root]] "/".<br/><br />
La scelta è a discrezione dell'utente; se si sta installando Debian per la prima volta, è consigliato scegliere "Tutti i file in una partizione".<br />
<br />
TODO Image<br />
<br />
Infine confermare i cambiamenti:<br />
<br />
TODO Image<br />
<br />
Dopo questo passaggio, l'installazione prosegue normalmente chiedendo i pacchetti da installare, scaricando aggiornamenti di sicurezza (se presenti) e terminando con la schermata in cui viene chiesto di riavviare la macchina.<br />
== Scelta del SO all'avvio ==<br />
Al boot della macchina, comparirà la schermata di [[GRUB]] in cui verranno elencati i sistemi operativi che è possibile avviare (nel nostro caso Debian e Windows 10).<br/><br />
TODO Image<br />
== Ripristino ==<br />
TODO<br />
{{Autori<br />
|Autore=:[[Utente:S3v|S3v]] ([[Discussioni utente:S3v|discussioni]]) 17:42, 20 mar 2021 (UTC)<br />
}}<br />
[[Categoria: Installazione]]</div>S3vhttps://guide.debianizzati.org/index.php?title=File:Shrink_part_win10_3.png&diff=44301File:Shrink part win10 3.png2021-03-20T18:34:05Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=File:Shrink_part_win10_2.png&diff=44300File:Shrink part win10 2.png2021-03-20T18:33:50Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=File:Shrink_part_win10_1.png&diff=44299File:Shrink part win10 1.png2021-03-20T18:33:23Z<p>S3v: </p>
<hr />
<div></div>S3vhttps://guide.debianizzati.org/index.php?title=Dual_boot_con_Debian_e_Windows_10&diff=44298Dual boot con Debian e Windows 102021-03-20T17:42:57Z<p>S3v: Nuova guida</p>
<hr />
<div>{{Stub}}<br />
{{Versioni_compatibili | Buster}}<br />
In questa guida verranno indicati i diversi passi per installare Debian partendo da un'installazione già esistente e funzionante di Windows 10.<br/><br />
Al termine si otterrà un sistema con entrambi i sistemi operativi installati e con la possibilità di scegliere, al momento della fase di boot della macchina. quale dei due avviare.<br />
<br />
__toc__<br />
<br />
== Caveat ==<br />
Questa guida è stata testata per un dual boot Debian-Windows 10 basato su uno schema di partizioni [[GPT]]. Se la propria macchina utilizza uno schema [[MBR]], estendere liberamente questa guida con tutte le informazioni che si ritengono necessarie.<br />
<br />
== Prima di iniziare ==<br />
<br />
Operazioni preliminari all'applicazione di questa guida:<br />
;Aggiornare Windows 10: è importante che Windows 10 sia aggiornato in modo da correggere eventuali problemi che possano influire nella procedura indicata all'interno di questa guida.<br/>Notare che alcuni aggiornamenti potrebbero non essere rilevati fino a quando altri aggiornamenti non siano stati precedentemente installati. Ricercare tutti gli aggiornamenti non facoltativi fino a quando si è sicuri di averli installati tutti.<br />
; Eseguire un backup: è fondamentale che sia stata approntata una copia di tutti i file ritenuti importanti. Le operazioni descritte, benché non complesse, riguardano procedure che coinvolgono i dischi di sistema e i [[filesystem]] (e, quindi, i file) che vi si trovano. È assolutamente vitale avere una copia dei file che non si vuole perdere nel caso qualcosa andasse storto. Siete avvertiti ;)<br />
;Boot da USB o CD(DVD)-ROM: assicurarsi che la propria macchina consenta l'avvio tramite USB o CD-ROM (o DVD-ROM).<br />
<br />
== Creare spazio per Debian ==<br />
<br />
Ovviamente Debian richiede spazio libero per essere installato; questo può essere creato in molti modi ma il più semplice consiste nell'utilizzare "Disk Manager", uno strumento di gestione delle partizioni incorporato in Windows 10.<br />
<br />
Utilizzare la combinazione di tasti "Win+r" e digitare:<br />
<pre><br />
Diskmgmt.msc<br />
</pre><br />
Si aprirà una finestra simile alla seguente in cui vengono elencate tutte le partizioni presenti sul disco (o sui dischi) di sistema.<br />
<br />
TODO Image<br />
<br />
Individuare la partizione contenente il filesystem NTFS (tipicamente contrassegnata con l'etichetta "C:"), fare clic su di essa con il tasto destro del mouse e scegliere "Riduci..." dal menù a comparsa che verrà visualizzato.<br />
<br />
Verrà aperta un'altra finestra attraverso la quale ci verrà chiesto lo spazio da liberare sulla partizione scelta.<br/><br />
In questo caso è stato scelto il valore 200000 MB che corrisponde a circa 195 GB. Scegliere il valore che si ritiene più adatto alle proprie esigenze considerando che non è possibile andare oltre la soglia massima indicata.<br />
<br />
TODO Image<br />
<br />
Al termine dell'operazione verrà creato uno spazio non partizionato sul disco.<br/><br />
<br />
TODO Image<br />
<br />
{{Warningbox | Prima di installare Debian, è consigliato riavviare la macchina e utilizzare il sistema normalmente per tutto il tempo che si ritiene necessario a controllare non siano stati introdotti problemi che abbiano intaccato le funzionalità di Windows.}}<br />
== Ottenere Debian ==<br />
<br />
Debian può essere ottenuta utilizzando le immagini .iso presenti sul sito ufficiale.<br/><br />
Consultare [[Installare Debian|questa guida]] per maggiori informazioni su come ottenere Debian, quale immagine scaricare e come creare un supporto da cui avviare l'installazione.<br />
<br />
== Installazione ==<br />
<br />
Dopo aver avviato la propria macchina dal supporto contenente Debian, verrà avviato l'[[installer]] Debian che si occuperà di tutte le fasi di installazione.<br/><br />
L'installazione (grafica o testuale) non richiede particolari raccomandazioni se non rispondere alle domande che verranno poste di volta in volta (nazione, lingua, tastiera, configurazione della rete - potrebbe essere necessario installare [[firmware]] aggiuntivo) e attendere che compaia questa schermata dove possiamo scegliere dove installare Debian; ci accorgiamo subito che l'installer ci propone, come prima opzione, di utilizzare lo spazio libero precedentemente creato:<br />
<br />
TODO Image<br />
<br />
Nella schermata successiva viene chiesto se debbano essere create altre partizioni diverse da quella di [[root]] "/".<br/><br />
La scelta è a discrezione dell'utente; se si sta installando Debian per la prima volta, è consigliato scegliere "Tutti i file in una partizione".<br />
<br />
TODO Image<br />
<br />
Infine confermare i cambiamenti:<br />
<br />
TODO Image<br />
<br />
Dopo questo passaggio, l'installazione prosegue normalmente chiedendo i pacchetti da installare, scaricando aggiornamenti di sicurezza (se presenti) e terminando con la schermata in cui viene chiesto di riavviare la macchina.<br />
<br />
== Scelta del SO all'avvio ==<br />
<br />
Al boot della macchina, comparirà la schermata di [[GRUB]] in cui verranno elencati i sistemi operativi che è possibile avviare (nel nostro caso Debian e Windows 10).<br/><br />
<br />
TODO Image<br />
<br />
== Ripristino ==<br />
TODO<br />
<br />
{{Autori<br />
|Autore=:[[Utente:S3v|S3v]] ([[Discussioni utente:S3v|discussioni]]) 17:42, 20 mar 2021 (UTC)<br />
}}<br />
<br />
[[Categoria: Installazione]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Aiuto:LogScript&diff=44294Aiuto:LogScript2021-03-15T21:25:31Z<p>S3v: ricreato per seguire fix di typo in script</p>
<hr />
<div>__NOTOC__<br />
=Contenuto=<br />
Nella sezione successiva '''S''' è riportato in formato base64 un archivio tar compresso con gzip e contenente uno script eseguibile per la [[Creazione automatica di un file di log per inviare quesiti al forum]].<br />
<br />
Dopo ogni modifica dello script del punto precedente, andrà modificato il contenuto della sezione successiva. Si suppone che tale script si chiami <code>scriptlog-debianizzati.org</code>, si procederà come segue:<br />
* creazione di un archivio compresso (con <code>tar</code> e <code>gzip</code>, gli unici comandi essenziali) in formato base64<br />
<pre><br />
# ./scriptlog-debianizzati.org --base64<br />
</pre><br />
* sostituzione del contenuto della sezione successiva con il contenuto del file temporaneo creato;<br />
* aggiornamento della versione corrente dello script, nella riga successiva.<br />
<br />
<br/><br />
'''Versione corrente dello script:''' <code>1.0.70</code><br />
<br />
<!-- *NON* MODIFICARE IL NOME DELLA SEZIONE, deve restare *ESATTAMENTE* com'è --><br />
<br />
=S=<br />
H4sIAErQT2ACA9Q823LbyHL7Kn7FGKZN0Wve5NuufGhHluS1qmxJEeWtpCgVCwJG5MQgAONCy7pU<br />
5TGfkcpT8pq38+w/yZeku+eCAQjJsY58qqLaNcHBTE/PTN+7h91e6iUizoJo2vH5iXBDcX7uZqIb<br />
JdNf7uivD38vnj3Dz8GLZ337E56eDgaD/i+Dp/21J9DYfwLtg6dPoYn1f/k7/OVp5iaM/ZI+WdzY<br />
73vv/5/+3b/Heici7J246azRuM86d/YHwHbmcQTbey6iUNwtbATOTkXAmZdwIFeWuokbhhEL+HQq<br />
TkQgGGdI2Qv5xXdZlmeZaORzN/3EgOwGBCPMeOLxTOLI2WaWBL9uNrLEjdmEn4mM7eweYscNhKJ7<br />
+TwIWlEsv7T4WQaMk09bLOQeTwER4bKYJ4ynsRv6POFs4+CPTSZCgPMGtpk9A9wWPElxW1iaezhK<br />
LHgjnUVxxjop0yDv/EDe5iEdBvNmsD3RInFpjyLYOC+aA7Z3f0wHYh4LF2QK494sYtyXn53wMYM3<br />
3OehH6kmDvsCJwo0k8pTA5yANg39jESYufCOuR6dWeauQ6uGx5yMp1nkMHafAdHNY5elPIR5Xea5<br />
cQTUEroBNwNMb2YN8KLwmu72n+mehy5LxNRlizzK3MZpHnoZ4CpHXDQYE6dszJqwpdOMDdgxe/gQ<br />
vjvNgcOGzOmEDjt+ybIZDxsINp2J04ye4gRWesoepND3kQNNPEh5+c3RUahfnorGFe70CHhNZLlI<br />
Pc5EoA40Yi3PzVpEkLC6LImCwAWSRAJwA8lCvmAg/gHCgoewGBEuhJvBoZyewi6LhTvnwCYSJDyE<br />
ObyDIXloRtNWFsuHCYvVO81V6tY5ec+agzauvLUx2tzZgVFngJi9AySJcDRukb1seWJvEU4IE+gp<br />
7dXfKZ9sotgKs7vnhj8l20vZFGcNEF5+FAZf2Z/bB6Odvd3toTPo9rsv+g723nezGcMlz6XQiZaG<br />
7W8cvpvsbnyAcc1VbA1E+Il1TmEHL95sjN5NRnsfDza3x/3jK6dNMDcjYDk4UqKIKPBhoScBf8zk<br />
J8yGOyvCaZdtuWwe+eJUeEgwIbdklQCyD0B2CDyKLTIbCpz23m/Bf6PDjTfvAa1/wQHcKb3W79Is<br />
4Zk3s17qNyeglnlivTjcHh3u7P6BbwKgiq+82CCfCy29btiloYPUtd5L6d88TXrmAZsI3K7aaJst<br />
gB0YKEfklsAFPZKhlEgSZIliAug3dOCfSXMVeoBS+PWB/+Bk8uDdgw8PRq12PXAp4g0MifSEWgHZ<br />
bB737KabQBNj+Fx2jxI6WmBXOcHbreHv2OnjwXuW8HmE3MtxLbE7BRmnmJpYvGbrRpsHO/uHMHbo<br />
zLIsXu/1prnwebdqK/YEqLqzbjyLX4MQCvhwE0CQhpy4IDDm0M1zJ76Y5OEENwAfccMA1QkJnIRP<br />
Puc8FZmYuMHkNEry+UOX5MmQ+yJzfnQJ0ChpFzqrI3z+tGZdE2CT7edPf3R5GwJWtf4+mo5otiVU<br />
iWfzjMhEfgybq7BgZL026IEGSkb5wmH3QBskUZSBPmCXlyQ7gV72DjfWdfu3/8RDnQMvRWw1jYKo<br />
DcoNVsoDFNRpHAgPzBMpqH2g1JaamjGgI/m8BghMOT7CtqXpF58NwPxma69Yz+eLXgh8xS6Zl4MF<br />
4jNn3UEpMmgDPg2p9SxADglnrXZ3wpQnAoUB0FyWR/baHa0GsGOzAFHWfBYwtkpyRarUiCj5yB54<br />
5LRhU2zdYA2Wb0AjMIYHXaCMG26tYNi8MM/rHQv6lex4n7RMnH/7b01aCV9nYM6di8cM5GQeSJvk<br />
MQvzaMHRBpjxlyz89l9wFilafNIgYHrhxXT37z8aj9cBlMfXj48fXTlkFdCccAogf1OBko8jzfZA<br />
OPbUWa3CMX/OQRkHCKUNA8pnae2Rw+wjXXv1cKCJSivS3eKAaKUAVYClENEXiQG8ugeAHq7JYWgK<br />
rz17Bl+u4H+9i2ZKbAMqyNgNLWugpw37qU6aUWagb4uX2IQtQLD4QSyjVBeQOWgqsvvB4M9wp4px<br />
B3uj0d7QOeo/eTLuD14+GcwdtnIfjjCIYEOTCJmHsykYvYAYGCy28t3atgaulQaCqe7z+oFvQJmZ<br />
cXOnMBBr+r7d2TVzFF2hb8KhJ65vga7DCS0OrDM8ajAakc2/woHMfRQCIgQ9DZIPAJNpFaesQ7b7<br />
fMg6MZP2laMGSNrSw4dEBvpL31I8sunOjagRlx5SwgFfoFzmCqDWBE4zSyqa+q7NLOXnyI1MOUjd<br />
AK11xpME9UEOFASyPSLToUAJbZ9kjgqlwMwYtRPoN58AAOIkyUf7ZqjhIuHglsvOeRpJ2/QDuoXg<br />
l5LdDCCQquBcF4KjJRhzTyuqWHz7q7KtMxFT9ziJwC6bw+5l4Jai2xgBRAvtbhVHHFlB9Nu/Ga/K<br />
mhCwgIlQm5BFXZnw5oUsRJq7ASlIEBtg1XhuSorWy4XyI+yF4YZmpL003lEVbdjuZayB2lF/z6Xm<br />
q4HyN2DZ6cx4ENPRpaBwQGeGwrNA2wuoIgtzVZDdCayRzYH0U6REJ40APmsEPiOQIlovcJwB0o05<br />
xbp1lKlYupwiBNNoLtUP2OOk6euIuQZhQlY7kCegKj/WjlxvNJoo1zodpIjhBZjo/HIBRlF0eQK2<br />
yKWb+yK6dOPsch7lYXaZRbk3i13/cop6EnbwqomijtSE0HuPeryO7qpE14Vh2+k6U5PDLNCg8Qkj<br />
3EIQl6megdiOuIjCQJFxSnVHMhTJu7XBgM7M+DIM7fgKGsHQvIR+yhbshiikFYg8RltcQ5CjieKS<br />
UFO7NEKBy0Fq+yKN4byI+zBmgFaDq0NA3ECVNmoZ6tK6Qha4xrZVZm1ZmGpwZP5raAjHhmLsZV4m<br />
KTqzkgNRD1wjX2CrOQ3x029LY5HvQNV5ORG1dSDIhjVw0B3IyujhIFCdwCpokUgu+bN+Zu2kldEv<br />
uCKdRV+ws8XCTe2EO+UZdsAREHIKFQAURleLLnvvWpr7cGd/D049AcYHA5QvwCpH20PEPBM6joWC<br />
CM02pRK4LTmI7E8C8MXdxu7e5t6H/YPt0WjYB3dgf2N0uA1POIX6mBxsm6bJxv6hfvxzZ2vb9Hmz<br />
twcvGrLPx60d8+LDrhlwuPdx853+ArN+gOeP+1sbBF15SP3G1vabj3/AZ+PLDNdqQlt9MDReMj9C<br />
OkNXmSJcQtr2jqZrp81WxiYugSHR8T8cg/1rxcbKspWggMmiph+wly81RMl/t4aoVmZDLGSLhlrs<br />
PkDkn8sQtbICYNYpDaRJZ0MlEeK0FUQ6wu+Bk+c8WKkCI9JAaazA4VnVwDLqH4ARqQzwXUEtgyWY<br />
IGVvDRKJbrCMJumLWwOV5DuoAkX1c2uYxAU1a0dtdvvVEzstIUqK8dZAkS1rtlTr2VvDlTy+hKxW<br />
27eGS+KitLOkNwDe7bhTSpkSQC3VFY4/DLKQ9gVM1Dq3xrEwqhTARwBpxfgIqFJS12vooL5Pav6O<br />
/astCu/dKdBCPUrVf0EhDKdJR1KiijG7hwmbHhhuXq/Z7J36Paf5dsuEM5gOOJxxj1283bp65TTt<br />
cKaj3sZRkjHa/X86PNjY3H4L/jTCkRkRnrHOGT1eoSou0POCKOUWktjzV+xZzPew8xMSAyaBJpRN<br />
8JNdV2X0B2xufBqBSRwfk5kL2y2hZtwLacs0Ht31X+MRY1++fFkKjbLb/hHEO/0jiCMV/p1xY/Si<br />
NZ9T1IiC+IkA3yPXuVzjfAjpfoMdAI5gCaTJ2hgL8Q7wvOuV3/Wfc70T6gZejh7PAkQqOBLnnDzR<br />
GiPb6oFcGkSeG+D2x8bmbnQ67L3xEEAPzQT3ORM63E0ZJoyBq5Q6+dLgRUxzAV45DN5HV0UmELTj<br />
luZLnht6YSY9Tx5eDA75DCN0rEWdT4Cjsxah00J4xnOs8QPlypNv/66CJ1FcBOExGhemPEwJuz9l<br />
t2UvzvhfrSjP4jzDZZLDY3bx2tHgRpFHRFMZN9c1u4BpXUyflIL0mzClCHN8Px71wuPXFCqnKDme<br />
B+o0/Bw62wcHewf4jmLSI275xzDVHJO/Tuow+HeE/453cK+OH1s+rwqiyej3OWgPBKxSG2PzdUhg<br />
lhtHqnFS+F8lEqSzpwACfPM+IVKBwPkSbusHelek4Lc/7mzBPnB0VWTiARZX0J1cX+CGnlDhGSS5<br />
11bIvOhrB3WqI2QUhzCXeQi9iTKozqYCjtNKnCN5kUtvAlsUDo/iOAfopUiGUB0bsv6g6CwJJwhk<br />
UQfSJRXCyLoY+1wUa6UYOw89zJ8lMCgC1RJGVeaUORtMIwOK5phkXhlarrpn53WtJ+drdc3T83K+<br />
h7a02ToKW852zcbIUY+Zmco8AnxA2EBFTxqTsiLhXhYlX43T33UapcTQSJa6iAUv07/FAfRNea+S<br />
GIVOTjnO5XiUHrdZMsdVAWOqbbE3o7QF9sKXkjHKYkSbUUlvSq8MJMrSbPwpVQ3GeEFRGnxXyv08<br />
04aigRyDHoXQBqkGDVkZuRqkrAgOCNxs4ob+BMStzy5IZEkqplGTPAmGLUzrpuu9XhVQy3T2Znn4<br />
aQJMdirOhkYZVN+H+Xw4qEyA5zbBEHWeDvvl/kTI1AsrMpQg8AXwmrQk5ljINHdp+1MRTlGPSKlg<br />
BHkFgVSc82Href9Tq0HATK7CZad6Y1OznZgwRmtmmmANGgqJAgo7Y0/ZKiyIJzL4SvsuZLGeTC7q<br />
0h0/Z51PmtxVdvgUs0zoIa097ZfTuFpUThnYojEoRTW7pbp1jHX5ZB0bxkYQ8KmijkpAV9ZhiNTL<br />
U1VKkyuFp7geeDrLk5AYysjgRICwxO2Si1WyF0DqdKdgq5iSwUIX0Oph1JaC1oPucCLG/rYyONgf<br />
ccLBbVKmVFfjpL3mhU1TV70o8DuVtk5RzpG22j0UGfZ7p/toSXAYIloIX5iNKapUzMqa1lGffAVV<br />
oQrh0piD1Z5Q0BeokvMfW6LkTJgLa1cKSk5zaBfY22WDvsSCAK/O3TPTIrWXqZrsuLhjxMHwDE5l<br />
x2edTbMJiLpjSdnS1nWd67ZGmu4eOUxL5E2Eh0su+BlL00BydFkHUPV5nM0Qk+xrDLoX9AadZnXy<br />
R0D7KolyxnRthP774rGOZ/GPmQpNm0FdzQNqwR1ltrpo7JkkREhJEks0dFs1ZQ9Si14HQSMPGFzJ<br />
feg6NldQVzQYpTiKQC7o86tiBwIFDds8yGSg2xWMLLGQ9hZUMHiEYh1RBF60ZKAIaw5w3O88OZYR<br />
44ZMgoNmlhmNoKU48ty1qqVsoWhbJ2aewsBQAOXSfKwNzhJ3LjIljsnOf2zZ3S1F6yobC3KL5Iws<br />
t9QCHEilGI0U22qxzgkgYDQNkIUoI7T2yhBpWx6ZOjhpkr4Gkijk54rGGQRcDGeAVows50lEnpJf<br />
YWNAFoPUPAhGwWcSjKnzVAVTsiw0w92w9gD7KnvHLJOMnpXSeWCyFJOmwEgIjSysLHOxl736Hhzp<br />
78eP2o0VizidbtdQo6IB3JorlOEtTTT4yiBw5TSKuPeNiKBbYiNTM7WCi/hdsZlb7EREWTgNhfL2<br />
Llu10ZDCzsb5nsFsWfcP8JWy3DRzIp/SAshBYqew5JsPcUALMMgjZuboJWHY6BA2dZjI6RWHmwcK<br />
QCohqYx/KrW2lWEhIZc5uNur42E4cJX2+Q5PSqQs87noY7AscFT6u7m0vBp3ULL59RnbwlzM4yAC<br />
W18V1wGLg3i9zsq0qjNkiZ2Vy1Eh0bpkjkS8YRmiyrPASlVz7KUyntdaWdzDvdF1qT2LSmodp11Y<br />
EZp4pqijEgJZXhIJ8iLo4RQzOERrJaxI1SwZUoqYXWN7wEzd7Cyr2/fC+SIdUsVOFVsu7bvyzVqN<br />
smdW55dpr0wRV8UduEHUamVdo+FUuYkUWS2blZcGjQSZiUY+ZcpoEuSUHpW9q3stiy/ttN6jtq3M<br />
tR5X51HCxtE5hZ/oF6KXoMt2C+VbmN68ZCOqavCoR7INlVX0s1xGISOD7tylggCjCLQC6KX66cYF<br />
2AEi1TaJPoHnaN0vKFarwm4astTG10ccXrJyhkJPQGVCaoZtaWpIIDdhqsBVhB3Fs5c8IqyDT7Cg<br />
RIJU8FtR4oONv26iKhRHMV9kJMV8nZ7XoK5k5XvLwdROp6xrkQRqlfkIu5ShnFU3YrM2q64kZ22M<br />
WMmQTbm25Qqf28sMeSijzLU91Osqibpd7V+yNOA8ZgNbxoCvjFWYIH5YZ8HOztvOkrw5O8eM2V+0<br />
W/OqFD7CuKFNkxgBtUnIyKKa2U7ORbxWMyG1s87vdXNSmOpvmXQKwGvmxOZrppz+yDKrItehu4RK<br />
2cmbSRTMpmIoFSEFArVqlr8rbHdtKXvtqf98uUs+vMqsgJD59le8usgDXsgGXR13x+LVCqWhleMC<br />
v0tbRefDNBYu+Xj6GozF4lTFlFFMxuQtJJ+behOHlYoJvrhg0uDDDFgVmM6hghbLhcZ32CYfjUVl<br />
YFJtiHMzTFl9UoZJbdfAxNqQ7+FJxScVPLHtOjypNOQ7eMrikzJMarsO5j6ieTNM1acMM87YdXh+<br />
2P0+TKpn6eShrGuRMOn5GphUafKdtZtyFgvPDL5fhydWmXzvjEwpiwUTRRaQeMU6L2s1FeKiXLHk<br />
QORIyROmaljXCUt5UVC+l4dWUbNWYGE+J1/GC0BrwafMzxdpz5FmLWkVL1V7qwrMzzneAlDJRlqe<br />
UrP2xc3x4LjgWVVtL5AnKdMYStEoE6nAWI3xmtWd2KIxfmI1QT8k7Mb4qdVIZNkYPyv3m6JHbdLo<br />
yrkQbBWIsN0YPy93JorpKSpqjF+U36rDIDNL2s2aQhrj347ZRqCrI+1taoz7x+wj+siuQ9stCxOz<br />
JOfGMS2SQB6fBoLLDVfhQTTfqDjXp7tAdlKITrDICVEQTxSKbjzo/HbcXpFEiCrmIRAV/tt5xdAW<br />
QwvP3Jd0WeRJS1FFtcztFV3bXgokDgDuNfLREo8wWWnUmjWqIgEtAVgd9cQaVZFxloirjnpqjapI<br />
MUuIVUc9s0ZV5JQlpqqjnlujKpLIEkTVUS+sURVZY4ma6qjfrFEVaWIJE3uUooMToJlPBBDI4FBZ<br />
yXhlWnigGltEl63SVH2YiiJAalBx24Hu02FhQr/Fuoq86VafpWOt0o/2CsyI9UAMyFvdK9D0Jbps<br />
08R7wCfFiKe+TaHKksmG8un+rNtYWaGgqJfnA4pHIjh121teddc9uG+Hkk5FqBIz8FSUXM9gHyI7<br />
rUkhnp/owGIdNv+7lGRR4YeK06Z4dQhlir7hq67eP8bbFpjjE6piJQlKF0kSMDKzov4cZdQYVBtr<br />
3lR7Q9oG/G36yYYgSqz7rWSbJRjGr71kg0kLPyomxBuR5rCvOW3T5ZS6oPBKs8SVfSJ5JTIqXytp<br />
Dv7nX/+jeYH1/FdHoVP8WoJGm7OF/lGG/9Myyc+3buKV/H/5GweYXJLxfGvB5NkXywY3hO75XdW6<br />
1tYvOuh55YXBmtli/MkMbFiakiJA1VnpWuKNs8Ic5sKgZOJkGqEitK/xnESBX73C07zAGxRXpUof<br />
+aMQppP8oQh5HM61AdSwcundz9WtVkyeYKQYDRGhYqKlW1Ui0Jc4LcqnMHeqKpR4lSjV5W1jfoHG<br />
bA7a1lIR3IRP6Kc1iusZP1Di1mgOfqA3+IyvlLt6I0HO7Wt8KF5T6zc/pCFwYWfONksBHpWlBTOA<br />
YglHYUvfLsFfXKhGgpRpV4BXWskUeB5WTKF1hqXJxULYBH+rAD4CN83y2Gd6YOUnKNaZde2lsg8j<br />
ufTq7x5UqcUuG3Yz+8iwFEB51iKAmYqfMGAP3rAH/yyN1Afvug8+tNpL0/8jXqJmljKzbuSpOhFK<br />
YUQyQxi6qRfJH9xBeZByH2DgZTL3xOv6/BTpDB6P8Nn2fbk/+QwzcRXucpPE/Ursbqb18TJSlNk1<br />
GTQCug5Xna7DnJ7TtoJXPAMhOVQ/YiKTKW6iMqF6IBWaGyPVDLmQT71eE8f0jo7okzhc5kf0XSXZ<br />
r45g9T7QMVG4XZZrlq8OYvoe7y/ZJAYWIsUAln5LxrrRb6k6vJxNW93Cr/J1C97/b3vX1ty2kaX3<br />
VfwVbUgeXkYgLSWp2ZKjSmksOaNZW3ZZjpOtyFZBBEhhRAIcgpTsSMrz/ox9nP0d+WN7Ln0FGiQ1<br />
sWf3gZjKmAK6T9+7zzl9zneayoG7iXrCOCXrfezEn+PD9wwWQkozlO1U0kDs/yq6HY2J0O2I95Zu<br />
yU2KeAmMOhIYUB33c2x/hiHG29lQGmeolPc99as3DPS64cJsaIZKUfbHRQVxOi6Gf9sFKSXXv6i4<br />
f2knDtCAmmbSiZqNeK4dnZ4eH7LUOEstj2Zxksxu8umVeBll0TABgZlXEvBzvNGMP8UpLA9CRJBp<br />
ZdIeu6+HJOnSRC56QaMh7yMRGIHyBpbdZ6HtMR1V/orEBWzefGmZT4UxceBSenQhiqwx8f1WC134<br />
JPcWQfHz5g7VuT7lKo+ayShh6fi3fyhFpaoLP9Bd+1stGqgMRwlEz3i/15sEimIbSEEW6leqDekV<br />
gPI10CVVA42QS9Xgd0A2u1JIKdEurtzMmAVfkEEyhYvlUiO3DppJNI2A5H3vrMNnUYjgLtdJfNYx<br />
c0mWA53p7Gv28WMoa42v+sV7JvzhTEW1MaLf/pihCFxVCc9QOlXcCdHQy2CK9W+5X7udq+QTDUun<br />
BRzQFK132neEyyTMFGq3291O72xHeJptVtBK5exBU24s0t1OdcKe9dqtbqfdEmfwz/ZZAIW3zoKz<br />
dhuqUK3B2Veed1/bS3txxSb5KO1/gjMXpnmIoDjXEaJJWXUUTaxBs6b43dWLOpDU82wPmbTplypH<br />
NQl9jFam6cw329jl5cEzOeFSXH8DxLITN7ATjGDyqX1PfUoKMY76URzTdRza7DX0JsGuV1ky66nc<br />
9mWM4mPo2hBt/8nB3Z7v3uIFlDdhvLZC7Nr1+FZ824purkT4vPnznnj/x6Zo3rKUIbZ2xX3TUx9i<br />
iWibTCXzY+i57A9Jn+UeauoaplLeLhL2kUB5BQ165pnMjj2DCGh493QxFQSChi5/Yitty0s7dYXF<br />
3DlmEHdkr3cjrVm/Kt9lmZ5H0th20+KvsMXffvstU1JllPNYvOWW+WJSb1ZmBgtYtNMVErICR6Ph<br />
7pzNote0CDa9G2jTOvnVfqi3Qyl5SOs/3AuNQZwlxi2U4lDRgtyf5asjYX0s5npu+9e34M+wz06U<br />
kqtp+4QO5EuR81SCB82G+WiG5SuYBT4J1U3gLO+Kd8pJhaR2rhwcgMlUylZKa96DM6cH5fWiyax3<br />
CXwAnMBd7ALpdrEsXXfHvS5XApbxcIKCr0nSwU/0Awnu1xHkK4maw5+GT9Exp3uz9+EU97zwEF73<br />
LsVTsTVp6rwaxwtWKdLcbUuryMI0z245G9PJXWJpr2/LaWpd/Fe6h1Sj7P6jKq/ZTPYMITM2Siw/<br />
WI38hUEgnTR3YmHTPU1WpqUOrFKlmZY7VUCNRI8YVKZlWc6LRw3nvpRfias0rTLibJO72TLVCn7w<br />
zVo2+seDGsX2W0X/3pHf9TJ13Z/khIf16tLUKHt5LeJFMhqcM3IC3/RqldGBpDRNXB8021XGscuw<br />
7SyM9xaKDJYsYV4W3ren8i1rwe/ulOm/0yxLY6Kd0p5p+1bHWDgVN8OE758flYwV8ENbFucxJ2Dl<br />
bFLu0y7skGwRx7uCsZ5Del3H2Ysq9ibtR9cuDAnBFUbukKjOxER4TCA1Ef5dhK/QNFIjE7pTvoIU<br />
Cjzk7eTp3+/tqR/g1N9tB8YCHcsgvzqPBxY6BUqWN7HtTaOyG5uHnKU0qtI1znIgGQxTeRum+4Qc<br />
U0D0UQCBLswrTsjf/msJZo7ToXsikHdVo1jV0aX3GliTRGuGykvnwQ5haEN0FwRtS/LgEYUVTdwT<br />
jur4Cv9qowDjhfLBr/k0yhL77m9TOHA5amOSMD+STj5JI4s58FOqmVQS7tKaW0Hvw/7pfu82eyr2<br />
IgF/7D8HlqYHawiml4C3F9H9PaaXlYB5dicQMx3tmV6RfY9qdlCWGh8hG2l9t4RHs4itMwmmC+E+<br />
OvLikrlqpXXMhmj4Jk7pwZbGyw2cdGQjiqYFT+w94qCG1QjqNitp5O3S3mSzZ7sehIpNyJHpoiEc<br />
pLavYKPcI479knKJlgYJzgQPfJ6Fg4ph4UMwpjYRHVid/1PnTsYumrW0FoqwxmwFCisCrvZKUKv2<br />
lQjX7Jau/vVir/W59raq5HbdFX5P6S9//DWW7yPOMJWnDC7J/kCEPuhnWLHKME+vY8/CVdbSciW4<br />
4pDBex1VvdiXdyxOVWebLpVtr1214iVFz3JXip5N8VKlsiED1M4I0xImX05zHM/7SDtu0zGuowLw<br />
ZnEJacXXX3/tVG61CyG+SYu5HnZcAiw3XYgrScN/i6XYRrVmt8GCJNfGfiulnt52rqQdqBCJYa9P<br />
b8a9CuydDl+rI6E67EqcGU8I4TpolFw92Dnci+SLF2DPS9NEmv+7Z7eyilDzQsusPle3RTabrA1s<br />
KoeSUlUtt3WnvrpxJkXDMnqtOLcvzIxJanIPl5Y8/CXw1B0lKJnSHJ/i4Yas6g7S37e4rkvm74RR<br />
Kb1w631ulcmUGT9V2ZpxcECA6lCgny9AyaCc1WKr4EK0R9D/mUvZUweiYpafkZ+3DSckk+OifPIl<br />
TVWknR56zfbTqCArQmX8Z+xuP79HxbF9CyixbuQ2KAgENnUM7ByvALR9Qi3HeTxOobdgI0qo96S2<br />
iBD2e3Pymw1ppyaod8HXNnzCn0sOnr7GyfnNuJTsp50dSDqI5qNZiDLAKPoUjlkVG7iFKV+p4TSf<br />
T+CMDYq5XaZSthSfCjkdSxVlVXl/NoIeHkSQCdjhMMvDiacsTP+3fA5szYgyfETvT5MasZeB63h4<br />
pptomqXZ8GEZa/pB4jiH/eEsn3COdIYGo3gLsP/N0lyjQoSjJalitIn11DaGQ2cI2Wt6QX/G9nq+<br />
jwo4emuKHhWTfirCqyyrTTAvLkrfMKRDbwDz56raJvp2MbpK4/IUHWAQDJ6Z6dR+1417nlqj8/g4<br />
m3nbA/R9/TAoUYdm41JLVAHOl/koKUJ0WlRfrarKz+XXqFksYOb0k6I7SotZiWj5c7VdqlMhZdiP<br />
mG/C64+lyfD0KWpSxZMrGP0QrUJnCwihxErAPbJV0/ENm1wAjzSbRP0r/In/imAEHPrHkG1iuFT7<br />
fTqGZeIpiEY+vhoX0uu2zN05SOWWbTKZTZudkOxvbyV52BNLY5Dx/VHPXHaURqGawDPAeKNe+GZu<br />
OoCDcZAOF31T22/58wTlcRDg9QVJXSdNB1fpCPgFmCN4+Hum8gRv28L+VyL88Rvx7136H8gohyen<br />
2GPf5/kQmiLfV3NDTfDyIvB+gf0cz3w1fcuNuFnQ/huqcdGPMt9nJhxm1oTB24LRNVIsDwB/6epP<br />
nP7wL89eV062y/4oBT6l6yNTMigoXS7qHNUVkY37GLgsufb1RCVR2k/MgMbJGKezNZ5usXBWlgwu<br />
arLdpP0YEv+I/9SuFbNU2JnALBQ2Oa9fKXjWfwRh33SDWSTOt9L6UEf7T/j9SVcd7/zV2MF0SXzp<br />
FZewixCtcgYe0o8E1zwNMYX1Osvn10k0t98g8EpkvYBTzf5zMBxNP1p/R+N4OJmvuslE18phWF4N<br />
OLaf0m7X34+SXwJOaH5h9xNmo5f0f93+YFjqZDtj9Qiy31Yo8pzrjqNJ3R6CycLxFSdU6ahn8Msq<br />
vUJuBF1x2o+mKO9i7DhGfzNK0oMXpwc24CA5HpR6So7GSA6WbV0aMGdyB1VKYHN8tiPCI9FEond/<br />
OcT/Xh7fFVn883n4/g4Oziy+u4yjLjK+ffqFW/ioyS1jc+4AMwsiS0Z7n4O+uRYiBYr0myRj4zLY<br />
gMBmIvCVimeEkJ34LoT6/S3pz0i5Ri/QHrBbXAaOgHSWHZOMbtyIyuPBbu9TuupwjbjMqCgxranv<br />
fqlXEKsvuZb4MTYECN6CyYo7xsxYH6nOy6cRQRVxPAmDAVmaCz793YM8gwmzg5TnfLX0Hb7xIDRQ<br />
Egu9xeenKus7TSqVXHyxxPSkv9oGCbFUrWd+/R/FCpqNJ/p+U5p1uYsESW5UFIxav6i+b+rl5skv<br />
RW411Q/zm4xANax0VHlz+VDSv8tBDrg9p9T6WFGZpknRJ5O2jTpdpIRgwSXgLV1Dpmi0Fh2FtKQg<br />
tGI0qFmlsrAi8E9/+pOjCFRFO9uH6x9nFTo1Cn69NfKm4HjycNfqXFDB/uVv/yPjMOEEv5DwRzpa<br />
E8ju8KZl0f3tH4ZAyYOI4c5IDyoNZ5TaX6PlKGO83oetlnQaaJ7Nmu2bdHZJFe4hB1DtBzSt9u3F<br />
LiCWnipHOvBDZbIwesfcKgRkhWIWA7Pm2e82DLYOZWSXC/9k0Pcxeg3xvFtw+7LBMDVhucnGhXyj<br />
estJhTmgHVHWxw1LbVK8pOVOeM1YKDB482g0LkWtc7ZIpUE3+yTRUSovezF5q3RtalC21IlTPZd4<br />
ahlHd+ilurMZ1YA1Pp+uqatkYcTB67f26TypcDG1wiLNxTCC9ZDO4NiaT5NghfSDfJqkw8zJVywR<br />
OWUwicWJUG76BEmHUxA5V0obQxeED8kAp4tE4FkpORp8sLnXItmcxcF4Pp74VAXwn4/3tj95RFP8<br />
jDBQyTTJqtJt6SvlXy46VPyDzaxhB8+l82aO2p4C9WW6tcz4zYsLdhetn9aLvI9NRchn1Mtb1ogQ<br />
2u/0y8o9PnVdxiIpar9YMfoFVdnaDoyRPiu+7C3pSXsJp84X9c3UYGDeQMWVcMc2BMB1ZCCGrNBl<br />
2K3EoM0u+b4mkdNjoOzJGHMRnfc4tFcktnZQze6a+8tLwVKcqSwazdij361bFzkj2KQvIwlans6g<br />
DArObd2ly8MBq5VPZ8o0r69gcmDvz2bTTwxgQN4IATK+gY37QWVyoAaXr2HXJev8Vi/MRc6Oub3Z<br />
qET9UY9RobYbHth6y0Z6DksI1982R7TMpyDsoVtymrG/He8Cz46fn/oIERdDnilnLWjtoOh2FEHR<br />
2Reds/bPH7bfd7x2271AnDVqcPVLNHXVPiNNdL0G/mwFitTBf6iXBSVmouz1qpZx2RAotwjjqcPx<br />
2FWjqUa4ytXMNlFKq4U1NjbUuLBZfetmEoXokdK+o5+T4kr+ShF8IZ19Uh9kefintCQPr5JPS7wm<br />
vF3j6xv3XqimT/gq3gDiqSCZ2+oOm1eylILpsjRwbmwCH12WaVQ4T0eyEdxfZSNd21pVOdUEU656<br />
3O2Q20NAHkkqu7JzZ4UDRuVtltJvNam70OzdBsQHChvSpwddvEnq4Ix0O1j2YIqUcXAZ28KqqYMI<br />
wIbsUIiyafzLU9ErV613+VRs3Q6fTp7ecy0XqT5Uk1kewNpzsNSKRTPh4+tqbRNcEaoTUmVmkZC8<br />
HDGuPjRooo3GQS5hit0d0dra6SJKJ5akJKqc7Z6ks0Lu+njxGMoauXs/W90jLRXvftHKxnSVDbq7<br />
U7fDONs2JHtop0NbV+h2vFqn39j/aplt+qPVdgWrlTAyqKM+8iwcosm2bxtK5tpQ4rG+qaauJUwe<br />
yye4yCfTSK+G1XpWyjxVmwi2QjgDCmcMkTlDlD00/3PJKT2cKDlW2EYLGK5CcmmflQ3R/vYo3ikv<br />
vlQwzHaK7FYdjyK64oVx+VDgBmmFRUEGhYXUKo+CNktVLsXmUfAo4UJW4UxQp9BdRVTbbCCEqxvO<br />
1dKIxMnFRVQOFqNhoJvFvLmtu5mNEo01ZI6eIwh/YAVE3cT+2ndKiIzVuCX5ImlMvQuprX1Qvq5p<br />
nGO/4BpcUMpb41lODp63O5ubnd49ezZY+j6rerBTtdniMVFzQSCoFANXJDyTbKq7SPbxY9GRZHcX<br />
0NXwF5X5hmWQnkEXUNq00IHU1pWrF477CxZvWwpb5SuVrH2cbtJBumtlOEVGm9XUu2YYldeKXl32<br />
sAfn2PkbpfiVcqOrkava7pG9dXh8+vrFwX8qI2Y4Z+Zwluw9ES15zaJAvdiRikVG8ZMhQ0owSQXG<br />
Q/7aC/ee3BO4Qy2/p0KJuJR8WSygarXlyWj3FZeeYEGP8FYc6KtYYBQD++7VYiGJttz1eVdJ9eEn<br />
ZQTnWpe7o6X+VHbqsGx7RHCvd9vLB4OzXpR96j0ShXwLvCH/CErsYSfoDeFYIwIffhbvO8dHe+KH<br />
7CrLbzLMFTfbS05eYfWz555ZV1i/qtYZfTX+L2pdZmuzqjO+BebCp3Hp3lm0GNxJ/HiZJL98aldo<br />
vmiyp+nr49dHp28P3v5wCgcAgQTRwo3xZjpuziWKlXXSMK84SSdJ18qMiG7IOnjypp7KPdlXMMTl<br />
mtXepPtYfjeJDd2vBpOFmA8Hr3/+eS9Oh+ls7/37zlmXRg9eFRMQevAVSylKSBG2kOKMF4WddJp9<br />
7xjmyvGslSJbahPQ7grP5CZJePa5RKiCZcoDZxff/t1zQ5sbwOYWib/i4U/C4CRPVxgHnds3FC8O<br />
Tr7ffyYqiX/PoNx9f3Ry9ObgRffZq5OTo2dvj1+d/D8fNNmlifJ4SnWclXTJSBqDO8k4S2WULIe2<br />
ec0TKbdqDI+HB3dF4CUKVaEVGwA80RJlhG8i+E0DuKbMjui3Xi8IKOeMEpdpiHAMdalktnIYFsOT<br />
SrEPLDR4EuimPkXhZOFZLLvdiCsWMJ/c/MqSC64ddImLUYze9ntjk0TlUx2yJCmWjIg6+ze0+TgZ<br />
R1fEHjUlQfJBeI7d+9XEH6+7qk8jq5ShEmfOALBEtahS6ZT17h4dpaOhVOH2HFwXvkxFxnHb8t2Q<br />
/YuG7CiYkm1JP+la4RhiV8lpuTf6qdfLhRp5ls3heZpLv/5NBBp1dT1O9CLL1QaYszL+PEhhtGMQ<br />
RzlKr/Feu2uD0MpLfopzRM3xhTpiIIRRW1UH+9tfmyKfzXIb/V4pAh9aL4TzWVyt2FTLeLDIFlVc<br />
WJiihhxePmS6edS/uflaN4quk6pLUBPbupUVvGe68KbVkh0aip12u76c/Io9bgoRQg8FJTA34URr<br />
Iuwa/5ryAAu5OEU7gYnZshh0wHMr4Dp5mqXnvuctVG6+C02Xykg9sqGeLWRhq1WIMpqFSWmSSprH<br />
JNSjugHYSOiSgAVEDkMoHRXpdpxheUvKG1bkzS/wzMRwr5Kos89EpIag6E00G1bs/LjS+Rt8HUhv<br />
e4Gnm+qwAUZJxo5w+lZeH+ipMQ5iWYw8Maf5CD0xGeYjkjAfGuADpX1bIUGXmtV9+LUurVQEq86c<br />
Tfok57teU0PUF+it+50fqsFOz6dQakVi7F9Fw6RAcAayBBhpa7uU9dx6+yBfKpU+8IUulGGBjD2W<br />
YYiW7gsK5MQU4Fng3nHzxj4jwC9jNIMGoujZiyzxGNhBoPHOVWdgR/r0ViFZFeVTdgEjotKuiDVV<br />
oUTvjCx2f4rf+A7yep6PnC8OvAGyJ2w2vC2tjqaOzVMURzNyYooUnk8mFZeMi4zKhea2jB/AQW3J<br />
YVOzRhzPuJhLVWRGtDLaFwzgrmV42GQzWlzNA1jNkH+bLGvpRzLrk8EZVbjhRLsny2cZ/wBbJ/Z9<br />
jRRPSee2v6Bkk7iE8xCQ9i6omqBu7bp8zG7QqLlntRAJpDqmzsK73VgeM5yqtVWCuxJhKNu9Egls<br />
kbz7s720lj3ILLtW5g+oMCYX4SUsc/T/EOEu4RHAuIY7K9eZDNtXq6jlO28hu8AwlW4IW3q+SAiK<br />
ds0RDwdafpWE0343Vph6MgjcH4yE26iHJVAlC7M92CVpbAJIpwN7+dNW2Ro7z7Kd78vGKF5qVELH<br />
bB8OsGn6+c1K1P7VRF4Gr4p7/REckiBXp7007t3Cm/PrBFJMt6FG8bw/OyfjBfWHnAvbF2leqD/u<br />
m/aOoz0oLdwomprV0jrB6pp0jQ5XoWKq7OGPX2O9Z2hQhii9/kYbAm0Fie9yqIYUMmB78KaOlN1n<br />
TMxLSkEVr0JK7VqBn9Sfj1+d0gbSrW+gPVjlWvm419LaoevChf3+ACnawTVyuCX2iUbOl/3jRGJ+<br />
SkaY/LPhmB5jPgTbsC1+ZFIz61Ked8/lF++08s++KsOlyS/uOOwvM0p06B4p5tUj8CYWl22UJipS<br />
JYML0nEySi96qgqBekdOQOUv5b+nc7QghM1XvQzHaYH4nUEpwiXu2anXcR0haozV2dZtel8W4ZR4<br />
94ZplOZpWQ+DFKwpE5UzSImg1Jl2kAWJ342TAdkrjPAwjZXmw+YE8W4478vA3B/DgoF21IlO1uby<br />
DsuGaf94LhOeq4Q4qfiONiT9VEYu7tDm8O/zBAYvqNAOZAxlglcEbvVX0fvwLhrNk72tnjAAk0+l<br />
R764b/6+pt2ksBJvlreM0z2kYS7l39kuxDZLC3lhUivOFXkcp8UgyhgYhFH70kmSkRZRwjNqtqQl<br />
Q4kNQT4Yo4ABy4YBoNvwB1lMX6fqkIUdK5VEPHKGHfJIixmaJ3YqYeHPydpaiJDHpj2trdud+/Ye<br />
TuBogtjjMUILY61E8zvZ7iT+DquWxknRaiIP3Gw3YQiAagRMQQjMwHycFVL9Hmr4AEbREkEoHk8M<br />
m7YnHl8/1c2Gv2ZtaSX7JjHg59BSO0wvdM4TrTR3ppm896ZOkEFjy5wXx19GfwyGVmSXjpZCwnxA<br />
V2szhJR0Djrg87QsNeoCUwW4aQ1IWpzDtof4A9ZpgNPufJLGxTkaUFp/XqCKOo3xPwyw56bD+Niw<br />
Gn6w0MrDHJMi4rScySmLcOm2UbqgiRmGENmW7gmvjw95xiNeG7opkOjGCVX9hVsnLDmNcxlXGMR9<br />
51LrdxRta963duRZgx2AcdXd1usjQibZLaWBapbVPsEWfGEkPcxQ1bzJ2LtPsBWSZ/BqguQ/KlSv<br />
dZ9nmI1HHqVD0E+mfThT4lQaY02NSF2V8Q+Pej++tKwDHNn5/GbsUQsdJsUVAlEcZdfpNM/GZDUh<br />
fqRd0nE71t5kWAa+uVX6Tnbc0goQuVE3XJihQ367d5aF1aNLwQtVzyoXIDCsHA0KYaZyFmhlrNq6<br />
GjVBQNU2VomSaXZCz3nYUOPnpCofLpvy3gG4vV/SiDTN0FtpAh0/TH/7b5CHMzlfaLbcOwzCprst<br />
2dhpx/YHxFW080Eb7T0juCrGbMQS2M27Gnyj3E6gE+xLW0dG/b3PpviPw6NvZJFx8vXSMis3dv9c<br />
kV83JLqT0xVDnPphcQn7uuwMYb0ySpWH1mdTfH/y6uWROEUy3pI/DmJeaKrcj4M+9EZ0kSMm6Dut<br />
Jcl2yhC5u+Gi2myKn5CQt8wcTveL/KM97Gr+Vxdam+HutBWAzKwmfi0GVCuikH+VFdIWf7Tn5T87<br />
e06ZqtCc4IufDo++Q+KvuII2jy3rbI2j7lax8xnn2KZVeEm6PIX5nRd9xEL0yo7iM6yok1cn4u2b<br />
V+8O3r56wB0D7kR86yElUzL7RsP9qLD3bXN8RA783UzeKzRsLYi5VABmDPjtFCMauVJpoz42teYg<br />
K8qshrreXWWv9ku9yo+ztozai2B1SMuIFMprfxhZ6PdTdMJIs0T3IKuMRcNFsmZu02dtbsH7iBax<br />
qhzIi+/SUjguMvYGjZMLJJqUr20C9EcJRFtVUFJEgmiJoU3bPgAB0XsUSzO1bkdgxm6HXnnhhtoU<br />
pLMekdtn9BB4kIi4XvCB3sNrAugvpWvzDOGLBpQTVUQzFlFMHQKrgUCcQ4gSXgCNg+LclqCJN394<br />
84L5ei1JtaDZCuV0MJt005mEOSUMBv7Za0udsBz/aqiBXRVqIKBYA1HQDtQ9aWFFaerRmJ71RIuN<br />
saGauTI41XFIUWyJPSVagQqCLf3FKkmvZuo7mrI6Ghg184aMzEQuMJgZHhJQVCqLgswLIihUm6XF<br />
GRZyU7LXYOky1TVhgyn77IEvxFDnoxgdzuhGFbdi+1vtB1ltz5d5ZmdqaMRgk2Lr1YvD07cHf35x<br />
5Mm+Vf/l7dHp2+OT733VRNmgrjho36ImQmXs+tiHq4k74e3iKSylIiUtG3T0oYzUpU2cUwQcZZWL<br />
dTleXZ+CvGbyfSaAwsS+Swunz74KxRFsWevYgTxvmpnY7HQ7TWxh86zHm8xrecuK2pSTpwJ2H1Xg<br />
drejCtzuTe6bKtxGo+TchSjJaqXyZNrW2MXC3SDknDMXRspE6BeCERlGVfHNwe9U+X2peH3wRk9j<br />
aH+sAFrbiVt2IEj5+iwjGm2HiomKpH7iPyg4ygXoboB81hgogcOjd0cwZghLQLexIMmxvkmW2ZUW<br />
V54OI7tCVEWDlN3kPqfDkM0hSkB1myoAR+YFti6jWsu9yKcma7Gqro00W9cM/K4vjel+WfqMOF58<br />
daOuAqO2G8uGtMQvUHAruvnWE+0sQB7rzfGLI2SyHrF1hOIo3sitjfGOsb9nUVe8MasS+g5VF7Kb<br />
sG/VVs+RS5XjjXMzvcwsTbMjBhfDOHbE88mIDRRbdCNBvlvWNgFVIfW7c8o37EmqwxXK/oIFnk9B<br />
CpkrZuBEG5eprZ21FknDWIvt++homzUic1qyVFPEnNhkwKy3JilJMd+1tx0PEMk9NixLM3aQdM3J<br />
6nhCzaZjD2l7JLIHu9d1KXVU/choi0Fer6onJlcShHlhc+dDiuQGjd12ZzTe1lhuPdaC6cCU6wj0<br />
2yXMdq2j1Gu8oUGTzKJg3KQt57y5sw+nmtt4PTmcg8yfFltMrB2z2uFz0Xw8EY+vxWMKLsnq4V9P<br />
xa+pePTrgU3Qpxi+E/xLhDNtOG2f3ncPqfrnrbeqtFJcr1BvVenVavwZq2vV9QHVVdzOnWS1llVY<br />
cWSfo8aSVvMhNQYe7E7xfm3DPtTUVnOJn6O6ilhz1eqSfQpuC8f1xpIprf+WDn4J/b/KeYURaamN<br />
93RYWYZ0V8PVbOhYgF/Blq5qSodFVG1oWDHxuS1PXkYUNOwz0uxDv00bjfMUee1G458D4deo5OfR<br />
NRxjaBPAoNsIlIs/6LIJI7VT/F78F87sPIolMgyhuTckHr1bun2y2dGhTGq7Uk5qDj3QQL6B4wT9<br />
2/pZP+tn/ayf9bN+1s/6WT/rZ/2sn/WzftbP+lk/62f9rJ/1s37Wz/pZP+tn/ayf9bN+1s/6WT/r<br />
Z/2sn/WzftbP+lk/6+eLP/8LAUE9RwDwAAA=<br />
==Fine Archivio Base64 ==<br />
<!-- *NON* RIMUOVERE LA RIGA PRECEDENTE --></div>S3vhttps://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&diff=44293Creazione automatica di un file di log per inviare quesiti al forum2021-03-15T21:22:01Z<p>S3v: fix typo</p>
<hr />
<div><!-- <br />
NOTA DI COMMENTO RELATIVA A OGNI NUOVO RILASCIO DI DEBIAN:<br />
<br />
* modificare il codename nella riga "#ifeq" sottostante con quello della nuova stable, dopo aver aggiornato questa guida.<br />
* In caso contrario sarà mostrato un messaggio di avvertenza al posto del template "Versioni compatibili".<br />
* Il codename *deve* essere scritto tutto minuscolo (per esempio: jessie).<br />
<br />
--><br />
{{#ifeq: {{Codename|stable|IN_TEMPLATE}} | buster | <br />
{{Versioni compatibili}} |<br />
{{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. }}<br />
}} <br/><br />
<br />
== Introduzione ==<br />
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 [http://forum.debianizzati.org forum] per tentare di risolverlo insieme.<br/><br />
Le informazioni riguardano i seguenti tipi di problema:<br />
* Connessioni di rete<br />
* Video<br />
* Avvio del sistema (boot)<br />
* Audio (tramite lo script ALSA prelevabile [http://www.alsa-project.org/alsa-info.sh qui])<br />
* Sottosistema di gestione dei pacchetti (APT)<br />
* Mount/unmount di periferiche<br />
* Touchpad<br />
* Altro. Verranno inserite nel log solo informazioni generiche (già presenti nel log creato con tutte le tipologie di problema precedenti).<br />
<br />
Lo script crea due file:<br />
;log_''data'':contiene le informazioni in formato testo<br />
;log_''data''.{xz,bz2,gz}:il file precedente ma in formato compresso. Può essere allegato ad una discussione sul forum<br />
<br />
Se si vuole, attraverso lo script è anche possibile inviare il file direttamente a [http://paste.debian.net 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.<br/><br />
Prima di effettuare l'invio, lo script chiede un esplicito consenso all'utente.<br/><br />
<br />
Per usufruire del servizio offerto da paste.debian.net è necessaria l'installazione del pacchetto <code>pastebinit</code>:<br />
<pre># apt-get install pastebinit</pre><br />
<br />
{{Box|Nota|Lo script è liberamente modificabile.<br/>Per ogni segnalazione, informazione o suggerimento fare riferimento a [http://forum.debianizzati.org/viewtopic.php?f{{=}}13&t{{=}}45098 questa] discussione sul forum.}}<br />
<br />
== Privacy dell'utente ==<br />
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).<br />
<br />
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.<br />
<br />
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''.<br />
<br />
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 [http://forum.debianizzati.org/viewtopic.php?f=13&t=45098 discussione apposita] o all'interno della pagina di discussione.<br />
<br />
== Utilizzo ==<br />
# Eseguire un upgrade del sistema, se possibile, in modo che le informazioni raccolte dallo script siano aggiornate.<br />
# 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 <code>scriptlog-debianizzati.org</code>.<br />
# Assegnare i permessi di esecuzione al file appena creato; ad esempio, da terminale o emulatore di terminale:<pre>$ chmod a+x scriptlog-debianizzati.org</pre>In alternativa, se si preferisce, è possibile eseguire il seguente comando:<pre>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</pre>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.<br />
# Eseguire da terminale (o emulatore di terminale) lo script con i permessi di [[root]]:<pre># ./scriptlog-debianizzati.org</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.<br />
# Leggere le informazioni a video.<br />
<br />
== Parametri dello script ==<br />
Lo script accetta, in maniera facoltativa, alcuni parametri:<br />
;--tipo={rete|video|boot|audio|apt|mount|touchpad|generico}:specifica il tipo di problema<br />
;--nocompress:non crea il file compresso del file di log<br />
;--nopaste:non invia il file di log a paste.debian.net<br />
;--update:aggiorna lo script se esiste una versione recente<br />
;--base64:crea un file contenente la codifica base64 dello script<br />
;--debug:crea un file contenente le informazioni utili per il debug dello script<br />
;--versione:visualizza la versione dello script<br />
;--help:visualizza informazioni sull'utilizzo dei parametri<br />
<br />
'''Esempi:'''<br />
<pre><br />
# ./scriptlog-debianizzati.org --tipo=rete<br />
# ./scriptlog-debianizzati.org --tipo=apt --nocompress --nopaste<br />
# ./scriptlog-debianizzati.org --versione<br />
# ./scriptlog-debianizzati.org --help<br />
</pre><br />
<br />
<!-- commento (leggibile per chi modifica la pagina)<br />
<br />
<br />
*IMPORTANTE*<br />
<br />
Se si modifica lo script è *necessario* seguire le istruzioni alla pagina:<br />
<br />
http://guide.debianizzati.org/index.php/Aiuto:LogScript<br />
<br />
in modo da aggiornare l'archivio in formato Base64<br />
<br />
<br />
--><br />
== Script ==<br />
<pre><br />
#! /bin/bash<br />
<br />
# --------------------------------------------------------------------------<br />
# Impostazioni<br />
# --------------------------------------------------------------------------<br />
<br />
# I file creati saranno leggibili e scrivibili da tutti<br />
umask 0011<br />
<br />
# Intercettazione Ctrl+C<br />
trap _exit INT<br />
<br />
# Abilitazione dell'opzione 'extdebug' necessaria per espandere ARGC in<br />
# Bash 5 e versioni successive<br />
shopt -s extdebug<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni che sovrascrivono comandi<br />
# --------------------------------------------------------------------------<br />
<br />
# Rimpiazza echo ed echo -n, impedendo echo -e e le possibili combinazioni<br />
# Sintassi accettata:<br />
# echo -n "testo" # stampa senza a capo finale<br />
# echo "testo" # stampa con a capo finale<br />
# echo # stampa una riga vuota<br />
function echo {<br />
if [ $# -gt 1 ] && [ "$1" = "-n" ]; then<br />
shift<br />
printf %s "$*"<br />
else<br />
printf %s\\n "$*"<br />
fi<br />
}<br />
<br />
# Sostituisce il comando 'cat' per controllare che al file di log<br />
# venga inviato effettivamente il contenuto di un file di testo<br />
function cat {<br />
if [ "$(file -bL $1)" = 'ASCII text' ]; then<br />
/bin/cat "$1"<br />
else<br />
echo "File non di testo"<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Costanti<br />
# --------------------------------------------------------------------------<br />
<br />
# Versione script<br />
readonly VERSIONE="1.0.70"<br />
<br />
# Path e nome dello script<br />
readonly PATH_NAME="$(readlink -f "${BASH_SOURCE[0]}")"<br />
<br />
# Codename per oldstable, stable e testing. Da modificare nei successivi rilasci di Debian<br />
readonly OLDOLDSTABLE="jessie"<br />
readonly OLDSTABLE="stretch"<br />
readonly STABLE="buster"<br />
readonly TESTING="bullseye"<br />
<br />
# Path dei comandi dello script<br />
readonly PATH="/bin:/sbin:/usr/bin:/usr/sbin"<br />
<br />
# Nome del file di log in base alla data corrente<br />
readonly log="log_$(date '+%d%b_%H%M%S')"<br />
<br />
# Nome del file di debug<br />
readonly script_debug="/tmp/script_debug_$(date '+%d%b_%H%M%S')"<br />
<br />
# File descriptor per il debug<br />
FD=9<br />
<br />
# URL remoto della pagina contenente lo script<br />
readonly SCRIPTURL="http://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&action=edit"<br />
<br />
# URL remoto della pagina contenente lo script codificato in base64<br />
readonly SCRIPTURL_BASE64="http://guide.debianizzati.org/index.php?title=Aiuto:LogScript&action=edit"<br />
<br />
# nome utente<br />
utente=$(logname) &&<br />
[ "$utente" != "root" ] || {<br />
# NOTA: "root" è permesso (solo) se scelto esplicitamente dall'utente<br />
tmputente2=$(getent passwd 1000 2> /dev/null | cut -d ":" -f 1) ||<br />
tmputente2=""<br />
echo -n "Inserisci il tuo nome utente"<br />
if [ -n "$tmputente2" ]; then<br />
echo -n " (lascia vuoto per \"$tmputente2\"): "<br />
else<br />
echo -n ": "<br />
fi<br />
read tmputente &&<br />
tmputente=${tmputente:-$tmputente2} &&<br />
# non può contenere: spazi, tabulazioni, nuove righe; né essere vuota<br />
[ -n "${tmputente##*[[:space:]]*}" ] &&<br />
# deve esistere in /etc/passwd (o equivalente)<br />
getent passwd "$tmputente" > /dev/null 2>&1 || {<br />
echo "Nome utente non valido o non esistente!" >&2<br />
exit 255<br />
}<br />
utente=$tmputente<br />
unset tmputente<br />
unset tmputente2<br />
}<br />
readonly utente<br />
<br />
# nome host<br />
readonly nomehost=$(hostname)<br />
<br />
# Codici stile carattere<br />
readonly ROSSO="\033[01;31m" # colore rosso e grassetto<br />
readonly VERDE="\033[01;32m" # colore verde e grassetto<br />
readonly BOLD="\033[01m" # grassetto<br />
readonly FINE="\033[0m" # reset<br />
<br />
# variabile che vale 1 se systemd è installato<br />
[ "$(ps -o comm= -p 1)" = "systemd" ] && systemd=1 || systemd=0<br />
readonly systemd<br />
<br />
# --------------------------------------------------------------------------<br />
# Sezione relativa ai parametri dello script<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che segnala un errato utilizzo dei parametri e termina lo script<br />
function _parm_err {<br />
echo "Parametri non validi" && _parm_uso<br />
}<br />
<br />
# Messaggio di errore se viene specificato più di un tipo di problema attraverso<br />
# i parametri.<br />
function _parm_tipo_err {<br />
echo "È possibile specificare un solo di tipo di problema" && _parm_uso<br />
}<br />
<br />
# Messaggio visualizzato nel caso in cui venga specificato lo stesso parametro<br />
function _parm_rip_err {<br />
echo "È stato immesso lo stesso parametro" && _parm_uso<br />
}<br />
<br />
# Messaggio visualizzato nel caso in cui --help non sia l'unico parametro specificato<br />
function _parm_uso_err {<br />
echo "Il parametro $1 non deve essere accompagnato da altri parametri" && _parm_uso<br />
}<br />
<br />
# Funzione che stampa informazioni sull'utilizzo dei parametri<br />
function _parm_uso {<br />
printf %b "<br />
Utilizzo dei parametri:<br />
<br />
$BOLD--tipo={rete|video|boot|audio|apt|mount|touchpad|generico}$FINE<br />
utilizzato per specificare un solo tipo di problema.<br />
Es: --tipo=apt<br />
<br />
$BOLD--nocompress$FINE<br />
non viene creato un file compresso del log<br />
<br />
$BOLD--nopaste$FINE<br />
non viene inviato il log a paste.debian.net<br />
<br />
$BOLD--update$FINE<br />
viene aggiornato lo script se è disponibile una nuova versione<br />
<br />
$BOLD--base64$FINE<br />
viene creato un file con la codifica base64 dello script<br />
<br />
$BOLD--debug$FINE<br />
crea un file contenente le informazioni utili per il debug dello script<br />
<br />
$BOLD--versione$FINE<br />
visualizza la versione dello script in esecuzione<br />
<br />
$BOLD--help$FINE<br />
visualizza queste informazioni<br />
<br />
" && exit<br />
}<br />
<br />
# Visualizza la versione corrente dello script<br />
function _showvers {<br />
echo "$VERSIONE" && exit<br />
}<br />
<br />
# Inizializzazione di variabili. La variabile TIPO serve ad evitare ripetizioni<br />
# nel passaggio del parametro tipo=blabla<br />
NOCOMPRESS=0 NOPASTE=0 TIPO=0 TIPO_RETE=0 TIPO_APT=0 TIPO_VIDEO=0 TIPO_BOOT=0<br />
TIPO_AUDIO=0 TIPO_MNT=0 TIPO_TOUCH=0 TIPO_COMM=0 UPDATE=0 BASE64=0<br />
DEBUG=0<br />
<br />
while [ $# -gt 0 ] ; do<br />
case "$1" in<br />
"--base64") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || BASE64=1 ;;<br />
"--update") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || UPDATE=1 ;;<br />
"--nocompress") [ "$NOCOMPRESS" -eq 1 ] && _parm_rip_err || NOCOMPRESS=1 ;;<br />
"--nopaste") [ "$NOPASTE" -eq 1 ] && _parm_rip_err || NOPASTE=1 ;;<br />
"--tipo=rete") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_RETE=1 ;;<br />
"--tipo=apt") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_APT=1 ;;<br />
"--tipo=video") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_VIDEO=1 ;;<br />
"--tipo=boot") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_BOOT=1 ;;<br />
"--tipo=audio") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_AUDIO=1 ;;<br />
"--tipo=mount") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_MNT=1 ;;<br />
"--tipo=touchpad") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_TOUCH=1 ;;<br />
"--tipo=generico") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_COMM=1 ;;<br />
"--debug") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || DEBUG=1 ;;<br />
"--versione") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _showvers ;;<br />
"--help") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _parm_uso ;;<br />
*) _parm_err<br />
esac<br />
shift<br />
done<br />
<br />
# --------------------------------------------------------------------------<br />
# Debug<br />
# --------------------------------------------------------------------------<br />
function _debug {<br />
[ "$DEBUG" -eq 1 ] && [ ! -e /proc/$$/fd/"$FD" ] &&<br />
{<br />
exec {FD}>"$script_debug"<br />
export BASH_XTRACEFD="$FD"<br />
set -x<br />
}<br />
}<br />
<br />
function _close_debug {<br />
set +x<br />
exec {FD}>&-<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni iniziali<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che stampa il messaggio introduttivo<br />
function _intro {<br />
echo "<br />
*********************************************************************************<br />
* www.debianizzati.org *<br />
* *<br />
* Script che crea un log utile alla risoluzione dei problemi più comuni *<br />
* Versione $VERSIONE *<br />
* *<br />
*********************************************************************************"<br />
}<br />
<br />
# Funzione che stampa alcune avvertenze sullo script<br />
function _avvertenze {<br />
local risp<br />
echo "<br />
-- Lo script richiede i permessi di root per essere eseguito<br />
-- Per inviare il log su paste.debian.net è necessario il pacchetto 'pastebinit'<br />
-- L'invio del log a paste.debian.net avverrà solo dopo esplicito consenso<br />
-- Verrà creato un file contenente l'output di questo script<br />
-- Verrà creato un file in formato compresso da inviare al forum"<br />
echo -n "Continuare [S/n]? "<br />
read risp || risp="ERROR"<br />
<br />
# Se non viene premuto "s" o "S" o [Invio], lo script termina<br />
[ -z "$risp" ] || [ "$risp" = "s" ] || [ "$risp" = "S" ] || _exit<br />
}<br />
<br />
# Funzione che esegue un check preliminare<br />
function _check {<br />
if [ $EUID -ne 0 ]; then # Lo script viene lanciato da root?<br />
echo "Lo script deve essere lanciato da root" && _exit<br />
fi<br />
<br />
# Se esiste già un file di log con lo stesso nome oppure file compressi con lo<br />
# stesso nome di quelli che verranno creati, lo script chiede se cancellarli o meno<br />
local risp<br />
if [ -f "$log" ] || [ -f "${log}.xz" ] || [ -f "${log}.bz2" ] || [ -f "${log}.gz" ]; then<br />
echo $'\n'"Esiste già un file ${log}, ${log}.xz, ${log}.bz2 o ${log}.gz nella directory corrente."<br />
echo -n "Sovrascivere [S/n]? "<br />
read risp<br />
case "$risp" in<br />
""|[Ss]) rm -f -- "$log" "${log}.xz" "${log}.bz2" "${log}.gz" > /dev/null 2>&1 ;;<br />
*) exit 1<br />
esac<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni per l'invio del log a paste.debian.net<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione per separare il log in parti per l'invio a paste.debian.net<br />
function _split_and_send { <br />
local paste_url='https://paste.debian.net'<br />
local chunk_prefix='pastebin'<br />
local chunk_num=1<br />
local paste_exit_status=0<br />
local chunkfile pastelink<br />
<br />
# dimensione massima del singolo file da inviare<br />
local chunk_size='60k'<br />
<br />
# termina la funzione se il log è più grande di chunk_size x 4 (numero di parti impostate)<br />
if [ "$(du -k "$log" | cut -f1)" -gt 240 ]; then<br />
echo "Log troppo grande per essere inviato a paste.debian.net"<br />
echo "Allegare il file compresso alla discussione sul forum."<br />
return 1<br />
fi<br />
<br />
# rinomina parti di log preesistenti (se ve ne sono)<br />
# scarta i messaggi di errore (se presenti)<br />
rename "s/${chunk_prefix}/old-${chunk_prefix}-$(date '+%s')/" "$chunk_prefix".* > /dev/null 2>&1<br />
<br />
# dividi il file di log in parti di $chunk_size bytes senza spezzare le linee<br />
# scarta i messaggi di errore (se presenti) per log di dimensione superiore a 10 parti<br />
# (max 10 parti con l'opzione -a)<br />
split -a 1 -d -C "$chunk_size" "$log" "${chunk_prefix}." > /dev/null 2>&1<br />
<br />
# comunica il numero di parti inviate<br />
chunk_num=$(find . -maxdepth 1 -type f -name "${chunk_prefix}.*" -printf x |<br />
wc -c)<br />
if [ "$chunk_num" = 1 ]; then<br />
echo $'\nIl log sarà inviato in un singolo file.'<br />
else<br />
echo $'\n'"Il log sarà inviato in ${chunk_num} parti."<br />
fi<br />
<br />
# invia al massimo 4 parti<br />
echo $'\nIl log è consultabile ai seguenti indirizzi:'<br />
for chunkfile in "${chunk_prefix}."[0-3]; do<br />
<br />
# verifica l'esistenza del file da inviare<br />
if [ -f "$chunkfile" ]; then<br />
<br />
# invia dati tramite pastebinit, l'output d'errore viene soppresso<br />
pastelink=$(pastebinit -a '' -b "$paste_url" -i "$chunkfile" 2>/dev/null)<br />
<br />
if [ $? = 0 ]; then<br />
# invio apparentemente riuscito (pastebinit exit status = 0)<br />
<br />
# controlla URL restituita da pastebinit<br />
case "$pastelink" in<br />
# verifica in caso di URL corretta<br />
"$paste_url"/[0-9]*)<br />
echo ".. inviato ${chunkfile} all'indirizzo ${pastelink}"<br />
;;<br />
# verifica in caso di URL non corretta<br />
*)<br />
echo ".. ${paste_url} ha restituito una URL non valida (${pastelink}) per ${chunkfile}!"<br />
paste_exit_status=1<br />
esac<br />
<br />
else<br />
# Invio fallito (pastebinit exit status = 1)<br />
echo ".. non riuscito invio ${chunkfile}"<br />
paste_exit_status=1<br />
fi<br />
<br />
fi<br />
<br />
done<br />
<br />
# cancella le parti di log inviate<br />
for chunkfile in "./${chunk_prefix}."[0-9]*; do<br />
if [ -f "$chunkfile" ]; then<br />
rm -f -- "$chunkfile"<br />
fi<br />
done<br />
<br />
return $paste_exit_status<br />
}<br />
<br />
# Funzione che invia il log a paste.debian.net<br />
function _upload {<br />
# Nessun invio a paste.debian.net se viene scelto "--nopaste"<br />
[ "$NOPASTE" -eq 1 ] && return<br />
<br />
local risp<br />
# Pastebinit è installato?<br />
if [ ! -f /usr/bin/pastebinit ]; then<br />
echo $'\nNon è possibile inviare il log a paste.debian.net\nIl pacchetto "pastebinit" non è installato.'<br />
return 1<br />
fi<br />
# Invia il file log.txt a paste.debian.net<br />
echo -n $'\nInviare il log a http://paste.debian.net [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
_split_and_send<br />
if [ $? = 0 ]; then<br />
echo $'\nIl log è stato inviato'<br />
else<br />
echo $'\nSi sono verificati errori nell\'invio del log!'<br />
fi<br />
;;<br />
*)<br />
echo "Il log non è stato inviato"<br />
esac<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni di creazione del file compresso e messaggi di successo/fallimento<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzioni richiamate in caso di corretta/scorretta creazione del file compresso<br />
function _compress_ok { echo "File compresso creato correttamente nella directory corrente."; }<br />
<br />
function _compress_err { echo "Errore nella creazione del file compresso."; }<br />
<br />
# Funzione che crea il file compresso<br />
# Prova a creare nell'ordine: un file .xz, un file .bz2 o un file .gz<br />
function _compress {<br />
# La funzione termina se è stato utilizzato il parametro "--nocompress"<br />
[ "$NOCOMPRESS" -eq 1 ] && return<br />
<br />
local risp<br />
echo -n $'\nCreare un file compresso [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
echo "Sta per essere creato un file compresso..."<br />
sleep 1<br />
if [ "$(command -v xz)" ]; then<br />
xz -e < "$log" > "${log}.xz" && _compress_ok || _compress_err<br />
elif [ "$(command -v bzip2)" ]; then<br />
bzip2 -9 < "$log" > "${log}.bz2" && _compress_ok || _compress_err<br />
elif [ "$(command -v gzip)" ]; then<br />
gzip -9 < "$log" > "${log}.gz" && _compress_ok || _compress_err<br />
else<br />
echo "Impossibile effettuare la compressione!" >&2<br />
fi<br />
;;<br />
*)<br />
echo "Non è stato creato un file compresso."<br />
esac<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzione di stampa menù e selezione del problema<br />
# --------------------------------------------------------------------------<br />
<br />
function _scelta {<br />
<br />
# Problemi selezionati in base al parametro passato allo script<br />
[ "$TIPO_RETE" -eq 1 ] && _wait && _header "rete" && _rete && return<br />
[ "$TIPO_VIDEO" -eq 1 ] && _wait && _header "video" && _video && return<br />
[ "$TIPO_BOOT" -eq 1 ] && _wait && _header "boot" && _boot && return<br />
[ "$TIPO_AUDIO" -eq 1 ] && _wait && _header "audio" && _audio && return<br />
[ "$TIPO_APT" -eq 1 ] && _wait && _header "APT" && _apt && return<br />
[ "$TIPO_MNT" -eq 1 ] && _wait && _header "mount-unmount" && _mount && return<br />
[ "$TIPO_TOUCH" -eq 1 ] && _wait && _header "touchpad" && _tpad && return<br />
[ "$TIPO_COMM" -eq 1 ] && _wait && _header "generico" && _common && return<br />
<br />
# La funzione presenta un menù di scelta nel caso non sia stato passato alcun parametro<br />
local num<br />
<br />
clear<br />
_intro<br />
echo "<br />
Selezionare il tipo di problema per il quale verrà generato il file di log<br />
[1] Problemi relativi alle connessioni di rete<br />
[2] Problemi video<br />
[3] Problemi di boot<br />
[4] Problemi audio<br />
[5] Problemi di gestione dei pacchetti (APT)<br />
[6] Problemi di mount/unmount<br />
[7] Problemi di funzionamento del touchpad<br />
[8] Altro tipo di problema<br />
[0] Uscita"<br />
<br />
while true; do<br />
echo -n "Scegliere il numero corrispondente: "<br />
read num<br />
case "$num" in<br />
[1-8]) _wait ;;& # ;;& -> va alla successiva occorrenza del carattere immesso<br />
1) _header "rete" && _rete ;;&<br />
2) _header "video" && _video ;;&<br />
3) _header "boot" && _boot ;;&<br />
4) _header "audio" && _audio ;;&<br />
5) _header "APT" && _apt ;;&<br />
6) _header "mount-unmount" && _mount ;;&<br />
7) _header "touchpad" && _tpad ;;&<br />
8) _header "generico" && _common ;;&<br />
[1-8]) break ;; # Termina il ciclo 'while'<br />
0) _exit ;; # È stato inserito '0' . Uscita dallo script<br />
*) # Tutti gli altri caratteri. Cancella l'input immesso e ripete la domanda<br />
tput cuu1 # in alto di una riga<br />
tput ed # cancella fino alla fine dello schermo<br />
esac<br />
done<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni varie<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che stampa solo parentesi e il nome del comando, prima di eseguirlo<br />
function _prompt {<br />
echo -n "[ ] $*"<br />
}<br />
<br />
# Funzione che stampa un pallino colorato in base al primo parametro<br />
function _printdot {<br />
echo<br />
tput cuu1 # in alto di una riga<br />
tput cuf1 # a destra di uno spazio<br />
printf %b "$1•${FINE}\n" # stampa pallino e va a capo<br />
}<br />
<br />
# Funzione che stampa un pallino di colore verde in caso di comando con output<br />
function _ok { _printdot "${VERDE}"; }<br />
<br />
# Funzione che stampa una pallino rosso in caso di comando privo di output<br />
function _error { _printdot "${ROSSO}"; }<br />
<br />
# Funzione che stampa in grassetto gli argomenti<br />
function _bold {<br />
printf %b "${BOLD}"<br />
echo -n "$*"<br />
printf %b\\n "${FINE}"<br />
}<br />
<br />
# Funzione che invia nel file di log due righe tra le quali viene visualizzato il<br />
# nome del comando (passato come primo parametro della funzione -> $1)<br />
function _nome_e_riga {<br />
echo "<br />
******************************************<br />
$1<br />
******************************************" >> "$log"<br />
}<br />
<br />
# Funzione che stampa un messaggio di attesa<br />
function _wait {<br />
echo $'\nCreazione del log in corso...\n'<br />
}<br />
<br />
# Intestazione del file di log<br />
function _header {<br />
echo "Tipo di problema: $1" >> "$log"<br />
_data<br />
_lastupd <br />
echo "Versione script: $VERSIONE" >> "$log"<br />
}<br />
<br />
# Stampa la data corrente nel file di log<br />
function _data {<br />
echo "Log creato il: $(date '+%d %B %Y alle %H.%M')" >> "$log"<br />
}<br />
<br />
# Quota i caratteri specificati per le parole da nascondere con sed<br />
# Es: abc.def -> abc\.def<br />
function _sed_quote {<br />
# array di caratteri da quotare<br />
local quotearr=("." "/")<br />
<br />
local retstr="$1"<br />
for char in "${quotearr[@]}"; do<br />
retstr="${retstr//$char/\\$char}"<br />
done<br />
echo "$retstr"<br />
}<br />
<br />
# Funzione che nasconde nel log alcune informazioni sensibili<br />
function _hide {<br />
<br />
# Sostituisce il nome utente e il nome host con 'nomeutente' e 'nomehost' se diversi da [dD]ebian<br />
if [[ "$nomehost" =~ .*"$utente".* ]]; then<br />
[ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log"<br />
[ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log"<br />
else<br />
[ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log"<br />
[ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log"<br />
fi <br />
<br />
# Nasconde gli ESSID gestiti attraverso Network Manager<br />
local var file mydir="/etc/NetworkManager/system-connections/"<br />
<br />
if [ -d "$mydir" ]; then # se esiste la directory /etc/NetworkManager/system-connections/ ...<br />
for file in "$mydir"/*; do # ciclo attraverso il contenuto della directory<br />
if [ -f "$file" ]; then # se l'elemento è un file...<br />
var=$(sed -n "s/ssid=//p" "$file") # ... var conterrà l'eventuale ESSID...<br />
if [ -n "$var" ]; then # ... e se è diverso dalla stringa vuota...<br />
sed -i "s/${var}/\*script-removed\*/g" "$log" # ... lo nasconde nel file di log<br />
fi<br />
fi<br />
done<br />
fi<br />
<br />
# Nasconde nel log i nomi delle connessioni gestite da NetworkManager<br />
sed -i -r "s/(NetworkManager.*keyfile.*((parsing)|(read connection))).*/\1 \*script-removed\*/" "$log"<br />
sed -i -r "s/(NetworkManager.*keyfile: new connection.*system-connections\/)(.*)( \(.*,\").*(\"\))/\1\*script-removed\*\3\*script-removed\*\4/g" "$log"<br />
sed -i -r "s/(NetworkManager.*policy: auto-activating connection ').*(')/\1\*script-removed\*\2/g" "$log"<br />
sed -i -r "s/(NetworkManager.*Activation: starting connection ').*(')/\1\*script-removed\*\2/g" "$log"<br />
sed -i -r "s/(NetworkManager.*policy: set ').*(')/\1\*script-removed\*\2/g" "$log"<br />
<br />
# Nasconde l'indirizzo MAC delle interfacce wireless<br />
local interfaces macaddress line<br />
if [ -f /proc/net/wireless ]; then<br />
# array che contiene i nomi delle interfacce wireless<br />
mapfile -s 2 interfaces < <(awk -F'[: ]+' '{ print $2 }' /proc/net/wireless)<br />
<br />
for i in "${interfaces[@]}"; do<br />
# indirizzo MAC dell'interfaccia solo se questa ne ha uno<br />
line="$(ip -br link show $i)"<br />
if [ "$(echo $line | wc -w)" -gt 3 ]; then<br />
macaddress="$(awk '{ print $3 }' <<< $line)"<br />
macaddress="$(_sed_quote $macaddress)"<br />
# l'indirizzo MAC viene nascosto nel file<br />
sed -i 's/'$macaddress'/\*script-removed\*/g' "$log"<br />
fi<br />
done<br />
fi<br />
}<br />
<br />
# Invia al log l'output del comando passato come primo parametro e<br />
# con i permessi utente<br />
function _su {<br />
echo "$(su -c "$1" $utente)" >> "$log"<br />
}<br />
<br />
# Stabilisce la data dell'ultimo aggiornamento effettuato. Viene preso in<br />
# considerazione il file /var/log/apt/history.log oppure il file /var/log/apt/history.log.1.gz<br />
function _lastupd {<br />
local convdate lastdate file=/var/log/apt/history.log<br />
<br />
if [ -f "$file" ]; then<br />
lastdate=$(sed -n '/^Start-Date/h ; $p' "$file" | cut -d ' ' -f 2)<br />
# se il file history.log non contiene la data dell'ultimo aggiornamento, viene utilizzato history.log.1.gz<br />
[ -z "$lastdate" ] && [ -f "${file}.1.gz" ] && lastdate=$(zcat "${file}.1.gz" | sed -n '/^Start-Date/h ; $p' | cut -d ' ' -f 2)<br />
<br />
# variabile che contiene la data in formato "giorno mese anno"<br />
convdate=$(date -d "$lastdate" '+%d %B %Y')<br />
<br />
echo $"Ultimo aggiornamento del sistema: ${convdate}" >> "$log"<br />
fi<br />
}<br />
<br />
# Funzione che effettua l'aggiornamento automatico dello script<br />
function _self_update {<br />
<br />
echo -n "Aggiornare questo script [S/n]? "<br />
local risp<br />
read risp<br />
[ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit || echo "Aggiornamento in corso..."<br />
<br />
# Controlla l'esistenza di wget<br />
[ ! "$(command -v wget)" ] && echo "Impossibile eseguire l'aggiornamento. Installare il pacchetto wget." && _exit<br />
<br />
# Ricava la versione remota dello script<br />
local vers="$(wget -q -O- "$SCRIPTURL" | sed -n '/^readonly VERSIONE.*/{p;q}' | cut -d '"' -f2)"<br />
if [ "$vers" = "" ]; then<br />
echo "Connessione non riuscita" && _exit<br />
fi<br />
<br />
if [ "$vers" = "$VERSIONE" ]; then<br />
echo "Lo script è gia alla versione più recente"<br />
else<br />
echo -n "È disponibile una nuova versione dello script: " && _bold "$vers"<br />
echo -n "Procedere con l'aggiornamento [S/n]? "<br />
read risp<br />
case "$risp" in<br />
[Ss]|"")<br />
local tempfile="$(mktemp)" # viene creato un file temporaneo<br />
# lo script in formato base64 viene copiato nel file temporaneo<br />
wget -q -O- "$SCRIPTURL_BASE64" | sed -n "/^=S=/{n; :a /^==Fine/ ! {p; n; ba}}" | base64 -d | tar xz -O > "$tempfile"<br />
if [ ! -s "$tempfile" ]; then # Controlla se il file è vuoto<br />
echo "Connessione non riuscita"<br />
else<br />
cp "$tempfile" "$PATH_NAME"<br />
[ $? -eq 0 ] && echo "Aggiornamento effettuato" || echo "Aggiornamento fallito"<br />
#rm -f "$tempfile" # Rimuove il file temporaneo<br />
fi ;;<br />
*)<br />
echo "Non è stato eseguito alcun aggiornamento"<br />
esac<br />
fi<br />
}<br />
<br />
# funzione che crea un file con la codifica base64 dello script<br />
# Da utilizzare in caso di aggiornamenti per modificare la pagina<br />
# http://guide.debianizzati.org/index.php/Aiuto:LogScript<br />
function _base64 {<br />
<br />
echo -n "Verrà creato un file con la codifica base64 di questo script. Continuare [S/n]? "<br />
local risp<br />
read risp<br />
[ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit ||<br />
local tempfile="$(mktemp)" # crea un file temporaneo<br />
tar cf - "${BASH_SOURCE[0]}" | gzip -9 | base64 > "$tempfile"<br />
if [ $? -eq 0 ]; then<br />
echo -n "Il file contenente la codifica base64 di questo script è " && _bold "$tempfile"<br />
else<br />
echo "Codifica non riuscita"<br />
fi<br />
# Modifica i permessi del file in modo che possa essere letto da tutti<br />
chmod 444 "$tempfile"<br />
}<br />
<br />
# Funzione che stampa un messaggio che indica i file creati e poi termina lo script<br />
function _exit {<br />
<br />
# se è stato effettuato un update o una codifica base64, stampa solo il messaggio finale<br />
if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then<br />
local complog=""<br />
<br />
if [ -f "$log" ]; then<br />
echo -n $'\nFile contenente il log dello script: '<br />
_bold "$log"<br />
else<br />
echo $'\nNon è stato creato un file di log'<br />
fi<br />
<br />
if [ -f "${log}.xz" ]; then<br />
complog="${log}.xz"<br />
elif [ -f "${log}.bz2" ]; then<br />
complog="${log}.bz2"<br />
elif [ -f "${log}.gz" ]; then<br />
complog="${log}.gz"<br />
fi<br />
<br />
if [ -z "$complog" ]; then <br />
echo "Non è stato creato un file compresso del log"<br />
else<br />
echo -n "File compresso da allegare alla discussione sul forum: "<br />
_bold "$complog"<br />
fi<br />
<br />
if [ -f "$script_debug" ]; then<br />
echo -n "File contenente l'output di debug: "<br />
_bold "$script_debug"<br />
fi<br />
fi<br />
<br />
echo $'Script terminato\n'<br />
_close_debug<br />
<br />
exit 0<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni relative a ciascun problema selezionato<br />
# --------------------------------------------------------------------------<br />
<br />
# Informazioni comuni a tutti i tipi di problema<br />
function _common {<br />
_dmi_decode<br />
_comando "/bin/uname -a"<br />
_file "/etc/debian_version"<br />
_de_wm<br />
_file "/etc/X11/default-display-manager"<br />
_comando "/usr/bin/groups" "su"<br />
_file "/var/log/syslog"<br />
_comando "/bin/systemctl --failed --no-pager"<br />
_comando "/bin/journalctl -x -b --no-pager -p err"<br />
_comando "/bin/journalctl -x -b --no-pager -p warning"<br />
_comando "/bin/journalctl -x -b --no-pager"<br />
_comando "/usr/bin/systemd-cgtop -b --iterations=5"<br />
_comando "/usr/bin/systemd-cgls -l"<br />
_comando "/usr/bin/systemd-delta"<br />
_comando "/bin/dmesg -l err"<br />
_comando "/bin/dmesg -l warn"<br />
_comando "/bin/lsmod"<br />
_comando "/usr/bin/lspci -knn"<br />
_comando "/usr/bin/lsusb"<br />
_comando "/sbin/fdisk -l"<br />
_comando "/sbin/blkid"<br />
_file "/etc/fstab"<br />
_dir "/etc/fstab.d/"<br />
_comando "/bin/findmnt"<br />
_comando "/bin/lsblk"<br />
_comando "/bin/df"<br />
_dir "/etc/modprobe.d/"<br />
_dir "/etc/modules-load.d/"<br />
_file "/etc/modules"<br />
_file "/etc/apt/sources.list"<br />
_dir "/etc/apt/sources.list.d/"<br />
_comando "/usr/bin/apt-cache policy"<br />
_comando "/usr/bin/apt-cache stats"<br />
_comando "/usr/bin/dpkg --audit"<br />
_comando "/usr/bin/apt-get check"<br />
_firmware<br />
_extpack<br />
_pack "linux-headers"<br />
_pack "linux-image"<br />
_comando "/usr/sbin/dkms status"<br />
}<br />
<br />
# Funzione relativa ai problemi di rete<br />
function _rete {<br />
_common<br />
_file "/etc/network/interfaces"<br />
_dir "/etc/network/interfaces.d/"<br />
_file "/etc/hosts"<br />
_comando "/sbin/ifconfig"<br />
_comando "/sbin/ifconfig -a"<br />
_comando "/sbin/ip -s -d link show"<br />
_comando "/usr/sbin/rfkill list all"<br />
_comando "/bin/ping -c3 -W5 8.8.8.8" #DNS di Google 8.8.8.8<br />
_comando "/bin/ip addr"<br />
_comando "/bin/ip route list"<br />
_comando "/sbin/iwconfig"<br />
_comando "/sbin/iwlist scan"<br />
_comando "/sbin/route -n"<br />
_pack "resolvconf"<br />
_file "/etc/resolv.conf"<br />
_pack "DHCP"<br />
_file "/etc/dhclient.conf"<br />
_file "/etc/NetworkManager/NetworkManager.conf"<br />
_comando "/usr/bin/nmcli dev list"<br />
_comando "/usr/bin/nmcli device show"<br />
_demone "/usr/sbin/NetworkManager" "Network Manager"<br />
_demone "/usr/sbin/wicd" "Wicd"<br />
}<br />
<br />
# Funzione relativa a problemi video<br />
function _video {<br />
_common<br />
_file "/etc/X11/xorg.conf"<br />
_dir "/etc/X11/xorg.conf.d/"<br />
_file "/var/log/Xorg.0.log"<br />
_file "${utente}/.local/share/xorg/Xorg.0.log"<br />
_pack "xserver-xorg"<br />
_pack "nouveau"<br />
_pack "nvidia"<br />
_pack "mesa"<br />
_pack "fglrx"<br />
_pack "amdgpu"<br />
}<br />
<br />
# Funzione relativa ai problemi di avvio del sistema<br />
function _boot {<br />
_common<br />
_file "/etc/default/grub"<br />
_file "/boot/grub/grub.cfg"<br />
_dir "/etc/default/grub.d/"<br />
_dir "/etc/grub.d/"<br />
_file "/boot/grub/device.map"<br />
_comando "/usr/sbin/grub-mkdevicemap"<br />
_pack grub<br />
}<br />
<br />
# Funzione relativa ai problemi audio. Scarica ed esegue lo script ALSA<br />
function _audio {<br />
_common<br />
_pack "alsa"<br />
_nome_e_riga "dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel'"<br />
_prompt "ALSA dmesg"<br />
dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel' >> "$log" && _ok || _error<br />
<br />
local risp alsaurl="http://www.alsa-project.org/alsa-info.sh"<br />
<br />
echo $'\nI log relativi ai problemi audio sono ricavati attraverso lo script di debug'<br />
echo "ALSA prelevabile all'indirizzo: ${alsaurl}"<br />
echo -n $'\nVerrà ora scaricato e eseguito lo script ALSA. Continuare [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
# wget esiste?<br />
if [ ! -f /usr/bin/wget ]; then<br />
echo "Impossibile scaricare lo script ALSA. Installare il pacchetto wget."<br />
return<br />
fi<br />
# Crea un file temporaneo in /tmp che conterrà lo script ALSA<br />
local tempfile=$(mktemp)<br />
# Scarica lo script ALSA<br />
_prompt "Download script ALSA"<br />
wget -q -O "$tempfile" "$alsaurl"<br />
# Se il download riesce...<br />
if [ $? -eq 0 ]; then<br />
_ok "Download script ALSA riuscito"<br />
# Imposta i permessi dello script scaricato<br />
chmod 777 "$tempfile"<br />
_nome_e_riga "Problemi audio"<br />
# rimuove il comando "dmesg" dallo script ALSA<br />
# perché non eseguibile da utente normale (il comando è<br />
# stato inserito a parte in questa funzione)<br />
sed -i "/^$(printf '\t')withdmesg/d" "$tempfile"<br />
# Esegue lo script ALSA<br />
_prompt "Esecuzione script ALSA"<br />
_su "$tempfile --stdout" && _ok || _error<br />
else<br />
_error "Download script ALSA fallito"<br />
fi<br />
<br />
# Rimuove il file temporaneo<br />
rm -- "$tempfile"<br />
;;<br />
*)<br />
echo "Lo script ALSA non è stato ancora eseguito."<br />
echo "Avviare manualmente lo script prelevabile a questo indirizzo:"<br />
_bold "$alsaurl"<br />
echo "Lo script ALSA va eseguito con i permessi di normale utente."<br />
esac<br />
<br />
}<br />
<br />
# Funzione relativa alla gestione dei pacchetti attraverso il sistema APT<br />
function _apt {<br />
_common<br />
_comando "/usr/bin/dpkg --print-architecture"<br />
_comando "/usr/bin/dpkg --print-foreign-architectures"<br />
_comando "/usr/bin/apt-get update"<br />
_comando "/usr/bin/apt-get -s -y upgrade"<br />
_comando "/usr/bin/apt-get -s -y dist-upgrade"<br />
_comando "/usr/bin/apt-get -s -y -f install"<br />
_comando "/usr/bin/apt-get -s -y autoremove"<br />
_comando "/usr/bin/apt-config dump"<br />
_file "/etc/apt/apt.conf"<br />
_dir "/etc/apt/apt.conf.d/"<br />
_file "/etc/apt/preferences"<br />
_dir "/etc/apt/preferences.d/"<br />
}<br />
<br />
# Funzione relativa a problemi di mount/unmount<br />
function _mount {<br />
_common<br />
_comando "/usr/bin/udisksctl dump"<br />
_pack "usbmount"<br />
}<br />
<br />
# Funzione relativa al funzionamento del touchpad<br />
function _tpad {<br />
_common<br />
_pack "xserver-xorg"<br />
_pack "touchpad"<br />
_file "/etc/X11/xorg.conf"<br />
_dir "/etc/X11/xorg.conf.d/"<br />
_file "/var/log/Xorg.0.log"<br />
_comando "/usr/bin/synclient -l" "su"<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni utilizzate per tipo di problema (generiche)<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che invia il contenuto di un file al file di log<br />
# La funzione va richiamata specificando il path completo del file che sarà assegnato a $1<br />
# Il contenuto dei file viene inviato inalterato al file di log. Se si ha necessità di<br />
# modificare questo comportamento, creare una entry nel ciclo "case"<br />
<br />
function _file {<br />
_nome_e_riga "$1"<br />
_prompt "$1"<br />
if [ -f "$1" ]; then<br />
case "$1" in<br />
/etc/fstab)<br />
# Nasconde username, password e dominio di mount CIFS<br />
sed -e "s/\( cifs.*username *= *\)[^,]*/\1\*script-removed\*/" \<br />
-e "s/\( cifs.*password *= *\)[^,]*/\1\*script-removed\*/" \<br />
-e "s/\( cifs.*domain *= *\)[^,]*/\1\*script-removed\*/" "$1" &>> "$log" && _ok || _error ;;<br />
/etc/network/interfaces)<br />
# Nasconde nel log gli ESSID e le password criptate contenute in /etc/network/interfaces<br />
sed -r "s/((wpa-ssid)|(wpa-psk)|(wpa-identity)|(wpa-password)|(wireless-key)).*/\1 \*script-removed\*/" "$1" &>> "$log" && _ok || _error ;;<br />
/var/log/syslog)<br />
# se è installato systemd, il log viene ricavato da "journalctl -x"<br />
if [ $systemd -eq 0 ]; then <br />
# se il file contiene la stringa "rsyslogd.*start" ...<br />
if [ "$(grep -sci 'rsyslogd.*start$' "$1")" -ne 0 ]; then<br />
# ... estrae da syslog tutto il contenuto dall'ultima occorrenza della stringa alla fine del file<br />
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1" >> "$log" && _ok || _error<br />
else<br />
# se syslog non contiene quella stringa, allora si effettuerà la stessa operazione su syslog.1 ($1.1)<br />
# in questo caso l'intero contenuto del file syslog viene inviato al log<br />
cat "$1" &>> "$log" && _ok || _error<br />
_nome_e_riga "$1".1<br />
_prompt "$1".1<br />
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1".1 >> "$log" && _ok || _error<br />
fi<br />
else _error # systemd è installato. I log vengono ricavati da "journalctl -x"<br />
fi ;;<br />
*)<br />
# per tutti i file non specificati sopra...<br />
cat "$1" &>> "$log" && _ok || _error<br />
esac<br />
else<br />
echo "File \"$1\" non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# Invia l'output di un comando al file di log<br />
# La funzione va richiamata specificando il path completo del comando (con eventuali opzioni)<br />
# che sarà assegnato a $1 . L'output dei comandi viene inviato interamente al file di log. Se<br />
# si ha necessità di modificare gli output, creare una entry nel ciclo "case"<br />
# Es. _comando "/usr/bin/apt-get update"<br />
#<br />
# Nel caso in cui il comando debba essere eseguito tramite 'su', richiamare la funzione con<br />
# due parametri:<br />
# $1 = il comando da eseguire attraverso 'su'<br />
# $2 = la stringa 'su'<br />
# Es. _comando "/usr/bin/groups" "su"<br />
<br />
function _comando {<br />
<br />
local var=${1##*/} # var conterrà il comando ($1) con le opzioni ma privo del path<br />
local var2=${1%% *} # var2 conterrà il comando ($1) privo di eventuali opzioni ma con il path<br />
_nome_e_riga "$var"<br />
_prompt "$var"<br />
<br />
if [ -f "$var2" ]; then # il comando esiste?<br />
if [ $# -eq 2 ]; then # Se vi sono 2 parametri, viene chiamata la funzione "_su"<br />
case "$1" in<br />
"/usr/bin/synclient -l")<br />
# se $DISPLAY è vuota, usa :0 (default per il primo server X)<br />
_su "DISPLAY=${DISPLAY:-:0} $1" && _ok || _error ;;<br />
*) <br />
_su "$1" && _ok || _error<br />
esac<br />
else # non viene utilizzato "su"<br />
case "$1" in<br />
# per "iwconfig" e "iwlist scan" gli ESSID non vengono inviati al log<br />
/sbin/iwconfig)<br />
(iwconfig | sed -e '/ESSID:/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error<br />
;;<br />
"/sbin/iwlist scan")<br />
(iwlist scan | sed -e '/ESSID:.*/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error<br />
;;<br />
# nasconde gli ESSID visualizzati da "nmcli dev list" (fino a Wheezy)<br />
# L'array PIPESTATUS mostra il codice d'uscita dei comandi della pipe. PIPESTATUS[0] è il codice d'uscita di "nmcli dev list" (0=successo)<br />
"/usr/bin/nmcli dev list")<br />
nmcli dev list 2>/dev/null | sed -r "s/(^AP[[:digit:]]*\.SSID:[[:space:]]*).*/\1\*script removed\*/" >> "$log" && [ "${PIPESTATUS[0]}" -eq 0 ] && _ok || \<br />
( _error && echo "Comando valido solo per Wheezy" >> "$log" ) ;;<br />
# nasconde gli ESSID visualizzati da "nmcli device show" (da Jessie in poi)<br />
"/usr/bin/nmcli device show")<br />
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 || \<br />
( _error && echo "Comando valido solo per Jessie e versioni superiori" >> "$log" ) ;;<br />
/bin/dmesg*)<br />
# Il comando viene eseguito solo se è non installato systemd<br />
[ $systemd -eq 0 ] && $1 &>> "$log" && _ok || _error ;;<br />
"/usr/sbin/grub-mkdevicemap")<br />
local devicemaptempfile="$(mktemp)" && \<br />
grub-mkdevicemap -m "$devicemaptempfile" && \<br />
if [ -f "$devicemaptempfile" ]; then cat "$devicemaptempfile" >> "$log"; fi && _ok || _error ;;<br />
*)<br />
# per tutti gli altri comandi non specificati in precedenza, l'output del comando è inviato inalterato al log<br />
$1 &>> "$log" && _ok || _error<br />
esac <br />
fi<br />
else<br />
echo "Comando \"${var2}\" non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# Funzione che invia il contenuto dei file di una directory al file di log<br />
function _dir {<br />
_nome_e_riga "$1"<br />
_prompt "$1"<br />
<br />
# Se la directory non esiste, stampa un output sul log ed esce.<br />
if [ ! -d "$1" ]; then<br />
echo "La directory non esiste" >> "$log" && _error<br />
return<br />
fi<br />
<br />
local file<br />
# numfile contiene il numero di file contenuti nella directory. Solo primo livello.<br />
local numfile=$(find "$1" -maxdepth 1 -type f | wc -l)<br />
# numdir contiene il numero di sottodirectory contenute nella directory. Solo primo livello.<br />
local numdir=$(find "$1" -maxdepth 1 -type d | wc -l)<br />
<br />
if [ "$numfile" -eq 0 ] && [ "$numdir" -eq 1 ]; then<br />
echo "La directory non contiene file o directory" >> "$log" && _error<br />
else<br />
echo "La directory contiene ${numfile} file e $((numdir - 1)) directory" >> "$log" && _ok<br />
ls -al "$1" >> "$log"<br />
# invia al log il contenuto dei file della directory<br />
for file in "$1"*; do<br />
if [ -f "$file" ]; then<br />
_nome_e_riga "$file"<br />
_prompt "$file"<br />
cat "$file" &>> "$log" && _ok || _error<br />
fi<br />
done<br />
<br />
# Funzione che invia al log il contenuto dei file presenti nelle sottodirectory<br />
# I due cicli "for" sono separati per permettere l'output di un file subito dopo<br />
# la directory a cui appartiene<br />
for file in "$1"*; do<br />
if [ -d "$file" ]; then<br />
_dir "$file/"<br />
fi<br />
done<br />
fi<br />
}<br />
<br />
# Funzione che elenca i pacchetti installati che contengono la parola<br />
# passata come parametro ($1)<br />
<br />
function _pack {<br />
_nome_e_riga "Pacchetti che contengono \"$1\""<br />
_prompt "Nomi di pacchetti con $1"<br />
<br />
# Variabile che contiene i pacchetti trovati<br />
local packages=$(dpkg -l | grep -i "$1")<br />
<br />
if [ -z "$packages" ]; then<br />
echo "Nessun pacchetto installato" >> "$log" && _error<br />
else<br />
echo "$packages" >> "$log" && _ok<br />
fi<br />
}<br />
<br />
# Funzione che verifica l'esistenza e l'esecuzione di alcuni demoni<br />
# Viene chiamata con due parametri:<br />
# $1 - percorso dell'eseguibile<br />
# $2 - nome da visualizzare<br />
# Se si vuol visualizzare la versione del demone, inserire il comando adatto<br />
# all'interno del ciclo 'case', allo stesso modo specificare al suo interno<br />
# anche il nome dello script d'avvio per fermare, avviare, etc il demone<br />
<br />
function _demone {<br />
<br />
# vers = versione del demone ; var = nome dello script d'avvio del demone<br />
local vers="" var=""<br />
_nome_e_riga "$2"<br />
_prompt "$2"<br />
if [ -f "$1" ]; then<br />
case "$1" in<br />
/usr/sbin/NetworkManager)<br />
vers=$(NetworkManager --version)<br />
var="network-manager"<br />
;;<br />
/usr/sbin/wicd)<br />
vers=$(wicd -h | head -2 | tail -1)<br />
var="wicd"<br />
;;<br />
esac<br />
<br />
echo "$2 è installato (versione "$vers")" >> "$log" && _ok<br />
invoke-rc.d "$var" status &>/dev/null<br />
[ $? -eq 0 ] && echo "$2 è in esecuzione" >> "$log" || echo "$2 non è in esecuzione" >> "$log"<br />
else<br />
echo "$2 non è installato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni utilizzate per tipo di problema (particolari)<br />
# --------------------------------------------------------------------------<br />
<br />
# comando 'cat /sys/class/dmi/id/{sys_vendor,product_name,product_version,bios_version}'<br />
function _dmi_decode {<br />
local var="/sys/class/dmi/id/*"<br />
_nome_e_riga "$var"<br />
_prompt "$var"<br />
if [ -f /sys/class/dmi/id/sys_vendor ]; then<br />
echo "Produttore: $(cat /sys/class/dmi/id/sys_vendor)" &>> "$log"<br />
echo "Prodotto: $(cat /sys/class/dmi/id/product_name)" &>> "$log"<br />
echo "Versione: $(cat /sys/class/dmi/id/product_version)" &>> "$log"<br />
echo "BIOS vers.: $(cat /sys/class/dmi/id/bios_version)" &>> "$log" && _ok || _error<br />
else<br />
echo "File /sys/class/dmi/id/sys_vendor non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# esistenza di pacchetti contenenti firmware e firmware presente sulla macchina<br />
function _firmware {<br />
local i var="Firmware"<br />
_prompt "$var"<br />
_nome_e_riga "$var"<br />
dpkg -l | grep -i firmware >> "$log" && _ok || _error<br />
echo >> "$log"<br />
<br />
# Elenca i file contenuti nelle directory specificate<br />
for i in "/usr/lib/firmware" "/usr/local/lib/firmware" "/lib/firmware" "/run/udev/firmware-missing"; do<br />
if [ -d "$i" ]; then<br />
echo "Contenuto di ${i}" >> "$log"<br />
ls -alR "$i" >> "$log"<br />
else<br />
echo "${i} non trovata" >> "$log"<br />
fi<br />
echo >> "$log"<br />
done<br />
}<br />
<br />
# Stampa sullo standard output l'eseguibile associato a x-session-manager (il default)<br />
function _x_session_manager {<br />
update-alternatives --query "x-session-manager" |<br />
awk '$1 ~ /^Value:$/ { print $2; exit 0 }'<br />
}<br />
<br />
# Stampa sullo standard output l'eseguibile associato a x-window-manager (il default)<br />
function _x_window_manager {<br />
update-alternatives --query "x-window-manager" |<br />
awk '$1 ~ /^Value:$/ { print $2; exit 0 }'<br />
}<br />
<br />
# Stampa la lista dei pacchetti installati che soddisfano una data dipendenza<br />
# con versione (del programma e in Debian) e archivio di provenienza<br />
# Viene chiamata con un parametro:<br />
# $1 - nome della dipendenza<br />
function _soddisfa {<br />
echo "Installati (${1}):"<br />
aptitude search '?installed?provides('"$1"')' --disable-columns \<br />
--display-format "- %p (versione: %v; archivio: %t)"<br />
}<br />
<br />
# Restituisce un exit status di 0 solo se l'eseguibile con il nome scelto è in esecuzione da parte dell'utente ($utente)<br />
# Viene chiamata con un parametro:<br />
# $1 - comando di cui controllare l'esecuzione da parte di $utente<br />
function _is_running {<br />
local list_pids_user list_pids_bin pid pid2<br />
list_pids_user=$(ps -U "$utente" -o pid) # lista di interi, separati da spazi, con i PID dei processi avviati da $utente<br />
list_pids_bin=$(pidof -- "$1") # lista di interi, separati da spazi, con i PID dei processi del comando $1<br />
for pid in $list_pids_user; do<br />
for pid2 in $list_pids_bin; do<br />
if [ "$pid" = "$pid2" ]; then<br />
return 0 # trovato<br />
fi<br />
done<br />
done<br />
return 1 # non trovato!<br />
}<br />
<br />
# Funzione che "cerca" di ricavare il nome e la versione del DE/WM utilizzato<br />
function _de_wm {<br />
_nome_e_riga "Desktop Environment - Window Manager"<br />
_prompt "DE/WM"<br />
{<br />
# impostazione di default<br />
echo -n $'Default:\n- x-session-manager: '<br />
_x_session_manager<br />
echo -n "- x-window-manager: "<br />
_x_window_manager<br />
# installati<br />
if [ "$(command -v aptitude)" ]; then<br />
_soddisfa "x-session-manager"<br />
# _soddisfa "x-window-manager" # non essenziale e impiega già tanto<br />
fi<br />
} >> "$log"<br />
# in esecuzione<br />
echo -n "In esecuzione: " >> "$log"<br />
if _is_running "ksmserver"; then<br />
kf5-config -v 2>/dev/null >> "$log" || # KDE5<br />
kde4-config -v 2>/dev/null >> "$log" && _ok || _error # KDE4<br />
elif _is_running "gnome-shell"; then gnome-shell --version >> "$log" && _ok || _error # GNOME Shell<br />
elif _is_running "xfdesktop"; then xfce4-about -V | head -n1 | cut -d ' ' -f2- >> "$log" && _ok || _error # Xfce4<br />
elif _is_running "openbox"; then<br />
if [ "$(_x_session_manager)" != "/usr/bin/openbox-session" ]; then<br />
echo -n "(altro x-session-manager) + " >> "$log" # Session manager (LXDE?) + Openbox<br />
fi<br />
openbox --version | head -n 1 >> "$log" && _ok || _error # Openbox<br />
else<br />
echo "Sconosciuto" >> "$log" && _error # NON TROVATO<br />
fi<br />
}<br />
<br />
# Funzione che elenca i pacchetti non appartenenti alla release di default utilizzata<br />
function _extpack {<br />
<br />
local var="Pacchetti esterni"<br />
_prompt "$var"<br />
<br />
# La funzione termina se aptitude non è installato<br />
if [ ! "$(command -v aptitude)" ]; then<br />
_nome_e_riga "$var"<br />
echo "Aptitude non è installato" >> "$log" && _error<br />
return 1<br />
fi<br />
<br />
local riga indirizzo rel linea release=""<br />
<br />
# variabile con il contenuto del file sources.list (solo righe che iniziano con deb<br />
# e che contengono "main" )<br />
local sourceslist="$(sed -e '/^deb /!d' -e '/.* main.*/!d' /etc/apt/sources.list)"<br />
<br />
# variabile che contiene l'output del comando "apt-cache policy"<br />
local aptcachepol="$(apt-cache policy)"<br />
<br />
# ciclo sulle righe della variabile "sourceslist"<br />
while read linea; do<br />
<br />
# variabile che contiene l'URL dell'archivio (es. http://ftp.it.debian.org/debian/)<br />
indirizzo="$(awk '{ print $2 }' <<< "$linea")"<br />
<br />
# sostituisce / con \/ (necessario per il successivo sed)<br />
indirizzo="$(_sed_quote "$indirizzo")"<br />
<br />
# release della riga corrente (es. wheezy o testing o sid)<br />
rel="$(awk '{ print $3 }' <<< "$linea")"<br />
<br />
# controlla che sia un nome di release valido<br />
if [ "$rel" = "oldstable" ] || [ "$rel" = "stable" ] || [ "$rel" = "testing" ] || [ "$rel" = "unstable" ] ||<br />
[ "$rel" = "$OLDSTABLE" ] || [ "$rel" = "$STABLE" ] || [ "$rel" = "$TESTING" ] || [ "$rel" = "sid" ] ||<br />
[ "$rel" = "oldoldstable" ] || [ "$rel" = "OLDOLDSTABLE" ]; then<br />
<br />
# controlla che sia un repository di Debian<br />
# si basa sull'output di "apt-cache policy" e su o=Debian e l=Debian<br />
riga="$(echo "$aptcachepol" | sed -n '/'$indirizzo'*.*'$rel'\/main.*Packages$/ {N; /.*o=Debian,.*l=Debian,/p}')"<br />
<br />
# se è un archivio valido, aggiorna la variabile "release"<br />
if [ ! -z "$riga" ]; then<br />
if [ -z "$release" ]; then<br />
release="$rel"<br />
else<br />
release="$(printf %b "$release\n$rel")"<br />
fi<br />
fi<br />
fi<br />
done <<< "$sourceslist"<br />
<br />
# Lo script DEVE rilevare almeno una release. Se la variabile "release" è nulla, c'è un errore in "sources.list"<br />
# oppure non è stato eseguito un aggiornamento della lista dei pacchetti (update)<br />
# (vedere anche il modo in cui viene ricavata la variabile "release" in alto)<br />
if [ -z "$release" ]; then<br />
_nome_e_riga "${var} all'archivio \"NON RILEVATO!\""<br />
echo "Release non rilevata. Repository errati oppure è necessaria una modifica dello script" >> "$log" && _error<br />
return 1<br />
fi<br />
<br />
# Rimuove eventuali duplicati (esistono repository doppi in sources.list)<br />
release="$(echo "$release" | sort -u)"<br />
<br />
# Numero di release trovate<br />
local num=$(echo "$release" | wc -l)<br />
<br />
# Se il numero di release è diverso da 1 (pinning?), la funzione termina<br />
if [ "$num" -ne 1 ]; then<br />
_nome_e_riga "$var"<br />
echo "Sono presenti ${num} release in sources.list" >> "$log" && _error<br />
return<br />
fi<br />
<br />
local pkg=""<br />
<br />
# Se il numero di release è uguale a 1, la variabile pkg conterrà i pacchetti *non* facenti parte della release<br />
case "$release" in<br />
"$OLDOLDSTABLE"|oldoldstable)<br />
release="oldoldstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aoldoldstable' --disable-columns | column -t) ;;<br />
"$OLDSTABLE"|oldstable)<br />
release="oldstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aoldstable' --disable-columns | column -t) ;;<br />
"$STABLE"|stable)<br />
release="stable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Astable' --disable-columns | column -t) ;;<br />
"$TESTING"|testing)<br />
release="testing"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Atesting' --disable-columns | column -t) ;;<br />
sid|unstable) <br />
release="unstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aunstable' --disable-columns | column -t) ;;<br />
esac<br />
<br />
# Invia al log il contenuto di pkg (se esiste)<br />
_nome_e_riga "${var} all'archivio \"${release}\""<br />
if [ -z "$pkg" ]; then<br />
echo "Nessun pacchetto esterno installato" >> "$log" && _error<br />
else<br />
echo "$pkg" >> "$log" && _ok<br />
fi<br />
}<br />
<br />
<br />
# --------------------------------------------------------------------------<br />
# Main<br />
# --------------------------------------------------------------------------<br />
clear<br />
<br />
_intro<br />
<br />
if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then<br />
_debug<br />
_avvertenze<br />
_check<br />
_scelta<br />
_hide<br />
_upload<br />
_compress<br />
elif [ "$UPDATE" -eq 1 ]; then<br />
_self_update<br />
elif [ "$BASE64" -eq 1 ]; then<br />
_base64<br />
fi<br />
<br />
_exit<br />
</pre><br />
<br />
== Changelog ==<br />
<!-- 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) --><br />
;1.0.70<br />
:''Aggiunta oldoldstable''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] ([[Discussioni utente:S3v|discussioni]]) 21:08, 15 mar 2021 (UTC)<br />
;1.0.69<br />
:''http->https per paste.debian.net''<br />
:''Sostituito "which" con "command -v"''<br />
:''Aggiunto _pack "amdgpu"''<br />
:''Aggiunta funzione per quotare stringhe prima di passarle a sed''<br />
:''Rimosso comando "udisks --dump" (non più presente in Debian)''<br />
:''Gestita la mancanza di aptitude''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 13:21, 23 ott 2020 (CEST)<br />
<br />
;1.0.68<br />
:''Nascosti indirizzi MAC delle interfacce wireless''<br />
:''Sovrascrittura del comando cat per evitare che al file di''<br />
:''log venga inviato il contenuto di un file non di testo''<br />
:''Impostata a 'on' l'opzione 'extdebug' per consentire l'espansione''<br />
:''di ARGC per Bash >= 5''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 15:00, 23 mag 2020 (CEST)<br />
;1.0.67<br />
:''Aggiornamento per rilascio di Debian 10 ([[Buster]])''<br />
:[[Utente:HAL 9000|HAL 9000]] 09:39, 7 lug 2019 (CEST)<br />
;1.0.66<br />
:''Aggiunto problema per avvio del sistema (boot)''<br />
:''Aggiunta funzione _su (c'erano problemi con lo script ALSA)''<br />
:''Aggiunte directory <code>/etc/fstab/</code>, <code>/etc/modprobe.d/</code>'',<br />
:''<code>/etc/modules-load.d/</code>, <code>/etc/network/interfaces.d/</code> e il''<br />
:''file <code>/etc/modules</code>''<br />
:''dmesg dello script ALSA spostato nello script''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 10:37, 29 giu 2019 (CEST)<br />
;1.0.65<br />
:''Aggiunti "ip -s -d link show" e Xorg.0.log locale''<br />
:''Nascosti username, password e dominio per montaggi cifs''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 20:49, 20 feb 2018 (CET)<br />
;1.0.64<br />
:''Aggiornamento per rilascio di Debian 9 ([[Stretch]])''<br />
:[[Utente:HAL 9000|HAL 9000]] 10:46, 18 giu 2017 (CEST)<br />
;1.0.63<br />
:''Debug come parametro''<br />
:''KDE5 tra i DE rilevati''<br />
:[[Utente:S3v|S3v]] 22:38, 19 mag 2017 (CEST)<br />
;1.0.62<br />
:''Inserito debug''<br />
:''Inserita funzione _printdot (per evitare ripetizioni)''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 17:41, 26 feb 2017 (CET)<br />
;1.0.61<br />
:''Aggiunta funzione _header() (intestazione del file di log)''<br />
:''Aggiunto parametro "--versione"''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 13:53, 10 dic 2016 (CET)<br />
;1.0.60<br />
:''Elenco ricorsivo delle directory contenenti firmware''<br />
:''Nascosti (altri) ID di connessioni gestite da NM''<br />
:[[Utente:S3v|S3v]] 20:53, 6 dic 2016 (CET)<br />
;1.0.59<br />
:''Modificata funzione _hide() per nascondere completamente hostname contenuto nel''<br />
:''nome utente (e viceversa)''<br />
:[[Utente:S3v|S3v]] 21:33, 11 nov 2016 (CET)<br />
;1.0.58<br />
:''Rimossa precedente istruzione e modificata regexp per far funzionare la ricerca di''<br />
:''pacchetti esterni sia su stable che su testing''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 16:44, 10 lug 2016 (CEST)<br />
;1.0.57<br />
:''Istruzione per rimuovere eventuale slash alla fine dell'URL in "sources.list"''<br />
:''Aggiunti comandi "systemd-cgtop -b --iterations=5", "systemd-cgls" e "systemd-delta" a problemi comuni''<br />
:[[Utente:S3v|S3v]] 21:27, 9 lug 2016 (CEST)<br />
;1.0.56<br />
:''Rimosse dal file interfaces anche le chiavi relative a wep e a wpa-enterprise''<br />
:[[Utente:metaldaze|metaldaze]] 12:54, 04 feb 2016 (CET)<br />
;1.0.55<br />
:''Opzioni per aggiornare lo script o crearne una codifica base64''<br />
:''Corretti ESSID in "nmcli device show" non nascosti''<br />
:''Rimozione duplicati in "release" (pacchetti esterni)''<br />
:[[Utente:S3v|S3v]] 21:26, 15 giu 2015 (CEST)<br />
;1.0.54<br />
:''Correzioni minori legate alla compressione xz; semplificata lettura nome utente in caso di errori con logname''<br />
:[[Utente:HAL 9000|HAL 9000]] 18:41, 31 mag 2015 (CEST)<br />
;1.0.53<br />
:''Vengono rimosse dalla variabile "release" (pacchetti esterni) le linee duplicate''<br />
:[[Utente:S3v|S3v]] 18:22, 30 mag 2015 (CEST)<br />
;1.0.52<br />
:''Aggiunta compressione xz, se disponibile, con ripiego su bzip2 oppure gzip''<br />
:[[Utente:HAL 9000|HAL 9000]] 22:15, 17 mag 2015 (CEST)<br />
;1.0.51<br />
:''Aggiunti comandi "systemctl --failed", "journal -x -b --no-pager [-p [err, warning]]",''<br />
:''"blkid", "lsblk", "dpkg --audit"''<br />
:''"/var/log/syslog" e "dmesg" solo se non è installato systemd''<br />
:''Aggiunta variabile globale "oldstable" e aggiornate "testing" e "stable"''<br />
:''Modifiche minori''<br />
:[[Utente:HAL 9000|HAL 9000]] e [[Utente:S3v|S3v]] 17:12, 4 mag 2015 (CEST)<br />
;1.0.50<br />
:''Rivista la funzione _extpack (repository Debian''<br />
:''in base al comando "apt-cache policy")''<br />
:[[Utente:S3v|S3v]] 22:37, 22 dic 2014 (CET)<br />
;1.0.49<br />
:''Aggiunti trap INT e "dpkg --print-foreign-architectures"''<br />
:''Spostato "dkms status" nei comandi generali''<br />
:[[Utente:S3v|S3v]] 21:19, 20 dic 2014 (CET)<br />
;1.0.48<br />
:''Corretta la ricerca per i pacchetti esterni''<br />
:''Aggiunto _pack "linux-image"''<br />
:[[Utente:S3v|S3v]] 20:16, 19 nov 2014 (CET)<br />
;1.0.47<br />
:''Inseriti "nmcli dev list" (per Wheezy) e "nmcli device show" (per Jessie e superiori)''<br />
:''Inserito "udisksctl dump"''<br />
:[[Utente:S3v|S3v]] 15:55, 5 nov 2014 (CET)<br />
<br />
(Prosegue nella pagina di [[Discussione:Creazione automatica di un file di log per inviare quesiti al forum|discussione]]).<br />
<br />
{{Autori<br />
|Autore=[[Utente:S3v|S3v]] 23:38, 13 apr 2013 (CEST)<br />
}}<br />
<br />
[[Categoria: Bash Scripting]][[Categoria: Configurazione ethernet]][[Categoria: Configurazione wireless]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Guide@Debianizzati.Org:Passaggio_alla_stable_-_pagine_da_aggiornare&diff=44292Guide@Debianizzati.Org:Passaggio alla stable - pagine da aggiornare2021-03-15T21:18:55Z<p>S3v: oldolstable da aggiornare per script di creazione log</p>
<hr />
<div>Questa pagina cerca di raccogliere tutte le guide del Wiki che '''necessitano''' di essere aggiornate nel momento in cui viene rilasciata la [[stable]] di Debian, in quanto estremamente importanti e per cui deve essere garantita la compatibilità con la nuova versione di Debian.<br/><br />
Lo scopo è di modificare rapidamente le pagine del Wiki senza aggirarsi al suo interno per ore (o giorni) in cerca di riferimenti da modificare.<br />
<br />
Modificare liberamente questa pagina.<br />
<br />
Si ricorda che, soltanto per le guide segnalate come compatibili "per tutte le versioni" o per le pagine di glossario o categorie, per fare riferimento ai [[codename]] delle attuali [[stable]], [[testing]], [[oldstable]], ecc... è sufficiente utilizzare il [[Template:Codename|template Codename]], senza bisogno di tenerle aggiornate a ogni rilascio, se non sono richiesti altri interventi di modifica.<br />
<br />
<br />
'''Legenda:'''<br/><br />
<big>{{Color|colore=verde|string=✔}}</big> - Guida modificata<br/><br />
<big>{{Color|colore=rosso|string=✖}}</big> - Guida da modificare<br />
<br />
<br />
{|class="wikitable"<br />
|-<br />
|colspan="5" | '''Tabella guide da modificare o creare'''<br />
|-<br />
! style="width: 25%" | Guida<br />
! style="width: 60%" | Note<br />
!2015<br />
!2017<br />
!2019<br />
!2021<br />
!2023?<br />
|-<br />
|[[Indice Guide]]<br />
||banner<br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=rosso|string=✖}}</big><br />
||<br />
|-<br />
|[[Template:Codename]] <br/> <small>('''modificherà''' i task successivi)<br />
||aggiornare le informazioni del template<br/><small>(basta seguire [[Guide@Debianizzati.Org:Aggiornare_template_Codename|questa guida]])</small><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=rosso|string=✖}}</big><br />
||<br />
|-<br />
|[[La struttura della Distribuzione]]<br />
||sezione [[La struttura della Distribuzione#I nomi delle release|I nomi delle release]]<br/><small>('''solo dopo''' il [[Template:Codename|template Codename]])</small><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=rosso|string=✖}}</big><br />
||<br />
|-<br />
|[[{{Codename|testing|IN_LINK}}|Codename attuale testing]]<br/><small>(farà riferimento in automatico alla nuova testing)</small><br />
|| creare la pagina, basandosi su [[testing|questa]]<br/><small>('''solo dopo''' il [[Template:Codename|template Codename]])</small><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=rosso|string=✖}}</big><br />
||<br />
|-<br />
|[[{{Codename|stable|IN_LINK}}|Codename attuale stable]]<br/><small>(come sopra farà riferimento alla nuova stable)</small><br />
|| modificare la pagina, basandosi sul modello della [[{{Codename|Oldstable}}|precedente stable]]<br/><small>('''solo dopo''' il [[Template:Codename|template Codename]])</small><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=rosso|string=✖}}</big><br />
||<br />
|-<br />
|[[Installare Debian]] || controllare la guida e aggiornarla<br/><small>('''solo dopo''' il [[Template:Codename|template Codename]])</small><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=rosso|string=✖}}</big><br />
||<br />
|-<br />
|Scrivere una [[Installare Debian {{Codename|stable|IN_LINK}} - netinst|nuova guida di installazione]] <br/><small>''(facoltativo)'' (oppure anche [[Installare Debian {{Codename|stable|IN_LINK}} - netinst - testuale|questa]] o [[Installare Debian {{Codename|stable|IN_LINK}} - CD/DVD|quest'altra]])</small><br />
||<small>('''solo dopo''' il [[Template:Codename|template Codename]])</small><br />
||<br />
||<br />
||<br />
||<br />
||<br />
|-<br />
|[[Installazione Debian: pagine utili]]<br/><small>(''facoltativo'', a meno che non si scrivano nuove guide di installazione)</small><br />
||aggiungere eventuali guide di installazione<br/><small>(aggiornando anche il [[Template:Installazione|template Installazione]])</small><br />
||<br />
||<br />
||<br />
||<br />
||<br />
|-<br />
|[[Creazione automatica di un file di log per inviare quesiti al forum]]<br />
||variabili OLDOLDSTABLE, OLDSTABLE, STABLE e TESTING<br/><small>(modificare anche numero di versione e [[Aiuto:LogScript]])</small><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<big>{{Color|colore=rosso|string=✖}}</big><br />
||<br />
|-<br />
|[[Template:LTS]] <small>''(facoltativo)''</small><br />
||verificare le informazioni presenti e aggiungere quelle relative all'attuale [[oldstable]]<br />
||<br />
||<br />
||<big>{{Color|colore=verde|string=✔}}</big><br />
||<br />
||<br />
|-<br />
|Rimozione avvertimento per cambiamento repository di sicurezza<br/><small>(rimozione anche release/updates in luogo di release-security, ed anche delle condizioni #ifeq)</small><br />
||Da eseguirsi al rilascio di Debian 12<br/><br/>Guide affette:<br />
* [[I repository ed il loro utilizzo]]<br />
* [[Repository & pinning]]<br />
* [[Repository ufficiali]]<br />
||<br />
||<br />
||<br />
||<br />
||<big>{{Color|colore=rosso|string=✖}}</big><br />
|-<br />
|}<br />
<br />
[[Categoria: Wiki]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Aiuto:LogScript&diff=44291Aiuto:LogScript2021-03-15T21:15:23Z<p>S3v: aggiornato a 1.0.70</p>
<hr />
<div>__NOTOC__<br />
=Contenuto=<br />
Nella sezione successiva '''S''' è riportato in formato base64 un archivio tar compresso con gzip e contenente uno script eseguibile per la [[Creazione automatica di un file di log per inviare quesiti al forum]].<br />
<br />
Dopo ogni modifica dello script del punto precedente, andrà modificato il contenuto della sezione successiva. Si suppone che tale script si chiami <code>scriptlog-debianizzati.org</code>, si procederà come segue:<br />
* creazione di un archivio compresso (con <code>tar</code> e <code>gzip</code>, gli unici comandi essenziali) in formato base64<br />
<pre><br />
# ./scriptlog-debianizzati.org --base64<br />
</pre><br />
* sostituzione del contenuto della sezione successiva con il contenuto del file temporaneo creato;<br />
* aggiornamento della versione corrente dello script, nella riga successiva.<br />
<br />
<br/><br />
'''Versione corrente dello script:''' <code>1.0.70</code><br />
<br />
<!-- *NON* MODIFICARE IL NOME DELLA SEZIONE, deve restare *ESATTAMENTE* com'è --><br />
<br />
=S=<br />
H4sIAOHNT2ACA9Q823LbyHJ+Fb9iDNOm6DVvsmXvyofeyJK8qypbUkR5KylKxYKAETkxCGBxoWVd<br />
qvKYz0jlKXnN23n2n+RL0t1zwQCE5FhHPlVR7ZrgYKanZ6bv3cNuL/USEWdBNO34/FS4obi4cDPR<br />
jZLpg3v668Pfq/V1/By8Wu/bn/D0YjDorz8YvOivPX/14uX6+uABtL14PnjA+g/+Dn95mrkJYw/S<br />
54tb+33r/f/Tv0cPWe9UhL1TN501Go9Y597+ANjuPI5gey9EFIr7hY3A2ZkIOPMSDuTKUjdxwzBi<br />
AZ9OxakIBOMMKXshv/guy/IsE4187qafGJDdgGCEGU88nkkcOdvKkuCnrUaWuDGb8HORsd29I+y4<br />
iVB0L58HQSuK5ZcWP8+AcfJpi4Xc4ykgIlwW84TxNHZDnyecbR7+tsVECHDewjazdcBtwZMUt4Wl<br />
uYejxII30lkUZ6yTMg3y3g/kXR7SYTBvBtsTLRKX9iiCjfOiOWB7/8d0KOaxcEGmMO7NIsZ9+dkJ<br />
nzF4w30e+pFq4rAvcKJAM6k8NcAJaNPQz0iEmQvvmOvRmWXuBrRqeMzJeJpFDmOPGBDdPHZZykOY<br />
12WeG0dALaEbcDPA9GbWAC8Kb+hu/5nueeiyRExdtsijzG2c5aGXAa5yxGWDMXHGxqwJWzrN2ICd<br />
sCdP4LvTHDhsyJxO6LCT1yyb8bCBYNOZOMvoKU5gpWfscQp9nzrQxIOUl98cH4f65ZloXONOj4DX<br />
RJaL1ONMBOpAI9by3KxFBAmry5IoCFwgSSQAN5As5AsG4h8gLHgIixHhQrgZHMrZGeyyWLhzDmwi<br />
QcJDmMM7GJKHZjRtZbF8mLBYvdNcpW6d0/esOWjjylubo63dXRh1DojZO0CSCEfjFtnLlif2DuGE<br />
MIGe0l79vfLJFoqtMLt/bvhDsr2UTXHWAOHlR2Hwhf2xczja3d/bGTqDbr/7qu9g7wM3mzFc8lwK<br />
nWhp2MHm0e+Tvc0PMK65iq2BCD+xzhns4OXbzdHvk9H+x8OtnXH/5NppE8ytCFgOjpQoIgp8WOhp<br />
wJ8x+Qmz4c6KcNpl2y6bR744Ex4STMgtWSWA7AOQHQKPYpvMhgKn/ffb8N/oaPPte0DrX3AAd0qv<br />
9bs0S3jmzayX+s0pqGWeWC+OdkZHu3u/4ZsAqOILLzbI50JLr1t2aeggdW30Uvo3T5OeecAmAren<br />
NtpmC2AHBsoRuSVwQY9kKCWSBFmimAD6DR34Z9JchR6gFH567D8+nTz+/fGHx6NWux64FPEGhkR6<br />
Qq2AbDaPe3bTbaCJMXwuu0cJHS2wq5zg3fbwF+z08fA9S/g8Qu7luJbYnYKMU0xNLF6zdaOtw92D<br />
Ixg7dGZZFm/0etNc+LxbtRV7AlTdeTeexb+CEAr4cAtAkIacuCAw5tDNcye+mOThBDcAH3HDANUJ<br />
CZyET/7MeSoyMXGDyVmU5PMnLsmTIfdF5nzvEqBR0i50Vkf48kXNuibAJjsvX3zv8jYFrGrjfTQd<br />
0WxLqBLP5hmRifwYNldhwch6bdADDZSM8oXDHoI2SKIoA33Arq5IdgK97B9tbuj2r/+JhzoHXorY<br />
ahoFURuUG6yUByio0zgQHpgnUlD7QKktNTVjQEfyeQ0QmHJ8hG1L088+G4D5zdbesJ7PF70Q+Ipd<br />
MS8HC8RnzoaDUmTQBnwaUutZgBwSzlrt7oYpTwQKA6C5LI/stTtaDWDHZgGirPksYGyV5IpUqRFR<br />
8rE98Nhpw6bYusEaLN+ARmAMD7pAGTfcWsGweWmeNzoW9GvZ8RFpmTj/+t+atBK+wcCcuxDPGMjJ<br />
PJA2yTMW5tGCow0w469Z+PW/4CxStPikQcD0wovpHj16Oh5vACiPb5ycPL12yCqgOeEUQP6mAiUf<br />
R5rtgXDsqbNahWP+MwdlHCCUNgwon6W1Rw6zj3TtzZOBJiqtSPeKA6KVAlQBlkJEXyQG8OohAHqy<br />
JoehKby2vg5fruF/vYtmSmwDKsjYLS1roKcN+6lOmlFmoG+Ll9iELUCw+EEso1QXkDloKrL7weDP<br />
cKeKcYf7o9H+0DnuP38+7g9ePx/MHbbyCI4wiGBDkwiZh7MpGL2AGBgstvLd3rEGrpUGgqnu8/qB<br />
b0GZmXFzpzAQa/q+290zcxRdoW/CoSeub4GuwyktDqwzPGowGpHNv8CBzH0UAiIEPQ2SDwCTaRWn<br />
rEO2+3zIOjGT9pWjBkja0sOHRAb6S99SPLLp3o2oEZceUsIBX6Bc5gqg1gROM0sqmvq+zSzl58iN<br />
TDlI3QCtdcaTBPVBDhQEsj0i06FACW2fZI4KpcDMGLUT6DefAADiJMlHB2ao4SLh4JbLznkaSdv0<br />
A7qF4JeS3QwgkKrgXBeCoyUYc08rqlh8/auyrTMRU/c4icAum8PuZeCWotsYAUQL7W4VRxxZQfTr<br />
vxmvypoQsICJUJuQRV2Z8PaFLESauwEpSBAbYNV4bkqK1suF8iPsheGGZqS9NN5RFW3Y7mWsgdpR<br />
f8+l5quB8jdg2enMeBDT0aWgcEBnhsKzQNsLqCILc1WQ3Q2skc2B9FOkRCeNAD5rBD4jkCJaL3Cc<br />
AdKNOcW6dZSpWLqcIgTTaC7VD9jjpOnriLkGYUJWO5CnoCo/1o7caDSaKNc6HaSI4SWY6PxqAUZR<br />
dHUKtsiVm/siunLj7Goe5WF2lUW5N4td/2qKehJ28LqJoo7UhNB7j3q8ju6qRNeFYTvpBlOTwyzQ<br />
oPEJI9xCEJepnoHYjriIwkCRcUp1RzIUybu1wYDOzPgyDO34ChrB0LyEfsoW7IYopBWIPEZbXEOQ<br />
o4niklBTuzRCgctBavsijeG8iPswZoBWg6tDQNxAlTZqGerSukIWuMa2VWZtWZhqcGT+a2gIx4Zi<br />
7GVeJik6s5IDUQ9cI19gqzkN8dNvS2OR70DVeTkRtXUgyIY1cNAdyMro4SBQncAqaJFILvmjfmbt<br />
pJXRL7ginUWfsbPFwk3thDvlGXbBERByChUAFEZXiy5771qa+2j3YB9OPQHGBwOUL8AqR9tDxDwT<br />
Oo6FggjNNqUSuC05iOxPA/DF3cbe/tb+h4PDndFo2Ad34GBzdLQDTziF+pgc7pimyebBkX78Y3d7<br />
x/R5u78PLxqyz8ftXfPiw54ZcLT/cet3/QVm/QDPHw+2Nwm68pD6je2dtx9/g8/G5xmu1YS2+mBo<br />
vGZ+hHSGrjJFuIS07R1N106brYxNXAJDouN/OAH714qNlWUrQQGTRU0/YK9fa4iS/+4MUa3MhljI<br />
Fg212H2AyP8sQ9TKCoBZpzSQJp0NlUSI01YQ6Qi/BU6e82ClCoxIA6WxAodnVQPLqH8ARqQywHcF<br />
tQyWYIKUvTNIJLrBMpqkL+4MVJLvoAoU1c+dYRIX1KwdtdndV0/stIQoKcY7A0W2rNlSrWfvDFfy<br />
+BKyWm3fGS6Ji9LOkt4AeHfjTillSgC1VFc4fjfIQtoXMFHr3BnHwqhSAJ8CpBXjI6BKSV2voYP6<br />
Pqn5e/avtim8d69AC/UoVf8lhTCcJh1JiSrG7CEmbHpguHm9ZrN35vec5rttE85gOuBwzj12+W77<br />
+o3TtMOZjnobR0nGaPf/6ehwc2vnHfjTCEdmRHjGOuf0eI2quEDPC6KUW0hiz5+wZzHfk84PSAyY<br />
BJpQNsEPdl2V0R+wufFpBCZxfExmLmy3hJpxL6Qt03h633+Np4x9/vx5KTTK7vpHEO/1jyCOVPh3<br />
xo3Ri9Z8TlEjCuInAnyPXOdyjfMhpPsNdgA4giWQJmtjLMR7wPO+V37ff87NTqgbeDl6PAsQqeBI<br />
XHDyRGuMbKsHcmkQeW6A2x8bm7vR6bD3xkMAPTQT3OdM6HA3ZZgwBq5S6uRLgxcxzQV45TD4AF0V<br />
mUDQjluaL3lu6IWZ9Dx5eDE45DOM0LEWdT4Fjs5ahE4L4RnPscYPlCtPvv67Cp5EcRGEx2hcmPIw<br />
Jez+kN2WvTjjf7WiPIvzDJdJDo/ZxRtHgxtFHhFNZdxc1+wCpnUxfVIK0m/BlCLM8f141AtPfqVQ<br />
OUXJ8TxQp+Hn0Nk5PNw/xHcUkx5xyz+GqeaY/HVSh8G/I/x3vIt7dfLM8nlVEE1Gvy9AeyBgldoY<br />
m69DArPcOFKNk8L/KpEgnT0FEOCb9wmRCgTOl3BbP9C7IgW/83F3G/aBo6siEw+wuILu5PoCN/SE<br />
Cs8gyf1qhcyLvnZQpzpCRnEIc5mH0Jsog+psKuA4rcQ5khe59CawReHwKI5zgF6KZAjVsSHrD4rO<br />
knCCQBZ1IF1SIYysi7HPRbFWirHz0MP8WQKDIlAtYVRlTpmzwTQyoGiOSeaVoeW6e35R13p6sVbX<br />
PL0o53toS5ut47Dl7NRsjBz1jJmpzCPAB4QNVPSkMSkrEu5lUfLFOP1dp1FKDI1kqYtY8DL9WxxA<br />
35T3KolR6OSU41yNR+lJmyVzXBUwptoWezNKW2AvfCkZoyxGtBmV9Kb0ykCiLM3GH1LVYIwXFKXB<br />
N6XcjzNtKBrIMehRCG2QatCQlZGrQcqK4IDAzSZu6E9A3PrskkSWpGIaNcmTYNjCtG660etVAbVM<br />
Z2+Wh58mwGRn4nxolEH1fZjPh4PKBHhuEwxR5+mwX+5PhEy9sCJDCQJfAK9JS2KOhUxzl7Y/FeEU<br />
9YiUCkaQVxBIxQUftl72P7UaBMzkKlx2pjc2NduJCWO0ZqYJ1qChkCigsHP2gq3Cgngig6+070IW<br />
68nkoi7d8XPW+aTJXWWHzzDLhB7S2ot+OY2rReWUgS0ag1JUs1uqW8dYl0/WsWFsBgGfKuqoBHRl<br />
HYZIvTxVpTS5UniK64GnszwJiaGMDE4ECEvcLrlYJXsBpE53CraKKRksdAGtHkZtKWg96A4nYuxv<br />
K4OD/REnHNwmZUp1NU7aa17aNHXdiwK/U2nrFOUcaavdQ5Fhv3e6T5cEhyGihfCF2ZiiSsWsrGkd<br />
9ekXUBWqEC6NOVjtCQV9gSo5/74lSs6EubB2paDkNId2gb1dNuhLLAjw6tw9Ny1Se5mqyY6LO0Yc<br />
DM/gVHZ81tkym4CoO5aULW1d17lpa6Tp7pHDtETeRHi45IKfsTQNJEeXdQBVn8fZDDHJvsSge0Fv<br />
0GlWJ38KtK+SKOdM10bov88e63gW/5ip0LQZ1NU8oBbcVWari8aeSUKElCSxREO3VVP2ILXoTRA0<br />
8oDBtdyHrmNzBXVFg1GKowjkgj6/KnYgUNCwzYNMBrpdwcgSC2lvQQWDRyg2EEXgRUsGirDmAMf9<br />
zvMTGTFuyCQ4aGaZ0QhaiiMvXKtayhaKtnVi5ikMDAVQLs3H2uAsceciU+KY7Pxnlt3dUrSusrEg<br />
t0jOyHJLLcCBVIrRSLGtFuucAgJG0wBZiDJCa28MkbblkamDkybpr0AShfxc0TiDgIvhDNCKkeU8<br />
ichT8itsDMhikJoHwSj4TIIxdZ6qYEqWhWa4G9YeYF9l75hlktGzUjoPTJZi0hQYCaGRhZVlLvay<br />
V9+DI/3l5Gm7sWIRp9PtGmpUNIBbc40yvKWJBl8ZBK6dRhH3vhURdEtsZGqmVnARv2s2c4udiCgL<br />
p6FQ3t5lqzYaUtjZOD80mC3r/gG+UpabZk7kU1oAOUjsDJZ8+yEOaAEGecTMHL0kDBsdwqYOEzm9<br />
4nDzQAFIJSSV8U+l1rYyLCTkMgd3e3U8DAeu0j7f4EmJlGU+F30MlgWOSn83l5ZX4w5KNr85Y1uY<br />
i3kcRGDrq+I6YHEQrzdZmVZ1hiyxs3I5KiRal8yRiDcsQ1R5Flipao69VMbzq1YWD3FvdF1qz6KS<br />
WsdpD1aEJp4p6qiEQJaXRIK8CHo4xQwO0VoJK1I1S4aUImbX2B4wUzc7z+r2vXC+SIdUsVPFlkv7<br />
rnyzVqPsmdX5ZdorU8RVcQduEbVaWddoOFVuIkVWy2blpUEjQWaikU+ZMpoEOaXHZe/qYcviSzut<br />
97RtK3Otx9V5lLBxdE7hB/qF6CXost1C+RamNy/ZiKoaPOqRbENlFf0ol1HIyKA7d6kgwCgCrQB6<br />
qX66dQF2gEi1TaJP4Dla9wuK1aqwm4YstfHNEYfXrJyh0BNQmZCaYUeaGhLIbZgqcBVhR/HsJY8I<br />
6+ATLCiRIBX8VpT4YONvmKgKxVHMFxlJMV+nFzWoK1n53nIwtdMp61okgVplPsIuZShn1Y3YrM2q<br />
K8lZGyNWMmRLrm25wufuMkMeyihzbQ/1pkqiblf7lywNOI/ZwJYx4CtjFSaIH9ZZsPOLtrMkb84v<br />
MGP2F+3WvCmFjzBuaNMkRkBtEjKyqGa20wsRr9VMSO2s80vdnBSm+lsmnQLwmjmx+YYpp9+zzKrI<br />
deguoVJ28mYSBbOpGEpFSIFArZrlbwrbPVvK3njqP17ukg+vMisgZL7+Fa8u8oAXskFXx92zeLVC<br />
aWjluMDv0lbR+TCNhUs+nr4GY7E4VTFlFJMxeQvJ56bexGGlYoLPLpg0+DADVgWmc6igxXKh8R22<br />
yUdjURmYVBvi3A5TVp+UYVLbDTCxNuRbeFLxSQVPbLsJTyoN+QaesvikDJPaboJ5gGjeDlP1KcOM<br />
M3YTnh/2vg2T6lk6eSjrWiRMer4BJlWafGPtppzFwjOD7zfhiVUm3zojU8piwUSRBSResc7LWk2F<br />
uChXLDkQOVLyhKka1nXCUl4UlO/loVXUrBVYmM/Jl/EC0FrwKfPzRdpzpFlLWsVL1d6qAvPPHG8B<br />
qGQjLU+pWfvi5nhwUvCsqrYXyJOUaQylaJSJVGCsxnjN6k5s0Rg/t5qgHxJ2Y/zCaiSybIzXy/2m<br />
6FGbNLpyLgRbBSJsN8Yvy52JYnqKihrjV+W36jDIzJJ2s6aQxvjnE7YZ6OpIe5sa4/4J+4g+suvQ<br />
dsvCxCzJuXFMiySQx6eB4HLDVXgQzTcqzvXpLpCdFKITLHJCFMQThaIbDzo/n7RXJBGiinkCRIX/<br />
dt4wtMXQwjP3JV0WedJSVFEtc3tF17aXAokDgHuDfLTEI0xWGrVmjapIQEsAVkc9t0ZVZJwl4qqj<br />
XlijKlLMEmLVUevWqIqcssRUddRLa1RFElmCqDrqlTWqImssUVMd9bM1qiJNLGFij1J0cAo084kA<br />
AhkcKSsZr0wLD1Rji+iyVZqqD1NRBEgNKm470H06LEzot1hXkTfd6rN0rFX60V6BGbEeiAF5q3sF<br />
mr5El22ZeA/4pBjx1LcpVFky2VA+3Z91GysrFBT18nxA8UgEp257y6vuugf37VDSmQhVYgaeipLr<br />
GexDZKc1KcTzAx1YrMPmf5eSLCr8UHHaFK8OoUzRN3zV1ftneNsCc3xCVawkQekiSQJGZlbUn6OM<br />
GoNqY83bam9I24C/TT/ZEESJdb+VbLMEw/i1l2wwaeFHxYR4I9Ic9g2nbbqcURcUXmmWuLJPJK9E<br />
RuVrJc3B//zrfzQvsZ7/+jh0il9L0GhzttA/yvB/Wib5+dZNvJL/L3/jAJNLMp5vLZg8+2LZ4IbQ<br />
Pb/rWtfa+kUHPa+8MFgzW4w/mYENS1NSBKg6K11LvHVWmMNcGJRMnEwjVIT2NZ7TKPCrV3ial3iD<br />
4rpU6SN/FMJ0kj8UIY/DuTGAGlYuvfu5utWKyROMFKMhIlRMtHSrSgT6EqdF+RTmTlWFEq8Spbq8<br />
bcwv0JjNQdtaKoKb8An9tEZxPeM7StwazcF39Aaf8Y1yV28lyLl9jQ/Fa2r95oc0BC7tzNlWKcCj<br />
srRgBlAs4Ths6dsl+IsL1UiQMu0K8EormQLPo4optMGwNLlYCJvgbxXAR+CmWR77TA+s/ATFBrOu<br />
vVT2YSSXXv3dgyq12GXDbmYfGZYCKM9aBDBT8RMG7PFb9vifpZH6+Pfu4w+t9tL0/4iXqJmlzKwb<br />
eapOhFIYkcwQhm7qRfIHd1AepNwHGHiZzD31uj4/QzqDx2N8tn1f7k/+hJm4Cne5SeJ+IXY30/p4<br />
GSnK7JoMGgFdh6tO12FOz2lbwSuegZAcqh8xkckUN1GZUD2QCs2NkWqGXMqnXq+JY3rHx/RJHC7z<br />
I/qukuxXR7B6H+iYKNwuyzXLVwcxfY/3l2wSAwuRYgBLvyVj3ei3VB1ezqatbv1ve9fW3LaRpfdV<br />
/BVtSB5eRiAtJanZkqNKaSw5o1lbdlmOky3LVkEESGFEAhyClOxIyvP+jH2c/R35Y3sufQUaJDVx<br />
ZveBmMqYArpP37vPOX3Od/BP/tyE703lwN1EPWGckvU+duL7+PADg4WQ0gxlO5U0EPu/iG5HYyJ0<br />
O+KDpVtykyJeAqOOBAZUx/0c259hiPF2NpTGGSrlfU/96g0DvW64MBuaoVKU/XFRQZyOi+HfdkFK<br />
yfUvKu5f2okDNKCmmXSiZiOea0enp8eHLDXOUsujWZwks5t8eiVeRlk0TEBg5pUE/BxvNOPPcQrL<br />
gxARZFqZtMfu6yFJujSRi17QaMj7SARGoLyBZfdZaHtMR5W/InEBmzdfWuZTYUwcuJQeXYgia0x8<br />
v9VCFz7JvUVQ/Ly5Q3WuT7nKo2YySlg6/vUfSlGp6sIPdNf+VosGKsNRAtEz3u/1JoGi2AZSkIX6<br />
lWpDegWgfA10SdVAI+RSNfgdkM2uFFJKtIsrNzNmwRdkkEzhYrnUyK2DZhJNIyB53zvr8FkUIrjL<br />
dRKfdcxckuVAZzr7mn38GMpa46t+8Z4JfzhTUW2M6Lc/ZigCV1XCM5ROFXdCNPQymGL9W+7Xbucq<br />
+UzD0mkBBzRF6532HeEyCTOF2u12t9M72xGeZpsVtFI5e9CUG4t0t1OdsGe9dqvbabfEGfyzfRZA<br />
4a2z4KzdhipUa3D2lefd1/bSXlyxST5K+5/hzIVpHiIoznWEaFJWHUUTa9CsKX539aIOJPU820Mm<br />
bfp7laOahD5GK9N05ptt7PLy4JmccCmuvwFi2Ykb2AlGMPnUvqc+JYUYR/0ojuk6Dm32GnqTYNer<br />
LJn1VG77MkbxMXRtiLb/5OBuz3dv8QLKmzBeWyF27Xp8K75tRTdXInzefL8nPvyxKZq3LGWIrV1x<br />
3/TUh1gi2iZTyfwYei77Q9JnuYeauoaplLeLhH0kUF5Bg555JrNjzyACGt49XUwFgaChy5/YStvy<br />
0k5dYTF3jhnEHdnr3Uhr1q/Kd1mm55E0tt20+Cts8bfffsuUVBnlPBZvuWW+mNSblZnBAhbtdIWE<br />
rMDRaLg7Z7PoNS2CTe8G2rROfrUf6u1QSh7S+g/3QmMQZ4lxC6U4VLQg92f56khYH4u5ntv+9S34<br />
M+yzE6Xkato+oQP5UuQ8leBBs2E+mmH5CmaBT0J1EzjLu+KdclIhqZ0rBwdgMpWyldKa9+DM6UF5<br />
vWgy610CHwAncBe7QLpdLEvX3XGvy5WAZTycoOBrknTwE/1Agvt1BPlKoubwp+FTdMzp3ux9PMU9<br />
LzyE171L8VRsTZo6r8bxglWKNHfb0iqyMM2zW87GdHKXWNrr23KaWhf/le4h1Si7/6jKazaTPUPI<br />
jI0Syw9WI39mEEgnzZ1Y2HRPk5VpqQOrVGmm5U4VUCPRIwaVaVmW8+JRw7kv5VfiKk2rjDjb5G62<br />
TLWCH3yzlo3+8aBGsf1W0b935He9TF33JznhYb26NDXKXl6LeJGMBueMnMA3vVpldCApTRPXB812<br />
lXHsMmw7C+O9hSKDJUuYl4X37al8y1rwuztl+u80y9KYaKe0Z9q+1TEWTsXNMOH750clYwX80JbF<br />
ecwJWDmblPu0CzskW8TxrmCs55Be13H2ooq9SfvRtQtDQnCFkTskqjMxER4TSE2EfxfhKzSN1MiE<br />
7pSvIIUCD3k7efr3e3vqBzj1d9uBsUDHMsivzuOBhU6BkuVNbHvTqOzG5iFnKY2qdI2zHEgGw1Te<br />
huk+IccUEH0UQKAL84oT8tf/WoKZ43TongjkXdUoVnV06b0G1iTRmqHy0nmwQxjaEN0FQduSPHhE<br />
YUUT94SjOr7Cv9oowHihfPBrPo2yxL772xQOXI7amCTMj6STT9LIYg78lGomlYS7tOZW0Pu4f7rf<br />
u82eir1IwB/7z4Gl6cEagukl4O1FdH+P6WUlYJ7dCcRMR3umV2Tfo5odlKXGR8hGWt8t4dEsYutM<br />
gulCuI+OvLhkrlppHbMhGr6JU3qwpfFyAycd2YiiacETe484qGE1grrNShp5u7Q32ezZrgehYhNy<br />
ZLpoCAep7SvYKPeIY7+kXKKlQYIzwQOfZ+GgYlj4EIypTUQHVuf/1LmTsYtmLa2FIqwxW4HCioCr<br />
vRLUqn0lwjW7pat/vdhrfa69rSq5XXeF31P69z/+Gsv3EWeYylMGl2R/IEIf9DOsWGWYp9exZ+Eq<br />
a2m5ElxxyOC9jqpe7Ms7Fqeqs02XyrbXrlrxkqJnuStFz6Z4qVLZkAFqZ4RpCZMvpzmO532kHbfp<br />
GNdRAXizuIS04uuvv3Yqt9qFEN+kxVwPOy4BlpsuxJWk4b/FUmyjWrPbYEGSa2O/lVJPbztX0g5U<br />
iMSw16c3414F9k6Hr9WRUB12Jc6MJ4RwHTRKrh7sHO5F8sULsOelaSLN/92zW1lFqHmhZVafq9si<br />
m03WBjaVQ0mpqpbbulNf3TiTomEZvVac2xdmxiQ1uYdLSx7+HHjqjhKUTGmOT/FwQ1Z1B+nvW1zX<br />
JfN3wqiUXrj1PrfKZMqMn6pszTg4IEB1KNDPF6BkUM5qsVVwIdoj6P/MpeypA1Exy8/Iz9uGE5LJ<br />
cVE++T1NVaSdHnrN9tOoICtCZfxn7G6/vEfFsX0LKLFu5DYoCAQ2dQzsHK8AtH1CLcd5PE6ht2Aj<br />
Sqj3pLaIEPZ7c/KbDWmnJqh3wdc2fMKfSw6evsbJ+c24lOynnR1IOojmo1mIMsAo+hyOWRUbuIUp<br />
X6nhNJ9P4IwNirldplK2FJ8LOR1LFWVVeX82gh4eRJAJ2OEwy8OJpyxM/7d8DmzNiDJ8Qu9Pkxqx<br />
l4HreHimm2iapdnwYRlr+kHiOIf94SyfcI50hgajeAuw/83SXKNChKMlqWK0ifXUNoZDZwjZa3pB<br />
f8b2er6PCjh6a4oeFZN+KsKrLKtNMC8uSt8wpENvAPPnqtom+nYxukrj8hQdYBAMnpnp1H7XjXue<br />
WqPz+DibedsD9H39MChRh2bjUktUAc6X+SgpQnRaVF+tqsrP5deoWSxg5vSTojtKi1mJaPlztV2q<br />
UyFl2I+Yb8Lrj6XJ8PQpalLFkysY/RCtQmcLCKHESsA9slXT8Q2bXACPNJtE/Sv8if+KYAQc+qeQ<br />
bWK4VPt9OoZl4imIRj6+GhfS67bM3TlI5ZZtMplNm52Q7G9vJXnYE0tjkPH9Uc9cdpRGoZrAM8B4<br />
o174Zm46gINxkA4XfVPbb/nzBOVxEOD1BUldJ00HV+kI+AWYI3j4e6byBG/bwv5XIvzxG/HvXfof<br />
yCiHJ6fYY9/n+RCaIt9Xc0NN8PIi8H6B/RzPfDV9y424WdD+G6px0Y8y32cmHGbWhMHbgtE1UiwP<br />
AH/p6k+c/vAvz15XTrbL/igFPqXrI1MyKChdLuoc1RWRjfsYuCy59vVEJVHaT8yAxskYp7M1nm6x<br />
cFaWDC5qst2k/RgS/4j/1K4Vs1TYmcAsFDY5r18peNZ/AmHfdINZJM630vpQR/tP+P1JVx3v/NXY<br />
wXRJfOkVl7CLEK1yBh7STwTXPA0xhfU6y+fXSTS33yDwSmS9gFPN/nMwHE0/WX9H43g4ma+6yUTX<br />
ymFYXg04tp/Sbtffj5JfAk5ofmH3E2ajl/R/3f5gWOpkO2P1CLLfVijynOuOo0ndHoLJwvEVJ1Tp<br />
qGfwyyq9Qm4EXXHaj6Yo72LsOEZ/M0rSgxenBzbgIDkelHpKjsZIDpZtXRowZ3IHVUpgc3y2I8Ij<br />
0USid385xP9eHt8VWfz+PPxwBwdnFt9dxlEXGd8+/cItfNTklrE5d4CZBZElo70vQd9cC5ECRfpN<br />
krFxGWxAYDMR+ErFM0LITnwXQv3+lvRnpFyjF2gP2C0uA0dAOsuOSUY3bkTl8WC39ylddbhGXGZU<br />
lJjW1He/1CuI1ZdcS/wYGwIEb8FkxR1jZqyPVOfl04igijiehMGALM0Fn/7uQZ7BhNlBynO+WvoO<br />
33gQGiiJhd7i81OV9Z0mlUouvlhietJfbYOEWKrWM7/+j2IFzcYTfb8pzbrcRYIkNyoKRq1fVN83<br />
9XLz5Jcit5rqh/lNRqAaVjqqvLl8KOnf5SAH3J5Tan2sqEzTpOiTSdtGnS5SQrDgEvCWriFTNFqL<br />
jkJaUhBaMRrUrFJZWBH4pz/9yVEEqqKd7cP1j7MKnRoFv94aeVNwPHm4a3UuqGD/8tf/kXGYcIJf<br />
SPgjHa0JZHd407Lo/voPQ6DkQcRwZ6QHlYYzSu2v0XKUMV7v41ZLOg00z2bN9k06u6QK95ADqPYD<br />
mlb79mIXEEtPlSMd+KEyWRi9Y24VArJCMYuBWfPsdxsGW4cyssuFfzLo+xi9hnjeLbh92WCYmrDc<br />
ZONCvlG95aTCHNCOKOvjhqU2KV7Scie8ZiwUGLx5NBqXotY5W6TSoJt9kugolZe9mLxVujY1KFvq<br />
xKmeSzy1jKM79FLd2YxqwBqfT9fUVbIw4uD1W/t0nlS4mFphkeZiGMF6SGdwbM2nSbBC+kE+TdJh<br />
5uQrloicMpjE4kQoN32GpMMpiJwrpY2hC8KHZIDTRSLwrJQcDT7Y3GuRbM7iYDwfT3yqAvjPx3vb<br />
nzyiKX5GGKhkmmRV6bb0lfIvFx0q/sFm1rCD59J5M0dtT4H6Mt1aZvzmxQW7i9ZP60Xex6Yi5DPq<br />
5S1rRAjtd/r7yj0+dV3GIilqv1gx+juqsrUdGCN9VnzZW9KT9hJOnd/VN1ODgXkDFVfCHdsQANeR<br />
gRiyQpdhtxKDNrvk+5pETo+BsidjzEV03uPQXpHY2kE1u2vuLy8FS3Gmsmg0Y49+t25d5Ixgk76M<br />
JGh5OoMyKDi3dZcuDwesVj6dKdO8voLJgb0/m00/M4ABeSMEyPgGNu4HlcmBGly+hl2XrPNbvTAX<br />
OTvm9majEvVHPUaF2m54YOstG+k5LCFcf9sc0TKfgrCHbslpxv52vAs8O35+6iNEXAx5ppy1oLWD<br />
ottRBEVnX3TO2u8/bn/oeO22e4E4a9Tg6pdo6qp9QZroeg382QoUqYP/UC8LSsxE2etVLeOyIVBu<br />
EcZTh+Oxq0ZTjXCVq5ltopRWC2tsbKhxYbP61s0kCtEjpX1HPyfFlfyVIvhCOvusPsjy8E9pSR5e<br />
JZ+XeE14u8bXN+69UE2f8FW8AcRTQTK31R02r2QpBdNlaeDc2AQ+uizTqHCejmQjuL/KRrq2tapy<br />
qgmmXPW42yG3h4A8klR2ZefOCgeMytsspd9qUneh2bsNiA8UNqRPD7p4k9TBGel2sOzBFCnj4DK2<br />
hVVTBxGADdmhEGXT+JenoleuWu/yqdi6HT6dPL3nWi5SfagmszyAtedgqRWLZsLH19XaJrgiVCek<br />
yswiIXk5Ylx9aNBEG42DXMIUuzuitbXTRZROLElJVDnbPUlnhdz18eIxlDVy9362ukdaKt79opWN<br />
6SobdHenbodxtm1I9tBOh7au0O14tU6/sf/VMtv0R6vtClYrYWRQR33kWThEk23fNpTMtaHEY31T<br />
TV1LmDyWT3CRT6aRXg2r9ayUeao2EWyFcAYUzhgic4Yoe2j+55JTejhRcqywjRYwXIXk0r4oG6L9<br />
7VG8U158qWCY7RTZrToeRXTFC+PyocAN0gqLggwKC6lVHgVtlqpcis2j4FHChazCmaBOobuKqLbZ<br />
QAhXN5yrpRGJk4uLqBwsRsNAN4t5c1t3MxslGmvIHD1HEP7ACoi6if2175QQGatxS/JF0ph6F1Jb<br />
+6B8XdM4x37BNbiglLfGs5wcPG93Njc7vXv2bLD0fVb1YKdqs8VjouaCQFApBq5IeCbZVHeR7OPH<br />
oiPJ7i6gq+EvKvMNyyA9gy6gtGmhA6mtK1cvHPcXLN62FLbKVypZ+zjdpIN018pwiow2q6l3zTAq<br />
rxW9uuxhD86x8zdK8SvlRlcjV7XdI3vr8Pj09YuD/1RGzHDOzOEs2XsiWvKaRYF6sSMVi4ziJ0OG<br />
lGCSCoyH/LUX7j25J3CHWn5PhRJxKfmyWEDVasuT0e4rLj3Bgh7hrTjQV7HAKAb23avFQhJtuevz<br />
rpLqw0/KCM61LndHS/2p7NRh2faI4F7vtpcPBme9KPvceyQK+RZ4Q/4RlNjDTtAbwrFGBD6+Fx86<br />
x0d74ofsKstvMswVN9tLTl5h9bPnnllXWL+q1hl9Nf4val1ma7OqM74F5sKnceneWbQY3En8eJkk<br />
P39uV2i+aLKn6evj10enbw/e/nAKBwCBBNHCjfFmOm7OJYqVddIwrzhJJ0nXyoyIbsg6ePKmnso9<br />
2VcwxOWa1d6k+1h+N4kN3a8Gk4WYjwev37/fi9NhOtv78KFz1qXRg1fFBIQefMVSihJShC2kOONF<br />
YSedZt87hrlyPGulyJbaBLS7wjO5SRKefS4RqmCZ8sDZxbd/89zQ5gawuUXir3j4kzA4ydMVxkHn<br />
9g3Fi4OT7/efiUri3zIod98fnRy9OXjRffbq5OTo2dvjVyf/zwdNdmmiPJ5SHWclXTKSxuBOMs5S<br />
GSXLoW1e80TKrRrD4+HBXRF4iUJVaMUGAE+0RBnhmwh+0wCuKbMj+q3XCwLKOaPEZRoiHENdKpmt<br />
HIbF8KRS7AMLDZ4EuqlPUThZeBbLbjfiigXMJze/suSCawdd4mIUo7f93tgkUflUhyxJiiUjos7+<br />
DW0+TsbRFbFHTUmQfBCeY/d+NfHH667q08gqZajEmTMALFEtqlQ6Zb27R0fpaChVuD0H14UvU5Fx<br />
3LZ8N2T/oiE7CqZkW9JPulY4hthVclrujX7q9XKhRp5lc3ie5tKvfxOBRl1djxO9yHK1AeasjD8P<br />
UhjtGMRRjtJrvNfu2iC08pKf4hxRc3yhjhgIYdRW1cH+9temyGez3Ea/V4rAh9YL4XwWVys21TIe<br />
LLJFFRcWpqghh5cPmW4e9W9uvtaNouuk6hLUxLZuZQXvmS68abVkh4Zip92uLye/Yo+bQoTQQ0EJ<br />
zE040ZoIu8a/pjzAQi5O0U5gYrYsBh3w3Aq4Tp5m6bnveQuVm+9C06UyUo9sqGcLWdhqFaKMZmFS<br />
mqSS5jEJ9ahuADYSuiRgAZHDEEpHRbodZ1jekvKGFXnzCzwzMdyrJOrsMxGpISh6E82GFTs/rnT+<br />
Bl8H0tte4OmmOmyAUZKxI5y+ldcHemqMg1gWI0/MaT5CT0yG+YgkzIcG+EBp31ZI0KVmdR9+rUsr<br />
FcGqM2eTPsn5rtfUEPUFeut+54dqsNPzKZRakRj7V9EwKRCcgSwBRtraLmU9t94+yJdKpQ98oQtl<br />
WCBjj2UYoqX7ggI5MQV4Frh33LyxzwjwyxjNoIEoevYiSzwGdhBovHPVGdiRPr1VSFZF+ZRdwIio<br />
tCtiTVUo0Tsji92f4je+g7ye5yPniwNvgOwJmw1vS6ujqWPzFMXRjJyYIoXnk0nFJeMio3KhuS3j<br />
B3BQW3LY1KwRxzMu5lIVmRGtjPYFA7hrGR422YwWV/MAVjPk3ybLWvqRzPpkcEYVbjjR7snyWcY/<br />
wNaJfV8jxVPSue0vKNkkLuE8BKS9C6omqFu7Lh+zGzRq7lktRAKpjqmz8G43lscMp2ptleCuRBjK<br />
dq9EAlsk7/5sL61lDzLLrpX5AyqMyUV4Ccsc/T9EuEt4BDCu4c7KdSbD9tUqavnOW8guMEylG8KW<br />
ni8SgqJdc8TDgZZfJeG0340Vpp4MAvcHI+E26mEJVMnCbA92SRqbANLpwF7+tFW2xs6zbOf7fWMU<br />
LzUqoWO2DwfYNP3yZiVq/2oiL4NXxb3+CA5JkKvTXhr3buHN+XUCKabbUKN43p+dk/GC+kPOhe2L<br />
NC/UH/dNe8fRHpQWbhRNzWppnWB1TbpGh6tQMVX28Mevsd4zNChDlF5/ow2BtoLEdzlUQwoZsD14<br />
U0fK7jMm5iWloIpXIaV2rcBP6s/Hr05pA+nWN9AerHKtfNxrae3QdeHCfn+AFO3gGjncEvtEI+fL<br />
/nEiMT8lI0z+2XBMjzEfgm3YFj8yqZl1Kc+75/KLd1r5Z1+V4dLkF3cc9pcZJTp0jxTz6hF4E4vL<br />
NkoTFamSwQXpOBmlFz1VhUC9Iyeg8pfy39M5WhDC5qtehuO0QPzOoBThEvfs1Ou4jhA1xups6za9<br />
L4twSrx7wzRK87Ssh0EK1pSJyhmkRFDqTDvIgsTvxsmA7BVGeJjGSvNhc4J4N5z3ZWDuT2HBQDvq<br />
RCdrc3mHZcO0fzqXCc9VQpxUfEcbkn4qIxd3aHP493kCgxdUaAcyhjLBKwK3+ovofXwXjebJ3lZP<br />
GIDJp9IjX9w3f1vTblJYiTfLW8bpHtIwl/JvbBdim6WFvDCpFeeKPI7TYhBlDAzCqH3pJMlIiyjh<br />
GTVb0pKhxIYgH4xRwIBlwwDQbfiDLKavU3XIwo6VSiIeOcMOeaTFDM0TO5Ww8OdkbS1EyGPTntbW<br />
7c59ew8ncDRB7PEYoYWxVqL5nWx3En+HVUvjpGg1kQdutpswBEA1AqYgBGZgPs4KqX4PNXwAo2iJ<br />
IBSPJ4ZN2xOPr5/qZsNfs7a0kn2TGPBzaKkdphc654lWmjvTTN57UyfIoLFlzovjL6M/BkMrsktH<br />
SyFhPqCrtRlCSjoHHfB5WpYadYGpAty0BiQtzmHbQ/wB6zTAaXc+SePiHA0orT8vUEWdxvgfBthz<br />
02F8bFgNP1ho5WGOSRFxWs7klEW4dNsoXdDEDEOIbEv3hNfHhzzjEa8N3RRIdOOEqv7CrROWnMa5<br />
jCsM4r5zqfUbirY171s78qzBDsC46m7r9REhk+yW0kA1y2qfYAu+MJIeZqhq3mTs3SfYCskzeDVB<br />
8h8Vqte6zzPMxiOP0iHoJ9M+nClxKo2xpkakrsr4h0e9H19a1gGO7Hx+M/aohQ6T4gqBKI6y63Sa<br />
Z2OymhA/0i7puB1rbzIsA9/cKn0nO25pBYjcqBsuzNAhv907y8Lq0aXghapnlQsQGFaOBoUwUzkL<br />
tDJWbV2NmiCgahurRMk0O6HnPGyo8XNSlQ+XTXnvANzez2lEmmborTSBjh+mv/43yMOZnC80W+4d<br />
BmHT3ZZs7LRj+wPiKtr5oI32nhFcFWM2Ygns5l0NvlFuJ9AJ9qWtI6P+1mdT/Mfh0TeyyDj5emmZ<br />
lRu7f67IrxsS3cnpiiFO/bC4hH1ddoawXhmlykPrsym+P3n18kicIhlvyZ8GMS80Ve6nQR96I7rI<br />
ERP0ndaSZDtliNzdcFFtNsVPSMhbZg6n+0X+yR52Nf+rC63NcHfaCkBmVhO/FgOqFVHIv8oKaYs/<br />
2vPyn509p0xVaE7wxU+HR98h8VdcQZvHlnW2xlF3q9j5gnNs0yq8JF2ewvzOiz5iIXplR/EFVtTJ<br />
qxPx9s2rdwdvXz3gjgF3Ir71kJIpmX2j4X5U2Pu2OT4iB/5uJu8VGrYWxFwqADMG/HaKEY1cqbRR<br />
H5tac5AVZVZDXe+uslf7pV7lx1lbRu1FsDqkZUQK5bU/jCz0+yk6YaRZonuQVcai4SJZM7fpsza3<br />
4H1Ei1hVDuTFd2kpHBcZe4PGyQUSTcrXNgH6owSirSooKSJBtMTQpm0fgYDoPYqlmVq3IzBjt0Ov<br />
vHBDbQrSWY/I7TN6CDxIRFwv+EDv4TUB9JfStXmG8EUDyokqohmLKKYOgdVAIM4hRAkvgMZBcW5L<br />
0MSbP7x5wXy9lqRa0GyFcjqYTbrpTMKcEgYD/+y1pU5Yjn811MCuCjUQUKyBKGgH6p60sKI09WhM<br />
z3qixcbYUM1cGZzqOKQotsSeEq1ABcGW/mKVpFcz9R1NWR0NjJp5Q0ZmIhcYzAwPCSgqlUVB5gUR<br />
FKrN0uIMC7kp2WuwdJnqmrDBlH32wBdiqPNRjA5ndKOKW7H9rfaDrLbnyzyzMzU0YrBJsfXqxeHp<br />
24M/vzjyZN+q//L26PTt8cn3vmqibFBXHLRvUROhMnZ97MPVxJ3wdvEUllKRkpYNOvpQRurSJs4p<br />
Ao6yysW6HK+uT0FeM/k+E0BhYt+lhdNnX4XiCLasdexAnjfNTGx2up0mtrB51uNN5rW8ZUVtyslT<br />
AbuPKnC721EFbvcm900VbqNRcu5ClGS1UnkybWvsYuFuEHLOmQsjZSL0M8GIDKOq+Obgd6r8vlS8<br />
PnijpzG0P1YAre3ELTsQpHx9lhGNtkPFREVSP/EfFBzlAnQ3QD5rDJTA4dG7IxgzhCWg21iQ5Fjf<br />
JMvsSosrT4eRXSGqokHKbnKf02HI5hAloLpNFYAj8wJbl1Gt5V7kU5O1WFXXRpqtawZ+15fGdL8s<br />
fUYcL766UVeBUduNZUNa4hcouBXdfOuJdhYgj/Xm+MURMlmP2DpCcRRv5NbGeMfY37OoK96YVQl9<br />
h6oL2U3Yt2qr58ilyvHGuZleZpam2RGDi2EcO+L5ZMQGii26kSDfLWubgKqQ+t055Rv2JNXhCmV/<br />
wQLPpyCFzBUzcKKNy9TWzlqLpGGsxfZ9dLTNGpE5LVmqKWJObDJg1luTlKSY79rbjgeI5B4blqUZ<br />
O0i65mR1PKFm07GHtD0S2YPd67qUOqp+ZLTFIK9X1ROTKwnCvLC58yFFcoPGbrszGm9rLLcea8F0<br />
YMp1BPrtEma71lHqNd7QoElmUTBu0pZz3tzpk6nmKl7PDOcU86fF5hJfx3x2+Fw0H0/E42vxmCJL<br />
sm74l1PxSyoe/XJgE/Rphe8E/xLhTFtN20f3g6r+ZeutKq201ivUW1V6tRp/wepadX1AdRWrcyf5<br />
rGUVVuzYl6ixpNV8SI2BAbtTjF/b8A41tdUs4peoriLWXLW6ZJyCe8JxvaVkSou/pSNfQv+vclhh<br />
OFpq4z2dVJYV3dVwNQM6lt5XMKSr2tFhEVUDGtZKfGmzk5cRRQz7gjT70G/TRuM8RUa70fjnEPg1<br />
JPl5dA1nGBoEMOI2ouTiD7ppwjDtFLwX/4UDO49iCQtDUO4NCUbvlm4fa3ZoKJParpSTmuMONJBp<br />
4CBB/7Z+1s/6WT/rZ/2sn/WzftbP+lk/62f9rJ/1s37Wz/pZP+tn/ayf9bN+1s/6WT/rZ/2sn/Wz<br />
ftbP+lk/62f9rJ/1s37Wz/r5Vzz/C9cOjZwA8AAA<br />
==Fine Archivio Base64 ==<br />
<!-- *NON* RIMUOVERE LA RIGA PRECEDENTE --></div>S3vhttps://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&diff=44290Creazione automatica di un file di log per inviare quesiti al forum2021-03-15T21:08:47Z<p>S3v: 1.0.70</p>
<hr />
<div><!-- <br />
NOTA DI COMMENTO RELATIVA A OGNI NUOVO RILASCIO DI DEBIAN:<br />
<br />
* modificare il codename nella riga "#ifeq" sottostante con quello della nuova stable, dopo aver aggiornato questa guida.<br />
* In caso contrario sarà mostrato un messaggio di avvertenza al posto del template "Versioni compatibili".<br />
* Il codename *deve* essere scritto tutto minuscolo (per esempio: jessie).<br />
<br />
--><br />
{{#ifeq: {{Codename|stable|IN_TEMPLATE}} | buster | <br />
{{Versioni compatibili}} |<br />
{{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. }}<br />
}} <br/><br />
<br />
== Introduzione ==<br />
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 [http://forum.debianizzati.org forum] per tentare di risolverlo insieme.<br/><br />
Le informazioni riguardano i seguenti tipi di problema:<br />
* Connessioni di rete<br />
* Video<br />
* Avvio del sistema (boot)<br />
* Audio (tramite lo script ALSA prelevabile [http://www.alsa-project.org/alsa-info.sh qui])<br />
* Sottosistema di gestione dei pacchetti (APT)<br />
* Mount/unmount di periferiche<br />
* Touchpad<br />
* Altro. Verranno inserite nel log solo informazioni generiche (già presenti nel log creato con tutte le tipologie di problema precedenti).<br />
<br />
Lo script crea due file:<br />
;log_''data'':contiene le informazioni in formato testo<br />
;log_''data''.{xz,bz2,gz}:il file precedente ma in formato compresso. Può essere allegato ad una discussione sul forum<br />
<br />
Se si vuole, attraverso lo script è anche possibile inviare il file direttamente a [http://paste.debian.net 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.<br/><br />
Prima di effettuare l'invio, lo script chiede un esplicito consenso all'utente.<br/><br />
<br />
Per usufruire del servizio offerto da paste.debian.net è necessaria l'installazione del pacchetto <code>pastebinit</code>:<br />
<pre># apt-get install pastebinit</pre><br />
<br />
{{Box|Nota|Lo script è liberamente modificabile.<br/>Per ogni segnalazione, informazione o suggerimento fare riferimento a [http://forum.debianizzati.org/viewtopic.php?f{{=}}13&t{{=}}45098 questa] discussione sul forum.}}<br />
<br />
== Privacy dell'utente ==<br />
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).<br />
<br />
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.<br />
<br />
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''.<br />
<br />
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 [http://forum.debianizzati.org/viewtopic.php?f=13&t=45098 discussione apposita] o all'interno della pagina di discussione.<br />
<br />
== Utilizzo ==<br />
# Eseguire un upgrade del sistema, se possibile, in modo che le informazioni raccolte dallo script siano aggiornate.<br />
# 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 <code>scriptlog-debianizzati.org</code>.<br />
# Assegnare i permessi di esecuzione al file appena creato; ad esempio, da terminale o emulatore di terminale:<pre>$ chmod a+x scriptlog-debianizzati.org</pre>In alternativa, se si preferisce, è possibile eseguire il seguente comando:<pre>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</pre>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.<br />
# Eseguire da terminale (o emulatore di terminale) lo script con i permessi di [[root]]:<pre># ./scriptlog-debianizzati.org</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.<br />
# Leggere le informazioni a video.<br />
<br />
== Parametri dello script ==<br />
Lo script accetta, in maniera facoltativa, alcuni parametri:<br />
;--tipo={rete|video|boot|audio|apt|mount|touchpad|generico}:specifica il tipo di problema<br />
;--nocompress:non crea il file compresso del file di log<br />
;--nopaste:non invia il file di log a paste.debian.net<br />
;--update:aggiorna lo script se esiste una versione recente<br />
;--base64:crea un file contenente la codifica base64 dello script<br />
;--debug:crea un file contenente le informazioni utili per il debug dello script<br />
;--versione:visualizza la versione dello script<br />
;--help:visualizza informazioni sull'utilizzo dei parametri<br />
<br />
'''Esempi:'''<br />
<pre><br />
# ./scriptlog-debianizzati.org --tipo=rete<br />
# ./scriptlog-debianizzati.org --tipo=apt --nocompress --nopaste<br />
# ./scriptlog-debianizzati.org --versione<br />
# ./scriptlog-debianizzati.org --help<br />
</pre><br />
<br />
<!-- commento (leggibile per chi modifica la pagina)<br />
<br />
<br />
*IMPORTANTE*<br />
<br />
Se si modifica lo script è *necessario* seguire le istruzioni alla pagina:<br />
<br />
http://guide.debianizzati.org/index.php/Aiuto:LogScript<br />
<br />
in modo da aggiornare l'archivio in formato Base64<br />
<br />
<br />
--><br />
== Script ==<br />
<pre><br />
#! /bin/bash<br />
<br />
# --------------------------------------------------------------------------<br />
# Impostazioni<br />
# --------------------------------------------------------------------------<br />
<br />
# I file creati saranno leggibili e scrivibili da tutti<br />
umask 0011<br />
<br />
# Intercettazione Ctrl+C<br />
trap _exit INT<br />
<br />
# Abilitazione dell'opzione 'extdebug' necessaria per espandere ARGC in<br />
# Bash 5 e versioni successive<br />
shopt -s extdebug<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni che sovrascrivono comandi<br />
# --------------------------------------------------------------------------<br />
<br />
# Rimpiazza echo ed echo -n, impedendo echo -e e le possibili combinazioni<br />
# Sintassi accettata:<br />
# echo -n "testo" # stampa senza a capo finale<br />
# echo "testo" # stampa con a capo finale<br />
# echo # stampa una riga vuota<br />
function echo {<br />
if [ $# -gt 1 ] && [ "$1" = "-n" ]; then<br />
shift<br />
printf %s "$*"<br />
else<br />
printf %s\\n "$*"<br />
fi<br />
}<br />
<br />
# Sostituisce il comando 'cat' per controllare che al file di log<br />
# venga inviato effettivamente il contenuto di un file di testo<br />
function cat {<br />
if [ "$(file -bL $1)" = 'ASCII text' ]; then<br />
/bin/cat "$1"<br />
else<br />
echo "File non di testo"<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Costanti<br />
# --------------------------------------------------------------------------<br />
<br />
# Versione script<br />
readonly VERSIONE="1.0.70"<br />
<br />
# Path e nome dello script<br />
readonly PATH_NAME="$(readlink -f "${BASH_SOURCE[0]}")"<br />
<br />
# Codename per oldstable, stable e testing. Da modificare nei successivi rilasci di Debian<br />
readonly OLDOLDSTABLE="jessie"<br />
readonly OLDSTABLE="stretch"<br />
readonly STABLE="buster"<br />
readonly TESTING="bullseye"<br />
<br />
# Path dei comandi dello script<br />
readonly PATH="/bin:/sbin:/usr/bin:/usr/sbin"<br />
<br />
# Nome del file di log in base alla data corrente<br />
readonly log="log_$(date '+%d%b_%H%M%S')"<br />
<br />
# Nome del file di debug<br />
readonly script_debug="/tmp/script_debug_$(date '+%d%b_%H%M%S')"<br />
<br />
# File descriptor per il debug<br />
FD=9<br />
<br />
# URL remoto della pagina contenente lo script<br />
readonly SCRIPTURL="http://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&action=edit"<br />
<br />
# URL remoto della pagina contenente lo script codificato in base64<br />
readonly SCRIPTURL_BASE64="http://guide.debianizzati.org/index.php?title=Aiuto:LogScript&action=edit"<br />
<br />
# nome utente<br />
utente=$(logname) &&<br />
[ "$utente" != "root" ] || {<br />
# NOTA: "root" è permesso (solo) se scelto esplicitamente dall'utente<br />
tmputente2=$(getent passwd 1000 2> /dev/null | cut -d ":" -f 1) ||<br />
tmputente2=""<br />
echo -n "Inserisci il tuo nome utente"<br />
if [ -n "$tmputente2" ]; then<br />
echo -n " (lascia vuoto per \"$tmputente2\"): "<br />
else<br />
echo -n ": "<br />
fi<br />
read tmputente &&<br />
tmputente=${tmputente:-$tmputente2} &&<br />
# non può contenere: spazi, tabulazioni, nuove righe; né essere vuota<br />
[ -n "${tmputente##*[[:space:]]*}" ] &&<br />
# deve esistere in /etc/passwd (o equivalente)<br />
getent passwd "$tmputente" > /dev/null 2>&1 || {<br />
echo "Nome utente non valido o non esistente!" >&2<br />
exit 255<br />
}<br />
utente=$tmputente<br />
unset tmputente<br />
unset tmputente2<br />
}<br />
readonly utente<br />
<br />
# nome host<br />
readonly nomehost=$(hostname)<br />
<br />
# Codici stile carattere<br />
readonly ROSSO="\033[01;31m" # colore rosso e grassetto<br />
readonly VERDE="\033[01;32m" # colore verde e grassetto<br />
readonly BOLD="\033[01m" # grassetto<br />
readonly FINE="\033[0m" # reset<br />
<br />
# variabile che vale 1 se systemd è installato<br />
[ "$(ps -o comm= -p 1)" = "systemd" ] && systemd=1 || systemd=0<br />
readonly systemd<br />
<br />
# --------------------------------------------------------------------------<br />
# Sezione relativa ai parametri dello script<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che segnala un errato utilizzo dei parametri e termina lo script<br />
function _parm_err {<br />
echo "Parametri non validi" && _parm_uso<br />
}<br />
<br />
# Messaggio di errore se viene specificato più di un tipo di problema attraverso<br />
# i parametri.<br />
function _parm_tipo_err {<br />
echo "È possibile specificare un solo di tipo di problema" && _parm_uso<br />
}<br />
<br />
# Messaggio visualizzato nel caso in cui venga specificato lo stesso parametro<br />
function _parm_rip_err {<br />
echo "È stato immesso lo stesso parametro" && _parm_uso<br />
}<br />
<br />
# Messaggio visualizzato nel caso in cui --help non sia l'unico parametro specificato<br />
function _parm_uso_err {<br />
echo "Il parametro $1 non deve essere accompagnato da altri parametri" && _parm_uso<br />
}<br />
<br />
# Funzione che stampa informazioni sull'utilizzo dei parametri<br />
function _parm_uso {<br />
printf %b "<br />
Utilizzo dei parametri:<br />
<br />
$BOLD--tipo={rete|video|boot|audio|apt|mount|touchpad|generico}$FINE<br />
utilizzato per specificare un solo tipo di problema.<br />
Es: --tipo=apt<br />
<br />
$BOLD--nocompress$FINE<br />
non viene creato un file compresso del log<br />
<br />
$BOLD--nopaste$FINE<br />
non viene inviato il log a paste.debian.net<br />
<br />
$BOLD--update$FINE<br />
viene aggiornato lo script se è disponibile una nuova versione<br />
<br />
$BOLD--base64$FINE<br />
viene creato un file con la codifica base64 dello script<br />
<br />
$BOLD--debug$FINE<br />
crea un file contenente le informazioni utili per il debug dello script<br />
<br />
$BOLD--versione$FINE<br />
visualizza la versione dello script in esecuzione<br />
<br />
$BOLD--help$FINE<br />
visualizza queste informazioni<br />
<br />
" && exit<br />
}<br />
<br />
# Visualizza la versione corrente dello script<br />
function _showvers {<br />
echo "$VERSIONE" && exit<br />
}<br />
<br />
# Inizializzazione di variabili. La variabile TIPO serve ad evitare ripetizioni<br />
# nel passaggio del parametro tipo=blabla<br />
NOCOMPRESS=0 NOPASTE=0 TIPO=0 TIPO_RETE=0 TIPO_APT=0 TIPO_VIDEO=0 TIPO_BOOT=0<br />
TIPO_AUDIO=0 TIPO_MNT=0 TIPO_TOUCH=0 TIPO_COMM=0 UPDATE=0 BASE64=0<br />
DEBUG=0<br />
<br />
while [ $# -gt 0 ] ; do<br />
case "$1" in<br />
"--base64") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || BASE64=1 ;;<br />
"--update") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || UPDATE=1 ;;<br />
"--nocompress") [ "$NOCOMPRESS" -eq 1 ] && _parm_rip_err || NOCOMPRESS=1 ;;<br />
"--nopaste") [ "$NOPASTE" -eq 1 ] && _parm_rip_err || NOPASTE=1 ;;<br />
"--tipo=rete") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_RETE=1 ;;<br />
"--tipo=apt") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_APT=1 ;;<br />
"--tipo=video") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_VIDEO=1 ;;<br />
"--tipo=boot") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_BOOT=1 ;;<br />
"--tipo=audio") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_AUDIO=1 ;;<br />
"--tipo=mount") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_MNT=1 ;;<br />
"--tipo=touchpad") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_TOUCH=1 ;;<br />
"--tipo=generico") [ "$TIPO" -eq 1 ] && _parm_tipo_err || TIPO=1 && TIPO_COMM=1 ;;<br />
"--debug") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || DEBUG=1 ;;<br />
"--versione") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _showvers ;;<br />
"--help") [ "${BASH_ARGC[@]}" -gt 1 ] && _parm_uso_err "$1" || _parm_uso ;;<br />
*) _parm_err<br />
esac<br />
shift<br />
done<br />
<br />
# --------------------------------------------------------------------------<br />
# Debug<br />
# --------------------------------------------------------------------------<br />
function _debug {<br />
[ "$DEBUG" -eq 1 ] && [ ! -e /proc/$$/fd/"$FD" ] &&<br />
{<br />
exec {FD}>"$script_debug"<br />
export BASH_XTRACEFD="$FD"<br />
set -x<br />
}<br />
}<br />
<br />
function _close_debug {<br />
set +x<br />
exec {FD}>&-<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni iniziali<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che stampa il messaggio introduttivo<br />
function _intro {<br />
echo "<br />
*********************************************************************************<br />
* www.debianizzati.org *<br />
* *<br />
* Script che crea un log utile alla risoluzione dei problemi più comuni *<br />
* Versione $VERSIONE *<br />
* *<br />
*********************************************************************************"<br />
}<br />
<br />
# Funzione che stampa alcune avvertenze sullo script<br />
function _avvertenze {<br />
local risp<br />
echo "<br />
-- Lo script richiede i permessi di root per essere eseguito<br />
-- Per inviare il log su paste.debian.net è necessario il pacchetto 'pastebinit'<br />
-- L'invio del log a paste.debian.net avverrà solo dopo esplicito consenso<br />
-- Verrà creato un file contenente l'output di questo script<br />
-- Verrà creato un file in formato compresso da inviare al forum"<br />
echo -n "Continuare [S/n]? "<br />
read risp || risp="ERROR"<br />
<br />
# Se non viene premuto "s" o "S" o [Invio], lo script termina<br />
[ -z "$risp" ] || [ "$risp" = "s" ] || [ "$risp" = "S" ] || _exit<br />
}<br />
<br />
# Funzione che esegue un check preliminare<br />
function _check {<br />
if [ $EUID -ne 0 ]; then # Lo script viene lanciato da root?<br />
echo "Lo script deve essere lanciato da root" && _exit<br />
fi<br />
<br />
# Se esiste già un file di log con lo stesso nome oppure file compressi con lo<br />
# stesso nome di quelli che verranno creati, lo script chiede se cancellarli o meno<br />
local risp<br />
if [ -f "$log" ] || [ -f "${log}.xz" ] || [ -f "${log}.bz2" ] || [ -f "${log}.gz" ]; then<br />
echo $'\n'"Esiste già un file ${log}, ${log}.xz, ${log}.bz2 o ${log}.gz nella directory corrente."<br />
echo -n "Sovrascivere [S/n]? "<br />
read risp<br />
case "$risp" in<br />
""|[Ss]) rm -f -- "$log" "${log}.xz" "${log}.bz2" "${log}.gz" > /dev/null 2>&1 ;;<br />
*) exit 1<br />
esac<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni per l'invio del log a paste.debian.net<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione per separare il log in parti per l'invio a paste.debian.net<br />
function _split_and_send { <br />
local paste_url='https://paste.debian.net'<br />
local chunk_prefix='pastebin'<br />
local chunk_num=1<br />
local paste_exit_status=0<br />
local chunkfile pastelink<br />
<br />
# dimensione massima del singolo file da inviare<br />
local chunk_size='60k'<br />
<br />
# termina la funzione se il log è più grande di chunk_size x 4 (numero di parti impostate)<br />
if [ "$(du -k "$log" | cut -f1)" -gt 240 ]; then<br />
echo "Log troppo grande per essere inviato a paste.debian.net"<br />
echo "Allegare il file compresso alla discussione sul forum."<br />
return 1<br />
fi<br />
<br />
# rinomina parti di log preesistenti (se ve ne sono)<br />
# scarta i messaggi di errore (se presenti)<br />
rename "s/${chunk_prefix}/old-${chunk_prefix}-$(date '+%s')/" "$chunk_prefix".* > /dev/null 2>&1<br />
<br />
# dividi il file di log in parti di $chunk_size bytes senza spezzare le linee<br />
# scarta i messaggi di errore (se presenti) per log di dimensione superiore a 10 parti<br />
# (max 10 parti con l'opzione -a)<br />
split -a 1 -d -C "$chunk_size" "$log" "${chunk_prefix}." > /dev/null 2>&1<br />
<br />
# comunica il numero di parti inviate<br />
chunk_num=$(find . -maxdepth 1 -type f -name "${chunk_prefix}.*" -printf x |<br />
wc -c)<br />
if [ "$chunk_num" = 1 ]; then<br />
echo $'\nIl log sarà inviato in un singolo file.'<br />
else<br />
echo $'\n'"Il log sarà inviato in ${chunk_num} parti."<br />
fi<br />
<br />
# invia al massimo 4 parti<br />
echo $'\nIl log è consultabile ai seguenti indirizzi:'<br />
for chunkfile in "${chunk_prefix}."[0-3]; do<br />
<br />
# verifica l'esistenza del file da inviare<br />
if [ -f "$chunkfile" ]; then<br />
<br />
# invia dati tramite pastebinit, l'output d'errore viene soppresso<br />
pastelink=$(pastebinit -a '' -b "$paste_url" -i "$chunkfile" 2>/dev/null)<br />
<br />
if [ $? = 0 ]; then<br />
# invio apparentemente riuscito (pastebinit exit status = 0)<br />
<br />
# controlla URL restituita da pastebinit<br />
case "$pastelink" in<br />
# verifica in caso di URL corretta<br />
"$paste_url"/[0-9]*)<br />
echo ".. inviato ${chunkfile} all'indirizzo ${pastelink}"<br />
;;<br />
# verifica in caso di URL non corretta<br />
*)<br />
echo ".. ${paste_url} ha restituito una URL non valida (${pastelink}) per ${chunkfile}!"<br />
paste_exit_status=1<br />
esac<br />
<br />
else<br />
# Invio fallito (pastebinit exit status = 1)<br />
echo ".. non riuscito invio ${chunkfile}"<br />
paste_exit_status=1<br />
fi<br />
<br />
fi<br />
<br />
done<br />
<br />
# cancella le parti di log inviate<br />
for chunkfile in "./${chunk_prefix}."[0-9]*; do<br />
if [ -f "$chunkfile" ]; then<br />
rm -f -- "$chunkfile"<br />
fi<br />
done<br />
<br />
return $paste_exit_status<br />
}<br />
<br />
# Funzione che invia il log a paste.debian.net<br />
function _upload {<br />
# Nessun invio a paste.debian.net se viene scelto "--nopaste"<br />
[ "$NOPASTE" -eq 1 ] && return<br />
<br />
local risp<br />
# Pastebinit è installato?<br />
if [ ! -f /usr/bin/pastebinit ]; then<br />
echo $'\nNon è possibile inviare il log a paste.debian.net\nIl pacchetto "pastebinit" non è installato.'<br />
return 1<br />
fi<br />
# Invia il file log.txt a paste.debian.net<br />
echo -n $'\nInviare il log a http://paste.debian.net [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
_split_and_send<br />
if [ $? = 0 ]; then<br />
echo $'\nIl log è stato inviato'<br />
else<br />
echo $'\nSi sono verificati errori nell\'invio del log!'<br />
fi<br />
;;<br />
*)<br />
echo "Il log non è stato inviato"<br />
esac<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni di creazione del file compresso e messaggi di successo/fallimento<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzioni richiamate in caso di corretta/scorretta creazione del file compresso<br />
function _compress_ok { echo "File compresso creato correttamente nella directory corrente."; }<br />
<br />
function _compress_err { echo "Errore nella creazione del file compresso."; }<br />
<br />
# Funzione che crea il file compresso<br />
# Prova a creare nell'ordine: un file .xz, un file .bz2 o un file .gz<br />
function _compress {<br />
# La funzione termina se è stato utilizzato il parametro "--nocompress"<br />
[ "$NOCOMPRESS" -eq 1 ] && return<br />
<br />
local risp<br />
echo -n $'\nCreare un file compresso [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
echo "Sta per essere creato un file compresso..."<br />
sleep 1<br />
if [ "$(command -v xz)" ]; then<br />
xz -e < "$log" > "${log}.xz" && _compress_ok || _compress_err<br />
elif [ "$(command -v bzip2)" ]; then<br />
bzip2 -9 < "$log" > "${log}.bz2" && _compress_ok || _compress_err<br />
elif [ "$(command -v gzip)" ]; then<br />
gzip -9 < "$log" > "${log}.gz" && _compress_ok || _compress_err<br />
else<br />
echo "Impossibile effettuare la compressione!" >&2<br />
fi<br />
;;<br />
*)<br />
echo "Non è stato creato un file compresso."<br />
esac<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzione di stampa menù e selezione del problema<br />
# --------------------------------------------------------------------------<br />
<br />
function _scelta {<br />
<br />
# Problemi selezionati in base al parametro passato allo script<br />
[ "$TIPO_RETE" -eq 1 ] && _wait && _header "rete" && _rete && return<br />
[ "$TIPO_VIDEO" -eq 1 ] && _wait && _header "video" && _video && return<br />
[ "$TIPO_BOOT" -eq 1 ] && _wait && _header "boot" && _boot && return<br />
[ "$TIPO_AUDIO" -eq 1 ] && _wait && _header "audio" && _audio && return<br />
[ "$TIPO_APT" -eq 1 ] && _wait && _header "APT" && _apt && return<br />
[ "$TIPO_MNT" -eq 1 ] && _wait && _header "mount-unmount" && _mount && return<br />
[ "$TIPO_TOUCH" -eq 1 ] && _wait && _header "touchpad" && _tpad && return<br />
[ "$TIPO_COMM" -eq 1 ] && _wait && _header "generico" && _common && return<br />
<br />
# La funzione presenta un menù di scelta nel caso non sia stato passato alcun parametro<br />
local num<br />
<br />
clear<br />
_intro<br />
echo "<br />
Selezionare il tipo di problema per il quale verrà generato il file di log<br />
[1] Problemi relativi alle connessioni di rete<br />
[2] Problemi video<br />
[3] Problemi di boot<br />
[4] Problemi audio<br />
[5] Problemi di gestione dei pacchetti (APT)<br />
[6] Problemi di mount/unmount<br />
[7] Problemi di funzionamento del touchpad<br />
[8] Altro tipo di problema<br />
[0] Uscita"<br />
<br />
while true; do<br />
echo -n "Scegliere il numero corrispondente: "<br />
read num<br />
case "$num" in<br />
[1-8]) _wait ;;& # ;;& -> va alla successiva occorrenza del carattere immesso<br />
1) _header "rete" && _rete ;;&<br />
2) _header "video" && _video ;;&<br />
3) _header "boot" && _boot ;;&<br />
4) _header "audio" && _audio ;;&<br />
5) _header "APT" && _apt ;;&<br />
6) _header "mount-unmount" && _mount ;;&<br />
7) _header "touchpad" && _tpad ;;&<br />
8) _header "generico" && _common ;;&<br />
[1-8]) break ;; # Termina il ciclo 'while'<br />
0) _exit ;; # È stato inserito '0' . Uscita dallo script<br />
*) # Tutti gli altri caratteri. Cancella l'input immesso e ripete la domanda<br />
tput cuu1 # in alto di una riga<br />
tput ed # cancella fino alla fine dello schermo<br />
esac<br />
done<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni varie<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che stampa solo parentesi e il nome del comando, prima di eseguirlo<br />
function _prompt {<br />
echo -n "[ ] $*"<br />
}<br />
<br />
# Funzione che stampa un pallino colorato in base al primo parametro<br />
function _printdot {<br />
echo<br />
tput cuu1 # in alto di una riga<br />
tput cuf1 # a destra di uno spazio<br />
printf %b "$1•${FINE}\n" # stampa pallino e va a capo<br />
}<br />
<br />
# Funzione che stampa un pallino di colore verde in caso di comando con output<br />
function _ok { _printdot "${VERDE}"; }<br />
<br />
# Funzione che stampa una pallino rosso in caso di comando privo di output<br />
function _error { _printdot "${ROSSO}"; }<br />
<br />
# Funzione che stampa in grassetto gli argomenti<br />
function _bold {<br />
printf %b "${BOLD}"<br />
echo -n "$*"<br />
printf %b\\n "${FINE}"<br />
}<br />
<br />
# Funzione che invia nel file di log due righe tra le quali viene visualizzato il<br />
# nome del comando (passato come primo parametro della funzione -> $1)<br />
function _nome_e_riga {<br />
echo "<br />
******************************************<br />
$1<br />
******************************************" >> "$log"<br />
}<br />
<br />
# Funzione che stampa un messaggio di attesa<br />
function _wait {<br />
echo $'\nCreazione del log in corso...\n'<br />
}<br />
<br />
# Intestazione del file di log<br />
function _header {<br />
echo "Tipo di problema: $1" >> "$log"<br />
_data<br />
_lastupd <br />
echo "Versione script: $VERSIONE" >> "$log"<br />
}<br />
<br />
# Stampa la data corrente nel file di log<br />
function _data {<br />
echo "Log creato il: $(date '+%d %B %Y alle %H.%M')" >> "$log"<br />
}<br />
<br />
# Quota i caratteri specificati per le parole da nascondere con sed<br />
# Es: abc.def -> abc\.def<br />
function _sed_quote {<br />
# array di caratteri da quotare<br />
local quotearr=("." "/")<br />
<br />
local retstr="$1"<br />
for char in "${quotearr[@]}"; do<br />
retstr="${retstr//$char/\\$char}"<br />
done<br />
echo "$retstr"<br />
}<br />
<br />
# Funzione che nasconde nel log alcune informazioni sensibili<br />
function _hide {<br />
<br />
# Sostituisce il nome utente e il nome host con 'nomeutente' e 'nomehost' se diversi da [dD]ebian<br />
if [[ "$nomehost" =~ .*"$utente".* ]]; then<br />
[ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log"<br />
[ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log"<br />
else<br />
[ "$utente" != "Debian" ] && [ "$utente" != "debian" ] && sed -i -e "s/${utente}/nomeutente/g" "$log"<br />
[ "$nomehost" != "Debian" ] && [ "$nomehost" != "debian" ] && sed -i -e "s/${nomehost}/nomehost/g" "$log"<br />
fi <br />
<br />
# Nasconde gli ESSID gestiti attraverso Network Manager<br />
local var file mydir="/etc/NetworkManager/system-connections/"<br />
<br />
if [ -d "$mydir" ]; then # se esiste la directory /etc/NetworkManager/system-connections/ ...<br />
for file in "$mydir"/*; do # ciclo attraverso il contenuto della directory<br />
if [ -f "$file" ]; then # se l'elemento è un file...<br />
var=$(sed -n "s/ssid=//p" "$file") # ... var conterrà l'eventuale ESSID...<br />
if [ -n "$var" ]; then # ... e se è diverso dalla stringa vuota...<br />
sed -i "s/${var}/\*script-removed\*/g" "$log" # ... lo nasconde nel file di log<br />
fi<br />
fi<br />
done<br />
fi<br />
<br />
# Nasconde nel log i nomi delle connessioni gestite da NetworkManager<br />
sed -i -r "s/(NetworkManager.*keyfile.*((parsing)|(read connection))).*/\1 \*script-removed\*/" "$log"<br />
sed -i -r "s/(NetworkManager.*keyfile: new connection.*system-connections\/)(.*)( \(.*,\").*(\"\))/\1\*script-removed\*\3\*script-removed\*\4/g" "$log"<br />
sed -i -r "s/(NetworkManager.*policy: auto-activating connection ').*(')/\1\*script-removed\*\2/g" "$log"<br />
sed -i -r "s/(NetworkManager.*Activation: starting connection ').*(')/\1\*script-removed\*\2/g" "$log"<br />
sed -i -r "s/(NetworkManager.*policy: set ').*(')/\1\*script-removed\*\2/g" "$log"<br />
<br />
# Nasconde l'indirizzo MAC delle interfacce wireless<br />
local interfaces macaddress line<br />
if [ -f /proc/net/wireless ]; then<br />
# array che contiene i nomi delle interfacce wireless<br />
mapfile -s 2 interfaces < <(awk -F'[: ]+' '{ print $2 }' /proc/net/wireless)<br />
<br />
for i in "${interfaces[@]}"; do<br />
# indirizzo MAC dell'interfaccia solo se questa ne ha uno<br />
line="$(ip -br link show $i)"<br />
if [ "$(echo $line | wc -w)" -gt 3 ]; then<br />
macaddress="$(awk '{ print $3 }' <<< $line)"<br />
macaddress="$(_sed_quote $macaddress)"<br />
# l'indirizzo MAC viene nascosto nel file<br />
sed -i 's/'$macaddress'/\*script-removed\*/g' "$log"<br />
fi<br />
done<br />
fi<br />
}<br />
<br />
# Invia al log l'output del comando passato come primo parametro e<br />
# con i permessi utente<br />
function _su {<br />
echo "$(su -c "$1" $utente)" >> "$log"<br />
}<br />
<br />
# Stabilisce la data dell'ultimo aggiornamento effettuato. Viene preso in<br />
# considerazione il file /var/log/apt/history.log oppure il file /var/log/apt/history.log.1.gz<br />
function _lastupd {<br />
local convdate lastdate file=/var/log/apt/history.log<br />
<br />
if [ -f "$file" ]; then<br />
lastdate=$(sed -n '/^Start-Date/h ; $p' "$file" | cut -d ' ' -f 2)<br />
# se il file history.log non contiene la data dell'ultimo aggiornamento, viene utilizzato history.log.1.gz<br />
[ -z "$lastdate" ] && [ -f "${file}.1.gz" ] && lastdate=$(zcat "${file}.1.gz" | sed -n '/^Start-Date/h ; $p' | cut -d ' ' -f 2)<br />
<br />
# variabile che contiene la data in formato "giorno mese anno"<br />
convdate=$(date -d "$lastdate" '+%d %B %Y')<br />
<br />
echo $"Ultimo aggiornamento del sistema: ${convdate}" >> "$log"<br />
fi<br />
}<br />
<br />
# Funzione che effettua l'aggiornamento automatico dello script<br />
function _self_update {<br />
<br />
echo -n "Aggiornare questo script [S/n]? "<br />
local risp<br />
read risp<br />
[ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit || echo "Aggiornamento in corso..."<br />
<br />
# Controlla l'esistenza di wget<br />
[ ! "$(command -v wget)" ] && echo "Impossibile eseguire l'aggiornamento. Installare il pacchetto wget." && _exit<br />
<br />
# Ricava la versione remota dello script<br />
local vers="$(wget -q -O- "$SCRIPTURL" | sed -n '/^readonly VERSIONE.*/{p;q}' | cut -d '"' -f2)"<br />
if [ "$vers" = "" ]; then<br />
echo "Connessione non riuscita" && _exit<br />
fi<br />
<br />
if [ "$vers" = "$VERSIONE" ]; then<br />
echo "Lo script è gia alla versione più recente"<br />
else<br />
echo -n "È disponibile una nuova versione dello script: " && _bold "$vers"<br />
echo -n "Procedere con l'aggiornamento [S/n]? "<br />
read risp<br />
case "$risp" in<br />
[Ss]|"")<br />
local tempfile="$(mktemp)" # viene creato un file temporaneo<br />
# lo script in formato base64 viene copiato nel file temporaneo<br />
wget -q -O- "$SCRIPTURL_BASE64" | sed -n "/^=S=/{n; :a /^==Fine/ ! {p; n; ba}}" | base64 -d | tar xz -O > "$tempfile"<br />
if [ ! -s "$tempfile" ]; then # Controlla se il file è vuoto<br />
echo "Connessione non riuscita"<br />
else<br />
cp "$tempfile" "$PATH_NAME"<br />
[ $? -eq 0 ] && echo "Aggiornamento effettuato" || echo "Aggiornamento fallito"<br />
#rm -f "$tempfile" # Rimuove il file temporaneo<br />
fi ;;<br />
*)<br />
echo "Non è stato eseguito alcun aggiornamento"<br />
esac<br />
fi<br />
}<br />
<br />
# funzione che crea un file con la codifica base64 dello script<br />
# Da utilizzare in caso di aggiornamenti per modificare la pagina<br />
# http://guide.debianizzati.org/index.php/Aiuto:LogScript<br />
function _base64 {<br />
<br />
echo -n "Verrà creato un file con la codifica base64 di questo script. Continuare [S/n]? "<br />
local risp<br />
read risp<br />
[ "$risp" != "" ] && [ "$risp" != "s" ] && [ "$risp" != "S" ] && _exit ||<br />
local tempfile="$(mktemp)" # crea un file temporaneo<br />
tar cf - "${BASH_SOURCE[0]}" | gzip -9 | base64 > "$tempfile"<br />
if [ $? -eq 0 ]; then<br />
echo -n "Il file contenente la codifica base64 di questo script è " && _bold "$tempfile"<br />
else<br />
echo "Codifica non riuscita"<br />
fi<br />
# Modifica i permessi del file in modo che possa essere letto da tutti<br />
chmod 444 "$tempfile"<br />
}<br />
<br />
# Funzione che stampa un messaggio che indica i file creati e poi termina lo script<br />
function _exit {<br />
<br />
# se è stato effettuato un update o una codifica base64, stampa solo il messaggio finale<br />
if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then<br />
local complog=""<br />
<br />
if [ -f "$log" ]; then<br />
echo -n $'\nFile contenente il log dello script: '<br />
_bold "$log"<br />
else<br />
echo $'\nNon è stato creato un file di log'<br />
fi<br />
<br />
if [ -f "${log}.xz" ]; then<br />
complog="${log}.xz"<br />
elif [ -f "${log}.bz2" ]; then<br />
complog="${log}.bz2"<br />
elif [ -f "${log}.gz" ]; then<br />
complog="${log}.gz"<br />
fi<br />
<br />
if [ -z "$complog" ]; then <br />
echo "Non è stato creato un file compresso del log"<br />
else<br />
echo -n "File compresso da allegare alla discussione sul forum: "<br />
_bold "$complog"<br />
fi<br />
<br />
if [ -f "$script_debug" ]; then<br />
echo -n "File contenente l'output di debug: "<br />
_bold "$script_debug"<br />
fi<br />
fi<br />
<br />
echo $'Script terminato\n'<br />
_close_debug<br />
<br />
exit 0<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni relative a ciascun problema selezionato<br />
# --------------------------------------------------------------------------<br />
<br />
# Informazioni comuni a tutti i tipi di problema<br />
function _common {<br />
_dmi_decode<br />
_comando "/bin/uname -a"<br />
_file "/etc/debian_version"<br />
_de_wm<br />
_file "/etc/X11/default-display-manager"<br />
_comando "/usr/bin/groups" "su"<br />
_file "/var/log/syslog"<br />
_comando "/bin/systemctl --failed --no-pager"<br />
_comando "/bin/journalctl -x -b --no-pager -p err"<br />
_comando "/bin/journalctl -x -b --no-pager -p warning"<br />
_comando "/bin/journalctl -x -b --no-pager"<br />
_comando "/usr/bin/systemd-cgtop -b --iterations=5"<br />
_comando "/usr/bin/systemd-cgls -l"<br />
_comando "/usr/bin/systemd-delta"<br />
_comando "/bin/dmesg -l err"<br />
_comando "/bin/dmesg -l warn"<br />
_comando "/bin/lsmod"<br />
_comando "/usr/bin/lspci -knn"<br />
_comando "/usr/bin/lsusb"<br />
_comando "/sbin/fdisk -l"<br />
_comando "/sbin/blkid"<br />
_file "/etc/fstab"<br />
_dir "/etc/fstab.d/"<br />
_comando "/bin/findmnt"<br />
_comando "/bin/lsblk"<br />
_comando "/bin/df"<br />
_dir "/etc/modprobe.d/"<br />
_dir "/etc/modules-load.d/"<br />
_file "/etc/modules"<br />
_file "/etc/apt/sources.list"<br />
_dir "/etc/apt/sources.list.d/"<br />
_comando "/usr/bin/apt-cache policy"<br />
_comando "/usr/bin/apt-cache stats"<br />
_comando "/usr/bin/dpkg --audit"<br />
_comando "/usr/bin/apt-get check"<br />
_firmware<br />
_extpack<br />
_pack "linux-headers"<br />
_pack "linux-image"<br />
_comando "/usr/sbin/dkms status"<br />
}<br />
<br />
# Funzione relativa ai problemi di rete<br />
function _rete {<br />
_common<br />
_file "/etc/network/interfaces"<br />
_dir "/etc/network/interfaces.d/"<br />
_file "/etc/hosts"<br />
_comando "/sbin/ifconfig"<br />
_comando "/sbin/ifconfig -a"<br />
_comando "/sbin/ip -s -d link show"<br />
_comando "/usr/sbin/rfkill list all"<br />
_comando "/bin/ping -c3 -W5 8.8.8.8" #DNS di Google 8.8.8.8<br />
_comando "/bin/ip addr"<br />
_comando "/bin/ip route list"<br />
_comando "/sbin/iwconfig"<br />
_comando "/sbin/iwlist scan"<br />
_comando "/sbin/route -n"<br />
_pack "resolvconf"<br />
_file "/etc/resolv.conf"<br />
_pack "DHCP"<br />
_file "/etc/dhclient.conf"<br />
_file "/etc/NetworkManager/NetworkManager.conf"<br />
_comando "/usr/bin/nmcli dev list"<br />
_comando "/usr/bin/nmcli device show"<br />
_demone "/usr/sbin/NetworkManager" "Network Manager"<br />
_demone "/usr/sbin/wicd" "Wicd"<br />
}<br />
<br />
# Funzione relativa a problemi video<br />
function _video {<br />
_common<br />
_file "/etc/X11/xorg.conf"<br />
_dir "/etc/X11/xorg.conf.d/"<br />
_file "/var/log/Xorg.0.log"<br />
_file "${utente}/.local/share/xorg/Xorg.0.log"<br />
_pack "xserver-xorg"<br />
_pack "nouveau"<br />
_pack "nvidia"<br />
_pack "mesa"<br />
_pack "fglrx"<br />
_pack "amdgpu"<br />
}<br />
<br />
# Funzione relativa ai problemi di avvio del sistema<br />
function _boot {<br />
_common<br />
_file "/etc/default/grub"<br />
_file "/boot/grub/grub.cfg"<br />
_dir "/etc/default/grub.d/"<br />
_dir "/etc/grub.d/"<br />
_file "/boot/grub/device.map"<br />
_comando "/usr/sbin/grub-mkdevicemap"<br />
_pack grub<br />
}<br />
<br />
# Funzione relativa ai problemi audio. Scarica ed esegue lo script ALSA<br />
function _audio {<br />
_common<br />
_pack "alsa"<br />
_nome_e_riga "dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel'"<br />
_prompt "ALSA dmesg"<br />
dmesg | grep -C1 -E 'ALSA|HDA|HDMI|snd[_-]|sound|hda.codec|hda.intel' >> "$log" && _ok || _error<br />
<br />
local risp alsaurl="http://www.alsa-project.org/alsa-info.sh"<br />
<br />
echo $'\nI log relativi ai problemi audio sono ricavati attraverso lo script di debug'<br />
echo "ALSA prelevabile all'indirizzo: ${alsaurl}"<br />
echo -n $'\nVerrà ora scaricato e eseguito lo script ALSA. Continuare [S/n]? '<br />
read risp<br />
case "$risp" in<br />
""|[Ss])<br />
# wget esiste?<br />
if [ ! -f /usr/bin/wget ]; then<br />
echo "Impossibile scaricare lo script ALSA. Installare il pacchetto wget."<br />
return<br />
fi<br />
# Crea un file temporaneo in /tmp che conterrà lo script ALSA<br />
local tempfile=$(mktemp)<br />
# Scarica lo script ALSA<br />
_prompt "Download script ALSA"<br />
wget -q -O "$tempfile" "$alsaurl"<br />
# Se il download riesce...<br />
if [ $? -eq 0 ]; then<br />
_ok "Download script ALSA riuscito"<br />
# Imposta i permessi dello script scaricato<br />
chmod 777 "$tempfile"<br />
_nome_e_riga "Problemi audio"<br />
# rimuove il comando "dmesg" dallo script ALSA<br />
# perché non eseguibile da utente normale (il comando è<br />
# stato inserito a parte in questa funzione)<br />
sed -i "/^$(printf '\t')withdmesg/d" "$tempfile"<br />
# Esegue lo script ALSA<br />
_prompt "Esecuzione script ALSA"<br />
_su "$tempfile --stdout" && _ok || _error<br />
else<br />
_error "Download script ALSA fallito"<br />
fi<br />
<br />
# Rimuove il file temporaneo<br />
rm -- "$tempfile"<br />
;;<br />
*)<br />
echo "Lo script ALSA non è stato ancora eseguito."<br />
echo "Avviare manualmente lo script prelevabile a questo indirizzo:"<br />
_bold "$alsaurl"<br />
echo "Lo script ALSA va eseguito con i permessi di normale utente."<br />
esac<br />
<br />
}<br />
<br />
# Funzione relativa alla gestione dei pacchetti attraverso il sistema APT<br />
function _apt {<br />
_common<br />
_comando "/usr/bin/dpkg --print-architecture"<br />
_comando "/usr/bin/dpkg --print-foreign-architectures"<br />
_comando "/usr/bin/apt-get update"<br />
_comando "/usr/bin/apt-get -s -y upgrade"<br />
_comando "/usr/bin/apt-get -s -y dist-upgrade"<br />
_comando "/usr/bin/apt-get -s -y -f install"<br />
_comando "/usr/bin/apt-get -s -y autoremove"<br />
_comando "/usr/bin/apt-config dump"<br />
_file "/etc/apt/apt.conf"<br />
_dir "/etc/apt/apt.conf.d/"<br />
_file "/etc/apt/preferences"<br />
_dir "/etc/apt/preferences.d/"<br />
}<br />
<br />
# Funzione relativa a problemi di mount/unmount<br />
function _mount {<br />
_common<br />
_comando "/usr/bin/udisksctl dump"<br />
_pack "usbmount"<br />
}<br />
<br />
# Funzione relativa al funzionamento del touchpad<br />
function _tpad {<br />
_common<br />
_pack "xserver-xorg"<br />
_pack "touchpad"<br />
_file "/etc/X11/xorg.conf"<br />
_dir "/etc/X11/xorg.conf.d/"<br />
_file "/var/log/Xorg.0.log"<br />
_comando "/usr/bin/synclient -l" "su"<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni utilizzate per tipo di problema (generiche)<br />
# --------------------------------------------------------------------------<br />
<br />
# Funzione che invia il contenuto di un file al file di log<br />
# La funzione va richiamata specificando il path completo del file che sarà assegnato a $1<br />
# Il contenuto dei file viene inviato inalterato al file di log. Se si ha necessità di<br />
# modificare questo comportamento, creare una entry nel ciclo "case"<br />
<br />
function _file {<br />
_nome_e_riga "$1"<br />
_prompt "$1"<br />
if [ -f "$1" ]; then<br />
case "$1" in<br />
/etc/fstab)<br />
# Nasconde username, password e dominio di mount CIFS<br />
sed -e "s/\( cifs.*username *= *\)[^,]*/\1\*script-removed\*/" \<br />
-e "s/\( cifs.*password *= *\)[^,]*/\1\*script-removed\*/" \<br />
-e "s/\( cifs.*domain *= *\)[^,]*/\1\*script-removed\*/" "$1" &>> "$log" && _ok || _error ;;<br />
/etc/network/interfaces)<br />
# Nasconde nel log gli ESSID e le password criptate contenute in /etc/network/interfaces<br />
sed -r "s/((wpa-ssid)|(wpa-psk)|(wpa-identity)|(wpa-password)|(wireless-key)).*/\1 \*script-removed\*/" "$1" &>> "$log" && _ok || _error ;;<br />
/var/log/syslog)<br />
# se è installato systemd, il log viene ricavato da "journalctl -x"<br />
if [ $systemd -eq 0 ]; then <br />
# se il file contiene la stringa "rsyslogd.*start" ...<br />
if [ "$(grep -sci 'rsyslogd.*start$' "$1")" -ne 0 ]; then<br />
# ... estrae da syslog tutto il contenuto dall'ultima occorrenza della stringa alla fine del file<br />
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1" >> "$log" && _ok || _error<br />
else<br />
# se syslog non contiene quella stringa, allora si effettuerà la stessa operazione su syslog.1 ($1.1)<br />
# in questo caso l'intero contenuto del file syslog viene inviato al log<br />
cat "$1" &>> "$log" && _ok || _error<br />
_nome_e_riga "$1".1<br />
_prompt "$1".1<br />
sed -n 'H; /rsyslogd.*start$/h; ${g;p;}' "$1".1 >> "$log" && _ok || _error<br />
fi<br />
else _error # systemd è installato. I log vengono ricavati da "journalctl -x"<br />
fi ;;<br />
*)<br />
# per tutti i file non specificati sopra...<br />
cat "$1" &>> "$log" && _ok || _error<br />
esac<br />
else<br />
echo "File \"$1\" non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# Invia l'output di un comando al file di log<br />
# La funzione va richiamata specificando il path completo del comando (con eventuali opzioni)<br />
# che sarà assegnato a $1 . L'output dei comandi viene inviato interamente al file di log. Se<br />
# si ha necessità di modificare gli output, creare una entry nel ciclo "case"<br />
# Es. _comando "/usr/bin/apt-get update"<br />
#<br />
# Nel caso in cui il comando debba essere eseguito tramite 'su', richiamare la funzione con<br />
# due parametri:<br />
# $1 = il comando da eseguire attraverso 'su'<br />
# $2 = la stringa 'su'<br />
# Es. _comando "/usr/bin/groups" "su"<br />
<br />
function _comando {<br />
<br />
local var=${1##*/} # var conterrà il comando ($1) con le opzioni ma privo del path<br />
local var2=${1%% *} # var2 conterrà il comando ($1) privo di eventuali opzioni ma con il path<br />
_nome_e_riga "$var"<br />
_prompt "$var"<br />
<br />
if [ -f "$var2" ]; then # il comando esiste?<br />
if [ $# -eq 2 ]; then # Se vi sono 2 parametri, viene chiamata la funzione "_su"<br />
case "$1" in<br />
"/usr/bin/synclient -l")<br />
# se $DISPLAY è vuota, usa :0 (default per il primo server X)<br />
_su "DISPLAY=${DISPLAY:-:0} $1" && _ok || _error ;;<br />
*) <br />
_su "$1" && _ok || _error<br />
esac<br />
else # non viene utilizzato "su"<br />
case "$1" in<br />
# per "iwconfig" e "iwlist scan" gli ESSID non vengono inviati al log<br />
/sbin/iwconfig)<br />
(iwconfig | sed -e '/ESSID:/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error<br />
;;<br />
"/sbin/iwlist scan")<br />
(iwlist scan | sed -e '/ESSID:.*/{/off\/any/! s/ESSID:.*/ESSID:"*script-removed*"/g}' -e '/^[ ]*IE: Unknown:.*/d') &>> "$log" && _ok || _error<br />
;;<br />
# nasconde gli ESSID visualizzati da "nmcli dev list" (fino a Wheezy)<br />
# L'array PIPESTATUS mostra il codice d'uscita dei comandi della pipe. PIPESTATUS[0] è il codice d'uscita di "nmcli dev list" (0=successo)<br />
"/usr/bin/nmcli dev list")<br />
nmcli dev list 2>/dev/null | sed -r "s/(^AP[[:digit:]]*\.SSID:[[:space:]]*).*/\1\*script removed\*/" >> "$log" && [ "${PIPESTATUS[0]}" -eq 0 ] && _ok || \<br />
( _error && echo "Comando valido solo per Wheezy" >> "$log" ) ;;<br />
# nasconde gli ESSID visualizzati da "nmcli device show" (da Jessie in poi)<br />
"/usr/bin/nmcli device show")<br />
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 || \<br />
( _error && echo "Comando valido solo per Jessie e versioni superiori" >> "$log" ) ;;<br />
/bin/dmesg*)<br />
# Il comando viene eseguito solo se è non installato systemd<br />
[ $systemd -eq 0 ] && $1 &>> "$log" && _ok || _error ;;<br />
"/usr/sbin/grub-mkdevicemap")<br />
local devicemaptempfile="$(mktemp)" && \<br />
grub-mkdevicemap -m "$devicemaptempfile" && \<br />
if [ -f "$devicemaptempfile" ]; then cat "$devicemaptempfile" >> "$log"; fi && _ok || _error ;;<br />
*)<br />
# per tutti gli altri comandi non specificati in precedenza, l'output del comando è inviato inalterato al log<br />
$1 &>> "$log" && _ok || _error<br />
esac <br />
fi<br />
else<br />
echo "Comando \"${var2}\" non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# Funzione che invia il contenuto dei file di una directory al file di log<br />
function _dir {<br />
_nome_e_riga "$1"<br />
_prompt "$1"<br />
<br />
# Se la directory non esiste, stampa un output sul log ed esce.<br />
if [ ! -d "$1" ]; then<br />
echo "La directory non esiste" >> "$log" && _error<br />
return<br />
fi<br />
<br />
local file<br />
# numfile contiene il numero di file contenuti nella directory. Solo primo livello.<br />
local numfile=$(find "$1" -maxdepth 1 -type f | wc -l)<br />
# numdir contiene il numero di sottodirectory contenute nella directory. Solo primo livello.<br />
local numdir=$(find "$1" -maxdepth 1 -type d | wc -l)<br />
<br />
if [ "$numfile" -eq 0 ] && [ "$numdir" -eq 1 ]; then<br />
echo "La directory non contiene file o directory" >> "$log" && _error<br />
else<br />
echo "La directory contiene ${numfile} file e $((numdir - 1)) directory" >> "$log" && _ok<br />
ls -al "$1" >> "$log"<br />
# invia al log il contenuto dei file della directory<br />
for file in "$1"*; do<br />
if [ -f "$file" ]; then<br />
_nome_e_riga "$file"<br />
_prompt "$file"<br />
cat "$file" &>> "$log" && _ok || _error<br />
fi<br />
done<br />
<br />
# Funzione che invia al log il contenuto dei file presenti nelle sottodirectory<br />
# I due cicli "for" sono separati per permettere l'output di un file subito dopo<br />
# la directory a cui appartiene<br />
for file in "$1"*; do<br />
if [ -d "$file" ]; then<br />
_dir "$file/"<br />
fi<br />
done<br />
fi<br />
}<br />
<br />
# Funzione che elenca i pacchetti installati che contengono la parola<br />
# passata come parametro ($1)<br />
<br />
function _pack {<br />
_nome_e_riga "Pacchetti che contengono \"$1\""<br />
_prompt "Nomi di pacchetti con $1"<br />
<br />
# Variabile che contiene i pacchetti trovati<br />
local packages=$(dpkg -l | grep -i "$1")<br />
<br />
if [ -z "$packages" ]; then<br />
echo "Nessun pacchetto installato" >> "$log" && _error<br />
else<br />
echo "$packages" >> "$log" && _ok<br />
fi<br />
}<br />
<br />
# Funzione che verifica l'esistenza e l'esecuzione di alcuni demoni<br />
# Viene chiamata con due parametri:<br />
# $1 - percorso dell'eseguibile<br />
# $2 - nome da visualizzare<br />
# Se si vuol visualizzare la versione del demone, inserire il comando adatto<br />
# all'interno del ciclo 'case', allo stesso modo specificare al suo interno<br />
# anche il nome dello script d'avvio per fermare, avviare, etc il demone<br />
<br />
function _demone {<br />
<br />
# vers = versione del demone ; var = nome dello script d'avvio del demone<br />
local vers="" var=""<br />
_nome_e_riga "$2"<br />
_prompt "$2"<br />
if [ -f "$1" ]; then<br />
case "$1" in<br />
/usr/sbin/NetworkManager)<br />
vers=$(NetworkManager --version)<br />
var="network-manager"<br />
;;<br />
/usr/sbin/wicd)<br />
vers=$(wicd -h | head -2 | tail -1)<br />
var="wicd"<br />
;;<br />
esac<br />
<br />
echo "$2 è installato (versione "$vers")" >> "$log" && _ok<br />
invoke-rc.d "$var" status &>/dev/null<br />
[ $? -eq 0 ] && echo "$2 è in esecuzione" >> "$log" || echo "$2 non è in esecuzione" >> "$log"<br />
else<br />
echo "$2 non è installato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# --------------------------------------------------------------------------<br />
# Funzioni utilizzate per tipo di problema (particolari)<br />
# --------------------------------------------------------------------------<br />
<br />
# comando 'cat /sys/class/dmi/id/{sys_vendor,product_name,product_version,bios_version}'<br />
function _dmi_decode {<br />
local var="/sys/class/dmi/id/*"<br />
_nome_e_riga "$var"<br />
_prompt "$var"<br />
if [ -f /sys/class/dmi/id/sys_vendor ]; then<br />
echo "Produttore: $(cat /sys/class/dmi/id/sys_vendor)" &>> "$log"<br />
echo "Prodotto: $(cat /sys/class/dmi/id/product_name)" &>> "$log"<br />
echo "Versione: $(cat /sys/class/dmi/id/product_version)" &>> "$log"<br />
echo "BIOS vers.: $(cat /sys/class/dmi/id/bios_version)" &>> "$log" && _ok || _error<br />
else<br />
echo "File /sys/class/dmi/id/sys_vendor non trovato" >> "$log" && _error<br />
fi<br />
}<br />
<br />
# esistenza di pacchetti contenenti firmware e firmware presente sulla macchina<br />
function _firmware {<br />
local i var="Firmware"<br />
_prompt "$var"<br />
_nome_e_riga "$var"<br />
dpkg -l | grep -i firmware >> "$log" && _ok || _error<br />
echo >> "$log"<br />
<br />
# Elenca i file contenuti nelle directory specificate<br />
for i in "/usr/lib/firmware" "/usr/local/lib/firmware" "/lib/firmware" "/run/udev/firmware-missing"; do<br />
if [ -d "$i" ]; then<br />
echo "Contenuto di ${i}" >> "$log"<br />
ls -alR "$i" >> "$log"<br />
else<br />
echo "${i} non trovata" >> "$log"<br />
fi<br />
echo >> "$log"<br />
done<br />
}<br />
<br />
# Stampa sullo standard output l'eseguibile associato a x-session-manager (il default)<br />
function _x_session_manager {<br />
update-alternatives --query "x-session-manager" |<br />
awk '$1 ~ /^Value:$/ { print $2; exit 0 }'<br />
}<br />
<br />
# Stampa sullo standard output l'eseguibile associato a x-window-manager (il default)<br />
function _x_window_manager {<br />
update-alternatives --query "x-window-manager" |<br />
awk '$1 ~ /^Value:$/ { print $2; exit 0 }'<br />
}<br />
<br />
# Stampa la lista dei pacchetti installati che soddisfano una data dipendenza<br />
# con versione (del programma e in Debian) e archivio di provenienza<br />
# Viene chiamata con un parametro:<br />
# $1 - nome della dipendenza<br />
function _soddisfa {<br />
echo "Installati (${1}):"<br />
aptitude search '?installed?provides('"$1"')' --disable-columns \<br />
--display-format "- %p (versione: %v; archivio: %t)"<br />
}<br />
<br />
# Restituisce un exit status di 0 solo se l'eseguibile con il nome scelto è in esecuzione da parte dell'utente ($utente)<br />
# Viene chiamata con un parametro:<br />
# $1 - comando di cui controllare l'esecuzione da parte di $utente<br />
function _is_running {<br />
local list_pids_user list_pids_bin pid pid2<br />
list_pids_user=$(ps -U "$utente" -o pid) # lista di interi, separati da spazi, con i PID dei processi avviati da $utente<br />
list_pids_bin=$(pidof -- "$1") # lista di interi, separati da spazi, con i PID dei processi del comando $1<br />
for pid in $list_pids_user; do<br />
for pid2 in $list_pids_bin; do<br />
if [ "$pid" = "$pid2" ]; then<br />
return 0 # trovato<br />
fi<br />
done<br />
done<br />
return 1 # non trovato!<br />
}<br />
<br />
# Funzione che "cerca" di ricavare il nome e la versione del DE/WM utilizzato<br />
function _de_wm {<br />
_nome_e_riga "Desktop Environment - Window Manager"<br />
_prompt "DE/WM"<br />
{<br />
# impostazione di default<br />
echo -n $'Default:\n- x-session-manager: '<br />
_x_session_manager<br />
echo -n "- x-window-manager: "<br />
_x_window_manager<br />
# installati<br />
if [ "$(command -v aptitude)" ]; then<br />
_soddisfa "x-session-manager"<br />
# _soddisfa "x-window-manager" # non essenziale e impiega già tanto<br />
fi<br />
} >> "$log"<br />
# in esecuzione<br />
echo -n "In esecuzione: " >> "$log"<br />
if _is_running "ksmserver"; then<br />
kf5-config -v 2>/dev/null >> "$log" || # KDE5<br />
kde4-config -v 2>/dev/null >> "$log" && _ok || _error # KDE4<br />
elif _is_running "gnome-shell"; then gnome-shell --version >> "$log" && _ok || _error # GNOME Shell<br />
elif _is_running "xfdesktop"; then xfce4-about -V | head -n1 | cut -d ' ' -f2- >> "$log" && _ok || _error # Xfce4<br />
elif _is_running "openbox"; then<br />
if [ "$(_x_session_manager)" != "/usr/bin/openbox-session" ]; then<br />
echo -n "(altro x-session-manager) + " >> "$log" # Session manager (LXDE?) + Openbox<br />
fi<br />
openbox --version | head -n 1 >> "$log" && _ok || _error # Openbox<br />
else<br />
echo "Sconosciuto" >> "$log" && _error # NON TROVATO<br />
fi<br />
}<br />
<br />
# Funzione che elenca i pacchetti non appartenenti alla release di default utilizzata<br />
function _extpack {<br />
<br />
local var="Pacchetti esterni"<br />
_prompt "$var"<br />
<br />
# La funzione termina se aptitude non è installato<br />
if [ ! "$(command -v aptitude)" ]; then<br />
_nome_e_riga "$var"<br />
echo "Aptitude non è installato" >> "$log" && _error<br />
return 1<br />
fi<br />
<br />
local riga indirizzo rel linea release=""<br />
<br />
# variabile con il contenuto del file sources.list (solo righe che iniziano con deb<br />
# e che contengono "main" )<br />
local sourceslist="$(sed -e '/^deb /!d' -e '/.* main.*/!d' /etc/apt/sources.list)"<br />
<br />
# variabile che contiene l'output del comando "apt-cache policy"<br />
local aptcachepol="$(apt-cache policy)"<br />
<br />
# ciclo sulle righe della variabile "sourceslist"<br />
while read linea; do<br />
<br />
# variabile che contiene l'URL dell'archivio (es. http://ftp.it.debian.org/debian/)<br />
indirizzo="$(awk '{ print $2 }' <<< "$linea")"<br />
<br />
# sostituisce / con \/ (necessario per il successivo sed)<br />
indirizzo="$(_sed_quote "$indirizzo")"<br />
<br />
# release della riga corrente (es. wheezy o testing o sid)<br />
rel="$(awk '{ print $3 }' <<< "$linea")"<br />
<br />
# controlla che sia un nome di release valido<br />
if [ "$rel" = "oldstable" ] || [ "$rel" = "stable" ] || [ "$rel" = "testing" ] || [ "$rel" = "unstable" ] ||<br />
[ "$rel" = "$OLDSTABLE" ] || [ "$rel" = "$STABLE" ] || [ "$rel" = "$TESTING" ] || [ "$rel" = "sid" ] ||<br />
[ "$rel" = "oldoldstable" ] || [ "$rel" = "OLDOLDSTABLE" ]; then<br />
<br />
# controlla che sia un repository di Debian<br />
# si basa sull'output di "apt-cache policy" e su o=Debian e l=Debian<br />
riga="$(echo "$aptcachepol" | sed -n '/'$indirizzo'*.*'$rel'\/main.*Packages$/ {N; /.*o=Debian,.*l=Debian,/p}')"<br />
<br />
# se è un archivio valido, aggiorna la variabile "release"<br />
if [ ! -z "$riga" ]; then<br />
if [ -z "$release" ]; then<br />
release="$rel"<br />
else<br />
release="$(printf %b "$release\n$rel")"<br />
fi<br />
fi<br />
fi<br />
done <<< "$sourceslist"<br />
<br />
# Lo script DEVE rilevare almeno una release. Se la variabile "release" è nulla, c'è un errore in "sources.list"<br />
# oppure non è stato eseguito un aggiornamento della lista dei pacchetti (update)<br />
# (vedere anche il modo in cui viene ricavata la variabile "release" in alto)<br />
if [ -z "$release" ]; then<br />
_nome_e_riga "${var} all'archivio \"NON RILEVATO!\""<br />
echo "Release non rilevata. Repository errati oppure è necessaria una modifica dello script" >> "$log" && _error<br />
return 1<br />
fi<br />
<br />
# Rimuove eventuali duplicati (esistono repository doppi in sources.list)<br />
release="$(echo "$release" | sort -u)"<br />
<br />
# Numero di release trovate<br />
local num=$(echo "$release" | wc -l)<br />
<br />
# Se il numero di release è diverso da 1 (pinning?), la funzione termina<br />
if [ "$num" -ne 1 ]; then<br />
_nome_e_riga "$var"<br />
echo "Sono presenti ${num} release in sources.list" >> "$log" && _error<br />
return<br />
fi<br />
<br />
local pkg=""<br />
<br />
# Se il numero di release è uguale a 1, la variabile pkg conterrà i pacchetti *non* facenti parte della release<br />
case "$release" in<br />
"$OLDOLDSTABLE"|oldstable)<br />
release="oldoldstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aoldoldstable' --disable-columns | column -t) ;;<br />
"$OLDSTABLE"|oldstable)<br />
release="oldstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aoldstable' --disable-columns | column -t) ;;<br />
"$STABLE"|stable)<br />
release="stable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Astable' --disable-columns | column -t) ;;<br />
"$TESTING"|testing)<br />
release="testing"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Atesting' --disable-columns | column -t) ;;<br />
sid|unstable) <br />
release="unstable"<br />
pkg=$(aptitude -F '%p %v %t' search '~S ~i !~Aunstable' --disable-columns | column -t) ;;<br />
esac<br />
<br />
# Invia al log il contenuto di pkg (se esiste)<br />
_nome_e_riga "${var} all'archivio \"${release}\""<br />
if [ -z "$pkg" ]; then<br />
echo "Nessun pacchetto esterno installato" >> "$log" && _error<br />
else<br />
echo "$pkg" >> "$log" && _ok<br />
fi<br />
}<br />
<br />
<br />
# --------------------------------------------------------------------------<br />
# Main<br />
# --------------------------------------------------------------------------<br />
clear<br />
<br />
_intro<br />
<br />
if [ "$UPDATE" -eq 0 ] && [ "$BASE64" -eq 0 ]; then<br />
_debug<br />
_avvertenze<br />
_check<br />
_scelta<br />
_hide<br />
_upload<br />
_compress<br />
elif [ "$UPDATE" -eq 1 ]; then<br />
_self_update<br />
elif [ "$BASE64" -eq 1 ]; then<br />
_base64<br />
fi<br />
<br />
_exit<br />
</pre><br />
<br />
== Changelog ==<br />
<!-- 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) --><br />
;1.0.70<br />
:''Aggiunta oldoldstable''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] ([[Discussioni utente:S3v|discussioni]]) 21:08, 15 mar 2021 (UTC)<br />
;1.0.69<br />
:''http->https per paste.debian.net''<br />
:''Sostituito "which" con "command -v"''<br />
:''Aggiunto _pack "amdgpu"''<br />
:''Aggiunta funzione per quotare stringhe prima di passarle a sed''<br />
:''Rimosso comando "udisks --dump" (non più presente in Debian)''<br />
:''Gestita la mancanza di aptitude''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 13:21, 23 ott 2020 (CEST)<br />
<br />
;1.0.68<br />
:''Nascosti indirizzi MAC delle interfacce wireless''<br />
:''Sovrascrittura del comando cat per evitare che al file di''<br />
:''log venga inviato il contenuto di un file non di testo''<br />
:''Impostata a 'on' l'opzione 'extdebug' per consentire l'espansione''<br />
:''di ARGC per Bash >= 5''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 15:00, 23 mag 2020 (CEST)<br />
;1.0.67<br />
:''Aggiornamento per rilascio di Debian 10 ([[Buster]])''<br />
:[[Utente:HAL 9000|HAL 9000]] 09:39, 7 lug 2019 (CEST)<br />
;1.0.66<br />
:''Aggiunto problema per avvio del sistema (boot)''<br />
:''Aggiunta funzione _su (c'erano problemi con lo script ALSA)''<br />
:''Aggiunte directory <code>/etc/fstab/</code>, <code>/etc/modprobe.d/</code>'',<br />
:''<code>/etc/modules-load.d/</code>, <code>/etc/network/interfaces.d/</code> e il''<br />
:''file <code>/etc/modules</code>''<br />
:''dmesg dello script ALSA spostato nello script''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 10:37, 29 giu 2019 (CEST)<br />
;1.0.65<br />
:''Aggiunti "ip -s -d link show" e Xorg.0.log locale''<br />
:''Nascosti username, password e dominio per montaggi cifs''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 20:49, 20 feb 2018 (CET)<br />
;1.0.64<br />
:''Aggiornamento per rilascio di Debian 9 ([[Stretch]])''<br />
:[[Utente:HAL 9000|HAL 9000]] 10:46, 18 giu 2017 (CEST)<br />
;1.0.63<br />
:''Debug come parametro''<br />
:''KDE5 tra i DE rilevati''<br />
:[[Utente:S3v|S3v]] 22:38, 19 mag 2017 (CEST)<br />
;1.0.62<br />
:''Inserito debug''<br />
:''Inserita funzione _printdot (per evitare ripetizioni)''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 17:41, 26 feb 2017 (CET)<br />
;1.0.61<br />
:''Aggiunta funzione _header() (intestazione del file di log)''<br />
:''Aggiunto parametro "--versione"''<br />
:''Modifiche e correzioni minori''<br />
:[[Utente:S3v|S3v]] 13:53, 10 dic 2016 (CET)<br />
;1.0.60<br />
:''Elenco ricorsivo delle directory contenenti firmware''<br />
:''Nascosti (altri) ID di connessioni gestite da NM''<br />
:[[Utente:S3v|S3v]] 20:53, 6 dic 2016 (CET)<br />
;1.0.59<br />
:''Modificata funzione _hide() per nascondere completamente hostname contenuto nel''<br />
:''nome utente (e viceversa)''<br />
:[[Utente:S3v|S3v]] 21:33, 11 nov 2016 (CET)<br />
;1.0.58<br />
:''Rimossa precedente istruzione e modificata regexp per far funzionare la ricerca di''<br />
:''pacchetti esterni sia su stable che su testing''<br />
:''Modifiche minori''<br />
:[[Utente:S3v|S3v]] 16:44, 10 lug 2016 (CEST)<br />
;1.0.57<br />
:''Istruzione per rimuovere eventuale slash alla fine dell'URL in "sources.list"''<br />
:''Aggiunti comandi "systemd-cgtop -b --iterations=5", "systemd-cgls" e "systemd-delta" a problemi comuni''<br />
:[[Utente:S3v|S3v]] 21:27, 9 lug 2016 (CEST)<br />
;1.0.56<br />
:''Rimosse dal file interfaces anche le chiavi relative a wep e a wpa-enterprise''<br />
:[[Utente:metaldaze|metaldaze]] 12:54, 04 feb 2016 (CET)<br />
;1.0.55<br />
:''Opzioni per aggiornare lo script o crearne una codifica base64''<br />
:''Corretti ESSID in "nmcli device show" non nascosti''<br />
:''Rimozione duplicati in "release" (pacchetti esterni)''<br />
:[[Utente:S3v|S3v]] 21:26, 15 giu 2015 (CEST)<br />
;1.0.54<br />
:''Correzioni minori legate alla compressione xz; semplificata lettura nome utente in caso di errori con logname''<br />
:[[Utente:HAL 9000|HAL 9000]] 18:41, 31 mag 2015 (CEST)<br />
;1.0.53<br />
:''Vengono rimosse dalla variabile "release" (pacchetti esterni) le linee duplicate''<br />
:[[Utente:S3v|S3v]] 18:22, 30 mag 2015 (CEST)<br />
;1.0.52<br />
:''Aggiunta compressione xz, se disponibile, con ripiego su bzip2 oppure gzip''<br />
:[[Utente:HAL 9000|HAL 9000]] 22:15, 17 mag 2015 (CEST)<br />
;1.0.51<br />
:''Aggiunti comandi "systemctl --failed", "journal -x -b --no-pager [-p [err, warning]]",''<br />
:''"blkid", "lsblk", "dpkg --audit"''<br />
:''"/var/log/syslog" e "dmesg" solo se non è installato systemd''<br />
:''Aggiunta variabile globale "oldstable" e aggiornate "testing" e "stable"''<br />
:''Modifiche minori''<br />
:[[Utente:HAL 9000|HAL 9000]] e [[Utente:S3v|S3v]] 17:12, 4 mag 2015 (CEST)<br />
;1.0.50<br />
:''Rivista la funzione _extpack (repository Debian''<br />
:''in base al comando "apt-cache policy")''<br />
:[[Utente:S3v|S3v]] 22:37, 22 dic 2014 (CET)<br />
;1.0.49<br />
:''Aggiunti trap INT e "dpkg --print-foreign-architectures"''<br />
:''Spostato "dkms status" nei comandi generali''<br />
:[[Utente:S3v|S3v]] 21:19, 20 dic 2014 (CET)<br />
;1.0.48<br />
:''Corretta la ricerca per i pacchetti esterni''<br />
:''Aggiunto _pack "linux-image"''<br />
:[[Utente:S3v|S3v]] 20:16, 19 nov 2014 (CET)<br />
;1.0.47<br />
:''Inseriti "nmcli dev list" (per Wheezy) e "nmcli device show" (per Jessie e superiori)''<br />
:''Inserito "udisksctl dump"''<br />
:[[Utente:S3v|S3v]] 15:55, 5 nov 2014 (CET)<br />
<br />
(Prosegue nella pagina di [[Discussione:Creazione automatica di un file di log per inviare quesiti al forum|discussione]]).<br />
<br />
{{Autori<br />
|Autore=[[Utente:S3v|S3v]] 23:38, 13 apr 2013 (CEST)<br />
}}<br />
<br />
[[Categoria: Bash Scripting]][[Categoria: Configurazione ethernet]][[Categoria: Configurazione wireless]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Server_FTP_di_rete_con_ProFTPD_e_utenti_virtuali&diff=44289Server FTP di rete con ProFTPD e utenti virtuali2021-03-15T20:11:41Z<p>S3v: Verificata per Buster</p>
<hr />
<div>{{Versioni compatibili|Wheezy|Jessie|Buster}}<br />
== Introduzione ==<br />
In questa guida verrà spiegata la l'installazione e la configurazione di un server FTP all'interno della propria LAN utilizzando ProFTPD.<br/><br />
L'installazione di ProFTPD porta, di default, ad una autenticazione degli accessi basata sui file "/etc/passwd" e "/etc/group" presenti sul server. Questo significa che, per avere accesso al server FTP. l'amministratore deve creare un utente (con relativa home directory).<br/><br />
Questo approccio è, tipicamente, valido nel caso in cui gli accessi al server siano pochi e l'amministratore non debba preoccuparsi più di troppo di ciò che hanno in mente di fare gli utenti e dello spazio occupato da ciascuna home directory. All'aumentare delle utenze, però, i rischi legati alla sicurezza aumentano e serve trovare una strada più comoda per amministrare facilmente gli accessi.<br />
<br />
Premesso questo, per la procedura spiegata nei paragrafi seguenti si assumerà che:<br />
* Gli indirizzi della propria rete siano del tipo 192.168.X.X .<br />
* L'autenticazione avvenga esclusivamente attraverso utenti/gruppi virtuali.<br />
<br />
== Installazione ==<br />
Per installare ProFTPD:<br />
<pre><br />
# apt-get install proftpd-basic<br />
</pre><br />
<br />
== Operazioni preliminari ==<br />
Prima di cominciare con la modifica dei file di configurazione di ProFTPD, bisogna scegliere la directory che conterrà le sotto-directory in cui ciascun utente potrà inviare/scaricare i propri file. In questa guida si prenderà come esempio la directory "/home/ftp-share". Creiamola:<br />
<pre><br />
# mkdir -p /home/ftp-share<br />
</pre><br />
Questa sarà anche la home directory degli utenti, ossia la directory in cui sono confinati durante la sessione FTP.<br />
<br />
== Utenti e gruppi virtuali ==<br />
Gli utenti e gruppi virtuali non sono altro che normali utenti (o gruppi) con un proprio [[UID]] (o [[GID]]) ma con un'importante differenza rispetto agli "utenti canonici": la loro autenticazione è valida solo per ProFTPD.<br />
<br />
Questo si ottiene separando completamente i file contenenti le credenziali di autenticazione per utenti/gruppi: il sistema utilizzerà i classici "/etc/passwd" e "/etc/group", ProFTPD creerà dei propri file e si baserà su questi ultimi per autenticare gli accessi.<br/><br />
La creazione di utenti/gruppi virtuali si ottiene attraverso il comando "ftpasswd".<br />
<br />
=== Creare un utente virtuale ===<br />
Iniziamo a creare gli utenti virtuali che avranno accesso al server FTP:<br />
<pre><br />
# ftpasswd --passwd --home /home/ftp-share --name pippo --shell /bin/false --uid 2001 --file /etc/proftpd/ftpd.passwd<br />
</pre><br />
Il precedente comando accetta diverse opzioni:<br />
;--passwd:Necessario affinché "ftpasswd" crei un utente virtuale.<br />
;--home ''path_directory'':È la home directory dell'utente in cui gli sarà possibile accedere tramite FTP.<br />
;--name ''nome'':Opzione necessaria per assegnare un nome all'utente virtuale.<br />
;--shell /bin/false:L'utente non avrà una shell di login.<br />
;--uid ''UID'': Numero che rappresenta l'[[UID]] per l'utente virtuale. Importante notare che è attraverso l'UID che ProFTPD identifica un utente e non attraverso il suo nome. Questo porta alla naturale conclusione che è possibile creare utenti virtuali che hanno lo stesso nome degli utenti reali (se presenti) con possibilità di login sul server.<br/>La scelta dell'UID non ha particolari limitazioni ma è fortemente consigliato evitare UID pari a 0 o UID uguale a quello di utenti reali (presenti in "etc/passwd"); è invece possibile avere utenti virtuali con lo stesso UID.<br />
;--file ''/etc/proftpd/ftpd.passwd'':Il percorso e il nome del file che conterrà le informazioni per ciascun utente virtuale.<br />
<br />
Successivamente verrà chiesta la password di cui l'utente si servirà per l'accesso FTP.<br />
<br />
Il precedente comando va impartito per ciascun utente. Ad esempio:<br />
<pre><br />
# ftpasswd --passwd --home /home/ftp-share --name pluto --shell /bin/false --uid 2002 --file /etc/proftpd/ftpd.passwd<br />
# ftpasswd --passwd --home /home/ftp-share --name minnie --shell /bin/false --uid 2003 --file /etc/proftpd/ftpd.passwd<br />
</pre><br />
<br />
le uniche modifiche riguardano esclusivamente il nome e l'UID, tutto il resto va lasciato inalterato.<br />
<br />
Se si vuole una directory pubblica per condividerne il contenuto, è consigliato creare un ulteriore utente "ftp":<br />
<pre><br />
# ftpasswd --passwd --home /home/ftp-share --name ftp --shell /bin/false --uid 2000 --file /etc/proftpd/ftpd.passwd<br />
</pre><br />
<br />
L'utente "ftp" appena creato ha il solo scopo di assumere la proprietà della directory pubblica e, avendo UID pari a 2000, non ha niente a che vedere con l'utente "ftp" di sistema con UID uguale a 119 e utilizzato da ProFTPD per l'accesso anonimo.<br/><br />
La vita dell'"ftp" creato è limitata al solo file <code>ftpd.passwd</code> da cui ProFTPD ricava le informazioni d'accesso.<br />
<br />
=== Creare un gruppo virtuale ===<br />
La creazione di un gruppo virtuale non è indispensabile ma risulta comoda per amministrare più agevolmente la configurazione di ProFTPD.<br/><br />
Nel successivo esempio verranno creati due gruppi virtuali:<br />
;ftp-users:Raggrupperà '''tutti''' coloro che avranno accesso al server FTP.<br />
;ftp-full:Raggruppa gli utenti con accesso FTP, con la possibilità di avere una propria directory sul server e di avere accesso completo alla directory pubblica.<br />
<br />
Nello specifico:<br />
* Tutti apparterranno a "ftp-users".<br />
* pippo, pluto e minnie apparterranno anche a "ftp-full".<br />
* L'utente "ftp" (se creato) non apparterrà ad alcun gruppo.<br />
<br />
Creiamo i gruppi virtuali:<br />
<pre><br />
# ftpasswd --group --file /etc/proftpd/ftpd.group --name ftp-users -m pippo -m pluto -m minnie --gid 3000<br />
# ftpasswd --group --file /etc/proftpd/ftpd.group --name ftp-full -m pippo -m pluto -m minnie --gid 3001<br />
</pre><br />
<br />
Le opzioni utilizzate:<br />
;--group:Necessario affinché ProFTPD crei un gruppo virtuale.<br />
;--file /etc/proftpd/ftpd.group:Il percorso e il nome del file che conterrà le informazioni per ciascun gruppo virtuale.<br />
;--name ''nome'':Il nome del gruppo.<br />
;-m ''nomeutente'':Assegna al gruppo gli utenti specificati. L'opzione "-m" può essere utilizzata più volte.<br />
;--gid ''GID'':Il [[GID]] del gruppo. Valgono le stesse considerazioni scritte per l'UID.<br />
<br />
=== Altre operazioni ===<br />
;Cancellare un utente o un gruppo virtuale:<br />
La rimozione di un utente o un gruppo virtuale può essere effettuata utilizzando l'opzione "--delete-user" o "--delete-group":<br />
<pre><br />
# ftpasswd --group --delete-group --name nomedelgruppo --file /etc/proftpd/ftpd.group<br />
# ftpasswd --passwd --delete-user --name nomeutente --file /etc/proftpd/ftpd.passwd<br />
</pre><br />
<br />
;Aggiungere un utente a un gruppo:<br />
Per aggiungere un utente a un gruppo '''già esistente''' bisogna modificare il file ''ftpd.group''. I diversi utenti appartenenti al gruppo sono separati da una virgola.<br/><br />
Aggiungiamo, ad esempio, ''paperino'' al gruppo ''ftp-users'':<br />
ftp-users:x:3000:pippo,pluto,minnie''',paperino'''<br />
<br />
;Bloccare un utente:<br />
Nel caso si voglia bloccare temporaneamente l'accesso al server FTP di un particolare utente:<br />
<pre><br />
# ftpasswd --passwd -l --name nomeutente --file /etc/proftpd/ftpd.passwd<br />
</pre><br />
Per sbloccarlo:<br />
<pre><br />
# ftpasswd --passwd -u --name nomeutente --file /etc/proftpd/ftpd.passwd<br />
</pre><br />
<br />
=== ''ftpd.passw'' e ''ftpd.group'' ===<br />
Questi due file appena creati possono essere visualizzati come un normale file di testo per controllare che tutto sia andato come ci si aspetta:<br />
<pre><br />
# cat /etc/proftpd/ftpd.group<br />
# cat /etc/proftpd/ftpd.passwd<br />
</pre><br />
È consigliabile, inoltre, nascondere il loro contenuto a tutti fuorché a ''root'':<br />
<pre><br />
# chmod 660 /etc/proftpd/ftpd.group /etc/proftpd/ftpd.passwd<br />
</pre><br />
<br />
== Creare le directory ==<br />
Il passo successivo consiste nel creare le directory personali di ciascun utente in quanto la directory home è stata creata da [[root]] e non ha permessi di scrittura per utenti diversi. Infatti:<br />
<pre><br />
$ ls -l /home<br />
...<br />
...<br />
drwxr-xr-x 4 root root 4096 dic 30 22:01 ftp-share<br />
</pre><br />
<br />
=== Directory private ===<br />
Per ciascun utente appartenente al gruppo ''ftp-full'' eseguire i comandi:<br />
<pre><br />
# mkdir /home/ftp-share/nomeutente<br />
# chown UID:GID /home/ftp-share/nomeutente<br />
# chmod 770 /home/ftp-share/nomeutente<br />
</pre><br />
Ad esempio, per ''pippo'':<br />
<pre><br />
# mkdir /home/ftp-share/pippo<br />
# chown 2001:2001 /home/ftp-share/pippo<br />
# chmod 770 /home/ftp-share/pippo<br />
</pre><br />
e per ''pluto'':<br />
<pre><br />
# mkdir /home/ftp-share/pluto<br />
# chown 2002:2002 /home/ftp-share/pluto<br />
# chmod 770 /home/ftp-share/pluto<br />
</pre><br />
Praticamente le uniche modifiche riguardano il nome della directory e l'UID.<br/><br />
Il risultato sarà creare directory accessibili solo dal proprietario. Tutti gli altri (ovviamente escluso "root") non potranno accedervi.<br />
<br />
=== Directory pubblica ===<br />
Avere tutte directory private può già essere considerata una situazione ragionevole in molti contesti ma, più in generale, è auspicabile che esista una directory pubblica per condividere dati tra diversi utenti.<br/><br />
Creeremo, quindi, una directory in cui tutti potranno inviare o prelevare dati attraverso FTP: la chiameremo <code>Pubblica</code> e si troverà all'interno di <code>/home/ftp-share/</code>.<br />
<pre><br />
# mkdir /home/ftp-share/Pubblica<br />
# chown 2000:3000 /home/ftp-share/Pubblica<br />
# chmod 770 /home/ftp-share/Pubblica<br />
</pre><br />
Notare che i proprietari (utente:gruppo) della directory sono "ftp:ftp-users" specificati mediante i rispettivi UID/GID (2000:3000).<br />
<br />
== Configurazione ==<br />
Una volta creati gli utenti e i gruppi virtuali, è necessario modificare la configurazione di ProFTPD per consentirgli l'accesso al server FTP.<br/><br />
La configurazione avverrà lasciando praticamente inalterato il file <code>/etc/proftpd/proftpd.conf</code> (il file di configurazione principale) e creando file di configurazione separati all'interno della directory <code>/etc/proftpd/conf.d/</code>: questo permetterà di mantenere ordinata la configurazione e renderla più leggibile in futuro.<br />
<br />
=== Autenticazione ===<br />
Il primo file da creare conterrà le direttive per permettere l'autenticazione mediante utenti/gruppi virtuali. Creiamo il file <code>/etc/proftpd/conf.d/00Autenticazione.conf</code> e inseriamo al suo interno:<br />
<pre><br />
# Autenticazione permessa solo per utenti/gruppi virtuali<br />
AuthOrder mod_auth_file.c<br />
<br />
# Percorso dei file che contengono utenti/gruppi virtuali<br />
AuthGroupFile /etc/proftpd/ftpd.group<br />
AuthUserFile /etc/proftpd/ftpd.passwd<br />
</pre><br />
La spiegazione è abbastanza semplice:<br />
;AuthOrder mod_auth_file.c: Carica il modulo "mod_auth_file.c" in modo da permettere l'autenticazione '''solo''' per utenti virtuali.<br />
;AuthGroupFile /etc/proftpd/ftpd.group: Percorso e nome del file contenente i gruppi virtuali.<br />
;AuthUserFile /etc/proftpd/ftpd.passwd: Percorso e nome del file contenente gli utenti virtuali.<br />
<br />
=== Login ===<br />
Il secondo file conterrà le direttive per consentire (o negare) il login al server FTP. Creiamo il file <code>01Login.conf</code> contenente:<br />
<pre><br />
# Login solo dalla subnet 192.168.<br />
<Limit LOGIN><br />
Order allow,deny<br />
Allow 192.168.0.0/16<br />
DenyAll<br />
</Limit><br />
<br />
# Login solo per gli utenti appartenenti al gruppo ftp-users<br />
<Limit LOGIN><br />
Order allow,deny<br />
AllowGroup ftp-users<br />
DenyAll<br />
</Limit><br />
</pre><br />
La prima direttiva permette l'accesso solo agli indirizzi IP "192.168.x.x" mentre la seconda permette il login solo al gruppo ''ftp-users''. Un client che non soddisfa entrambe le condizioni non ha accesso al server FTP.<br/><br />
Chiaramente adattate questa configurazione al vostro caso.<br />
<br />
=== Direttive ===<br />
Tutte le altre direttive saranno raccolte nel file <code>02Direttive.conf</code> contenente;<br />
<pre><br />
RequireValidShell off<br />
<br />
DefaultRoot ~ ftp-full<br />
<br />
PathDenyFilter \.[^/]*$<br />
PathAllowFilter [[:print:]]<br />
<br />
AllowFilter "^[a-zA-Z0-9 ,]*$"<br />
</pre><br />
;RequireValidShell:Necessaria per consentire il login senza possedere una [[shell]] valida (è stata impostata a "/bin/false").<br />
;DefaultRoot ~ ftp-full:La home directory di chi appartiene al gruppo ''ftp-full''; di default abbiamo scelto all'inizio che sia <code>/home/ftp-share</code> (home directory durante la creazione dell'utente).<br />
;PathDenyFilter \.[^/]*$: Impedisce l'invio di file che iniziano con un punto.<br />
;PathAllowFilter <nowiki>[[:print:]]</nowiki>: Permette solo di specificare caratteri stampabili per file/directory.<br />
;AllowFilter "^[a-zA-Z0-9 ,]*$": Consente comandi FTP che contengono esclusivamente caratteri alfanumerici, lo spazio o la virgola.<br />
== Test di funzionamento ==<br />
Riavviare il server FTP:<br />
<pre><br />
# service proftpd restart<br />
</pre><br />
e connettersi con il proprio client FTP preferito specificando l'indirizzo IP del server, il proprio username e la password.<br />
<br />
== Utenti ad accesso limitato ==<br />
In alcuni casi potrebbe risultare utile fornire, solo a determinati utenti, l'accesso alla directory pubblica esclusivamente per prelevare dati.<br/><br />
Per raggiungere questo obiettivo sarà necessario innanzitutto creare un utente (il povero ''paperino'') ad accesso limitato e confinarlo nella directory pubblica <code>/home/ftp-share/Pubblica/</code>:<br />
<pre><br />
# ftpasswd --passwd --home /home/ftp-share/Pubblica/ --name paperino --shell /bin/false --uid 4000 --file /etc/proftpd/ftpd.passwd<br />
</pre><br />
Creare un gruppo virtuale per raggruppare questo tipo di utenti. Chiamiamolo ''ftp-downonly'' e aggiungiamoci ''paperino'':<br />
<pre><br />
# ftpasswd --group --name ftp-downonly --file /etc/proftpd/ftpd.group -m paperino --gid 4000<br />
</pre><br />
Bisognerà aggiungere ''paperino'' anche al gruppo ''ftp-users'' (come spiegato [[#Altre operazioni|nel paragrafo precedente (Aggiungere un utente a un gruppo)]]) per permettergli un accesso FTP al server.<br />
<br />
Successivamente è necessario modificare il file ''02Direttive.conf'' aggiungendo la riga:<br />
<pre><br />
DefaultRoot ~ ftp-downonly<br />
</pre><br />
Si nota ancora come la directory FTP in cui sono confinati gli utenti del gruppo ''ftp-downonly'' è la home specificata durante la creazione dell'utente (nel nostro caso è ''/home/ftp-share/Pubblica/'' .<br />
<br />
Ultimo passo è la creazione del file ''/etc/proftpd/conf.d/03Directory.conf'' in cui inseriremo:<br />
<pre><br />
<Directory /home/ftp-share/Pubblica><br />
<Limit WRITE><br />
DenyGroup ftp-downonly<br />
</Limit><br />
</Directory><br />
</pre><br />
con cui si impedisce a tutti coloro che fanno parte del gruppo ''ftp-downonly'' di scrivere nella directory o di modificare/eliminare file.<br />
<br />
Riavviare infine il server FTP:<br />
<pre><br />
# service proftpd restart<br />
</pre><br />
<br />
== Quote ==<br />
L'attivazione delle quote potrebbe rivelarsi indispensabile per limitare lo spazio utilizzabile da ciascun utente per conservare i propri file sul server; infatti di default, non c'è nessun limite ai byte o ai file che è possibile inviare al server FTP.<br/><br />
Nel caso in cui l'amministratore del server abbia già implementato le quote sul filesystem (quindi *non* le quote di ProFTPD), questa configurazione andrebbe bypassata oppure, per non incorrere in problemi, si dovrebbe evitare la creazione di utenti virtuali con lo stesso UID.<br />
<br />
Leggere anche la guida [[Installare un server FTP con ProFTPD]] per maggiori informazioni sulla gestione delle quote e le pagine di documentazione lì riportate.<br />
<br />
=== Le tabelle ===<br />
Prima di tutto è indispensabile creare le due tabelle necessarie a ProFTPD:<br />
<pre><br />
# ftpquota --create-table --table-path /etc/proftpd/ftpquota.limittab --type=limit<br />
# ftpquota --create-table --table-path /etc/proftpd/ftpquota.tallytab --type=tally<br />
</pre><br />
<br />
Quindi è il momento di decidere che tipo di quote assegnare e a quali utenti. In questo caso si assegnerà ad ogni utente un limite di 60 MB per i byte inviati (upload):<br />
<pre><br />
# ftpquota --add-record --type limit --limit-type hard --quota-type user --name pippo --bytes-upload 60 --units Mb --table-path /etc/proftpd/ftpquota.limittab<br />
# ftpquota --add-record --type limit --limit-type hard --quota-type user --name pluto --bytes-upload 60 --units Mb --table-path /etc/proftpd/ftpquota.limittab<br />
# ftpquota --add-record --type limit --limit-type hard --quota-type user --name minnie --bytes-upload 60 --units Mb --table-path /etc/proftpd/ftpquota.limittab<br />
</pre><br />
Si possono vedere gli effetti del comando precedente con:<br />
<pre><br />
# ftpquota --show-records --type limit --units Mb --table-path /etc/proftpd/ftpquota.limittab<br />
</pre><br />
che visualizzerà:<br />
<pre><br />
-------------------------------------------<br />
Name: pippo<br />
Quota Type: User<br />
Per Session: False<br />
Limit Type: Hard<br />
Uploaded Mb: 60.00<br />
Downloaded Mb: unlimited<br />
Transferred Mb: unlimited<br />
Uploaded files: unlimited<br />
Downloaded files: unlimited<br />
Transferred files: unlimited<br />
-------------------------------------------<br />
Name: pluto<br />
Quota Type: User<br />
Per Session: False<br />
Limit Type: Hard<br />
Uploaded Mb: 60.00<br />
Downloaded Mb: unlimited<br />
Transferred Mb: unlimited<br />
Uploaded files: unlimited<br />
Downloaded files: unlimited<br />
Transferred files: unlimited<br />
-------------------------------------------<br />
Name: minnie<br />
Quota Type: User<br />
Per Session: False<br />
Limit Type: Hard<br />
Uploaded Mb: 60.00<br />
Downloaded Mb: unlimited<br />
Transferred Mb: unlimited<br />
Uploaded files: unlimited<br />
Downloaded files: unlimited<br />
Transferred files: unlimited<br />
<br />
</pre><br />
<br />
Il contenuto di <code>ftpquota.tallytab</code> può essere mostrato in modo simile:<br />
<pre><br />
# ftpquota --show-records --type tally --units Mb --table-path /etc/proftpd/ftpquota.tallytab<br />
ftpquota: (empty table)<br />
</pre><br />
<br />
=== Direttive ===<br />
Assicurasi che nel file <code>proftpd.conf</code> ci siano:<br />
<pre><br />
<IfModule mod_quotatab.c><br />
QuotaEngine on<br />
</IfModule><br />
</pre><br />
e poi creare il file <code>/etc/proftpd/conf.d/04Quota.conf</code> con:<br />
<pre><br />
QuotaLimitTable file:/etc/proftpd/ftpquota.limittab<br />
QuotaTallyTable file:/etc/proftpd/ftpquota.tallytab<br />
<br />
QuotaDisplayUnits Mb<br />
</pre><br />
Riavviare ProFTPD:<br />
<pre><br />
# service proftpd restart<br />
</pre><br />
<br />
=== Test ===<br />
Da un client proviamo a inviare qualche file al server FTP utilizzando, ad esempio, l'utente ''pippo'' e poi controlliamo la tabella "ftpquota.tallytab":<br />
<pre><br />
# ftpquota --show-records --type tally --units Mb --table-path /etc/proftpd/ftpquota.tallytab<br />
-------------------------------------------<br />
Name: pippo<br />
Quota Type: User<br />
Uploaded Mb: 1.61<br />
Downloaded Mb: unlimited<br />
Transferred Mb: unlimited<br />
Uploaded files: 0<br />
Downloaded files: 0<br />
Transferred files: 0<br />
</pre><br />
Il comando mostra i byte inviati da ciascun utente (in questo caso solo ''pippo'' ha, per ora, inviato dati).<br />
<br />
È utile sapere che anche il client può conoscere i byte inviati eseguendo il comando "site quota":<br />
<pre><br />
ftp>site quota<br />
200-La quota corrente per questa sessione è [corrente/limite]<br />
200-Nome: pippo<br />
200-Tipo Quota: Utente<br />
200-Tipo Limite: Hard<br />
200- Inviato Mb: 1.61/60.00<br />
200- Scaricato Mb: illimitato<br />
200- Trasferito Mb: illimitato<br />
200- Inviato file: illimitato<br />
200- Scaricato file: illimitato<br />
200- Trasferito file: illimitato<br />
</pre><br />
Proviamo anche a cancellare qualche file e rieseguiamo il controllo della quota disponibile per assicurarci che lo spazio utilizzato venga decrementato correttamente:<br />
<br />
ftp>delete filevecchio<br />
250 comando DELE eseguito con successo<br />
ftp>site quota<br />
200-La quota corrente per questa sessione è [corrente/limite]<br />
200-Nome: pippo<br />
200-Tipo Quota: Utente<br />
200-Tipo Limite: Hard<br />
200- Inviato Mb: <span style="color:red">'''1.03'''</span>/60.00<br />
200- Scaricato Mb: illimitato<br />
200- Trasferito Mb: illimitato<br />
200- Inviato file: illimitato<br />
200- Scaricato file: illimitato<br />
200- Trasferito file: illimitato<br />
<br />
=== Rimuovere le quote ===<br />
* Cancellare le tabelle <code>ftpquota.limittab</code> e <code>ftpquota.tallytab</code><br />
* Cancellare il file <code>04Quota.conf</code><br />
* Disabilitare la gestione delle quote con "QuotaEngine off" in <code>proftpd.conf</code><br />
<br />
== Eliminare la configurazione ==<br />
Per eliminare la configurazione ottenuta leggendo questa guida e ritornare ad un server ProFTPD con configurazione iniziale, si può procedere facilmente sfruttando il fatto che le modifiche hanno toccato poco o nulla il file principale ''proftpd.conf'':<br />
* Cancellare i file creati in ''/etc/proftpd/conf.d/''<br />
* Cancellare il file ''/etc/proftpd/ftpd.group''<br />
* Cancellare il file ''/etc/proftpd/ftpd.passwd''<br />
* Rimuovere le modifiche eventualemten eseguite in ''/etc/proftpd/proftpd.conf''<br />
* Riavviare ProFTPD:<pre># service proftpd restart</pre><br />
<br />
== Guide correlate ==<br />
[[Installare un server FTP con ProFTPD]]<br/><br />
[[Installare un server FTP con utenti virtuali su MySQL]]<br />
<br />
{{Autori<br />
| Autore=[[Utente:S3v|S3v]] 14:03, 31 dic 2014 (CET)<br />
}}<br />
<br />
[[Categoria:FTP server]]</div>S3vhttps://guide.debianizzati.org/index.php?title=Discussioni_Guide@Debianizzati.Org:Passaggio_alla_stable_-_pagine_da_aggiornare&diff=44198Discussioni Guide@Debianizzati.Org:Passaggio alla stable - pagine da aggiornare2021-02-28T21:44:30Z<p>S3v: Testo barrato per template da cancellare</p>
<hr />
<div>Riordinata la lista, modificati i codename di oldstable e stable per riguardare la versione attuale (2015: Jessie; nel 2017 o quando sarà, si avrà Stretch), aggiunta la creazione del codename per la nuova testing (2015: Stretch; 2017: Buster).<br />
<br />
Ora però non sono più tanto sicuro che sia più chiaro di prima. :|<br />
<br />
[[Utente:HAL 9000|HAL 9000]] 12:34, 27 apr 2015 (CEST)<br />
<br />
:: Infatti l'ho letta tre volte ma non l'ho capita :D [[Utente:S3v|S3v]] 18:36, 28 apr 2015 (CEST)<br />
<br />
::: Risistemo. :) [[Utente:HAL 9000|HAL 9000]] 19:03, 28 apr 2015 (CEST)<br />
<br />
== Fine supporto Squeeze-LTS, inizio Wheezy-LTS ==<br />
<br />
(Avevo scritto in un'altra discussione, ma riporto anche qui)<br />
<br />
Nel 2016 ci sarà la fine del supporto a Squeeze-LTS, e la fine del supporto a Wheezy via repository di sicurezza con conseguente inizio del supporto a Wheezy-LTS. (La pagina [[LTS]] è già stata creata, con redirect alla sezione dei repository speciali su Squeeze-LTS.)<br />
<br />
Le guide marcate nel 2016 con una X sono quelle da cambiare nel corso del 2016.<br />
<br />
Penso sia più comodo avere tutto in un'unica tabella, considerando che le guide sono un sottoinsieme delle altre, anche se non è del tutto coerente con l'attuale titolo.<br />
<br />
[[Utente:HAL 9000|HAL 9000]] 17:46, 10 mag 2015 (CEST)<br />
<br />
== Facilitazione del processo di revisione ==<br />
<br />
Ho creato quattro nuovi template, da '''non''' utilizzarsi ancora per nessuna guida e che potrebbero servire per facilitare il processo di aggiornamento necessario a ogni nuovo rilascio.<br />
<br />
Il loro uso sarà discusso una volta conclusi gli attuali task di Revisione Wiki sul "Ciclo di vita di una guida".<br />
<br />
Ne riporto comunque una descrizione:<br />
* [[Template:Codename]] -> trasforma una suite (oldoldstable, lts, oldstable, stable, testing) nel corrispondente codename;<br />
* [[Template:APT-mirror]] -> stampa l'URL di un mirror (unico punto di aggiornamento, in caso di cambiamenti);<br />
* <s>[[Template:APT-sources-list]]</s> -> genera un sources.list con le opzioni scelte, scegliendo i codename in base al template Codename, l'unico da tenere aggiornato.<br />
<br />
E un template di supporto:<br />
* [[Template:Versioni compatibili elenco]] -> per rendere il template principale ([[Template:Versioni compatibili]]) facilmente aggiornabile, anche per chi non intende imparare le istruzioni condizionali.<br />
<br />
Con la loro introduzione, le seguenti pagine non dovranno più essere aggiornate:<br />
* [[Oldoldstable]] (quando creata)<br />
* [[Oldstable]]<br />
* [[Stable]]<br />
* [[LTS]] (al momento un redirect, ma è da creare una pagina vera e propria)<br />
* [[Testing]]<br />
* [[Codename]]<br />
* [[Template:Versioni compatibili]]<br />
* [[Collabora al Wiki]]<br />
* [[Stati di una guida]]<br />
* [[I repository ed il loro utilizzo]]<br />
* [[Repository & pinning]]<br />
* [[Repository ufficiali]]<br />
* [[Repository speciali]]<br />
* [[Il repository Backports]]<br />
* [[FAQ]]<br />
<br />
Basterà tenere aggiornate soltanto:<br />
* [[Template:Codename]]<br />
* [[Template:Versioni compatibili elenco]]<br />
* + quelle poche rimaste dalla lista principale<br />
<br />
[[Utente:HAL 9000|HAL 9000]] 12:55, 15 nov 2015 (CET)<br />
<br />
: '''Aggiornamento:''' completato, come da task di [[Revisione Wiki]] #61.<br />
: La parte su [[Template:APT-sources-list]] non è stata usata, per via della sintassi necessaria per le istruzioni MediaWiki, troppo difficile da leggere e da mantenere. Resta da vedere se il template sarà da cancellare o potrà servire per guide aggiuntive di supporto, con tutte le possibili combinazioni di sources.list; devo ancora pensarci. [[Utente:HAL 9000|HAL 9000]] 20:59, 8 apr 2016 (CEST)<br />
<br />
== Descrizione "controllare link download iso" ==<br />
<br />
Propongo di sostituire la descrizione "controllare link download iso" in "verificare la guida", come è stato fatto per quella su Sid, visto che si tratta di guide non coperte da template o categorie e relative al processo di installazione. Mi posso occupare di jigdo, integrità, installare da pendrive e da disco fisso.<br />
<br />
Al momento invece non posso verificare quella su UEFI, se non basandomi sulla sola lettura di documentazione, ma sarebbe meglio se ne occupasse qualcun altro.<br />
<br />
Non sono sicuro di poter aggiornare interamente le FAQ, coprono troppi argomenti differenti. C'è comunque da sostituire il link con protocollo FTP per usare HTTP. Si potrebbe tenerle aggiornata a ogni rilascio in base alle domande più frequenti che si ricevono sul forum.<br />
<br />
Sarei per rimuovere quelle su Transmission e P2P dalla lista, perché sono ben più estese del solo scaricamento delle immagini Debian. Al limite si potrebbe aggiungere da qualche parte nella guida di installazione un riquadro su come installare un programma per scaricare i torrent, e potrebbe essere utile anche un riferimento a Jigdo, che è visualizzabile soltanto dal menù in cima. Riserverei la lista alle sole guide essenziali, quelle che devono essere modificate tempestivamente a ogni rilascio.<br />
<br />
Per Skolelinux non credo basti tenere aggiornate le immagini, c'è anzi il rischio che si crei qualche inconsistenza con il contenuto della guida. Sarei piuttosto per aggiungere un avviso in cima su come reperire delle immagini più aggiornate, dove è già specificato che la guida si riferisce a Wheezy.<br />
<br />
Rimuoverei quella sul HP 635, che per essere aggiornata richiede dell'hardware specifico. Si potrebbe però rinominarla per evitare fraintendimenti con "Testing" nel titolo, visto che è stata aggiornata più di 3 anni fa dal suo autore.<br />
<br />
[[Utente:HAL 9000|HAL 9000]] 17:23, 24 giu 2017 (CEST)<br />
<br />
: Si trovano in lista solo temporaneamente in quanto [http://forum.debianizzati.org/viewtopic.php?f=14&t=53597 era stato annunciato] un restyling del sito per quanto riguardava i link; restyling che non mi pare ci sia stato. Ad ogni modo le sto controllando principalmente per i link alle immagini e, se tutto ok, le cancello da questa lista. [[Utente:S3v|S3v]] 18:30, 24 giu 2017 (CEST)<br />
<br />
:: Ok, mi era sfuggita quella discussione. Da domani mi do da fare anch'io con le guide, ma ho iniziato solo poco fa l'aggiornamento a Stretch. :)<br />
:: Segnalo che potrebbe esserci da ricontrollare ancora una volta la guida sul pinning... o almeno le note di rilascio riportano che APT 1.1 utilizzerà un nuovo meccanismo di risoluzione dei conflitti. Approfondisco dopo l'aggiornamento, per capire che differenze ci siano con la situazione attuale e gli esempi della guida, e poi in caso (ri)apro una discussione anche sul forum.<br />
:: 19:09, 24 giu 2017 (CEST)<br />
<br />
::: Non credo ci siano modifiche per quanto riguarda il pinning, visto che se introduce modifiche sono marginali e non trattate in quella guida in ogni caso. Potrebbe però esserci da ricontrollare il comportamento dei comandi apt/apt-get/aptitude quando viene fornita una target release con l'opzione -t e quando invece con nomepacchetto/target-release, in presenza o meno di una Default-Release in /etc/apt/apt.conf. [[Utente:HAL 9000|HAL 9000]] 14:31, 27 giu 2017 (CEST)<br />
<br />
::::Mi era sfuggita la discussione e ho aggiornato 3 guide (integrità immagini, installazione da USB e installazione da HD) seguendo l'indicazione di controllare solamente i link per le ISO. Ho anche dato una letta alle guide ma ho verificato solo la prima delle tre. Se l'idea è quella di fare anche una revisione delle guide allora le ultime due andrebbero rimesse tra quelle da controllare. Scusate per l'ambiguità, non mi ero accorto della discussione in corso :-) [[Utente:Spoon|Spoon]] 15:52, 30 giu 2017 (CEST)<br />
<br />
::::: Non c'è problema: ed è importante più che altro per i futuri rilasci, in modo che ci si ricordi di controllarle di tanto in tanto. E dovrò comunque ripetere l'installazione su una macchina virtuale che uso per alcuni test, quindi posso anche ricontrollare integrità delle immagini e metodi di installazione. [[Utente:HAL 9000|HAL 9000]] 16:59, 30 giu 2017 (CEST)<br />
<br />
: Rimuovo le voci dalla tabella inserite solo per controllare i link [[Utente:S3v|S3v]] 19:34, 7 ott 2018 (CEST)<br />
<br />
== Codename attuale stable: Stretch ==<br />
<br />
Come deve essere modificata questa voce? [[Utente:S3v|S3v]] 19:55, 5 lug 2019 (CEST)<br />
<br />
: In teoria dovrebbe aggiornarsi da sola e non necessitare di modifiche, almeno fino alla prossima point release (come oldstable). Se Buster viene creata copiando la stessa introduzione e la parte finale per la categoria, anche quella si aggiornerà da sola. [[Utente:HAL 9000|HAL 9000]] 21:14, 5 lug 2019 (CEST)<br />
:: Ok. Quindi questa guida può essere rimossa dalla lista visto che domani non verrà toccata? Sostanzialmente serve solo modificare la pagina del codename di testing e, optionalmente, creare una nuova pagina del codename di testing (ma non è obbligatorio). [[Utente:S3v|S3v]] 23:37, 5 lug 2019 (CEST)<br />
::: Dopo aver modificato il template Codename, e una volta che si saranno propagate le modifiche, la voce diverrà automaticamente "Codename attuale stable: Buster", così come l'altra punterà a Bullseye (da creare). In sostanza sono due placeholder per le pagine dei codename relativi a Debian stable e testing in seguito al nuovo rilascio. [[Utente:HAL 9000|HAL 9000]] 10:52, 6 lug 2019 (CEST)<br />
::: Mi spiego meglio: va '''creata''' la pagina Bullseye (attuale testing, la voce attualmente punta a "Buster" perché il template Codename indica ancora quella come testing), e modificata la pagina Buster (attuale stable, la cui voce attualmente punta a "Stretch").<br/> Forse per maggiore chiarezza si possono rimuovere i codename "Stretch" e "Buster" e lasciare solo i link alle pagine. Qualcosa come: <nowiki>[[{{Codename|Testing}}|Codename attuale testing]]</nowiki> e <nowiki>[[{{Codename|Stable}}|Codename attuale stable]]</nowiki> . [[Utente:HAL 9000|HAL 9000]] 11:13, 6 lug 2019 (CEST)<br />
:::: Quindi, se ho capito bene, le cose giuste da fare si sanno solo dopo aver modificato il template? Ieri ci ho perso 5 minuti a cercare di capire che dovevo fare ;) Togliere i codename automatici risolverebbe com dici, per me ė ok [[Utente:S3v|S3v]] 15:13, 6 lug 2019 (CEST)<br />
::::: Fatto! Spero che adesso sia più chiaro. :) Ho spostato la tua modifica precedente all'altra voce e aggiunto una piccola nota alla voce sul Template:Codename. [[Utente:HAL 9000|HAL 9000]] 16:42, 6 lug 2019 (CEST)</div>S3vhttps://guide.debianizzati.org/index.php?title=HOWTO_Riconfigurare_Cryptsetup_Dopo_Installazione&diff=44176HOWTO Riconfigurare Cryptsetup Dopo Installazione2021-02-06T16:19:57Z<p>S3v: aggiunti template Autore, template Versioni compatibili, categorie e modifiche minori</p>
<hr />
<div>{{Versioni compatibili|Buster}}<br />
== Descrizione ==<br />
Può capitare di aver un ripensamento sulle impostazioni apportate al disco dopo averlo "messo" al sicuro con '''cryptsetup''' durante una normale installazione di Debian o qualsiasi altra distro.<br/> <br />
Si potrebbe cambiare idea e magari rafforzare il cipher...ma una volta installata la distro e costruito il disco con ''cryptsetup'' risulterà impossibile apportare un cambiamento radicale del genere.. eccetto per delle semplici modifiche, come cambiare la passphrase. Quindi in queste situazioni non resta altro che reinstallare il tutto e apportare le giuste modifiche durante l'installazione.<br/> <br />
Ma c'è un modo per ovviare a tutto ciò? La risposta è si ed esistono fondamentalmente due strade:<br />
<br />
* Usare l'utility '''cryptsetup-reencrypt''' ( ''man cryptsetup-reencrypt'' [https://www.systutorials.com/docs/linux/man/8-cryptsetup-reencrypt/] ). Può essere molto utile e veloce in quanto ci permette di fare cambiamenti radicali "al volo". Unica pecca può essere il suo grado di rischio in quanto si andrà a operare direttamente sull'header, quindi a meno che non avete file importanti sul disco in cui la cancellazione involontaria dei dati, (o comunque l'inaccessibilità degli stessi) non vi farà bestemmiare :) , procedete con questa opzione.<br />
<br />
* Fare tutto "a mano". La strada migliore, anche se un po' lunga. (Vedere '''[[#Obiettivo|Obiettivo]]''').<br />
<br />
=== Obiettivo ===<br />
<br />
Il nostro obiettivo sarà quindi:<br />
<br />
* Copiare il sistema su un supporto rimovibile di appoggio<br />
* Formattare la partizione con ''cryptsetup'', stavolta con le impostazioni giuste<br />
* Ricopiare il sistema<br />
<br />
In questo HOWTO spiegheremo quest'ultima opzione.<br />
<br />
== Occorrente ==<br />
<br />
* '''Usb''' o '''HD'''<br />
* '''Sistema Live''' (è preferibile usare una distro uguale a quella che avete installato)<br />
<br />
== Preparativi ==<br />
<br />
Prima di tutto dobbiamo fare un po' di ricerca sul nostro sistema.<br/><br />
Dobbiamo vedere ''l'[[UUID]]'' della partizione grezza, cioè' dove è presente il sistema cifrato, e ''l'UUID'' della partizione decifrata dove risiede il nostro sistema mappato da cryptsetup in ''/dev/mapper/<nome_vostra_partizione>'' (di solito in Debian le partizioni criptate configurate durante l'installazione sono rinominate in '''sd'''''<device><numero_partizione>'''''_crypt''').<br/><br />
Infine dobbiamo procurarci un supporto esterno dove copiare momentaneamente l'intero sistema. Inutile dirlo ma come capacità dovrà essere maggiore o uguale a quest'ultimo.<br />
<br />
'''NOTA: Per vedere la grandezza di tutto il sistema, è sufficiente digitare: <pre> $ du -sh /</pre><br />
'''Non preoccupatevi degli errori che potranno comparire a riguardo delle cartelle ''/proc'' o ''/tmp'' in quanto sono cartelle volatili e riempite dal sistema durante l'avvio e quindi allo spegnimento non vi sarà nulla al loro interno. Non occuperanno nessuno spazio'''<br />
<br />
== All'opera ==<br />
<br />
Spegniamo il PC e avviamo la Live. La live deve essere uguale a quella che abbiamo installato in quanto i pacchetti, patch ecc., possono essere leggermente differenti e quindi potrebbero variare da distro a distro e per evitare complicanze in seguito è buona norma usare una live (importante anche la versione) uguale a quella del vostro sistema.<br />
Una volta avviata è possibile che i pacchetti che ci servono non siano installati. Quindi procediamo con:<br />
<br />
<pre> $ apt-get install cryptsetup -y </pre><br />
<br />
Decifriamo il disco con:<br />
<br />
<pre> $ cryptsetup luksOpen /dev/<vostro_device> sd_crypt </pre><br />
<br />
Infine montiamo il disco in sola '''lettura''' per evitare scritture involontarie:<br />
<br />
<pre> $ mount -o ro /dev/mapper/sd_crypt /mnt </pre><br />
<br />
Colleghiamo adesso il nostro supporto rimovibile e creiamo una cartella per poterlo montare:<br />
<br />
<pre> $ mkdir /root/usb</pre><br />
<br />
E montiamolo con:<br />
<br />
<pre> $ mount /dev/<vostro_supporto_rimovibile> /root/usb</pre><br />
<br />
Non ci resta adesso che copiare tutto il sistema nel supporto, badando a non modificare nulla. La copia sarà fatta con il banalissimo comando '''cp''' ''([[Guida ai comandi da terminale#Gestione di file e directory|Guida ai comandi da terminale: gestione di file e directory]])''. Il problema però nasce dal fatto che durante la copia i file possono assumere informazioni riguardanti l'utente che appunto sta effettuando la copia, e per risolvere a questo inconveniente, durante la copia risulterà utile aggiungere al comando ''cp'' la seguente opzione:<br />
<br />
<pre> $ cp --preserve=all -R /mnt/* /root/usb/</pre><br />
<br />
Questa opzione indica che durante la copia non dovranno essere modificati data e ora di accesso, gruppo e utente proprietario.<br />
<br />
Arrivati a questo punto possiamo riformattare la partizione con qualsiasi strumento che permette la gestione di dischi, come '''gparted''', '''cfdisk''' o '''dd''':<br />
Ma prima smontiamo le unità:<br />
<br />
<pre><br />
$ umount /mnt<br />
$ cryptsetup luksClose sd_crypt<br />
</pre><br />
<br />
Possiamo adesso formattare la partizione:<br />
<br />
<pre> $ dd if=/dev/zero of=/dev/<vostra_partizione> bs=10M count=1</pre><br />
<br />
Nell'esempio seguente si rimuove solo l'header LUKS cancellando di fatto solo i primi 10MB della partizione.<br/><br />
Ma possiamo anche riformattare direttamente la partizione con ''cryptsetup''. Ricordiamoci inoltre durante la formattazione di impostare '''l'UUID''' precedentemente visto, cioè della partizione grezza dove andrà il sistema che sarà poi cifrato. Ecco un esempio:<br />
<br />
<pre><br />
$ cryptsetup --hash=sha512 --key-size=512 --iter-time=10000 --use-random --uuid=<UUID_partizione_grezza> luksFormat /dev/<vostra_partizione><br />
</pre><br />
<br />
Alla domanda digitiamo '''YES''' tutto in maiuscolo e procediamo.<br />
<br />
Bisogna infine ricreare il filesystem per la nuova partizione per ospitare i dati.<br/><br />
In questo caso il filesystem dovrà essere uguale a quello del sistema. Nella maggior parte dei casi, il filesystem '''ext4''' è il più utilizzato.<br />
<br />
Quindi:<br />
<br />
<pre> $ mkfs.ext4 /dev/mapper/sd_crypt</pre><br />
<br />
Adesso non ci resta che decifrare la nuova partizione, montarla e ricopiare di nuovo il sistema al suo interno:<br />
<br />
<pre><br />
$ cryptsetup luksOpen /dev/<nuova_partizione_creata> sd_crypt<br />
$ mount /dev/mapper/sd_crypt /mnt<br />
$ cp --preserve=all -R /root/usb/* /mnt/<br />
</pre><br />
<br />
== Conclusioni ==<br />
<br />
Porre molta attenzione ai vari ''UUID'' visti sul sistema (vedere la sezione [[#Preparativi|'''Preparativi''']]).<br/><br />
Se si sbaglia uno dei due ''UUID'' il sistema non partirà e quindi si dovrà necessariamente ripetere tutte le fasi partendo dall'inizio.<br/><br />
Ma se si è sbagliati solo ''l'UUID'' della partizione decifrata ( quella del sistema che partirà effettivamente presente in ''/dev/mapper/'' ) non c'è bisogno di ripetere tutto; basta accedere da una live e cambiare ''l'UUID'' con:<br />
<br />
<pre> $ tune2fs /dev/mapper/<mapper_sistema> -U <UUID></pre><br />
<br />
Ovviamente questo andrà fatto una volta aperto (decifrato) e mappato il disco con ''cryptsetup''.<br />
<br />
Se tutto è filato liscio si è riusciti riconfigurare l'header di LUKS senza reinstallare l'intero sistema.<br />
<br />
{{Autori<br />
|Autore= [[Utente:VincenzoGianfelice|VincenzoGianfelice]] 23:48, 25 lug 2017 (CEST)<br />
|Verificata_da=<br />
|Estesa_da=<br />
|Numero_revisori=0<br />
}}<br />
[[Categoria:Filesystem]]<br />
[[Categoria:Crittografia]]</div>S3v