Valutazione attuale: 1 / 5

Stella attivaStella inattivaStella inattivaStella inattivaStella inattiva
 

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

 

Vai all'inizio della pagina