# Written by Jie Yang # see LICENSE.txt for license information from time import time import os, sys import base64 from Swapper.utilities import validIP, validPort, validPermid, validName from CacheDBHandler import SuperPeerDBHandler superpeer_file = 'superpeer.txt' DEBUG = False def init(install_dir = None): ## FIXME filename = make_filename(install_dir, superpeer_file) SuperPeerList().updateSuperPeerList(filename) def make_filename(install_dir,filename): if install_dir is None: return filename else: return os.path.join(install_dir,filename) class SuperPeerList: def __init__(self, superpeer_file=superpeer_file, db_dir=''): self.superpeer_file = superpeer_file self.db_dir = db_dir self.superpeer_db = SuperPeerDBHandler(db_dir=self.db_dir) def clear(self): # clean database if hasattr(self, 'superpeer_db'): self.superpeer_db.clear() def updateSuperPeerList(self, superpeer_file=''): if not superpeer_file: superpeer_file = self.superpeer_file self.superpeer_list = self.readSuperPeerList(superpeer_file) self.updateDB(self.superpeer_list) def updateDB(self, superpeer_list): if not superpeer_list: return for superpeer in superpeer_list: self.superpeer_db.addExternalSuperPeer(superpeer) def getSuperPeers(self): return self.superpeer_db.getSuperPeers() def readSuperPeerList(self, filename=''): """ read (name, permid, superpeer_ip, superpeer_port) lines from a text file """ if not filename: filename = self.superpeer_file try: filepath = os.path.abspath(filename) file = open(filepath, "r") except IOError: print >> sys.stderr, "cannot open superpeer file", filepath return [] superpeers = file.readlines() file.close() superpeers_info = [] for superpeer in superpeers: if superpeer.strip().startswith("#"): # skip commended lines continue superpeer_line = superpeer.split(',') superpeer_info = [] for i in range(len(superpeer_line)): superpeer_info.append(superpeer_line[i].strip()) try: superpeer_info[2] = base64.decodestring( superpeer_info[2]+'\n' ) except: continue if self.validSuperPeerList(superpeer_info): superpeer = {'ip':superpeer_info[0], 'port':superpeer_info[1], 'permid':superpeer_info[2]} if len(superpeer_info) > 3: superpeer['name'] = superpeer_info[3] superpeers_info.append(superpeer) return superpeers_info def validSuperPeerList(self, superpeer_info): try: if len(superpeer_info) < 3: raise RuntimeError, "one line in superpeers.txt contains at least 3 elements" #validIP(superpeer_info[0]) validPort(int(superpeer_info[1])) validPermid(superpeer_info[2]) except Exception, msg: if DEBUG: print "======== reading superpeer list error ========" print superpeer_info print msg print "===========================================" return False else: return True