views.py 19.1 KB
Newer Older
1
# Copyright 2011 GRNET S.A. All rights reserved.
2
#
3
4
5
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met:
6
#
7
8
9
#   1. Redistributions of source code must retain the above
#      copyright notice, this list of conditions and the following
#      disclaimer.
10
#
11
12
13
14
#   2. Redistributions in binary form must reproduce the above
#      copyright notice, this list of conditions and the following
#      disclaimer in the documentation and/or other materials
#      provided with the distribution.
15
#
16
17
18
19
20
21
22
23
24
25
26
27
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
30
31
32
# The views and conclusions contained in the software and
# documentation are those of the authors and should not be
# interpreted as representing official policies, either expressed
# or implied, of GRNET S.A.
33
#
34

35
import os
36

37
38
from urlparse import urlparse

39
from django.conf import settings
40
from django.utils.translation import gettext_lazy as _
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
41
from django.template import loader
Dimitris Moraitis's avatar
Dimitris Moraitis committed
42
from django.http import HttpResponse
Dimitris Moraitis's avatar
Dimitris Moraitis committed
43
from django.utils.translation import get_language
Markos Gogoulos's avatar
Markos Gogoulos committed
44
from django.utils import simplejson as json
45
from synnefo_branding.utils import render_to_string
46
from django.core.urlresolvers import reverse
47
from django.template import RequestContext
48
from synnefo_branding import settings as snf_settings
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
49

Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
50
from synnefo.util.version import get_component_version
51
from synnefo.lib import join_urls
52

53
from snf_django.lib.astakos import get_user
54
from synnefo import cyclades_settings
55
from synnefo.ui import settings as uisettings
56

Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
57
SYNNEFO_JS_LIB_VERSION = get_component_version('app')
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
58

59
60
# UI preferences settings
TIMEOUT = getattr(settings, "TIMEOUT", 10000)
61
UPDATE_INTERVAL = getattr(settings, "UI_UPDATE_INTERVAL", 5000)
62
CHANGES_SINCE_ALIGNMENT = getattr(settings, "UI_CHANGES_SINCE_ALIGNMENT", 0)
63
64
UPDATE_INTERVAL_INCREASE = getattr(settings, "UI_UPDATE_INTERVAL_INCREASE",
                                   500)
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
65
66
UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT = \
    getattr(settings, "UI_UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT", 3)
67
68
UPDATE_INTERVAL_FAST = getattr(settings, "UI_UPDATE_INTERVAL_FAST", 2500)
UPDATE_INTERVAL_MAX = getattr(settings, "UI_UPDATE_INTERVAL_MAX", 10000)
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
69

70
# predefined values settings
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
71
72
VM_IMAGE_COMMON_METADATA = \
    getattr(settings, "UI_VM_IMAGE_COMMON_METADATA", ["OS", "users"])
73
SUGGESTED_FLAVORS_DEFAULT = {}
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
74
75
76
77
78
79
SUGGESTED_FLAVORS = getattr(settings, "VM_CREATE_SUGGESTED_FLAVORS",
                            SUGGESTED_FLAVORS_DEFAULT)
SUGGESTED_ROLES_DEFAULT = ["Database server", "File server", "Mail server",
                           "Web server", "Proxy"]
SUGGESTED_ROLES = getattr(settings, "VM_CREATE_SUGGESTED_ROLES",
                          SUGGESTED_ROLES_DEFAULT)
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
80
IMAGE_ICONS = settings.IMAGE_ICONS
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
81
82
83
84
IMAGE_DELETED_TITLE = \
    getattr(settings, 'UI_IMAGE_DELETED_TITLE', '(deleted)')
IMAGE_DELETED_SIZE_TITLE = \
    getattr(settings, 'UI_IMAGE_DELETED_SIZE_TITLE', '(none)')
85

86
87
SUPPORT_SSH_OS_LIST = getattr(settings, "UI_SUPPORT_SSH_OS_LIST",)
OS_CREATED_USERS = getattr(settings, "UI_OS_DEFAULT_USER_MAP")
88
UNKNOWN_OS = getattr(settings, "UI_UNKNOWN_OS", "unknown")
89

90
AUTH_COOKIE_NAME = getattr(settings, "UI_AUTH_COOKIE_NAME", 'synnefo_user')
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
91

92
93
94
# never change window location. Helpful in development environments
AUTH_SKIP_REDIRECTS = getattr(settings, "UI_AUTH_SKIP_REDIRECTS", False)

95
96
97
# UI behaviour settings
DELAY_ON_BLUR = getattr(settings, "UI_DELAY_ON_BLUR", True)
UPDATE_HIDDEN_VIEWS = getattr(settings, "UI_UPDATE_HIDDEN_VIEWS", False)
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
98
99
HANDLE_WINDOW_EXCEPTIONS = \
    getattr(settings, "UI_HANDLE_WINDOW_EXCEPTIONS", True)
100
SKIP_TIMEOUTS = getattr(settings, "UI_SKIP_TIMEOUTS", 1)
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
101

102
103
# Additional settings
VM_NAME_TEMPLATE = getattr(settings, "VM_CREATE_NAME_TPL", "My {0} server")
104
VM_HOSTNAME_FORMAT = getattr(settings, "UI_VM_HOSTNAME_FORMAT",
105
                                    'snf-%(id)s.vm.synnefo.org')
106
107

if isinstance(VM_HOSTNAME_FORMAT, basestring):
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
108
    VM_HOSTNAME_FORMAT = VM_HOSTNAME_FORMAT % {'id': '{0}'}
109

110
MAX_SSH_KEYS_PER_USER = getattr(settings, "USERDATA_MAX_SSH_KEYS_PER_USER")
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
111
112
FLAVORS_DISK_TEMPLATES_INFO = \
    getattr(settings, "UI_FLAVORS_DISK_TEMPLATES_INFO", {})
113
SYSTEM_IMAGES_OWNERS = getattr(settings, "UI_SYSTEM_IMAGES_OWNERS", {})
114
CUSTOM_IMAGE_HELP_URL = getattr(settings, "UI_CUSTOM_IMAGE_HELP_URL", None)
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
115

116
# MEDIA PATHS
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
UI_MEDIA_URL = \
    getattr(settings, "UI_MEDIA_URL",
            "%ssnf-%s/" % (settings.MEDIA_URL, SYNNEFO_JS_LIB_VERSION))
UI_SYNNEFO_IMAGES_URL = \
    getattr(settings,
            "UI_SYNNEFO_IMAGES_URL", UI_MEDIA_URL + "images/")
UI_SYNNEFO_CSS_URL = \
    getattr(settings,
            "UI_SYNNEFO_CSS_URL", UI_MEDIA_URL + "css/")
UI_SYNNEFO_JS_URL = \
    getattr(settings,
            "UI_SYNNEFO_JS_URL", UI_MEDIA_URL + "js/")
UI_SYNNEFO_JS_LIB_URL = \
    getattr(settings,
            "UI_SYNNEFO_JS_LIB_URL", UI_SYNNEFO_JS_URL + "lib/")
UI_SYNNEFO_JS_WEB_URL = \
    getattr(settings, "UI_SYNNEFO_JS_WEB_URL", UI_SYNNEFO_JS_URL + "ui/web/")
134

Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
135
136
# extensions
ENABLE_GLANCE = getattr(settings, 'UI_ENABLE_GLANCE', True)
137

Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
138
139
DIAGNOSTICS_UPDATE_INTERVAL = \
    getattr(settings, 'UI_DIAGNOSTICS_UPDATE_INTERVAL', 2000)
140

141
# network settings
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
142
143
144
145
146
DEFAULT_NETWORK_TYPES = {'MAC_FILTERED': 'mac-filtering',
                         'PHYSICAL_VLAN': 'physical-vlan'}
NETWORK_TYPES = \
    getattr(settings,
            'UI_NETWORK_AVAILABLE_NETWORK_TYPES', DEFAULT_NETWORK_TYPES)
147
DEFAULT_NETWORK_SUBNETS = ['10.0.0.0/24', '192.168.1.1/24']
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
148
149
150
151
152
153
154
155
156
NETWORK_SUBNETS = \
    getattr(settings,
            'UI_NETWORK_AVAILABLE_SUBNETS', DEFAULT_NETWORK_SUBNETS)
