Search in sources :

Example 1 with Peer

use of com.biglybt.pif.peers.Peer in project BiglyBT by BiglySoftware.

the class SpeedLimitHandler method peersAdded.

private void peersAdded(Download download, PeerManager peer_manager, Peer[] peers) {
    IPSet[] sets;
    long[][][] set_ranges;
    Set[] set_ccs;
    Set[] set_nets;
    boolean has_ccs = false;
    boolean has_nets = false;
    Set<String> category_or_tags = null;
    TagManager tm = TagManagerFactory.getTagManager();
    synchronized (this) {
        int len = current_ip_sets.size();
        sets = new IPSet[len];
        set_ranges = new long[len][][];
        set_ccs = new Set[len];
        set_nets = new Set[len];
        int pos = 0;
        for (IPSet set : current_ip_sets.values()) {
            sets[pos] = set;
            set_ranges[pos] = set.getRanges();
            set_ccs[pos] = set.getCountryCodes();
            set_nets[pos] = set.getNetworks();
            if (set_ccs[pos].size() > 0) {
                has_ccs = true;
            }
            if (set_nets[pos].size() > 0) {
                has_nets = true;
            }
            pos++;
            if (category_or_tags == null && set.getCategoriesOrTags() != null) {
                category_or_tags = new HashSet<>();
                String cat = download.getAttribute(category_attribute);
                if (cat != null && cat.length() > 0) {
                    category_or_tags.add(cat);
                }
                List<Tag> tags = tm.getTagsForTaggable(TagType.TT_DOWNLOAD_MANUAL, PluginCoreUtils.unwrap(download));
                for (Tag t : tags) {
                    category_or_tags.add(t.getTagName(true));
                }
            }
        }
    }
    if (sets.length == 0) {
        return;
    }
    for (Peer peer : peers) {
        List<RateLimiter> rlu_tbr;
        List<RateLimiter> rld_tbr;
        synchronized (RL_TO_BE_REMOVED_LOCK) {
            rlu_tbr = (List<RateLimiter>) peer.getUserData(RLU_TO_BE_REMOVED_KEY);
            rld_tbr = (List<RateLimiter>) peer.getUserData(RLD_TO_BE_REMOVED_KEY);
            if (rlu_tbr != null) {
                peer.setUserData(RLU_TO_BE_REMOVED_KEY, null);
            }
            if (rld_tbr != null) {
                peer.setUserData(RLD_TO_BE_REMOVED_KEY, null);
            }
        }
        try {
            long[] entry = (long[]) peer.getUserData(ip_set_peer_key);
            long l_address;
            if (entry == null) {
                l_address = 0;
                String ip = peer.getIp();
                if (!ip.contains(":")) {
                    byte[] bytes = HostNameToIPResolver.hostAddressToBytes(ip);
                    if (bytes != null) {
                        l_address = ((long) ((bytes[0] << 24) & 0xff000000 | (bytes[1] << 16) & 0x00ff0000 | (bytes[2] << 8) & 0x0000ff00 | bytes[3] & 0x000000ff)) & 0xffffffffL;
                    }
                }
                entry = new long[] { l_address };
                peer.setUserData(ip_set_peer_key, entry);
            } else {
                l_address = entry[0];
            }
            String peer_cc = null;
            String peer_net = null;
            if (has_ccs) {
                String[] details = PeerUtils.getCountryDetails(peer);
                if (details != null && details.length > 0) {
                    peer_cc = details[0];
                }
            }
            if (has_nets) {
                peer_net = AENetworkClassifier.categoriseAddress(peer.getIp());
            }
            Set<IPSet> added_to_sets = new HashSet<>();
            if (l_address != 0) {
                for (int i = 0; i < set_ranges.length; i++) {
                    long[][] ranges = set_ranges[i];
                    if (ranges.length == 0) {
                        continue;
                    }
                    IPSet set = sets[i];
                    boolean is_inverse = set.isInverse();
                    Set<String> set_cats_or_tags = set.getCategoriesOrTags();
                    if (set_cats_or_tags == null || new HashSet<>(set_cats_or_tags).removeAll(category_or_tags)) {
                        boolean hit = false;
                        for (long[] range : ranges) {
                            if (l_address >= range[0] && l_address <= range[1]) {
                                hit = true;
                                if (!is_inverse) {
                                    addLimiters(peer_manager, peer, set, rlu_tbr, rld_tbr);
                                    added_to_sets.add(set);
                                }
                                break;
                            }
                        }
                        if (is_inverse && !hit) {
                            addLimiters(peer_manager, peer, set, rlu_tbr, rld_tbr);
                            added_to_sets.add(set);
                        }
                    }
                }
            }
            if (peer_cc != null) {
                for (int i = 0; i < set_ccs.length; i++) {
                    IPSet set = sets[i];
                    if (added_to_sets.contains(set)) {
                        continue;
                    }
                    Set<String> ccs = set_ccs[i];
                    if (ccs.size() == 0) {
                        continue;
                    }
                    boolean not_inverse = !set.isInverse();
                    Set<String> set_cats_or_tags = set.getCategoriesOrTags();
                    if (set_cats_or_tags == null || new HashSet<>(set_cats_or_tags).removeAll(category_or_tags)) {
                        boolean hit = ccs.contains(peer_cc);
                        if (hit == not_inverse) {
                            addLimiters(peer_manager, peer, set, rlu_tbr, rld_tbr);
                            added_to_sets.add(set);
                        }
                    }
                }
            }
            if (peer_net != null) {
                String pub_peer_net = null;
                String pub_lan = null;
                if (peer_net == AENetworkClassifier.AT_PUBLIC) {
                    try {
                        byte[] address = InetAddress.getByName(peer.getIp()).getAddress();
                        pub_peer_net = address.length == 4 ? NET_IPV4 : NET_IPV6;
                    } catch (Throwable e) {
                    }
                    if (peer.isLANLocal()) {
                        pub_lan = NET_LAN;
                    } else {
                        pub_lan = NET_WAN;
                    }
                }
                for (int i = 0; i < set_nets.length; i++) {
                    IPSet set = sets[i];
                    if (added_to_sets.contains(set)) {
                        continue;
                    }
                    Set<String> nets = set_nets[i];
                    if (nets.size() == 0) {
                        continue;
                    }
                    boolean not_inverse = !set.isInverse();
                    Set<String> set_cats_or_tags = set.getCategoriesOrTags();
                    if (set_cats_or_tags == null || new HashSet<>(set_cats_or_tags).removeAll(category_or_tags)) {
                        boolean hit = nets.contains(peer_net);
                        if (!hit) {
                            if (pub_peer_net != null) {
                                hit = nets.contains(pub_peer_net);
                            }
                            if (!hit && pub_lan != null) {
                                hit = nets.contains(pub_lan);
                            }
                        }
                        if (hit == not_inverse) {
                            addLimiters(peer_manager, peer, set, rlu_tbr, rld_tbr);
                            added_to_sets.add(set);
                        }
                    }
                }
            }
        } finally {
            if (rlu_tbr != null) {
                for (RateLimiter l : rlu_tbr) {
                    peer.removeRateLimiter(l, true);
                }
            }
            if (rld_tbr != null) {
                for (RateLimiter l : rld_tbr) {
                    peer.removeRateLimiter(l, false);
                }
            }
        }
    }
}
Also used : PEPeer(com.biglybt.core.peer.PEPeer) Peer(com.biglybt.pif.peers.Peer) RateLimiter(com.biglybt.pif.network.RateLimiter)

Example 2 with Peer

use of com.biglybt.pif.peers.Peer in project BiglyBT by BiglySoftware.

the class PluginCoreUtils method convert.

public static Object convert(Object datasource, boolean toCore) {
    if (datasource instanceof Object[]) {
        Object[] array = (Object[]) datasource;
        Object[] newArray = new Object[array.length];
        for (int i = 0; i < array.length; i++) {
            Object o = array[i];
            newArray[i] = convert(o, toCore);
        }
        return newArray;
    }
    try {
        if (toCore) {
            if (datasource instanceof com.biglybt.core.download.DownloadManager) {
                return datasource;
            }
            if (datasource instanceof DownloadImpl) {
                return ((DownloadImpl) datasource).getDownload();
            }
            if (datasource instanceof com.biglybt.core.disk.DiskManager) {
                return datasource;
            }
            if (datasource instanceof DiskManagerImpl) {
                return ((DiskManagerImpl) datasource).getDiskmanager();
            }
            if (datasource instanceof PEPeerManager) {
                return datasource;
            }
            if (datasource instanceof PeerManagerImpl) {
                return ((PeerManagerImpl) datasource).getDelegate();
            }
            if (datasource instanceof PEPeer) {
                return datasource;
            }
            if (datasource instanceof PeerImpl) {
                return ((PeerImpl) datasource).getPEPeer();
            }
            if (datasource instanceof com.biglybt.core.disk.DiskManagerFileInfo) {
                return datasource;
            }
            if (datasource instanceof com.biglybt.pifimpl.local.disk.DiskManagerFileInfoImpl) {
                return ((com.biglybt.pifimpl.local.disk.DiskManagerFileInfoImpl) datasource).getCore();
            }
            if (datasource instanceof TRHostTorrent) {
                return datasource;
            }
            if (datasource instanceof TrackerTorrentImpl) {
                ((TrackerTorrentImpl) datasource).getHostTorrent();
            }
        } else {
            // to PI
            if (datasource instanceof com.biglybt.core.download.DownloadManager) {
                return wrap((com.biglybt.core.download.DownloadManager) datasource);
            }
            if (datasource instanceof DownloadImpl) {
                return datasource;
            }
            if (datasource instanceof com.biglybt.core.disk.DiskManager) {
                return wrap((com.biglybt.core.disk.DiskManager) datasource);
            }
            if (datasource instanceof DiskManagerImpl) {
                return datasource;
            }
            if (datasource instanceof PEPeerManager) {
                return wrap((PEPeerManager) datasource);
            }
            if (datasource instanceof PeerManagerImpl) {
                return datasource;
            }
            if (datasource instanceof PEPeer) {
                return PeerManagerImpl.getPeerForPEPeer((PEPeer) datasource);
            }
            if (datasource instanceof Peer) {
                return datasource;
            }
            if (datasource instanceof com.biglybt.core.disk.DiskManagerFileInfo) {
                DiskManagerFileInfo fileInfo = (com.biglybt.core.disk.DiskManagerFileInfo) datasource;
                if (fileInfo != null) {
                    try {
                        DownloadManager dm = fileInfo.getDownloadManager();
                        return new com.biglybt.pifimpl.local.disk.DiskManagerFileInfoImpl(dm == null ? null : DownloadManagerImpl.getDownloadStatic(dm), fileInfo);
                    } catch (DownloadException e) {
                    /* Ignore */
                    }
                }
            }
            if (datasource instanceof com.biglybt.pifimpl.local.disk.DiskManagerFileInfoImpl) {
                return datasource;
            }
            if (datasource instanceof TRHostTorrent) {
                TRHostTorrent item = (TRHostTorrent) datasource;
                return new TrackerTorrentImpl(item);
            }
            if (datasource instanceof TrackerTorrentImpl) {
                return datasource;
            }
        }
    } catch (Throwable t) {
        Debug.out(t);
    }
    return datasource;
}
Also used : PEPeer(com.biglybt.core.peer.PEPeer) DiskManagerFileInfo(com.biglybt.core.disk.DiskManagerFileInfo) DiskManagerImpl(com.biglybt.pifimpl.local.disk.DiskManagerImpl) PEPeer(com.biglybt.core.peer.PEPeer) Peer(com.biglybt.pif.peers.Peer) DownloadImpl(com.biglybt.pifimpl.local.download.DownloadImpl) DiskManager(com.biglybt.pif.disk.DiskManager) TRHostTorrent(com.biglybt.core.tracker.host.TRHostTorrent) TrackerTorrentImpl(com.biglybt.pifimpl.local.tracker.TrackerTorrentImpl) DownloadManager(com.biglybt.core.download.DownloadManager) DiskManagerFileInfoImpl(com.biglybt.pifimpl.local.disk.DiskManagerFileInfoImpl) PeerManagerImpl(com.biglybt.pifimpl.local.peers.PeerManagerImpl) PeerImpl(com.biglybt.pifimpl.local.peers.PeerImpl) DownloadException(com.biglybt.pif.download.DownloadException) PEPeerManager(com.biglybt.core.peer.PEPeerManager)

