Advertisement
Guest User

Untitled

a guest
Dec 1st, 2015
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.77 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import logging
  4.  
  5. from collections import defaultdict
  6. from errno import ENOENT
  7. from stat import S_IFDIR, S_IFLNK, S_IFREG
  8. from sys import argv, exit
  9. from time import time
  10. from datetime import datetime, timedelta
  11. from fuse import FUSE, FuseOSError, Operations, LoggingMixIn
  12. #sudo pip install lxml
  13. from lxml import etree
  14.  
  15. import collections
  16. import re
  17.  
  18. if not hasattr(__builtins__, 'bytes'):
  19. bytes = str
  20.  
  21. class Memory(LoggingMixIn, Operations):
  22. 'Example memory filesystem. Supports only one level of files.'
  23.  
  24. def set_attr(self,node,attr,value):
  25. node.attrib[attr]=repr(value)
  26.  
  27. def get_attr(self,node,attr):
  28. if(attr=='st_ctime') or (attr=='st_mtime' ) or (attr=='st_atime'):
  29. return float(node.attrib[attr])
  30. else:
  31. return int(node.attrib[attr])
  32.  
  33. def get_node(self,path):
  34. logger.debug('fs'+path)
  35. return self.root.find('fs'+path)
  36.  
  37. def get_node_name(self,path):
  38. a= ('fs'+path).split('/')
  39. logger.debug(a)
  40. return a.pop(-1)
  41.  
  42. def get_node_parent(self,path):
  43. a= ('fs'+path).split('/')
  44. logger.debug(a)
  45. a.pop(-1)
  46. logger.debug('----'+'/'.join(a))
  47. return self.root.find('/'.join(a))
  48.  
  49. def __init__(self):
  50. self.files = {}
  51. self.root = etree.Element("root")
  52. self.data = defaultdict(bytes)
  53. self.fd = 0
  54. now = time()
  55. self.files['/'] = dict( st_mode=(S_IFDIR | 0755),
  56. st_ctime=now,
  57. st_mtime=now,
  58. st_atime=now,
  59. st_nlink=2)
  60. fs = etree.SubElement(self.root,'fs')
  61. self.set_attr(fs,'st_mode' ,S_IFDIR | 0755)
  62. self.set_attr(fs,'st_ctime',now)
  63. self.set_attr(fs,'st_mtime',now)
  64. self.set_attr(fs,'st_atime',now)
  65. self.set_attr(fs,'st_nlink',2)
  66.  
  67. def chmod(self, path, mode):
  68. self.files[path]['st_mode'] &= 0770000
  69. self.files[path]['st_mode'] |= mode
  70. node = self.get_node(path)
  71. val = self.get_attr(node,'st_mode')
  72. val &= 0770000
  73. val |= mode
  74. self.set_attr(node,'st_mode',val)
  75. return 0
  76.  
  77. def chown(self, path, uid, gid):
  78. self.files[path]['st_uid'] = uid
  79. self.files[path]['st_gid'] = gid
  80. node = self.get_node(path)
  81. self.set_attr(node,'st_uid',uid)
  82. self.set_attr(node,'st_gid',gid)
  83.  
  84. def getattr(self, path, fh=None):
  85. if path not in self.files:
  86. raise FuseOSError(ENOENT)
  87.  
  88. return self.files[path]
  89.  
  90. def create(self, path, mode):
  91. logger.info("####"+path)
  92. logger.info('parent '+self.get_node_parent(path).tag)
  93. logger.info('name '+self.get_node_name(path))
  94.  
  95. #m = re.search('--([0-9]*)$', path)
  96. #if (m):
  97. # self.expires[path]=datetime.now() + timedelta(seconds=int(m.group(1)))
  98. # logger.info("####"+path+" ")
  99. # repr(self.expires[path])
  100. # logger.info("####"+path+" ")
  101. self.files[path] = dict(st_mode=(S_IFREG | mode), st_nlink=1,
  102. st_size=0, st_ctime=time(), st_mtime=time(),
  103. st_atime=time())
  104.  
  105. self.fd += 1
  106. node = etree.SubElement(self.get_node_parent(path),self.get_node_name(path))
  107. self.set_attr(node,'st_mode' ,S_IFREG | mode)
  108. self.set_attr(node,'st_size' ,0)
  109. self.set_attr(node,'st_ctime',time())
  110. self.set_attr(node,'st_mtime',time())
  111. self.set_attr(node,'st_atime',time())
  112. self.set_attr(node,'st_nlink',1)
  113. logger.debug(etree.tostring(self.root, pretty_print=True))
  114. return self.fd
  115.  
  116. def readdir(self, path, fh):
  117. return ['.', '..'] + [x[1:] for x in self.files if x != '/']
  118.  
  119. def rmdir(self, path):
  120. self.files.pop(path)
  121. self.files['/']['st_nlink'] -= 1
  122.  
  123. def mkdir(self, path, mode):
  124. self.files[path] = dict(st_mode=(S_IFDIR | mode), st_nlink=2,
  125. st_size=0, st_ctime=time(), st_mtime=time(),
  126. st_atime=time())
  127.  
  128. self.files['/']['st_nlink'] += 1
  129. self.set_attr(self.get_node_parent(path),'st_nlink',self.get_attr(self.get_node_parent(path),'st_nlink')+1)
  130. node = etree.SubElement(self.get_node_parent(path),self.get_node_name(path))
  131. self.set_attr(node,'st_ctime',time())
  132. self.set_attr(node,'st_mtime',time())
  133. self.set_attr(node,'st_atime',time())
  134. self.set_attr(node,'st_mode' ,S_IFDIR | mode)
  135. self.set_attr(node,'st_size' ,0)
  136. self.set_attr(node,'st_nlink',2)
  137. logger.debug(etree.tostring(self.root, pretty_print=True))
  138.  
  139. def open(self, path, flags):
  140. self.fd += 1
  141. return self.fd
  142.  
  143. def rename(self, old, new):
  144. self.files[new] = self.files.pop(old)
  145.  
  146. def statfs(self, path):
  147. return dict(f_bsize=512, f_blocks=4096, f_bavail=2048)
  148.  
  149. def utimens(self, path, times=None):
  150. now = time()
  151. atime, mtime = times if times else (now, now)
  152. self.files[path]['st_atime'] = atime
  153. self.files[path]['st_mtime'] = mtime
  154.  
  155.  
  156. def symlink(self, target, source):
  157. self.files[target] = dict(st_mode=(S_IFLNK | 0777), st_nlink=1,
  158. st_size=len(source))
  159. self.data[target] = source
  160.  
  161. def readlink(self, path):
  162. return self.data[path]
  163.  
  164. def unlink(self, path):
  165. self.files.pop(path)
  166.  
  167.  
  168. def truncate(self, path, length, fh=None):
  169. self.data[path] = self.data[path][:length]
  170. self.files[path]['st_size'] = length
  171.  
  172. def read(self, path, size, offset, fh):
  173. return self.data[path][offset:offset + size]
  174.  
  175. def write(self, path, data, offset, fh):
  176. self.data[path] = self.data[path][:offset] + data
  177. self.files[path]['st_size'] = len(self.data[path])
  178. return len(data)
  179.  
  180.  
  181. def getxattr(self, path, name, position=0):
  182. attrs = self.files[path].get('attrs', {})
  183.  
  184. try:
  185. return attrs[name]
  186. except KeyError:
  187. return '' # Should return ENOATTR
  188.  
  189. def listxattr(self, path):
  190. attrs = self.files[path].get('attrs', {})
  191. return attrs.keys()
  192.  
  193. def removexattr(self, path, name):
  194. attrs = self.files[path].get('attrs', {})
  195.  
  196. try:
  197. del attrs[name]
  198. except KeyError:
  199. pass # Should return ENOATTR
  200.  
  201. def setxattr(self, path, name, value, options, position=0):
  202. # Ignore options
  203. attrs = self.files[path].setdefault('attrs', {})
  204. attrs[name] = value
  205.  
  206.  
  207.  
  208. if __name__ == '__main__':
  209. if len(argv) != 2:
  210. print('usage: %s <mountpoint>' % argv[0])
  211. exit(1)
  212.  
  213. logging.getLogger().setLevel(logging.DEBUG)
  214. logging.basicConfig()
  215. logger = logging.getLogger()
  216. fuse = FUSE(Memory(), argv[1], foreground=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement