Esempio n. 1
0
    def get(self):
        if self.config("gauth"):
            # self_redirect_uri should be similar to  'http://<host>/hostlaunchipnb/'
            self_redirect_uri = self.request.full_url()
            idx = self_redirect_uri.index("hostlaunchipnb/")
            self_redirect_uri = self_redirect_uri[0:(idx +
                                                     len("hostlaunchipnb/"))]

            # state indicates the stage of auth during multistate auth
            state = self.get_argument('state', None)

            code = self.get_argument('code', False)
            if code is not False:
                user = yield self.get_authenticated_user(
                    redirect_uri=self_redirect_uri, code=code)

                # get user info
                http = tornado.httpclient.AsyncHTTPClient()
                auth_string = "%s %s" % (user['token_type'],
                                         user['access_token'])
                response = yield http.fetch(
                    'https://www.googleapis.com/userinfo/v2/me',
                    headers={"Authorization": auth_string})
                user_info = json.loads(response.body)

                user_id = user_info['email']

                jbuser = JBoxUserV2(user_id, create=True)
                if state == 'store_creds':
                    creds = self.make_credentials(user)
                    jbuser.set_gtok(base64.b64encode(creds.to_json()))
                    jbuser.save()
                    #self.log_info(str(user))
                    #self.log_info(creds.to_json())
                else:
                    if self.get_cookie("is_invite", "no") == "yes":
                        code, status = jbuser.get_activation_state()
                        if status != JBoxUserV2.ACTIVATION_GRANTED:
                            jbuser.set_activation_state(
                                code, JBoxUserV2.ACTIVATION_REQUESTED)
                            jbuser.save()
                        self.redirect('/?_msg=' + str(status))
                        return
                    else:
                        self.set_session_cookie(user_id)
                        if jbuser.is_new:
                            jbuser.save()
                    self.redirect('/')
                    return
            else:
                if state == 'ask_gdrive':
                    jbox_cookie = AuthHandler.get_session_cookie(self)
                    scope = ['https://www.googleapis.com/auth/drive']
                    extra_params = {
                        'approval_prompt': 'force',
                        'access_type': 'offline',
                        'login_hint': jbox_cookie['u'],
                        'include_granted_scopes': 'true',
                        'state': 'store_creds'
                    }
                else:
                    scope = ['profile', 'email']
                    extra_params = {'approval_prompt': 'auto'}

                yield self.authorize_redirect(
                    redirect_uri=self_redirect_uri,
                    client_id=self.settings['google_oauth']['key'],
                    scope=scope,
                    response_type='code',
                    extra_params=extra_params)
        else:
            sessname = unquote(self.get_argument("sessname"))
            self.set_session_cookie(sessname)
            self.redirect('/')
Esempio n. 2
0
def publish_stats():
    JBoxUserV2.calc_stats()
    JBoxUserV2.log_debug("stats: %r", JBoxUserV2.STATS)
    JBoxDynConfig.set_stat(CloudHost.INSTALL_ID, JBoxUserV2.STAT_NAME,
                           JBoxUserV2.STATS)
Esempio n. 3
0
def publish_stats():
    JBoxUserV2.calc_stats()
    JBoxDynConfig.set_stat(CloudHost.INSTALL_ID, JBoxUserV2.STAT_NAME, JBoxUserV2.STATS)
