Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / helpdesk / views.py @ 2eda9c61

History | View | Annotate | Download (12.1 kB)

1 b4b82ec4 Giorgos Korfiatis
# Copyright 2012, 2013 GRNET S.A. All rights reserved.
2 605d23bf Kostas Papadimitriou
#
3 605d23bf Kostas Papadimitriou
# Redistribution and use in source and binary forms, with or
4 605d23bf Kostas Papadimitriou
# without modification, are permitted provided that the following
5 605d23bf Kostas Papadimitriou
# conditions are met:
6 605d23bf Kostas Papadimitriou
#
7 605d23bf Kostas Papadimitriou
#   1. Redistributions of source code must retain the above
8 605d23bf Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
9 605d23bf Kostas Papadimitriou
#      disclaimer.
10 605d23bf Kostas Papadimitriou
#
11 605d23bf Kostas Papadimitriou
#   2. Redistributions in binary form must reproduce the above
12 605d23bf Kostas Papadimitriou
#      copyright notice, this list of conditions and the following
13 605d23bf Kostas Papadimitriou
#      disclaimer in the documentation and/or other materials
14 605d23bf Kostas Papadimitriou
#      provided with the distribution.
15 605d23bf Kostas Papadimitriou
#
16 605d23bf Kostas Papadimitriou
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 605d23bf Kostas Papadimitriou
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 605d23bf Kostas Papadimitriou
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 605d23bf Kostas Papadimitriou
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 605d23bf Kostas Papadimitriou
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 605d23bf Kostas Papadimitriou
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 605d23bf Kostas Papadimitriou
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 605d23bf Kostas Papadimitriou
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 605d23bf Kostas Papadimitriou
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 605d23bf Kostas Papadimitriou
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 605d23bf Kostas Papadimitriou
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 605d23bf Kostas Papadimitriou
# POSSIBILITY OF SUCH DAMAGE.
28 605d23bf Kostas Papadimitriou
#
29 605d23bf Kostas Papadimitriou
# The views and conclusions contained in the software and
30 605d23bf Kostas Papadimitriou
# documentation are those of the authors and should not be
31 605d23bf Kostas Papadimitriou
# interpreted as representing official policies, either expressed
32 605d23bf Kostas Papadimitriou
# or implied, of GRNET S.A.
33 605d23bf Kostas Papadimitriou
34 d59d86d4 Kostas Papadimitriou
import re
35 605d23bf Kostas Papadimitriou
import logging
36 d59d86d4 Kostas Papadimitriou
37 6c45fa84 Kostas Papadimitriou
from django.shortcuts import redirect
38 c3564ce9 Kostas Papadimitriou
from django.views.generic.simple import direct_to_template
39 e129e26b Kostas Papadimitriou
from django.conf import settings
40 e129e26b Kostas Papadimitriou
from django.core.exceptions import PermissionDenied
41 6c45fa84 Kostas Papadimitriou
from django.http import Http404, HttpResponseRedirect
42 605d23bf Kostas Papadimitriou
from django.core.urlresolvers import reverse
43 605d23bf Kostas Papadimitriou
44 ebda2ad4 Kostas Papadimitriou
from urllib import unquote
45 c3564ce9 Kostas Papadimitriou
46 d91de78c Christos Stavrakakis
import astakosclient
47 d91de78c Christos Stavrakakis
from snf_django.lib import astakos
48 d91de78c Christos Stavrakakis
49 4a71827c Christos Stavrakakis
from synnefo.db.models import VirtualMachine, Network, IPAddressLog
50 e129e26b Kostas Papadimitriou
51 cc5c8608 Kostas Papadimitriou
# server actions specific imports
52 731cd907 Kostas Papadimitriou
from synnefo.logic import servers as servers_backend
53 27c0d6c5 Kostas Papadimitriou
from synnefo.ui.views import UI_MEDIA_URL
54 cc5c8608 Kostas Papadimitriou
55 605d23bf Kostas Papadimitriou
logger = logging.getLogger(__name__)
56 605d23bf Kostas Papadimitriou
57 7ad07359 Kostas Papadimitriou
HELPDESK_MEDIA_URL = getattr(settings, 'HELPDESK_MEDIA_URL',
58 7ad07359 Kostas Papadimitriou
                             settings.MEDIA_URL + 'helpdesk/')
