1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2024-12-25 15:45:23 +00:00
webvirtcloud/datasource/views.py
2020-06-04 08:48:43 +03:00

113 lines
2.7 KiB
Python

import json
import socket
from django.shortcuts import render
from django.http import HttpResponse, Http404
from libvirt import libvirtError
from accounts.models import UserInstance, UserSSHKey
from instances.models import Instance
from vrtManager.instance import wvmInstance
OS_VERSIONS = ['latest', '']
OS_UUID = "iid-dswebvirtcloud"
def os_index(request):
"""
:param request:
:return:
"""
response = '\n'.join(OS_VERSIONS)
return HttpResponse(response)
def os_metadata_json(request, version):
"""
:param request:
:param version:
:return:
"""
if version == 'latest':
ip = get_client_ip(request)
hostname = get_hostname_by_ip(ip)
response = {'uuid': OS_UUID, 'hostname': hostname}
return HttpResponse(json.dumps(response))
else:
err = 'Invalid version: {}'.format(version)
raise Http404(err)
def os_userdata(request, version):
"""
:param request:
:param version:
:return:
"""
if version == 'latest':
ip = get_client_ip(request)
hostname = get_hostname_by_ip(ip)
vname = hostname.split('.')[0]
instance_keys = []
userinstances = UserInstance.objects.filter(instance__name=vname)
for ui in userinstances:
keys = UserSSHKey.objects.filter(user=ui.user)
for k in keys:
instance_keys.append(k.keypublic)
return render(request, 'user_data', locals())
else:
err = 'Invalid version: {}'.format(version)
raise Http404(err)
def get_client_ip(request):
"""
:param request:
:return:
"""
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[-1].strip()
else:
ip = request.META.get('REMOTE_ADDR')
return ip
def get_hostname_by_ip(ip):
"""
:param ip:
:return:
"""
try:
addrs = socket.gethostbyaddr(ip)
except:
addrs = [ip]
return addrs[0]
def get_vdi_url(request, vname):
"""
:param request:
:param vname:
:return:
"""
instance = Instance.objects.get(name=vname)
compute = instance.compute
data = {}
try:
conn = wvmInstance(compute.hostname,
compute.login,
compute.password,
compute.type,
instance.name)
fqdn = get_hostname_by_ip(compute.hostname)
url = "{}://{}:{}".format(conn.get_console_type(), fqdn, conn.get_console_port())
response = url
return HttpResponse(response)
except libvirtError as lib_err:
err = "Error getting vdi url for {}".format(vname)
raise Http404(err)