Implement truncate, utimens and use pathlib to handle paths

master
Tanner Collin 7 years ago
parent 4d8c20e274
commit 2a2e608bde
  1. 7
      itemmanager.py
  2. 61
      sn_fuse.py

@ -60,6 +60,11 @@ class ItemManager:
uuid=item['uuid']) uuid=item['uuid'])
return notes return notes
def touchNote(self, uuid):
item = self.items[uuid]
item['dirty'] = True
self.syncItems()
def writeNote(self, uuid, text): def writeNote(self, uuid, text):
item = self.items[uuid] item = self.items[uuid]
item['content']['text'] = text.strip() item['content']['text'] = text.strip()
@ -77,7 +82,7 @@ class ItemManager:
updated_at=time, updated_at=time,
enc_item_key='', enc_item_key='',
content=content) content=content)
return 0 self.syncItems()
def deleteNote(self, uuid): def deleteNote(self, uuid):
item = self.items[uuid] item = self.items[uuid]

@ -8,6 +8,7 @@ import os
from stat import S_IFDIR, S_IFREG from stat import S_IFDIR, S_IFREG
from sys import argv, exit from sys import argv, exit
from datetime import datetime from datetime import datetime
from pathlib import PurePath
from fuse import FUSE, FuseOSError, Operations, LoggingMixIn from fuse import FUSE, FuseOSError, Operations, LoggingMixIn
from itemmanager import ItemManager from itemmanager import ItemManager
@ -15,6 +16,7 @@ from itemmanager import ItemManager
class StandardNotesFUSE(LoggingMixIn, Operations): class StandardNotesFUSE(LoggingMixIn, Operations):
def __init__(self, sn_api, path='.'): def __init__(self, sn_api, path='.'):
self.item_manager = ItemManager(sn_api) self.item_manager = ItemManager(sn_api)
self.notes = self.item_manager.getNotes()
self.uid = os.getuid() self.uid = os.getuid()
self.gid = os.getgid() self.gid = os.getgid()
@ -28,28 +30,29 @@ class StandardNotesFUSE(LoggingMixIn, Operations):
st_mtime=now, st_atime=now, st_nlink=1, st_mtime=now, st_atime=now, st_nlink=1,
st_uid=self.uid, st_gid=self.gid) st_uid=self.uid, st_gid=self.gid)
def _pathToNote(self, path):
pp = PurePath(path)
note_name = pp.parts[1]
note = self.notes[note_name]
return note, note['uuid']
def getattr(self, path, fh=None): def getattr(self, path, fh=None):
self.notes = self.item_manager.getNotes() self.notes = self.item_manager.getNotes()
st = self.note_stat
path_parts = path.split('/')
note_name = path_parts[1]
if path == '/': if path == '/':
return self.dir_stat return self.dir_stat
elif note_name in self.notes:
note = self.notes[note_name] try:
note, uuid = self._pathToNote(path)
st = self.note_stat
st['st_size'] = len(note['text']) st['st_size'] = len(note['text'])
st['st_ctime'] = iso8601.parse_date(note['created']).timestamp() st['st_ctime'] = iso8601.parse_date(note['created']).timestamp()
st['st_mtime'] = iso8601.parse_date(note['modified']).timestamp() st['st_mtime'] = iso8601.parse_date(note['modified']).timestamp()
return st return st
else: except KeyError:
raise FuseOSError(errno.ENOENT) raise FuseOSError(errno.ENOENT)
def readdir(self, path, fh): def readdir(self, path, fh):
self.notes = self.item_manager.getNotes()
dirents = ['.', '..'] dirents = ['.', '..']
if path == '/': if path == '/':
@ -57,21 +60,17 @@ class StandardNotesFUSE(LoggingMixIn, Operations):
return dirents return dirents
def read(self, path, size, offset, fh): def read(self, path, size, offset, fh):
self.notes = self.item_manager.getNotes() note, uuid = self._pathToNote(path)
return note['text'][offset : offset + size].encode()
path_parts = path.split('/') def truncate(self, path, length, fh=None):
note_name = path_parts[1] note, uuid = self._pathToNote(path)
note = self.notes[note_name] text = note['text'][:length]
return note['text'][offset : offset + size].encode() self.item_manager.writeNote(uuid, text)
def write(self, path, data, offset, fh): def write(self, path, data, offset, fh):
self.notes = self.item_manager.getNotes() note, uuid = self._pathToNote(path)
path_parts = path.split('/')
note_name = path_parts[1]
note = self.notes[note_name]
uuid = note['uuid']
try: try:
text = note['text'][:offset] + data.decode() text = note['text'][:offset] + data.decode()
@ -98,21 +97,21 @@ class StandardNotesFUSE(LoggingMixIn, Operations):
return 0 return 0
def unlink(self, path): def unlink(self, path):
self.notes = self.item_manager.getNotes() note, uuid = self._pathToNote(path)
path_parts = path.split('/')
note_name = path_parts[1]
note = self.notes[note_name]
uuid = note['uuid']
self.item_manager.deleteNote(uuid) self.item_manager.deleteNote(uuid)
return 0 return 0
def mkdir(self, path, mode): def mkdir(self, path, mode):
logging.error('Creation of directories is disabled.') logging.error('Creation of directories is disabled.')
raise FuseOSError(errno.EPERM) raise FuseOSError(errno.EPERM)
def utimens(self, path, times=None):
note, uuid = self._pathToNote(path)
self.item_manager.touchNote(uuid)
return 0
def chmod(self, path, mode): def chmod(self, path, mode):
return 0 return 0
@ -133,9 +132,3 @@ class StandardNotesFUSE(LoggingMixIn, Operations):
def symlink(self, target, source): def symlink(self, target, source):
return 0 return 0
def truncate(self, path, length, fh=None):
return 0
def utimens(self, path, times=None):
return 0

Loading…
Cancel
Save