59 7ad07359 Kostas Papadimitriou
60 d59d86d4 Kostas Papadimitriou
IP_SEARCH_REGEX = re.compile('([0-9]+)(?:\.[0-9]+){3}')
61 6c45fa84 Kostas Papadimitriou
UUID_SEARCH_REGEX = re.compile('([0-9a-z]{8}-([0-9a-z]{4}-){3}[0-9a-z]{12})')
62 ba8ff608 Kostas Papadimitriou
VM_SEARCH_REGEX = re.compile('vm(-){0,}(?P<vmid>[0-9]+)')
63 6c45fa84 Kostas Papadimitriou
64 6c45fa84 Kostas Papadimitriou
65 ebda2ad4 Kostas Papadimitriou
def get_token_from_cookie(request, cookiename):
66 ebda2ad4 Kostas Papadimitriou
    """
67 ebda2ad4 Kostas Papadimitriou
    Extract token from the cookie name provided. Cookie should be in the same
68 ebda2ad4 Kostas Papadimitriou
    form as astakos service sets its cookie contents::
69 ebda2ad4 Kostas Papadimitriou

70 ebda2ad4 Kostas Papadimitriou
        <user_uniq>|<user_token>
71 ebda2ad4 Kostas Papadimitriou
    """
72 ebda2ad4 Kostas Papadimitriou
    try:
73 ebda2ad4 Kostas Papadimitriou
        cookie_content = unquote(request.COOKIES.get(cookiename, None))
74 ebda2ad4 Kostas Papadimitriou
        return cookie_content.split("|")[1]
75 ebda2ad4 Kostas Papadimitriou
    except AttributeError:
76 ebda2ad4 Kostas Papadimitriou
        pass
77 ebda2ad4 Kostas Papadimitriou
78 ebda2ad4 Kostas Papadimitriou
    return None
79 ebda2ad4 Kostas Papadimitriou
80 9fd36718 Kostas Papadimitriou
81 6c45fa84 Kostas Papadimitriou
AUTH_COOKIE_NAME = getattr(settings, 'HELPDESK_AUTH_COOKIE_NAME',
82 6c45fa84 Kostas Papadimitriou
                           getattr(settings, 'UI_AUTH_COOKIE_NAME',
83 6c45fa84 Kostas Papadimitriou
                                   '_pithos2_a'))
84 6c45fa84 Kostas Papadimitriou
PERMITTED_GROUPS = getattr(settings, 'HELPDESK_PERMITTED_GROUPS', ['helpdesk'])
85 605d23bf Kostas Papadimitriou
SHOW_DELETED_VMS = getattr(settings, 'HELPDESK_SHOW_DELETED_VMS', False)
86 605d23bf Kostas Papadimitriou
87 605d23bf Kostas Papadimitriou
88 605d23bf Kostas Papadimitriou
def token_check(func):
89 605d23bf Kostas Papadimitriou
    """
90 605d23bf Kostas Papadimitriou
    Mimic csrf security check using user auth token.
91 605d23bf Kostas Papadimitriou
    """
92 605d23bf Kostas Papadimitriou
    def wrapper(request, *args, **kwargs):
93 605d23bf Kostas Papadimitriou
        if not hasattr(request, 'user'):
94 605d23bf Kostas Papadimitriou
            raise PermissionDenied
95 605d23bf Kostas Papadimitriou
96 605d23bf Kostas Papadimitriou
        token = request.POST.get('token', None)
97 b4b82ec4 Giorgos Korfiatis
        if token:
98 b4b82ec4 Giorgos Korfiatis
            try:
99 b4b82ec4 Giorgos Korfiatis
                req_token = request.user["access"]["token"]["id"]
100 b4b82ec4 Giorgos Korfiatis
                if token == req_token:
101 b4b82ec4 Giorgos Korfiatis
                    return func(request, *args, **kwargs)
102 b4b82ec4 Giorgos Korfiatis
            except KeyError:
103 b4b82ec4 Giorgos Korfiatis
                pass
104 605d23bf Kostas Papadimitriou
105 605d23bf Kostas Papadimitriou
        raise PermissionDenied
