示例#1
0
 def _send(self, src, dest):
     #    Dropbox limitation - the final file name must match the source
     #    name. AND we cannot pass the final file name in.
     old_src = None
     dest_folder, dest_fname = os.path.split(dest)
     src_folder, src_fname = os.path.split(src)
     if dest_fname != src_fname:
         #    We need to rename src temporarily
         #    because the src name and final name MUST match
         #    We do this in a temporary folder beside its current location.
         old_src = src
         tmpfolder = tempfile.mkdtemp()
         src = os.path.join(tmpfolder, dest_fname)
         os.rename(old_src, src)
         log.debug("Fixed name", old_src, src)
     try:
         dest = utils.join_paths(self.root, dest_folder)
         with open(src, "rb") as fd:
             log.debug("Dropbox Sending", src)
             ret = self.db_client.put_file(self.db_root, dest, fd)
         log.debug("Dropbox Send complete.", ret)
         if ret.status != 200:
             log.debug("Dropbox send failed")
             raise IOError("Unable to send file: " + ret.reason)
     finally:
         if old_src:
             #    Put the name back!
             os.rename(src, old_src)
             os.rmdir(tmpfolder)
示例#2
0
文件: ftpstore.py 项目: tussock/Vault
    def _make_dir(self, folder):
        """
        Create a folder on thel FTP service.
        If its relative, the folder is made relative to cwd.
        Otherwise its absolute.
        
        We do it by attempting to create every folder in the chain.
        """

        folder = utils.join_paths(self.root, folder)
        self._pushd(".")
        try:
            #    Get all the anscestor paths.
            paths = utils.ancestor_paths(folder)
            for path in paths:
                if not path in ["", ".", "..", "/"]:
                    try:
                        #    If we can't chdir, then we try to build
                        self._pushd(path)
                        self._popd()
                    except:
                        #    If we fail to build - we fail
                        if self.sftp and use_paramiko:
                            self.ftp.mkdir(path)
                        else:
                            self.ftp.mkd(path)
        finally:
            self._popd()
示例#3
0
 def _remove_file(self, path):
     log.info("Removing file", path)
     path = utils.join_paths(self.root, path)
     if not os.path.isfile(path):
         raise Exception(_("Missing file"))
     os.remove(path)
     if os.path.isfile(path):
         raise Exception("Unable to delete file")
示例#4
0
 def _list(self, dir):
     if dir in ["", ".", "/"]:
         path = self.root
     else:
         path = utils.join_paths(self.root, dir)
     resp = self.db_client.metadata(self.db_root, path, file_limit=10000, list="true")
     ret = [os.path.basename(item["path"]) for item in resp.data["contents"]]
     return ret
示例#5
0
文件: ftpstore.py 项目: tussock/Vault
 def _size(self, path):
     path = utils.join_paths(self.root, path)
     if self.sftp and use_paramiko:
         stat = self.ftp.stat(path)
         size = stat.st_size
     else:
         self.ftp.sendcmd("TYPE i")
         size = self.ftp.size(path)
     return size
示例#6
0
 def _make_dir(self, folder):
     #    Make the folder. utils.makedirs wont fail if the folder exists.
     if folder in ["", ".", "/"]:
         folder = self.root
     else:
         folder = utils.join_paths(self.root, folder)
     utils.makedirs(folder)
     if not os.path.isdir(folder):
         raise Exception("Unable to build folder")
示例#7
0
 def _remove_dir(self, path):
     log.info("Removing dir", path)
     if path in ["", "."]:
         path = self.root
     else:
         path = utils.join_paths(self.root, path)
     if not os.path.isdir(path):
         raise Exception("Missing folder")
     shutil.rmtree(path)
     if os.path.isdir(path):
         raise Exception("Unable to delete folder")
示例#8
0
文件: ftpstore.py 项目: tussock/Vault
 def _list(self, path="."):
     path = utils.join_paths(self.root, path)
     #    Save the folder
     self._pushd(path)
     try:
         if self.sftp and use_paramiko:
             contents = self.ftp.listdir()
         else:
             contents = self.ftp.nlst()
     finally:
         self._popd()  #    Restore the working folder
     return contents
