Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (15.2 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 66be390b Kostas Papadimitriou
VM_IMAGE_COMMON_METADATA = getattr(settings, "VM_IMAGE_COMMON_METADATA", ["OS"])
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 d965e6dc Kostas Papadimitriou
123 0d0466bf Kostas Papadimitriou
def template(name, request, context):
124 e646ebe5 Dimitris Moraitis
    template_path = os.path.join(os.path.dirname(__file__), "templates/")
125 b303ba05 Christodoulos Psaltis
    current_template = template_path + name + '.html'
126 b303ba05 Christodoulos Psaltis
    t = loader.get_template(current_template)
127 7970aa87 Kostas Papadimitriou
    media_context = {
128 7970aa87 Kostas Papadimitriou
       'UI_MEDIA_URL': UI_MEDIA_URL,
129 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_URL': UI_SYNNEFO_JS_URL,
130 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_LIB_URL': UI_SYNNEFO_JS_LIB_URL,
131 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_WEB_URL': UI_SYNNEFO_JS_WEB_URL,
132 7970aa87 Kostas Papadimitriou
       'SYNNEFO_IMAGES_URL': UI_SYNNEFO_IMAGES_URL,
133 7970aa87 Kostas Papadimitriou
       'SYNNEFO_CSS_URL': UI_SYNNEFO_CSS_URL,
134 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_LIB_VERSION': SYNNEFO_JS_LIB_VERSION,
135 7970aa87 Kostas Papadimitriou
       'DEBUG': settings.DEBUG
136 7970aa87 Kostas Papadimitriou
    }
137 7970aa87 Kostas Papadimitriou
    context.update(media_context)
138 0d0466bf Kostas Papadimitriou
    return HttpResponse(t.render(RequestContext(request, context)))
139 cc7c5902 Dimitris Moraitis
140 cc7c5902 Dimitris Moraitis
def home(request):
141 e646ebe5 Dimitris Moraitis
    context = {'timeout': TIMEOUT,
142 a226ff9f Christodoulos Psaltis
               'project': '+nefo',
143 e646ebe5 Dimitris Moraitis
               'request': request,
144 f533f224 Vangelis Koukis
               'current_lang': get_language() or 'en',
145 30b6f316 Kostas Papadimitriou
               'compute_api_url': json.dumps(COMPUTE_API_URL),
146 258235f4 Kostas Papadimitriou
                # update interval settings
147 7b03c69d Dimitris Moraitis
               'update_interval': UPDATE_INTERVAL,
148 1cc6e94f Kostas Papadimitriou
               'update_interval_increase': UPDATE_INTERVAL_INCREASE,
149 1cc6e94f Kostas Papadimitriou
               'update_interval_increase_after_calls': UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT,
150 1cc6e94f Kostas Papadimitriou
               'update_interval_fast': UPDATE_INTERVAL_FAST,
151 1cc6e94f Kostas Papadimitriou
               'update_interval_max': UPDATE_INTERVAL_MAX,
152 258235f4 Kostas Papadimitriou
                # additional settings
153 0e8e87ac Kostas Papadimitriou
               'image_icons': IMAGE_ICONS,
154 dacd179a Kostas Papadimitriou
               'logout_redirect': LOGOUT_URL,
155 85f1cd1e Kostas Papadimitriou
               'login_redirect': LOGIN_URL,
156 85f1cd1e Kostas Papadimitriou
               'auth_cookie_name': AUTH_COOKIE_NAME,
157 e0dea91a Kostas Papadimitriou
               'suggested_flavors': json.dumps(SUGGESTED_FLAVORS),
158 73e25ce2 Kostas Papadimitriou
               'suggested_roles': json.dumps(SUGGESTED_ROLES),
159 bcd451ea Kostas Papadimitriou
               'vm_image_common_metadata': json.dumps(VM_IMAGE_COMMON_METADATA),
160 5764e310 Kostas Papadimitriou
               'synnefo_version': SYNNEFO_JS_LIB_VERSION,
161 66be390b Kostas Papadimitriou
               'delay_on_blur': json.dumps(DELAY_ON_BLUR),
162 66be390b Kostas Papadimitriou
               'update_hidden_views': json.dumps(UPDATE_HIDDEN_VIEWS),
163 66be390b Kostas Papadimitriou
               'handle_window_exceptions': json.dumps(HANDLE_WINDOW_EXCEPTIONS),
164 66be390b Kostas Papadimitriou
               'skip_timeouts': json.dumps(SKIP_TIMEOUTS),
165 9c191b95 Kostas Papadimitriou
               'vm_name_template': json.dumps(VM_NAME_TEMPLATE),
166 d965e6dc Kostas Papadimitriou
               'flavors_disk_templates_info': json.dumps(FLAVORS_DISK_TEMPLATES_INFO),
167 47276ec2 Kostas Papadimitriou
               'support_ssh_os_list': json.dumps(SUPPORT_SSH_OS_LIST),
168 47276ec2 Kostas Papadimitriou
               'os_created_users': json.dumps(OS_CREATED_USERS),
169 c72a830d Kostas Papadimitriou
               'userdata_keys_limit': json.dumps(MAX_SSH_KEYS_PER_USER),
170 30b6f316 Kostas Papadimitriou
               'use_glance': json.dumps(ENABLE_GLANCE),
171 1faf0b9c Kostas Papadimitriou
               'glance_api_url': json.dumps(GLANCE_API_URL),
172 03639c6d Kostas Papadimitriou
               'system_images_owners': json.dumps(SYSTEM_IMAGES_OWNERS),
173 03639c6d Kostas Papadimitriou
               'image_deleted_title': json.dumps(IMAGE_DELETED_TITLE),
174 03639c6d Kostas Papadimitriou
               'image_deleted_size_title': json.dumps(IMAGE_DELETED_SIZE_TITLE),
175 7970aa87 Kostas Papadimitriou
               }
176 0d0466bf Kostas Papadimitriou
    return template('home', request, context)
177 cc7c5902 Dimitris Moraitis
178 f533f224 Vangelis Koukis
def machines_console(request):
179 473d37cc Markos Gogoulos
    host, port, password = ('','','')
180 6912c72b Markos Gogoulos
    host = request.GET.get('host','')
181 6912c72b Markos Gogoulos
    port = request.GET.get('port','')
182 6912c72b Markos Gogoulos
    password = request.GET.get('password','')
183 f533f224 Vangelis Koukis
    machine = request.GET.get('machine','')
184 f533f224 Vangelis Koukis
    host_ip = request.GET.get('host_ip','')
185 f277a1cd Kostas Papadimitriou
    host_ip_v6 = request.GET.get('host_ip_v6','')
186 140d08d0 Kostas Papadimitriou
    context = {'host': host, 'port': port, 'password': password,
187 140d08d0 Kostas Papadimitriou
               'machine': machine, 'host_ip': host_ip, 'host_ip_v6': host_ip_v6}
188 0d0466bf Kostas Papadimitriou
    return template('machines_console', request, context)
189 e646ebe5 Dimitris Moraitis
190 8d08f18a Kostas Papadimitriou
def js_tests(request):
191 0d0466bf Kostas Papadimitriou
    return template('tests', request, {})
192 6f4c1371 Kostas Papadimitriou
193 bdf369a2 Kostas Papadimitriou
CONNECT_LINUX_LINUX_MESSAGE = _("""A direct connection to this machine can be established using the <a target="_blank"
194 bdf369a2 Kostas Papadimitriou
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
195 bdf369a2 Kostas Papadimitriou
To do so open a terminal and type the following at the prompt to connect to your machine:""")
196 bdf369a2 Kostas Papadimitriou
CONNECT_LINUX_WINDOWS_MESSAGE = _("""A direct connection to this machine can be
197 bdf369a2 Kostas Papadimitriou
established using <a target="_blank" href="http://en.wikipedia.org/wiki/Remote_Desktop_Services">Remote Desktop Service</a>.
198 17ab1a48 Vangelis Koukis
To do so, open the following file with an appropriate remote desktop client.
199 99a005df Kostas Papadimitriou
""")
200 ab3e9eb8 Kostas Papadimitriou
CONNECT_LINUX_WINDOWS_SUBMESSAGE = _("""If you don't have a Remote Desktop client already installed,
201 ab3e9eb8 Kostas Papadimitriou
we suggest the use of <a target="_blank"
202 99a005df Kostas Papadimitriou
href="http://sourceforge.net/projects/tsclient/files/latest/download?source=files">tsclient</a>.<br
203 99a005df Kostas Papadimitriou
/><span class="important">IMPORTANT: It may take up to 15 minutes for your Windows VM to become available
204 99a005df Kostas Papadimitriou
after its creation.</span>""")
205 bdf369a2 Kostas Papadimitriou
CONNECT_WINDOWS_LINUX_MESSAGE = _("""A direct connection to this machine can be established using the <a target="_blank"
206 bdf369a2 Kostas Papadimitriou
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
207 ae748a9d Kostas Papadimitriou
Open an ssh client such as PuTTY and type the following:""")
208 bdf369a2 Kostas Papadimitriou
CONNECT_WINDOWS_LINUX_SUBMESSAGE = _("""If you do not have an ssh client already installed,
209 bdf369a2 Kostas Papadimitriou
<a target="_blank" href="http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe">Download PuTTY</a>""")
210 6f4c1371 Kostas Papadimitriou
211 65ecc5e4 Kostas Papadimitriou
CONNECT_WINDOWS_WINDOWS_MESSAGE = _("""A direct connection to this machine can be
212 17ab1a48 Vangelis Koukis
established using Remote Desktop. Click on the following link, and if asked
213 17ab1a48 Vangelis Koukis
open it using "Remote Desktop Connection".
214 17ab1a48 Vangelis Koukis
IMPORTANT: It may take up to 15 minutes for your Windows VM to become available
215 17ab1a48 Vangelis Koukis
after its creation.""")
216 65ecc5e4 Kostas Papadimitriou
CONNECT_WINDOWS_WINDOWS_SUBMESSAGE = _("""Save this file to disk for future use""")
217 bdf369a2 Kostas Papadimitriou
218 bdf369a2 Kostas Papadimitriou
# info/subinfo for all os combinations
219 bdf369a2 Kostas Papadimitriou
#
220 bdf369a2 Kostas Papadimitriou
# [0] info gets displayed on top of the message box
221 bdf369a2 Kostas Papadimitriou
# [1] subinfo gets displayed on the bottom as extra info
222 bdf369a2 Kostas Papadimitriou
# provided to the user when needed
223 65ecc5e4 Kostas Papadimitriou
CONNECT_PROMPT_MESSAGES = {
224 6f4c1371 Kostas Papadimitriou
    'linux': {
225 bdf369a2 Kostas Papadimitriou
            'linux': [CONNECT_LINUX_LINUX_MESSAGE, ""],
226 140d08d0 Kostas Papadimitriou
            'windows': [CONNECT_LINUX_WINDOWS_MESSAGE,
227 140d08d0 Kostas Papadimitriou
                        CONNECT_LINUX_WINDOWS_SUBMESSAGE]
228 6f4c1371 Kostas Papadimitriou
        },
229 6f4c1371 Kostas Papadimitriou
    'windows': {
230 140d08d0 Kostas Papadimitriou
            'linux': [CONNECT_WINDOWS_LINUX_MESSAGE,
231 140d08d0 Kostas Papadimitriou
                      CONNECT_WINDOWS_LINUX_SUBMESSAGE],
232 140d08d0 Kostas Papadimitriou
            'windows': [CONNECT_WINDOWS_WINDOWS_MESSAGE,
233 140d08d0 Kostas Papadimitriou
                        CONNECT_WINDOWS_WINDOWS_SUBMESSAGE]
234 6f4c1371 Kostas Papadimitriou
        }
235 6f4c1371 Kostas Papadimitriou
    }
236 6f4c1371 Kostas Papadimitriou
237 65ecc5e4 Kostas Papadimitriou
# retrieve domain prefix from settings
238 140d08d0 Kostas Papadimitriou
DOMAIN_PREFIX = getattr(settings, 'MACHINE_DOMAIN_PREFIX', getattr(settings,
239 140d08d0 Kostas Papadimitriou
                        'BACKEND_PREFIX_ID', ""))
240 65ecc5e4 Kostas Papadimitriou
241 65ecc5e4 Kostas Papadimitriou
# domain template string
242 65ecc5e4 Kostas Papadimitriou
DOMAIN_TPL = "%s%%s" % DOMAIN_PREFIX
243 65ecc5e4 Kostas Papadimitriou
244 fd70c1db Markos Gogoulos
def machines_connect(request):
245 fd70c1db Markos Gogoulos
    ip_address = request.GET.get('ip_address','')
246 5bc1794f Kostas Papadimitriou
    operating_system = metadata_os = request.GET.get('os','')
247 bdf369a2 Kostas Papadimitriou
    server_id = request.GET.get('srv', 0)
248 6f4c1371 Kostas Papadimitriou
    host_os = request.GET.get('host_os','Linux').lower()
249 5bc1794f Kostas Papadimitriou
    username = request.GET.get('username', None)
250 65ecc5e4 Kostas Papadimitriou
    domain = request.GET.get("domain", DOMAIN_TPL % int(server_id))
251 6f4c1371 Kostas Papadimitriou
252 406bf0d9 Kostas Papadimitriou
    # guess host os
253 319091c7 Kostas Papadimitriou
    if host_os != "windows":
254 319091c7 Kostas Papadimitriou
        host_os = 'linux'
255 319091c7 Kostas Papadimitriou
256 406bf0d9 Kostas Papadimitriou
    # guess username
257 406bf0d9 Kostas Papadimitriou
    if not username:
258 406bf0d9 Kostas Papadimitriou
        username = "root"
259 406bf0d9 Kostas Papadimitriou
260 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() in ['ubuntu', 'kubuntu', 'fedora']:
261 406bf0d9 Kostas Papadimitriou
            username = "user"
262 406bf0d9 Kostas Papadimitriou
263 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() == "windows":
264 406bf0d9 Kostas Papadimitriou
            username = "Administrator"
265 406bf0d9 Kostas Papadimitriou
266 406bf0d9 Kostas Papadimitriou
    # operating system provides ssh access
267 406bf0d9 Kostas Papadimitriou
    ssh = False
268 6f4c1371 Kostas Papadimitriou
    if operating_system != "windows":
269 6f4c1371 Kostas Papadimitriou
        operating_system = "linux"
270 406bf0d9 Kostas Papadimitriou
        ssh = True
271 6f4c1371 Kostas Papadimitriou
272 bdf369a2 Kostas Papadimitriou
    # rdp param is set, the user requested rdp file
273 406bf0d9 Kostas Papadimitriou
    # check if we are on windows
274 406bf0d9 Kostas Papadimitriou
    if operating_system == 'windows' and request.GET.get("rdp", False):
275 406bf0d9 Kostas Papadimitriou
276 406bf0d9 Kostas Papadimitriou
        # UI sent domain info (from vm metadata) use this
277 406bf0d9 Kostas Papadimitriou
        # otherwise use our default snf-<vm_id> domain
278 406bf0d9 Kostas Papadimitriou
        rdp_context = {
279 406bf0d9 Kostas Papadimitriou
                'username': username,
280 406bf0d9 Kostas Papadimitriou
                'domain': domain,
281 406bf0d9 Kostas Papadimitriou
                'ip_address': ip_address
282 406bf0d9 Kostas Papadimitriou
        }
283 406bf0d9 Kostas Papadimitriou
284 406bf0d9 Kostas Papadimitriou
        rdp_file_data = render_to_string("synnefo-windows.rdp", rdp_context)
285 406bf0d9 Kostas Papadimitriou
        response = HttpResponse(rdp_file_data, mimetype='application/x-rdp')
286 bdf369a2 Kostas Papadimitriou
287 bdf369a2 Kostas Papadimitriou
        # proper filename, use server id and ip address
288 bdf369a2 Kostas Papadimitriou
        filename = "%d-%s.rdp" % (int(server_id), ip_address)
289 bdf369a2 Kostas Papadimitriou
        response['Content-Disposition'] = 'attachment; filename=%s' % filename
290 fd70c1db Markos Gogoulos
    else:
291 bdf369a2 Kostas Papadimitriou
        link_title = _("Remote desktop to %s") % ip_address
292 406bf0d9 Kostas Papadimitriou
        link_url = "%s?ip_address=%s&os=%s&rdp=1&srv=%d&username=%s&domain=%s" % (
293 d194e869 Kostas Papadimitriou
                reverse("ui_machines_connect"), ip_address, operating_system,int(server_id), username, domain)
294 5bc1794f Kostas Papadimitriou
295 b687587e Kostas Papadimitriou
        if (operating_system != "windows"):
296 406bf0d9 Kostas Papadimitriou
            link_title = "ssh %s@%s" % (username, ip_address)
297 bdf369a2 Kostas Papadimitriou
            link_url = None
298 bdf369a2 Kostas Papadimitriou
299 bdf369a2 Kostas Papadimitriou
            if host_os == "windows":
300 406bf0d9 Kostas Papadimitriou
                link_title = "%s@%s" % (username, ip_address)
301 b687587e Kostas Papadimitriou
302 6f4c1371 Kostas Papadimitriou
        # try to find a specific message
303 6f4c1371 Kostas Papadimitriou
        try:
304 65ecc5e4 Kostas Papadimitriou
            connect_message = CONNECT_PROMPT_MESSAGES[host_os][operating_system][0]
305 65ecc5e4 Kostas Papadimitriou
            subinfo = CONNECT_PROMPT_MESSAGES[host_os][operating_system][1]
306 6f4c1371 Kostas Papadimitriou
        except KeyError:
307 140d08d0 Kostas Papadimitriou
            connect_message = _("You are trying to connect from a %s "
308 140d08d0 Kostas Papadimitriou
                                "machine to a %s machine") % (host_os, operating_system)
309 bdf369a2 Kostas Papadimitriou
            subinfo = ""
310 6f4c1371 Kostas Papadimitriou
311 b687587e Kostas Papadimitriou
        response_object = {
312 b687587e Kostas Papadimitriou
                'ip': ip_address,
313 b687587e Kostas Papadimitriou
                'os': operating_system,
314 b687587e Kostas Papadimitriou
                'ssh': ssh,
315 6f4c1371 Kostas Papadimitriou
                'info': unicode(connect_message),
316 bdf369a2 Kostas Papadimitriou
                'subinfo': unicode(subinfo),
317 b687587e Kostas Papadimitriou
                'link': {'title': unicode(link_title), 'url': link_url}
318 b687587e Kostas Papadimitriou
            }
319 140d08d0 Kostas Papadimitriou
        response = HttpResponse(json.dumps(response_object),
320 140d08d0 Kostas Papadimitriou
                                mimetype='application/json')  #no windows, no rdp
321 6f4c1371 Kostas Papadimitriou
322 fd70c1db Markos Gogoulos
    return response
323 fd70c1db Markos Gogoulos
324 faf5ddde Kostas Papadimitriou
def feedback_submit(request):
325 31f9a55b Kostas Papadimitriou
    if not request.method == "POST":
326 31f9a55b Kostas Papadimitriou
        raise Http404
327 31f9a55b Kostas Papadimitriou
328 02f0cd19 Kostas Papadimitriou
    # fill request object with astakos user information
329 02f0cd19 Kostas Papadimitriou
    get_user(request, settings.ASTAKOS_URL)
330 02f0cd19 Kostas Papadimitriou
331 faf5ddde Kostas Papadimitriou
    message = request.POST.get("feedback-msg")
332 faf5ddde Kostas Papadimitriou
    data = request.POST.get("feedback-data")
333 faf5ddde Kostas Papadimitriou
334 faf5ddde Kostas Papadimitriou
    # default to True (calls from error pages)
335 faf5ddde Kostas Papadimitriou
    allow_data_send = request.POST.get("feedback-submit-data", True)
336 faf5ddde Kostas Papadimitriou
337 31f9a55b Kostas Papadimitriou
    mail_subject = unicode(_("Feedback from synnefo application"))
338 faf5ddde Kostas Papadimitriou
339 140d08d0 Kostas Papadimitriou
    mail_context = {'message': message, 'data': data,
340 140d08d0 Kostas Papadimitriou
                    'allow_data_send': allow_data_send, 'request': request}
341 faf5ddde Kostas Papadimitriou
    mail_content = render_to_string("feedback_mail.txt", mail_context)
342 faf5ddde Kostas Papadimitriou
343 c90302ad Kostas Papadimitriou
    send_mail(mail_subject, mail_content, FEEDBACK_EMAIL_FROM,
344 c90302ad Kostas Papadimitriou
            dict(FEEDBACK_CONTACTS).values(), fail_silently=False)
345 faf5ddde Kostas Papadimitriou
346 8d08f18a Kostas Papadimitriou
    return HttpResponse('{"status":"send"}');