mercoledì 4 marzo 2020

Qualche dritta per Sailfish OS



Antico proverbio: un apparecchio non è veramente tuo se non ci puoi entrare come root e piallare tutto.


Prima opportunità: "accedere via ssh senza password".

È sufficiente andare nella directory $HOME/.ssh "lato chiamante" e copiare il contenuto del file id_rsa.pub (la "chiave pubblica RSA") in coda al file $HOME/.ssh/authorized_keys del "destinatario" (creandolo se non era presente). Laddove la directory $HOME/.ssh non fosse già presente su un sistema, la si genera col comando ssh-keygen e dando password vuote.
Ufficialmente, fra sistemisti, ci si dice che "non è una buona pratica". Infatti se qualcuno ti ruba un aggeggio, e quell'aggeggio poteva entrare via ssh senza password in altri tuoi aggeggi, sei fregato.
Ufficiosamente lo fanno un po' tutti perché è troppo comodo non dover dare la password ogni volta.

Nota: il file authorized_keys deve essere leggibile solo dal suo utente (basterà fare chmod 600 $HOME/.ssh/authorized_keys dopo averlo creato).

Le chiamate ssh si possono fare anche in direzione opposta (dal cellulare verso il PC). Attenzione ad assicurarsi che il firewall lato PC consenta le chiamate ssh in ingresso. Per chi usa ufw sotto Ubuntu basterà il comando: ufw allow from sailfishx to ubuntupc port ssh (sostituire a sailfishx e ubuntupc con gli hostname o indirizzi IP).

Ovviamente sul telefonino sotto Impostazioni/USB ho scelto "Default USB mode = Developer mode".

Nota: sto assumendo che sia il PC che il telefonino abbiano sulla wifi indirizzi IP fissi (per esempio 192.168.1.50 e 192.168.1.70). Se preferite il DNS (cioè un indirizzo bizzarro ad ogni riaccensione/riconnessione), la faccenda diventa troppo complicata da spiegarla qui in poche righe. Per fortuna lato USB il telefonino ha un suo default impostabile (generalmente 192.168.2.15).