NETWORK_DUPLICATE_NICS = \
    getattr(settings,
            'UI_NETWORK_ALLOW_DUPLICATE_VM_NICS', False)
NETWORK_STRICT_DESTROY = \
    getattr(settings,
            'UI_NETWORK_STRICT_DESTROY', False)
157
158
159
PRIVATE_NETWORKS_NIC_HOTPLUG = \
    getattr(settings,
            'UI_PRIVATE_NETWORK_NIC_HOTPLUG', False)
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
160
161
162
NETWORK_ALLOW_MULTIPLE_DESTROY = \
    getattr(settings,
            'UI_NETWORK_ALLOW_MULTIPLE_DESTROY', False)
163
164
AUTOMATIC_NETWORK_RANGE_FORMAT = getattr(settings,
                                         'UI_AUTOMATIC_NETWORK_RANGE_FORMAT',
165
166
                                         "192.168.%d.0/24").replace("%d",
                                                                    "{0}")
167
GROUP_PUBLIC_NETWORKS = getattr(settings, 'UI_GROUP_PUBLIC_NETWORKS', True)
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
168
169
GROUPED_PUBLIC_NETWORK_NAME = \
    getattr(settings, 'UI_GROUPED_PUBLIC_NETWORK_NAME', 'Internet')
170

171

172
def template(name, request, context):
Dimitris Moraitis's avatar
Dimitris Moraitis committed
173
    template_path = os.path.join(os.path.dirname(__file__), "templates/")
174
175
    current_template = template_path + name + '.html'
    t = loader.get_template(current_template)
176
177
178
179
180
181
182
183
184
185
186
    media_context = {
       'UI_MEDIA_URL': UI_MEDIA_URL,
       'SYNNEFO_JS_URL': UI_SYNNEFO_JS_URL,
       'SYNNEFO_JS_LIB_URL': UI_SYNNEFO_JS_LIB_URL,
       'SYNNEFO_JS_WEB_URL': UI_SYNNEFO_JS_WEB_URL,
       'SYNNEFO_IMAGES_URL': UI_SYNNEFO_IMAGES_URL,
       'SYNNEFO_CSS_URL': UI_SYNNEFO_CSS_URL,
       'SYNNEFO_JS_LIB_VERSION': SYNNEFO_JS_LIB_VERSION,
       'DEBUG': settings.DEBUG
    }
    context.update(media_context)
187
    return HttpResponse(t.render(RequestContext(request, context)))
Dimitris Moraitis's avatar
Dimitris Moraitis committed
188

Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
189

