68 lines
2.7 KiB
Python
68 lines
2.7 KiB
Python
import requests
|
|
|
|
from django.core.management.base import BaseCommand
|
|
import django.utils.timezone
|
|
|
|
from scrutiny.projects.models import InstalledService, Module, Version, InstalledVersion
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Scrutiny services for changes'
|
|
|
|
def handle(self, verbosity, *args, **options):
|
|
self.verbose = (int(verbosity) > 1)
|
|
for service in InstalledService.objects.all():
|
|
if not service.url.endswith('/'):
|
|
service.url = '%s/' % service.url
|
|
if self.verbose:
|
|
print('Checking %s' % service.url)
|
|
try:
|
|
response = requests.get('%s__version__' % service.url,
|
|
timeout=5, verify=False)
|
|
response.raise_for_status()
|
|
except requests.RequestException as e:
|
|
print('Error with %s (%r)' % (service.url, e))
|
|
continue
|
|
|
|
versions = response.json()
|
|
current_modules = set([x for x in
|
|
service.service.get_modules(platforms=[service.platform])])
|
|
seen_modules = set()
|
|
|
|
for module_name, version_string in versions.items():
|
|
try:
|
|
module = Module.objects.get(name=module_name)
|
|
except Module.DoesNotExist:
|
|
module = Module()
|
|
module.name = module_name
|
|
module.save()
|
|
|
|
seen_modules.add(module)
|
|
try:
|
|
version = Version.objects.get(module=module, version=version_string)
|
|
except Version.DoesNotExist:
|
|
version = module.version_set.create(version=version_string)
|
|
|
|
try:
|
|
installed_version = InstalledVersion.objects.get(
|
|
service=service, version=version)
|
|
except InstalledVersion.DoesNotExist:
|
|
installed_version = InstalledVersion()
|
|
installed_version.service = service
|
|
installed_version.version = version
|
|
installed_version.timestamp = django.utils.timezone.now()
|
|
installed_version.save()
|
|
|
|
uninstalled_modules = current_modules - seen_modules
|
|
for module in uninstalled_modules:
|
|
try:
|
|
version = Version.objects.get(module=module, version='')
|
|
except Version.DoesNotExist:
|
|
version = module.version_set.create(version='')
|
|
|
|
installed_version = InstalledVersion()
|
|
installed_version.service = service
|
|
installed_version.version = version
|
|
installed_version.timestamp = django.utils.timezone.now()
|
|
installed_version.save()
|