Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / views.py @ ebf4619d

History | View | Annotate | Download (16.5 kB)

1 a5bc3755 Vangelis Koukis
# Copyright 2011 GRNET S.A. All rights reserved.
2 8950a78f Christodoulos Psaltis
#
3 a5bc3755 Vangelis Koukis
# Redistribution and use in source and binary forms, with or
4 a5bc3755 Vangelis Koukis
# without modification, are permitted provided that the following
5 a5bc3755 Vangelis Koukis
# conditions are met:
6 8950a78f Christodoulos Psaltis
#
7 a5bc3755 Vangelis Koukis
#   1. Redistributions of source code must retain the above
8 a5bc3755 Vangelis Koukis
#      copyright notice, this list of conditions and the following
9 a5bc3755 Vangelis Koukis
#      disclaimer.
10 8950a78f Christodoulos Psaltis
#
11 a5bc3755 Vangelis Koukis
#   2. Redistributions in binary form must reproduce the above
12 a5bc3755 Vangelis Koukis
#      copyright notice, this list of conditions and the following
13 a5bc3755 Vangelis Koukis
#      disclaimer in the documentation and/or other materials
14 a5bc3755 Vangelis Koukis
#      provided with the distribution.
15 8950a78f Christodoulos Psaltis
#
16 a5bc3755 Vangelis Koukis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 a5bc3755 Vangelis Koukis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 a5bc3755 Vangelis Koukis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 a5bc3755 Vangelis Koukis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 a5bc3755 Vangelis Koukis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 a5bc3755 Vangelis Koukis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 a5bc3755 Vangelis Koukis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 a5bc3755 Vangelis Koukis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 a5bc3755 Vangelis Koukis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 a5bc3755 Vangelis Koukis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 a5bc3755 Vangelis Koukis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 a5bc3755 Vangelis Koukis
# POSSIBILITY OF SUCH DAMAGE.
28 8950a78f Christodoulos Psaltis
#
29 a5bc3755 Vangelis Koukis
# The views and conclusions contained in the software and
30 a5bc3755 Vangelis Koukis
# documentation are those of the authors and should not be
31 a5bc3755 Vangelis Koukis
# interpreted as representing official policies, either expressed
32 a5bc3755 Vangelis Koukis
# or implied, of GRNET S.A.
33 8950a78f Christodoulos Psaltis
#
34 258235f4 Kostas Papadimitriou
35 edda4d30 Markos Gogoulos
import os
36 258235f4 Kostas Papadimitriou
37 abf90954 Markos Gogoulos
from django.conf import settings
38 edda4d30 Markos Gogoulos
from django.utils.translation import gettext_lazy as _
39 b303ba05 Christodoulos Psaltis
from django.template import Context, loader
40 cc7c5902 Dimitris Moraitis
from django.http import HttpResponse
41 ec06b07c Dimitris Moraitis
from django.utils.translation import get_language
42 9c901aec Markos Gogoulos
from django.utils import simplejson as json
43 f533f224 Vangelis Koukis
from django.shortcuts import render_to_response
44 faf5ddde Kostas Papadimitriou
from django.template.loader import render_to_string
45 b687587e Kostas Papadimitriou
from django.core.urlresolvers import reverse
46 c90302ad Kostas Papadimitriou
from django.core.mail import send_mail
47 31f9a55b Kostas Papadimitriou
from django.http import Http404
48 0d0466bf Kostas Papadimitriou
from django.template import RequestContext
49 31f9a55b Kostas Papadimitriou
50 07d104d8 Kostas Papadimitriou
from synnefo.util.version import get_component_version
51 7970aa87 Kostas Papadimitriou
52 02f0cd19 Kostas Papadimitriou
from synnefo.lib.astakos import get_user
53 02f0cd19 Kostas Papadimitriou
54 07d104d8 Kostas Papadimitriou
SYNNEFO_JS_LIB_VERSION = get_component_version('app')
55 30b6f316 Kostas Papadimitriou
56 30b6f316 Kostas Papadimitriou
# api configuration
57 30b6f316 Kostas Papadimitriou
COMPUTE_API_URL = getattr(settings, 'COMPUTE_API_URL', '/api/v1.1')
58 30b6f316 Kostas Papadimitriou
59 66be390b Kostas Papadimitriou
# UI preferences settings
60 66be390b Kostas Papadimitriou
TIMEOUT = getattr(settings, "TIMEOUT", 10000)
61 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL = getattr(settings, "UI_UPDATE_INTERVAL", 5000)
62 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_INCREASE = getattr(settings, "UI_UPDATE_INTERVAL_INCREASE", 500)
63 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT = getattr(settings,
64 140d08d0 Kostas Papadimitriou
                                "UI_UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT",
65 140d08d0 Kostas Papadimitriou
                                3)
