| 259 | |
| 260 | # Request peer exchange from peer |
| 261 | def pex(self, site=None, need_num=5): |
| 262 | if not site: |
| 263 | site = self.site # If no site defined request peers for this site |
| 264 | |
| 265 | # give back 5 connectible peers |
| 266 | packed_peers = helper.packPeers(self.site.getConnectablePeers(5, allow_private=False)) |
| 267 | request = {"site": site.address, "peers": packed_peers["ipv4"], "need": need_num} |
| 268 | if packed_peers["onion"]: |
| 269 | request["peers_onion"] = packed_peers["onion"] |
| 270 | if packed_peers["ipv6"]: |
| 271 | request["peers_ipv6"] = packed_peers["ipv6"] |
| 272 | res = self.request("pex", request) |
| 273 | if not res or "error" in res: |
| 274 | return False |
| 275 | added = 0 |
| 276 | |
| 277 | # Remove unsupported peer types |
| 278 | if "peers_ipv6" in res and self.connection and "ipv6" not in self.connection.server.supported_ip_types: |
| 279 | del res["peers_ipv6"] |
| 280 | |
| 281 | if "peers_onion" in res and self.connection and "onion" not in self.connection.server.supported_ip_types: |
| 282 | del res["peers_onion"] |
| 283 | |
| 284 | # Add IPv4 + IPv6 |
| 285 | for peer in itertools.chain(res.get("peers", []), res.get("peers_ipv6", [])): |
| 286 | address = helper.unpackAddress(peer) |
| 287 | if site.addPeer(*address, source="pex"): |
| 288 | added += 1 |
| 289 | |
| 290 | # Add Onion |
| 291 | for peer in res.get("peers_onion", []): |
| 292 | address = helper.unpackOnionAddress(peer) |
| 293 | if site.addPeer(*address, source="pex"): |
| 294 | added += 1 |
| 295 | |
| 296 | if added: |
| 297 | self.log("Added peers using pex: %s" % added) |
| 298 | |
| 299 | return added |
| 300 | |
| 301 | # List modified files since the date |
| 302 | # Return: {inner_path: modification date,...} |