diff snp-fuse.py @ 0:eefdd97a6749

planemo upload commit b'7f6183b769772449fbcee903686b8d5ec5b7439f\n'-dirty
author jpayne
date Wed, 24 Jan 2018 14:18:21 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/snp-fuse.py	Wed Jan 24 14:18:21 2018 -0500
@@ -0,0 +1,97 @@
+#! /usr/bin/env python3
+
+from fuse import FUSE, FuseOSError, Operations, LoggingMixIn
+from multiprocessing import Process
+
+import argparse
+import logging
+import os, os.path, sys
+import subprocess
+import tarfile
+
+
+class ArchiveDir(LoggingMixIn, Operations):
+	"FUSE object to open a tar.bz file and expose it as a read-only directory"
+	def __init__(self, archive):
+		self.archive = archive
+		self.openfiles = {}
+
+	def readdir(self, path, fh):
+		for symbol in ['.','..']:
+			yield symbol
+		for name in self.archive.getnames():
+			yield name
+
+	# def statfs(self, fh):
+	# 	return dict(f_bavail=0,
+	# 				f_bfree=0,
+	# 				f_blocks=0,
+	# 				f_bsize=0,
+	# 				f_favail=0,
+	# 				f_ffree=0,
+	# 				f_files=0,
+	# 				f_flag=0,
+	# 				f_frsize=0,
+	# 				f_namemax=0)
+
+	def getattr(self, path, fh=None):
+		name = os.path.basename(path)
+		info = self.archive.getmember(name)
+		return dict(st_atime=info.mtime,
+					st_ctime=info.mtime,
+					st_gid=info.gid,
+					st_mode=info.mode,
+					st_nlink=2,
+					st_size=info.size,
+					st_mtime=info.mtime)
+
+	def open(self, path, flags):
+		name = os.path.basename(path)
+		self.openfiles[name] = self.archive.extractfile(name)
+
+	def release(self, path, fh):
+		name = os.path.basename(path)
+		self.openfiles[name].close()
+		del self.openfiles[name]
+
+	def read(self, path, length, offset, fh):
+		name = os.path.basename(path)
+		fh = self.openfiles[name]
+		fh.seek(offset)
+		return fh.read(length=length)
+
+
+def start_fs(arch, mount_point):
+	FUSE(ArchiveDir(arch), 
+		 mount_point, 
+		 nothreads=True, 
+		 foreground=False, 
+		 rdonly=True, 
+		 volname="snp-fuse") #does this block?
+
+
+def main(archive, mount_point, command):
+	with tarfile.open(archive, 'r:bz2') as arch:
+		#t = Process(target=start_fs, args=(arch, mount_point), daemon=True)
+		#t.start()
+		start_fs(arch, mount_point)
+		subprocess.check_call(command, shell=True, stdout=sys.stdout, stderr=sys.stderr)
+		#t.terminate()
+		#t.join()
+
+
+if __name__ == '__main__':
+		 # create the default logger used by the logging mixin
+	logger = logging.getLogger('fuse.log-mixin')
+	logger.setLevel(logging.DEBUG)
+	# create console handler with a higher log level
+	ch = logging.StreamHandler()
+	ch.setLevel(logging.DEBUG)
+	# add the handlers to the logger
+	logger.addHandler(ch)
+	parser = argparse.ArgumentParser(description="mount a bzip2 archive for reading")
+	parser.add_argument('archive')
+	parser.add_argument('mount_point')
+	parser.add_argument('command')
+	args = parser.parse_args()
+	main(**vars(args))