Dimitris Moraitis's avatar
Dimitris Moraitis committed
190
def home(request):
Dimitris Moraitis's avatar
Dimitris Moraitis committed
191
    context = {'timeout': TIMEOUT,
192
               'project': '+nefo',
Dimitris Moraitis's avatar
Dimitris Moraitis committed
193
               'request': request,
194
               'current_lang': get_language() or 'en',
195
               'compute_api_url': json.dumps(uisettings.COMPUTE_URL),
196
               'network_api_url': json.dumps(uisettings.NETWORK_URL),
197
198
               'user_catalog_url': json.dumps(uisettings.USER_CATALOG_URL),
               'feedback_post_url': json.dumps(uisettings.FEEDBACK_URL),
199
               'accounts_api_url': json.dumps(uisettings.ACCOUNT_URL),
200
201
202
203
               'logout_redirect': json.dumps(uisettings.LOGOUT_REDIRECT),
               'login_redirect': json.dumps(uisettings.LOGIN_URL),
               'glance_api_url': json.dumps(uisettings.GLANCE_URL),
               'translate_uuids': json.dumps(True),
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
204
               # update interval settings
205
               'update_interval': UPDATE_INTERVAL,
206
               'update_interval_increase': UPDATE_INTERVAL_INCREASE,
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
207
               'update_interval_increase_after_calls':
208
                UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT,
209
210
               'update_interval_fast': UPDATE_INTERVAL_FAST,
               'update_interval_max': UPDATE_INTERVAL_MAX,
211
               'changes_since_alignment': CHANGES_SINCE_ALIGNMENT,
212
               'image_icons': IMAGE_ICONS,
213
               'auth_cookie_name': AUTH_COOKIE_NAME,
214
               'auth_skip_redirects': json.dumps(AUTH_SKIP_REDIRECTS),
215
               'suggested_flavors': json.dumps(SUGGESTED_FLAVORS),
216
               'suggested_roles': json.dumps(SUGGESTED_ROLES),
217
               'vm_image_common_metadata': json.dumps(VM_IMAGE_COMMON_METADATA),
218
               'synnefo_version': SYNNEFO_JS_LIB_VERSION,
219
220
221
222
               'delay_on_blur': json.dumps(DELAY_ON_BLUR),
               'update_hidden_views': json.dumps(UPDATE_HIDDEN_VIEWS),
               'handle_window_exceptions': json.dumps(HANDLE_WINDOW_EXCEPTIONS),
               'skip_timeouts': json.dumps(SKIP_TIMEOUTS),
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
223
               'vm_name_template': json.dumps(VM_NAME_TEMPLATE),
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
224
225
               'flavors_disk_templates_info':
               json.dumps(FLAVORS_DISK_TEMPLATES_INFO),
226
               'support_ssh_os_list': json.dumps(SUPPORT_SSH_OS_LIST),
227
               'unknown_os': json.dumps(UNKNOWN_OS),
228
               'os_created_users': json.dumps(OS_CREATED_USERS),
229
               'userdata_keys_limit': json.dumps(MAX_SSH_KEYS_PER_USER),
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
230
               'use_glance': json.dumps(ENABLE_GLANCE),
231
               'system_images_owners': json.dumps(SYSTEM_IMAGES_OWNERS),
232
               'custom_image_help_url': CUSTOM_IMAGE_HELP_URL,
233
234
               'image_deleted_title': json.dumps(IMAGE_DELETED_TITLE),
               'image_deleted_size_title': json.dumps(IMAGE_DELETED_SIZE_TITLE),
235
236
               'network_suggested_subnets': json.dumps(NETWORK_SUBNETS),
               'network_available_types': json.dumps(NETWORK_TYPES),
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
237
238
               'network_allow_duplicate_vm_nics':
               json.dumps(NETWORK_DUPLICATE_NICS),
239
               'network_strict_destroy': json.dumps(NETWORK_STRICT_DESTROY),
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
240
241
242
243
244
245
               'network_allow_multiple_destroy':
               json.dumps(NETWORK_ALLOW_MULTIPLE_DESTROY),
               'automatic_network_range_format':
               json.dumps(AUTOMATIC_NETWORK_RANGE_FORMAT),
               'grouped_public_network_name':
               json.dumps(GROUPED_PUBLIC_NETWORK_NAME),
246
               'group_public_networks': json.dumps(GROUP_PUBLIC_NETWORKS),
247
248
               'private_networks_nic_hotplug':
                   json.dumps(PRIVATE_NETWORKS_NIC_HOTPLUG),
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
249
250
               'diagnostics_update_interval':
               json.dumps(DIAGNOSTICS_UPDATE_INTERVAL),
251
               'vm_hostname_format': json.dumps(VM_HOSTNAME_FORMAT)
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
252
               }
253
    return template('home', request, context)
Dimitris Moraitis's avatar
Dimitris Moraitis committed
254

255
def machines_console(request):
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
256
257
258
259
260
261
262
    host, port, password = ('', '', '')
    host = request.GET.get('host', '')
    port = request.GET.get('port', '')
    password = request.GET.get('password', '')
    machine = request.GET.get('machine', '')
    host_ip = request.GET.get('host_ip', '')
    host_ip_v6 = request.GET.get('host_ip_v6', '')
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
263
264
    context = {'host': host, 'port': port, 'password': password,
               'machine': machine, 'host_ip': host_ip, 'host_ip_v6': host_ip_v6}
265
    return template('machines_console', request, context)
Dimitris Moraitis's avatar
Dimitris Moraitis committed
266

Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
267

268
def js_tests(request):
269
    return template('tests', request, {})
270

Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285