Example 3 with Peer

use of com.biglybt.pif.peers.Peer in project BiglyBT by BiglySoftware.

the class SpeedLimitHandler method checkIPSetsSupport.

private synchronized void checkIPSetsSupport() {
    final com.biglybt.pif.download.DownloadManager download_manager = plugin_interface.getDownloadManager();
    if (current_dml != null) {
        current_dml.destroy();
        current_dml = null;
    }
    Download[] downloads = download_manager.getDownloads();
    for (Download dm : downloads) {
        PeerManager pm = dm.getPeerManager();
        if (pm != null) {
            Peer[] peers = pm.getPeers();
            for (Peer peer : peers) {
                RateLimiter[] lims = peer.getRateLimiters(false);
                for (RateLimiter l : lims) {
                    if (ip_set_rate_limiters_down.containsValue(l)) {
                        synchronized (RL_TO_BE_REMOVED_LOCK) {
                            List<RateLimiter> to_be_removed = (List<RateLimiter>) peer.getUserData(RLD_TO_BE_REMOVED_KEY);
                            if (to_be_removed == null) {
                                to_be_removed = new ArrayList<>();
                                peer.setUserData(RLD_TO_BE_REMOVED_KEY, to_be_removed);
                            }
                            to_be_removed.add(l);
                        }
                    // defer as removing the rate limiter and then re-adding it gives time for
                    // quite a lot to happen in between
                    // peer.removeRateLimiter( l , false );
                    }
                }
                lims = peer.getRateLimiters(true);
                for (RateLimiter l : lims) {
                    if (ip_set_rate_limiters_up.containsValue(l)) {
                        synchronized (RL_TO_BE_REMOVED_LOCK) {
                            List<RateLimiter> to_be_removed = (List<RateLimiter>) peer.getUserData(RLU_TO_BE_REMOVED_KEY);
                            if (to_be_removed == null) {
                                to_be_removed = new ArrayList<>();
                                peer.setUserData(RLU_TO_BE_REMOVED_KEY, to_be_removed);
                            }
                            to_be_removed.add(l);
                        }
                    // peer.removeRateLimiter( l , true );
                    }
                }
            }
        }
    }
    ip_set_rate_limiters_down.clear();
    ip_set_rate_limiters_up.clear();
    boolean has_cats_or_tags = false;
    for (IPSet set : current_ip_sets.values()) {
        ip_set_rate_limiters_down.put(set.getName(), set.getDownLimiter());
        ip_set_rate_limiters_up.put(set.getName(), set.getUpLimiter());
        if (set.getCategoriesOrTags() != null) {
            has_cats_or_tags = true;
        }
        set.removeAllPeers();
    }
    if (current_ip_sets.size() == 0) {
        if (ip_set_event != null) {
            ip_set_event.cancel();
            ip_set_event = null;
        }
    } else {
        if (ip_set_event == null) {
            ip_set_event = SimpleTimer.addPeriodicEvent("speed handler ip set scheduler", 1000, new TimerEventPerformer() {

                private int tick_count;

                @Override
                public void perform(TimerEvent event) {
                    tick_count++;
                    synchronized (SpeedLimitHandler.this) {
                        for (IPSet set : current_ip_sets.values()) {
                            set.updateStats(tick_count);
                        }
                    /*
									if ( tick_count % 30 == 0 ){

										String str = "";

										for ( IPSet set: current_ip_sets.values()){

											str += (str.length()==0?"":", ") + set.getString();
										}

										logger.log( str );
									}
									*/
                    }
                }
            });
        }
        current_dml = new DML(download_manager, has_cats_or_tags);
    }
}
Also used : PEPeer(com.biglybt.core.peer.PEPeer) Peer(com.biglybt.pif.peers.Peer) RateLimiter(com.biglybt.pif.network.RateLimiter) PEPeerManager(com.biglybt.core.peer.PEPeerManager) PeerManager(com.biglybt.pif.peers.PeerManager) Download(com.biglybt.pif.download.Download)

