21 lines
1.3 KiB
Python
21 lines
1.3 KiB
Python
import secrets
|
|
from django.core.management.base import BaseCommand,CommandError
|
|
from django.db import transaction
|
|
from monitoring.models import Segment,Server,AgentCredential,Audit
|
|
from monitoring.auth import digest
|
|
class Command(BaseCommand):
|
|
help='Register host or rotate its token; prints the secret once. Keep output private.'
|
|
def add_arguments(self,p):
|
|
p.add_argument('name');p.add_argument('--segment',required=True);p.add_argument('--address',default='');p.add_argument('--rotate',action='store_true')
|
|
@transaction.atomic
|
|
def handle(self,*args,**o):
|
|
seg,_=Segment.objects.get_or_create(name=o['segment'])
|
|
s,created=Server.objects.get_or_create(name=o['name'],defaults={'segment':seg,'address':o['address']})
|
|
if not created and not o['rotate']: raise CommandError('Already registered; use --rotate to revoke old credentials')
|
|
AgentCredential.objects.filter(server=s).update(active=False)
|
|
token=secrets.token_urlsafe(48)
|
|
AgentCredential.objects.create(server=s,digest=digest(token))
|
|
Audit.objects.create(actor='management-command',action='register_agent',details={'server':str(s.pk),'rotated':not created})
|
|
self.stdout.write('SERVER_ID='+str(s.pk))
|
|
self.stdout.write('AGENT_TOKEN='+token)
|