106 605d23bf Kostas Papadimitriou
107 605d23bf Kostas Papadimitriou
    return wrapper
108 9fd36718 Kostas Papadimitriou
109 e129e26b Kostas Papadimitriou
110 605d23bf Kostas Papadimitriou
def helpdesk_user_required(func, permitted_groups=PERMITTED_GROUPS):
111 e129e26b Kostas Papadimitriou
    """
112 e129e26b Kostas Papadimitriou
    Django view wrapper that checks if identified request user has helpdesk
113 e129e26b Kostas Papadimitriou
    permissions (exists in helpdesk group)
114 e129e26b Kostas Papadimitriou
    """
115 e129e26b Kostas Papadimitriou
    def wrapper(request, *args, **kwargs):
116 9fd36718 Kostas Papadimitriou
        HELPDESK_ENABLED = getattr(settings, 'HELPDESK_ENABLED', True)
117 9fd36718 Kostas Papadimitriou
        if not HELPDESK_ENABLED:
118 9fd36718 Kostas Papadimitriou
            raise Http404
119 9fd36718 Kostas Papadimitriou
120 605d23bf Kostas Papadimitriou
        token = get_token_from_cookie(request, AUTH_COOKIE_NAME)
121 e407f159 Ilias Tsitsimpis
        astakos.get_user(request, settings.ASTAKOS_AUTH_URL,
122 d91de78c Christos Stavrakakis
                         fallback_token=token, logger=logger)
123 9e3519e0 Kostas Papadimitriou
        if hasattr(request, 'user') and request.user:
124 b4b82ec4 Giorgos Korfiatis
            groups = request.user['access']['user']['roles']
125 b4b82ec4 Giorgos Korfiatis
            groups = [g["name"] for g in groups]
126 0e5c88d0 Kostas Papadimitriou
127 0e5c88d0 Kostas Papadimitriou
            if not groups:
128 2efc2580 Christos Stavrakakis
                logger.info("Failed to access helpdesk view. User: %r",
129 2efc2580 Christos Stavrakakis
                            request.user_uniq)
130 0e5c88d0 Kostas Papadimitriou
                raise PermissionDenied
131 0e5c88d0 Kostas Papadimitriou
132 605d23bf Kostas Papadimitriou
            has_perm = False
133 e129e26b Kostas Papadimitriou
            for g in groups:
134 605d23bf Kostas Papadimitriou
                if g in permitted_groups:
135 605d23bf Kostas Papadimitriou
                    has_perm = True
136 605d23bf Kostas Papadimitriou
137 605d23bf Kostas Papadimitriou
            if not has_perm:
138 2efc2580 Christos Stavrakakis
                logger.info("Failed to access helpdesk view %r. No valid "
139 2efc2580 Christos Stavrakakis
                            "helpdesk group (%r) matches user groups (%r)",
140 2efc2580 Christos Stavrakakis
                            request.user_uniq, permitted_groups, groups)
141 605d23bf Kostas Papadimitriou
                raise PermissionDenied
142 e129e26b Kostas Papadimitriou
        else:
143 2efc2580 Christos Stavrakakis
            logger.info("Failed to access helpdesk view %r. No authenticated "
144 2efc2580 Christos Stavrakakis
                        "user found.", request.user_uniq)
145 e129e26b Kostas Papadimitriou
            raise PermissionDenied
146 e129e26b Kostas Papadimitriou
147 4edee820 Kostas Papadimitriou
        logging.info("User %s accessed helpdesk view (%s)", request.user_uniq,
148 4edee820 Kostas Papadimitriou
                     request.path)
149 e129e26b Kostas Papadimitriou
        return func(request, *args, **kwargs)
150 e129e26b Kostas Papadimitriou
151 e129e26b Kostas Papadimitriou
    return wrapper
152 e129e26b Kostas Papadimitriou
153 e129e26b Kostas Papadimitriou
154 e129e26b Kostas Papadimitriou
@helpdesk_user_required
155 c3564ce9 Kostas Papadimitriou
def index(request):
156 c3564ce9 Kostas Papadimitriou
    """
157 c3564ce9 Kostas Papadimitriou
    Helpdesk index view.
158 c3564ce9 Kostas Papadimitriou
    """