Example 4 with Peer

use of com.biglybt.pif.peers.Peer in project BiglyBT by BiglySoftware.

the class LocProvUtils method addColumns.

private void addColumns() {
    synchronized (this) {
        if (cl_installed || active_provider == null) {
            return;
        }
        TableManager tm = core.getPluginManager().getDefaultPluginInterface().getUIManager().getTableManager();
        String[] peer_tables = new String[] { TableManager.TABLE_TORRENT_PEERS, TableManager.TABLE_ALL_PEERS };
        for (int i = 0; i < peer_tables.length; i++) {
            TableColumn iso3166Column = tm.createColumn(peer_tables[i], "CountryCode");
            iso3166Column.initialize(TableColumn.ALIGN_LEAD, TableColumn.POSITION_LAST, 30, TableColumn.INTERVAL_INVALID_ONLY);
            iso3166Column.addCellRefreshListener(new TableCellRefreshListener() {

                @Override
                public void refresh(TableCell cell) {
                    Peer peer = (Peer) cell.getDataSource();
                    String s = getCountryCode(peer);
                    if (!cell.setSortValue(s) && cell.isValid()) {
                        return;
                    }
                    cell.setText(s);
                }
            });
            tm.addColumn(iso3166Column);
            columns.add(iso3166Column);
            // Country Name
            TableColumn countryColumn = tm.createColumn(peer_tables[i], "Country");
            countryColumn.initialize(TableColumn.ALIGN_LEAD, TableColumn.POSITION_INVISIBLE, 80, TableColumn.INTERVAL_INVALID_ONLY);
            countryColumn.addCellRefreshListener(new TableCellRefreshListener() {

                @Override
                public void refresh(TableCell cell) {
                    Peer peer = (Peer) cell.getDataSource();
                    String s = getCountryName(peer);
                    if (!cell.setSortValue(s) && cell.isValid()) {
                        return;
                    }
                    cell.setText(s);
                }
            });
            tm.addColumn(countryColumn);
            columns.add(countryColumn);
            // Small Flags
            TableColumn flagsColumn = tm.createColumn(peer_tables[i], "CountryFlagSmall");
            flagsColumn.initialize(TableColumn.ALIGN_LEAD, TableColumn.POSITION_INVISIBLE, 25, TableColumn.INTERVAL_INVALID_ONLY);
            flagsColumn.setType(TableColumn.TYPE_GRAPHIC);
            FlagListener flagListener = new FlagListener(true);
            flagsColumn.addCellRefreshListener(flagListener);
            flagsColumn.addCellToolTipListener(flagListener);
            tm.addColumn(flagsColumn);
            columns.add(flagsColumn);
            // Normal Flags
            flagsColumn = tm.createColumn(peer_tables[i], "CountryFlag");
            flagsColumn.initialize(TableColumn.ALIGN_LEAD, TableColumn.POSITION_LAST, 25, TableColumn.INTERVAL_INVALID_ONLY);
            flagsColumn.setType(TableColumn.TYPE_GRAPHIC);
            flagListener = new FlagListener(false);
            flagsColumn.addCellRefreshListener(flagListener);
            flagsColumn.addCellToolTipListener(flagListener);
            tm.addColumn(flagsColumn);
            columns.add(flagsColumn);
        }
    }
}
Also used : TableCellRefreshListener(com.biglybt.pif.ui.tables.TableCellRefreshListener) TableCell(com.biglybt.pif.ui.tables.TableCell) Peer(com.biglybt.pif.peers.Peer) TableManager(com.biglybt.pif.ui.tables.TableManager) TableColumn(com.biglybt.pif.ui.tables.TableColumn)

