30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
import logging
|
|
import os.path
|
|
|
|
from background_task import background
|
|
from background_task.tasks import TaskSchedule
|
|
from django.conf import settings
|
|
|
|
import files.models
|
|
import files.utils
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@background(schedule={'action': TaskSchedule.RESCHEDULE_EXISTING})
|
|
def clamdscan(file_id: int):
|
|
"""Run a scan of a given file and save its output as a FileValidation record."""
|
|
file = files.models.File.objects.get(pk=file_id)
|
|
abs_path = os.path.join(settings.MEDIA_ROOT, file.source.path)
|
|
scan_status, scan_found = files.utils.run_clamdscan(abs_path)
|
|
logger.info('File pk=%s scanned: %s', file.pk, (scan_status, scan_found))
|
|
scan_result = {'clamdscan': [scan_status, scan_found]}
|
|
is_ok = scan_status == 'OK'
|
|
file_validation, is_new = files.models.FileValidation.objects.get_or_create(
|
|
file=file, defaults={'results': scan_result, 'is_ok': is_ok}
|
|
)
|
|
if not is_new:
|
|
file_validation.results = scan_result
|
|
file_validation.is_ok = is_ok
|
|
file_validation.save(update_fields={'results', 'is_ok', 'date_modified'})
|