66 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_FAST = getattr(settings, "UI_UPDATE_INTERVAL_FAST", 2500)
67 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_MAX = getattr(settings, "UI_UPDATE_INTERVAL_MAX", 10000)
68 30b6f316 Kostas Papadimitriou
69 66be390b Kostas Papadimitriou
# predefined values settings
70 ebf4619d Kostas Papadimitriou
VM_IMAGE_COMMON_METADATA = getattr(settings, "UI_VM_IMAGE_COMMON_METADATA", ["OS", "users"])
71 66be390b Kostas Papadimitriou
SUGGESTED_FLAVORS_DEFAULT = {}
72 140d08d0 Kostas Papadimitriou
SUGGESTED_FLAVORS = getattr(settings, "VM_CREATE_SUGGESTED_FLAVORS",
73 140d08d0 Kostas Papadimitriou
                            SUGGESTED_FLAVORS_DEFAULT)
74 140d08d0 Kostas Papadimitriou
SUGGESTED_ROLES_DEFAULT = ["Database server", "File server", "Mail server",
75 140d08d0 Kostas Papadimitriou
                           "Web server", "Proxy"]
76 140d08d0 Kostas Papadimitriou
SUGGESTED_ROLES = getattr(settings, "VM_CREATE_SUGGESTED_ROLES",
77 140d08d0 Kostas Papadimitriou
                          SUGGESTED_ROLES_DEFAULT)
78 30b6f316 Kostas Papadimitriou
IMAGE_ICONS = settings.IMAGE_ICONS
79 03639c6d Kostas Papadimitriou
IMAGE_DELETED_TITLE = getattr(settings, 'UI_IMAGE_DELETED_TITLE',
80 fdc32267 Vangelis Koukis
                            '(deleted)')
81 03639c6d Kostas Papadimitriou
IMAGE_DELETED_SIZE_TITLE = getattr(settings, 'UI_IMAGE_DELETED_SIZE_TITLE',
82 03639c6d Kostas Papadimitriou
                            '(none)')
83 66be390b Kostas Papadimitriou
84 556dcd88 Kostas Papadimitriou
SUPPORT_SSH_OS_LIST = getattr(settings, "UI_SUPPORT_SSH_OS_LIST",)
85 556dcd88 Kostas Papadimitriou
OS_CREATED_USERS = getattr(settings, "UI_OS_DEFAULT_USER_MAP")
86 85f1cd1e Kostas Papadimitriou
LOGOUT_URL = getattr(settings, "UI_LOGOUT_URL", '/im/authenticate')
87 85f1cd1e Kostas Papadimitriou
LOGIN_URL = getattr(settings, "UI_LOGIN_URL", '/im/login')
88 85f1cd1e Kostas Papadimitriou
AUTH_COOKIE_NAME = getattr(settings, "UI_AUTH_COOKIE_NAME", 'synnefo_user')
89 30b6f316 Kostas Papadimitriou
90 66be390b Kostas Papadimitriou
# UI behaviour settings
91 66be390b Kostas Papadimitriou
DELAY_ON_BLUR = getattr(settings, "UI_DELAY_ON_BLUR", True)
92 66be390b Kostas Papadimitriou
UPDATE_HIDDEN_VIEWS = getattr(settings, "UI_UPDATE_HIDDEN_VIEWS", False)
93 66be390b Kostas Papadimitriou
HANDLE_WINDOW_EXCEPTIONS = getattr(settings, "UI_HANDLE_WINDOW_EXCEPTIONS", True)
94 66be390b Kostas Papadimitriou
SKIP_TIMEOUTS = getattr(settings, "UI_SKIP_TIMEOUTS", 1)
95 30b6f316 Kostas Papadimitriou
96 258235f4 Kostas Papadimitriou
# Additional settings
97 258235f4 Kostas Papadimitriou
VM_NAME_TEMPLATE = getattr(settings, "VM_CREATE_NAME_TPL", "My {0} server")
98 258235f4 Kostas Papadimitriou
MAX_SSH_KEYS_PER_USER = getattr(settings, "USERDATA_MAX_SSH_KEYS_PER_USER")
99 258235f4 Kostas Papadimitriou
FLAVORS_DISK_TEMPLATES_INFO = getattr(settings, "UI_FLAVORS_DISK_TEMPLATES_INFO", {})
100 1faf0b9c Kostas Papadimitriou
SYSTEM_IMAGES_OWNERS = getattr(settings, "UI_SYSTEM_IMAGES_OWNERS", {})
101 30b6f316 Kostas Papadimitriou
102 7970aa87 Kostas Papadimitriou
# MEDIA PATHS
103 46990631 Kostas Papadimitriou
UI_MEDIA_URL = getattr(settings, "UI_MEDIA_URL",
104 46990631 Kostas Papadimitriou
                    "%ssnf-%s/" % (settings.MEDIA_URL, SYNNEFO_JS_LIB_VERSION))
