Statistics
| Branch: | Tag: | Revision:

root / ui / views.py @ f81d0548

History | View | Annotate | Download (10.4 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 faf5ddde Kostas Papadimitriou
from synnefo.logic.email_send import send_async
46 faf5ddde Kostas Papadimitriou
47 31f9a55b Kostas Papadimitriou
from django.http import Http404
48 31f9a55b Kostas Papadimitriou
49 abf90954 Markos Gogoulos
TIMEOUT = settings.TIMEOUT
50 7b03c69d Dimitris Moraitis
UPDATE_INTERVAL = settings.UPDATE_INTERVAL
51 f533f224 Vangelis Koukis
IMAGE_ICONS = settings.IMAGE_ICONS
52 dacd179a Kostas Papadimitriou
LOGOUT_URL = getattr(settings, "LOGOUT_URL", settings.LOGIN_URL)
53 e646ebe5 Dimitris Moraitis
54 cc7c5902 Dimitris Moraitis
def template(name, context):
55 e646ebe5 Dimitris Moraitis
    template_path = os.path.join(os.path.dirname(__file__), "templates/")
56 b303ba05 Christodoulos Psaltis
    current_template = template_path + name + '.html'
57 b303ba05 Christodoulos Psaltis
    t = loader.get_template(current_template)
58 b303ba05 Christodoulos Psaltis
    return HttpResponse(t.render(Context(context)))
59 cc7c5902 Dimitris Moraitis
60 cc7c5902 Dimitris Moraitis
def home(request):
61 e646ebe5 Dimitris Moraitis
    context = {'timeout': TIMEOUT,
62 a226ff9f Christodoulos Psaltis
               'project': '+nefo',
63 e646ebe5 Dimitris Moraitis
               'request': request,
64 f533f224 Vangelis Koukis
               'current_lang': get_language() or 'en',
65 7b03c69d Dimitris Moraitis
               'update_interval': UPDATE_INTERVAL,
66 0e8e87ac Kostas Papadimitriou
               'image_icons': IMAGE_ICONS,
67 dacd179a Kostas Papadimitriou
               'logout_redirect': LOGOUT_URL,
68 0e8e87ac Kostas Papadimitriou
               'DEBUG': settings.DEBUG}
69 cc7c5902 Dimitris Moraitis
    return template('home', context)
70 cc7c5902 Dimitris Moraitis
71 43df43aa Markos Gogoulos
def machines(request):
72 f533f224 Vangelis Koukis
    context = {'default_keywords': settings.DEFAULT_KEYWORDS}
73 43df43aa Markos Gogoulos
    return template('machines', context)
74 42f67a2a Dimitris Moraitis
75 f533f224 Vangelis Koukis
def machines_icon(request):
76 f533f224 Vangelis Koukis
    context = {'default_keywords': settings.DEFAULT_KEYWORDS}
77 f533f224 Vangelis Koukis
    return template('machines_icon', context)
78 f533f224 Vangelis Koukis
79 f533f224 Vangelis Koukis
def machines_list(request):
80 f533f224 Vangelis Koukis
    context = {'default_keywords': settings.DEFAULT_KEYWORDS}
81 f533f224 Vangelis Koukis
    return template('machines_list', context)
82 f533f224 Vangelis Koukis
83 f533f224 Vangelis Koukis
def machines_single(request):
84 f533f224 Vangelis Koukis
    context = {'default_keywords': settings.DEFAULT_KEYWORDS}
85 f533f224 Vangelis Koukis
    return template('machines_single', context)
86 f533f224 Vangelis Koukis
87 f533f224 Vangelis Koukis
def machines_console(request):
88 473d37cc Markos Gogoulos
    host, port, password = ('','','')
89 6912c72b Markos Gogoulos
    host = request.GET.get('host','')
90 6912c72b Markos Gogoulos
    port = request.GET.get('port','')
91 6912c72b Markos Gogoulos
    password = request.GET.get('password','')
92 f533f224 Vangelis Koukis
    machine = request.GET.get('machine','')
93 f533f224 Vangelis Koukis
    host_ip = request.GET.get('host_ip','')
94 f277a1cd Kostas Papadimitriou
    host_ip_v6 = request.GET.get('host_ip_v6','')
95 f277a1cd Kostas Papadimitriou
    context = {'host': host, 'port': port, 'password': password, 'machine': machine, 'host_ip': host_ip, 'host_ip_v6': host_ip_v6}
96 f533f224 Vangelis Koukis
    return template('machines_console', context)
97 e646ebe5 Dimitris Moraitis
98 6f4c1371 Kostas Papadimitriou
99 bdf369a2 Kostas Papadimitriou
CONNECT_LINUX_LINUX_MESSAGE = _("""A direct connection to this machine can be established using the <a target="_blank"
100 bdf369a2 Kostas Papadimitriou
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
101 bdf369a2 Kostas Papadimitriou
To do so open a terminal and type the following at the prompt to connect to your machine:""")
102 bdf369a2 Kostas Papadimitriou
CONNECT_LINUX_WINDOWS_MESSAGE = _("""A direct connection to this machine can be
103 bdf369a2 Kostas Papadimitriou
established using <a target="_blank" href="http://en.wikipedia.org/wiki/Remote_Desktop_Services">Remote Desktop Service</a>.
104 bdf369a2 Kostas Papadimitriou
To do so, open the following file with an appropriate remote desktop client.""")
105 bdf369a2 Kostas Papadimitriou
CONNECT_LINUX_WINDOWS_SUBMESSAGE = _("""If you don't have one already
106 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>.""")
107 bdf369a2 Kostas Papadimitriou
CONNECT_WINDOWS_LINUX_MESSAGE = _("""A direct connection to this machine can be established using the <a target="_blank"
108 bdf369a2 Kostas Papadimitriou
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
109 ae748a9d Kostas Papadimitriou
Open an ssh client such as PuTTY and type the following:""")
110 bdf369a2 Kostas Papadimitriou
CONNECT_WINDOWS_LINUX_SUBMESSAGE = _("""If you do not have an ssh client already installed,
111 bdf369a2 Kostas Papadimitriou
<a target="_blank" href="http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe">Download PuTTY</a>""")
112 6f4c1371 Kostas Papadimitriou
113 65ecc5e4 Kostas Papadimitriou
CONNECT_WINDOWS_WINDOWS_MESSAGE = _("""A direct connection to this machine can be
114 65ecc5e4 Kostas Papadimitriou
established using Remote Desktop. Click on the following link, and if asked open it using "Remote Desktop Connection" """)
115 65ecc5e4 Kostas Papadimitriou
CONNECT_WINDOWS_WINDOWS_SUBMESSAGE = _("""Save this file to disk for future use""")
116 bdf369a2 Kostas Papadimitriou
117 bdf369a2 Kostas Papadimitriou
# info/subinfo for all os combinations
118 bdf369a2 Kostas Papadimitriou
#
119 bdf369a2 Kostas Papadimitriou
# [0] info gets displayed on top of the message box
120 bdf369a2 Kostas Papadimitriou
# [1] subinfo gets displayed on the bottom as extra info
121 bdf369a2 Kostas Papadimitriou
# provided to the user when needed
122 65ecc5e4 Kostas Papadimitriou
CONNECT_PROMPT_MESSAGES = {
123 6f4c1371 Kostas Papadimitriou
    'linux': {
124 bdf369a2 Kostas Papadimitriou
            'linux': [CONNECT_LINUX_LINUX_MESSAGE, ""],
125 bdf369a2 Kostas Papadimitriou
            'windows': [CONNECT_LINUX_WINDOWS_MESSAGE, CONNECT_LINUX_WINDOWS_SUBMESSAGE]
126 6f4c1371 Kostas Papadimitriou
        },
127 6f4c1371 Kostas Papadimitriou
    'windows': {
128 bdf369a2 Kostas Papadimitriou
            'linux': [CONNECT_WINDOWS_LINUX_MESSAGE, CONNECT_WINDOWS_LINUX_SUBMESSAGE],
129 65ecc5e4 Kostas Papadimitriou
            'windows': [CONNECT_WINDOWS_WINDOWS_MESSAGE, CONNECT_WINDOWS_WINDOWS_SUBMESSAGE]
130 6f4c1371 Kostas Papadimitriou
        }
131 6f4c1371 Kostas Papadimitriou
    }
132 6f4c1371 Kostas Papadimitriou
133 65ecc5e4 Kostas Papadimitriou
# retrieve domain prefix from settings
134 65ecc5e4 Kostas Papadimitriou
DOMAIN_PREFIX = getattr(settings, 'MACHINE_DOMAIN_PREFIX', getattr(settings, 'BACKEND_PREFIX_ID', ""))
135 65ecc5e4 Kostas Papadimitriou
136 65ecc5e4 Kostas Papadimitriou
# domain template string
137 65ecc5e4 Kostas Papadimitriou
DOMAIN_TPL = "%s%%s" % DOMAIN_PREFIX
138 65ecc5e4 Kostas Papadimitriou
139 fd70c1db Markos Gogoulos
def machines_connect(request):
140 fd70c1db Markos Gogoulos
    ip_address = request.GET.get('ip_address','')
141 5bc1794f Kostas Papadimitriou
    operating_system = metadata_os = request.GET.get('os','')
142 bdf369a2 Kostas Papadimitriou
    server_id = request.GET.get('srv', 0)
143 6f4c1371 Kostas Papadimitriou
    host_os = request.GET.get('host_os','Linux').lower()
144 5bc1794f Kostas Papadimitriou
    username = request.GET.get('username', None)
145 65ecc5e4 Kostas Papadimitriou
    domain = request.GET.get("domain", DOMAIN_TPL % int(server_id))
146 6f4c1371 Kostas Papadimitriou
147 406bf0d9 Kostas Papadimitriou
    # guess host os
148 319091c7 Kostas Papadimitriou
    if host_os != "windows":
149 319091c7 Kostas Papadimitriou
        host_os = 'linux'
150 319091c7 Kostas Papadimitriou
151 406bf0d9 Kostas Papadimitriou
    # guess username
152 406bf0d9 Kostas Papadimitriou
    if not username:
153 406bf0d9 Kostas Papadimitriou
        username = "root"
154 406bf0d9 Kostas Papadimitriou
155 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() in ['ubuntu', 'kubuntu', 'fedora']:
156 406bf0d9 Kostas Papadimitriou
            username = "user"
157 406bf0d9 Kostas Papadimitriou
158 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() == "windows":
159 406bf0d9 Kostas Papadimitriou
            username = "Administrator"
160 406bf0d9 Kostas Papadimitriou
161 406bf0d9 Kostas Papadimitriou
    # operating system provides ssh access
162 406bf0d9 Kostas Papadimitriou
    ssh = False
163 6f4c1371 Kostas Papadimitriou
    if operating_system != "windows":
164 6f4c1371 Kostas Papadimitriou
        operating_system = "linux"
165 406bf0d9 Kostas Papadimitriou
        ssh = True
166 6f4c1371 Kostas Papadimitriou
167 bdf369a2 Kostas Papadimitriou
    # rdp param is set, the user requested rdp file
168 406bf0d9 Kostas Papadimitriou
    # check if we are on windows
169 406bf0d9 Kostas Papadimitriou
    if operating_system == 'windows' and request.GET.get("rdp", False):
170 406bf0d9 Kostas Papadimitriou
171 406bf0d9 Kostas Papadimitriou
        # UI sent domain info (from vm metadata) use this
172 406bf0d9 Kostas Papadimitriou
        # otherwise use our default snf-<vm_id> domain
173 406bf0d9 Kostas Papadimitriou
        rdp_context = {
174 406bf0d9 Kostas Papadimitriou
                'username': username,
175 406bf0d9 Kostas Papadimitriou
                'domain': domain,
176 406bf0d9 Kostas Papadimitriou
                'ip_address': ip_address
177 406bf0d9 Kostas Papadimitriou
        }
178 406bf0d9 Kostas Papadimitriou
179 406bf0d9 Kostas Papadimitriou
        rdp_file_data = render_to_string("synnefo-windows.rdp", rdp_context)
180 406bf0d9 Kostas Papadimitriou
        response = HttpResponse(rdp_file_data, mimetype='application/x-rdp')
181 bdf369a2 Kostas Papadimitriou
182 bdf369a2 Kostas Papadimitriou
        # proper filename, use server id and ip address
183 bdf369a2 Kostas Papadimitriou
        filename = "%d-%s.rdp" % (int(server_id), ip_address)
184 bdf369a2 Kostas Papadimitriou
        response['Content-Disposition'] = 'attachment; filename=%s' % filename
185 fd70c1db Markos Gogoulos
    else:
186 bdf369a2 Kostas Papadimitriou
        link_title = _("Remote desktop to %s") % ip_address
187 406bf0d9 Kostas Papadimitriou
        link_url = "%s?ip_address=%s&os=%s&rdp=1&srv=%d&username=%s&domain=%s" % (
188 406bf0d9 Kostas Papadimitriou
                reverse("machines-connect"), ip_address, operating_system,int(server_id), username, domain)
189 5bc1794f Kostas Papadimitriou
190 b687587e Kostas Papadimitriou
        if (operating_system != "windows"):
191 406bf0d9 Kostas Papadimitriou
            link_title = "ssh %s@%s" % (username, ip_address)
192 bdf369a2 Kostas Papadimitriou
            link_url = None
193 bdf369a2 Kostas Papadimitriou
194 bdf369a2 Kostas Papadimitriou
            if host_os == "windows":
195 406bf0d9 Kostas Papadimitriou
                link_title = "%s@%s" % (username, ip_address)
196 b687587e Kostas Papadimitriou
197 6f4c1371 Kostas Papadimitriou
        # try to find a specific message
198 6f4c1371 Kostas Papadimitriou
        try:
199 65ecc5e4 Kostas Papadimitriou
            connect_message = CONNECT_PROMPT_MESSAGES[host_os][operating_system][0]
200 65ecc5e4 Kostas Papadimitriou
            subinfo = CONNECT_PROMPT_MESSAGES[host_os][operating_system][1]
201 6f4c1371 Kostas Papadimitriou
        except KeyError:
202 6f4c1371 Kostas Papadimitriou
            connect_message = _("You are trying to connect from a %s machine to a %s machine") % (host_os, operating_system)
203 bdf369a2 Kostas Papadimitriou
            subinfo = ""
204 6f4c1371 Kostas Papadimitriou
205 b687587e Kostas Papadimitriou
        response_object = {
206 b687587e Kostas Papadimitriou
                'ip': ip_address,
207 b687587e Kostas Papadimitriou
                'os': operating_system,
208 b687587e Kostas Papadimitriou
                'ssh': ssh,
209 6f4c1371 Kostas Papadimitriou
                'info': unicode(connect_message),
210 bdf369a2 Kostas Papadimitriou
                'subinfo': unicode(subinfo),
211 b687587e Kostas Papadimitriou
                'link': {'title': unicode(link_title), 'url': link_url}
212 b687587e Kostas Papadimitriou
            }
213 b687587e Kostas Papadimitriou
        response = HttpResponse(json.dumps(response_object), mimetype='application/json')  #no windows, no rdp
214 6f4c1371 Kostas Papadimitriou
215 fd70c1db Markos Gogoulos
    return response
216 fd70c1db Markos Gogoulos
217 faf5ddde Kostas Papadimitriou
FEEDBACK_CONTACTS = getattr(settings, "FEEDBACK_CONTACTS", [])
218 faf5ddde Kostas Papadimitriou
FEEDBACK_EMAIL_FROM = settings.FEEDBACK_EMAIL_FROM
219 faf5ddde Kostas Papadimitriou
220 faf5ddde Kostas Papadimitriou
def feedback_submit(request):
221 31f9a55b Kostas Papadimitriou
222 31f9a55b Kostas Papadimitriou
    if not request.method == "POST":
223 31f9a55b Kostas Papadimitriou
        raise Http404
224 31f9a55b Kostas Papadimitriou
225 faf5ddde Kostas Papadimitriou
    message = request.POST.get("feedback-msg")
226 faf5ddde Kostas Papadimitriou
    data = request.POST.get("feedback-data")
227 faf5ddde Kostas Papadimitriou
228 faf5ddde Kostas Papadimitriou
    # default to True (calls from error pages)
229 faf5ddde Kostas Papadimitriou
    allow_data_send = request.POST.get("feedback-submit-data", True)
230 faf5ddde Kostas Papadimitriou
231 31f9a55b Kostas Papadimitriou
    mail_subject = unicode(_("Feedback from synnefo application"))
232 faf5ddde Kostas Papadimitriou
233 faf5ddde Kostas Papadimitriou
    mail_context = {'message': message, 'data': data, 'allow_data_send': allow_data_send, 'request': request}
234 faf5ddde Kostas Papadimitriou
    mail_content = render_to_string("feedback_mail.txt", mail_context)
235 faf5ddde Kostas Papadimitriou
236 faf5ddde Kostas Papadimitriou
    if settings.DEBUG:
237 faf5ddde Kostas Papadimitriou
        print mail_subject, mail_content
238 faf5ddde Kostas Papadimitriou
239 faf5ddde Kostas Papadimitriou
    for email in FEEDBACK_CONTACTS:
240 faf5ddde Kostas Papadimitriou
        send_async(
241 faf5ddde Kostas Papadimitriou
                frm = FEEDBACK_EMAIL_FROM,
242 faf5ddde Kostas Papadimitriou
                to = "%s <%s>" % (email[0], email[1]),
243 faf5ddde Kostas Papadimitriou
                subject = mail_subject,
244 faf5ddde Kostas Papadimitriou
                body = mail_content
245 faf5ddde Kostas Papadimitriou
        )
246 faf5ddde Kostas Papadimitriou
247 faf5ddde Kostas Papadimitriou
    return HttpResponse("ok");
248 fd70c1db Markos Gogoulos
249 e646ebe5 Dimitris Moraitis
def images(request):
250 ec06b07c Dimitris Moraitis
    context = {}
251 cc7c5902 Dimitris Moraitis
    return template('images', context)
252 cc7c5902 Dimitris Moraitis
253 cc7c5902 Dimitris Moraitis
def disks(request):
254 ec06b07c Dimitris Moraitis
    context = {}
255 cc7c5902 Dimitris Moraitis
    return template('disks', context)
256 cc7c5902 Dimitris Moraitis
257 cc7c5902 Dimitris Moraitis
def networks(request):
258 ec06b07c Dimitris Moraitis
    context = {}
259 cc7c5902 Dimitris Moraitis
    return template('networks', context)
260 0dedf601 Christodoulos Psaltis
261 f533f224 Vangelis Koukis
def files(request):
262 0dedf601 Christodoulos Psaltis
    context = {}
263 0dedf601 Christodoulos Psaltis
    return template('files', context)
264 0dedf601 Christodoulos Psaltis
265 0dedf601 Christodoulos Psaltis
def desktops(request):
266 0dedf601 Christodoulos Psaltis
    context = {}
267 0dedf601 Christodoulos Psaltis
    return template('desktops', context)
268 0dedf601 Christodoulos Psaltis
269 0dedf601 Christodoulos Psaltis
def apps(request):
270 0dedf601 Christodoulos Psaltis
    context = {}
271 0dedf601 Christodoulos Psaltis
    return template('apps', context)