Ejemplo n.º 1
0
 def downloadFile(self, request, context):
     if request.usrName not in self.loginDict:
         yield DisStorage_pb2.fileData(fileName='',
                                       block='',
                                       blockNum=-1,
                                       usrName='',
                                       mess='Login First!')
     else:
         flst = os.listdir(self.path)
         if request.fileName in flst:
             f = open(self.path + request.fileName, 'rb')
             blockCnt = 0
             while True:
                 s = f.readline()
                 blockCnt += 1
                 if s:
                     yield DisStorage_pb2.fileData(
                         fileName=request.fileName,
                         block=s,
                         blockNum=blockCnt,
                         usrName=request.usrName,
                         mess='')
                 else:
                     break
         else:
             yield DisStorage_pb2.fileData(fileName=request.fileName,
                                           block='',
                                           blockNum=-1,
                                           usrName=request.usrName,
                                           mess='file not exist')
Ejemplo n.º 2
0
    def linkNodes(self):
        try:
            channel = grpc.insecure_channel("localhost:50051")
            self.stubs[0] = DisStorage_pb2.DisServerStub(channel)
        except Exception as err:
            print 'linkNodes: can not connect to node 1'

        try:
            channel = grpc.insecure_channel("localhost:50052")
            self.stubs[1] = DisStorage_pb2.DisServerStub(channel)
        except Exception as err:
            print 'linkNodes: can not connect to node 2'

        try:
            channel = grpc.insecure_channel("localhost:50053")
            self.stubs[2] = DisStorage_pb2.DisServerStub(channel)
        except Exception as err:
            print 'linkNodes: can not connect to node 3'
        accessCnt = 0
        for i in range(0, self.DisServerNum):
            try:
                res = self.stubs[i].usrLogin(
                    DisStorage_pb2.usrInfo(name='__root__',
                                           pw='__root__',
                                           mess=''))
                if res.mess:
                    print res.mess
                else:
                    accessCnt += 1
            except Exception as err:
                print 'linkNode: can not login to node %d' % i
        print "link to %d DiskServer" % accessCnt
Ejemplo n.º 3
0
 def usrLogout(self,request,context):
     if request.name not in self.loginDict:
         return DisStorage_pb2.logoutInfo(logoutFlag=0,
                                          mess = 'Login First!')
     self.loginDict.pop(request.name)
     return DisStorage_pb2.logoutInfo(logoutFlag=1,
                                      mess='')
Ejemplo n.º 4
0
 def getFileList(self, request, context):
     if request.name in self.loginDict:
         lst = os.listdir(self.path)
         return DisStorage_pb2.fileList(fileNum=len(lst),
                                        nameList=lst,
                                        mess='')
     else:
         return DisStorage_pb2.fileList(fileNum=-1,
                                        nameList=[],
                                        mess='Login First!')
Ejemplo n.º 5
0
def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    DisStorage_pb2.add_DisServerServicer_to_server(DsServer(), server)
    server.add_insecure_port('[::]:50051')
    server.start()
    while True:
        order = raw_input("")
        if order == "exit":
            server.stop(0)
            break
Ejemplo n.º 6
0
 def getState(self,request,context):
     if request.name!="__root__":
         return DisStorage_pb2.nodeState(
             usrs=[],
             mess='Permission Denied!'
         )
     return DisStorage_pb2.nodeState(
         usrs = self.loginDict.keys(),
         mess = ''
     )
Ejemplo n.º 7
0
 def getFileList(self, request, context):
     self.flstAll, self.flsts, self.paths = self.updateFileList()
     if request.name in self.loginDict:
         return DisStorage_pb2.fileList(fileNum=len(self.flstAll),
                                        nameList=self.flstAll,
                                        mess='')
     else:
         return DisStorage_pb2.fileList(fileNum=-1,
                                        nameList=[],
                                        mess='Login First!')
Ejemplo n.º 8
0
 def getNodeInfo(self, request, context):
     if request.name not in self.loginDict:
         return DisStorage_pb2.nodeInfo(mess='Login First')
     else:
         nodeID = self.loginDict[request.name]
         s = 'You are now in node ' + str(nodeID)
         s += '\nThis node have ' + str(
             self.DisServerStress[nodeID]) + ' active users\n'
         s += 'All node active users: '
         for i in range(0, self.DisServerNum):
             s += str(self.DisServerStress[i])
             s += ', '
         return DisStorage_pb2.nodeInfo(mess=s[:-1])