CONNECT_LINUX_LINUX_MESSAGE = \
    _("""A direct connection to this machine can be established using the
<a target="_blank" href="http://en.wikipedia.org/wiki/Secure_Shell">
SSH Protocol</a>.
To do so open a terminal and type the following at the prompt to connect
to your machine:""")
CONNECT_LINUX_WINDOWS_MESSAGE = \
    _("""A direct connection to this machine can be established using
<a target="_blank"
href="http://en.wikipedia.org/wiki/Remote_Desktop_Services">
Remote Desktop Service</a>.
To do so, open the following file with an appropriate remote desktop client.""")
CONNECT_LINUX_WINDOWS_SUBMESSAGE = \
    _("""If you don't have a Remote Desktop client already installed,
286
we suggest the use of <a target="_blank"
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
287
288
289
290
href=
"http://sourceforge.net/projects/tsclient/files/latest/download?source=files">
tsclient</a>.<br /><span class="important">IMPORTANT: It may take up to 15
minutes for your Windows VM to become available
291
after its creation.</span>""")
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
292
293
294
CONNECT_WINDOWS_LINUX_MESSAGE = \
    _("""A direct connection to this machine can be established using the
<a target="_blank"
295
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
296
Open an ssh client such as PuTTY and type the following:""")
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
297
298
299
300
301
302
303
304
CONNECT_WINDOWS_LINUX_SUBMESSAGE = \
    _("""If you do not have an ssh client already installed,
<a target="_blank"
href="http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe">
Download PuTTY</a>""")

CONNECT_WINDOWS_WINDOWS_MESSAGE = \
    _("""A direct connection to this machine can be
305
306
established using Remote Desktop. Click on the following link, and if asked
open it using "Remote Desktop Connection".
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
307
308
<br /><span class="important">
IMPORTANT: It may take up to 15 minutes for your Windows VM to become available
309
after its creation.</span>""")
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
310
311
CONNECT_WINDOWS_WINDOWS_SUBMESSAGE = \
    _("""Save this file to disk for future use.""")
312
313
314
315
316
317

# info/subinfo for all os combinations
#
# [0] info gets displayed on top of the message box
# [1] subinfo gets displayed on the bottom as extra info
# provided to the user when needed
318
CONNECT_PROMPT_MESSAGES = {
319
    'linux': {
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
320
321
322
323
        'linux': [CONNECT_LINUX_LINUX_MESSAGE, ""],
        'windows': [CONNECT_LINUX_WINDOWS_MESSAGE,
                    CONNECT_LINUX_WINDOWS_SUBMESSAGE],
        'ssh_message': "ssh %(user)s@%(hostname)s"
324
    },
325
    'windows': {
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
326
327
328
329
330
        'linux': [CONNECT_WINDOWS_LINUX_MESSAGE,
                  CONNECT_WINDOWS_LINUX_SUBMESSAGE],
        'windows': [CONNECT_WINDOWS_WINDOWS_MESSAGE,
                    CONNECT_WINDOWS_WINDOWS_SUBMESSAGE],
        'ssh_message': "%(user)s@%(hostname)s"
331
332
333
    },
}

Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
334
335
APPEND_CONNECT_PROMPT_MESSAGES = \
    getattr(settings, 'UI_CONNECT_PROMPT_MESSAGES', {})
336
337
for k, v in APPEND_CONNECT_PROMPT_MESSAGES.iteritems():
    CONNECT_PROMPT_MESSAGES[k].update(v)
338

339
# retrieve domain prefix from settings
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
340
341
DOMAIN_PREFIX = getattr(settings, 'MACHINE_DOMAIN_PREFIX', getattr(settings,
                        'BACKEND_PREFIX_ID', ""))
342
343
344
345

# domain template string
DOMAIN_TPL = "%s%%s" % DOMAIN_PREFIX

Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
346

347
def machines_connect(request):
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
348
349
350
    ip_address = request.GET.get('ip_address', '')
    hostname = request.GET.get('hostname', '')
    operating_system = metadata_os = request.GET.get('os', '')
351
    server_id = request.GET.get('srv', 0)
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
352
    host_os = request.GET.get('host_os', 'Linux').lower()
