import json
import whois
from flask import Response, stream_with_context
import app.modules.server.ssh as mod_ssh
import app.modules.server.server as server_mod
def ping_from_server(server_from: str, server_to: str, action: str) -> Response:
action_for_sending = ''
if server_to == '':
raise Exception('warning: Wrong IP address or name')
def paint_output(generated):
yield '
'
for k in generated:
try:
k = k.decode('utf-8')
except Exception:
yield ''
for i in k.split('\n'):
if i == ' ' or i == '':
continue
if 'PING' in i:
yield f'{i}
\n'
elif i in ('no reply', 'no answer yet', 'Too many hops', '100% packet loss'):
yield f'{i}
\n'
elif 'ms' in i and '100% packet loss' not in i:
yield f'{i}
\n'
else:
yield f'{i}
'
yield '
'
if action == 'nettools_ping':
action_for_sending = 'ping -c 4 -W 1 -s 56 -O '
elif action == 'nettools_trace':
action_for_sending = 'tracepath -m 10 '
action_for_sending = action_for_sending + server_to
if server_from == 'localhost':
return Response(stream_with_context(paint_output(server_mod.subprocess_execute_stream(action_for_sending))), mimetype='text/html')
else:
ssh_generator = mod_ssh.ssh_connect(server_from)
return Response(stream_with_context(paint_output(ssh_generator.generate(action_for_sending))), mimetype='text/html')
def telnet_from_server(server_from: str, server_to: str, port_to: str) -> str:
count_string = 0
stderr = ''
output1 = ''
if server_to == '':
return 'warning: enter a correct IP or DNS name'
if server_from == 'localhost':
action_for_sending = f'echo "exit"|nc {server_to} {port_to} -t -w 1s'
output, stderr = server_mod.subprocess_execute(action_for_sending)
else:
action_for_sending = f'echo "exit"|nc {server_to} {port_to} -t -w 1s'
output = server_mod.ssh_command(server_from, action_for_sending, raw=1)
if stderr != '':
return f'error: {stderr[5:]}'
for i in output:
if i == ' ':
continue
i = i.strip()
if i == 'Ncat: Connection timed out.':
return f'error: {i[5:]}'
output1 += i + '
'
count_string += 1
if count_string > 1:
break
return output1
def nslookup_from_server(server_from: str, dns_name: str, record_type: str) -> str:
count_string = 0
stderr = ''
output1 = ''
if dns_name == '':
return 'warning: enter a correct DNS name'
action_for_sending = f'dig {dns_name} {record_type} |grep -e "SERVER\|{dns_name}"'
if server_from == 'localhost':
output, stderr = server_mod.subprocess_execute(action_for_sending)
else:
output = server_mod.ssh_command(server_from, action_for_sending, raw=1)
if stderr != '':
return 'error: ' + stderr[5:-1]
output1 += f'The {dns_name} domain has the following records:'
for i in output:
if 'dig: command not found.' in i:
return 'error: Install bind-utils before using NSLookup'
if ';' in i and ';; SERVER:' not in i:
continue
if 'SOA' in i and record_type != 'SOA':
return 'There are not any records for this type'
if ';; SERVER:' in i:
i = i[10:]
output1 += '
From NS server:
'
i = i.strip()
output1 += '' + i + '
'
count_string += 1
return output1
def whois_check(domain_name: str) -> str:
if domain_name == '':
raise Exception('warning: Wrong DNS name')
try:
whois_data = json.loads(str(whois.whois(domain_name)))
except Exception as e:
return f'error: Cannot get whois from {domain_name}: {e}'
output = (f'Domain name: {whois_data["domain_name"]}
'
f'Registrar: {whois_data["registrar"]}
'
f'Creation date: {whois_data["creation_date"]}
'
f'Expiration date: {whois_data["expiration_date"]}
'
f'Name servers: {whois_data["name_servers"]}
'
f'Status: {whois_data["status"]}
')
if 'emails' in whois_data:
output += f'Emails: {whois_data["emails"]}
'
if 'org' in whois_data:
output += f'Organization: {whois_data["org"]}
'
return output