105 7970aa87 Kostas Papadimitriou
UI_SYNNEFO_IMAGES_URL = getattr(settings,
106 46990631 Kostas Papadimitriou
                    "UI_SYNNEFO_IMAGES_URL", UI_MEDIA_URL + "images/")
107 7970aa87 Kostas Papadimitriou
UI_SYNNEFO_CSS_URL = getattr(settings,
108 46990631 Kostas Papadimitriou
                    "UI_SYNNEFO_CSS_URL", UI_MEDIA_URL + "css/")
109 c62c6b91 Kostas Papadimitriou
UI_SYNNEFO_JS_URL = getattr(settings,
110 46990631 Kostas Papadimitriou
                    "UI_SYNNEFO_JS_URL", UI_MEDIA_URL + "js/")
111 c62c6b91 Kostas Papadimitriou
UI_SYNNEFO_JS_LIB_URL = getattr(settings,
112 c62c6b91 Kostas Papadimitriou
                    "UI_SYNNEFO_JS_LIB_URL", UI_SYNNEFO_JS_URL + "lib/")
113 c62c6b91 Kostas Papadimitriou
UI_SYNNEFO_JS_WEB_URL = getattr(settings,
114 c62c6b91 Kostas Papadimitriou
                    "UI_SYNNEFO_JS_WEB_URL",
115 c62c6b91 Kostas Papadimitriou
                    UI_SYNNEFO_JS_URL + "ui/web/")
116 c62c6b91 Kostas Papadimitriou
117 30b6f316 Kostas Papadimitriou
# extensions
118 30b6f316 Kostas Papadimitriou
ENABLE_GLANCE = getattr(settings, 'UI_ENABLE_GLANCE', True)
119 30b6f316 Kostas Papadimitriou
GLANCE_API_URL = getattr(settings, 'UI_GLANCE_API_URL', '/glance')
120 30b6f316 Kostas Papadimitriou
FEEDBACK_CONTACTS = getattr(settings, "FEEDBACK_CONTACTS", [])
121 30b6f316 Kostas Papadimitriou
FEEDBACK_EMAIL_FROM = settings.FEEDBACK_EMAIL_FROM
122 1e882dd7 Kostas Papadimitriou
DIAGNOSTICS_UPDATE_INTERVAL = getattr(settings,
123 1e882dd7 Kostas Papadimitriou
                'UI_DIAGNOSTICS_UPDATE_INTERVAL', 2000)
124 d965e6dc Kostas Papadimitriou
125 126a01f2 Kostas Papadimitriou
# network settings
126 126a01f2 Kostas Papadimitriou
DEFAULT_NETWORK_TYPES = {'PRIVATE_FILTERED': 'mac-filtering'}
127 126a01f2 Kostas Papadimitriou
NETWORK_TYPES = getattr(settings,
128 126a01f2 Kostas Papadimitriou
                    'UI_NETWORK_AVAILABLE_NETWORK_TYPES', DEFAULT_NETWORK_TYPES)
129 126a01f2 Kostas Papadimitriou
DEFAULT_NETWORK_SUBNETS = ['10.0.0.0/24', '192.168.1.1/24']
130 126a01f2 Kostas Papadimitriou
NETWORK_SUBNETS = getattr(settings,
131 126a01f2 Kostas Papadimitriou
                    'UI_NETWORK_AVAILABLE_SUBNETS', DEFAULT_NETWORK_SUBNETS)
132 126a01f2 Kostas Papadimitriou
NETWORK_DUPLICATE_NICS = getattr(settings,
133 126a01f2 Kostas Papadimitriou
                    'UI_NETWORK_ALLOW_DUPLICATE_VM_NICS', False)
134 126a01f2 Kostas Papadimitriou
NETWORK_STRICT_DESTROY = getattr(settings,
135 126a01f2 Kostas Papadimitriou
                    'UI_NETWORK_STRICT_DESTROY', False)
