diff --git a/web/api/serializers.py b/web/api/serializers.py
index 330ec991..924db7ca 100644
--- a/web/api/serializers.py
+++ b/web/api/serializers.py
@@ -42,6 +42,9 @@ class ScanHistorySerializer(serializers.ModelSerializer):
subdomain_count = serializers.SerializerMethodField('get_subdomain_count')
endpoint_count = serializers.SerializerMethodField('get_endpoint_count')
vulnerability_count = serializers.SerializerMethodField('get_vulnerability_count')
+ current_progress = serializers.SerializerMethodField('get_progress')
+ completed_time = serializers.SerializerMethodField('get_completed_time_in_sec')
+ elapsed_time = serializers.SerializerMethodField('get_elapsed_time')
class Meta:
model = ScanHistory
@@ -60,6 +63,15 @@ class ScanHistorySerializer(serializers.ModelSerializer):
if scan_history.get_vulnerability_count:
return scan_history.get_vulnerability_count()
+ def get_progress(self, scan_history):
+ return scan_history.get_progress()
+
+ def get_completed_time_in_sec(self, scan_history):
+ return scan_history.get_completed_time_in_sec()
+
+ def get_elapsed_time(self, scan_history):
+ return scan_history.get_elapsed_time()
+
class OrganizationSerializer(serializers.ModelSerializer):
diff --git a/web/api/views.py b/web/api/views.py
index 09c78fcb..a6dea5bb 100644
--- a/web/api/views.py
+++ b/web/api/views.py
@@ -40,9 +40,9 @@ class ScanStatus(APIView):
pending_scans = ScanHistory.objects.filter(scan_status=-1)
response = {
- 'recently_completed_scans': ScanHistorySerializer(recently_completed_scans, many=True).data,
- 'scanning': currently_scanning.values(),
- 'pending': pending_scans.values()
+ 'pending': ScanHistorySerializer(pending_scans, many=True).data,
+ 'scanning': ScanHistorySerializer(currently_scanning, many=True).data,
+ 'recently_completed_scans': ScanHistorySerializer(recently_completed_scans, many=True).data
}
return Response(response)
diff --git a/web/dashboard/views.py b/web/dashboard/views.py
index f6d517bf..8bc5b9f6 100644
--- a/web/dashboard/views.py
+++ b/web/dashboard/views.py
@@ -26,11 +26,6 @@ def index(request):
Subdomain.objects.all().exclude(http_status__exact=0).count()
endpoint_alive_count = \
EndPoint.objects.filter(http_status__exact=200).count()
- recent_completed_scans = ScanHistory.objects.all().order_by(
- '-start_scan_date').filter(Q(scan_status=0) | Q(scan_status=2) | Q(scan_status=3))[:5]
- currently_scanning = ScanHistory.objects.order_by(
- '-start_scan_date').filter(scan_status=1)[:5]
- pending_scans = ScanHistory.objects.filter(scan_status=-1)[:5]
info_count = Vulnerability.objects.filter(severity=0).count()
low_count = Vulnerability.objects.filter(severity=1).count()
medium_count = Vulnerability.objects.filter(severity=2).count()
@@ -118,9 +113,6 @@ def index(request):
'subdomain_with_ip_count': subdomain_with_ip_count,
'alive_count': alive_count,
'endpoint_alive_count': endpoint_alive_count,
- 'recent_completed_scans': recent_completed_scans,
- 'pending_scans': pending_scans,
- 'currently_scanning': currently_scanning,
'info_count': info_count,
'low_count': low_count,
'medium_count': medium_count,
diff --git a/web/startScan/migrations/0002_auto_20211019_1756.py b/web/startScan/migrations/0002_auto_20211019_1756.py
new file mode 100644
index 00000000..dcf454b5
--- /dev/null
+++ b/web/startScan/migrations/0002_auto_20211019_1756.py
@@ -0,0 +1,28 @@
+# Generated by Django 3.2.4 on 2021-10-19 17:56
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('startScan', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='scanhistory',
+ name='dorks',
+ field=models.ManyToManyField(null=True, related_name='dorks', to='startScan.Dork'),
+ ),
+ migrations.AlterField(
+ model_name='scanhistory',
+ name='emails',
+ field=models.ManyToManyField(null=True, related_name='emails', to='startScan.Email'),
+ ),
+ migrations.AlterField(
+ model_name='scanhistory',
+ name='employees',
+ field=models.ManyToManyField(null=True, related_name='employees', to='startScan.Employee'),
+ ),
+ ]
diff --git a/web/startScan/migrations/0003_auto_20211019_1757.py b/web/startScan/migrations/0003_auto_20211019_1757.py
new file mode 100644
index 00000000..a553d266
--- /dev/null
+++ b/web/startScan/migrations/0003_auto_20211019_1757.py
@@ -0,0 +1,28 @@
+# Generated by Django 3.2.4 on 2021-10-19 17:57
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('startScan', '0002_auto_20211019_1756'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='scanhistory',
+ name='dorks',
+ field=models.ManyToManyField(blank=True, related_name='dorks', to='startScan.Dork'),
+ ),
+ migrations.AlterField(
+ model_name='scanhistory',
+ name='emails',
+ field=models.ManyToManyField(blank=True, related_name='emails', to='startScan.Email'),
+ ),
+ migrations.AlterField(
+ model_name='scanhistory',
+ name='employees',
+ field=models.ManyToManyField(blank=True, related_name='employees', to='startScan.Employee'),
+ ),
+ ]
diff --git a/web/startScan/models.py b/web/startScan/models.py
index d79d54c4..13cf21ba 100644
--- a/web/startScan/models.py
+++ b/web/startScan/models.py
@@ -30,9 +30,9 @@ class ScanHistory(models.Model):
used_gf_patterns = models.CharField(max_length=500, null=True, blank=True)
# osint is directly linked to scan history and not subdomains
- emails = models.ManyToManyField('Email', related_name='emails')
- employees = models.ManyToManyField('Employee', related_name='employees')
- dorks = models.ManyToManyField('Dork', related_name='dorks')
+ emails = models.ManyToManyField('Email', related_name='emails', blank=True)
+ employees = models.ManyToManyField('Employee', related_name='employees', blank=True)
+ dorks = models.ManyToManyField('Dork', related_name='dorks', blank=True)
def __str__(self):
# debug purpose remove scan type and id in prod
@@ -90,6 +90,25 @@ class ScanHistory(models.Model):
scan_history__id=self.id).filter(
severity=4).count()
+ def get_progress(self):
+ '''
+ formulae to calculate
+ count number of true things to do, for http crawler, it is always +1
+ divided by total scan activity associated - 2 (Start and Stop)
+ '''
+ number_of_steps = sum([
+ self.subdomain_discovery,
+ self.dir_file_search,
+ self.port_scan,
+ self.fetch_url,
+ self.vulnerability_scan,
+ self.osint,
+ self.screenshot,
+ True
+ ])
+ steps_done = len(self.scanactivity_set.all())
+ return (number_of_steps / (steps_done - 2))*100
+
def get_completed_time(self):
return self.stop_scan_date - self.start_scan_date
diff --git a/web/static/custom/dashboard.js b/web/static/custom/dashboard.js
new file mode 100644
index 00000000..3337d06e
--- /dev/null
+++ b/web/static/custom/dashboard.js
@@ -0,0 +1,95 @@
+function getScanStatusSidebar(reload) {
+ $.getJSON('/api/scan_status', function(data) {
+ $('#currently_scanning').empty();
+ $('#recently_completed_scans').empty();
+ $('#upcoming_scans').empty();
+
+ if (data['scanning'].length > 0){
+ $('#current_scan_count').html(`${data['scanning'].length} Scans Currently Running`)
+ for (var scan in data['scanning']) {
+ scan_object = data['scanning'][scan];
+ $('#currently_scanning').append(`
+ ${scan_object.domain.name}${scan_object.current_progress}% Started ${scan_object.elapsed_time} ago${scan_object.scan_type.engine_name}
+
+ ${scan_object.subdomain_count}
+ ${scan_object.endpoint_count}
+ ${scan_object.vulnerability_count}
+
${scan_object.domain.name}${status_badge}
+${scan_object.domain.name}
+