Ejemplo n.º 9
0
 def sync(self, param='ALL'):
     #info sync
     if param == 'ALL':
         self.loginDict = {}
         for i in range(0, self.DisServerNum):
             try:
                 res = self.stubs[i].getState(
                     DisStorage_pb2.usrInfo(name='__root__',
                                            pw='__root__',
                                            mess=''))
                 if res.mess:
                     print res.mess
                 else:
                     self.DisServerStress[i] = len(res.usrs) - 1
                     for each in res.usrs:
                         self.loginDict[each] = i
             except Exception as err:
                 print 'sync: can not connect to node %d' % i
     #data sync
     for i in range(0, self.DisServerNum):
         try:
             tmp = list(set(self.flstAll) - set(self.flsts[i]))
             if tmp:
                 for each in tmp:
                     for j in range(0, self.DisServerNum):
                         if each in self.flsts[j]:
                             fp = open(self.paths[j] + each, 'rb')
                             blockCnt = 0
                             lst = []
                             while True:
                                 s = fp.readline()
                                 if not s:
                                     break
                                 blockCnt += 1
                                 lst.append(
                                     DisStorage_pb2.fileData(
                                         fileName=each,
                                         block=s,
                                         blockNum=blockCnt,
                                         usrName='__root__',
                                         mess=''))
                             res = self.stubs[i].uploadFile(lst)
                             if res.mess:
                                 print res.mess
         except Exception as err:
             print 'sync: can not connect to node %d' % i
     return None
Ejemplo n.º 10
0
    def uploadFile(self, request, context):
        blockCnt = 0
        uname = ''
        fname = ''
        lst = []
        for each in request:
            fname = each.fileName
            uname = each.usrName
            if each.usrName not in self.loginDict:
                return DisStorage_pb2.fileInfo(fileName='',
                                               blockNum=-1,
                                               usrName=each.usrName,
                                               mess='Login First')
            else:
                lst.append(
                    DisStorage_pb2.fileData(fileName=each.fileName,
                                            block=each.block,
                                            blockNum=each.blockNum,
                                            usrName='__root__',
                                            mess=each.mess))
        try:
            res = self.stubs[self.loginDict[uname]].getState(
                DisStorage_pb2.usrInfo(name='__root__', pw='__root__',
                                       mess=''))
            res = self.stubs[self.loginDict[uname]].uploadFile(lst)
        except Exception as err:
            print 'can not connect to node %d' % self.loginDict[uname]
            for i in range(0, self.DisServerNum):
                try:
                    res = self.stubs[i].getState(
                        DisStorage_pb2.usrInfo(name='__root__',
                                               pw='__root__',
                                               mess=''))
                    res = self.stubs[i].uploadFile(lst)
                    print 'change to node %d, upload done' % i
                    break
                except Exception as err:
                    print 'can not connect to node %d' % i

        if res.mess:
            print res.mess
        else:
            self.flstAll, self.flsts, self.paths = self.updateFileList()
            self.sync()
            return res
Ejemplo n.º 11
0
 def usrLogout(self, request, context):
     if request.name not in self.loginDict:
         return DisStorage_pb2.logoutInfo(logoutFlag=0, mess='Login First!')
     res = self.stubs[self.loginDict[request.name]].usrLogout(request)
     if res.logoutFlag == 1:
         self.DisServerStress[self.loginDict[request.name]] -= 1
         self.loginDict.pop(request.name)
         self.activeNum -= 1
     return res
Ejemplo n.º 12
0
 def uploadFile(self, request, context):
     blockCnt = 0
     s = ''
     filename = ''
     for each in request:
         if each.usrName not in self.loginDict:
             return DisStorage_pb2.fileInfo(fileName='',
                                            blockNum=-1,
                                            usrName=each.usrName,
                                            mess='Login First!')
         blockCnt += 1
         s += each.block
         filename = each.fileName
     f = open(self.path + filename, 'wb')
     f.write(s)
     f.close()
     return DisStorage_pb2.fileInfo(fileName=filename,
                                    blockNum=blockCnt,
                                    usrName='done',
                                    mess='')
Ejemplo n.º 13
0
 def usrLogin(self,request,context):
     if request.name=='__root__':
         self.loginDict[request.name]=1
         return DisStorage_pb2.loginInfo(
             loginFlag=1,
             IP=self.IP,
             accessNum = self.loginNum,
             mess = ''
         )
     if request.name in self.loginDict:
         return DisStorage_pb2.loginInfo(loginFlag=0,
                                         IP=self.IP,
                                         accessNum=self.loginNum,
                                         mess='You have logined')
     self.loginDict[request.name] = 1
     self.loginNum += 1
     return DisStorage_pb2.loginInfo(loginFlag = 1,
                                     IP = self.IP,
                                     accessNum=self.loginNum,
                                     mess = 'Login! you are the '+str(self.loginNum)+'th visitor\nServer time : '+time.strftime("%Y-%m-%d-%H:%M:%S",time.localtime(time.time()))+'\nIP : 127.0.0.1')
