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')
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
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='')
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!')
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
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 = '' )
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!')
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])
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
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
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
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='')
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')
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')
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
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