Passa ai contenuti principali

Trasformare uno smartphone in un server con servizi su rete pubblica

Trasformare uno smartphone in un server con servizi su rete pubblica



Spesso si accumulano vecchi smartphone, danneggiati o non più utilizzati, in un cassetto. Con Termux, una shell Linux su Android, è possibile dare a questi dispositivi una nuova vita. Non trascurabile la possibilità di approfittando della sensoristica come gps, telecamere, microfono che tutti questi dispositivi hanno oltre ad una cerca potenza di calcolo, spesso non trascurabile, superiore a SBC (Single Board Computer) blasonati. Inoltre la batteria, della quale sono dotati, consente allo smartphone, se collegato ad un alimentatore, di avere un UPS.

L'obiettivo è avere un host con un servizio pubblico installato e la possibilità di riattivare tutto dopo un eventuale riavvio, schedulare dei processi ed essere raggiungibile su rete pubblica.

Con Termux si ha accesso, sotto vediamo come, a tutte le cartelle dello smartphone, anche se protette da password applicative.

Step 1 - Trasformare uno smartphone Android in un server Linux

Installare Termux

https://f-droid.org/repo/com.termux_1022.apk

Dare tutte le autorizzazioni di accesso all'app Termux



Step 2 - Installare SSHD

$ pkg update && pkg upgrade
$ pkg install openssh

Per conoscere l'ip del proprio dispositivo e potersi collegare in ssh da un PC per operare in maniera più comoda:
$ ip addr show
Per fare in modo che il servizio sshd parta ad ogni boot, nella dir /data/data/com.termux/files/home/.termux/boot creare i file script di avvio dei servizi, per sshd:
$ nano start-sshd
Che deve contenere:

#!/data/data/com.termux/files/usr/bin/sh

termux-wake-lock

sshd


Bisogna concedere a tale file i permessi di esecuzione:
$ chmod +x start-sshd
Per conoscere il proprio username (da annotare) digitare:
$ whoami
A questo punto conviene impostare una password per l'utente che Termux ha creato:
$ passwd
Per esporre la shell, se lo smartphone è collegato ad una wi-fi, bisognerà impostare una regola di port-forwarding sul router in modo che esponga la porta 8022, che è dove gira ssh di default su termux.

Step 3 - Installare server Web 

Installare Nginx per fare da server web:
$ pkg update && pkg upgrade
$ pkg install nginx
Per fare in modo che il servizio nginx parta ad ogni boot, nella dir /data/data/com.termux/files/home/.termux/boot creare i file script di avvio per nginx:
$ nano start-nginx
Che deve contenere:

#!/data/data/com.termux/files/usr/bin/sh

termux-wake-lock

nginx

Per modificare la pagina index:
$ nano $PREFIX/share/nginx/html/index.html
Ora conoscendo l'ip del proprio smartphone sulla propria rete locale basterà puntarlo con un browser e con il protocollo http sulla porta 8080:



Per esporre la pagina bisognerà impostare una regola di port-forwarding sul router, se lo smartphone è collegato ad una wi-fi, in modo che esponga la porta 8080.

Step 4 - Fare in modo che il servizio sia raggiungibile su rete pubblica

Per ottenere che i servizi che installo siano raggiungibili su rete pubblica ho creato un sotto dominio su duckdns.org. 
Ho creato prima una directory per i log nella home:
$ mkdir log/duckdns/
Poi nel solito percorso di boot ho creato uno script per aggiornare l'ip dinamico, c:

/data/data/com.termux/files/home/.termux/boot/start-dnsupdate

Che deve contenere solo:

#!/data/data/com.termux/files/usr/bin/sh

echo url="https://www.duckdns.org/update?domains=[DOMINIO].duckdns.org&token=[TOKEN DI ACCESSO]&ip=" | curl -k -o ~/log/duckdns/duck.log -K -

Step 5 - Per poter schedulare dei processi

Ho installato cron per schedulare i processi e l'ho lanciato:
$ pkg update && pkg upgrade -y
$ pkg install cronie
$ crond

Ed ho aggiunto il solito script al .boot per far partire il processo automaticamente:

$ nano start-crond
Che deve contenere:

#!/data/data/com.termux/files/usr/bin/sh

termux-wake-lock

crond

Ho impostato un processo cron che ogni giorno alle 2.30 esegue lo script di aggiornamento del DNS:
$ crontab -e
Inserendo la stringa:

