コード例 #1
0
class ChunkReader:
    def __init__(self, dirname, bootstrapPort):
        self.dirname = dirname
        self.commPort = getFreePort(5000)
        self.comm = ChunkSafeComm(self.commPort)
        self.comm.joinNetwork([("127.0.0.1", bootstrapPort)])
        self.name = hashlib.sha1(dirname).hexdigest() + ".tar.bz2"
        print self.name

    def copyFile(self, fname, dest):
        hKey = hashlib.sha1(self.name).digest()

        def findContact(result):
            if type(result) == dict:
                id = result[hKey]
                print "asking for contact with id " + id
                contactDf = self.comm.findContact(id)
                return contactDf
            else:
                raise KeyError

        def connectToContact(result):
            servAddr = result.address
            servPort = result.port + 500
            print servAddr + ":" + str(servPort)
            fetcher = ChunkFetcher(servAddr, servPort)
            return fetcher.connect()

        # retrieveFile(Protocol)
        def retrieveChunk(result):
            result.getFile(self.name)
            return result.fileDf

        #pulls the file out of the tar
        def retrieveFile(result):
            print result
            self.tar = tarfile.open(self.name, 'r:bz2')
            if os.path.isdir(dest):
                destdir = dest
            else:
                destdir = os.path.dirname(dest)
            self.tar.extract(fname, destdir)

        #Deletes the tar after retrieval
        def cleanup(result):
            print "Cleaning Up"
            self.tar.close()
            os.remove(self.name)
            reactor.stop()

        #handles error
        def errorHandler(result):
            result.trap(KeyError)
            print "That directory was not found!"

        print hKey
        idDf = self.comm.iterativeFindValue(hKey)
        idDf.addCallback(findContact)
        idDf.addCallback(connectToContact)
        idDf.addCallback(retrieveChunk)
        idDf.addCallback(retrieveFile)
        idDf.addCallback(cleanup)
        idDf.addErrback(errorHandler)
        idDf.addErrback(self.comm.printNum, "retrieve17")
コード例 #2
0
ファイル: retrieve.py プロジェクト: jgluck/ChunkSafe
class ChunkReader:
    def __init__(self,dirname,bootstrapPort):
        self.dirname = dirname
        self.commPort = getFreePort(5000)
        self.comm = ChunkSafeComm(self.commPort)
        self.comm.joinNetwork([("127.0.0.1",bootstrapPort)])
        self.name = hashlib.sha1(dirname).hexdigest() + ".tar.bz2"
        print self.name

    def copyFile(self,fname,dest):
        hKey = hashlib.sha1(self.name).digest()
        def findContact(result):
            if type(result) == dict:
                id = result[hKey]
                print "asking for contact with id " + id
                contactDf = self.comm.findContact(id)
                return contactDf
            else:
                raise KeyError
        
        def connectToContact(result):
            servAddr = result.address
            servPort = result.port + 500
            print servAddr + ":" + str(servPort)
            fetcher = ChunkFetcher(servAddr, servPort)
            return fetcher.connect()

        # retrieveFile(Protocol)
        def retrieveChunk(result):
            result.getFile(self.name)
            return result.fileDf

        #pulls the file out of the tar
        def retrieveFile(result):
            print result
            self.tar = tarfile.open(self.name, 'r:bz2')
            if os.path.isdir(dest):
                destdir = dest
            else:
                destdir = os.path.dirname(dest)
            self.tar.extract(fname,destdir)

        #Deletes the tar after retrieval
        def cleanup(result):
            print "Cleaning Up"
            self.tar.close()
            os.remove(self.name)
            reactor.stop()

        #handles error
        def errorHandler(result):
            result.trap(KeyError)
            print "That directory was not found!"

        print hKey
        idDf = self.comm.iterativeFindValue(hKey)
        idDf.addCallback(findContact)
        idDf.addCallback(connectToContact)
        idDf.addCallback(retrieveChunk)
        idDf.addCallback(retrieveFile)
        idDf.addCallback(cleanup)
        idDf.addErrback(errorHandler)
        idDf.addErrback(self.comm.printNum, "retrieve17")