package peergos.server.fuse; import peergos.shared.*; import peergos.shared.crypto.*; import peergos.server.Start; import peergos.server.tests.UserTests; import peergos.shared.user.UserContext; import peergos.shared.util.Args; import java.lang.reflect.*; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; public class FuseProcess implements Runnable, AutoCloseable { private final PeergosFS peergosFS; private final Path mountPoint; private volatile boolean isFinished; private volatile boolean isClosed; public FuseProcess(PeergosFS peergosFS, Path mountPoint) { this.peergosFS = peergosFS; this.mountPoint = mountPoint; } @Override public void run() { while (! isFinished) { synchronized (this) { try { wait(1000); } catch (InterruptedException ie) {} } } isClosed = true; } public void start() { ensureNotFinished(); boolean blocking = false; boolean debug = false; int transferBufferSize = 5*1024*1024; String[] fuseOpts = new String[]{"-o", "big_writes", "-o", "fsname=Peergos", "-o", "max_read="+transferBufferSize, "-o", "max_write="+transferBufferSize}; peergosFS.mount(mountPoint, blocking, debug, fuseOpts); new Thread(this).start(); } public void close() { if (isFinished) return; isFinished = true; synchronized (this) { notify(); } System.out.println("CLOSE"); while (! isClosed) { try { Thread.sleep(1000); } catch (InterruptedException ie){} System.out.println("CALLING UNMOUNT"); peergosFS.umount(); } System.out.println("DONE"); } private void ensureNotFinished() { if (isFinished) throw new IllegalStateException(); } static void setFinalStatic(Field field, Object newValue) throws Exception { field.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); field.set(null, newValue); } public static void main(String[] args) throws Exception { int WEB_PORT = 8000; int CORE_PORT = 9999; Args a = Args.parse(new String[]{"useIPFS", "false", "-port", Integer.toString(WEB_PORT), "-corenodePort", Integer.toString(CORE_PORT)}); Start.local(a); // TODO find a faster high quality randomness source setFinalStatic(TweetNaCl.class.getDeclaredField("prng"), new Random()); a = Args.parse(args); String username = a.getArg("username", "test01"); String password = a.getArg("password", "test01"); String mountPath = a.getArg("mountPoint", "/tmp/peergos/tmp"); Path path = Paths.get(mountPath); path = path.resolve(UUID.randomUUID().toString()); path.toFile().mkdirs(); System.out.println("\n\nPeergos mounted at "+ path+"\n\n"); NetworkAccess network = NetworkAccess.buildJava(WEB_PORT).get(); Crypto crypto = Crypto.initJava(); UserContext userContext = UserTests.ensureSignedUp(username, password, network, crypto); PeergosFS peergosFS = new CachingPeergosFS( userContext); FuseProcess fuseProcess = new FuseProcess(peergosFS, path); Runtime.getRuntime().addShutdownHook(new Thread(() -> fuseProcess.close())); fuseProcess.start(); } }