Statistics
| Branch: | Tag: | Revision:

root / snf-app / synnefo / ui / views.py @ 483c9197

History | View | Annotate | Download (13.6 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 edda4d30 Markos Gogoulos
import os
35 abf90954 Markos Gogoulos
from django.conf import settings
36 edda4d30 Markos Gogoulos
from django.utils.translation import gettext_lazy as _
37 b303ba05 Christodoulos Psaltis
from django.template import Context, loader
38 cc7c5902 Dimitris Moraitis
from django.http import HttpResponse
39 ec06b07c Dimitris Moraitis
from django.utils.translation import get_language
40 9c901aec Markos Gogoulos
from django.utils import simplejson as json
41 f533f224 Vangelis Koukis
from django.shortcuts import render_to_response
42 faf5ddde Kostas Papadimitriou
from django.template.loader import render_to_string
43 b687587e Kostas Papadimitriou
from django.core.urlresolvers import reverse
44 cc7c5902 Dimitris Moraitis
45 c90302ad Kostas Papadimitriou
from django.core.mail import send_mail
46 faf5ddde Kostas Papadimitriou
47 31f9a55b Kostas Papadimitriou
from django.http import Http404
48 31f9a55b Kostas Papadimitriou
49 7970aa87 Kostas Papadimitriou
SYNNEFO_JS_LIB_VERSION = "0.7"
50 7970aa87 Kostas Papadimitriou
51 f533f224 Vangelis Koukis
IMAGE_ICONS = settings.IMAGE_ICONS
52 dacd179a Kostas Papadimitriou
LOGOUT_URL = getattr(settings, "LOGOUT_URL", settings.LOGIN_URL)
53 48c07635 Kostas Papadimitriou
INVITATIONS_PER_PAGE = getattr(settings, "INVITATIONS_PER_PAGE", 10)
54 e646ebe5 Dimitris Moraitis
55 66be390b Kostas Papadimitriou
# UI preferences settings
56 66be390b Kostas Papadimitriou
TIMEOUT = getattr(settings, "TIMEOUT", 10000)
57 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL = getattr(settings, "UI_UPDATE_INTERVAL", 5000)
58 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_INCREASE = getattr(settings, "UI_UPDATE_INTERVAL_INCREASE", 500)
59 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT = getattr(settings,
60 140d08d0 Kostas Papadimitriou
                                "UI_UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT",
61 140d08d0 Kostas Papadimitriou
                                3)
62 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_FAST = getattr(settings, "UI_UPDATE_INTERVAL_FAST", 2500)
63 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_MAX = getattr(settings, "UI_UPDATE_INTERVAL_MAX", 10000)
64 66be390b Kostas Papadimitriou
65 66be390b Kostas Papadimitriou
# predefined values settings
66 66be390b Kostas Papadimitriou
VM_IMAGE_COMMON_METADATA = getattr(settings, "VM_IMAGE_COMMON_METADATA", ["OS"])
67 66be390b Kostas Papadimitriou
SUGGESTED_FLAVORS_DEFAULT = {}
68 140d08d0 Kostas Papadimitriou
SUGGESTED_FLAVORS = getattr(settings, "VM_CREATE_SUGGESTED_FLAVORS",
69 140d08d0 Kostas Papadimitriou
                            SUGGESTED_FLAVORS_DEFAULT)
70 140d08d0 Kostas Papadimitriou
SUGGESTED_ROLES_DEFAULT = ["Database server", "File server", "Mail server",
71 140d08d0 Kostas Papadimitriou
                           "Web server", "Proxy"]
72 140d08d0 Kostas Papadimitriou
SUGGESTED_ROLES = getattr(settings, "VM_CREATE_SUGGESTED_ROLES",
73 140d08d0 Kostas Papadimitriou
                          SUGGESTED_ROLES_DEFAULT)
74 66be390b Kostas Papadimitriou
75 556dcd88 Kostas Papadimitriou
SUPPORT_SSH_OS_LIST = getattr(settings, "UI_SUPPORT_SSH_OS_LIST",)
76 47276ec2 Kostas Papadimitriou
77 556dcd88 Kostas Papadimitriou
OS_CREATED_USERS = getattr(settings, "UI_OS_DEFAULT_USER_MAP")
78 47276ec2 Kostas Papadimitriou
79 66be390b Kostas Papadimitriou
# UI behaviour settings
80 66be390b Kostas Papadimitriou
DELAY_ON_BLUR = getattr(settings, "UI_DELAY_ON_BLUR", True)
81 66be390b Kostas Papadimitriou
UPDATE_HIDDEN_VIEWS = getattr(settings, "UI_UPDATE_HIDDEN_VIEWS", False)
82 66be390b Kostas Papadimitriou
HANDLE_WINDOW_EXCEPTIONS = getattr(settings, "UI_HANDLE_WINDOW_EXCEPTIONS", True)
83 66be390b Kostas Papadimitriou
SKIP_TIMEOUTS = getattr(settings, "UI_SKIP_TIMEOUTS", 1)
84 66be390b Kostas Papadimitriou
85 7970aa87 Kostas Papadimitriou
# MEDIA PATHS
86 46990631 Kostas Papadimitriou
UI_MEDIA_URL = getattr(settings, "UI_MEDIA_URL",
87 46990631 Kostas Papadimitriou
                    "%ssnf-%s/" % (settings.MEDIA_URL, SYNNEFO_JS_LIB_VERSION))
88 7970aa87 Kostas Papadimitriou
UI_SYNNEFO_IMAGES_URL = getattr(settings,
89 46990631 Kostas Papadimitriou
                    "UI_SYNNEFO_IMAGES_URL", UI_MEDIA_URL + "images/")
90 7970aa87 Kostas Papadimitriou
UI_SYNNEFO_CSS_URL = getattr(settings,
91 46990631 Kostas Papadimitriou
                    "UI_SYNNEFO_CSS_URL", UI_MEDIA_URL + "css/")
92 c62c6b91 Kostas Papadimitriou
UI_SYNNEFO_JS_URL = getattr(settings,
93 46990631 Kostas Papadimitriou
                    "UI_SYNNEFO_JS_URL", UI_MEDIA_URL + "js/")
94 c62c6b91 Kostas Papadimitriou
UI_SYNNEFO_JS_LIB_URL = getattr(settings,
95 c62c6b91 Kostas Papadimitriou
                    "UI_SYNNEFO_JS_LIB_URL", UI_SYNNEFO_JS_URL + "lib/")
96 c62c6b91 Kostas Papadimitriou
UI_SYNNEFO_JS_WEB_URL = getattr(settings,
97 c62c6b91 Kostas Papadimitriou
                    "UI_SYNNEFO_JS_WEB_URL",
98 c62c6b91 Kostas Papadimitriou
                    UI_SYNNEFO_JS_URL + "ui/web/")
99 c62c6b91 Kostas Papadimitriou
100 c130b56e Kostas Papadimitriou
VM_NAME_TEMPLATE = getattr(settings, "VM_CREATE_NAME_TPL", "My {0} server")
101 c130b56e Kostas Papadimitriou
102 c72a830d Kostas Papadimitriou
# ssh keys
103 1a97a220 Kostas Papadimitriou
MAX_SSH_KEYS_PER_USER = getattr(settings, "USERDATA_MAX_SSH_KEYS_PER_USER")
104 c72a830d Kostas Papadimitriou
105 c4e70532 Kostas Papadimitriou
FLAVORS_DISK_TEMPLATES_INFO = getattr(settings, "UI_FLAVORS_DISK_TEMPLATES_INFO", {})
106 d965e6dc Kostas Papadimitriou
107 cc7c5902 Dimitris Moraitis
def template(name, context):
108 e646ebe5 Dimitris Moraitis
    template_path = os.path.join(os.path.dirname(__file__), "templates/")
109 b303ba05 Christodoulos Psaltis
    current_template = template_path + name + '.html'
110 b303ba05 Christodoulos Psaltis
    t = loader.get_template(current_template)
111 7970aa87 Kostas Papadimitriou
    media_context = {
112 7970aa87 Kostas Papadimitriou
       'UI_MEDIA_URL': UI_MEDIA_URL,
113 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_URL': UI_SYNNEFO_JS_URL,
114 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_LIB_URL': UI_SYNNEFO_JS_LIB_URL,
115 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_WEB_URL': UI_SYNNEFO_JS_WEB_URL,
116 7970aa87 Kostas Papadimitriou
       'SYNNEFO_IMAGES_URL': UI_SYNNEFO_IMAGES_URL,
117 7970aa87 Kostas Papadimitriou
       'SYNNEFO_CSS_URL': UI_SYNNEFO_CSS_URL,
118 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_LIB_VERSION': SYNNEFO_JS_LIB_VERSION,
119 7970aa87 Kostas Papadimitriou
       'DEBUG': settings.DEBUG
120 7970aa87 Kostas Papadimitriou
    }
121 7970aa87 Kostas Papadimitriou
    context.update(media_context)
122 b303ba05 Christodoulos Psaltis
    return HttpResponse(t.render(Context(context)))
123 cc7c5902 Dimitris Moraitis
124 cc7c5902 Dimitris Moraitis
def home(request):
125 e646ebe5 Dimitris Moraitis
    context = {'timeout': TIMEOUT,
126 a226ff9f Christodoulos Psaltis
               'project': '+nefo',
127 e646ebe5 Dimitris Moraitis
               'request': request,
128 f533f224 Vangelis Koukis
               'current_lang': get_language() or 'en',
129 1cc6e94f Kostas Papadimitriou
130 7b03c69d Dimitris Moraitis
               'update_interval': UPDATE_INTERVAL,
131 1cc6e94f Kostas Papadimitriou
               'update_interval_increase': UPDATE_INTERVAL_INCREASE,
132 1cc6e94f Kostas Papadimitriou
               'update_interval_increase_after_calls': UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT,
133 1cc6e94f Kostas Papadimitriou
               'update_interval_fast': UPDATE_INTERVAL_FAST,
134 1cc6e94f Kostas Papadimitriou
               'update_interval_max': UPDATE_INTERVAL_MAX,
135 1cc6e94f Kostas Papadimitriou
136 0e8e87ac Kostas Papadimitriou
               'image_icons': IMAGE_ICONS,
137 dacd179a Kostas Papadimitriou
               'logout_redirect': LOGOUT_URL,
138 e0dea91a Kostas Papadimitriou
               'suggested_flavors': json.dumps(SUGGESTED_FLAVORS),
139 73e25ce2 Kostas Papadimitriou
               'suggested_roles': json.dumps(SUGGESTED_ROLES),
140 bcd451ea Kostas Papadimitriou
               'vm_image_common_metadata': json.dumps(VM_IMAGE_COMMON_METADATA),
141 5764e310 Kostas Papadimitriou
               'synnefo_version': SYNNEFO_JS_LIB_VERSION,
142 48c07635 Kostas Papadimitriou
               'invitations_per_page': INVITATIONS_PER_PAGE,
143 66be390b Kostas Papadimitriou
               'delay_on_blur': json.dumps(DELAY_ON_BLUR),
144 66be390b Kostas Papadimitriou
               'update_hidden_views': json.dumps(UPDATE_HIDDEN_VIEWS),
145 66be390b Kostas Papadimitriou
               'handle_window_exceptions': json.dumps(HANDLE_WINDOW_EXCEPTIONS),
146 66be390b Kostas Papadimitriou
               'skip_timeouts': json.dumps(SKIP_TIMEOUTS),
147 9c191b95 Kostas Papadimitriou
               'vm_name_template': json.dumps(VM_NAME_TEMPLATE),
148 d965e6dc Kostas Papadimitriou
               'flavors_disk_templates_info': json.dumps(FLAVORS_DISK_TEMPLATES_INFO),
149 47276ec2 Kostas Papadimitriou
               'support_ssh_os_list': json.dumps(SUPPORT_SSH_OS_LIST),
150 47276ec2 Kostas Papadimitriou
               'os_created_users': json.dumps(OS_CREATED_USERS),
151 c72a830d Kostas Papadimitriou
               'userdata_keys_limit': json.dumps(MAX_SSH_KEYS_PER_USER),
152 7970aa87 Kostas Papadimitriou
               }
153 cc7c5902 Dimitris Moraitis
    return template('home', context)
154 cc7c5902 Dimitris Moraitis
155 f533f224 Vangelis Koukis
def machines_console(request):
156 473d37cc Markos Gogoulos
    host, port, password = ('','','')
157 6912c72b Markos Gogoulos
    host = request.GET.get('host','')
158 6912c72b Markos Gogoulos
    port = request.GET.get('port','')
159 6912c72b Markos Gogoulos
    password = request.GET.get('password','')
160 f533f224 Vangelis Koukis
    machine = request.GET.get('machine','')
161 f533f224 Vangelis Koukis
    host_ip = request.GET.get('host_ip','')
162 f277a1cd Kostas Papadimitriou
    host_ip_v6 = request.GET.get('host_ip_v6','')
163 140d08d0 Kostas Papadimitriou
    context = {'host': host, 'port': port, 'password': password,
164 140d08d0 Kostas Papadimitriou
               'machine': machine, 'host_ip': host_ip, 'host_ip_v6': host_ip_v6}
165 f533f224 Vangelis Koukis
    return template('machines_console', context)
166 e646ebe5 Dimitris Moraitis
167 8d08f18a Kostas Papadimitriou
def js_tests(request):
168 8d08f18a Kostas Papadimitriou
    return template('tests', {})
169 6f4c1371 Kostas Papadimitriou
170 bdf369a2 Kostas Papadimitriou
CONNECT_LINUX_LINUX_MESSAGE = _("""A direct connection to this machine can be established using the <a target="_blank"
171 bdf369a2 Kostas Papadimitriou
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
172 bdf369a2 Kostas Papadimitriou
To do so open a terminal and type the following at the prompt to connect to your machine:""")
173 bdf369a2 Kostas Papadimitriou
CONNECT_LINUX_WINDOWS_MESSAGE = _("""A direct connection to this machine can be
174 bdf369a2 Kostas Papadimitriou
established using <a target="_blank" href="http://en.wikipedia.org/wiki/Remote_Desktop_Services">Remote Desktop Service</a>.
175 bdf369a2 Kostas Papadimitriou
To do so, open the following file with an appropriate remote desktop client.""")
176 bdf369a2 Kostas Papadimitriou
CONNECT_LINUX_WINDOWS_SUBMESSAGE = _("""If you don't have one already
177 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>.""")
178 bdf369a2 Kostas Papadimitriou
CONNECT_WINDOWS_LINUX_MESSAGE = _("""A direct connection to this machine can be established using the <a target="_blank"
179 bdf369a2 Kostas Papadimitriou
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
180 ae748a9d Kostas Papadimitriou
Open an ssh client such as PuTTY and type the following:""")
181 bdf369a2 Kostas Papadimitriou
CONNECT_WINDOWS_LINUX_SUBMESSAGE = _("""If you do not have an ssh client already installed,
182 bdf369a2 Kostas Papadimitriou
<a target="_blank" href="http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe">Download PuTTY</a>""")
183 6f4c1371 Kostas Papadimitriou
184 65ecc5e4 Kostas Papadimitriou
CONNECT_WINDOWS_WINDOWS_MESSAGE = _("""A direct connection to this machine can be
185 65ecc5e4 Kostas Papadimitriou
established using Remote Desktop. Click on the following link, and if asked open it using "Remote Desktop Connection" """)
186 65ecc5e4 Kostas Papadimitriou
CONNECT_WINDOWS_WINDOWS_SUBMESSAGE = _("""Save this file to disk for future use""")
187 bdf369a2 Kostas Papadimitriou
188 bdf369a2 Kostas Papadimitriou
# info/subinfo for all os combinations
189 bdf369a2 Kostas Papadimitriou
#
190 bdf369a2 Kostas Papadimitriou
# [0] info gets displayed on top of the message box
191 bdf369a2 Kostas Papadimitriou
# [1] subinfo gets displayed on the bottom as extra info
192 bdf369a2 Kostas Papadimitriou
# provided to the user when needed
193 65ecc5e4 Kostas Papadimitriou
CONNECT_PROMPT_MESSAGES = {
194 6f4c1371 Kostas Papadimitriou
    'linux': {
195 bdf369a2 Kostas Papadimitriou
            'linux': [CONNECT_LINUX_LINUX_MESSAGE, ""],
196 140d08d0 Kostas Papadimitriou
            'windows': [CONNECT_LINUX_WINDOWS_MESSAGE,
197 140d08d0 Kostas Papadimitriou
                        CONNECT_LINUX_WINDOWS_SUBMESSAGE]
198 6f4c1371 Kostas Papadimitriou
        },
199 6f4c1371 Kostas Papadimitriou
    'windows': {
200 140d08d0 Kostas Papadimitriou
            'linux': [CONNECT_WINDOWS_LINUX_MESSAGE,
201 140d08d0 Kostas Papadimitriou
                      CONNECT_WINDOWS_LINUX_SUBMESSAGE],
202 140d08d0 Kostas Papadimitriou
            'windows': [CONNECT_WINDOWS_WINDOWS_MESSAGE,
203 140d08d0 Kostas Papadimitriou
                        CONNECT_WINDOWS_WINDOWS_SUBMESSAGE]
204 6f4c1371 Kostas Papadimitriou
        }
205 6f4c1371 Kostas Papadimitriou
    }
206 6f4c1371 Kostas Papadimitriou
207 65ecc5e4 Kostas Papadimitriou
# retrieve domain prefix from settings
208 140d08d0 Kostas Papadimitriou
DOMAIN_PREFIX = getattr(settings, 'MACHINE_DOMAIN_PREFIX', getattr(settings,
209 140d08d0 Kostas Papadimitriou
                        'BACKEND_PREFIX_ID', ""))
210 65ecc5e4 Kostas Papadimitriou
211 65ecc5e4 Kostas Papadimitriou
# domain template string
212 65ecc5e4 Kostas Papadimitriou
DOMAIN_TPL = "%s%%s" % DOMAIN_PREFIX
213 65ecc5e4 Kostas Papadimitriou
214 fd70c1db Markos Gogoulos
def machines_connect(request):
215 fd70c1db Markos Gogoulos
    ip_address = request.GET.get('ip_address','')
216 5bc1794f Kostas Papadimitriou
    operating_system = metadata_os = request.GET.get('os','')
217 bdf369a2 Kostas Papadimitriou
    server_id = request.GET.get('srv', 0)
218 6f4c1371 Kostas Papadimitriou
    host_os = request.GET.get('host_os','Linux').lower()
219 5bc1794f Kostas Papadimitriou
    username = request.GET.get('username', None)
220 65ecc5e4 Kostas Papadimitriou
    domain = request.GET.get("domain", DOMAIN_TPL % int(server_id))
221 6f4c1371 Kostas Papadimitriou
222 406bf0d9 Kostas Papadimitriou
    # guess host os
223 319091c7 Kostas Papadimitriou
    if host_os != "windows":
224 319091c7 Kostas Papadimitriou
        host_os = 'linux'
225 319091c7 Kostas Papadimitriou
226 406bf0d9 Kostas Papadimitriou
    # guess username
227 406bf0d9 Kostas Papadimitriou
    if not username:
228 406bf0d9 Kostas Papadimitriou
        username = "root"
229 406bf0d9 Kostas Papadimitriou
230 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() in ['ubuntu', 'kubuntu', 'fedora']:
231 406bf0d9 Kostas Papadimitriou
            username = "user"
232 406bf0d9 Kostas Papadimitriou
233 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() == "windows":
234 406bf0d9 Kostas Papadimitriou
            username = "Administrator"
235 406bf0d9 Kostas Papadimitriou
236 406bf0d9 Kostas Papadimitriou
    # operating system provides ssh access
237 406bf0d9 Kostas Papadimitriou
    ssh = False
238 6f4c1371 Kostas Papadimitriou
    if operating_system != "windows":
239 6f4c1371 Kostas Papadimitriou
        operating_system = "linux"
240 406bf0d9 Kostas Papadimitriou
        ssh = True
241 6f4c1371 Kostas Papadimitriou
242 bdf369a2 Kostas Papadimitriou
    # rdp param is set, the user requested rdp file
243 406bf0d9 Kostas Papadimitriou
    # check if we are on windows
244 406bf0d9 Kostas Papadimitriou
    if operating_system == 'windows' and request.GET.get("rdp", False):
245 406bf0d9 Kostas Papadimitriou
246 406bf0d9 Kostas Papadimitriou
        # UI sent domain info (from vm metadata) use this
247 406bf0d9 Kostas Papadimitriou
        # otherwise use our default snf-<vm_id> domain
248 406bf0d9 Kostas Papadimitriou
        rdp_context = {
249 406bf0d9 Kostas Papadimitriou
                'username': username,
250 406bf0d9 Kostas Papadimitriou
                'domain': domain,
251 406bf0d9 Kostas Papadimitriou
                'ip_address': ip_address
252 406bf0d9 Kostas Papadimitriou
        }
253 406bf0d9 Kostas Papadimitriou
254 406bf0d9 Kostas Papadimitriou
        rdp_file_data = render_to_string("synnefo-windows.rdp", rdp_context)
255 406bf0d9 Kostas Papadimitriou
        response = HttpResponse(rdp_file_data, mimetype='application/x-rdp')
256 bdf369a2 Kostas Papadimitriou
257 bdf369a2 Kostas Papadimitriou
        # proper filename, use server id and ip address
258 bdf369a2 Kostas Papadimitriou
        filename = "%d-%s.rdp" % (int(server_id), ip_address)
259 bdf369a2 Kostas Papadimitriou
        response['Content-Disposition'] = 'attachment; filename=%s' % filename
260 fd70c1db Markos Gogoulos
    else:
261 bdf369a2 Kostas Papadimitriou
        link_title = _("Remote desktop to %s") % ip_address
262 406bf0d9 Kostas Papadimitriou
        link_url = "%s?ip_address=%s&os=%s&rdp=1&srv=%d&username=%s&domain=%s" % (
263 406bf0d9 Kostas Papadimitriou
                reverse("machines-connect"), ip_address, operating_system,int(server_id), username, domain)
264 5bc1794f Kostas Papadimitriou
265 b687587e Kostas Papadimitriou
        if (operating_system != "windows"):
266 406bf0d9 Kostas Papadimitriou
            link_title = "ssh %s@%s" % (username, ip_address)
267 bdf369a2 Kostas Papadimitriou
            link_url = None
268 bdf369a2 Kostas Papadimitriou
269 bdf369a2 Kostas Papadimitriou
            if host_os == "windows":
270 406bf0d9 Kostas Papadimitriou
                link_title = "%s@%s" % (username, ip_address)
271 b687587e Kostas Papadimitriou
272 6f4c1371 Kostas Papadimitriou
        # try to find a specific message
273 6f4c1371 Kostas Papadimitriou
        try:
274 65ecc5e4 Kostas Papadimitriou
            connect_message = CONNECT_PROMPT_MESSAGES[host_os][operating_system][0]
275 65ecc5e4 Kostas Papadimitriou
            subinfo = CONNECT_PROMPT_MESSAGES[host_os][operating_system][1]
276 6f4c1371 Kostas Papadimitriou
        except KeyError:
277 140d08d0 Kostas Papadimitriou
            connect_message = _("You are trying to connect from a %s "
278 140d08d0 Kostas Papadimitriou
                                "machine to a %s machine") % (host_os, operating_system)
279 bdf369a2 Kostas Papadimitriou
            subinfo = ""
280 6f4c1371 Kostas Papadimitriou
281 b687587e Kostas Papadimitriou
        response_object = {
282 b687587e Kostas Papadimitriou
                'ip': ip_address,
283 b687587e Kostas Papadimitriou
                'os': operating_system,
284 b687587e Kostas Papadimitriou
                'ssh': ssh,
285 6f4c1371 Kostas Papadimitriou
                'info': unicode(connect_message),
286 bdf369a2 Kostas Papadimitriou
                'subinfo': unicode(subinfo),
287 b687587e Kostas Papadimitriou
                'link': {'title': unicode(link_title), 'url': link_url}
288 b687587e Kostas Papadimitriou
            }
289 140d08d0 Kostas Papadimitriou
        response = HttpResponse(json.dumps(response_object),
290 140d08d0 Kostas Papadimitriou
                                mimetype='application/json')  #no windows, no rdp
291 6f4c1371 Kostas Papadimitriou
292 fd70c1db Markos Gogoulos
    return response
293 fd70c1db Markos Gogoulos
294 faf5ddde Kostas Papadimitriou
FEEDBACK_CONTACTS = getattr(settings, "FEEDBACK_CONTACTS", [])
295 faf5ddde Kostas Papadimitriou
FEEDBACK_EMAIL_FROM = settings.FEEDBACK_EMAIL_FROM
296 faf5ddde Kostas Papadimitriou
297 faf5ddde Kostas Papadimitriou
def feedback_submit(request):
298 31f9a55b Kostas Papadimitriou
    if not request.method == "POST":
299 31f9a55b Kostas Papadimitriou
        raise Http404
300 31f9a55b Kostas Papadimitriou
301 faf5ddde Kostas Papadimitriou
    message = request.POST.get("feedback-msg")
302 faf5ddde Kostas Papadimitriou
    data = request.POST.get("feedback-data")
303 faf5ddde Kostas Papadimitriou
304 faf5ddde Kostas Papadimitriou
    # default to True (calls from error pages)
305 faf5ddde Kostas Papadimitriou
    allow_data_send = request.POST.get("feedback-submit-data", True)
306 faf5ddde Kostas Papadimitriou
307 31f9a55b Kostas Papadimitriou
    mail_subject = unicode(_("Feedback from synnefo application"))
308 faf5ddde Kostas Papadimitriou
309 140d08d0 Kostas Papadimitriou
    mail_context = {'message': message, 'data': data,
310 140d08d0 Kostas Papadimitriou
                    'allow_data_send': allow_data_send, 'request': request}
311 faf5ddde Kostas Papadimitriou
    mail_content = render_to_string("feedback_mail.txt", mail_context)
312 faf5ddde Kostas Papadimitriou
313 c90302ad Kostas Papadimitriou
    send_mail(mail_subject, mail_content, FEEDBACK_EMAIL_FROM,
314 c90302ad Kostas Papadimitriou
            dict(FEEDBACK_CONTACTS).values(), fail_silently=False)
315 faf5ddde Kostas Papadimitriou
316 8d08f18a Kostas Papadimitriou
    return HttpResponse('{"status":"send"}');