159 c3564ce9 Kostas Papadimitriou
    # if form submitted redirect to details
160 c3564ce9 Kostas Papadimitriou
    account = request.GET.get('account', None)
161 c3564ce9 Kostas Papadimitriou
    if account:
162 a973ffb4 Kostas Papadimitriou
        return redirect('helpdesk-details',
163 ba8ff608 Kostas Papadimitriou
                        search_query=account)
164 c3564ce9 Kostas Papadimitriou
165 c3564ce9 Kostas Papadimitriou
    # show index template
166 7ad07359 Kostas Papadimitriou
    return direct_to_template(request, "helpdesk/index.html",
167 7ad07359 Kostas Papadimitriou
                              extra_context={'HELPDESK_MEDIA_URL':
168 7ad07359 Kostas Papadimitriou
                                             HELPDESK_MEDIA_URL})
169 c3564ce9 Kostas Papadimitriou
170 c3564ce9 Kostas Papadimitriou
171 e129e26b Kostas Papadimitriou
@helpdesk_user_required
172 ba8ff608 Kostas Papadimitriou
def account(request, search_query):
173 c3564ce9 Kostas Papadimitriou
    """
174 e129e26b Kostas Papadimitriou
    Account details view.
175 c3564ce9 Kostas Papadimitriou
    """
176 e129e26b Kostas Papadimitriou
177 4edee820 Kostas Papadimitriou
    logging.info("Helpdesk search by %s: %s", request.user_uniq, search_query)
178 605d23bf Kostas Papadimitriou
    show_deleted = bool(int(request.GET.get('deleted', SHOW_DELETED_VMS)))
179 43708a0a Kostas Papadimitriou
    error = request.GET.get('error', None)
180 605d23bf Kostas Papadimitriou
181 9e3519e0 Kostas Papadimitriou
    account_exists = True
182 5a8a6df2 Kostas Papadimitriou
    # flag to indicate successfull astakos calls
183 5a8a6df2 Kostas Papadimitriou
    account_resolved = False
184 d59d86d4 Kostas Papadimitriou
    vms = []
185 d59d86d4 Kostas Papadimitriou
    networks = []
186 ba8ff608 Kostas Papadimitriou
    is_ip = IP_SEARCH_REGEX.match(search_query)
187 ba8ff608 Kostas Papadimitriou
    is_uuid = UUID_SEARCH_REGEX.match(search_query)
188 ba8ff608 Kostas Papadimitriou
    is_vm = VM_SEARCH_REGEX.match(search_query)
189 ba8ff608 Kostas Papadimitriou
    account_name = search_query
190 b4b82ec4 Giorgos Korfiatis
    auth_token = request.user['access']['token']['id']
191 d59d86d4 Kostas Papadimitriou
192 d59d86d4 Kostas Papadimitriou
    if is_ip:
193 bbea0414 Christos Stavrakakis
        # Search the IPAddressLog for the full use history of this IP
194 bbea0414 Christos Stavrakakis
        return search_by_ip(request, search_query)
195 ba8ff608 Kostas Papadimitriou
196 ba8ff608 Kostas Papadimitriou
    if is_vm:
197 ba8ff608 Kostas Papadimitriou
        vmid = is_vm.groupdict().get('vmid')
198 ba8ff608 Kostas Papadimitriou
        try:
199 ba8ff608 Kostas Papadimitriou
            vm = VirtualMachine.objects.get(pk=int(vmid))
200 ba8ff608 Kostas Papadimitriou
            search_query = vm.userid
201 ba8ff608 Kostas Papadimitriou
            is_uuid = True
202 ba8ff608 Kostas Papadimitriou
        except VirtualMachine.DoesNotExist:
203 ba8ff608 Kostas Papadimitriou
            account_exists = False
204 ba8ff608 Kostas Papadimitriou
            account = None
205 ba8ff608 Kostas Papadimitriou
            search_query = vmid
206 6c45fa84 Kostas Papadimitriou
207 e407f159 Ilias Tsitsimpis
    astakos_client = astakosclient.AstakosClient(
208 e407f159 Ilias Tsitsimpis
        auth_token, settings.ASTAKOS_AUTH_URL,
209 e407f159 Ilias Tsitsimpis
        retry=2, use_pool=True, logger=logger)
