2016-05-17 5 views
3

Also versuche ich einen Java SFTP Server zu erstellen, der als Frontend für Apache S3 Buckets fungiert. Sie verbinden sich über SFTP und verwalten S3-Dateien in Buckets wie Dateien auf dem SFTP-Server.Warum funktioniert s3fs nicht wie ein normales Dateisystem mit Apache MINA SSHD?

Ich habe Apache MINA (v1.2.0) als SFTP-Server verwendet, der funktioniert mit einem SftpSubsystemFactory und Standard FileSystemFactory (Bereitstellung des lokalen Dateisystems).
Ich habe Amazon-S3-FileSystem-NIO2 (v1.3.0) als FileSystem, gewählt, der die Apache AWS SDK verwendet und scheint sich die beste Option, da zu sein

public class S3FileSystemFactory implements FileSystemFactory { 
    private URI uri = URI.create("localhost"); 

    public S3FileSystemFactory(URI uri){ 
     this.uri = uri; 
    } 

    public FileSystem createFileSystem(Session session) throws IOException { 
     ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
     FileSystem s3FileSystem = FileSystems.newFileSystem(uri, new HashMap<String, Object>(), classLoader); 
     return s3FileSystem; 
    } 
} 

Ich gründe gerade dies als FileSystemFactory für MINA

SshServer sshd = SshServer.setUpDefaultServer(); 
sshd.setKeyPairProvider(buildHostKeyProviderFromFile(hostKeyType)); 
sshd.setPasswordAuthenticator(createPasswordAuthenticator()); 
sshd.setPublickeyAuthenticator(AcceptAllPublickeyAuthenticator.INSTANCE); 
sshd.setSubsystemFactories(createSubsystemFactories()); 
sshd.setFileSystemFactory(createFileSystemFactory()); 

URI uri = URI.create("s3:///s3.amazonaws.com/my_bucket"); 
FileSystemFactory s3FileSystemFactory = new S3FileSystemFactory(uri); 
sshd.setFileSystemFactory(s3FileSystemFactory); 

Ich kann mit diesem Server mit FileZilla/Command Line verbinden, aber es verbindet sich automatisch mit dem ImageTransfer Bucket (nicht my_bucket). Ich kann zu anderen Buckets navigieren, sogar zu Unter-Buckets, aber ich kann den Inhalt nicht anzeigen, alles sieht nur wie ein leeres Verzeichnis aus.

Dies kann über die FileSystemI'm using erfolgen, wie ich Verzeichnisinhalte, wie so auflisten

Path p = s3FileSystem.getPath("/my_bucket"); 
    String contents = ""; 
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(p, "*")) { 
     for (Path file : stream) { 
      contents += "\n \t - " + file.getFileName(); 
     } 
    } catch (IOException | DirectoryIteratorException x) {} 

Ich habe durch die s3fs, MINA und AWS-Code suchen (wie die Dokumentation ist sehr begrenzt), aber kann die Quelle dieses Problems nicht genau bestimmen. Kann jemand Licht auf das werfen, was ich falsch mache?

Logging

Mit Protokollierung für alle Bibliotheken eingeschaltet, bekomme ich nur eine Frage, die ich

"HEAD 
application/x-www-form-urlencoded; charset=utf-8 
Fri, 20 May 2016 09:58:07 GMT 
/MYURL/." 
2016-05-20 10:58:07.240 DEBUG 13323 --- [system-thread-1] c.a.http.impl.client.SdkHttpClient  : Stale connection check 
2016-05-20 10:58:07.243 DEBUG 13323 --- [system-thread-1] c.a.http.impl.client.SdkHttpClient  : Attempt 1 to execute request 
2016-05-20 10:58:07.434 DEBUG 13323 --- [system-thread-1] c.a.http.impl.client.SdkHttpClient  : Connection can be kept alive indefinitely 
2016-05-20 10:58:07.435 DEBUG 13323 --- [system-thread-1] com.amazonaws.request     : Received error response: com.amazonaws.services.s3.model.AmazonS3Exception: Not Found (Service: null; Status Code: 404; Error Code: 404 Not Found; Request ID: MYREQID), S3 Extended Request ID: MYEXTREQID 

Antwort

1

Das Problem sehen kann, ist zweifach.

Zum einen Apache MINA SSHD requires das permission Attribut für jede FileSystem vorhanden sein verwendet es, die seltsam ist, als dass ein so spezifisches Attribut POSIX ist offensichtlich Amazon-S3-FileSystem-NIO2 hat es nicht gegeben.

Zweitens Apache MINA SSHD nennt (und erfordert) eine nicht implementierte Methode in S3FileSystemProvider, die bekommen eine FileChannel

public FileChannel newFileChannel(Path path, 
            Set<? extends OpenOption> options, 
            FileAttribute<?>... attrs) 

ist eine hacky Lösung ist einfach zu hart Code POSIX-Lese-/Schreibberechtigungen in S3-Attribute zurückgegeben und erstellen a S3FileChannel, die einfach die Methoden auf dem vorhandenen S3SeekableByteChannel aufruft.
Das ist die beste Lösung, die ich für jetzt treffen kann.

0

Wir verzweigten die Amazon-S3-FileSystem-NIO2 und implementiert fehlende Dinge, so dass das S3-Dateisystem mit Apache Mina SFTP funktioniert.

Sie können das Repo here finden und lokal mit Maven bauen.

Wie wir es in MINA verwenden ist wie folgt:

public FileSystemFactory createFileSystemFactory(String bucketName) throws IOException, URISyntaxException { 
    FileSystem fileSystem = FileSystems.newFileSystem(new URI("s3:///"), env, Thread.currentThread().getContextClassLoader()); 
    String bucketPath = fileSystem.getPath("/" + bucketName); 

    return new VirtualFileSystemFactory(bucketPath); 
} 
Verwandte Themen