Menu Close

Il mio cloud con AjaXplorer, SFTP e IIS

Una combinazione davvero strana quella che ho creato stavolta!

Volevo essere indipendente dai vari Dropbox, Google Drive, Skydrive e simili.. vuoi per le politiche di privacy un po contestabili, vuoi per i dati a volte passati in chiaro durante il trasferimento, vuoi che preferivo avere “tutto in casa”.

Il mio obbiettivo principale era avere la possibilità di sincronizzare foto, documenti e backup del mio smartphone android con il mio server, senza essere vincolato a passare per servizi esterni, ed avere un’interfaccia web che mi permettesse di gestire tutti i miei file in modo comodo e funzionale.

 

Primo della ricerca è stato OwnCloud, piattaforma opensource, stilisticamente molto bella, che permette di sincronizzare anche contatti e calendario.

Purtroppo però le funzionalità erano molto instabili, vuoi per IIS, vuoi per altri motivi per cui non mi sono messo a perdere troppo tempo.

Inoltre dopo il caricamento di qualche centinaia di mega di dati, l’interfaccia è crashata su sè stessa.. meglio puntare ad altro!

Sicuramente da tenere d’occhio in futuro come evolverà.

 

 

Seconda scelta, una grande sorpresa, è stato AjaXplorer!

Si tratta di un’interfaccia web davvero incredibile, permette di caricare file di qualsiasi dimensione, condividerli, creare, aprire e modificare documenti direttamente dall’interfaccia senza doverli scaricare, riprodurre musica, foto e tanto altro!

Ha perfino il tipico menu “tasto destro” che permette di operare sui file come se fossi sul pc! 🙂

anche questo mi ha dato non pochi problemi, ma promette davvero bene.

 

Chi si vuole cimentare in questa impresa, consiglio vivamente di attivare SSL, in quanto altrimenti tutti i dati sia di login che dei file che si trasmettono vengono passati in chiaro.. meglio evitare!

Entrambi integrano un server webdav, che permette di sincronizzare i dati dall’esterno, purtroppo non sono riuscito a far funzionare nessuno dei due, *probabilmente* proprio a causa dell’SSL.

Ho cercato quindi una soluzione alternativa.

Pensando al miglior protocollo, sicuro e veloce e gestibile da dispositivi mobile mi è subito venuto in mente SFTP!

Volendo, IIS integra di suo FTPS, che non è da confondere con l’SFTP!

FTPS si tratta di una comunicazione FTP tramite SSL, mentre SFTP è una comunicazione FTP passando per un tunnel SSH.

Le due tecnologie si equivalgono piu o meno, ma ho preferito puntare ad SFTP che è piu diffuso (ed è quindi piu semplice trovare client che lo supportino).

Per windows, è un disastro, si dovrebbe installare openssh con cygwin.. queste cose non mi sono mai piaciute.

Ho puntato quindi ad un server sftp davvero leggero per windows, si tratta di FreeFTPd!

 

E’ un semplice server ftp e sftp per windows, configurabile in pochi minuti e molto robusto! E’ pure gratuito quindi non si può volere di meglio.

Mi è bastato creare gli stessi utenti impostati su AjaXplorer e far puntare i percorsi delle directory di ognuno alle cartelle di AjaXplorer.. un gioco da ragazzi 🙂

 

A questo punto, mi sono trovato davanti ad un piccolo problema, AjaXplorer non supporta un limite massimo di spazio per utente, il che è una grande limitazione se si vuole gestire piu utenti senza rischiare che tutto crashi!

 

Stando su Windows Server 2008, ho trovato però un modo molto comodo!

Seguendo questa guida http://www.windowsnetworking.com/articles_tutorials/Configuring-Volume-Folder-Quotas.html

è possibile impostare per ogni singola cartella un limite di spazio massimo, con addirittura dei warning via mail.. perfetto direi 🙂

 