Chi vuole cambiare il MAC address prefissato (Medium Access Control address di 48 bit, unico per ogni scheda di rete) lato SailfishOS potrà modificare il file /etc/modprobe.d/g_ether.conf e aggiungere la riga:
options g_ether mac_addr=50:56:a8:33:33:33
Se dopo il reboot del cellulare il trucco non funziona (come nel caso dell'Xperia XA2), allora bisogna usare le maniere forti: nel PC Ubuntu creare il file etc/udev/rules.d/55-xperia-xa2.rules contenente una sola riga:
SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="0fce", ATTRS{idProduct}=="0a02", NAME="ethxa2"
In tal modo, quando il cavo USB-C dell'XA2 viene connesso al PC, l'interfaccia si chiamerà "ethxa2" indipendentemente dal suo MAC address.

Una volta connesso il cavo, per sfruttare l'XA2 come "modem" (cioè instradare il traffico sulla rete dati cellulare) occorre disattivargli la wifi e dargli da root questi tre comandi (validi fino al prossimo reboot), così da poterlo usare come default routing:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables --table nat --flush
iptables --table nat -A POSTROUTING -o rmnet_data0 -j MASQUERADE


Comodissimo rsync

Il comando rsync "sincronizza" files e directories (cioè "copia" solo ciò che ha cambiato timestamp o dimensione). Esempio: si può creare uno script da far eseguire ogni giorno, che trasferisce al PC le foto scattate col cellulare con una sola passata di rsync:
rsync -ave ssh --remove-source-files nemo@sailfishx:Pictures/Camera/*.jpg ~/Pictures/

Le opzioni -ave ssh significano "archivio, verbose, usando come connessione ssh". L'opzione --remove-source-files significa "dopo aver copiato, cancella gli originali". Risultato: quel comando sposta tutte le foto dal cellulare alla cartella ~/Pictures di Ubuntu (tanto è lì che ci faccio il photo editing).

Altro esempio: trasferire musica (una cartella contenente dei files *.MP3 e una cover.jpg più o meno quadrata per la copertina del disco) dal PC Ubuntu al Sailfish:
rsync -ave ssh ~/Music/Schubert/Incompiuta nemo@xperia:Music/

Attenzione agli "slash" finali: nell'esempio "Incompiuta" indica un'intera directory coi suoi contenuti e sotto-contenuti (dunque non richiede lo slash); "Music/" con lo slash finale significa che il trasferimento va fatto "nella" cartella Music anziché "rimpiazzando" la cartella Music.

Esercizio per il lettore: andare a spazzolarsi le immagini, i file audio (opus, m4a, mp3, ecc.) e video dalla directory del cellulare /home/nemo/android_storage/WhatsApp/Media e dare un urlo adeguato quando scoprite che uno squinterno di megabyte è stato consumato dai meme e dai Buongiornissimo).


Ficcare il naso nel filesystem SailfishX

Da terminale Ubuntu dare questo comando:
alias tabs='ssh nemo@sailfishx sqlite3 /home/nemo/.local/share/org.sailfishos/sailfish-browser/sailfish-browser.sqlite '\''"select url from link where link_id in (select tab_history_id from tab)"'\'' '
Cioè: quando da Ubuntu comandate tabs viene eseguito (via ssh) sul cellulare il comando sqlite3 che interroga il database del browser Sailfish elencando gli url aperti. Comodissimo per chi naviga col cellulare e dopo qualche giorno si gratta in testa domandandosi: ma come si chiamava quel sito che avevo visto dal cellulare?

Importante: se sul cellulare non c'è un eseguibile sqlite3 (come nella mia versione SailfishX 3.2; forse era presente solo sui vecchi aggiornamenti), è possibile emularlo con cinque righe di script Python:
import sqlite3,sys
x = sqlite3.connect(sys.argv[1])
for r in x.execute(" ".join(sys.argv[2:])):
    print("\t".join(map(str,r)))
x.commit()


Per chi ha fatto il pairing col Bluetooth

Da command-line Ubuntu c'è quel comodissimo bluetooth-sendto che prende come argomento un nome file e si lancia da command-line e apre la finestrella grafica dei trasferimenti Bluetooth. I trasferimenti verso SailfishX finiscono nella categoria Transfers ma è comodo per mandare un file JPEG direttamente nella cartella Pictures del cellulare.



Per chi ha un file vCard 3.0 da importare

L'esportazione della rubrica è in formato vCard (l'apps ufficiale usa il formato vCard 3.0 ma è in grado di leggere anche le versioni precedenti). Quando si effettua il backup da SailfishX, viene creato un file .tar che contiene anche una directory People/data sotto cui si trova il file di testo all.vcf in formato vCard 3.0 che si può importare su un altro telefonino.

Nel mio caso alcuni contatti non erano stati importati perché li avevo ricevuti originariamente via bluetooth, e quindi l'utility vcardconverter (di serie nel SailfishX 3.2) dava un errore "Error: contacts from multiple sync targets specified in single batch save!"

In tal caso è bastato ripulire l'header incriminato dal file .vcf dei contatti da importare, e rieseguire vcardconverter manualmente, cioè fare così:
grep -v X-NEMOMOBILE-SYNCTARGET all.vcf > buono.vcf && vcardconverter buono.vcf

Dopo l'importazione, i file *.vcf non sono più necessari.



La directory $HOME/bin

Sotto SailfishX la PATH di default per le sessioni interattive (ssh nemo@sailfishx senza ulteriori comandi) già prevede /home/nemo/bin ma tale directory non viene creata in fase di installazione. Perciò: accedere via ssh, crearla, e metterci i propri script e programmini.

Per esempio ho scritto un programmino command-line per far vibrare il cellulare. Se lo perdo in camera, prontamente vi accedo con ssh e lo faccio vibrare (e puntualmente lo ritrovo nei posti più impensati). Anzi, lato Ubuntu ho fatto addirittura un alias da mettere nel $HOME/.bash_aliases del PC:
alias vib='ssh nemo@xperia bin/vib 1000'
(qui ho dovuto specificare "bin/" perché solo aprendo una sessione "interattiva" la si ha nella path di default).

Nota: SailfishX non prevede un $HOME/.bash_aliases personalizzato, ma è possibile dirglielo nel .bashrc o mettere gli alias in quello di sistema /etc/bashrc.

Se proprio volete modificare il .bashrc aggiungeteci anche il prompt:

PS1='>$LINENO \t \[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '



Installazione di Ruby

Purtroppo nei repository di SailfishX 3.2 è disponibile solo il vecchio Ruby 1.9.3 (sia pure con tutte le patch di sicurezza dal 2011 al 2014), ma pazienza:
devel-su pkcon install ruby


Ambiences

Un ambience è un insieme di impostazioni video/audio/vibrazione. Me ne sono creato uno con un JPEG 1920x1080 completamente nero (da usare a luce spenta di notte). I miei quattro ambience preferiti sono:
  1. uno "notturno", sfondo nero, niente suonerie, niente allarmi, niente vibrazione;
  2. uno "giornaliero", niente suonerie/allarmi, solo la vibrazione: se non sento nemmeno questa, significa che il chiamante non meritava la mia immediata attenzione;
  3. uno "caciarone", suonerie, allarmi vibrazioni, tutto attivo, per quelle situazioni in cui bisogna essere facilmente distraibili perché qualcuno ti sta ammosciando i cosiddetti;
  4. uno "particolarmente caciarone": come sopra ma coi volumi al massimo, come se lì davanti avessero appena cominciato a sparare i botti di capodanno.

Purtroppo SailfishX permette l'impostazione selettiva della vibrazione solo globalmente, per cui occorre associarla al livello audio. Dunque ho impostato:
  • menu "Suoni e feedback": vibrazione impostata a "solo con suoni attivi", volume suoneria a zero, tutto il resto disabilitato;
  • ambience "notturno": volume suoneria azzerato, e tutte le actions possibili (suoneria, messaggi, chat, email, calendario, orologio) impostate a "nessun suono";
  • ambience "giornaliero": volume suoneria al 20%, e tutte le actions impostate a "nessun suono". Dunque non suonerà, ma dato che vibrazione "solo con suoni attivi" e il volume è al 20%, allora vibrerà;
  • ambience "caciarone": volume al 40% e tutte le actions con le musichette Jolla;
  • ambiente "particolarmente caciarone": volume al 100% e tutte le actions con le musichette Jolla.
È importante impostare ogni volta tutte le actions perché altrimenti manterrebbe qualcosa dell'ambience precedente. E uno quando schiaccia la pennichella pomeridiana non vuole essere interrotto neppure dall'arrivo del Grande Mazinga.

Nelle impostazioni del Top Menu ci stanno bene anche Ambiences, Orientazione, Torcia/Flashlight, WLAN, Cellulare, Internet/Hotspot/Sharing, FlightMode, Bluetooth, GPS/Location (da "accendere" solo per navigare con Here Maps), Brightness, Connessione Internet, Cerca sul web, Selfie, Note, Batteria, Contatore Dati, Sailfish Updates (che quando sta per uscire una nuova release, uno clicca furiosamente 15 volte al giorno).



Per lo stato della batteria...

Il comando è lo stesso ma tra i due Xperia è cambiato il path. Entrare in ssh sul cellulare ed eseguire:

Xperia XA2:
grep -E "(CITY=|_NOW=|TEMP)" /sys/devices/soc/*spmi/spmi*/spmi*/*spmi*/power_supply/bms/uevent

Xperia X:
grep -E "(CITY=|_NOW=|TEMP)" /sys/devices/soc.*/*smbcharger/power_supply/battery/uevent
Purtroppo i BMS (Battery Management System) degli Xperia non aggiornano il "cycle count", che indicherebbe bene quanto è invecchiata la batteria (e dunque grosso modo quanto le resta da vivere). Sospetto che sia così in quasi tutti i cellulari con batteria non sostituibile dall'utente...


1 commento:

  1. Grazie per i vari consigli!
    Per Ruby 2.6.2 ti segnalo il repo di nielnielsen:
    http://repo.merproject.org/obs/home:/nielnielsen/sailfish_latest_armv7hl/armv7hl/
    sempre in questo repo io ho installato mc (utile per quando mi connetto in ssh)
    :D

    RispondiElimina