Statistics
| Branch: | Tag: | Revision:

root / ui / views.py @ c72a830d

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