136 126a01f2 Kostas Papadimitriou
NETWORK_ALLOW_MULTIPLE_DESTROY = getattr(settings,
137 126a01f2 Kostas Papadimitriou
                    'UI_NETWORK_ALLOW_MULTIPLE_DESTROY', False)
138 126a01f2 Kostas Papadimitriou
139 0d0466bf Kostas Papadimitriou
def template(name, request, context):
140 e646ebe5 Dimitris Moraitis
    template_path = os.path.join(os.path.dirname(__file__), "templates/")
141 b303ba05 Christodoulos Psaltis
    current_template = template_path + name + '.html'
142 b303ba05 Christodoulos Psaltis
    t = loader.get_template(current_template)
143 7970aa87 Kostas Papadimitriou
    media_context = {
144 7970aa87 Kostas Papadimitriou
       'UI_MEDIA_URL': UI_MEDIA_URL,
145 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_URL': UI_SYNNEFO_JS_URL,
146 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_LIB_URL': UI_SYNNEFO_JS_LIB_URL,
147 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_WEB_URL': UI_SYNNEFO_JS_WEB_URL,
148 7970aa87 Kostas Papadimitriou
       'SYNNEFO_IMAGES_URL': UI_SYNNEFO_IMAGES_URL,
149 7970aa87 Kostas Papadimitriou
       'SYNNEFO_CSS_URL': UI_SYNNEFO_CSS_URL,
150 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_LIB_VERSION': SYNNEFO_JS_LIB_VERSION,
151 7970aa87 Kostas Papadimitriou
       'DEBUG': settings.DEBUG
152 7970aa87 Kostas Papadimitriou
    }
153 7970aa87 Kostas Papadimitriou
    context.update(media_context)
154 0d0466bf Kostas Papadimitriou
    return HttpResponse(t.render(RequestContext(request, context)))
155 cc7c5902 Dimitris Moraitis
156 cc7c5902 Dimitris Moraitis
def home(request):
157 e646ebe5 Dimitris Moraitis
    context = {'timeout': TIMEOUT,
158 a226ff9f Christodoulos Psaltis
               'project': '+nefo',
159 e646ebe5 Dimitris Moraitis
               'request': request,
160 f533f224 Vangelis Koukis
               'current_lang': get_language() or 'en',
161 30b6f316 Kostas Papadimitriou
               'compute_api_url': json.dumps(COMPUTE_API_URL),
162 258235f4 Kostas Papadimitriou
                # update interval settings
163 7b03c69d Dimitris Moraitis
               'update_interval': UPDATE_INTERVAL,
164 1cc6e94f Kostas Papadimitriou
               'update_interval_increase': UPDATE_INTERVAL_INCREASE,
165 1cc6e94f Kostas Papadimitriou
               'update_interval_increase_after_calls': UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT,
166 1cc6e94f Kostas Papadimitriou
               'update_interval_fast': UPDATE_INTERVAL_FAST,
167 1cc6e94f Kostas Papadimitriou
               'update_interval_max': UPDATE_INTERVAL_MAX,
168 258235f4 Kostas Papadimitriou
                # additional settings
169 0e8e87ac Kostas Papadimitriou
               'image_icons': IMAGE_ICONS,
170 dacd179a Kostas Papadimitriou
               'logout_redirect': LOGOUT_URL,
171 85f1cd1e Kostas Papadimitriou
               'login_redirect': LOGIN_URL,
172 85f1cd1e Kostas Papadimitriou
               'auth_cookie_name': AUTH_COOKIE_NAME,
173 e0dea91a Kostas Papadimitriou
               'suggested_flavors': json.dumps(SUGGESTED_FLAVORS),
174 73e25ce2 Kostas Papadimitriou
               'suggested_roles': json.dumps(SUGGESTED_ROLES),
175 bcd451ea Kostas Papadimitriou
               'vm_image_common_metadata': json.dumps(VM_IMAGE_COMMON_METADATA),
176 5764e310 Kostas Papadimitriou
               'synnefo_version': SYNNEFO_JS_LIB_VERSION,
177 66be390b Kostas Papadimitriou
               'delay_on_blur': json.dumps(DELAY_ON_BLUR),
178 66be390b Kostas Papadimitriou
               'update_hidden_views': json.dumps(UPDATE_HIDDEN_VIEWS),
179 66be390b Kostas Papadimitriou
               'handle_window_exceptions': json.dumps(HANDLE_WINDOW_EXCEPTIONS),
180 66be390b Kostas Papadimitriou
               'skip_timeouts': json.dumps(SKIP_TIMEOUTS),
181 9c191b95 Kostas Papadimitriou
               'vm_name_template': json.dumps(VM_NAME_TEMPLATE),
182 d965e6dc Kostas Papadimitriou
               'flavors_disk_templates_info': json.dumps(FLAVORS_DISK_TEMPLATES_INFO),
183 47276ec2 Kostas Papadimitriou
               'support_ssh_os_list': json.dumps(SUPPORT_SSH_OS_LIST),
184 47276ec2 Kostas Papadimitriou
               'os_created_users': json.dumps(OS_CREATED_USERS),
185 c72a830d Kostas Papadimitriou
               'userdata_keys_limit': json.dumps(MAX_SSH_KEYS_PER_USER),
186 30b6f316 Kostas Papadimitriou
               'use_glance': json.dumps(ENABLE_GLANCE),
187 1faf0b9c Kostas Papadimitriou
               'glance_api_url': json.dumps(GLANCE_API_URL),
188 03639c6d Kostas Papadimitriou
               'system_images_owners': json.dumps(SYSTEM_IMAGES_OWNERS),
189 03639c6d Kostas Papadimitriou
               'image_deleted_title': json.dumps(IMAGE_DELETED_TITLE),
190 03639c6d Kostas Papadimitriou
               'image_deleted_size_title': json.dumps(IMAGE_DELETED_SIZE_TITLE),
191 126a01f2 Kostas Papadimitriou
               'network_suggested_subnets': json.dumps(NETWORK_SUBNETS),
192 126a01f2 Kostas Papadimitriou
               'network_available_types': json.dumps(NETWORK_TYPES),
193 126a01f2 Kostas Papadimitriou
               'network_allow_duplicate_vm_nics': json.dumps(NETWORK_DUPLICATE_NICS),
194 126a01f2 Kostas Papadimitriou
               'network_strict_destroy': json.dumps(NETWORK_STRICT_DESTROY),
195 1e882dd7 Kostas Papadimitriou
               'network_allow_multiple_destroy': json.dumps(NETWORK_ALLOW_MULTIPLE_DESTROY),
196 1e882dd7 Kostas Papadimitriou
               'diagnostics_update_interval': json.dumps(DIAGNOSTICS_UPDATE_INTERVAL)
197 126a01f2 Kostas Papadimitriou
    }
