mirror of
https://github.com/nexy7574/LCC-bot.git
synced 2024-09-19 18:16:34 +01:00
Add traceroute command
This commit is contained in:
parent
883451ee41
commit
c0b9188be1
2 changed files with 98 additions and 2 deletions
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="dataSourceStorageLocal" created-in="PY-223.8214.51">
|
<component name="dataSourceStorageLocal" created-in="PY-223.8617.48">
|
||||||
<data-source name="main" uuid="28efee07-d306-4126-bf69-01008b4887e2">
|
<data-source name="main" uuid="28efee07-d306-4126-bf69-01008b4887e2">
|
||||||
<database-info product="SQLite" version="3.39.2" jdbc-version="2.1" driver-name="SQLite JDBC" driver-version="3.39.2.0" dbms="SQLITE" exact-version="3.39.2" exact-driver-version="3.39">
|
<database-info product="SQLite" version="3.39.2" jdbc-version="2.1" driver-name="SQLite JDBC" driver-version="3.39.2.0" dbms="SQLITE" exact-version="3.39.2" exact-driver-version="3.39">
|
||||||
<identifier-quote-string>"</identifier-quote-string>
|
<identifier-quote-string>"</identifier-quote-string>
|
||||||
|
|
|
@ -8,7 +8,7 @@ import textwrap
|
||||||
import dns.resolver
|
import dns.resolver
|
||||||
from dns import asyncresolver
|
from dns import asyncresolver
|
||||||
import aiofiles
|
import aiofiles
|
||||||
from time import time
|
from time import time, time_ns
|
||||||
from typing import Literal
|
from typing import Literal
|
||||||
from typing import Tuple, Optional, Dict
|
from typing import Tuple, Optional, Dict
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
@ -489,6 +489,102 @@ class OtherCog(commands.Cog):
|
||||||
for page in paginator.pages:
|
for page in paginator.pages:
|
||||||
await ctx.respond(page)
|
await ctx.respond(page)
|
||||||
|
|
||||||
|
@commands.slash_command()
|
||||||
|
async def traceroute(
|
||||||
|
self,
|
||||||
|
ctx: discord.ApplicationContext,
|
||||||
|
url: str,
|
||||||
|
port: discord.Option(
|
||||||
|
int,
|
||||||
|
description="Port to use",
|
||||||
|
default=None
|
||||||
|
),
|
||||||
|
ping_type: discord.Option(
|
||||||
|
str,
|
||||||
|
name="ping-type",
|
||||||
|
description="Type of ping to use. See `traceroute --help`",
|
||||||
|
choices=["icmp", "tcp", "udp", "udplite", "dccp", "default"],
|
||||||
|
default="default"
|
||||||
|
),
|
||||||
|
use_ip_version: discord.Option(
|
||||||
|
str,
|
||||||
|
name="ip-version",
|
||||||
|
description="IP version to use.",
|
||||||
|
choices=["ipv4", "ipv6"],
|
||||||
|
default="ipv4"
|
||||||
|
),
|
||||||
|
max_ttl: discord.Option(
|
||||||
|
int,
|
||||||
|
name="ttl",
|
||||||
|
description="Max number of hops",
|
||||||
|
default=30
|
||||||
|
)
|
||||||
|
):
|
||||||
|
"""Performs a traceroute request."""
|
||||||
|
await ctx.defer()
|
||||||
|
if re.search(r"\s+", url):
|
||||||
|
return await ctx.respond("URL cannot contain spaces.")
|
||||||
|
|
||||||
|
args = [
|
||||||
|
"sudo",
|
||||||
|
"-E",
|
||||||
|
"-n",
|
||||||
|
"traceroute"
|
||||||
|
]
|
||||||
|
flags = {
|
||||||
|
"ping_type": {
|
||||||
|
"icmp": "-I",
|
||||||
|
"tcp": "-T",
|
||||||
|
"udp": "-U",
|
||||||
|
"udplite": "-UL",
|
||||||
|
"dccp": "-D",
|
||||||
|
},
|
||||||
|
"use_ip_version": {
|
||||||
|
"ipv4": "-4",
|
||||||
|
"ipv6": "-6"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ping_type != "default":
|
||||||
|
args.append(flags["ping_type"][ping_type])
|
||||||
|
else:
|
||||||
|
args = args[3:] # removes sudo
|
||||||
|
args.append(flags["use_ip_version"][use_ip_version])
|
||||||
|
args.append("-m")
|
||||||
|
args.append(str(max_ttl))
|
||||||
|
if port is not None:
|
||||||
|
args.append("-p")
|
||||||
|
args.append(str(port))
|
||||||
|
args.append(url)
|
||||||
|
paginator = commands.Paginator()
|
||||||
|
paginator.add_line(f"Running command: {' '.join(args[3 if args[0] == 'sudo' else 0:])}")
|
||||||
|
paginator.add_line(empty=True)
|
||||||
|
try:
|
||||||
|
start = time_ns()
|
||||||
|
process = await asyncio.create_subprocess_exec(
|
||||||
|
args[0],
|
||||||
|
*args[1:],
|
||||||
|
stdout=asyncio.subprocess.PIPE,
|
||||||
|
stderr=asyncio.subprocess.PIPE,
|
||||||
|
)
|
||||||
|
await process.wait()
|
||||||
|
stdout, stderr = await process.communicate()
|
||||||
|
end = time_ns()
|
||||||
|
time_taken_in_ms = (end - start) / 1000000
|
||||||
|
if stdout:
|
||||||
|
for line in stdout.splitlines():
|
||||||
|
paginator.add_line(line.decode())
|
||||||
|
if stderr:
|
||||||
|
for line in stderr.splitlines():
|
||||||
|
paginator.add_line(line.decode())
|
||||||
|
paginator.add_line(empty=True)
|
||||||
|
paginator.add_line(f"Exit code: {process.returncode}")
|
||||||
|
paginator.add_line(f"Time taken: {time_taken_in_ms:,.1f}ms")
|
||||||
|
except Exception as e:
|
||||||
|
paginator.add_line(f"Error: {e}")
|
||||||
|
for page in paginator.pages:
|
||||||
|
await ctx.respond(page)
|
||||||
|
|
||||||
@commands.slash_command()
|
@commands.slash_command()
|
||||||
@commands.max_concurrency(1, commands.BucketType.user)
|
@commands.max_concurrency(1, commands.BucketType.user)
|
||||||
@commands.cooldown(1, 30, commands.BucketType.user)
|
@commands.cooldown(1, 30, commands.BucketType.user)
|
||||||
|
|
Loading…
Reference in a new issue