def __init__(self, server, path, fh): try: if not "detail" in fh: fh = server.getFileDetails(fh) debug.debug("NetStorageStat: getFileDetails returned:\n%s"%fh) self.fh = fh if fh["folder"]: self.st_mode = stat.S_IFDIR | 0755 self.st_nlink = 2 self.st_size = 4096 else: self.st_mode = stat.S_IFREG | 0666 self.st_nlink = 1 if "size" in fh: self.st_size = fh["size"] else: self.st_size = 0; self.st_ino = 0 self.st_dev = 0 self.st_uid = 0 self.st_gid = 0 self.st_rdev = 0 self.st_blksize = 0 self.st_blocks = 24 self.st_atime = time.time() self.st_mtime = self._get_time("mtime") self.st_ctime = self._get_time("ctime") except: debug.debug_exception() raise
def __init__(self, server, root, username, password): self.server = server self.root = root self.username = username self.password = password self.authentication = "Basic %s" % base64.encodestring('%s:%s' % (self.username, self.password))[:-1] try: response = urltools.Request(self.root, base=self.server, expect=urltools.HTML) except urllib2.HTTPError, e: if hasattr(e, "code") and e.code == 401: base64string = base64.encodestring('%s:%s' % (self.username, self.password))[:-1] try: response = urltools.Request( self.root, base=self.server, expect=urltools.HTML, headers={"Authorization": "Basic %s" % base64string} ) except: debug.debug_exception() raise else: debug.debug_exception() raise
def main(): server = NetStorageFS(config.servername, config.root, config.username, config.password) #version="%prog " + fuse.__version__, # usage=usage, dash_s_do='setsingle') try: server.parse(errex=1) server.main() except: debug.debug_exception() raise
def getFolderIndex(self, path): try: response = urltools.Request( os.path.join(self.root, path), base=self.server, headers={"Authorization": self.authentication}, expect=urltools.HTML ) except: debug.debug_exception() raise dom = response.get_dom() script = dom.getElementsByTagName("body")[0].firstElementChild.childNodes[1].nodeValue string = script.split("devicePath=",1)[1].split("\n",1)[0].strip() deviceFolder = urllib.unquote(json.loads(string)) table = xpath.find('//div[@id="fileArea"]/table[@class="FilesTable"]', dom)[0] files = [] for row in table.childNodes: if row.nodeType != 1 or row.nodeName.lower() != "tr": continue c = row.children script = c[1].lastElementChild.childNodes[1].nodeValue filename = c[1].firstElementChild["title"] timestring = c[3].firstElementChild.childNodes[1].nodeValue.split('"')[1] mtime = time.strptime(timestring, "%b %d %Y %H:%M %Z") folder = "el.isFolder = true" in script string = script.split("el.fileURL=",1)[1].split(";",1)[0] uri = urllib.unquote(json.loads(string)) files.append(\ { "filename":filename, "mtime":mtime, "folder":folder, "uri": uri, "devicePath": os.path.join(deviceFolder, filename) }) return files
def readdir(self, path, offset): try: if path[0] == "/": path = path[1:] dirents = \ [ ".", ".." ] dirents.extend([i["filename"] for i in self.server.getFolderIndex(path)]) for r in dirents: yield fuse.Direntry(str(r)) except: debug.debug_exception() raise
def getattr(self, path): debug.debug("getattr(",path,")") try: if path == "/": fh = \ { "detail": True, "folder": True } else: parent, name = path.rsplit("/", 1) if parent.startswith("/"): parent = parent[1:] contents = self.server.getFolderIndex(parent) fh = [f for f in contents if f["filename"] == name] if not len(fh): debug.debug("No such file or directory") return -errno.ENOENT fh = fh[0] abspath = os.path.join(self.tmp_dir, path[1:]) debug.debug([self.tmp_dir, path, abspath]) if not os.path.exists(abspath): if fh["folder"]: os.mkdir(abspath) else: os.utime(abspath, None) st = NetStorageStat(self.server, path, fh) return st except: debug.debug_exception() raise
def getFileDetails(self, data): post = \ { "method": "props", "file": data["uri"], "session": self.getSession() } try: response = urltools.Request( "/NetStorage/servlet/FileProps", base=self.server, data=post, headers={"Authorization": self.authentication} ) except: debug.debug_exception() raise dom = response.get_dom() try: table = xpath.find('//div[@id="NFSRights"]/table', dom)[0] except IndexError: return data c = table.children data["size"] = int(c[1].children[1].firstChild.nodeValue.strip()) try: script = c[2].children[1].firstElementChild.childNodes[1].nodeValue string = script.split("str=",1)[1].split("\n",1)[0].strip() timestring = urllib.unquote(json.loads(string)) data["ctime"] = time.strptime(timestring, "%Y-%m-%dT%H:%M:%SZ") except: debug.debug_exception() try: script = c[3].children[1].firstElementChild.childNodes[1].nodeValue string = script.split("new Date(",1)[1].split(")\n",1)[0].strip() timestring = urllib.unquote(json.loads(string)) data["mtime"] = time.strptime(timestring, "%a, %d %b %Y %H:%M:%S %Z") except: debug.debug_exception() data["detail"] = True return data
base64string = base64.encodestring('%s:%s' % (self.username, self.password))[:-1] try: response = urltools.Request( self.root, base=self.server, expect=urltools.HTML, headers={"Authorization": "Basic %s" % base64string} ) except: debug.debug_exception() raise else: debug.debug_exception() raise except: debug.debug_exception() raise def getSession(self): for cookie in urltools.cj: if cookie.name.lower() == "novellsession1": return cookie.value return None def getFolderIndex(self, path): try: response = urltools.Request( os.path.join(self.root, path), base=self.server, headers={"Authorization": self.authentication},