198 0d0466bf Kostas Papadimitriou
    return template('home', request, context)
199 cc7c5902 Dimitris Moraitis
200 f533f224 Vangelis Koukis
def machines_console(request):
201 473d37cc Markos Gogoulos
    host, port, password = ('','','')
202 6912c72b Markos Gogoulos
    host = request.GET.get('host','')
203 6912c72b Markos Gogoulos
    port = request.GET.get('port','')
204 6912c72b Markos Gogoulos
    password = request.GET.get('password','')
205 f533f224 Vangelis Koukis
    machine = request.GET.get('machine','')
206 f533f224 Vangelis Koukis
    host_ip = request.GET.get('host_ip','')
207 f277a1cd Kostas Papadimitriou
    host_ip_v6 = request.GET.get('host_ip_v6','')
208 140d08d0 Kostas Papadimitriou
    context = {'host': host, 'port': port, 'password': password,
209 140d08d0 Kostas Papadimitriou
               'machine': machine, 'host_ip': host_ip, 'host_ip_v6': host_ip_v6}
210 0d0466bf Kostas Papadimitriou
    return template('machines_console', request, context)
211 e646ebe5 Dimitris Moraitis
212 8d08f18a Kostas Papadimitriou
def js_tests(request):
213 0d0466bf Kostas Papadimitriou
    return template('tests', request, {})
214 6f4c1371 Kostas Papadimitriou
215 bdf369a2 Kostas Papadimitriou
CONNECT_LINUX_LINUX_MESSAGE = _("""A direct connection to this machine can be established using the <a target="_blank"
216 bdf369a2 Kostas Papadimitriou
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
217 bdf369a2 Kostas Papadimitriou
To do so open a terminal and type the following at the prompt to connect to your machine:""")
218 bdf369a2 Kostas Papadimitriou
CONNECT_LINUX_WINDOWS_MESSAGE = _("""A direct connection to this machine can be
219 bdf369a2 Kostas Papadimitriou
established using <a target="_blank" href="http://en.wikipedia.org/wiki/Remote_Desktop_Services">Remote Desktop Service</a>.
220 17ab1a48 Vangelis Koukis
To do so, open the following file with an appropriate remote desktop client.
221 99a005df Kostas Papadimitriou
""")
222 ab3e9eb8 Kostas Papadimitriou
CONNECT_LINUX_WINDOWS_SUBMESSAGE = _("""If you don't have a Remote Desktop client already installed,
223 ab3e9eb8 Kostas Papadimitriou
we suggest the use of <a target="_blank"
224 99a005df Kostas Papadimitriou
href="http://sourceforge.net/projects/tsclient/files/latest/download?source=files">tsclient</a>.<br
225 99a005df Kostas Papadimitriou
/><span class="important">IMPORTANT: It may take up to 15 minutes for your Windows VM to become available
226 99a005df Kostas Papadimitriou
after its creation.</span>""")
227 bdf369a2 Kostas Papadimitriou
CONNECT_WINDOWS_LINUX_MESSAGE = _("""A direct connection to this machine can be established using the <a target="_blank"
228 bdf369a2 Kostas Papadimitriou
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
229 ae748a9d Kostas Papadimitriou
Open an ssh client such as PuTTY and type the following:""")
230 bdf369a2 Kostas Papadimitriou
CONNECT_WINDOWS_LINUX_SUBMESSAGE = _("""If you do not have an ssh client already installed,
231 bdf369a2 Kostas Papadimitriou
<a target="_blank" href="http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe">Download PuTTY</a>""")
232 6f4c1371 Kostas Papadimitriou
233 65ecc5e4 Kostas Papadimitriou
CONNECT_WINDOWS_WINDOWS_MESSAGE = _("""A direct connection to this machine can be
234 17ab1a48 Vangelis Koukis
established using Remote Desktop. Click on the following link, and if asked
235 17ab1a48 Vangelis Koukis
open it using "Remote Desktop Connection".
236 17ab1a48 Vangelis Koukis
IMPORTANT: It may take up to 15 minutes for your Windows VM to become available
237 17ab1a48 Vangelis Koukis
after its creation.""")
238 65ecc5e4 Kostas Papadimitriou
CONNECT_WINDOWS_WINDOWS_SUBMESSAGE = _("""Save this file to disk for future use""")
239 bdf369a2 Kostas Papadimitriou
240 bdf369a2 Kostas Papadimitriou
# info/subinfo for all os combinations
241 bdf369a2 Kostas Papadimitriou
#
242 bdf369a2 Kostas Papadimitriou
# [0] info gets displayed on top of the message box
243 bdf369a2 Kostas Papadimitriou
# [1] subinfo gets displayed on the bottom as extra info
244 bdf369a2 Kostas Papadimitriou
# provided to the user when needed
245 65ecc5e4 Kostas Papadimitriou
CONNECT_PROMPT_MESSAGES = {
246 6f4c1371 Kostas Papadimitriou
    'linux': {
247 bdf369a2 Kostas Papadimitriou
            'linux': [CONNECT_LINUX_LINUX_MESSAGE, ""],
248 140d08d0 Kostas Papadimitriou
            'windows': [CONNECT_LINUX_WINDOWS_MESSAGE,
249 140d08d0 Kostas Papadimitriou
                        CONNECT_LINUX_WINDOWS_SUBMESSAGE]
250 6f4c1371 Kostas Papadimitriou
        },
251 6f4c1371 Kostas Papadimitriou
    'windows': {
252 140d08d0 Kostas Papadimitriou
            'linux': [CONNECT_WINDOWS_LINUX_MESSAGE,
253 140d08d0 Kostas Papadimitriou
                      CONNECT_WINDOWS_LINUX_SUBMESSAGE],
254 140d08d0 Kostas Papadimitriou
            'windows': [CONNECT_WINDOWS_WINDOWS_MESSAGE,
255 140d08d0 Kostas Papadimitriou
                        CONNECT_WINDOWS_WINDOWS_SUBMESSAGE]
256 6f4c1371 Kostas Papadimitriou
        }
257 6f4c1371 Kostas Papadimitriou
    }
258 6f4c1371 Kostas Papadimitriou
259 65ecc5e4 Kostas Papadimitriou
# retrieve domain prefix from settings
260 140d08d0 Kostas Papadimitriou
DOMAIN_PREFIX = getattr(settings, 'MACHINE_DOMAIN_PREFIX', getattr(settings,
261 140d08d0 Kostas Papadimitriou
                        'BACKEND_PREFIX_ID', ""))