210 468ba00b Ilias Tsitsimpis
211 5a8a6df2 Kostas Papadimitriou
    account = None
212 6c45fa84 Kostas Papadimitriou
    if is_uuid:
213 ba8ff608 Kostas Papadimitriou
        account = search_query
214 5a8a6df2 Kostas Papadimitriou
        try:
215 e407f159 Ilias Tsitsimpis
            account_name = astakos_client.get_username(account)
216 5a8a6df2 Kostas Papadimitriou
        except:
217 5a8a6df2 Kostas Papadimitriou
            logger.info("Failed to resolve '%s' into account" % account)
218 ba8ff608 Kostas Papadimitriou
219 ba8ff608 Kostas Papadimitriou
    if account_exists and not is_uuid:
220 ba8ff608 Kostas Papadimitriou
        account_name = search_query
221 5a8a6df2 Kostas Papadimitriou
        try:
222 e407f159 Ilias Tsitsimpis
            account = astakos_client.get_uuid(account_name)
223 5a8a6df2 Kostas Papadimitriou
        except:
224 5a8a6df2 Kostas Papadimitriou
            logger.info("Failed to resolve '%s' into account" % account_name)
225 6c45fa84 Kostas Papadimitriou
226 ba8ff608 Kostas Papadimitriou
    if not account:
227 ba8ff608 Kostas Papadimitriou
        account_exists = False
228 5a8a6df2 Kostas Papadimitriou
    else:
229 5a8a6df2 Kostas Papadimitriou
        account_resolved = True
230 ba8ff608 Kostas Papadimitriou
231 6c45fa84 Kostas Papadimitriou
    filter_extra = {}
232 6c45fa84 Kostas Papadimitriou
    if not show_deleted:
233 0c0498c8 Kostas Papadimitriou
        filter_extra['deleted'] = False
234 6c45fa84 Kostas Papadimitriou
235 6c45fa84 Kostas Papadimitriou
    # all user vms
236 6c45fa84 Kostas Papadimitriou
    vms = VirtualMachine.objects.filter(userid=account,
237 6c45fa84 Kostas Papadimitriou
                                        **filter_extra).order_by('deleted')
238 6c45fa84 Kostas Papadimitriou
    # return all user private and public networks
239 6c45fa84 Kostas Papadimitriou
    public_networks = Network.objects.filter(public=True,
240 6c45fa84 Kostas Papadimitriou
                                             nics__machine__userid=account,
241 6c45fa84 Kostas Papadimitriou
                                             **filter_extra
242 6c45fa84 Kostas Papadimitriou
                                             ).order_by('state').distinct()
243 6c45fa84 Kostas Papadimitriou
    private_networks = Network.objects.filter(userid=account,
244 6c45fa84 Kostas Papadimitriou
                                              **filter_extra).order_by('state')
245 6c45fa84 Kostas Papadimitriou
    networks = list(public_networks) + list(private_networks)
246 6c45fa84 Kostas Papadimitriou
247 5a8a6df2 Kostas Papadimitriou
    if vms.count() == 0 and private_networks.count() == 0 and not \
248 5a8a6df2 Kostas Papadimitriou
            account_resolved:
249 6c45fa84 Kostas Papadimitriou
        account_exists = False
250 e129e26b Kostas Papadimitriou
251 c3564ce9 Kostas Papadimitriou
    user_context = {
252 9e3519e0 Kostas Papadimitriou
        'account_exists': account_exists,
253 43708a0a Kostas Papadimitriou
        'error': error,
254 d59d86d4 Kostas Papadimitriou
        'is_ip': is_ip,
255 ba8ff608 Kostas Papadimitriou
        'is_vm': is_vm,
256 ba8ff608 Kostas Papadimitriou
        'is_uuid': is_uuid,
257 c3564ce9 Kostas Papadimitriou
        'account': account,
258 ba8ff608 Kostas Papadimitriou
        'search_query': search_query,
259 9e3519e0 Kostas Papadimitriou
        'vms': vms,
260 6c45fa84 Kostas Papadimitriou
        'show_deleted': show_deleted,
261 6c45fa84 Kostas Papadimitriou
        'account_name': account_name,
262 b4b82ec4 Giorgos Korfiatis
        'token': request.user['access']['token']['id'],
263 c3564ce9 Kostas Papadimitriou
        'networks': networks,
264 27c0d6c5 Kostas Papadimitriou
        'HELPDESK_MEDIA_URL': HELPDESK_MEDIA_URL,
265 27c0d6c5 Kostas Papadimitriou
        'UI_MEDIA_URL': UI_MEDIA_URL
266 c3564ce9 Kostas Papadimitriou
    }
