47 lines
No EOL
1.5 KiB
Python
47 lines
No EOL
1.5 KiB
Python
import subprocess
|
|
from modules.mtr_parser import MtrParser
|
|
|
|
def execute_command_streaming(method, target):
|
|
commands = {
|
|
'ping': ['ping4', '-c', '4', '--', target],
|
|
'ping6': ['ping6', '-c', '4', '--', target],
|
|
'mtr': ['mtr', '--raw', '-n', '-c', '10', '-4', target],
|
|
'mtr6': ['mtr', '--raw', '-n', '-c', '10', '-6', target],
|
|
'traceroute': ['traceroute', '-n', '-4', '--', target],
|
|
'traceroute6': ['traceroute', '-n', '-6', '--', target],
|
|
}
|
|
|
|
if method not in commands:
|
|
yield f"Error: Invalid method '{method}'."
|
|
return
|
|
|
|
command = commands[method]
|
|
|
|
try:
|
|
proc = subprocess.Popen(
|
|
command,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.STDOUT,
|
|
text=True,
|
|
bufsize=1,
|
|
universal_newlines=True
|
|
)
|
|
|
|
if 'mtr' in method:
|
|
parser = MtrParser()
|
|
for line in iter(proc.stdout.readline, ''):
|
|
if line.strip():
|
|
parser.update(line)
|
|
table = parser.render_table()
|
|
yield f"@@@{table}"
|
|
else:
|
|
for line in iter(proc.stdout.readline, ''):
|
|
yield line
|
|
|
|
proc.stdout.close()
|
|
proc.wait()
|
|
|
|
except FileNotFoundError:
|
|
yield f"Error: Command '{command[0]}' not found. Is it installed on the server?"
|
|
except Exception as e:
|
|
yield f"An unexpected error occurred: {e}" |