views.py 18.7 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
from django.conf import settings
38
from django.utils.translation import gettext_lazy as _
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
39
from django.template import loader
Dimitris Moraitis's avatar
Dimitris Moraitis committed
40
from django.http import HttpResponse
Dimitris Moraitis's avatar
Dimitris Moraitis committed
41
from django.utils.translation import get_language
Markos Gogoulos's avatar
Markos Gogoulos committed
42
from django.utils import simplejson as json
43
from django.template.loader import render_to_string
44
from django.core.urlresolvers import reverse
45
from django.template import RequestContext
46
from synnefo_branding import settings as snf_settings
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
47

Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
48
from synnefo.util.version import get_component_version
49

50
from snf_django.lib.astakos import get_user
51

Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
52
SYNNEFO_JS_LIB_VERSION = get_component_version('app')
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
53
54
55
56

# api configuration
COMPUTE_API_URL = getattr(settings, 'COMPUTE_API_URL', '/api/v1.1')

57
58
# UI preferences settings
TIMEOUT = getattr(settings, "TIMEOUT", 10000)
59
UPDATE_INTERVAL = getattr(settings, "UI_UPDATE_INTERVAL", 5000)
60
CHANGES_SINCE_ALIGNMENT = getattr(settings, "UI_CHANGES_SINCE_ALIGNMENT", 0)
61
UPDATE_INTERVAL_INCREASE = getattr(settings, "UI_UPDATE_INTERVAL_INCREASE", 500)
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
62
63
UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT = \
    getattr(settings, "UI_UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT", 3)
64
65
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
66

67
# predefined values settings
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
68
69
VM_IMAGE_COMMON_METADATA = \
    getattr(settings, "UI_VM_IMAGE_COMMON_METADATA", ["OS", "users"])
70
SUGGESTED_FLAVORS_DEFAULT = {}
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
71
72
73
74
75
76
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
77
IMAGE_ICONS = settings.IMAGE_ICONS
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
78
79
80
81
IMAGE_DELETED_TITLE = \
    getattr(settings, 'UI_IMAGE_DELETED_TITLE', '(deleted)')
IMAGE_DELETED_SIZE_TITLE = \
    getattr(settings, 'UI_IMAGE_DELETED_SIZE_TITLE', '(none)')
82

83
84
SUPPORT_SSH_OS_LIST = getattr(settings, "UI_SUPPORT_SSH_OS_LIST",)
OS_CREATED_USERS = getattr(settings, "UI_OS_DEFAULT_USER_MAP")
85
UNKNOWN_OS = getattr(settings, "UI_UNKNOWN_OS", "unknown")
86
87
88
LOGOUT_URL = getattr(settings, "UI_LOGOUT_URL", '/im/authenticate')
LOGIN_URL = getattr(settings, "UI_LOGIN_URL", '/im/login')
AUTH_COOKIE_NAME = getattr(settings, "UI_AUTH_COOKIE_NAME", 'synnefo_user')
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
89

90
91
92
# 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
93
94
HANDLE_WINDOW_EXCEPTIONS = \
    getattr(settings, "UI_HANDLE_WINDOW_EXCEPTIONS", True)
95
SKIP_TIMEOUTS = getattr(settings, "UI_SKIP_TIMEOUTS", 1)
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
96

97
98
# Additional settings
VM_NAME_TEMPLATE = getattr(settings, "VM_CREATE_NAME_TPL", "My {0} server")
99
VM_HOSTNAME_FORMAT = getattr(settings, "UI_VM_HOSTNAME_FORMAT",
100
                                    'snf-%(id)s.vm.synnefo.org')
101
102

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

105
MAX_SSH_KEYS_PER_USER = getattr(settings, "USERDATA_MAX_SSH_KEYS_PER_USER")
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
106
107
FLAVORS_DISK_TEMPLATES_INFO = \
    getattr(settings, "UI_FLAVORS_DISK_TEMPLATES_INFO", {})
108
SYSTEM_IMAGES_OWNERS = getattr(settings, "UI_SYSTEM_IMAGES_OWNERS", {})
109
CUSTOM_IMAGE_HELP_URL = getattr(settings, "UI_CUSTOM_IMAGE_HELP_URL", None)
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
110

111
# MEDIA PATHS
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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/")
129

Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
130
131
132
# extensions
ENABLE_GLANCE = getattr(settings, 'UI_ENABLE_GLANCE', True)
GLANCE_API_URL = getattr(settings, 'UI_GLANCE_API_URL', '/glance')
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
133
134
DIAGNOSTICS_UPDATE_INTERVAL = \
    getattr(settings, 'UI_DIAGNOSTICS_UPDATE_INTERVAL', 2000)
135

136
# network settings
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
137
138
139
140
141
DEFAULT_NETWORK_TYPES = {'MAC_FILTERED': 'mac-filtering',
                         'PHYSICAL_VLAN': 'physical-vlan'}
NETWORK_TYPES = \
    getattr(settings,
            'UI_NETWORK_AVAILABLE_NETWORK_TYPES', DEFAULT_NETWORK_TYPES)
142
DEFAULT_NETWORK_SUBNETS = ['10.0.0.0/24', '192.168.1.1/24']
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
143
144
145
146
147
148
149
150
151
152
153
154
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)
NETWORK_ALLOW_MULTIPLE_DESTROY = \
    getattr(settings,
            'UI_NETWORK_ALLOW_MULTIPLE_DESTROY', False)
155
156
AUTOMATIC_NETWORK_RANGE_FORMAT = getattr(settings,
                                         'UI_AUTOMATIC_NETWORK_RANGE_FORMAT',
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
157
                                         "192.168.%d.0/24").replace("%d", "{0}")
158
GROUP_PUBLIC_NETWORKS = getattr(settings, 'UI_GROUP_PUBLIC_NETWORKS', True)
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
159
160
GROUPED_PUBLIC_NETWORK_NAME = \
    getattr(settings, 'UI_GROUPED_PUBLIC_NETWORK_NAME', 'Internet')
161

162
163
USER_CATALOG_URL = getattr(settings, 'UI_USER_CATALOG_URL', '/astakos/api/user_catalogs')
FEEDBACK_POST_URL = getattr(settings, 'UI_FEEDBACK_POST_URL', '/astakos/api/feedback')
164
TRANSLATE_UUIDS = not getattr(settings, 'TRANSLATE_UUIDS', False)
165
ACCOUNTS_API_URL = getattr(settings, 'UI_ACCOUNTS_API_URL', '/astakos/api')
166
167


168
def template(name, request, context):
Dimitris Moraitis's avatar
Dimitris Moraitis committed
169
    template_path = os.path.join(os.path.dirname(__file__), "templates/")
170
171
    current_template = template_path + name + '.html'
    t = loader.get_template(current_template)
172
173
174
175
176
177
178
179
180
181
182
    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)
183
    return HttpResponse(t.render(RequestContext(request, context)))
Dimitris Moraitis's avatar
Dimitris Moraitis committed
184

Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
185