Ultima cosa da sistemare, è come far capire ad AjaXplorer che lo spazio è finito, in quanto di suo si comporta in modo un po stupido, riempiendo lo spazio con tutto quello che può , e tagliando il file se non ci sta……..

Inoltre, una volta che lo spazio è totalmente pieno, da un’eccezione php a video.. direi che non è il caso 🙂

 

Armato di pazienza, ho trovato il punto incriminato, si trova nel file pluginsaccess.fsclass.fsAccessDriver.php esattamente alla riga 553:

 

$result = @move_uploaded_file($boxData["tmp_name"], "$destination/".$userfile_name);
    if(!$result){
          $realPath = call_user_func(array($this->wrapperClassName, "getRealFSReference"),"$destination/".$userfile_name);
          $result = move_uploaded_file($boxData["tmp_name"], $realPath);
       }
    if (!$result){
       $errorCode=411;
       $errorMessage="$mess[33] ".$userfile_name;
       AJXP_Logger::debug($errorMessage);
       break;
      } 
Questo pezzo di codice usa la funzione php move_uploaded_file per spostare il file dalla directory temporanea alla cartella dell’utente, non verificando ne se è disponibile spazio ne se il file copiato fosse della stessa dimensione.
Ho quindi modificato questa parte come segue:

 

$tempSize = filesize($boxData["tmp_name"]) ;
   $result = @move_uploaded_file($boxData["tmp_name"], "$destination/".$userfile_name);
   if(!$result){
        $realPath = call_user_func(array($this->wrapperClassName, "getRealFSReference"),"$destination/".$userfile_name);
        $result = @move_uploaded_file($boxData["tmp_name"], $realPath);
   }
   if (!$result){
        $errorCode=411;
        $errorMessage = "Hai superato lo spazio disponibile!";
        AJXP_Logger::debug($errorMessage);
        break;
   }
   else
   { 
      if (filesize("$destination/".$userfile_name) != $tempSize ){
        $errorCode=000;
        $errorMessage = "Hai superato lo spazio disponibile!";
        AJXP_Logger::debug($errorMessage);
        unlink("$destination/".$userfile_name);
        break;
      }
   }

dell’utente In questo modo, se la funzione php non riesce a copiare correttamente il file, viene data una segnalazione, e se l’ha copiato ma il file non è della stessa dimensione, da errore e cancella il file corrotto.

Per evitare che la funzione php dia errore è inoltre necessario anteporre alla chiama della funzione la @.

 

Per chi poi vuole evitare che generando un link pubblico per condividere un file si venga portati ad una pagina contenente un dischetto invece che al diretto download, basta modificare il file  pluginsaction.shareclass.ShareCenter.php  alla riga 408:

function buildPublicletLink($hash){
   return $this->buildPublicDlURL()."/".$hash.".php?lang=".ConfService::getLanguage();
}
sostituendo il return con:
 return $this->buildPublicDlURL()."/".$hash.".php?dl=true";

Ecco fatto, ho messo insieme un bel sistema cloud, con protezione SSL lato web, e SFTP per la sincronizzazione!

Posso inoltre creare quanti utenti voglio e assegnargli ad ognuno lo spazio desiderato.

 

AjaXplorer ha inoltre la sua app android, ma è a pagamento.

Ho preferito quindi utilizzare uno dei tanti client SFTP, nel mio caso FolderSync, che mi permette di tenere sincronizzato, foto documenti e tutto quello che voglio direttamente con il mio cloud.

 

Concludo consigliando chi vuole crearsi il proprio cloud da zero di evitare IIS.. io lo ritengo molto buon e robusto, ma su molte cose è abbastanza schizzinoso, e il 90% dei framework che si trovano sul web sono sviluppati su apache.

E’ quindi meglio avere come server appunto quest’ultimo, per evitarsi molti problemi inutili.

 

Ciao e buon Cloud a tutti! 🙂

 

Posted in Domotica e Cloud, News, Web Development

Leave a Reply

Your email address will not be published. Required fields are marked *