Skip to content
Snippets Groups Projects
Commit 1d3c93b9 authored by jkerdreu's avatar jkerdreu
Browse files

FUSE filesystem for xAAL

git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/Python/trunk@2327 b32b6428-25c9-4566-ad07-03861ab6144f
parent 0c2dd719
No related branches found
No related tags found
No related merge requests found
This package contains a fuse binding for xAAL.
Example:
xaal-mount ~/mnt/xaal/ -f
For a full sample check this https://asciinema.org/a/277693
from setuptools import setup,find_packages
import fastentrypoints
with open('README.rst') as f:
long_description = f.read()
VERSION = "0.1"
setup(
name='xaal.fuse',
version=VERSION,
license='GPL License',
author='Jerome Kerdreux',
author_email='Jerome.Kerdreux@imt-atlantique.fr',
#url='',
description=('xAAL Fuse filesystem'),
long_description=long_description,
classifiers=[
'Programming Language :: Python',
'Topic :: Software Development :: Libraries :: Python Modules',
],
keywords=['xaal', 'tools'],
platforms='any',
packages=find_packages(),
include_package_data=True,
entry_points = {
'console_scripts': [
'xaal-mount = xaal.fuse.mount:main',
],
},
install_requires=[
'xaal.lib',
'fuse-python'
]
)
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
#!/usr/bin/env python
from xaal.lib import Engine,helpers
from xaal.monitor import monitor
from xaal.schemas import devices
import threading
import logging
import time
import os, stat, errno
# pull in some spaghetti to make this stuff work without fuse-py being installed
try:
import _find_fuse_parts
except ImportError:
pass
import fuse
from fuse import Fuse
import ujson
if not hasattr(fuse, '__version__'):
raise RuntimeError("your fuse-py doesn't know of fuse.__version__, probably it's too old.")
fuse.fuse_python_api = (0, 2)
class MyStat(fuse.Stat):
def __init__(self):
self.st_mode = 0
self.st_ino = 0
self.st_dev = 0
self.st_nlink = 0
self.st_uid = 0
self.st_gid = 0
self.st_size = 4096
self.st_atime = 0
self.st_mtime = 0
self.st_ctime = 0
logger = logging.getLogger()
helpers.setup_console_logger()
class XAALFS(Fuse):
def __init__(self, *args, **kw):
Fuse.__init__(self, *args, **kw)
self.mon = None
xaal = threading.Thread(target=self.xaal_thread,daemon=True)
xaal.start()
def xaal_thread(self):
eng = Engine()
dev = devices.basic()
eng.add_device(dev)
self.mon = monitor.Monitor(dev)
eng.run()
def getattr(self, path):
#print("getattr %s" % path)
data = path.split('/')
dev = None
st = MyStat()
st.st_nlink = 2
if path =='/':
st.st_mode = stat.S_IFDIR | 0o755
return st
if len(data) > 1:
dev = self.devices.get_with_addr(data[1])
if (len(data) == 2 and dev):
st.st_mode = stat.S_IFDIR | 0o755
st.st_mtime = dev.last_alive
return st
if (len(data) == 3 and dev and data[2] in ['attributes','description','db']):
if data[2] == 'attributes':
#st.st_size = len(dev.attributes)
st.st_mtime = dev.attributes.last_update
if data[2] == 'description':
#st.st_size = len(dev.description)
st.st_mtime = dev.description.last_update
if data[2] == 'db':
#st.st_size = len(dev.db)
st.st_mtime = dev.db.last_update
st.st_mode = stat.S_IFREG | 0o444
st.st_nlink = 1
return st
return -errno.ENOENT
@property
def devices(self):
if hasattr(self.mon,'devices'):
return self.mon.devices
return monitor.Devices()
def dir_entries(self,values):
for r in ['.', '..'] + values :
yield fuse.Direntry(r)
def readdir(self, path, offset):
data = path.split('/')
if path=='/':
return self.dir_entries([k.address for k in self.devices])
if len(data) == 2:
dev = self.devices.get_with_addr(data[1])
if dev:
return self.dir_entries(['attributes','db','description'])
return self.dir_entries([])
def open(self, path, flags):
data = path.split('/')
if (len(data)==3 and data[-1] in ['attributes','db','description']) :
accmode = os.O_RDONLY | os.O_WRONLY | os.O_RDWR
if (flags & accmode) != os.O_RDONLY:
return -errno.EACCES
else:
return -errno.ENOENT
def read(self,path,size,offset):
data = path.split('/')
dev = None
if len(data) > 1:
dev = self.devices.get_with_addr(data[1])
if len(data) == 3 and dev and data[-1] in ['attributes','db','description']:
tmp = None
if data[2] == 'attributes': tmp = dev.attributes
if data[2] == 'db': tmp = dev.db
if data[2] == 'description': tmp = dev.description
if tmp:
return ujson.dumps(tmp,indent=2).encode('utf-8')
return b''
def main():
usage=""" xAAL Fuse filesystem \n""" + Fuse.fusage
import sys
if sys.argv[-1] != '-f':
print(usage)
print("Please run this in foreground (-f)")
return
server = XAALFS(version="%prog " + fuse.__version__,usage=usage,dash_s_do='setsingle')
server.parse(errex=1)
server.main()
if __name__ == '__main__':
main()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment