FaciLinux

Guide Facili per Linux

Gestire i dotfiles

- Posted in tools by

Molti programmi su GNU/Linux usano memorizzare la loro configurazione nella $HOME usando uno o più dotfile (cioè file che iniziano con un punto, come ad esempio .bash_aliases o .vimrc) oppure salvandoli nella directory .config o directory ad hoc (come ad esempio Atom nella directory .atom, KDE nella directory .kde).

Spesso viene dedicato molto tempo alla configurazione e alla personalizzazione dei propri dotfile.\ Pertanto, quando si passa a una nuova macchina o si reinstalla il nostro sistema operativo, è molto importante poter ripristinare facilmente e velocemente tutti quei file di configurazione.

Soluzioni utilizzando il versioning di git

Directory $HOME come repository git

La prima soluzione è rendere l'intera directory $HOME un repository git. Questa può sembrare una soluzione semplice e buona, anche se dobbiamo stare attenti ai sub-repository e, soprattutto, non sarà semplice ripristinare il repository su una nuova macchina (poiché la cartella $HOME esiste già).

Repository separato e link simbolici

Per superare gli inconvenienti dati dal rendere la cartella $HOME un repository git, si può mettere il repository git con i dotfile altrove (ad esempio in $HOME/ dotfiles) e quindi ricollegare i file di configurazione all'interno della cartella $HOME attraverso link simbolici.

L'unico aspetto negativo è che su una nuova macchina dobbiamo collegare manualmente tutto al posto giusto e potrebbe essere un po' noioso.

Per questo motivo, quando si utilizza questo metodo, è una buona idea automatizzare la gestione dei link simbilici, ad esempio utilizzando GNU Stow.

Bare git repository

Un bare git repository consente di mantenere le directory working tree e .git in posizioni differenti.

Questo è molto simile al primo metodo, tranne per il fatto che la cartella .git non si trova direttamente nella cartella $HOME ma risiede, ad esempio, in ~/.config/dotfiles.\ Questo comporta che

  • evitiamo tutti i possibili problemi con i repository nidificati
  • non utilizziamo collegamenti simbolici

Sfortunatamente, come nel primo metodo, non è semplice clonare il repository quando la cartella $HOME esiste già.

vcsh

vcsh (Version Control System for $HOME) permette di avere diversi repository, che mantengono i loro working tree nella directory $HOME senza interferenze reciproche.\ Per impostazione predefinita, tutti i repository git gestiti tramite vcsh memorizzano i file effettivi in $HOME (ma è possibile modificare questa impostazione).

Ciò permette di avere un repository per applicazione o famiglia di applicazioni, ad esempio zsh, vim, ssh, ecc. Ciò, a sua volta, consente di clonare set personalizzati di configurazioni su macchine diverse o anche per utenti diversi e selezionare quali configurazioni si desidera utilizzare dove. Ad esempio, potresti non aver bisogno di avere la tua configurazione di mplayer su un server e potresti voler mantenere una configurazione diversa per ssh sulle tue macchine personali e di lavoro.

In particolare vcsh presenta i seguenti vantaggi:

  • cli più semplice: non è necessario ricordare comandi git complessi o definire alias su una nuova macchina
  • UX migliore: nessun problema nel clonare i dotfile quando la cartella $HOME esiste già o non è vuota
  • supporto perfetto per più repository: non è necessario definire un alias per ciascun repository

vcsh e mr

myrepos è uno strumento per gestire più repository di controllo versione, che funziona molto bene con vcsh.\ myrepos fornisce un comando mr, che è uno strumento unificato per gestire tutti i repository di controllo versione.

Questo metodo è più complesso da configurare rispetto al semplice vcsh (anche se è necessario eseguire questa configurazione una sola volta).

I punti di forza di questo metodo sono:

  • la possibilità di utilizzare script custom che vengono eseguiti al momento del checkout/update
  • la possibilità di fare il checkout dei repository in un percorso diverso dalla $HOME

Firefox e Thunderbird con Wayland

- Posted in linux by

Sia Firefox sia Thunderbird si avviano di default con il collaudato (e per certi versi obsoleto e insicuro) protocollo X11 per la gestione delle finestre.

È però possibile, con versioni recenti dei due prodotti, forzare l'avvio con Wayland, impostando una variabile d'ambiente.

Per firefox il comando da eseguire è:

MOZ_ENABLE_WAYLAND=1 firefox

Per thunderbird, similmente, occorre digitare:

MOZ_ENABLE_WAYLAND=1 thunderbird

È possibile verificare in firefox quale gestore di finestre si sta usando digitando sulla barra degli indirizzi about:support e cercando il valore per la variabile "Protocollo finestra" ("Window protocol" per la versione inglese)

enter image description here

Ultimamente mi è capitato di dover lavorare con file di testo generati da script powershell, in particolare dall'utility Out-File.

Il problema che ho trovato è stato nell'encoding del file generato da Powershell, che nel mio caso era UTF16-Little Endian, un encoding che mal si sposa con le utility di parsing dei file della bash.

Per scoprire con quale encoding ci stiamo confrontando, ci viene in aiuto il comando file; infatti Out-File supporta parecchi encoding in output (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/out-file?view=powershell-6#parameters), quindi nel caso questa guida è da aggiustare con l'encoding che fa al caso vostro.

Il primo passo, come detto, è scoprire con quale encoding si ha a che fare:

[user@pc ~]$ file -i output_powershell.txt 
output_powershell.txt: text/plain; charset=utf-16le

La desiderata è di ottenere un file in UTF8, con i carriage return di linux, ed ecco come fare:

iconv -f UTF-16LE -t UTF8 output_powershell.txt | dos2unix > converted_output.txt

In caso manchi l'utiliy dos2unix è possibile installarla con il proprio gestore di pacchetti; per Arch ad esempio il comando è

sudo pacman -Su dos2unix

Il nostro file convertito è ora un ottimo candidato per passare sotto altri strumenti di parsing.

Buon lavoro!

Gli utenti di Gnome e KDE possono godere di azioni di crittazione/decrittazione di file direttamente dai rispettivi filemanager, cliccando con il tasto destro del mouse sul file interessato.
Thunar, il FileManager di Xfce, non presenta questa funzionalità integrata ma, grazie alle “Azioni personalizzate”, è possibile estenderne il comportamento; vediamo come fare.

Prerequisiti

Innanzitutto è necessario installare i pacchetti necessari; per Debian/Ubuntu il comando da dare è:

user@debby:~$ sudo apt install seahorse seahorse-nautilus seahorse-daemon

Seahorse è un’interfaccia grafica per gestire le chiavi GPG negli ambienti Gnome/Gtk, mentre del pacchetto seahorse-nautilus ci serve il binario seahorse-tool, come vedremo più avanti.

Azione personalizzata “Cifra..”

  • Aprire Thunar e selezionare il menu Modifica > Imposta azioni personalizzate, quindi:
  • Premere sul pulsante +
  • Nel campo Nome inserire “Cifra…”
  • Nel campo Descrizione inserire “cifra con GPG”
  • Nel campo Comando inserire “seahorse-tool -e %F”
  • Selezionare un’icona a proprio piacimento
  • Nel tab “Condizioni di visibilità” selezionare tutte le tipologie di file, escludendo le cartelle e come “Schema del file” mantenere il predefinito “*” Dato che un video vale più di mille parole, ecco qui sotto il riepilogo di quanto fatto: Azione personalizzata "Cifra..."

Azione personalizzata “Decifra..”

  • Aprire Thunar e selezionare il menu Modifica > Imposta azioni personalizzate, quindi:
  • Premere sul pulsante +
  • Nel campo Nome inserire “Decifra…”
  • Nel campo Descrizione inserire “decifra con GPG”
  • Nel campo Comando inserire “seahorse-tool -d %f”
  • Selezionare un’icona a proprio piacimento
  • Nel tab “Condizioni di visibilità” selezionare solo “Altri file” e come “Schema del file” impostare “.gpg;.pgp” Anche in questo caso ecco qui sotto il riepilogo a video di quanto fatto: enter image description here

XBrowserSync è un progetto (e un servizio) opensource che permette di svincolarsi dai sync più o meno proprietari offerti dai maggiori browser e vendor.

La via semplice

Il modo più semplice di usare xBrowserSync è quello di installare l'addon per Firefox o Chrome/Chromium direttamente dai rispettivi market, scegliere uno dei server ufficiali di xbrowsersync e iniziare la sincronizzazione, creando un nuovo syncID.

I dati vengono crittografati all'origine, e trasmessi via https. Altri browser/dispositivi possono venire agganciati utilizzando il syncID e la password associata.

Android?

Il team del progetto ha creato anche un'app per Android, scaricabile sia dal Play Store sia con F-Droid

La via Difficile

Ovvero, creiamo un'istanza privata di xbrowsersync!

Essendo un progetto opensource e free è naturalmente possibile installare un'istanza server privata di XBrowserSync su un proprio server.

Ecco come fare utilizzando un'istanza VPS (di quelle a basso costo offerte da molti gestori cloud).

Per quanto non coperto da questa guida rimando all'ottimo readme presente sul github del progetto a questo indirizzo: https://github.com/nodesource/distributions/blob/master/README.md

Prerequisiti

Per funzionare, XBrowserSync necessita di nodejs e MongoDB.

Per installare mongodb su server Debian/Ubuntu è sufficiente il comando

sudo apt install mongodb

Per NodeJS è invece necessario aggiungere un repository esterno, seguendo la guida presente sul sito del progetto: https://github.com/nodesource/distributions/blob/master/README.md

Installazione del servizio

Il primo passo è clonare il repository GIT di xbrowsersync all'interno del server VPS; consiglio di creare una directory xbrowsersync all'interno di /opt:

sudo mkdir /opt/xbrowsersync

Spostiamoci all'interno della directory appena creata e cloniamo il repository

cd /opt/xbrowsersync
git clone https://github.com/xbrowsersync/api.git

Ora installiamo e compiliamo il pacchetto

npm install --unsafe-perm

Configurazione di MongoDB

Apriamo la shell di mongodb con il comando

mongo

Ora creiamo e configuriamo il database per xbrowsersync (NB. sostituire PASSWORD con una password a propria scelta)

use admin
db.createUser({ user: "xbrowsersyncdb", pwd: "PASSWORD", roles: [ { role: "readWrite", db: "xbrowsersync" }, { role: "readWrite", db: "xbrowsersynctest" } ] })
use xbrowsersync
db.newsynclogs.createIndex( { "expiresAt": 1 }, { expireAfterSeconds: 0 } )
db.newsynclogs.createIndex({ "ipAddress": 1 })

Usciamo dalla mongo shell con il comando

exit

Opzionale: otteniamo un FQDN per il nostro server VPS

È possibile puntare il servizio di XBrowserSync usando direttamente l'indirizzo IP del server VPS, ma avreste particolari rogne volendo sfruttare l'HTTPS (raccomandato) e volendo usare in contemporanea anche il client per Android. Infatti, il client per Android non permetterebbe la sincronizzazione (non avendo un FQDN dovreste usare un certificato self-signed, con tutti i problemi di importazione e riconoscimento di tali certificati in Android.

Per fortuna è possibile risolvere alla radice tali problemi, utilizzando servizi gratuiti messi a disposizione online. DuckDNS è un servizio online di DynamicDNS assolutamente gratuito, che permette di registrare domini di terzo livello del tipo dominio.duckdns.org.

Il nostro VPS avrà un IP fisso, quindi possiamo registrare il dominio di terzo livello che vogliamo (in questa guida myxbsync.duckdns.org) e scordarci le problematiche di aggiornamento dell'IP.

Opzionale: otteniamo un certificato valido per il nostro dominio

Dopo aver registrato il nostro nome DNS dobbiamo ottenere un certificato valido.

SSLforFree permette, sempre gratuitamente, di ottenere un certificato (valido 90 giorni e aggiornabile all'infinito). Rimando alle chiare guide del sito per la generazione del certificato; consiglio di registrarsi al sito per gestire i rinnovi con facilità.

Dopo aver ottenuto i certificati, copiamoli sul nostro server VPS e scompattiamo lo zip in una directory, appositamente creata, in /etc/ssl/web.

Configurazione di XBrowserSync

Il servizio si configura in un unico file json, da parire con l'editor preferito e collocato in /opt/xbrowsersync/api/config/settings.default.json I campi da modificare per il database sono:

"name": "xbrowsersync",
"username": "xbrowsersyncdb",
"password": "PASSWORD",

Per il logging valorizzare come segue il capo path per log

"path": "/var/log/xBrowserSync/api.log",

Opzionale: per HTTPS valorizzare come segue i campi sotto server

"https": {
      "certPath": "/etc/ssl/web/certificate.crt",
      "enabled": true,
      "keyPath": "/etc/ssl/web/private.key"
    },

Opzionale: modificare il campo message in status

"message": "Benvenuto nel mio xBorwserSync privato",

Sistemazione permessi e path

Creiamo il path dove verranno salvati i file di log

sudo mkdir /var/log/xBrowserSync

Ora sistemiamo i permessi; faremo girare il servizio con l'utente fittizzio (di sistema) nobody

sudo chown -R nobody:nogroup /var/log/xBrowserSync
sudo chown -R nobody:nogroup /opt/xbrowsersync

Creazione eseguibile di avvio

Creiamo un nuovo file (come root) con il nostro editor preferito in /usr/bin con questo contenuto:

#!/bin/bash

export NODE_EXTRA_CA_CERTS=/etc/ssl/web/ca_bundle.crt
/usr/bin/node /opt/xbrowsersync/api/dist/api.js

NB la riga NODE_EXTRA_CA_CERTS è da mettere solo se si è seguita la guida per l'abilitazione dell'https con i certificaticreati con FreeSSL

Salviamo il file come xbrowsersync e rendiamolo eseguibile

sudo chmod +x /usr/bin/xbroswersync

Creazione e abilitazione del demone systemd

Creiamo un servizio systemd per l'avvio/spegnimento del servizio; creiamo il file /etc/systemd/system/xbrowsersync.service con il nostro editor preferito, con questo contenuto:

[Unit]
Description=XBrowserSync Service

[Service]
ExecStart=/usr/bin/xbrowsersync 
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/opt/xbrowsersync/api

[Install]
WantedBy=multi-user.target

Facciamo rileggere a systemd i file di configurazione con il comando:

sudo systemctl daemon-reload

Ora abilitiamo e facciamo partire il servizio di XBrowserSync:

sudo systemctl enable xbrowsersync
sudo systemctl start xbrowsersync

A questo punto è possibile contattare il proprio servizio privato di sync dall'indirizzo http ( o https) del proprio server VPS sulla porta 8080. Per il nostro esempio, l'indirizzo divenda quindi: https://myxbsync.duckdns.org:8080

Restrizione d'uso

Il servizio, di default, accetta nuovi account di sync da chiunque ne conosca l'indirizzo; se vogliamo mantenere il nostro xbrowsersync ad uso privato, dopo aver aggiunto i synID desiderati, possiamo fermare il servizio e modificare il file json di configurazione, nella sezione status, impostando a false la direttiva allowNewSyncs:

"allowNewSyncs": false,

Quindi riavviare il servizio. A questo punto, gli utenti con un syncID valido potranno continuare a utilizzare il servizio, ma non saranno accettati nuovi utenti.