267 d59d86d4 Kostas Papadimitriou
268 c3564ce9 Kostas Papadimitriou
    return direct_to_template(request, "helpdesk/account.html",
269 6c45fa84 Kostas Papadimitriou
                              extra_context=user_context)
270 c3564ce9 Kostas Papadimitriou
271 ebda2ad4 Kostas Papadimitriou
272 bbea0414 Christos Stavrakakis
def search_by_ip(request, search_query):
273 bbea0414 Christos Stavrakakis
    """Search IP history for all uses of an IP address."""
274 bbea0414 Christos Stavrakakis
    auth_token = request.user['access']['token']['id']
275 bbea0414 Christos Stavrakakis
    astakos_client = astakosclient.AstakosClient(auth_token,
276 bbea0414 Christos Stavrakakis
                                                 settings.ASTAKOS_AUTH_URL,
277 bbea0414 Christos Stavrakakis
                                                 retry=2, use_pool=True,
278 bbea0414 Christos Stavrakakis
                                                 logger=logger)
279 bbea0414 Christos Stavrakakis
280 4a71827c Christos Stavrakakis
    ips = IPAddressLog.objects.filter(address=search_query)\
281 4a71827c Christos Stavrakakis
                              .order_by("allocated_at")
282 bbea0414 Christos Stavrakakis
283 bbea0414 Christos Stavrakakis
    for ip in ips:
284 bbea0414 Christos Stavrakakis
        # Annotate IPs with the VM, Network and account attributes
285 bbea0414 Christos Stavrakakis
        ip.vm = VirtualMachine.objects.get(id=ip.server_id)
286 bbea0414 Christos Stavrakakis
        ip.network = Network.objects.get(id=ip.network_id)
287 bbea0414 Christos Stavrakakis
        userid = ip.vm.userid
288 bbea0414 Christos Stavrakakis
289 bbea0414 Christos Stavrakakis
        try:
290 bbea0414 Christos Stavrakakis
            ip.account = astakos_client.get_username(userid)
291 bbea0414 Christos Stavrakakis
        except:
292 bbea0414 Christos Stavrakakis
            ip.account = userid
293 bbea0414 Christos Stavrakakis
            logger.info("Failed to resolve '%s' into account" % userid)
294 bbea0414 Christos Stavrakakis
295 bbea0414 Christos Stavrakakis
    user_context = {
296 bbea0414 Christos Stavrakakis
        'ip_exists': bool(ips),
297 bbea0414 Christos Stavrakakis
        'ips': ips,
298 bbea0414 Christos Stavrakakis
        'search_query': search_query,
299 bbea0414 Christos Stavrakakis
        'token': auth_token,
300 bbea0414 Christos Stavrakakis
        'HELPDESK_MEDIA_URL': HELPDESK_MEDIA_URL,
301 bbea0414 Christos Stavrakakis
        'UI_MEDIA_URL': UI_MEDIA_URL
302 bbea0414 Christos Stavrakakis
    }
303 bbea0414 Christos Stavrakakis
304 bbea0414 Christos Stavrakakis
    return direct_to_template(request, "helpdesk/ip.html",
305 bbea0414 Christos Stavrakakis
                              extra_context=user_context)
306 bbea0414 Christos Stavrakakis
307 2efc2580 Christos Stavrakakis
308 9e3519e0 Kostas Papadimitriou
@helpdesk_user_required
309 605d23bf Kostas Papadimitriou
@token_check
310 cc5c8608 Kostas Papadimitriou
def vm_suspend(request, vm_id):
311 605d23bf Kostas Papadimitriou
    vm = VirtualMachine.objects.get(pk=vm_id)