30 2 * * * /data/data/com.termux/files/home/.termux/boot/start-dnsupdate >/data/data/com.termux/files/home/log/logdailycron.log 2>&1

Step 6 - Accedere al dispositivo

Termux per accedere al dispositivo ospite (telecamere, vibrazione, torcia, posizione ecc.) ha bisogno delle sue API.
Per installare termux-api usare il link seguente ed installarlo come app Android (non con pkg install):
https://f-droid.org/repo/com.termux.api_1002.apk
Dopo l'installazione riavviare il dispositivo per fare in modo che l'applicazione faccia partire il servizio necessario.

Esempi d'uso:


$ termux-battery-status
{
  "present": true,
  "technology": "Li-poly",
  "health": "GOOD",
  "plugged": "PLUGGED_AC",
  "status": "NOT_CHARGING",
  "temperature": 27.0,
  "voltage": 4068,
  "current": -123000,
  "percentage": 87,
  "level": 87,
  "scale": 100,
  "charge_counter": 469000
}


Tutte le API possibili li trovi qui.

Step 7 - Programmiamo con Python

Per l'applicazione web che voglio creare esiste uno script python che usa le termux-api chiamandole da shell, questo lo rende molto controllabile e quindi installo le librerie per python:
$ apt install python make wget termux-exec clang libjpeg-turbo freetype ffmpeg -y
$ env INCLUDE="$PREFIX/include" LDFLAGS=" -lm" pip install Pillow
$ pkg install python-numpy

Dopo ho provato a lanciare lo script e funziona perfettamente.

Commenti

Post popolari in questo blog

Telecamere Ip con accesso "nascosto"

Telecamere Ip con accesso "nascosto" Storia triste di un auto-hacking obbligato che mi ha fatto scoprire come la nostra privacy è realmente messa a rischi. Storia Ho acquistato dal mercatino/fiera del Radioamatore di Fasano quattro telecamere IP. La scatola riporta "Smart Camera" LF4810. Ne ho montata una e testata in tutte le sue funzionalità per oltre un mese. Chiaramente la manualistica scarsissima, come da tradizione in questi prodotti cinesi di costo molto concorrenziale, consiste in un "pieghevole" di 4 facciate. Chiaramente non erano documentate le impostazioni necessarie per attivare i protocolli ONVIF e RTSP che mi sono indispensabili per l'uso che ne devo fare. Nonostante questa scarsa documentazione dopo l'installazione base fatta con l'apposita app: tutto sembrava corretto. Chiaramente la prima azione che ho compiuto è stata quella di cambiare la password che di default è "123". Subito dopo h...

Dynamic DNS con Duckdns.org in HTTPS

Obiettivo Avere un dominio https con certificato valido da usare come endpoint pubblico per Homeassistant e per un WebHook per i bot telegram. Fase 1 Registrazione del dominio in un servizio di dynamic DNS come https://www.duckdns.org/   : Scegliere per quale sistema operativo installare il client che si occuperà dell'aggiornamento dell'ip: Seguire la semplice guida per la configurazione del processo cron: Fase 2 Creazione del certificato e installazione sul server. Di tutto questo si occuperà una applicazione che si chiama certbot. $ sudo add-apt-repository ppa:certbot/certbot $ sudo apt install python-certbot-apache $ sudo certbot --apache -d ol3.duckdns.org -d www.ol3.duckdns.org Fase 3 Esporre il servizio https sulla rete pubblica. Aprire o reindirizzare la porta 443 verso l'host sul quale si è fatta la configurazione di certbot dal proprio router. Il certificato di certbot è valido per novanta giorn...

JHipster - Uso base

Cosa è JHipster è un "generatore di applicazioni" che fornisce tutto lo stack necessario ad implementare una applicazione web e/o a microservizi basata su Spring Boot e AngularJs. E' dotato di un marketplace di componenti già pronte: https://www.jhipster.tech/#modules E' dotato di uno strumento web per la modellazione dello schema E-R: https://start.jhipster.tech/jdl-studio/ Prerequisiti - Java 8  - Node.js (usare la versione LTS 64-bit) - NPM viene installato con Node.js ma va aggiornato      $ npm install -g npm - Per usare il JHipster Marketplace, installare Yeoman:       $ npm install -g yo Uso base Gli step, presi dal sito ufficiale sono questi: 1. Installare JHipster:       $ npm install -g generator-jhipster Nota: per installare una versione specifica del generator:   $ npm install -g generator-jhipster@6.0.5 2. Crea una nuova directory ed entra dentro questa:   $ mkdir ...