# Written by Jie Yang # see LICENSE.txt for license information from time import time import os import base64 from traceback import print_exc from Swapper.utilities import validIP, validPort, validPermid, validName from Swapper.Overlay.permid import permid_for_user from CacheDBHandler import FriendDBHandler friend_file = 'friends.txt' DEBUG = False def init(config_dir = None): filename = make_filename(config_dir, friend_file) ExternalFriendList(filename).updateFriendList() def done(config_dir = None): filename = make_filename(config_dir, friend_file) ExternalFriendList(filename).writeFriendList() def make_filename(config_dir,filename): if config_dir is None: return filename else: return os.path.join(config_dir,filename) class ExternalFriendList: def __init__(self, friend_file=friend_file, db_dir=''): self.friend_file = friend_file self.db_dir = db_dir self.friend_db = FriendDBHandler(db_dir=self.db_dir) def clear(self): # clean database if hasattr(self, 'friend_db'): self.friend_db.clear() def clean(self): # delete friend file try: os.remove(self.friend_file) except Exception, msg: pass def updateFriendList(self, friend_file=''): if not friend_file: friend_file = self.friend_file self.friend_list = self.readFriendList(friend_file) self.updateDB(self.friend_list) #self.clean() def updateDB(self, friend_list): if not friend_list: return for friend in friend_list: self.friend_db.addExternalFriend(friend) def getFriends(self): return self.friend_db.getFriends() def deleteFriend(self, permid): self.friend_db.deleteFriend(permid) def readFriendList(self, filename=''): """ read (name, permid, friend_ip, friend_port) lines from a text file """ if not filename: filename = self.friend_file try: file = open(filename, "r") friends = file.readlines() file.close() except IOError: # create a new file file = open(filename, "w") file.close() return [] friends_info = [] for friend in friends: if friend.strip().startswith("#"): # skip commended lines continue friend_line = friend.split(',') friend_info = [] for i in range(len(friend_line)): friend_info.append(friend_line[i].strip()) try: friend_info[1] = base64.decodestring( friend_info[1]+'\n' ) except: continue if self.validFriendList(friend_info): friend = {'name':friend_info[0], 'permid':friend_info[1], 'ip':friend_info[2], 'port':int(friend_info[3])} friends_info.append(friend) return friends_info def validFriendList(self, friend_info): try: if len(friend_info) < 4: raise RuntimeError, "one line in friends.txt can only contain at least 4 elements" validName(friend_info[0]) validPermid(friend_info[1]) validIP(friend_info[2]) validPort(int(friend_info[3])) except Exception, msg: if DEBUG: print "======== reading friend list error ========" print friend_info print msg print "===========================================" return False else: return True def writeFriendList(self, filename=''): if not filename: filename = self.friend_file try: file = open(filename, "w") except IOError: print_exc() return friends = self.getFriends() friends_to_write = self.formatForText(friends) file.writelines(friends_to_write) file.close() def formatForText(self, friends): lines = [] for friend in friends: permid = permid_for_user(friend['permid']) line = ', '.join([friend['name'], permid, friend['ip'], str(friend['port'])]) line += '\n' lines.append(line) return lines