Esempio n. 4
0
    def get(self):
        sessname = unquote(self.get_cookie("sessname"))
        jbox_cookie = AuthHandler.get_session_cookie(self)

        if (None == sessname) or (len(sessname) == 0) or (None == jbox_cookie):
            self.send_error()
            return

        user_id = jbox_cookie['u']
        cont = JBoxContainer.get_by_name(sessname)

        if cont is None:
            self.send_error()
            return

        juliaboxver, upgrade_available = self.get_upgrade_available(cont)
        if self.do_upgrade(cont, upgrade_available):
            response = {'code': 0, 'data': ''}
            self.write(response)
            return

        user = JBoxUserV2(user_id)

        is_admin = sessname in self.config("admin_sessnames", [])
        manage_containers = is_admin or user.has_role(
            JBoxUserV2.ROLE_MANAGE_CONTAINERS)
        show_report = is_admin or user.has_role(JBoxUserV2.ROLE_ACCESS_STATS)
        invites_perm = is_admin or user.has_role(
            JBoxUserV2.ROLE_MANAGE_INVITES)

        sections = []
        loads = []
        report = {}
        report_span = 'day'
        invites_info = []

        action = self.get_argument("action", None)
        #invite_code = self.request.get("invite_code", None)
        if action == "invites_report" and invites_perm:
            self.write(
                dict(code=0, data=[obj for obj in JBoxInvite.table().scan()]))
            return

        if manage_containers:
            sections, loads = self.do_containers()

        if show_report:
            today = datetime.now()
            if self.get_argument('range', 'day') == 'week':
                dates = [today - timedelta(days=i) for i in range(6, -1, -1)]
                report_span = 'week'
            else:
                dates = [today]
            report = JBoxAccountingV2.get_stats(dates)

        d = dict(manage_containers=manage_containers,
                 show_report=show_report,
                 invites_perm=invites_perm,
                 report_span=report_span,
                 sessname=sessname,
                 user_id=user_id,
                 created=isodate.datetime_isoformat(cont.time_created()),
                 started=isodate.datetime_isoformat(cont.time_started()),
                 allowed_till=isodate.datetime_isoformat(
                     (cont.time_started() +
                      timedelta(seconds=self.config('expire')))),
                 mem=cont.get_memory_allocated(),
                 cpu=cont.get_cpu_allocated(),
                 disk=cont.get_disk_allocated(),
                 expire=self.config('expire'),
                 sections=sections,
                 loads=loads,
                 report=report,
                 juliaboxver=juliaboxver,
                 upgrade_available=upgrade_available)

        self.rendertpl("ipnbadmin.tpl", d=d, cfg=self.config())
Esempio n. 5
0
    def do_monitor_loading(self, user_id):
        sessname = unique_sessname(user_id)
        self.log_debug("Monitoring loading of session [%s] user[%s]...",
                       sessname, user_id)
        cont = JBoxContainer.get_by_name(sessname)
        if (cont is None) or (not cont.is_running()):
            loading_step = int(self.get_cookie("loading", 0))
            if loading_step > 30:
                self.log_error(
                    "Could not start instance. Session [%s] for user [%s] didn't load.",
                    sessname, user_id)
                self.clear_container_cookies()
                self.rendertpl(
                    "index.tpl",
                    cfg=self.config(),
                    state=self.state(
                        error=
                        'Could not start your instance! Please try again.',
                        pending_activation=False,
                        user_id=user_id))
                return
            else:
                loading_step += 1

            self.set_cookie("loading", str(loading_step))
            self.rendertpl("loading.tpl", user_id=user_id)
        else:
            if self.config("gauth"):
                jbuser = JBoxUserV2(user_id)
                creds = jbuser.get_gtok()
                if creds is not None:
                    try:
                        creds_json = json.loads(base64.b64decode(creds))
                        creds_json = self.renew_creds(creds_json)
                        authtok = creds_json['access_token']
                    except:
                        self.log_warn(
                            "stale stored creds. will renew on next use. user: "******"sesskey"))

            self.clear_cookie("loading")
            self.set_container_cookies({
                "sessname": sessname,
                "hostshell": shellport,
                "hostupload": uplport,
                "hostipnb": ipnbport,
                "sign": sign
            })
            self.set_lb_tracker_cookie()
            self.rendertpl("ipnbsess.tpl",
                           sessname=sessname,
                           cfg=self.config(),
                           creds=creds,
                           authtok=authtok,
                           user_id=user_id)
