Skip to content
Snippets Groups Projects
Commit fc376318 authored by HeJ's avatar HeJ
Browse files

hangar creation management command

parent aac6aec4
Branches
Tags release/polls/5.4.0
No related merge requests found
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()
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment