diff --git a/src/core/management/commands/hangar_creation.py b/src/core/management/commands/hangar_creation.py new file mode 100644 index 0000000000000000000000000000000000000000..cf5256c107ce85af2acc4ee7f2615a37dfeeaaae --- /dev/null +++ b/src/core/management/commands/hangar_creation.py @@ -0,0 +1,63 @@ +import logging +import subprocess + +from django.conf import settings +from django.core.management.base import BaseCommand, CommandError +from django.utils import timezone + +from core.models.rooms import Room + + +def create_hangar(room: Room): + username = room.assembly.slug + cmd = ['ssh', settings.HANGAR_HOST, settings.HANGAR_CMD, username] + + result = subprocess.run(cmd, capture_output=True, timeout=42, encoding='utf-8', stderr=subprocess.STDOUT) + if result.returncode == 0: + password = result.stdout + room.backend_link = settings.BACKEND_URL.format(username=username, password=password) + room.backend_status = Room.BackendStatus.ACTIVE + + all_contacts = room.assembly.get_all_managing_contacts() + room.backend_data = { + 'timestamp': timezone.now(), + 'contacts': all_contacts, + } + room.save() + + else: + room.backend_data = { + 'timestamp': timezone.now(), + '_error': result.stdout, + } + room.backend_status = Room.BackendStatus.ERROR + room.save() + + raise Exception('Backend creation failed.') + + +class Command(BaseCommand): + def handle(self, *args, **options): + for x in ['URL', 'BACKEND_URL', 'HOST', 'CMD']: + if not hasattr(settings, 'HANGAR_' + x) or getattr(settings, 'HANGAR_' + x) in [None, '']: + raise CommandError(f'No HANGAR_{x} configured.') + + if settings.HANGAR_BACKEND_URL is None or settings.HANGAR_BACKEND_URL == '': + raise CommandError('No HANGAR_BACKEND_URL configured.') + + rooms = Room.objects.filter(room_type=Room.RoomType.HANGAR, backend_status=Room.BackendStatus.NEW) + for room in rooms: + room.backend_status = Room.BackendStatus.SETUP + room.save() + + try: + create_hangar(room) + + except Exception as err: + logging.error('Got error on creating hangar for %s: %s', room, err) + room.backend_status = Room.BackendStatus.ERROR + room.backend_data = { + 'timestamp': timezone.now(), + '_exception': str(err), + } + room.save() diff --git a/src/core/models/assemblies.py b/src/core/models/assemblies.py index 9637928f10197af33d6ab110bee782372dc218c4..a7f4466bbc34955cb4a2f206a2b8d0dd3709b7cd 100644 --- a/src/core/models/assemblies.py +++ b/src/core/models/assemblies.py @@ -293,6 +293,12 @@ class Assembly(TaggedItemMixin, models.Model): def sorted_tags(self): return sorted(t['slug'] for t in self.tags) + def get_all_managing_contacts(self): + result = {} + for member in self.members.filter(role__in=AssemblyMember.MANAGEMENT_ROLES): + result[member.member.username] = member.member.get_verified_contacts() + return result + def create_technical_user_if_necessary(self): if self.technical_user is not None: return self.technical_user