Dimitris Moraitis's avatar
Dimitris Moraitis committed
186
def home(request):
Dimitris Moraitis's avatar
Dimitris Moraitis committed
187
    context = {'timeout': TIMEOUT,
188
               'project': '+nefo',
Dimitris Moraitis's avatar
Dimitris Moraitis committed
189
               'request': request,
190
               'current_lang': get_language() or 'en',
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
191
               'compute_api_url': json.dumps(COMPUTE_API_URL),
192
               'user_catalog_url': json.dumps(USER_CATALOG_URL),
193
               'feedback_post_url': json.dumps(FEEDBACK_POST_URL),
194
               'accounts_api_url': json.dumps(ACCOUNTS_API_URL),
195
               'translate_uuids': json.dumps(TRANSLATE_UUIDS),
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
196
               # update interval settings
197
               'update_interval': UPDATE_INTERVAL,
198
               'update_interval_increase': UPDATE_INTERVAL_INCREASE,
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
199
               'update_interval_increase_after_calls':
200
                UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT,
201
202
               'update_interval_fast': UPDATE_INTERVAL_FAST,
               'update_interval_max': UPDATE_INTERVAL_MAX,
Olga Brani's avatar
Olga Brani committed
203
               'changes_since_alignment': CHANGES_SINCE_ALIGNMENT, 
204
               'image_icons': IMAGE_ICONS,
205
               'logout_redirect': LOGOUT_URL,
206
207
               'login_redirect': LOGIN_URL,
               'auth_cookie_name': AUTH_COOKIE_NAME,
208
               'suggested_flavors': json.dumps(SUGGESTED_FLAVORS),
209
               'suggested_roles': json.dumps(SUGGESTED_ROLES),
210
               'vm_image_common_metadata': json.dumps(VM_IMAGE_COMMON_METADATA),
211
               'synnefo_version': SYNNEFO_JS_LIB_VERSION,
212
213
214
215
               '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
216
               'vm_name_template': json.dumps(VM_NAME_TEMPLATE),
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
217
218
               'flavors_disk_templates_info':
               json.dumps(FLAVORS_DISK_TEMPLATES_INFO),
219
220
               'support_ssh_os_list': json.dumps(SUPPORT_SSH_OS_LIST),
               'os_created_users': json.dumps(OS_CREATED_USERS),
221
               'userdata_keys_limit': json.dumps(MAX_SSH_KEYS_PER_USER),
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
222
               'use_glance': json.dumps(ENABLE_GLANCE),
223
               'glance_api_url': json.dumps(GLANCE_API_URL),
224
               'system_images_owners': json.dumps(SYSTEM_IMAGES_OWNERS),
225
               'custom_image_help_url': CUSTOM_IMAGE_HELP_URL,
226
227
               'image_deleted_title': json.dumps(IMAGE_DELETED_TITLE),
               'image_deleted_size_title': json.dumps(IMAGE_DELETED_SIZE_TITLE),
228
229
               'network_suggested_subnets': json.dumps(NETWORK_SUBNETS),
               'network_available_types': json.dumps(NETWORK_TYPES),
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
230
231
               'network_allow_duplicate_vm_nics':
               json.dumps(NETWORK_DUPLICATE_NICS),
232
               'network_strict_destroy': json.dumps(NETWORK_STRICT_DESTROY),
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
233
234
235
236
237
238
               '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),
239
               'group_public_networks': json.dumps(GROUP_PUBLIC_NETWORKS),
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
240
241
               'diagnostics_update_interval':
               json.dumps(DIAGNOSTICS_UPDATE_INTERVAL),
242
               'vm_hostname_format': json.dumps(VM_HOSTNAME_FORMAT)
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
243
               }
244
    return template('home', request, context)
Dimitris Moraitis's avatar
Dimitris Moraitis committed
245

246
def machines_console(request):
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
247
248
249
250
251
252
253
    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
254
255
    context = {'host': host, 'port': port, 'password': password,
               'machine': machine, 'host_ip': host_ip, 'host_ip_v6': host_ip_v6}
256
    return template('machines_console', request, context)
Dimitris Moraitis's avatar
Dimitris Moraitis committed
257

Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
258

259
def js_tests(request):
260
    return template('tests', request, {})
261

Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276

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,
277
we suggest the use of <a target="_blank"
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
278
279
280
281
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
282
after its creation.</span>""")
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
283
284
285
CONNECT_WINDOWS_LINUX_MESSAGE = \
    _("""A direct connection to this machine can be established using the
<a target="_blank"
286
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
287
Open an ssh client such as PuTTY and type the following:""")
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
288
289
290
291
292
293
294
295
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
296
297
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
298
299
<br /><span class="important">
IMPORTANT: It may take up to 15 minutes for your Windows VM to become available
300
after its creation.</span>""")
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
301
302
CONNECT_WINDOWS_WINDOWS_SUBMESSAGE = \
    _("""Save this file to disk for future use.""")
303
304
305
306
307
308

