def start_community(): if self.crawl_keypair_filename: keypair = read_keypair(self.crawl_keypair_filename) member = self.dispersy.get_member( private_key=self.dispersy.crypto.key_to_bin(keypair)) cls = TunnelCommunityCrawler else: if self.settings.enable_multichain: from Tribler.community.multichain.community import MultiChainCommunity member = self.dispersy.get_member( private_key=self.session.multichain_keypair.key_to_bin( )) self.dispersy.define_auto_load(MultiChainCommunity, member, load=True) else: member = self.dispersy.get_new_member(u"curve25519") cls = HiddenTunnelCommunity self.community = self.dispersy.define_auto_load( cls, member, (self.session, self.settings), load=True)[0] self.session.set_anon_proxy_settings( 2, ("127.0.0.1", self.session.get_tunnel_community_socks5_listen_ports())) if introduce_port: self.community.add_discovered_candidate( Candidate(('127.0.0.1', introduce_port), tunnel=False))
def init_keypair(self): """ Set parameters that depend on state_dir. """ permid_module.init() # Set params that depend on state_dir # # 1. keypair # pair_filename = self.config.get_permid_keypair_filename() if os.path.exists(pair_filename): self.keypair = permid_module.read_keypair(pair_filename) else: self.keypair = permid_module.generate_keypair() # Save keypair public_key_filename = os.path.join(self.config.get_state_dir(), 'ecpub.pem') permid_module.save_keypair(self.keypair, pair_filename) permid_module.save_pub_key(self.keypair, public_key_filename) trustchain_pairfilename = self.config.get_trustchain_permid_keypair_filename( ) if os.path.exists(trustchain_pairfilename): self.trustchain_keypair = permid_module.read_keypair_trustchain( trustchain_pairfilename) else: self.trustchain_keypair = permid_module.generate_keypair_trustchain( ) # Save keypair trustchain_pubfilename = os.path.join(self.config.get_state_dir(), 'ecpub_multichain.pem') permid_module.save_keypair_trustchain(self.trustchain_keypair, trustchain_pairfilename) permid_module.save_pub_key_trustchain(self.trustchain_keypair, trustchain_pubfilename) tradechain_pairfilename = self.config.get_tradechain_permid_keypair_filename( ) if os.path.exists(tradechain_pairfilename): self.tradechain_keypair = permid_module.read_keypair_trustchain( tradechain_pairfilename) else: self.tradechain_keypair = permid_module.generate_keypair_trustchain( ) # Save keypair tradechain_pubfilename = os.path.join(self.config.get_state_dir(), 'ecpub_tradechain.pem') permid_module.save_keypair_trustchain(self.tradechain_keypair, tradechain_pairfilename) permid_module.save_pub_key_trustchain(self.tradechain_keypair, tradechain_pubfilename)
def test_save_load_keypair_pubkey(self): permid.init() key = permid.generate_keypair() permid.save_keypair(key, self.key_pair_path) permid.save_pub_key(key, self.pub_key_path) self.assertTrue(os.path.isfile(self.pub_key_path)) self.assertTrue(os.path.isfile(self.key_pair_path)) loaded_key = permid.read_keypair(self.key_pair_path) self.assertIsInstance(loaded_key, EC)
def start_community(): if self.crawl_keypair_filename: keypair = read_keypair(self.crawl_keypair_filename) member = self.dispersy.get_member(private_key=self.dispersy.crypto.key_to_bin(keypair)) cls = TunnelCommunityCrawler else: member = self.dispersy.get_new_member(u"curve25519") cls = HiddenTunnelCommunity self.community = self.dispersy.define_auto_load(cls, member, (self.session, self.settings), load=True)[0] self.session.set_anon_proxy_settings( 2, ("127.0.0.1", self.session.get_tunnel_community_socks5_listen_ports())) if introduce_port: self.community.add_discovered_candidate(Candidate(('127.0.0.1', introduce_port), tunnel=False))
def start_tunnel_community(): """ This will init the hidden tunnel community, do not forget to start this in a seperate thread. """ if self.crawl_keypair_filename: keypair = read_keypair(self.crawl_keypair_filename) member = self.dispersy.get_member(private_key=self.dispersy.crypto.key_to_bin(keypair)) cls = TunnelCommunityCrawler else: member = self.dispersy.get_new_member(u"curve25519") cls = HiddenTunnelCommunity self.community = self.dispersy.define_auto_load(cls, member, (self.session, self.settings), load=True)[0] if introduce_port: self.community.add_discovered_candidate(Candidate(('127.0.0.1', introduce_port), tunnel=False))
def init_keypair(self): """ Set parameters that depend on state_dir. """ permid_module.init() # Set params that depend on state_dir # # 1. keypair # pair_filename = self.config.get_permid_keypair_filename() if os.path.exists(pair_filename): self.keypair = permid_module.read_keypair(pair_filename) else: self.keypair = permid_module.generate_keypair() # Save keypair public_key_filename = os.path.join(self.config.get_state_dir(), 'ecpub.pem') permid_module.save_keypair(self.keypair, pair_filename) permid_module.save_pub_key(self.keypair, public_key_filename) trustchain_pairfilename = self.config.get_trustchain_keypair_filename() if os.path.exists(trustchain_pairfilename): self.trustchain_keypair = permid_module.read_keypair_trustchain(trustchain_pairfilename) else: self.trustchain_keypair = permid_module.generate_keypair_trustchain() # Save keypair trustchain_pubfilename = os.path.join(self.config.get_state_dir(), 'ecpub_multichain.pem') permid_module.save_keypair_trustchain(self.trustchain_keypair, trustchain_pairfilename) permid_module.save_pub_key_trustchain(self.trustchain_keypair, trustchain_pubfilename) trustchain_testnet_pairfilename = self.config.get_trustchain_testnet_keypair_filename() if os.path.exists(trustchain_testnet_pairfilename): self.trustchain_testnet_keypair = permid_module.read_keypair_trustchain(trustchain_testnet_pairfilename) else: self.trustchain_testnet_keypair = permid_module.generate_keypair_trustchain() # Save keypair trustchain_testnet_pubfilename = os.path.join(self.config.get_state_dir(), 'ecpub_trustchain_testnet.pem') permid_module.save_keypair_trustchain(self.trustchain_testnet_keypair, trustchain_testnet_pairfilename) permid_module.save_pub_key_trustchain(self.trustchain_testnet_keypair, trustchain_testnet_pubfilename)
def __init__(self, scfg=None, ignore_singleton=False): """ A Session object is created which is configured following a copy of the SessionStartupConfig scfg. (copy constructor used internally) @param scfg SessionStartupConfig object or None, in which case we look for a saved session in the default location (state dir). If we can't find it, we create a new SessionStartupConfig() object to serve as startup config. Next, the config is saved in the directory indicated by its 'state_dir' attribute. In the current implementation only a single session instance can exist at a time in a process. The ignore_singleton flag is used for testing. """ if not ignore_singleton: if Session.__single: raise RuntimeError, "Session is singleton" Session.__single = self self.sesslock = NoDispersyRLock() # Determine startup config to use if scfg is None: # If no override try: # Then try to read from default location state_dir = Session.get_default_state_dir() cfgfilename = Session.get_default_config_filename(state_dir) scfg = SessionStartupConfig.load(cfgfilename) except: # If that fails, create a fresh config with factory defaults print_exc() scfg = SessionStartupConfig() self.sessconfig = scfg.sessconfig else: # overrides any saved config # Work from copy self.sessconfig = copy.copy(scfg.sessconfig) # Niels: 11/05/2012, turning off overlay self.sessconfig["overlay"] = 0 self.sessconfig["crawler"] = 0 # Create dir for session state, if not exist state_dir = self.sessconfig["state_dir"] if state_dir is None: state_dir = Session.get_default_state_dir() self.sessconfig["state_dir"] = state_dir if not os.path.isdir(state_dir): os.makedirs(state_dir) collected_torrent_dir = self.sessconfig["torrent_collecting_dir"] if not collected_torrent_dir: collected_torrent_dir = os.path.join(self.sessconfig["state_dir"], STATEDIR_TORRENTCOLL_DIR) self.sessconfig["torrent_collecting_dir"] = collected_torrent_dir collected_subtitles_dir = self.sessconfig.get("subtitles_collecting_dir", None) if not collected_subtitles_dir: collected_subtitles_dir = os.path.join(self.sessconfig["state_dir"], STATEDIR_SUBSCOLL_DIR) self.sessconfig["subtitles_collecting_dir"] = collected_subtitles_dir if not os.path.exists(collected_torrent_dir): os.makedirs(collected_torrent_dir) if not self.sessconfig["peer_icon_path"]: self.sessconfig["peer_icon_path"] = os.path.join(self.sessconfig["state_dir"], STATEDIR_PEERICON_DIR) # PERHAPS: load default TorrentDef and DownloadStartupConfig from state dir # Let user handle that, he's got default_state_dir, etc. # Core init # print >>sys.stderr,'Session: __init__ config is', self.sessconfig if GOTM2CRYPTO: permidmod.init() # # Set params that depend on state_dir # # 1. keypair # pairfilename = os.path.join(self.sessconfig["state_dir"], "ec.pem") if self.sessconfig["eckeypairfilename"] is None: self.sessconfig["eckeypairfilename"] = pairfilename if os.access(self.sessconfig["eckeypairfilename"], os.F_OK): # May throw exceptions self.keypair = permidmod.read_keypair(self.sessconfig["eckeypairfilename"]) else: self.keypair = permidmod.generate_keypair() # Save keypair pubfilename = os.path.join(self.sessconfig["state_dir"], "ecpub.pem") permidmod.save_keypair(self.keypair, pairfilename) permidmod.save_pub_key(self.keypair, pubfilename) # 2. Downloads persistent state dir dlpstatedir = os.path.join(self.sessconfig["state_dir"], STATEDIR_DLPSTATE_DIR) if not os.path.isdir(dlpstatedir): os.mkdir(dlpstatedir) # 3. tracker trackerdir = self.get_internal_tracker_dir() if not os.path.exists(trackerdir): os.mkdir(trackerdir) if self.sessconfig["tracker_dfile"] is None: self.sessconfig["tracker_dfile"] = os.path.join(trackerdir, "tracker.db") if self.sessconfig["tracker_allowed_dir"] is None: self.sessconfig["tracker_allowed_dir"] = trackerdir if self.sessconfig["tracker_logfile"] is None: if sys.platform == "win32": # Not "Nul:" but "nul" is /dev/null on Win32 sink = "nul" else: sink = "/dev/null" self.sessconfig["tracker_logfile"] = sink # 5. peer_icon_path if self.sessconfig["peer_icon_path"] is None: self.sessconfig["peer_icon_path"] = os.path.join(self.sessconfig["state_dir"], STATEDIR_PEERICON_DIR) if not os.path.isdir(self.sessconfig["peer_icon_path"]): os.mkdir(self.sessconfig["peer_icon_path"]) # 6. Poor man's versioning of SessionConfig, add missing # default values. Really should use PERSISTENTSTATE_CURRENTVERSION # and do conversions. for key, defvalue in sessdefaults.iteritems(): if key not in self.sessconfig: self.sessconfig[key] = defvalue if not "live_aux_seeders" in self.sessconfig: # Poor man's versioning, really should update PERSISTENTSTATE_CURRENTVERSION self.sessconfig["live_aux_seeders"] = sessdefaults["live_aux_seeders"] if not "nat_detect" in self.sessconfig: self.sessconfig["nat_detect"] = sessdefaults["nat_detect"] if not "puncturing_internal_port" in self.sessconfig: self.sessconfig["puncturing_internal_port"] = sessdefaults["puncturing_internal_port"] if not "stun_servers" in self.sessconfig: self.sessconfig["stun_servers"] = sessdefaults["stun_servers"] if not "pingback_servers" in self.sessconfig: self.sessconfig["pingback_servers"] = sessdefaults["pingback_servers"] if not "mainline_dht" in self.sessconfig: self.sessconfig["mainline_dht"] = sessdefaults["mainline_dht"] # SWIFTPROC if self.sessconfig["swiftpath"] is None: if sys.platform == "win32": self.sessconfig["swiftpath"] = os.path.join(self.sessconfig["install_dir"], "swift.exe") else: self.sessconfig["swiftpath"] = os.path.join(self.sessconfig["install_dir"], "swift") # Checkpoint startup config self.save_pstate_sessconfig() # Create handler for calling back the user via separate threads self.uch = UserCallbackHandler(self) # Create engine with network thread self.lm = TriblerLaunchMany() self.lm.register(self, self.sesslock) self.lm.start()
def __init__(self, scfg=None, ignore_singleton=False, autoload_discovery=True): """ A Session object is created which is configured following a copy of the SessionStartupConfig scfg. (copy constructor used internally) @param scfg SessionStartupConfig object or None, in which case we look for a saved session in the default location (state dir). If we can't find it, we create a new SessionStartupConfig() object to serve as startup config. Next, the config is saved in the directory indicated by its 'state_dir' attribute. In the current implementation only a single session instance can exist at a time in a process. The ignore_singleton flag is used for testing. """ addObserver(self.unhandled_error_observer) patch_crypto_be_discovery() if not ignore_singleton: if Session.__single: raise RuntimeError("Session is singleton") Session.__single = self self._logger = logging.getLogger(self.__class__.__name__) self.ignore_singleton = ignore_singleton self.sesslock = NoDispersyRLock() # Determine startup config to use if scfg is None: # If no override scfg = SessionStartupConfig.load() else: # overrides any saved config # Work from copy scfg = SessionStartupConfig(copy.copy(scfg.sessconfig)) def create_dir(fullpath): if not os.path.isdir(fullpath): os.makedirs(fullpath) def set_and_create_dir(dirname, setter, default_dir): if dirname is None: setter(default_dir) create_dir(dirname or default_dir) state_dir = scfg.get_state_dir() set_and_create_dir(state_dir, scfg.set_state_dir, state_dir) set_and_create_dir( scfg.get_torrent_store_dir(), scfg.set_torrent_store_dir, os.path.join(scfg.get_state_dir(), STATEDIR_TORRENT_STORE_DIR)) # metadata store set_and_create_dir( scfg.get_metadata_store_dir(), scfg.set_metadata_store_dir, os.path.join(scfg.get_state_dir(), STATEDIR_METADATA_STORE_DIR)) set_and_create_dir( scfg.get_peer_icon_path(), scfg.set_peer_icon_path, os.path.join(scfg.get_state_dir(), STATEDIR_PEERICON_DIR)) create_dir(os.path.join(scfg.get_state_dir(), u"sqlite")) create_dir(os.path.join(scfg.get_state_dir(), STATEDIR_DLPSTATE_DIR)) if GOTM2CRYPTO: permidmod.init() # Set params that depend on state_dir # # 1. keypair # pairfilename = scfg.get_permid_keypair_filename() if os.path.exists(pairfilename): self.keypair = permidmod.read_keypair(pairfilename) else: self.keypair = permidmod.generate_keypair() # Save keypair pubfilename = os.path.join(scfg.get_state_dir(), 'ecpub.pem') permidmod.save_keypair(self.keypair, pairfilename) permidmod.save_pub_key(self.keypair, pubfilename) multichain_pairfilename = scfg.get_multichain_permid_keypair_filename( ) if os.path.exists(multichain_pairfilename): self.multichain_keypair = permidmod.read_keypair_multichain( multichain_pairfilename) else: self.multichain_keypair = permidmod.generate_keypair_multichain( ) # Save keypair multichain_pubfilename = os.path.join(scfg.get_state_dir(), 'ecpub_multichain.pem') permidmod.save_keypair_multichain(self.multichain_keypair, multichain_pairfilename) permidmod.save_pub_key_multichain(self.multichain_keypair, multichain_pubfilename) if not scfg.get_megacache(): scfg.set_torrent_checking(0) self.sessconfig = scfg.sessconfig self.sessconfig.lock = self.sesslock self.selected_ports = scfg.selected_ports # Claim all random ports self.get_listen_port() self.get_dispersy_port() self.get_mainline_dht_listen_port() self.get_videoserver_port() self.get_anon_listen_port() self.get_tunnel_community_socks5_listen_ports() # Create handler for calling back the user via separate threads self.lm = TriblerLaunchMany() self.notifier = Notifier() # Checkpoint startup config self.save_session_config() self.sqlite_db = None self.upgrader_enabled = True self.dispersy_member = None self.readable_status = '' # Human-readable string to indicate the status during startup/shutdown of Tribler self.autoload_discovery = autoload_discovery self.tribler_config = TriblerConfig(self) self.setup_tribler_gui_config()
def __init__(self, scfg=None, ignore_singleton=False, autoload_discovery=True): """ A Session object is created which is configured following a copy of the SessionStartupConfig scfg. (copy constructor used internally) @param scfg SessionStartupConfig object or None, in which case we look for a saved session in the default location (state dir). If we can't find it, we create a new SessionStartupConfig() object to serve as startup config. Next, the config is saved in the directory indicated by its 'state_dir' attribute. In the current implementation only a single session instance can exist at a time in a process. The ignore_singleton flag is used for testing. """ if not ignore_singleton: if Session.__single: raise RuntimeError("Session is singleton") Session.__single = self self._logger = logging.getLogger(self.__class__.__name__) self.ignore_singleton = ignore_singleton self.sesslock = NoDispersyRLock() # Determine startup config to use if scfg is None: # If no override scfg = SessionStartupConfig.load() else: # overrides any saved config # Work from copy scfg = SessionStartupConfig(copy.copy(scfg.sessconfig)) def create_dir(fullpath): if not os.path.isdir(fullpath): os.makedirs(fullpath) def set_and_create_dir(dirname, setter, default_dir): if dirname is None: setter(default_dir) create_dir(dirname or default_dir) state_dir = scfg.get_state_dir() set_and_create_dir(state_dir, scfg.set_state_dir, state_dir) set_and_create_dir(scfg.get_torrent_store_dir(), scfg.set_torrent_store_dir, os.path.join(scfg.get_state_dir(), STATEDIR_TORRENT_STORE_DIR)) # metadata store set_and_create_dir(scfg.get_metadata_store_dir(), scfg.set_metadata_store_dir, os.path.join(scfg.get_state_dir(), STATEDIR_METADATA_STORE_DIR)) set_and_create_dir(scfg.get_peer_icon_path(), scfg.set_peer_icon_path, os.path.join(scfg.get_state_dir(), STATEDIR_PEERICON_DIR)) create_dir(os.path.join(scfg.get_state_dir(), u"sqlite")) create_dir(os.path.join(scfg.get_state_dir(), STATEDIR_DLPSTATE_DIR)) # Reset the nickname to something not related to the host name, it was # really silly to have this default on the first place. # TODO: Maybe move this to the upgrader? if socket.gethostname() in scfg.get_nickname(): scfg.set_nickname("Tribler user") if GOTM2CRYPTO: permidmod.init() # Set params that depend on state_dir # # 1. keypair # pairfilename = scfg.get_permid_keypair_filename() if os.access(pairfilename, os.F_OK): # May throw exceptions self.keypair = permidmod.read_keypair(pairfilename) else: self.keypair = permidmod.generate_keypair() # Save keypair pubfilename = os.path.join(scfg.get_state_dir(), 'ecpub.pem') permidmod.save_keypair(self.keypair, pairfilename) permidmod.save_pub_key(self.keypair, pubfilename) if not scfg.get_megacache(): scfg.set_torrent_checking(0) self.sessconfig = scfg.sessconfig self.sessconfig.lock = self.sesslock self.selected_ports = scfg.selected_ports # Claim all random ports self.get_listen_port() self.get_dispersy_port() self.get_mainline_dht_listen_port() self.get_videoplayer_port() self.get_anon_listen_port() self.get_tunnel_community_socks5_listen_ports() # Create handler for calling back the user via separate threads self.lm = TriblerLaunchMany() self.notifier = Notifier(use_pool=True) # Checkpoint startup config self.save_pstate_sessconfig() self.sqlite_db = None self.autoload_discovery = autoload_discovery
def __init__(self, scfg=None, ignore_singleton=False): """ A Session object is created which is configured following a copy of the SessionStartupConfig scfg. (copy constructor used internally) @param scfg SessionStartupConfig object or None, in which case we look for a saved session in the default location (state dir). If we can't find it, we create a new SessionStartupConfig() object to serve as startup config. Next, the config is saved in the directory indicated by its 'state_dir' attribute. In the current implementation only a single session instance can exist at a time in a process. The ignore_singleton flag is used for testing. """ if not ignore_singleton: if Session.__single: raise RuntimeError, "Session is singleton" Session.__single = self self.sesslock = NoDispersyRLock() # Determine startup config to use if scfg is None: # If no override try: # Then try to read from default location state_dir = Session.get_default_state_dir() cfgfilename = Session.get_default_config_filename(state_dir) scfg = SessionStartupConfig.load(cfgfilename) except: # If that fails, create a fresh config with factory defaults print_exc() scfg = SessionStartupConfig() self.sessconfig = scfg.sessconfig else: # overrides any saved config # Work from copy self.sessconfig = copy.copy(scfg.sessconfig) # Niels: 11/05/2012, turning off overlay self.sessconfig['overlay'] = 0 self.sessconfig['crawler'] = 0 # Create dir for session state, if not exist state_dir = self.sessconfig['state_dir'] if state_dir and not os.path.isdir(state_dir): try: os.makedirs(state_dir) except: state_dir = None if state_dir is None: state_dir = Session.get_default_state_dir() self.sessconfig['state_dir'] = state_dir if not os.path.isdir(state_dir): os.makedirs(state_dir) collected_torrent_dir = self.sessconfig['torrent_collecting_dir'] if not collected_torrent_dir: collected_torrent_dir = os.path.join(self.sessconfig['state_dir'], STATEDIR_TORRENTCOLL_DIR) self.sessconfig['torrent_collecting_dir'] = collected_torrent_dir collected_subtitles_dir = self.sessconfig.get('subtitles_collecting_dir', None) if not collected_subtitles_dir: collected_subtitles_dir = os.path.join(self.sessconfig['state_dir'], STATEDIR_SUBSCOLL_DIR) self.sessconfig['subtitles_collecting_dir'] = collected_subtitles_dir if not os.path.exists(collected_torrent_dir): os.makedirs(collected_torrent_dir) if not self.sessconfig['peer_icon_path']: self.sessconfig['peer_icon_path'] = os.path.join(self.sessconfig['state_dir'], STATEDIR_PEERICON_DIR) # PERHAPS: load default TorrentDef and DownloadStartupConfig from state dir # Let user handle that, he's got default_state_dir, etc. # Core init # print >>sys.stderr,'Session: __init__ config is', self.sessconfig if GOTM2CRYPTO: permidmod.init() # # Set params that depend on state_dir # # 1. keypair # pairfilename = os.path.join(self.sessconfig['state_dir'], 'ec.pem') if self.sessconfig['eckeypairfilename'] is None: self.sessconfig['eckeypairfilename'] = pairfilename if os.access(self.sessconfig['eckeypairfilename'], os.F_OK): # May throw exceptions self.keypair = permidmod.read_keypair(self.sessconfig['eckeypairfilename']) else: self.keypair = permidmod.generate_keypair() # Save keypair pubfilename = os.path.join(self.sessconfig['state_dir'], 'ecpub.pem') permidmod.save_keypair(self.keypair, pairfilename) permidmod.save_pub_key(self.keypair, pubfilename) # 2. Downloads persistent state dir dlpstatedir = os.path.join(self.sessconfig['state_dir'], STATEDIR_DLPSTATE_DIR) if not os.path.isdir(dlpstatedir): os.mkdir(dlpstatedir) # 3. tracker trackerdir = self.get_internal_tracker_dir() if not os.path.exists(trackerdir): os.mkdir(trackerdir) if self.sessconfig['tracker_dfile'] is None: self.sessconfig['tracker_dfile'] = os.path.join(trackerdir, 'tracker.db') if self.sessconfig['tracker_allowed_dir'] is None: self.sessconfig['tracker_allowed_dir'] = trackerdir if self.sessconfig['tracker_logfile'] is None: if sys.platform == "win32": # Not "Nul:" but "nul" is /dev/null on Win32 sink = 'nul' else: sink = '/dev/null' self.sessconfig['tracker_logfile'] = sink # 5. peer_icon_path if self.sessconfig['peer_icon_path'] is None: self.sessconfig['peer_icon_path'] = os.path.join(self.sessconfig['state_dir'], STATEDIR_PEERICON_DIR) if not os.path.isdir(self.sessconfig['peer_icon_path']): os.mkdir(self.sessconfig['peer_icon_path']) # 6. Poor man's versioning of SessionConfig, add missing # default values. Really should use PERSISTENTSTATE_CURRENTVERSION # and do conversions. for key, defvalue in sessdefaults.iteritems(): if key not in self.sessconfig: self.sessconfig[key] = defvalue if not 'live_aux_seeders' in self.sessconfig: # Poor man's versioning, really should update PERSISTENTSTATE_CURRENTVERSION self.sessconfig['live_aux_seeders'] = sessdefaults['live_aux_seeders'] if not 'nat_detect' in self.sessconfig: self.sessconfig['nat_detect'] = sessdefaults['nat_detect'] if not 'puncturing_internal_port' in self.sessconfig: self.sessconfig['puncturing_internal_port'] = sessdefaults['puncturing_internal_port'] if not 'stun_servers' in self.sessconfig: self.sessconfig['stun_servers'] = sessdefaults['stun_servers'] if not 'pingback_servers' in self.sessconfig: self.sessconfig['pingback_servers'] = sessdefaults['pingback_servers'] if not 'mainline_dht' in self.sessconfig: self.sessconfig['mainline_dht'] = sessdefaults['mainline_dht'] # SWIFTPROC if self.sessconfig['swiftpath'] is None: if sys.platform == "win32": self.sessconfig['swiftpath'] = os.path.join(self.sessconfig['install_dir'], "swift.exe") else: self.sessconfig['swiftpath'] = os.path.join(self.sessconfig['install_dir'], "swift") # Checkpoint startup config self.save_pstate_sessconfig() # Create handler for calling back the user via separate threads self.uch = UserCallbackHandler(self) # Create engine with network thread self.lm = TriblerLaunchMany() self.lm.register(self, self.sesslock) self.lm.start()
def register(self, session, sesslock): if not self.registered: self.registered = True self.session = session self.sesslock = sesslock self.downloads = {} config = session.sessconfig # Should be safe at startup self.upnp_ports = [] # Orig self.sessdoneflag = Event() self.rawserver = RawServer(self.sessdoneflag, config['timeout_check_interval'], config['timeout'], ipv6_enable=config['ipv6_enabled'], failfunc=self.rawserver_fatalerrorfunc, errorfunc=self.rawserver_nonfatalerrorfunc) self.rawserver.add_task(self.rawserver_keepalive, 1) self.listen_port = config['minport'] self.shutdownstarttime = None self.multihandler = MultiHandler(self.rawserver, self.sessdoneflag) # SWIFTPROC swift_exists = config['swiftproc'] and (os.path.exists(config['swiftpath']) or os.path.exists(config['swiftpath'] + '.exe')) if swift_exists: from Tribler.Core.Swift.SwiftProcessMgr import SwiftProcessMgr self.spm = SwiftProcessMgr(config['swiftpath'], config['swiftcmdlistenport'], config['swiftdlsperproc'], self.session.get_swift_tunnel_listen_port(), self.sesslock) try: self.swift_process = self.spm.get_or_create_sp(self.session.get_swift_working_dir(), self.session.get_torrent_collecting_dir(), self.session.get_swift_tunnel_listen_port(), self.session.get_swift_tunnel_httpgw_listen_port(), self.session.get_swift_tunnel_cmdgw_listen_port()) self.upnp_ports.append((self.session.get_swift_tunnel_listen_port(), 'UDP')) except OSError: # could not find/run swift print >> sys.stderr, "lmc: could not start a swift process" else: self.spm = None self.swift_process = None # Dispersy self.session.dispersy_member = None if config['dispersy']: from Tribler.dispersy.callback import Callback from Tribler.dispersy.dispersy import Dispersy from Tribler.dispersy.endpoint import RawserverEndpoint, TunnelEndpoint from Tribler.dispersy.community import HardKilledCommunity # set communication endpoint if config['dispersy-tunnel-over-swift'] and self.swift_process: endpoint = TunnelEndpoint(self.swift_process) else: endpoint = RawserverEndpoint(self.rawserver, config['dispersy_port']) callback = Callback("Dispersy") # WARNING NAME SIGNIFICANT working_directory = unicode(config['state_dir']) self.dispersy = Dispersy(callback, endpoint, working_directory) # TODO: see if we can postpone dispersy.start to improve GUI responsiveness. # However, for now we must start self.dispersy.callback before running # try_register(nocachedb, self.database_thread)! self.dispersy.start() print >> sys.stderr, "lmc: Dispersy is listening on port", self.dispersy.wan_address[1], "using", endpoint self.upnp_ports.append((self.dispersy.wan_address[1], 'UDP')) self.dispersy.callback.call(self.dispersy.define_auto_load, args=(HardKilledCommunity,), kargs={'load': True}) # notify dispersy finished loading self.session.uch.notify(NTFY_DISPERSY, NTFY_STARTED, None) from Tribler.Core.permid import read_keypair from Tribler.dispersy.crypto import ec_to_public_bin, ec_to_private_bin keypair = read_keypair(self.session.get_permid_keypair_filename()) self.session.dispersy_member = callback.call(self.dispersy.get_member, (ec_to_public_bin(keypair), ec_to_private_bin(keypair))) self.database_thread = callback else: class FakeCallback(): def __init__(self): from Tribler.Utilities.TimedTaskQueue import TimedTaskQueue self.queue = TimedTaskQueue("FakeCallback") def register(self, call, args=(), kargs=None, delay=0.0, priority=0, id_=u"", callback=None, callback_args=(), callback_kargs=None, include_id=False): def do_task(): if kargs: call(*args, **kargs) else: call(*args) if callback: if callback_kargs: callback(*callback_args, **callback_kargs) else: callback(*callback_args) self.queue.add_task(do_task, t=delay) def shutdown(self, immediately=False): self.queue.shutdown(immediately) self.database_thread = FakeCallback() if config['megacache']: import Tribler.Core.CacheDB.cachedb as cachedb from Tribler.Core.CacheDB.SqliteCacheDBHandler import PeerDBHandler, TorrentDBHandler, MyPreferenceDBHandler, VoteCastDBHandler, ChannelCastDBHandler, NetworkBuzzDBHandler, UserEventLogDBHandler from Tribler.Category.Category import Category from Tribler.Core.Tag.Extraction import TermExtraction from Tribler.Core.CacheDB.sqlitecachedb import try_register if DEBUG: print >> sys.stderr, 'tlm: Reading Session state from', config['state_dir'] nocachedb = cachedb.init(config, self.rawserver_fatalerrorfunc) try_register(nocachedb, self.database_thread) self.cat = Category.getInstance(config['install_dir']) self.term = TermExtraction.getInstance(config['install_dir']) self.peer_db = PeerDBHandler.getInstance() self.peer_db.registerConnectionUpdater(self.session) self.torrent_db = TorrentDBHandler.getInstance() self.torrent_db.register(os.path.abspath(config['torrent_collecting_dir'])) self.mypref_db = MyPreferenceDBHandler.getInstance() self.votecast_db = VoteCastDBHandler.getInstance() self.votecast_db.registerSession(self.session) self.channelcast_db = ChannelCastDBHandler.getInstance() self.channelcast_db.registerSession(self.session) self.nb_db = NetworkBuzzDBHandler.getInstance() self.ue_db = UserEventLogDBHandler.getInstance() if self.dispersy: self.dispersy.database.attach_commit_callback(self.channelcast_db._db.commitNow) else: config['torrent_checking'] = 0 self.rtorrent_handler = None if config['torrent_collecting']: from Tribler.Core.RemoteTorrentHandler import RemoteTorrentHandler self.rtorrent_handler = RemoteTorrentHandler()
def register(self, session, sesslock): if not self.registered: self.registered = True self.session = session self.sesslock = sesslock self.downloads = {} config = session.sessconfig # Should be safe at startup self.upnp_ports = [] # Orig self.sessdoneflag = Event() self.rawserver = RawServer( self.sessdoneflag, config['timeout_check_interval'], config['timeout'], ipv6_enable=config['ipv6_enabled'], failfunc=self.rawserver_fatalerrorfunc, errorfunc=self.rawserver_nonfatalerrorfunc) self.rawserver.add_task(self.rawserver_keepalive, 1) self.listen_port = config['minport'] self.shutdownstarttime = None self.multihandler = MultiHandler(self.rawserver, self.sessdoneflag) # SWIFTPROC swift_exists = config['swiftproc'] and ( os.path.exists(config['swiftpath']) or os.path.exists(config['swiftpath'] + '.exe')) if swift_exists: from Tribler.Core.Swift.SwiftProcessMgr import SwiftProcessMgr self.spm = SwiftProcessMgr( config['swiftpath'], config['swiftcmdlistenport'], config['swiftdlsperproc'], self.session.get_swift_tunnel_listen_port(), self.sesslock) try: self.swift_process = self.spm.get_or_create_sp( self.session.get_swift_working_dir(), self.session.get_torrent_collecting_dir(), self.session.get_swift_tunnel_listen_port(), self.session.get_swift_tunnel_httpgw_listen_port(), self.session.get_swift_tunnel_cmdgw_listen_port()) self.upnp_ports.append( (self.session.get_swift_tunnel_listen_port(), 'UDP')) except OSError: # could not find/run swift print >> sys.stderr, "lmc: could not start a swift process" else: self.spm = None self.swift_process = None # Dispersy self.session.dispersy_member = None if config['dispersy']: from Tribler.dispersy.callback import Callback from Tribler.dispersy.dispersy import Dispersy from Tribler.dispersy.endpoint import RawserverEndpoint, TunnelEndpoint from Tribler.dispersy.community import HardKilledCommunity # set communication endpoint if config['dispersy-tunnel-over-swift'] and self.swift_process: endpoint = TunnelEndpoint(self.swift_process) else: endpoint = RawserverEndpoint(self.rawserver, config['dispersy_port']) callback = Callback("Dispersy") # WARNING NAME SIGNIFICANT working_directory = unicode(config['state_dir']) self.dispersy = Dispersy(callback, endpoint, working_directory) # TODO: see if we can postpone dispersy.start to improve GUI responsiveness. # However, for now we must start self.dispersy.callback before running # try_register(nocachedb, self.database_thread)! self.dispersy.start() print >> sys.stderr, "lmc: Dispersy is listening on port", self.dispersy.wan_address[ 1], "using", endpoint self.upnp_ports.append((self.dispersy.wan_address[1], 'UDP')) self.dispersy.callback.call(self.dispersy.define_auto_load, args=(HardKilledCommunity, ), kargs={'load': True}) # notify dispersy finished loading self.session.uch.notify(NTFY_DISPERSY, NTFY_STARTED, None) from Tribler.Core.permid import read_keypair from Tribler.dispersy.crypto import ec_to_public_bin, ec_to_private_bin keypair = read_keypair( self.session.get_permid_keypair_filename()) self.session.dispersy_member = callback.call( self.dispersy.get_member, (ec_to_public_bin(keypair), ec_to_private_bin(keypair))) self.database_thread = callback else: class FakeCallback(): def __init__(self): from Tribler.Utilities.TimedTaskQueue import TimedTaskQueue self.queue = TimedTaskQueue("FakeCallback") def register(self, call, args=(), kargs=None, delay=0.0, priority=0, id_=u"", callback=None, callback_args=(), callback_kargs=None, include_id=False): def do_task(): if kargs: call(*args, **kargs) else: call(*args) if callback: if callback_kargs: callback(*callback_args, **callback_kargs) else: callback(*callback_args) self.queue.add_task(do_task, t=delay) def shutdown(self, immediately=False): self.queue.shutdown(immediately) self.database_thread = FakeCallback() if config['megacache']: import Tribler.Core.CacheDB.cachedb as cachedb from Tribler.Core.CacheDB.SqliteCacheDBHandler import PeerDBHandler, TorrentDBHandler, MyPreferenceDBHandler, VoteCastDBHandler, ChannelCastDBHandler, NetworkBuzzDBHandler, UserEventLogDBHandler from Tribler.Category.Category import Category from Tribler.Core.Tag.Extraction import TermExtraction from Tribler.Core.CacheDB.sqlitecachedb import try_register if DEBUG: print >> sys.stderr, 'tlm: Reading Session state from', config[ 'state_dir'] nocachedb = cachedb.init(config, self.rawserver_fatalerrorfunc) try_register(nocachedb, self.database_thread) self.cat = Category.getInstance(config['install_dir']) self.term = TermExtraction.getInstance(config['install_dir']) self.peer_db = PeerDBHandler.getInstance() self.peer_db.registerConnectionUpdater(self.session) self.torrent_db = TorrentDBHandler.getInstance() self.torrent_db.register( os.path.abspath(config['torrent_collecting_dir'])) self.mypref_db = MyPreferenceDBHandler.getInstance() self.votecast_db = VoteCastDBHandler.getInstance() self.votecast_db.registerSession(self.session) self.channelcast_db = ChannelCastDBHandler.getInstance() self.channelcast_db.registerSession(self.session) self.nb_db = NetworkBuzzDBHandler.getInstance() self.ue_db = UserEventLogDBHandler.getInstance() if self.dispersy: self.dispersy.database.attach_commit_callback( self.channelcast_db._db.commitNow) else: config['torrent_checking'] = 0 self.rtorrent_handler = None if config['torrent_collecting']: from Tribler.Core.RemoteTorrentHandler import RemoteTorrentHandler self.rtorrent_handler = RemoteTorrentHandler()
def __init__(self, scfg=None, ignore_singleton=False): """ A Session object is created which is configured following a copy of the SessionStartupConfig scfg. (copy constructor used internally) @param scfg SessionStartupConfig object or None, in which case we look for a saved session in the default location (state dir). If we can't find it, we create a new SessionStartupConfig() object to serve as startup config. Next, the config is saved in the directory indicated by its 'state_dir' attribute. In the current implementation only a single session instance can exist at a time in a process. The ignore_singleton flag is used for testing. """ if not ignore_singleton: if Session.__single: raise RuntimeError("Session is singleton") Session.__single = self self.ignore_singleton = ignore_singleton self.sesslock = NoDispersyRLock() # Determine startup config to use if scfg is None: # If no override try: # Then try to read from default location state_dir = Session.get_default_state_dir() cfgfilename = Session.get_default_config_filename(state_dir) scfg = SessionStartupConfig.load(cfgfilename) except: # If that fails, create a fresh config with factory defaults print_exc() scfg = SessionStartupConfig() self.sessconfig = scfg.sessconfig else: # overrides any saved config # Work from copy self.sessconfig = copy.copy(scfg.sessconfig) def create_dir(fullpath): if not os.path.isdir(fullpath): os.makedirs(fullpath) def set_and_create_dir(config, name, default_dir): dirname = config.get(name, None) if dirname is None: config[name] = default_dir create_dir(config[name]) set_and_create_dir(self.sessconfig, 'state_dir', Session.get_default_state_dir()) set_and_create_dir(self.sessconfig, 'torrent_collecting_dir', os.path.join(self.sessconfig['state_dir'], STATEDIR_TORRENTCOLL_DIR)) set_and_create_dir(self.sessconfig, 'swiftmetadir', os.path.join(self.sessconfig['state_dir'], STATEDIR_SWIFTRESEED_DIR)) set_and_create_dir(self.sessconfig, 'peer_icon_path', os.path.join(self.sessconfig['state_dir'], STATEDIR_PEERICON_DIR)) create_dir(os.path.join(self.sessconfig['state_dir'], STATEDIR_DLPSTATE_DIR)) # Poor man's versioning of SessionConfig, add missing # default values. Really should use PERSISTENTSTATE_CURRENTVERSION # and do conversions. for key, defvalue in sessdefaults.iteritems(): if key not in self.sessconfig: self.sessconfig[key] = defvalue if self.sessconfig['nickname'] == '__default_name__': self.sessconfig['nickname'] = socket.gethostname() # SWIFTPROC if self.sessconfig['swiftpath'] is None: if sys.platform == "win32": self.sessconfig['swiftpath'] = os.path.join(self.sessconfig['install_dir'], "swift.exe") else: self.sessconfig['swiftpath'] = os.path.join(self.sessconfig['install_dir'], "swift") if GOTM2CRYPTO: permidmod.init() # Set params that depend on state_dir # # 1. keypair # pairfilename = os.path.join(self.sessconfig['state_dir'], 'ec.pem') if self.sessconfig['eckeypairfilename'] is None: self.sessconfig['eckeypairfilename'] = pairfilename if os.access(self.sessconfig['eckeypairfilename'], os.F_OK): # May throw exceptions self.keypair = permidmod.read_keypair(self.sessconfig['eckeypairfilename']) else: self.keypair = permidmod.generate_keypair() # Save keypair pubfilename = os.path.join(self.sessconfig['state_dir'], 'ecpub.pem') permidmod.save_keypair(self.keypair, pairfilename) permidmod.save_pub_key(self.keypair, pubfilename) # Checkpoint startup config self.save_pstate_sessconfig()