chiedo per un amico .... anzi un amico chiede!
scenario , piccolo ufficetto con un paio di multifunzioni , una serie di cartelle condivise tra qualche computer , qualche computer adibito a compiti specifici ...
la necessita di condividere in modo stabile dei documenti tra i vari pc , tutti windows based , e le cartelle condivise che ogni tanto spariscono da sole , nessuno ufficialmente rimuove la mappatura , ma non sono piu' li ...
i file che ogni tanto vengono cancellati accidentalmente ...
con l' occasione, sapevo che l' amico avrebbe apprezzato molto la possibilita di condividere dei documenti anche quando fuori ufficio, tra lui e i suoi collaboratori
personalmente sono un fan dell' hosting in house, e ho anche la ferma convinzione che meno esponi al pubblico meglio stai, quindi vpn
ho deciso dopo tanto averne sentito parlare di vedere cosa potesse fare nextcloud e wireguard (invece di openvpn)
quindi mi son messo a guardare un po' in giro, qualche video, un po di documentazione (al primo impatto non mi è piaciuta quella di nextcloud) , il tutto da adattare su di un server su cui gira proxmox, quindi dentro dei container (consumano meno risorse, sono stretto di ram)
per la parte di wireguard, vi rimando ad un articolo a parte che la descrive , qui vediamo la parte di nextcloud (https://nextcloud.com/)
l' installazione vera e propria di nextcloud la potete leggere qui, una guida come tante , piu' che altro scriverlo è un esercizio per ricordarmi quel che ho fatto!!
nextcloud tra i pro che mi hanno convinto ha la possibilita di versionare i documenti, ossia , un documento modificato , puo' esser recuperata la vecchia versione , il software in automatico conserva le versioni precedenti (backup) , quindi è possibile accedere alle versioni conservate tramite il tab "versione" della visualizzazione dettagli del file
vengono conservate le versioni in base al tempo, ad esempio per le prime 24 ore vengono conservate una versione ogni ora (se l' abbiamo modificato ogni ora) , passate le 24 ore verra conservata solo una versione al giorno per 30 giorni , dopo 30 giorni una versione per ogni settimana .. cio ci consente di recuperare eventuali vecchie versioni , in ogni caso il peso complessivo delle varie versioni non puo' essere superiore al 50% dello spazio disco
ho ritrovato interessante anche il fatto di poter condividere una cartella con altri, gli altri possono creare dei file dentro questa cartella condivisa ma puo' esser rimosso il permesso di cancellarli
infine , nei vari pc si puo' installare un app per sincronizzare in automatico alcune cartelle , ma rimane comunque la possibilità di acceder via web
nel telefono, è possibile condividere delle foto/filmati/documenti direttamente dalla galleria -> condividi con -> nextcloud -> crea cartella
decido quindi di installarlo !!
se andiamo sul sito di nexcloud, "get nextcloud" ci fa scaricare un archivio zip contenente il programma (c'e' anche una virtual machine gia pronta), l' archivio contiene tutta una serie di file php , si nexcloud è una web app php ...
quindi avremo di bisogno di uno stack lamp!!!
se volete seguire come ho fatto io l' installazione di nextcloud andate a questo link , diversamente continuiamo il discorso con quanto ho aggiunto a corollario della normale installazione !!!
per quel che riguarda lo scambio di documenti e foto tra chi è in ufficio e chi è fuori, basta installare sul telefono le app necessarie , nextcloud app , talk app se vogliamo la chat , la videochiamata (va gestito il nat ..)
la cosa invece si fà piu' interessante per l' integrazione delle stampanti che scannerizzano via ftp , un protocollo evergreen supportato da tanti dispositivi, ad esempio abbiamo le telecamere di sorveglianza che in molti casi permettono di fare upload ftp delle foto che scattano ...
tornando a noi , abbiamo di bisogno che quando viene fatta una scansione, in automatico dopo l' upload sullo spazio ftp nextcloud ce lo faccia vedere tra i nostri file
per far cio ho configurato un server ftp , che scrive nella cartella relativa ad un utente stampante1 , utente che poi condivide in sola lettura i file con piu' di un utente nextcloud in modo da far vedere a chi è necessario i file appena scansionati ma nel contempo impedirgli di cancellare queste scansioni , solo chi è in possesso delle credenziali di stampante1 (o è stato abilitato dall' utente stampante1) potra cancellare i file (alcune stampanti consentono di preimpostare vari account/path ftp e di assegnargli un pulsante , quindi la segretaria farà la scansione col suo pulsante e andra nella cartella condivisa con la segretaria , il magazzino avrà il suo pulsante e le sue scansioni andranno in una cartella condivisa con gli utenti del magazzino e cosi via ....
per far si che cio' funzioni ho di bisogno non solo di creare l' utente stampante1 come utente nextcloud , ma di crearlo anche come utente virtuale ftp che va a scrivere in un path particolare (perchè ho scelto di utilizzare il nome utente ftp nel path della directory ftp dove scrivo)
/var/www/nextcloud/data/stampante1/files/scansioni
dopo che il file viene scritto pero' nextcloud non lo mostra immediatamente , per mostrarlo dobbiamo fargli scansionare la directory alla ricerca di nuovi file , e a meno che non vogliamo farlo ogni 5 minuti con un cron ho pensato di farlo con inotify
inotify è un api wrapper che riconosce degli eventi collegati al filesystem
debian ha il pacchetto inotify-tools che installa
- inotifywait - wait for changes to files using inotify
- inotifywatch - gather filesystem access statistics using inotify
... ma andiamo per passi
installiamo vsftpd e backuppiamo la configurazione originale
apt install vsftpd mv -v /etc/vsftpd.conf /etc/vsftpd.conf.backup
quel che vogliamo realizzare è la creazione di uno o piu' utenti virtuali (non sono utenti di sistema, non hanno una shell, non possono collegarsi in ssh) che possono scrivere solo dentro la loro cartella , e far combaciare la cartella dell' utente virtuale ftp con la cartella dell' utente nextcloud in modo che poi possiamo vedere i file uplodati nell' interfaccia grafica di nextcloud
per far cio' dobbiamo ricreare la nuova configurazione
nano /etc/vsftpd.conf
listen=YES listen_ipv6=NO anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 nopriv_user=www-data chroot_local_user=YES allow_writeable_chroot=yes guest_username=www-data virtual_use_local_privs=YES guest_enable=YES user_sub_token=$USER local_root=/var/www/nextcloud/data/$USER/files/scanner hide_ids=YES xferlog_enable=YES xferlog_std_format=NO log_ftp_protocol=YES
in pratica,
listen=YES | eseguiamo il demone come stan alone |
listen_ipv6=NO | ascoltiamo solo sull ipv4 |
anonymous_enable=NO | non consentiamo il collegamento ad utenti anonimi |
local_enable=YES | gli utenti locali (quelli che hanno un logon e una shell) possono collegarsi al server ftp |
write_enable=YES | consentiamo agli utenti di creare nuovi file |
local_umask=022 | i nuovi file verranno creati con i permessi settati a -rw-r--r-- (1) |
nopriv_user=www-data | i ifle verranno scritti con proprietario www-data (2) |
chroot_local_user=YES | forziamo gli utenti locali a lavorare dentro le loro directory |
allow_writeable_chroot=yes | abilitiamo la scrittura |
guest_username=www-data | facciamo si che tutti gli utenti siano trattati come www-data |
virtual_use_local_privs=YES | diamo agli utenti virtuali gli stessi privilegi degli utenti normali |
guest_enable=YES | tutti gli utenti non anonimi sono trattati come guest |
user_sub_token=$USER | assegnamo alla variabile $USER il nome utente del login |
local_root=/var/www/nextcloud/data/$USER/files/scanner | directory nel quale far andare l' utente |
hide_ids=YES | quando un utente ftp lista una directory non vede i reali proprietari dei file |
xferlog_enable=YES | |
xferlog_std_format=NO | |
log_ftp_protocol=YES |
(1) secondo quanto spiegato qui https://serverfault.com/questions/201305/default-owner-permissions-of-created-files-via-vsftpd e qui https://security.appspot.com/vsftpd/vsftpd_conf.html il calcolo va fatto basandosi sul valore del parametro file_open_mode che di default è 0666 , quindi RW-RW-RW- a questo valore, sottraiamo 0022 , leviamo quindi la possibilita di scrivere per i gruppe altro , diventando 0644 RW-R--R-- (2) bisogna valutare se l' utilizzo dell' utente www-data ha implicazioni di sicurezza peggiori dell' uso di nobody |
se non riuscite a connettervi , verificate con un utente virtuale, ad esempio un messaggio d'errore che avevo era
500 OOPS: cannot change directory:/var/www/nextcloud/data/stampante1/files/scanner
semplicemente perchè mi ero scordato di creare la directory scanner ...
allo stesso modo backuppiamo
mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.backup
dentro la directory /etc/pam.d/ ci sono i file di configurazione dei vari demoni che definiscono come garantire l' accesso ad un utente (verificare username/password == auth) cosa l' utente puo' fare (account) ed altro
ricreiamolo
nano /etc/pam.d/vsftpd
e scriviamo queste due righe
- demandiamo al modulo pam_pwdfile.so che è richiesto , quindi obbligatorio la verifica delle credenziali che sono conservate in un file di testo in /etc/vsftpd.userlist
- demandiamo al modulo richiesto pam_permit.so cosa l' utente puo' fare, questo modulo permette tutto , quindi non limitiamo cosa l' utente puo' fare
auth required pam_pwdfile.so pwdfile /etc/vsftpd.userlist account required pam_permit.so
per gestire le credenziali quindi abbiamo di bisogno
apt install libpam-pwdfile
il file delle password deve essere organizzato secondo lo schema
nometente:passwordutente
va da se che è il caso di criptare le password
per genere le password criptate possiamo usare come troviamo su molte guide htpasswd che però leggendo in giro ha il limite di 8 caratteri per la password (ad una lettura meno superficiale della doc ho scoperto che i vecchi algoritmi avevano questo limite , ma tantè che fidandomi di cosa avevo trovato scritto son saltato a openssl)
openssl permette di scegliere vari algoritmi (in questo caso $5$ ossia sha256, gia l' avevo usata per generare le password da mettere dentro i file shadow dei router (per la maggior parte $1$ ossia MD5)
dopo averlo lanciato con le opzioni di sotto,ci chiederà di inserire una prima volta la password e una seconda volta per verifica, ho usato qui sotto passwordlungaesicura.1
openssl passwd -5 Password: Verifying - Password: $5$.X9nNZHTSBfivhM6$sTSypkVDGLPZX4n2XG69jBHrXecu3U25LdG8GX1oH4D
quindi editiamo il file /etc/vsftpd.userlist , un rigo per ogni utente virtuale che vogliamo creare
stampante1:$5$.X9nNZHTSBfivhM6$sTSypkVDGLPZX4n2XG69jBHrXecu3U25LdG8GX1oH4D
come avevamo detto sopra , l' utente ftp ho deciso che deve coincidere con l' utente nextcloud , possiamo quindi creare l' utente stampante1 su nextcloud , loggarci in modo che il sistema crei la struttura delle directory dell' utente , creare la dir scanner e poi possiamo provare ad entrare da remoto con un client ftp , utilizzando le credenziali
nome utente : stampante1
password: passwordlungaesicura.1
vedremo che il server ftp ci fa entrare , e se facciamo il put di un file che era nella directory da dove abbiamo lanciato la connessione ftp , il file verrà trasferito sul server e sarà presente nella dir
/var/www/nextcloud/data/stampante1/files/scanner/
e il proprietario del file sara www-data , abbiamo quasi finito .... quasi perchè ancora il file non è visibile ....
cercando sulla documentazione vedo che nella dir /var/www/nextcloud/ c'e' un file occ che è un file php e che puo' esser usato per svolgere vari compiti tra i quali la scansione della directory di un utente , ma va eseguito come utente www-data
per fare la scansione il comando completo è :
sudo -u www-data php /var/www/nextcloud/occ files:scan stampante1
dopo aver dato questo comando , se ricarichiamo la pagina dell' utente stampante1 vedremo comparire il file appena caricato ....
bello ma molto scomodo, mica possiamo chiedere agli utenti di entrare nel server e lanciare ogni volta questo comando ... possiamo
- inserire una riga sul cron e ogni tot minuti lanciare il comando, sia che abbiamo caricato qualcosa , sia che non abbiamo caricato niente
- trovare un altra strada ...
ho scelto un' altra strada ... inotify
apt install inotify-tools
installa inotifywait col quale possiamo controllare gli eventi del filesystem, quel che ci interessa a noi è rilevare la fine scrittura del file ossia la sua chiusura , quindi col comando
inotifywait -r -e close_write "/var/www/nextcloud/data/stampante1/files/" Setting up watches. Beware: since -r was given, this may take a while! Watches established. /var/www/nextcloud/data/stampante1/files/scanner/ CLOSE_WRITE,CLOSE file.txt
avremo che il programma esce stampandoci a video quale file è stato aggiunto , e lo abbiamo provato facendo un upload
leghiamo insieme le due cose con un piccolo script bash e lo chiamiamo controlla1.sh
#!/bin/bash while inotifywait -r -e close_write "/var/www/nextcloud/data/stampante1/files/" do sudo -u www-data php /var/www/nextcloud/occ files:scan stampante1 done
a questo punto non ci resta che far avviare lo script bash in automatico all' accensione del server
creiamo il file
nano /etc/init.d/start_inotify.sh
#!/bin/bash /home/davidea/controlla1.sh &
ovviamente rendiamo eseguibile gli script
chmod u+x /etc/init.d/start_inotify.sh chmod u+x /home/davidea/controlla1.sh
quindi editiamo il file cron di root col comando ed inseriamo la riga
crontab -e
@reboot /etc/init.d/start_inotify.sh
se come nel mio caso ho gestito piu' utenti/stampanti, creiamo piu' file controlla*.sh e inseriamo il loro avvio dentro start_inotify.sh
abbiamo quindi realizzato l' automatismo , l' omino va alla stampante , lancia la scansione che fa l' upload ftp , in automatico il server vedendo che è arrivato un nuovo file lancia il comando di aggiornamento e il file della scansione è subito disponibile , la directory della scansione viene condivisa con altri utenti di nextcloud ed è condivisa in sola lettura , abbiamo raggiunto il nostro scopo , nessuno accidentalmente potrà piu' cancellare i file condivisi ...
Sembrava tutto finito ma ....
dopo qualche giorno di utilizzo, salta fuori un requirements che non era stato detto .... ossia che chi fa l' upload delle foto nelle cartelle condivise , non ridimensiona le foto e le manda alla massima risoluzione, il che vuol dire anche 8 MB per ogni foto , quando basterebbe anche 0,5MB ...
faccio un a ricerca e sembra che non sia previsto ne sul client android ne sul server il ridimensionamento automatico delle foto
sempre da questa ricerca c'e' chi suggerisce di utilizzare un app/plugin per nextcloud che si chiama "Workflow external scripts"
potevo anche seguire come sopra la strada inotify , ma siccome gia vedo il proliferare di directory ad albero tra quel che hanno condiviso in un paio di giorni e tra i limiti di inotify c'e' quello di diventare lento all' aumentare delle directory da tenere sotto controllo (da quel che leggo, non ho esperienza diretta) decido di seguire la strada workflow
installo l' app e dall' utente amministratore, nel percorso "impostazioni -> amministrazione -> flusso" si accede a questa schermata
da cui è possibile aggiungere degli eventi che triggherano uno script , se clicchiamo sul pulsantone blu "run script" possiamo
decidere che quando viene creato un nuovo file, se questo file appartiene ad un utente del gruppo (nella foto) "stampanti" , ed il file è di tipo immagine
allora viene eseguito lo script
allo script eseguito, che deve essere eseguibile per l' utente www-data
/home/davidea/ridimensiona.sh %n %a creato
vengono passati dei parametri
%n , il nome del file creato
%a , il proprietario del file
la stringa "creato" (mi serviva per degub)
questo script dentro contiene (sulla quarta riga name= va levato lo spazio tra il simbolo del dollaro e la parentesi graffa, joomla non era daccordo con questa riga ..)
#!/bin/bash IFS="/" read -ra ADDR <<< "$1" name="$ {ADDR[-1]}" IFS=" " exec 2> /tmp/nc-flow-trace_$name.log set -x whoami > /home/davidea/testo.txt echo "ciao\n" >> /home/davidea/testo.txt echo "$1 "$1"\n" >> /home/davidea/testo.txt echo "$2 "$2"\n" >> /home/davidea/testo.txt echo "$3 "$3"\n" >> /home/davidea/testo.txt echo "$4 "$4"\n" >> /home/davidea/testo.txt convert /var/www/nextcloud/data/$1 -interlace plane -strip -quality 80 -resize 2048x2048 /var/www/nextcloud/data/$1 php -f /var/www/nextcloud/occ files:scan stampante1
in pratica, siccome passiamo il nome del file completo di path , lo divido per poter estrarre solo l' ultima parte, nomefile.jpg , vado a creare un file di log dentro la directory tmp
cat /tmp/nc-flow-trace_1606422431995.jpg.log
+ whoami + echo 'ciao\n' + echo '/stampante1/files/1606422431995.jpg /stampante1/files/1606422431995.jpg\n' + echo 'stampante1 stampante1\n' + echo 'creato creato\n' + echo ' \n' + convert /var/www/nextcloud/data//stampante1/files/1606422431995.jpg -interlace plane -strip -quality 80 -resize 2048x2048 /var/www/nextcloud/data//stampante1/files/1606422431995.jpg + php -f /var/www/nextcloud/occ files:scan stampante1 te1
e creo anche un altro file di log nella home testo.txt
www-data ciao\n /stampante1/files/1606422431995.jpg /stampante1/files/1606422431995.jpg\n stampante1 stampante1\n creato creato\n \n
dopodiche , ridimensiono l' immagine utilizzando l' utility convert, dopo averla installata
apt install imagemagick
quindi ricapitolando, l' utente mario fa l' upload dal telefonino di una foto diciamo da 8MB di peso, dopo che viene fatto l' upload, siccome la foto è stata messa in una cartella condivisa dell' utente "stampante1" , ed è di tipo immagine , viene trigherato lo script ridimensiona.sh a cui viene passato il nomefile con tutto il path e il nome utente proprietario del file, quindi stampante1
tutto bello , peccato che non funziona .....
ma il nostro lavoro è quello di rfiare cose fatte gia da altri, e chi meglio di google puo' sapere cosa gli altri hanno fatto ?? quindi ricerchina, lettura, ore e ore , finche non mi imbatto in un utente che dice di avere problemi anche dopo aver dato il comando
sudo -u www-data php -f /var/www/nextcloud/cron.php
ossia aver eseguito un file chiamato cron.php come utente www-data ... mi si accende una lampadina .... provo , ed in effetti dopo aver dato il comando vengono ridimensionate tutte le foto di cui avevo provato a fare l' upload ....
altra lampadina .... avevo gia visto la cosa da qualche parte
altra piccola ricerchina , ed esce fuori che quel file deve essere eseguito ciclicamente dal cron dell' utente www-data
crontab -u www-data -e
inserendo la riga
*/1 * * * * php -f /var/www/nextcloud/cron.php
qui lo eseguo ogni minuto (mi serviva fare un po' di debug) , ma consigliano ogni 5 minuti, in ogni caso non ho notato appesantimenti del server ...
ok, rifaccio le prove e funziona tutto , l' utente fa l' upload , e dopo il tempo prefissato l' immagine viene ridimensionata, e lo scan della cartella del'l utente stampante1 riallinea il tutto e vedo la nuova dimensione della foto ...
anche questa volta
"MISSION ACCOMPLISHED"
ps. rimane da guardare per mia curiosità la parte relativa a talk, un app che permette di fare chat , condivisione schermo, e videochiamate tra gli utenti di nextcloud .... nahce se ho visto che dal cellulare non va il video, dovrebbe essere un problema relativo al nat ... ma non ho avuto tempo