353
    username = request.GET.get('username', None)
354
    domain = request.GET.get("domain", DOMAIN_TPL % int(server_id))
355

356
    # guess host os
357
358
359
    if host_os != "windows":
        host_os = 'linux'

360
361
362
363
364
365
366
367
368
369
370
371
    # guess username
    if not username:
        username = "root"

        if metadata_os.lower() in ['ubuntu', 'kubuntu', 'fedora']:
            username = "user"

        if metadata_os.lower() == "windows":
            username = "Administrator"

    # operating system provides ssh access
    ssh = False
372
373
    if operating_system != "windows":
        operating_system = "linux"
374
        ssh = True
375

376
    # rdp param is set, the user requested rdp file
377
378
    # check if we are on windows
    if operating_system == 'windows' and request.GET.get("rdp", False):
379
        extra_rdp_content = ''
380
381
        # UI sent domain info (from vm metadata) use this
        # otherwise use our default snf-<vm_id> domain
382
383
384
385
386
        EXTRA_RDP_CONTENT = getattr(settings, 'UI_EXTRA_RDP_CONTENT', '')
        if callable(EXTRA_RDP_CONTENT):
            extra_rdp_content = EXTRA_RDP_CONTENT(server_id, ip_address,
                                                  hostname, username)
        else:
387
388
389
390
391
392
393
394
            if EXTRA_RDP_CONTENT:
                extra_rdp_content = EXTRA_RDP_CONTENT % \
                    {
                        'server_id': server_id,
                        'ip_address': ip_address,
                        'hostname': hostname,
                        'user': username
                      }
395

396
        rdp_context = {
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
397
398
399
400
401
            'username': username,
            'domain': domain,
            'ip_address': ip_address,
            'hostname': hostname,
            'extra_content': extra_rdp_content
402
403
404
405
        }

        rdp_file_data = render_to_string("synnefo-windows.rdp", rdp_context)
        response = HttpResponse(rdp_file_data, mimetype='application/x-rdp')
406
407

        # proper filename, use server id and ip address
408
        filename = "%d-%s.rdp" % (int(server_id), hostname)
409
        response['Content-Disposition'] = 'attachment; filename=%s' % filename
410
    else:
411
412
413
414
415
416
417
        ssh_message = CONNECT_PROMPT_MESSAGES['linux'].get('ssh_message')
        if host_os == 'windows':
            ssh_message = CONNECT_PROMPT_MESSAGES['windows'].get('ssh_message')
        if callable(ssh_message):
            link_title = ssh_message(server_id, ip_address, hostname, username)
        else:
            link_title = ssh_message % {
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
418
419
420
421
422
                'server_id': server_id,
                'ip_address': ip_address,
                'hostname': hostname,
                'user': username
            }
423
        if (operating_system != "windows"):
424
425
            link_url = None

426
427
        else:
            link_title = _("Remote desktop to %s") % ip_address
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
428
429
430
            link_url = \
                "%s?ip_address=%s&os=%s&rdp=1&srv=%d&username=%s&domain=%s" \
                "&hostname=%s" % (
431
                    reverse("ui_machines_connect"), ip_address,
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
432
433
                    operating_system, int(server_id), username,
                    domain, hostname)
434

435
436
        # try to find a specific message
        try:
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
437
438
            connect_message = \
                CONNECT_PROMPT_MESSAGES[host_os][operating_system][0]
439
            subinfo = CONNECT_PROMPT_MESSAGES[host_os][operating_system][1]
440
        except KeyError:
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
441
442
443
            connect_message = \
                _("You are trying to connect from a %s "
                  "machine to a %s machine") % (host_os, operating_system)
444
            subinfo = ""
445

446
        response_object = {
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
447
448
449
450
451
452
453
454
455
456
            'ip': ip_address,
            'os': operating_system,
            'ssh': ssh,
            'info': unicode(connect_message),
            'subinfo': unicode(subinfo),
            'link': {'title': unicode(link_title), 'url': link_url}
        }
        response = \
            HttpResponse(json.dumps(response_object),
                         mimetype='application/json')  # no windows, no rdp
457

458
    return response
459