Esempio n. 6
0
    def get(self):
        jbox_cookie = AuthHandler.get_session_cookie(self)

        if self.config("invite_only"):
            if self.get_argument("invite", False):
                self.set_cookie("is_invite", "yes")
                self.redirect('/hostlaunchipnb/')
                return

        if None == jbox_cookie:
            which_msg = int(
                self.get_argument("_msg", JBoxUserV2.ACTIVATION_NONE))
            if self.get_argument("_msg", "") != "":
                self.clear_cookie("is_invite")
                if which_msg == JBoxUserV2.ACTIVATION_GRANTED:
                    msg = "Your account has already been approved"
                elif which_msg == JBoxUserV2.ACTIVATION_REQUESTED:
                    msg = "You have already registered for an invite"
                else:
                    msg = "Thank you for your interest! We will get back to you with an invitation soon."
                state = self.state(success=msg)
            else:
                state = self.state()
            self.rendertpl("index.tpl", cfg=self.config(), state=state)
        else:
            user_id = jbox_cookie['u']
            sessname = esc_sessname(user_id)

            if self.config("gauth"):
                try:
                    jbuser = JBoxUserV2(user_id)
                except:
                    # stale cookie. we don't have the user in our database anymore
                    self.log_info(
                        "stale cookie. we don't have the user in our database anymore. user: "******"invite_only"):
                    code, status = jbuser.get_activation_state()
                    if status != JBoxUserV2.ACTIVATION_GRANTED:
                        invite_code = self.get_argument("invite_code", False)
                        if invite_code is not False:
                            try:
                                invite = JBoxInvite(invite_code)
                            except:
                                invite = None

                            if (invite is not None
                                ) and invite.is_invited(user_id):
                                jbuser.set_activation_state(
                                    invite_code, JBoxUserV2.ACTIVATION_GRANTED)
                                jbuser.save()
                                self.redirect('/hostlaunchipnb/')
                                return
                            else:
                                error_msg = 'You entered an invalid invitation code. Try again or request a new invitation.'
                        else:
                            error_msg = 'Enter the invitation code'

                        self.rendertpl("index.tpl",
                                       cfg=self.config(),
                                       state=self.state(error=error_msg,
                                                        ask_invite_code=True,
                                                        user_id=user_id))
                        return

                creds = jbuser.get_gtok()
                if creds is not None:
                    try:
                        creds_json = json.loads(base64.b64decode(creds))
                        creds_json = self.renew_creds(creds_json)
                        authtok = creds_json['access_token']
                    except:
                        self.log_info(
                            "stale stored creds. will renew on next use. user: "
                            + user_id)
                        creds = None
                        authtok = None
                else:
                    authtok = None
            else:
                creds = None
                authtok = None

            self.chk_and_launch_docker(sessname, creds, authtok, user_id)
Esempio n. 7
0
    def get(self):
        sessname = unquote(self.get_cookie("sessname"))
        jbox_cookie = AuthHandler.get_session_cookie(self)

        if (None == sessname) or (len(sessname) == 0) or (None == jbox_cookie):
            self.send_error()
            return

        user_id = jbox_cookie['u']
        cont = JBoxContainer.get_by_name(sessname)

        if cont is None:
            self.send_error()
            return

        juliaboxver, upgrade_available = self.get_upgrade_available(cont)
        if self.do_upgrade(cont, upgrade_available):
            response = {'code': 0, 'data': ''}
            self.write(response)
            return

        user = JBoxUserV2(user_id)
        show_report = (sessname in self.config("report_sessnames", [])
                       or user.get_role() == JBoxUserV2.ROLE_REPORT)

        admin_user = (sessname in self.config("admin_sessnames", [])
                      or user.get_role() == JBoxUserV2.ROLE_ADMIN)
        show_report = show_report or admin_user

        sections = []
        loads = []
        report = {}
        report_span = 'day'

        if admin_user:
            sections, loads = self.admin_stats()

        if show_report:
            today = datetime.now()
            if self.get_argument('range', 'day') == 'week':
                dates = [today - timedelta(days=i) for i in range(6, -1, -1)]
                report_span = 'week'
            else:
                dates = [today]
            report = JBoxAccountingV2.get_stats(dates)

        d = dict(admin_user=admin_user,
                 show_report=show_report,
                 report_span=report_span,
                 sessname=sessname,
                 user_id=user_id,
                 created=isodate.datetime_isoformat(cont.time_created()),
                 started=isodate.datetime_isoformat(cont.time_started()),
                 allowed_till=isodate.datetime_isoformat(
                     (cont.time_started() +
                      timedelta(seconds=self.config('expire')))),
                 mem=cont.get_memory_allocated(),
                 cpu=cont.get_cpu_allocated(),
                 disk=cont.get_disk_allocated(),
                 expire=self.config('expire'),
                 sections=sections,
                 loads=loads,
                 report=report,
                 juliaboxver=juliaboxver,
                 upgrade_available=upgrade_available)

        self.rendertpl("ipnbadmin.tpl", d=d, cfg=self.config())