device scan

This commit is contained in:
RobbieHan
2019-01-14 02:12:08 +08:00
parent 9c204933e8
commit eb10ffe9be
4 changed files with 496 additions and 3 deletions

View File

@@ -14,4 +14,10 @@ urlpatterns = [
path('portal/code/delete/', views_code.CodeDeleteView.as_view(), name='portal-code-delete'),
path('portal/scan_config/', views_scan.ScanConfigView.as_view(), name='portal-scan_config'),
path('portal/device_scan/', views_scan.DeviceScanView.as_view(), name='portal-device_scan'),
path('portal/device_scan/list/', views_scan.DeviceScanListView.as_view(), name='portal-device_scan-list'),
path('portal/device_scan/detail/', views_scan.DeviceScanDetailView.as_view(), name='portal-device_scan-detail'),
path('portal/device_scan/delete/', views_scan.DeviceScanDeleteView.as_view(), name='portal-device_scan-delete'),
path('portal/device_scan/exec/', views_scan.DeviceScanExecView.as_view(), name='portal-device_scan-exec'),
]

View File

@@ -6,15 +6,16 @@ import ast
import logging
from ruamel import yaml
from django.views.generic import View
from django.views.generic import View, TemplateView
from django.http import JsonResponse
from django.shortcuts import render
from django.shortcuts import render, get_object_or_404
from system.mixin import LoginRequiredMixin
from custom import BreadcrumbMixin
from custom import BreadcrumbMixin, SandboxListView, SandboxDeleteView
from utils.sandbox_utils import ConfigFileMixin
from system.models import Menu
from .models import DeviceScanInfo
error_logger = logging.getLogger('sandbox_error')
@@ -52,3 +53,78 @@ class ScanConfigView(LoginRequiredMixin, BreadcrumbMixin, ConfigFileMixin, View)
error_logger.error(e)
return JsonResponse(ret)
class DeviceScanView(LoginRequiredMixin, BreadcrumbMixin, TemplateView):
template_name = 'cmdb/device_scan.html'
class DeviceScanListView(SandboxListView):
model = DeviceScanInfo
fields = ['id', 'sys_hostname', 'hostname', 'mac_address', 'auth_type', 'status', 'os_type', 'device_type']
class DeviceScanDetailView(LoginRequiredMixin, View):
def get(self, request):
ret = Menu.get_menu_by_request_url(request.path_info)
if 'id' in request.GET and request.GET['id']:
device = get_object_or_404(DeviceScanInfo, pk=int(request.GET['id']))
ret['device'] = device
return render(request, 'cmdb/device_scan_detail.html', ret)
class DeviceScanDeleteView(SandboxDeleteView):
model = DeviceScanInfo
class DeviceScanExecView(LoginRequiredMixin, View):
def get(self, request):
import time
from utils.sandbox_utils import SandboxScan, LoginExecution
info_logger = logging.getLogger('sandbox_info')
ret = dict(result=False)
scan = SandboxScan()
execution = LoginExecution()
scan_type = execution.get_scan_type()
auth_type = execution.get_auth_type()
start_time = time.time()
if scan_type == 'basic_scan':
hosts = scan.basic_scan()
for host in hosts:
DeviceScanInfo.objects.update_or_create(
hostname=host,
)
else:
hosts = scan.os_scan()
login_hosts = [host for host in hosts if host['os'] in ['Linux', 'embedded']]
nologin_hosts = [host for host in hosts if host not in login_hosts]
for host in nologin_hosts:
DeviceScanInfo.objects.update_or_create(
hostname=host['host'],
defaults={
'os_type': host['os']
}
)
for host in login_hosts:
kwargs = {
'hostname': host['host'],
'username': execution.get_ssh_username(),
'port': execution.get_ssh_port(),
'password': execution.get_ssh_password(),
'private_key': execution.get_ssh_private_key()
}
defaults = execution.login_execution(auth_type=auth_type, **kwargs)
DeviceScanInfo.objects.update_or_create(
hostname=host['host'],
defaults=defaults
)
end_time = time.time()
msg = 'Scan task has been completed, execution time: %(time)s, %(num)s hosts are up.' % {
'time': end_time - start_time,
'num': len(hosts)
}
info_logger.info(msg)
ret['result'] = True
return JsonResponse(ret)