Example 5 with Peer

use of com.biglybt.pif.peers.Peer in project BiglyBT by BiglySoftware.

the class DHTPluginImpl method checkForReSeed.

public void checkForReSeed(boolean force) {
    int seed_limit = 32;
    try {
        long[] router_stats = dht.getRouter().getStats().getStats();
        if (router_stats[DHTRouterStats.ST_CONTACTS_LIVE] < seed_limit || force) {
            if (force) {
                log.log("Reseeding");
            } else {
                log.log("Less than 32 live contacts, reseeding");
            }
            int peers_imported = 0;
            if (network == DHT.NW_AZ_MAIN || network == DHT.NW_AZ_MAIN_V6) {
                // first look for peers to directly import
                Download[] downloads = plugin_interface.getDownloadManager().getDownloads();
                outer: for (int i = 0; i < downloads.length; i++) {
                    Download download = downloads[i];
                    PeerManager pm = download.getPeerManager();
                    if (pm == null) {
                        continue;
                    }
                    Peer[] peers = pm.getPeers();
                    for (int j = 0; j < peers.length; j++) {
                        Peer p = peers[j];
                        int peer_udp_port = p.getUDPNonDataListenPort();
                        if (peer_udp_port != 0) {
                            boolean is_v6 = p.getIp().contains(":");
                            if (is_v6 == v6) {
                                String ip = p.getIp();
                                if (AENetworkClassifier.categoriseAddress(ip) == AENetworkClassifier.AT_PUBLIC) {
                                    if (importSeed(ip, peer_udp_port) != null) {
                                        peers_imported++;
                                        if (peers_imported > seed_limit) {
                                            break outer;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if (peers_imported < 16) {
                    List<InetSocketAddress> list = VersionCheckClient.getSingleton().getDHTBootstrap(network != DHT.NW_AZ_MAIN_V6);
                    for (InetSocketAddress address : list) {
                        if (importSeed(address) != null) {
                            peers_imported++;
                            if (peers_imported > seed_limit) {
                                break;
                            }
                        }
                    }
                }
            } else if (network == DHT.NW_BIGLYBT_MAIN) {
                List<InetSocketAddress> list = VersionCheckClient.getSingleton().getDHTBootstrap(true);
                for (InetSocketAddress address : list) {
                    if (importSeed(address) != null) {
                        peers_imported++;
                        if (peers_imported > seed_limit) {
                            break;
                        }
                    }
                }
            }
            DHTTransportContact root_to_remove = null;
            if (peers_imported == 0) {
                root_to_remove = importRootSeed();
                if (root_to_remove != null) {
                    peers_imported++;
                }
            }
            if (peers_imported > 0) {
                integrateDHT(false, root_to_remove);
            } else {
                log.log("No valid peers found to reseed from");
            }
        }
    } catch (Throwable e) {
        log.log(e);
    }
}
Also used : PeerManager(com.biglybt.pif.peers.PeerManager) InetSocketAddress(java.net.InetSocketAddress) Peer(com.biglybt.pif.peers.Peer) Download(com.biglybt.pif.download.Download)

Aggregations

Peer (com.biglybt.pif.peers.Peer)6 PEPeer (com.biglybt.core.peer.PEPeer)3 PEPeerManager (com.biglybt.core.peer.PEPeerManager)3 PeerManager (com.biglybt.pif.peers.PeerManager)3 Download (com.biglybt.pif.download.Download)2 RateLimiter (com.biglybt.pif.network.RateLimiter)2 InetSocketAddress (java.net.InetSocketAddress)2 DiskManagerFileInfo (com.biglybt.core.disk.DiskManagerFileInfo)1 DownloadManager (com.biglybt.core.download.DownloadManager)1 TRHostTorrent (com.biglybt.core.tracker.host.TRHostTorrent)1 DiskManager (com.biglybt.pif.disk.DiskManager)1 DownloadException (com.biglybt.pif.download.DownloadException)1 Torrent (com.biglybt.pif.torrent.Torrent)1 TableCell (com.biglybt.pif.ui.tables.TableCell)1 TableCellRefreshListener (com.biglybt.pif.ui.tables.TableCellRefreshListener)1 TableColumn (com.biglybt.pif.ui.tables.TableColumn)1 TableManager (com.biglybt.pif.ui.tables.TableManager)1 DiskManagerFileInfoImpl (com.biglybt.pifimpl.local.disk.DiskManagerFileInfoImpl)1 DiskManagerImpl (com.biglybt.pifimpl.local.disk.DiskManagerImpl)1 DownloadImpl (com.biglybt.pifimpl.local.download.DownloadImpl)1