mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.5 KiB
83 lines
2.5 KiB
# ~*~ coding: utf-8 ~*~
|
|
#
|
|
import os
|
|
import paramiko
|
|
from paramiko.ssh_exception import SSHException
|
|
|
|
from common.utils import get_object_or_none
|
|
from .models import Asset, SystemUser, Label
|
|
|
|
|
|
def get_assets_by_id_list(id_list):
|
|
return Asset.objects.filter(id__in=id_list)
|
|
|
|
|
|
def get_assets_by_hostname_list(hostname_list):
|
|
return Asset.objects.filter(hostname__in=hostname_list)
|
|
|
|
|
|
def get_system_user_by_name(name):
|
|
system_user = get_object_or_none(SystemUser, name=name)
|
|
return system_user
|
|
|
|
|
|
class LabelFilter:
|
|
def filter_queryset(self, queryset):
|
|
queryset = super().filter_queryset(queryset)
|
|
query_keys = self.request.query_params.keys()
|
|
all_label_keys = Label.objects.values_list('name', flat=True)
|
|
valid_keys = set(all_label_keys) & set(query_keys)
|
|
labels_query = {}
|
|
for key in valid_keys:
|
|
labels_query[key] = self.request.query_params.get(key)
|
|
|
|
conditions = []
|
|
for k, v in labels_query.items():
|
|
query = {'labels__name': k, 'labels__value': v}
|
|
conditions.append(query)
|
|
|
|
if conditions:
|
|
for kwargs in conditions:
|
|
queryset = queryset.filter(**kwargs)
|
|
return queryset
|
|
|
|
|
|
def test_gateway_connectability(gateway):
|
|
"""
|
|
Test system cant connect his assets or not.
|
|
:param gateway:
|
|
:return:
|
|
"""
|
|
client = paramiko.SSHClient()
|
|
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
proxy = paramiko.SSHClient()
|
|
proxy.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
|
|
try:
|
|
proxy.connect(gateway.ip, username=gateway.username,
|
|
password=gateway.password,
|
|
pkey=gateway.private_key_obj)
|
|
except(paramiko.AuthenticationException,
|
|
paramiko.BadAuthenticationType,
|
|
SSHException) as e:
|
|
return False, str(e)
|
|
|
|
sock = proxy.get_transport().open_channel(
|
|
'direct-tcpip', ('127.0.0.1', gateway.port), ('127.0.0.1', 0)
|
|
)
|
|
|
|
try:
|
|
client.connect("127.0.0.1", port=gateway.port,
|
|
username=gateway.username,
|
|
password=gateway.password,
|
|
key_filename=gateway.private_key_file,
|
|
sock=sock,
|
|
timeout=5
|
|
)
|
|
except (paramiko.SSHException, paramiko.ssh_exception.SSHException,
|
|
paramiko.AuthenticationException, TimeoutError) as e:
|
|
return False, str(e)
|
|
finally:
|
|
client.close()
|
|
return True, None
|