Ejemplo n.º 14
0
 def usrLogin(self, request, context):
     for i in range(0, self.DisServerNum):
         if self.DisServerStress[i] < 5:
             res = self.stubs[i].usrLogin(request)
             if res.loginFlag == 1:
                 self.loginNum += 1
                 self.activeNum += 1
                 self.loginDict[request.name] = i
                 self.DisServerStress[i] += 1
             return res
     return DisStorage_pb2.loginInfo(loginFlag=0,
                                     IP='-1',
                                     accessNum=-1,
                                     mess='no free node')
Ejemplo n.º 15
0
    def downloadFile(self, request, context):
        self.flstAll, self.flsts, self.paths = self.updateFileList()
        self.sync('dataOnly')

        if request.usrName not in self.loginDict:
            yield DisStorage_pb2.fileData(fileName='',
                                          block='',
                                          blockNum=-1,
                                          usrName='',
                                          mess='Login First!')
        else:
            try:
                res = self.stubs[self.loginDict[request.usrName]].getState(
                    DisStorage_pb2.usrInfo(name='__root__',
                                           pw='__root__',
                                           mess=''))
                for each in self.stubs[self.loginDict[
                        request.usrName]].downloadFile(request):
                    yield DisStorage_pb2.fileData(fileName=each.fileName,
                                                  block=each.block,
                                                  blockNum=each.blockNum,
                                                  usrName=each.usrName,
                                                  mess=each.mess)
            except Exception as err:
                print 'download: can not connect to node %d' % self.loginDict[
                    request.usrName]
                for i in range(0, self.DisServerNum):
                    try:
                        res = self.stubs[i].getState(
                            DisStorage_pb2.usrInfo(name='__root__',
                                                   pw='__pw__',
                                                   mess=''))
                        print 'change to node %d' % i
                        for each in self.stubs[i].downloadFile(
                                DisStorage_pb2.fileInfo(
                                    fileName=request.fileName,
                                    blockNum=request.blockNum,
                                    usrName='__root__',
                                    mess=request.mess)):
                            yield DisStorage_pb2.fileData(
                                fileName=each.fileName,
                                block=each.block,
                                blockNum=each.blockNum,
                                usrName=request.usrName,
                                mess=each.mess)
                        break
                    except Exception as err:
                        print 'download: can not connect to node %d' % i
Ejemplo n.º 16
0
def run():
    channel = grpc.insecure_channel("localhost:50050")
    stub = DisStorage_pb2.CtrServerStub(channel)
    usrName = ''
    pw = ''
    usrPath = r'ClientDisk/'
    while True:
        sin = raw_input("##:")
        if sin == 'exit':
            break
        if sin == 'reconnect':
            try:
                channel = grpc.insecure_channel("localhost:50050")
                stub = DisStorage_pb2.CtrServerStub(channel)
                print 'reconnect done'
            except Exception as err:
                print err
        if sin == 'login':
            usrName = raw_input('user name:')
            pw = raw_input('password:'******''))
            if res.mess:
                print res.mess

        if sin == 'logout':
            res = stub.usrLogout(
                DisStorage_pb2.usrInfo(name=usrName, pw=pw, mess=''))
            if res.mess:
                print res.mess
            else:
                print "order done"

        if sin == 'ls':
            res = stub.getFileList(
                DisStorage_pb2.usrInfo(name=usrName, pw=pw, mess=''))
            if res.mess:
                print res.mess
            else:
                print res.nameList
        if sin == 'upload':
            fname = raw_input('file name:')
            f = open(usrPath + fname, 'rb')
            cnt = 0
            lst = []
            while True:
                s = f.readline()
                cnt += 1
                if s:
                    lst.append(
                        DisStorage_pb2.fileData(fileName=fname,
                                                block=s,
                                                blockNum=cnt,
                                                usrName=usrName,
                                                mess=''))
                else:
                    break
            res = stub.uploadFile(lst)
            if res.mess:
                print res.mess
            else:
                print('upload done')
        if sin == 'download':
            fname = raw_input('file name:')
            cnt = 0
            downFlag = 1
            f = open(usrPath + fname, 'wb')
            for each in stub.downloadFile(
                    DisStorage_pb2.fileInfo(fileName=fname,
                                            blockNum=0,
                                            usrName=usrName,
                                            mess='')):
                if each.mess:
                    print each.mess
                    f.close()
                    os.remove(usrPath + fname)
                    downFlag = 0
                    break
                f.write(each.block)
                cnt += 1
            f.close()
            if downFlag == 1:
                print "done"
        if sin == 'node_info':
            res = stub.getNodeInfo(
                DisStorage_pb2.usrInfo(name=usrName, pw=pw, mess=''))
            if res.mess:
                print res.mess