312 605d23bf Kostas Papadimitriou
    vm.suspended = True
313 605d23bf Kostas Papadimitriou
    vm.save()
314 4edee820 Kostas Papadimitriou
    logging.info("VM %s suspended by %s", vm_id, request.user_uniq)
315 605d23bf Kostas Papadimitriou
    account = vm.userid
316 605d23bf Kostas Papadimitriou
    return HttpResponseRedirect(reverse('helpdesk-details', args=(account,)))
317 605d23bf Kostas Papadimitriou
318 605d23bf Kostas Papadimitriou
319 605d23bf Kostas Papadimitriou
@helpdesk_user_required
320 605d23bf Kostas Papadimitriou
@token_check
321 cc5c8608 Kostas Papadimitriou
def vm_suspend_release(request, vm_id):
322 605d23bf Kostas Papadimitriou
    vm = VirtualMachine.objects.get(pk=vm_id)
323 605d23bf Kostas Papadimitriou
    vm.suspended = False
324 605d23bf Kostas Papadimitriou
    vm.save()
325 4edee820 Kostas Papadimitriou
    logging.info("VM %s unsuspended by %s", vm_id, request.user_uniq)
326 605d23bf Kostas Papadimitriou
    account = vm.userid
327 605d23bf Kostas Papadimitriou
    return HttpResponseRedirect(reverse('helpdesk-details', args=(account,)))
328 cc5c8608 Kostas Papadimitriou
329 cc5c8608 Kostas Papadimitriou
330 cc5c8608 Kostas Papadimitriou
@helpdesk_user_required
331 cc5c8608 Kostas Papadimitriou
@token_check
332 cc5c8608 Kostas Papadimitriou
def vm_shutdown(request, vm_id):
333 cc5c8608 Kostas Papadimitriou
    logging.info("VM %s shutdown by %s", vm_id, request.user_uniq)
334 cc5c8608 Kostas Papadimitriou
    vm = VirtualMachine.objects.get(pk=vm_id)
335 cc5c8608 Kostas Papadimitriou
    account = vm.userid
336 43708a0a Kostas Papadimitriou
    error = None
337 43708a0a Kostas Papadimitriou
    try:
338 43708a0a Kostas Papadimitriou
        jobId = servers_backend.stop(vm)
339 43708a0a Kostas Papadimitriou
    except Exception, e:
340 43708a0a Kostas Papadimitriou
        error = e.message
341 43708a0a Kostas Papadimitriou
342 43708a0a Kostas Papadimitriou
    redirect = reverse('helpdesk-details', args=(account,))
343 43708a0a Kostas Papadimitriou
    if error:
344 43708a0a Kostas Papadimitriou
        redirect = "%s?error=%s" % (redirect, error)
345 43708a0a Kostas Papadimitriou
    return HttpResponseRedirect(redirect)
346 cc5c8608 Kostas Papadimitriou
347 cc5c8608 Kostas Papadimitriou
348 cc5c8608 Kostas Papadimitriou
@helpdesk_user_required
349 cc5c8608 Kostas Papadimitriou
@token_check
350 cc5c8608 Kostas Papadimitriou
def vm_start(request, vm_id):
351 cc5c8608 Kostas Papadimitriou
    logging.info("VM %s start by %s", vm_id, request.user_uniq)
352 cc5c8608 Kostas Papadimitriou
    vm = VirtualMachine.objects.get(pk=vm_id)
353 cc5c8608 Kostas Papadimitriou
    account = vm.userid
354 43708a0a Kostas Papadimitriou
    error = None
355 43708a0a Kostas Papadimitriou
    try:
356 43708a0a Kostas Papadimitriou
        jobId = servers_backend.start(vm)
357 43708a0a Kostas Papadimitriou
    except Exception, e:
358 43708a0a Kostas Papadimitriou
        error = e.message
359 43708a0a Kostas Papadimitriou
360 43708a0a Kostas Papadimitriou
    redirect = reverse('helpdesk-details', args=(account,))
361 43708a0a Kostas Papadimitriou
    if error:
362 43708a0a Kostas Papadimitriou
        redirect = "%s?error=%s" % (redirect, error)
363 43708a0a Kostas Papadimitriou
    return HttpResponseRedirect(redirect)