示例#9
0
 def open(self, path, mode):
     if not self.connected:
         self.connect()
     self.make_dir(os.path.split(path)[0])
     self.io_path = utils.join_paths(self.root, path)
     if "w" in mode:
         self.io_state = ioWriting
         self.io_fd = open(self.io_path, "wb")
     else:
         self.io_state = ioReading
         self.io_fd = open(self.io_path, "rb")
     return self
示例#10
0
 def _get(self, src, dest):
     src = utils.join_paths(self.root, src)
     with open(dest, "wb") as fd:
         fileobj = self.db_client.get_file(self.db_root, src)
         if fileobj.status != 200:
             raise IOError("Unable to get %s: %s" % (src, fileobj.reason))
         try:
             data = fileobj.read(const.BufferSize)
             while len(data) > 0:
                 fd.write(data)
                 data = fileobj.read(const.BufferSize)
         finally:
             fileobj.close()
示例#11
0
文件: ftpstore.py 项目: tussock/Vault
 def _send(self, src, dest):
     dest = utils.join_paths(self.root, dest)
     with open(src, "rb") as ifd:
         if self.sftp and use_paramiko:
             log.info("Starting sftp.paramiko put call src", src, "dest", dest)
             ofd = self.ftp.open(dest, "w+")
             try:
                 data = ifd.read(const.BufferSize)
                 while data:
                     log.debug("FTP read %d bytes", len(data))
                     ofd.write(data)
                     data = ifd.read(const.BufferSize)
             finally:
                 ofd.close()
         else:
             self.ftp.storbinary("STOR " + dest, ifd)
示例#12
0
文件: ftpstore.py 项目: tussock/Vault
    def _get(self, src, dest):
        src = utils.join_paths(self.root, src)

        with open(dest, "wb") as ofd:
            if self.sftp and use_paramiko:

                ifd = self.ftp.open(src, "r")
                try:
                    data = ifd.read(const.BufferSize)
                    while data:
                        log.debug("FTP read %d bytes", len(data))
                        ofd.write(data)
                        data = ifd.read(const.BufferSize)
                finally:
                    ifd.close()
            else:
                self.ftp.retrbinary("RETR " + src, ofd.write)
示例#13
0
 def _remove_file(self, path):
     if path in ["", ".", "/"]:
         path = self.root
     else:
         path = utils.join_paths(self.root, path)
     self.db_client.file_delete(self.db_root, path)
示例#14
0
 def _get(self, src, dest):
     src = utils.join_paths(self.root, src)
     shutil.copyfile(src, dest)
     return dest
示例#15
0
 def _send(self, src, dest):
     #    Switch to absolute path.
     rem_dest = utils.join_paths(self.root, dest)
     shutil.copyfile(src, rem_dest)
     return dest
示例#16
0
文件: ftpstore.py 项目: tussock/Vault
 def _remove_file(self, path):
     path = utils.join_paths(self.root, path)
     if self.sftp and use_paramiko:
         self.ftp.remove(path)
     else:
         self.ftp.delete(path)
示例#17
0
 def _size(self, path):
     path = utils.join_paths(self.root, path)
     return os.path.getsize(path)
示例#18
0
 def _list(self, dir):
     path = utils.join_paths(self.root, dir)
     return os.listdir(path)
示例#19
0
文件: ftpstore.py 项目: tussock/Vault
 def _remove_dir(self, path):
     if path in ["", ".", "/"]:
         path = self.root
     else:
         path = utils.join_paths(self.root, path)
     self._recurse_delete(path)
示例#20
0
 def _make_dir(self, folder):
     if folder in ["", "."]:
         path = self.root
     else:
         path = utils.join_paths(self.root, folder)
     self.db_client.file_create_folder(self.db_root, path)
示例#21
0
 def _size(self, path):
     path = utils.join_paths(self.root, path)
     resp = self.db_client.metadata(self.db_root, path, list="false")
     return resp.data["bytes"]