Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (15 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 03639c6d Kostas Papadimitriou
                            '(deleted image)')
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 bdf369a2 Kostas Papadimitriou
To do so, open the following file with an appropriate remote desktop client.""")
199 bdf369a2 Kostas Papadimitriou
CONNECT_LINUX_WINDOWS_SUBMESSAGE = _("""If you don't have one already
200 bdf369a2 Kostas Papadimitriou
installed, we suggest the use of <a target="_blank" href="http://sourceforge.net/projects/tsclient/files/tsclient/tsclient-unstable/tsclient-2.0.1.tar.bz2/download">tsclient</a>.""")
201 bdf369a2 Kostas Papadimitriou
CONNECT_WINDOWS_LINUX_MESSAGE = _("""A direct connection to this machine can be established using the <a target="_blank"
202 bdf369a2 Kostas Papadimitriou
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
203 ae748a9d Kostas Papadimitriou
Open an ssh client such as PuTTY and type the following:""")
204 bdf369a2 Kostas Papadimitriou
CONNECT_WINDOWS_LINUX_SUBMESSAGE = _("""If you do not have an ssh client already installed,
205 bdf369a2 Kostas Papadimitriou
<a target="_blank" href="http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe">Download PuTTY</a>""")
206 6f4c1371 Kostas Papadimitriou
207 65ecc5e4 Kostas Papadimitriou
CONNECT_WINDOWS_WINDOWS_MESSAGE = _("""A direct connection to this machine can be
208 65ecc5e4 Kostas Papadimitriou
established using Remote Desktop. Click on the following link, and if asked open it using "Remote Desktop Connection" """)
209 65ecc5e4 Kostas Papadimitriou
CONNECT_WINDOWS_WINDOWS_SUBMESSAGE = _("""Save this file to disk for future use""")
210 bdf369a2 Kostas Papadimitriou
211 bdf369a2 Kostas Papadimitriou
# info/subinfo for all os combinations
212 bdf369a2 Kostas Papadimitriou
#
213 bdf369a2 Kostas Papadimitriou
# [0] info gets displayed on top of the message box
214 bdf369a2 Kostas Papadimitriou
# [1] subinfo gets displayed on the bottom as extra info
215 bdf369a2 Kostas Papadimitriou
# provided to the user when needed
216 65ecc5e4 Kostas Papadimitriou
CONNECT_PROMPT_MESSAGES = {
217 6f4c1371 Kostas Papadimitriou
    'linux': {
218 bdf369a2 Kostas Papadimitriou
            'linux': [CONNECT_LINUX_LINUX_MESSAGE, ""],
219 140d08d0 Kostas Papadimitriou
            'windows': [CONNECT_LINUX_WINDOWS_MESSAGE,
220 140d08d0 Kostas Papadimitriou
                        CONNECT_LINUX_WINDOWS_SUBMESSAGE]
221 6f4c1371 Kostas Papadimitriou
        },
222 6f4c1371 Kostas Papadimitriou
    'windows': {
223 140d08d0 Kostas Papadimitriou
            'linux': [CONNECT_WINDOWS_LINUX_MESSAGE,
224 140d08d0 Kostas Papadimitriou
                      CONNECT_WINDOWS_LINUX_SUBMESSAGE],
225 140d08d0 Kostas Papadimitriou
            'windows': [CONNECT_WINDOWS_WINDOWS_MESSAGE,
226 140d08d0 Kostas Papadimitriou
                        CONNECT_WINDOWS_WINDOWS_SUBMESSAGE]
227 6f4c1371 Kostas Papadimitriou
        }
228 6f4c1371 Kostas Papadimitriou
    }
229 6f4c1371 Kostas Papadimitriou
230 65ecc5e4 Kostas Papadimitriou
# retrieve domain prefix from settings
231 140d08d0 Kostas Papadimitriou
DOMAIN_PREFIX = getattr(settings, 'MACHINE_DOMAIN_PREFIX', getattr(settings,
232 140d08d0 Kostas Papadimitriou
                        'BACKEND_PREFIX_ID', ""))
233 65ecc5e4 Kostas Papadimitriou
234 65ecc5e4 Kostas Papadimitriou
# domain template string
235 65ecc5e4 Kostas Papadimitriou
DOMAIN_TPL = "%s%%s" % DOMAIN_PREFIX
236 65ecc5e4 Kostas Papadimitriou
237 fd70c1db Markos Gogoulos
def machines_connect(request):
238 fd70c1db Markos Gogoulos
    ip_address = request.GET.get('ip_address','')
239 5bc1794f Kostas Papadimitriou
    operating_system = metadata_os = request.GET.get('os','')
240 bdf369a2 Kostas Papadimitriou
    server_id = request.GET.get('srv', 0)
241 6f4c1371 Kostas Papadimitriou
    host_os = request.GET.get('host_os','Linux').lower()
242 5bc1794f Kostas Papadimitriou
    username = request.GET.get('username', None)
243 65ecc5e4 Kostas Papadimitriou
    domain = request.GET.get("domain", DOMAIN_TPL % int(server_id))
244 6f4c1371 Kostas Papadimitriou
245 406bf0d9 Kostas Papadimitriou
    # guess host os
246 319091c7 Kostas Papadimitriou
    if host_os != "windows":
247 319091c7 Kostas Papadimitriou
        host_os = 'linux'
248 319091c7 Kostas Papadimitriou
249 406bf0d9 Kostas Papadimitriou
    # guess username
250 406bf0d9 Kostas Papadimitriou
    if not username:
251 406bf0d9 Kostas Papadimitriou
        username = "root"
252 406bf0d9 Kostas Papadimitriou
253 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() in ['ubuntu', 'kubuntu', 'fedora']:
254 406bf0d9 Kostas Papadimitriou
            username = "user"
255 406bf0d9 Kostas Papadimitriou
256 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() == "windows":
257 406bf0d9 Kostas Papadimitriou
            username = "Administrator"
258 406bf0d9 Kostas Papadimitriou
259 406bf0d9 Kostas Papadimitriou
    # operating system provides ssh access
260 406bf0d9 Kostas Papadimitriou
    ssh = False
261 6f4c1371 Kostas Papadimitriou
    if operating_system != "windows":
262 6f4c1371 Kostas Papadimitriou
        operating_system = "linux"
263 406bf0d9 Kostas Papadimitriou
        ssh = True
264 6f4c1371 Kostas Papadimitriou
265 bdf369a2 Kostas Papadimitriou
    # rdp param is set, the user requested rdp file
266 406bf0d9 Kostas Papadimitriou
    # check if we are on windows
267 406bf0d9 Kostas Papadimitriou
    if operating_system == 'windows' and request.GET.get("rdp", False):
268 406bf0d9 Kostas Papadimitriou
269 406bf0d9 Kostas Papadimitriou
        # UI sent domain info (from vm metadata) use this
270 406bf0d9 Kostas Papadimitriou
        # otherwise use our default snf-<vm_id> domain
271 406bf0d9 Kostas Papadimitriou
        rdp_context = {
272 406bf0d9 Kostas Papadimitriou
                'username': username,
273 406bf0d9 Kostas Papadimitriou
                'domain': domain,
274 406bf0d9 Kostas Papadimitriou
                'ip_address': ip_address
275 406bf0d9 Kostas Papadimitriou
        }
276 406bf0d9 Kostas Papadimitriou
277 406bf0d9 Kostas Papadimitriou
        rdp_file_data = render_to_string("synnefo-windows.rdp", rdp_context)
278 406bf0d9 Kostas Papadimitriou
        response = HttpResponse(rdp_file_data, mimetype='application/x-rdp')
279 bdf369a2 Kostas Papadimitriou
280 bdf369a2 Kostas Papadimitriou
        # proper filename, use server id and ip address
281 bdf369a2 Kostas Papadimitriou
        filename = "%d-%s.rdp" % (int(server_id), ip_address)
282 bdf369a2 Kostas Papadimitriou
        response['Content-Disposition'] = 'attachment; filename=%s' % filename
283 fd70c1db Markos Gogoulos
    else:
284 bdf369a2 Kostas Papadimitriou
        link_title = _("Remote desktop to %s") % ip_address
285 406bf0d9 Kostas Papadimitriou
        link_url = "%s?ip_address=%s&os=%s&rdp=1&srv=%d&username=%s&domain=%s" % (
286 406bf0d9 Kostas Papadimitriou
                reverse("machines-connect"), ip_address, operating_system,int(server_id), username, domain)
287 5bc1794f Kostas Papadimitriou
288 b687587e Kostas Papadimitriou
        if (operating_system != "windows"):
289 406bf0d9 Kostas Papadimitriou
            link_title = "ssh %s@%s" % (username, ip_address)
290 bdf369a2 Kostas Papadimitriou
            link_url = None
291 bdf369a2 Kostas Papadimitriou
292 bdf369a2 Kostas Papadimitriou
            if host_os == "windows":
293 406bf0d9 Kostas Papadimitriou
                link_title = "%s@%s" % (username, ip_address)
294 b687587e Kostas Papadimitriou
295 6f4c1371 Kostas Papadimitriou
        # try to find a specific message
296 6f4c1371 Kostas Papadimitriou
        try:
297 65ecc5e4 Kostas Papadimitriou
            connect_message = CONNECT_PROMPT_MESSAGES[host_os][operating_system][0]
298 65ecc5e4 Kostas Papadimitriou
            subinfo = CONNECT_PROMPT_MESSAGES[host_os][operating_system][1]
299 6f4c1371 Kostas Papadimitriou
        except KeyError:
300 140d08d0 Kostas Papadimitriou
            connect_message = _("You are trying to connect from a %s "
301 140d08d0 Kostas Papadimitriou
                                "machine to a %s machine") % (host_os, operating_system)
302 bdf369a2 Kostas Papadimitriou
            subinfo = ""
303 6f4c1371 Kostas Papadimitriou
304 b687587e Kostas Papadimitriou
        response_object = {
305 b687587e Kostas Papadimitriou
                'ip': ip_address,
306 b687587e Kostas Papadimitriou
                'os': operating_system,
307 b687587e Kostas Papadimitriou
                'ssh': ssh,
308 6f4c1371 Kostas Papadimitriou
                'info': unicode(connect_message),
309 bdf369a2 Kostas Papadimitriou
                'subinfo': unicode(subinfo),
310 b687587e Kostas Papadimitriou
                'link': {'title': unicode(link_title), 'url': link_url}
311 b687587e Kostas Papadimitriou
            }
312 140d08d0 Kostas Papadimitriou
        response = HttpResponse(json.dumps(response_object),
313 140d08d0 Kostas Papadimitriou
                                mimetype='application/json')  #no windows, no rdp
314 6f4c1371 Kostas Papadimitriou
315 fd70c1db Markos Gogoulos
    return response
316 fd70c1db Markos Gogoulos
317 faf5ddde Kostas Papadimitriou
def feedback_submit(request):
318 31f9a55b Kostas Papadimitriou
    if not request.method == "POST":
319 31f9a55b Kostas Papadimitriou
        raise Http404
320 31f9a55b Kostas Papadimitriou
321 02f0cd19 Kostas Papadimitriou
    # fill request object with astakos user information
322 02f0cd19 Kostas Papadimitriou
    get_user(request, settings.ASTAKOS_URL)
323 02f0cd19 Kostas Papadimitriou
324 faf5ddde Kostas Papadimitriou
    message = request.POST.get("feedback-msg")
325 faf5ddde Kostas Papadimitriou
    data = request.POST.get("feedback-data")
326 faf5ddde Kostas Papadimitriou
327 faf5ddde Kostas Papadimitriou
    # default to True (calls from error pages)
328 faf5ddde Kostas Papadimitriou
    allow_data_send = request.POST.get("feedback-submit-data", True)
329 faf5ddde Kostas Papadimitriou
330 31f9a55b Kostas Papadimitriou
    mail_subject = unicode(_("Feedback from synnefo application"))
331 faf5ddde Kostas Papadimitriou
332 140d08d0 Kostas Papadimitriou
    mail_context = {'message': message, 'data': data,
333 140d08d0 Kostas Papadimitriou
                    'allow_data_send': allow_data_send, 'request': request}
334 faf5ddde Kostas Papadimitriou
    mail_content = render_to_string("feedback_mail.txt", mail_context)
335 faf5ddde Kostas Papadimitriou
336 c90302ad Kostas Papadimitriou
    send_mail(mail_subject, mail_content, FEEDBACK_EMAIL_FROM,
337 c90302ad Kostas Papadimitriou
            dict(FEEDBACK_CONTACTS).values(), fail_silently=False)
338 faf5ddde Kostas Papadimitriou
339 8d08f18a Kostas Papadimitriou
    return HttpResponse('{"status":"send"}');