262 65ecc5e4 Kostas Papadimitriou
263 65ecc5e4 Kostas Papadimitriou
# domain template string
264 65ecc5e4 Kostas Papadimitriou
DOMAIN_TPL = "%s%%s" % DOMAIN_PREFIX
265 65ecc5e4 Kostas Papadimitriou
266 fd70c1db Markos Gogoulos
def machines_connect(request):
267 fd70c1db Markos Gogoulos
    ip_address = request.GET.get('ip_address','')
268 5bc1794f Kostas Papadimitriou
    operating_system = metadata_os = request.GET.get('os','')
269 bdf369a2 Kostas Papadimitriou
    server_id = request.GET.get('srv', 0)
270 6f4c1371 Kostas Papadimitriou
    host_os = request.GET.get('host_os','Linux').lower()
271 5bc1794f Kostas Papadimitriou
    username = request.GET.get('username', None)
272 65ecc5e4 Kostas Papadimitriou
    domain = request.GET.get("domain", DOMAIN_TPL % int(server_id))
273 6f4c1371 Kostas Papadimitriou
274 406bf0d9 Kostas Papadimitriou
    # guess host os
275 319091c7 Kostas Papadimitriou
    if host_os != "windows":
276 319091c7 Kostas Papadimitriou
        host_os = 'linux'
277 319091c7 Kostas Papadimitriou
278 406bf0d9 Kostas Papadimitriou
    # guess username
279 406bf0d9 Kostas Papadimitriou
    if not username:
280 406bf0d9 Kostas Papadimitriou
        username = "root"
281 406bf0d9 Kostas Papadimitriou
282 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() in ['ubuntu', 'kubuntu', 'fedora']:
283 406bf0d9 Kostas Papadimitriou
            username = "user"
284 406bf0d9 Kostas Papadimitriou
285 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() == "windows":
286 406bf0d9 Kostas Papadimitriou
            username = "Administrator"
287 406bf0d9 Kostas Papadimitriou
288 406bf0d9 Kostas Papadimitriou
    # operating system provides ssh access
289 406bf0d9 Kostas Papadimitriou
    ssh = False
290 6f4c1371 Kostas Papadimitriou
    if operating_system != "windows":
291 6f4c1371 Kostas Papadimitriou
        operating_system = "linux"
292 406bf0d9 Kostas Papadimitriou
        ssh = True
293 6f4c1371 Kostas Papadimitriou
294 bdf369a2 Kostas Papadimitriou
    # rdp param is set, the user requested rdp file
295 406bf0d9 Kostas Papadimitriou
    # check if we are on windows
296 406bf0d9 Kostas Papadimitriou
    if operating_system == 'windows' and request.GET.get("rdp", False):
297 406bf0d9 Kostas Papadimitriou
298 406bf0d9 Kostas Papadimitriou
        # UI sent domain info (from vm metadata) use this
299 406bf0d9 Kostas Papadimitriou
        # otherwise use our default snf-<vm_id> domain
300 406bf0d9 Kostas Papadimitriou
        rdp_context = {
301 406bf0d9 Kostas Papadimitriou
                'username': username,
302 406bf0d9 Kostas Papadimitriou
                'domain': domain,
303 406bf0d9 Kostas Papadimitriou
                'ip_address': ip_address
304 406bf0d9 Kostas Papadimitriou
        }
305 406bf0d9 Kostas Papadimitriou
306 406bf0d9 Kostas Papadimitriou
        rdp_file_data = render_to_string("synnefo-windows.rdp", rdp_context)
307 406bf0d9 Kostas Papadimitriou
        response = HttpResponse(rdp_file_data, mimetype='application/x-rdp')
308 bdf369a2 Kostas Papadimitriou
309 bdf369a2 Kostas Papadimitriou
        # proper filename, use server id and ip address
310 bdf369a2 Kostas Papadimitriou
        filename = "%d-%s.rdp" % (int(server_id), ip_address)
311 bdf369a2 Kostas Papadimitriou
        response['Content-Disposition'] = 'attachment; filename=%s' % filename
312 fd70c1db Markos Gogoulos
    else:
313 bdf369a2 Kostas Papadimitriou
        link_title = _("Remote desktop to %s") % ip_address
314 406bf0d9 Kostas Papadimitriou
        link_url = "%s?ip_address=%s&os=%s&rdp=1&srv=%d&username=%s&domain=%s" % (
315 d194e869 Kostas Papadimitriou
                reverse("ui_machines_connect"), ip_address, operating_system,int(server_id), username, domain)