# 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
309
CONNECT_PROMPT_MESSAGES = {
310
    'linux': {
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
311
312
313
314
        'linux': [CONNECT_LINUX_LINUX_MESSAGE, ""],
        'windows': [CONNECT_LINUX_WINDOWS_MESSAGE,
                    CONNECT_LINUX_WINDOWS_SUBMESSAGE],
        'ssh_message': "ssh %(user)s@%(hostname)s"
315
    },
316
    'windows': {
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
317
318
319
320
321
        'linux': [CONNECT_WINDOWS_LINUX_MESSAGE,
                  CONNECT_WINDOWS_LINUX_SUBMESSAGE],
        'windows': [CONNECT_WINDOWS_WINDOWS_MESSAGE,
                    CONNECT_WINDOWS_WINDOWS_SUBMESSAGE],
        'ssh_message': "%(user)s@%(hostname)s"
322
323
324
    },
}

Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
325
326
APPEND_CONNECT_PROMPT_MESSAGES = \
    getattr(settings, 'UI_CONNECT_PROMPT_MESSAGES', {})
327
328
for k, v in APPEND_CONNECT_PROMPT_MESSAGES.iteritems():
    CONNECT_PROMPT_MESSAGES[k].update(v)
329

330
# retrieve domain prefix from settings
Kostas Papadimitriou's avatar
Kostas Papadimitriou committed
331
332
DOMAIN_PREFIX = getattr(settings, 'MACHINE_DOMAIN_PREFIX', getattr(settings,
                        'BACKEND_PREFIX_ID', ""))
333
334
335
336

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

Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
337

338
def machines_connect(request):
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
339
340
341
    ip_address = request.GET.get('ip_address', '')
    hostname = request.GET.get('hostname', '')
    operating_system = metadata_os = request.GET.get('os', '')
342
    server_id = request.GET.get('srv', 0)
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
343
    host_os = request.GET.get('host_os', 'Linux').lower()
344
    username = request.GET.get('username', None)
345
    domain = request.GET.get("domain", DOMAIN_TPL % int(server_id))
346

347
    # guess host os
348
349
350
    if host_os != "windows":
        host_os = 'linux'

351
352
353
354
355
356
357
358
359
360
361
362
    # 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
363
364
    if operating_system != "windows":
        operating_system = "linux"
365
        ssh = True
366

367
    # rdp param is set, the user requested rdp file
368
369
370
371
372
    # check if we are on windows
    if operating_system == 'windows' and request.GET.get("rdp", False):

        # UI sent domain info (from vm metadata) use this
        # otherwise use our default snf-<vm_id> domain
373
374
375
376
377
        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:
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
378
379
380
            extra_rdp_content = EXTRA_RDP_CONTENT % \
                {
                    'server_id': server_id,
381
382
383
384
385
                    'ip_address': ip_address,
                    'hostname': hostname,
                    'user': username
                  }

386
        rdp_context = {
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
387
388
389
390
391
            'username': username,
            'domain': domain,
            'ip_address': ip_address,
            'hostname': hostname,
            'extra_content': extra_rdp_content
392
393
394
395
        }

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

        # proper filename, use server id and ip address
398
        filename = "%d-%s.rdp" % (int(server_id), hostname)
399
        response['Content-Disposition'] = 'attachment; filename=%s' % filename
400
    else:
401
402
403
404
405
406
407
        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
408
409
410
411
412
                'server_id': server_id,
                'ip_address': ip_address,
                'hostname': hostname,
                'user': username
            }
413
        if (operating_system != "windows"):
414
415
            link_url = None

416
417
        else:
            link_title = _("Remote desktop to %s") % ip_address
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
418
419
420
            link_url = \
                "%s?ip_address=%s&os=%s&rdp=1&srv=%d&username=%s&domain=%s" \
                "&hostname=%s" % (
421
                    reverse("ui_machines_connect"), ip_address,
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
422
423
                    operating_system, int(server_id), username,
                    domain, hostname)
424

425
426
        # try to find a specific message
        try:
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
427
428
            connect_message = \
                CONNECT_PROMPT_MESSAGES[host_os][operating_system][0]
429
            subinfo = CONNECT_PROMPT_MESSAGES[host_os][operating_system][1]
430
        except KeyError:
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
431
432
433
            connect_message = \
                _("You are trying to connect from a %s "
                  "machine to a %s machine") % (host_os, operating_system)
434
            subinfo = ""
435

436
        response_object = {
Ilias Tsitsimpis's avatar
Ilias Tsitsimpis committed
437
438
439
440
441
442
443
444
445
446
            '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
447

448
    return response
449