fix(commands:peeringdb|Network): totally remove cache for automated requests

This commit is contained in:
Romain J 2021-04-25 00:40:46 +02:00
parent 1693857864
commit 3c5741e6c5
3 changed files with 32 additions and 51 deletions

View file

@ -188,7 +188,7 @@ class Logs(commands.Cog):
# ========================================================================= # =========================================================================
# ========================================================================= # =========================================================================
@tasks.loop(seconds=0.0) @tasks.loop()
async def gateway_worker(self): async def gateway_worker(self):
record = await self._gateway_queue.get() record = await self._gateway_queue.get()
await self.notify_gateway_status(record) await self.notify_gateway_status(record)

View file

@ -258,47 +258,6 @@ async def get_pydig_result(
return [] return []
@cached(
ttl=5 * 60,
serializer=PickleSerializer(),
cache=Cache.MEMORY,
namespace="network",
)
async def get_peeringdb_net_result(asn: str) -> dict:
# Q. why this and not ?asn=
# A. better do one request and save in cache than execute new
# request every time
@cached(
ttl=5 * 60,
serializer=PickleSerializer(),
cache=Cache.MEMORY,
namespace="network",
)
async def _local_cache() -> dict:
try:
async with aiohttp.ClientSession() as cs:
async with cs.get(
"https://peeringdb.com/api/net",
timeout=aiohttp.ClientTimeout(total=21),
) as s:
return await s.json()
except asyncio.exceptions.TimeoutError:
pass
return await _local_cache()
result = await _local_cache()
if not result["data"]:
return result
for data in result["data"]:
if data.get("asn", None) == int(asn):
return {"data": [data]}
return {"data": []}
def check_ip_version_or_raise(version: Optional[dict]) -> bool | NoReturn: def check_ip_version_or_raise(version: Optional[dict]) -> bool | NoReturn:
if version is None or version["inet"] in ("4", "6", ""): if version is None or version["inet"] in ("4", "6", ""):
return True return True

View file

@ -45,7 +45,6 @@ from .functions.utils import (
get_ipwhois_result, get_ipwhois_result,
get_map_bytes, get_map_bytes,
get_pydig_result, get_pydig_result,
get_peeringdb_net_result,
merge_ipinfo_ipwhois, merge_ipinfo_ipwhois,
check_query_type_or_raise, check_query_type_or_raise,
check_ip_version_or_raise, check_ip_version_or_raise,
@ -57,12 +56,17 @@ _ = Translator("Network", __file__)
class Network(commands.Cog): class Network(commands.Cog):
_peeringdb_net: Optional[dict]
def __init__(self, bot: Tux): def __init__(self, bot: Tux):
self.bot = bot self.bot = bot
self.__config: NetworkConfig = ConfigFile( self.__config: NetworkConfig = ConfigFile(
str(cogs_data_path("Network") / "config.yaml"), str(cogs_data_path("Network") / "config.yaml"),
NetworkConfig, NetworkConfig,
).config ).config
self._peeringdb_net = None
self._update_peering_db.start() # pylint: disable=no-member self._update_peering_db.start() # pylint: disable=no-member
async def cog_command_error(self, ctx: ContextPlus, error): async def cog_command_error(self, ctx: ContextPlus, error):
@ -86,12 +90,18 @@ class Network(commands.Cog):
def cog_unload(self): def cog_unload(self):
self._update_peering_db.cancel() # pylint: disable=no-member self._update_peering_db.cancel() # pylint: disable=no-member
@tasks.loop(minutes=5.0) @tasks.loop(hours=1.0)
async def _update_peering_db(self): async def _update_peering_db(self):
await get_peeringdb_net_result(str(1)) try:
async with aiohttp.ClientSession() as cs:
log.log(logging.INFO, "_update_peering_db") async with cs.get(
self.bot.console.log("[Network]: _update_peering_db") "https://peeringdb.com/api/net",
timeout=aiohttp.ClientTimeout(total=60),
) as s:
self._peeringdb_net = await s.json()
logging.getLogger("dis")
except asyncio.exceptions.TimeoutError:
pass
# ========================================================================= # =========================================================================
# ========================================================================= # =========================================================================
@ -335,7 +345,21 @@ class Network(commands.Cog):
async def _peeringdb(self, ctx: ContextPlus, asn: ASConverter): async def _peeringdb(self, ctx: ContextPlus, asn: ASConverter):
check_asn_or_raise(str(asn)) check_asn_or_raise(str(asn))
data: dict = (await get_peeringdb_net_result(str(asn)))["data"] data = {}
if self._peeringdb_net is None:
return await ctx.send(
_(
"Please retry in few minutes",
ctx,
self.bot.config,
).format(asn=asn)
)
for _data in self._peeringdb_net["data"]:
if _data.get("asn", None) == int(str(asn)):
data = _data
break
if not data: if not data:
return await ctx.send( return await ctx.send(
@ -346,8 +370,6 @@ class Network(commands.Cog):
).format(asn=asn) ).format(asn=asn)
) )
data = data[0]
filtered = { filtered = {
"info_type": "Type", "info_type": "Type",
"info_traffic": "Traffic", "info_traffic": "Traffic",