316 5bc1794f Kostas Papadimitriou
317 b687587e Kostas Papadimitriou
        if (operating_system != "windows"):
318 406bf0d9 Kostas Papadimitriou
            link_title = "ssh %s@%s" % (username, ip_address)
319 bdf369a2 Kostas Papadimitriou
            link_url = None
320 bdf369a2 Kostas Papadimitriou
321 bdf369a2 Kostas Papadimitriou
            if host_os == "windows":
322 406bf0d9 Kostas Papadimitriou
                link_title = "%s@%s" % (username, ip_address)
323 b687587e Kostas Papadimitriou
324 6f4c1371 Kostas Papadimitriou
        # try to find a specific message
325 6f4c1371 Kostas Papadimitriou
        try:
326 65ecc5e4 Kostas Papadimitriou
            connect_message = CONNECT_PROMPT_MESSAGES[host_os][operating_system][0]
327 65ecc5e4 Kostas Papadimitriou
            subinfo = CONNECT_PROMPT_MESSAGES[host_os][operating_system][1]
328 6f4c1371 Kostas Papadimitriou
        except KeyError:
329 140d08d0 Kostas Papadimitriou
            connect_message = _("You are trying to connect from a %s "
330 140d08d0 Kostas Papadimitriou
                                "machine to a %s machine") % (host_os, operating_system)
331 bdf369a2 Kostas Papadimitriou
            subinfo = ""
332 6f4c1371 Kostas Papadimitriou
333 b687587e Kostas Papadimitriou
        response_object = {
334 b687587e Kostas Papadimitriou
                'ip': ip_address,
335 b687587e Kostas Papadimitriou
                'os': operating_system,
336 b687587e Kostas Papadimitriou
                'ssh': ssh,
337 6f4c1371 Kostas Papadimitriou
                'info': unicode(connect_message),
338 bdf369a2 Kostas Papadimitriou
                'subinfo': unicode(subinfo),
339 b687587e Kostas Papadimitriou
                'link': {'title': unicode(link_title), 'url': link_url}
340 b687587e Kostas Papadimitriou
            }
341 140d08d0 Kostas Papadimitriou
        response = HttpResponse(json.dumps(response_object),
342 140d08d0 Kostas Papadimitriou
                                mimetype='application/json')  #no windows, no rdp
343 6f4c1371 Kostas Papadimitriou
344 fd70c1db Markos Gogoulos
    return response
345 fd70c1db Markos Gogoulos
346 faf5ddde Kostas Papadimitriou
def feedback_submit(request):
347 31f9a55b Kostas Papadimitriou
    if not request.method == "POST":
348 31f9a55b Kostas Papadimitriou
        raise Http404
349 31f9a55b Kostas Papadimitriou
350 02f0cd19 Kostas Papadimitriou
    # fill request object with astakos user information
351 02f0cd19 Kostas Papadimitriou
    get_user(request, settings.ASTAKOS_URL)
352 02f0cd19 Kostas Papadimitriou
353 faf5ddde Kostas Papadimitriou
    message = request.POST.get("feedback-msg")
354 faf5ddde Kostas Papadimitriou
    data = request.POST.get("feedback-data")
355 faf5ddde Kostas Papadimitriou
356 faf5ddde Kostas Papadimitriou
    # default to True (calls from error pages)
357 faf5ddde Kostas Papadimitriou
    allow_data_send = request.POST.get("feedback-submit-data", True)
358 faf5ddde Kostas Papadimitriou
359 31f9a55b Kostas Papadimitriou
    mail_subject = unicode(_("Feedback from synnefo application"))
360 faf5ddde Kostas Papadimitriou
361 140d08d0 Kostas Papadimitriou
    mail_context = {'message': message, 'data': data,
362 140d08d0 Kostas Papadimitriou
                    'allow_data_send': allow_data_send, 'request': request}
363 faf5ddde Kostas Papadimitriou
    mail_content = render_to_string("feedback_mail.txt", mail_context)
364 faf5ddde Kostas Papadimitriou
365 c90302ad Kostas Papadimitriou
    send_mail(mail_subject, mail_content, FEEDBACK_EMAIL_FROM,
366 c90302ad Kostas Papadimitriou
            dict(FEEDBACK_CONTACTS).values(), fail_silently=False)
367 faf5ddde Kostas Papadimitriou
368 8d08f18a Kostas Papadimitriou
    return HttpResponse('{"status":"send"}');