Beispiel #1
0
    def get(self):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # look up usrs
        users = User.get_all()

        params = {'users': users}

        return self.render_template('admin/users.html', **params)
Beispiel #2
0
	def get(self):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# look up usrs
		users = User.get_all()

		params = {
			'users': users
		}

		return self.render_template('admin/users.html', **params)
Beispiel #3
0
    def get(self):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # look up usrs
        users = User.get_all()

        params = {'users': users}

        # mime it up
        self.response.headers['Content-Type'] = "text/csv"
        self.response.headers[
            'Content-Disposition'] = "attachment; filename=users.csv"
        return self.render_template('admin/user.csv', **params)
Beispiel #4
0
	def get(self):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# look up usrs
		users = User.get_all()

		params = {
			'users': users
		}

		# mime it up
		self.response.headers['Content-Type'] = "text/csv"
		self.response.headers['Content-Disposition'] = "attachment; filename=users.csv"
		return self.render_template('admin/user.csv', **params)
Beispiel #5
0
	def get(self):
		# load user information
		user_info = User.get_by_id(long(self.user_id))

		# form fields
		self.form.username.data = user_info.username
		self.form.name.data = user_info.name
		self.form.email.data = user_info.email
		self.form.company.data = user_info.company
		self.form.country.data = user_info.country
		self.form.timezone.data = user_info.timezone
	
		# extras
		params = {}
		params['tfenabled'] = user_info.tfenabled

		# create holder token to setup 2FA - this will continue until user enables 2fa
		if user_info.tfenabled == False:
			secret = pyotp.random_base32()
			totp = pyotp.TOTP(secret)
			qrcode = totp.provisioning_uri("%s-%s" % (config.app_name, user_info.email))
			params['qrcode'] = qrcode
			params['secret'] = secret
			
			# update the user's key
			user_info.tfsecret = secret
			user_info.put()

			# tell the user they need to setup 2fa
			self.add_message("Please take a moment and set up two factor authentication.", "error")

		return self.render_template('user/settings.html', **params)
Beispiel #6
0
    def get(self):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # load token and produce form page or show instructions
        if self.request.get('token'):
            self.form.token.data = self.request.get('token')

            # group choices pulldown
            self.form.group.choices = []

            # add list of user's groups, if any
            groups = GroupMembers.get_user_groups(user_info.key)
            for group in groups:
                self.form.group.choices.insert(0, (group.key.id(), group.name))

            # public group
            self.form.group.choices.insert(0, ('public', "Public"))

            # render new appliance page
            parms = {
                'gform': self.gform,
                'appliance_token': self.request.get('token')
            }
            return self.render_template('appliance/new.html', **parms)

        else:
            # render instructions
            return self.render_template('appliance/instructions.html')
Beispiel #7
0
	def get(self):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# look up user's groups
		groups = GroupMembers.get_user_groups(user_info.key)

		# create an object with group_id and member counts
		group_count = {}
		for group in groups:
			# get the member counts
			count = GroupMembers.get_group_user_count(group.key)
			group_count[group.key.id()] = count

		# setup channel to do page refresh
		channel_token = user_info.key.urlsafe()
		refresh_channel = channel.create_channel(channel_token)

		# params build out
		params = {
			'groups': groups,
			'group_count': group_count,
			'refresh_channel': refresh_channel,
			'channel_token': channel_token 
		}

		return self.render_template('groups/list.html', **params)
Beispiel #8
0
    def get(self):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # look up user's groups
        groups = GroupMembers.get_user_groups(user_info.key)

        # create an object with group_id and member counts
        group_count = {}
        for group in groups:
            # get the member counts
            count = GroupMembers.get_group_user_count(group.key)
            group_count[group.key.id()] = count

        # setup channel to do page refresh
        channel_token = user_info.key.urlsafe()
        refresh_channel = channel.create_channel(channel_token)

        # params build out
        params = {
            'groups': groups,
            'group_count': group_count,
            'refresh_channel': refresh_channel,
            'channel_token': channel_token
        }

        return self.render_template('groups/groups.html', **params)
Beispiel #9
0
	def get(self, cloud_id = None):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))
		
		# get the cloud in question
		cloud = Cloud.get_by_id(long(cloud_id))

		# bail if cloud doesn't exist or not owned by this user
		if not cloud or cloud.owner != user_info.key:
			return self.redirect_to('account-clouds')

		# look up cloud's instances
		instances = Instance.get_by_cloud(cloud.key)

		# setup channel to do page refresh
		channel_token = user_info.key.urlsafe()
		refresh_channel = channel.create_channel(channel_token)

		# params build out
		params = {
			'cloud': cloud,
			'instances': instances, 
			'refresh_channel': refresh_channel,
			'channel_token': channel_token 
		}

		return self.render_template('cloud/edit.html', **params)
Beispiel #10
0
	def post(self, cloud_id = None):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))
		
		# load the cloud in question
		cloud = Cloud.get_by_id(long(cloud_id))
		
		# bail if cloud doesn't exist or not owned by this user
		if not cloud or cloud.owner != user_info.key:
			return self.redirect_to('account-clouds')
		
		# check what was returned from form validates
		if not self.form.validate():          
			self.add_message("The %s cloud was not updated." % cloud.name, "info")
			return self.redirect_to('account-clouds')

		# load form values
		name = self.form.name.data.strip()
		description = self.form.description.data.strip()

		# save the new cloud in our database            
		cloud.name = name
		cloud.description = description
		cloud.put()

		# log to alert
		self.add_message("Cloud %s updated!" % name, "success")

		# give it a few seconds to update db, then redirect
		time.sleep(1)
		
		return self.redirect_to('account-clouds')
Beispiel #11
0
    def get(self, appliance_id=None):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # lookup the appliance
        appliance = Appliance.get_by_id(long(appliance_id))

        # group choices pulldown
        self.form.group.choices = []

        # add list of user's groups, if any
        groups = GroupMembers.get_user_groups(user_info.key)
        for group in groups:
            self.form.group.choices.insert(0, (group.key.id(), group.name))

            # public group
        self.form.group.choices.insert(0, ("public", "Public"))

        self.form.name.data = appliance.name
        self.form.token.data = appliance.token

        # hacking the form pulldown with javascript because I'm in a hurry
        if appliance.group:
            group_id = appliance.group.get().key.id()
        else:
            group_id = "public"

            # this should work, but doesn't - see javascript in appliance_edit.html
        self.form.group.data = group_id

        # render new appliance page
        parms = {"appliance": appliance, "group_id": group_id, "gform": self.gform}
        return self.render_template("appliance/edit.html", **parms)
	def get(self):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# setup channel to do page refresh
		channel_token = user_info.key.urlsafe()
		refresh_channel = channel.create_channel(channel_token)

		# load projects pulldown
		self.form.project.choices = []

		# public + private
		projects = Project.get_available(user_info.key)
		for project in projects:
			self.form.project.choices.insert(0, (str(project.key.id()), project.name))

		# insert images into list for wisp
		self.form.image.choices=[('custom', "Dynamic Image URL")]
		images = Image.get_all()
		for image in images:
			self.form.image.choices.insert(0, (str(image.key.id()), image.description))

		# params build out
		params = {
			'refresh_channel': refresh_channel,
			'channel_token': channel_token 
		}

		return self.render_template('wisp/new.html', **params)
Beispiel #13
0
	def delete(self, cloud_id = None):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))
		
		# pull the entry from the db
		cloud = Cloud.get_by_id(long(cloud_id))

		# check the number of instances
		count = Instance.get_count_by_cloud(cloud.key)

		# deny if it has instances
		if count > 0:
			self.add_message('You may not delete a cloud with instances!', 'info')

		# if we found it and own it, delete
		elif cloud and cloud.owner == user_info.key:
			cloud.key.delete()
			self.add_message('Cloud successfully deleted!', 'success')
		else:
			self.add_message('Cloud was not deleted.  Something went horribly wrong somewhere!', 'warning')

		# hangout for a second
		time.sleep(1)

		# use the channel to tell the browser we are done and reload
		channel_token = self.request.get('channel_token')
		channel.send_message(channel_token, 'reload')
		return
Beispiel #14
0
	def get(self):
		# get the authcode and desired action
		authcode = self.request.get('authcode')
		action = self.request.get('action')

		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))
		secret = user_info.tfsecret
		totp = pyotp.TOTP(secret)
		
		# build paramater list
		params = {}
		
		# verify
		if action == "enable" and totp.verify(authcode):
			# authorized to enable
			user_info.tfenabled = True
			user_info.put()
		elif action == "disable" and totp.verify(authcode):
			# authorized to disable
			user_info.tfenabled = False
			user_info.put()
		else:
			# not authorized - javascript will handle adding a user message to the UI
			params['response'] = "error"
			params['result'] = "two factor auth failed"
			self.response.set_status(401)
			self.response.headers['Content-Type'] = 'application/json'
			return self.render_template('api/response.json', **params)

		# respond
		params['response'] = "success"
		params['result'] = "two factor auth successful"
		self.response.headers['Content-Type'] = "application/json"
		return self.render_template('api/response.json', **params)
Beispiel #15
0
    def get(self):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # look up instances, then patch them for hotstart support
        pinstances = []
        instances = Instance.get_all()
        for instance in instances:
            try:
                username_patch = instance.user.get().username
            except:
                username_patch = "#HOTSTART#"  # no self

            pinstance = {
                "name": instance.name,
                "status": instance.status,
                "username_patch": username_patch,
                "created": instance.created,
                "expires": instance.expires,
                "key": instance.key
            }
            pinstances.append(pinstance)

        params = {'instances': pinstances}

        return self.render_template('admin/instances.html', **params)
Beispiel #16
0
    def get(self, cloud_id=None):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # get the cloud in question
        cloud = Cloud.get_by_id(long(cloud_id))

        # bail if cloud doesn't exist or not owned by this user
        if not cloud or cloud.owner != user_info.key:
            return self.redirect_to('account-clouds')

        # look up cloud's instances
        instances = Instance.get_by_cloud(cloud.key)

        # setup channel to do page refresh
        channel_token = user_info.key.urlsafe()
        refresh_channel = channel.create_channel(channel_token)

        # params build out
        params = {
            'cloud': cloud,
            'instances': instances,
            'refresh_channel': refresh_channel,
            'channel_token': channel_token
        }

        return self.render_template('cloud/edit.html', **params)
    def get(self):
        # get the authcode and desired action
        authcode = self.request.get('authcode')
        action = self.request.get('action')

        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))
        secret = user_info.tfsecret
        totp = pyotp.TOTP(secret)

        # build paramater list
        params = {}

        # verify
        if action == "enable" and totp.verify(authcode):
            # authorized to enable
            user_info.tfenabled = True
            user_info.put()
        elif action == "disable" and totp.verify(authcode):
            # authorized to disable
            user_info.tfenabled = False
            user_info.put()
        else:
            # not authorized - javascript will handle adding a user message to the UI
            params['response'] = "error"
            params['result'] = "two factor auth failed"
            self.response.set_status(401)
            self.response.headers['Content-Type'] = 'application/json'
            return self.render_template('api/response.json', **params)

        # respond
        params['response'] = "success"
        params['result'] = "two factor auth successful"
        self.response.headers['Content-Type'] = "application/json"
        return self.render_template('api/response.json', **params)
Beispiel #18
0
    def get(self, name=None):
        # check token
        token = self.request.get('token')
        if token != "":
            user_info = User.get_by_token(token)

            if user_info:
                db_instances = Instance.get_all()

                # work around index warning/errors using a .filter() in models.py
                instances = []
                for db_instance in db_instances:
                    # limit to instances the user has started
                    if db_instance.user == user_info.key:
                        instances.append(db_instance)
                params = {
                    'user_name': user_info.username,
                    'instances': instances
                }

                self.response.headers['Content-Type'] = "application/json"
                return self.render_template('api/instances.json', **params)

        # no token, no user, no data
        params = {
            "response": "fail",
            "message": "must include [token] parameter with a valid token"
        }

        self.response.status = '402 Payment Required'
        self.response.status_int = 402
        self.response.headers['Content-Type'] = "application/json"
        return self.render_template('api/response.json', **params)
Beispiel #19
0
	def post(self):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# load form values
		name = self.form.name.data.strip()
		description = self.form.description.data.strip()

		# check if we have it already
		if Cloud.get_by_user_name(user_info.key, name):
			self.add_message("A cloud with that name already exists!", "error")
			return self.redirect_to('account-clouds')

		# check what was returned from form validates
		if not self.form.validate():          
			self.add_message("The new cloud form did not validate.", "error")
			return self.get()

		cloud = Cloud(
			name = name,
			description = description,
			owner = user_info.key
		)
		cloud.put()

		# log to alert
		self.add_message("Cloud %s successfully created!" % name, "success")

		# give it a few seconds to update db, then redirect
		time.sleep(1)
		return self.redirect_to('account-clouds-configure', cloud_id = cloud.key.id())
	def delete(self, wisp_id = None):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))
		
		# pull the entry from the db
		wisp = Wisp.get_by_id(long(wisp_id))

		# if we found it and own it, delete
		if wisp and wisp.owner == user_info.key:
			# delete any associated bids, if they exist
			InstanceBid.delete_by_wisp(wisp.key)

			# delete the wisp
			wisp.key.delete()

			self.add_message('Wisp successfully deleted!', 'success')
		else:
			self.add_message('Wisp was not deleted.  Something went horribly wrong somewhere!', 'warning')

		# hangout for a second
		time.sleep(1)

		# setup channel to do page refresh
		channel_token = user_info.key.urlsafe()
		refresh_channel = channel.create_channel(channel_token)
		channel.send_message(channel_token, 'reload')

		return
Beispiel #21
0
    def get(self):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # load token and produce form page or show instructions
        if self.request.get("token"):
            self.form.token.data = self.request.get("token")

            # group choices pulldown
            self.form.group.choices = []

            # add list of user's groups, if any
            groups = GroupMembers.get_user_groups(user_info.key)
            for group in groups:
                self.form.group.choices.insert(0, (group.key.id(), group.name))

                # public group
            self.form.group.choices.insert(0, ("public", "Public"))

            # render new appliance page
            parms = {"gform": self.gform, "appliance_token": self.request.get("token")}
            return self.render_template("appliance/new.html", **parms)

        else:
            # render instructions
            return self.render_template("appliance/instructions.html")
Beispiel #22
0
    def post(self, cloud_id=None):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # load the cloud in question
        cloud = Cloud.get_by_id(long(cloud_id))

        # bail if cloud doesn't exist or not owned by this user
        if not cloud or cloud.owner != user_info.key:
            return self.redirect_to('account-clouds')

        # check what was returned from form validates
        if not self.form.validate():
            self.add_message("The %s cloud was not updated." % cloud.name,
                             "info")
            return self.redirect_to('account-clouds')

        # load form values
        name = self.form.name.data.strip()
        description = self.form.description.data.strip()

        # save the new cloud in our database
        cloud.name = name
        cloud.description = description
        cloud.put()

        # log to alert
        self.add_message("Cloud %s updated!" % name, "success")

        # give it a few seconds to update db, then redirect
        time.sleep(1)

        return self.redirect_to('account-clouds')
    def get(self):
        # load user information
        user_info = User.get_by_id(long(self.user_id))

        # form fields
        self.form.username.data = user_info.username
        self.form.name.data = user_info.name
        self.form.email.data = user_info.email
        self.form.company.data = user_info.company
        self.form.country.data = user_info.country
        self.form.timezone.data = user_info.timezone

        # extras
        params = {}
        params['tfenabled'] = user_info.tfenabled

        # create holder token to setup 2FA - this will continue until user enables 2fa
        if user_info.tfenabled == False:
            secret = pyotp.random_base32()
            totp = pyotp.TOTP(secret)
            qrcode = totp.provisioning_uri("%s-%s" %
                                           (config.app_name, user_info.email))
            params['qrcode'] = qrcode
            params['secret'] = secret

            # update the user's key
            user_info.tfsecret = secret
            user_info.put()

            # tell the user they need to setup 2fa
            self.add_message(
                "Please take a moment and set up two factor authentication.",
                "error")

        return self.render_template('user/settings.html', **params)
Beispiel #24
0
    def delete(self, cloud_id=None):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # pull the entry from the db
        cloud = Cloud.get_by_id(long(cloud_id))

        # check the number of instances
        count = Instance.get_count_by_cloud(cloud.key)

        # deny if it has instances
        if count > 0:
            self.add_message('You may not delete a cloud with instances!',
                             'info')

        # if we found it and own it, delete
        elif cloud and cloud.owner == user_info.key:
            cloud.key.delete()
            self.add_message('Cloud successfully deleted!', 'success')
        else:
            self.add_message(
                'Cloud was not deleted.  Something went horribly wrong somewhere!',
                'warning')

        # hangout for a second
        time.sleep(1)

        # use the channel to tell the browser we are done and reload
        channel_token = self.request.get('channel_token')
        channel.send_message(channel_token, 'reload')
        return
Beispiel #25
0
    def get(self, name):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # look up user's instances
        instance = Instance.get_by_name(name)

        self.response.headers['Content-Type'] = "text/plain"

        if not instance:
            params = {"contents": "Waiting on serial console output..."}
            return self.render_template('instance/console.txt', **params)

        try:
            # update list of instances we have
            http = httplib2.Http()
            url = '%s/api/instance/%s/console?token=%s' % (
                config.fastener_host_url, name, config.fastener_api_token)
            response, content = http.request(url, 'GET')
            stuff = json.loads(content)

            params = {"contents": stuff['contents']}
        except Exception as ex:
            params = {"contents": "Waiting on serial console output..."}

        return self.render_template('instance/console.txt', **params)
Beispiel #26
0
    def post(self):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # load form values
        name = self.form.name.data.strip()
        description = self.form.description.data.strip()

        # check if we have it already
        if Cloud.get_by_user_name(user_info.key, name):
            self.add_message("A cloud with that name already exists!", "error")
            return self.redirect_to('account-clouds')

        # check what was returned from form validates
        if not self.form.validate():
            self.add_message("The new cloud form did not validate.", "error")
            return self.get()

        cloud = Cloud(name=name, description=description, owner=user_info.key)
        cloud.put()

        # log to alert
        self.add_message("Cloud %s successfully created!" % name, "success")

        # give it a few seconds to update db, then redirect
        time.sleep(1)
        return self.redirect_to('account-clouds-configure',
                                cloud_id=cloud.key.id())
Beispiel #27
0
	def get(self):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# setup channel to do page refresh
		channel_token = user_info.key.urlsafe()
		refresh_channel = channel.create_channel(channel_token)

		# check for url param or referer
		url = ""
		if 'url' in self.request.GET:
			url = urllib2.unquote(self.request.GET['url'])

		# if we have a URL, we deal with it
		if url:
			project = Project.get_by_url(url)
			if not project:
				# create a new project for this user
				self.form.url.data = url
				return self.post()
			else:
				# go to the existing project
				return self.redirect_to('account-projects-detail', project_id = project.key.id())

		# params build out
		params = {
			'refresh_channel': refresh_channel,
			'channel_token': channel_token 
		}

		return self.render_template('project/new.html', **params)
Beispiel #28
0
	def delete(self, project_id = None):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))
		
		# pull the entry from the db
		project = Project.get_by_id(long(project_id))

		# if we found it and own it
		if project and project.owner == user_info.key:
			# patch all wisps using project to stock
			Wisp.patch_to_stock(project.key)

			# delete the project
			project.key.delete()

			self.add_message('Project successfully deleted!', 'success')
		else:
			self.add_message('Project was not deleted.  Something went horribly wrong somewhere!', 'warning')

		# hangout for a second
		time.sleep(1)

		# use the channel to tell the browser we are done and reload
		channel_token = self.request.get('channel_token')
		channel.send_message(channel_token, 'reload')
		return
Beispiel #29
0
	def get(self):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# look up wisps
		wisps = Wisp.get_by_user(user_info.key)

		# redirect if we don't have any wisps
		if not wisps:
			return self.redirect_to('account-wisps-new')

		# setup channel to do page refresh
		channel_token = user_info.key.urlsafe()
		refresh_channel = channel.create_channel(channel_token)

		# params build out
		params = {
			'wisps': wisps, 
			'refresh_channel': refresh_channel,
			'channel_token': channel_token 
		}

		# check for default
		default = False
		for wisp in wisps:
			if wisp.default:
				default = True
		if not default:
			print "wtf"
			self.add_message("Please set a wisp to be default!", "error")

		return self.render_template('wisp/wisps.html', **params)
Beispiel #30
0
    def get(self, name=None):
        # check token
        token = self.request.get('token')
        if token != "":
            user_info = User.get_by_token(token)

            if user_info:
                instance = Instance.get_by_name(name)

                try:
                    if instance.user == user_info.key:

                        # make the instance call to the control box
                        http = httplib2.Http(timeout=10)
                        url = '%s/api/instance/%s/start?token=%s' % (
                            config.fastener_host_url, name,
                            config.fastener_api_token)

                        # pull the response back TODO add error handling
                        response, content = http.request(url,
                                                         'GET',
                                                         None,
                                                         headers={})

                        # update if google returns pending
                        if json.loads(content)['status'] == "PENDING":
                            instance.status = "STAGING"
                            instance.started = datetime.datetime.now()
                            instance.put()

                        params = {'instance': instance}

                        self.response.headers[
                            'Content-Type'] = "application/json"
                        return self.render_template('api/instance.json',
                                                    **params)

                except Exception as ex:
                    print "error %s" % ex
                    print "instance %s not found or not in TERMINATED state" % name

                params = {
                    "response":
                    "fail",
                    "message":
                    "[token] read access denied or instance not TERMINATED"
                }
                return self.render_template('api/response.json', **params)

        # no token, no user, no data
        params = {
            "response": "fail",
            "message": "must include [token] parameter with a valid token"
        }

        self.response.status = '402 Payment Required'
        self.response.status_int = 402
        self.response.headers['Content-Type'] = "application/json"
        return self.render_template('api/response.json', **params)
Beispiel #31
0
    def get(self):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # load token and produce form page or show instructions
        if self.request.get('token'):
            invite_token = self.request.get('token')
        else:
            self.add_message("Invite key not found.", "info")
            return self.redirect_to('account-groups')

        # lookup the invite
        invite = GroupMembers.get_by_token(invite_token)

        if not invite:
            # log to alert
            self.add_message("Invite key not found.", "info")
            return self.redirect_to('account-groups')

        # check if the user is already a member of the group
        entry = GroupMembers.get_by_userid_groupid(user_info.key,
                                                   invite.group.get().key)

        if entry:
            # log to alert
            self.add_message("You are already a member of this group!", "info")
        else:
            # modify the invite to place this user in the member group
            invite.token = None
            invite.active = True
            invite.member = user_info.key
            invite.updated = datetime.now()
            invite.put()

            # log to alert
            self.add_message("Welcome to the group!", "success")

        # give it a few seconds to update db, then redirect
        time.sleep(1)

        return self.redirect_to('account-groups-configure',
                                group_id=invite.group.get().key.id())


# hello you.
# why no tests?  because I am alone.
# f**k tests then.
# time is short.
# life is shorter.
# but.
# time passed.
# you are here now.
# because insane funding.
# come to my office.
# i may be taking a nap.
# but.
# i'm going to give you $5K for finding this.
# there is always a catch, isn't there?
# going make you write tests tomorrow!
Beispiel #32
0
    def delete(self, group_id=None):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # find the the entry
        group = Group.get_by_id(long(group_id))

        # this member's membership
        membership = GroupMembers.get_by_userid_groupid(
            user_info.key, group.key)

        # list of users that have the group enabled
        members = GroupMembers.get_group_users(group.key)

        # remove this user's membership
        membership.key.delete()

        # if this user is not the group owner, we simply notify we are done
        if not group or group.owner != user_info.key:
            # use the channel to tell the browser we are done and reload
            self.add_message('Group was removed from account.', 'success')
            channel_token = self.request.get('channel_token')
            channel.send_message(channel_token, 'reload')
            return

        # was there more than just this member?
        if len(members) > 1:
            # find the next user by date and assign them as owner
            entry = GroupMembers.get_new_owner(user_info.key, group.key)
            print "new owner is %s" % entry.member
            new_owner = entry.member
            group.owner = new_owner
            group.put()

            # find member's appliances that match this group and remove
            appliances = Appliance.get_by_user_group(user_info.key, group.key)
            for appliance in appliances:
                appliance.group = None  # public group
                appliance.put()

        else:
            # no more members, so delete the group
            group.key.delete()
            self.add_message('Group successfully deleted!', 'success')

            # remove group from any and all appliances (heavy handed)
            appliances = Appliance.get_by_group(group.key)
            for appliance in appliances:
                appliance.group = None  # public group
                appliance.put()

        # hangout for a second
        time.sleep(1)

        # use the channel to tell the browser we are done and reload
        channel_token = self.request.get('channel_token')
        channel.send_message(channel_token, 'reload')
        return
Beispiel #33
0
	def delete(self, group_id = None):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# find the the entry
		group = Group.get_by_id(long(group_id))

		# this member's membership
		membership = GroupMembers.get_by_userid_groupid(user_info.key, group.key)

		# list of users that have the group enabled
		members = GroupMembers.get_group_users(group.key)

		# remove this user's membership
		membership.key.delete()
		
		# if this user is not the group owner, we simply notify we are done
		if not group or group.owner != user_info.key:
			# use the channel to tell the browser we are done and reload
			self.add_message('Group was removed from account.', 'success')
			channel_token = self.request.get('channel_token')
			channel.send_message(channel_token, 'reload')
			return

		# was there more than just this member?
		if len(members) > 1:
			# find the next user by date and assign them as owner
			entry = GroupMembers.get_new_owner(user_info.key, group.key)
			print "new owner is %s" % entry.member
			new_owner = entry.member
			group.owner = new_owner
			group.put()
		
			# find member's appliances that match this group and remove
			appliances = Appliance.get_by_user_group(user_info.key, group.key)
			for appliance in appliances:
				appliance.group = None # public group
				appliance.put()
		
		else:
			# no more members, so delete the group
			group.key.delete()
			self.add_message('Group successfully deleted!', 'success')

			# remove group from any and all appliances (heavy handed)
			appliances = Appliance.get_by_group(group.key)
			for appliance in appliances:
				appliance.group = None # public group
				appliance.put()

		# hangout for a second
		time.sleep(1)

		# use the channel to tell the browser we are done and reload
		channel_token = self.request.get('channel_token')
		channel.send_message(channel_token, 'reload')
		return
Beispiel #34
0
    def get(self, sid=None):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # look up streams
        streams = Stream.get_all()

        params = {'streams': streams}

        return self.render_template('admin/streams.html', **params)
Beispiel #35
0
	def post(self):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# check what was returned from form validates     
		if not self.form.validate():
			for key, value in self.form.errors.iteritems():
				self.add_message("Fix the %s. %s" % (key, value[0]), "error")
			return self.get()

		# load form values
		url = self.form.url.data.strip()
		
		# check if we have it already
		if Project.get_by_url(url):
			self.add_message("A project with that URL already exists.", "error")
			return self.redirect_to('account-projects')		

		# get the basic repo data
		response = github.repo_base(url)
		if response['response'] == 'success':
			repo = response['result']['repo']
		else:
			repo = None
			self.add_message(response['result']['message'], 'error')
			return self.redirect_to('projects')

		# save the new project in our database
		project = Project()           
		project.url = url.lower().strip('/')
		project.name = repo['name'] # this one is editable later
		project.repo_name = repo['name'] # this one is not
		project.address = None
		project.amount = 0
		project.description = repo['description']
		project.owner = user_info.key
		project.public = False
		project.port = 80
		project.put()

		# give it a second
		time.sleep(1)

		# check if the repo has the utterio directory
		response = project.sync()

		# log to alert
		if response['response'] == "success":
			self.add_message("Project %s successfully added!" % project.name, "success")
		else:
			self.add_message("%s" % response['result']['message'], "fail")

		# redirect
		return self.redirect_to('account-projects-detail', project_id = project.key.id())
Beispiel #36
0
    def get(self):
        if self.user:
            user_info = User.get_by_id(long(self.user_id))

            # if 2fa enabled, set the last login to an hour ago
            if user_info.tfenabled:
                user_info.last_login = datetime.now() + timedelta(
                    0, -config.session_age)
                user_info.put()

        self.auth.unset_session()
        self.redirect('https://lucidworks.com/labs')
Beispiel #37
0
    def get(self, sid=None):
        try:
            user_info = User.get_by_id(long(self.user_id))
            if user_info:
                self.redirect_to('streams-start3', sid=sid)
            else:
                raise Exception('No user.')
        except:
            pass

        params = {'dialog': True}
        return self.render_template('user/dashboard.html', **params)
	def get(self):
		# basics
		ip = self.request.remote_addr

		# setup channel to do page refresh
		channel_token = generate_token()
		refresh_channel = channel.create_channel(channel_token)

		# various pulldown initialization
		self.form.flavor.choices=[]
		self.form.wisp.choices=[]
		self.form.cloud.choices=[]

		# add list of user's flavors, if any
		flavors = Flavor.flavors_with_instances_on_sale()
		for flavor in flavors:
			self.form.flavor.choices.insert(0, (flavor.name, flavor.description))

		# used for determining element layout
		wisp = None
		cloud = None

		# if the user is logged in, we build out the list of their wisps
		if self.user_id:
			# lookup user's auth info and wisps
			user_info = User.get_by_id(long(self.user_id))
			wisps = Wisp.get_by_user(user_info.key)
			for wisp in wisps:
				self.form.wisp.choices.insert(0, (wisp.key.id(), wisp.name))
		
			# load clouds
			clouds = Cloud.get_by_user(user_info.key)

			# create default cloud if none
			if not clouds:
				cloud = Cloud.create_default(user_info.key)
				clouds.append(cloud)
				self.add_message("Default cloud created.", 'success')

			for cloud in clouds:
				self.form.cloud.choices.insert(0, (cloud.key.id(), cloud.name))

		# params build out (injects the last wisp, if there was one)
		params = {
			'remote_ip': ip,
			'wisp': wisp,
			'cloud': cloud,
			'refresh_channel': refresh_channel,
			'channel_token': channel_token 
		}

		return self.render_template('lab/launcher.html', **params)
Beispiel #39
0
    def delete(self, group_id=None, member_id=None):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # get the group in question
        group = Group.get_by_id(long(group_id))
        member = User.get_by_id(long(member_id))

        # get this user's admin rights
        is_admin = False
        if group.owner == user_info.key:
            is_admin = True

        # bail if group doesn't exist or user is not admin
        if not group or not is_admin:
            # log to alert
            self.add_message("You may not remove this user from group.",
                             "error")
        else:
            # look up the other user's group membership
            membership = GroupMembers.get_by_userid_groupid(
                member.key, group.key)

            # kill the membership
            membership.key.delete()

            # find member's appliances that match that group and remove
            appliances = Appliance.get_by_user_group(member.key, group.key)
            for appliance in appliances:
                appliance.group = None  # public group
                appliance.put()

            # log to alert
            self.add_message("User removed from group!", "success")

        # use the channel to tell the browser we are done and reload
        channel_token = self.request.get('channel_token')
        channel.send_message(channel_token, 'reload')
        return
Beispiel #40
0
    def post(self):
        uid = self.request.get('uid')
        superuser = self.request.get('super')

        # lookup user's auth info
        user_info = User.get_by_id(long(uid))

        # lookup user's auth info
        loggedin_user_info = User.get_by_id(long(self.user_id))

        # only allow kordless to modify kordless
        if user_info.username == "kordless" and user_info.username != loggedin_user_info.username:
            params = {
                "response": "fail",
                "message": "you can not touch that user"
            }
            self.response.set_status(402)
            return self.render_template('api/response.json', **params)

        # only allow erikhatcher to modify erikhatcher
        if user_info.username == "erikhatcher" and user_info.username != loggedin_user_info.username:
            params = {
                "response": "fail",
                "message": "you can not touch that user"
            }
            self.response.set_status(402)
            return self.render_template('api/response.json', **params)

        if user_info and superuser == "1":
            user_info.superuser = True
            user_info.max_instances = 10
            user_info.put()
        elif user_info:
            user_info.superuser = False
            user_info.max_instances = 3  # max instances are set here and in model for user
            user_info.put()

        params = {"response": "success", "message": "user %s modified" % uid}
        return self.render_template('api/response.json', **params)
Beispiel #41
0
    def post(self):
        to = self.request.get("to")
        group_id = self.request.get("group_id")
        invitor_id = self.request.get("invitor_id")
        invite_url = self.request.get("invite_url")

        # admin of the pool
        sender = config.contact_sender

        # test to see if the sender_id and group number is real
        invitor = User.get_by_id(long(invitor_id))
        group = Group.get_by_id(long(group_id))

        # if we found the sending user and group
        if invitor and group:
            # rest of the email stuff
            subject = "You've Been Invited to the %s Group on %s" % (
                group.name, config.app_name)
            body = """
Howdy!

You've been invited to the %s group on the %s Compute Pool by %s.  Acceptance of the group invite will require linking the site to your Google account.

%s

This invite will allow you to start instances which are managed exclusively by appliances in the %s group.  Your membership also allows you to add your own OpenStack cluster and appliance to the group.  This is a very good thing for all involved.

If this email comes as a complete surprise to you, simply delete it.  We may yet meet again.

Cheers,

%s
%s
		""" % (group.name, config.app_name, invitor.username, invite_url, group.name,
            config.app_owner, config.app_name)

            logEmail = LogEmail(sender=sender,
                                to=to,
                                subject=subject,
                                body=body,
                                when=utils.get_date_time("datetimeProperty"))
            logEmail.put()

            try:
                mail.send_mail(sender, to, subject, body)
            except Exception as ex:
                logging.error(
                    "Failed attempt to send invite email because %s." % ex)
        else:
            # doing nothing, you fuckers
            logging.error("Failed attempt to send invite email.")
Beispiel #42
0
	def get(self, wisp_id = None):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))
		
		# get the wisp in question
		wisp = Wisp.get_by_id(long(wisp_id))

		# if doesn't exist, redirect
		if not wisp:
			return self.redirect_to('account-wisps')

		# insert images into list for wisp
		self.form.image.choices=[('custom', "Dynamic Image URL")]
		images = Image.get_all()
		for image in images:
			self.form.image.choices.insert(0, (str(image.key.id()), image.description))

		# load form values
		self.form.name.data = wisp.name
		self.form.ssh_key.data = wisp.ssh_key
		self.form.dynamic_image_url.data = wisp.dynamic_image_url
		self.form.post_creation.data = wisp.post_creation
		self.form.callback_url.data = wisp.callback_url
		self.form.default.data = wisp.default

		# hack up the form a bit
		if wisp.callback_url:
			self.form.callback.data = "custom"
		if wisp.dynamic_image_url:
			self.form.image.data = "custom"
		else:
			self.form.image.data = str(wisp.image.id())

		# check if the owner is this user
		if wisp and wisp.owner == user_info.key:
			# setup channel to do page refresh
			channel_token = user_info.key.urlsafe()
			refresh_channel = channel.create_channel(channel_token)

			# params build out
			params = {
				'wisp': wisp,
				'image': image,
				'refresh_channel': refresh_channel,
				'channel_token': channel_token 
			}

			return self.render_template('wisp/wisp_detail.html', **params)
		
		else:
			return self.redirect_to('account-wisps')
Beispiel #43
0
	def get(self):
		if self.user:
			user_info = User.get_by_id(long(self.user_id))

			# if 2fa enabled, set the last login to an hour ago
			if user_info.tfenabled:
				user_info.last_login = datetime.now() + timedelta(0, -config.session_age)
				user_info.put()

			message = "You have been logged out."
			self.add_message(message, 'info')

		self.auth.unset_session()
		self.redirect_to('home')
Beispiel #44
0
	def post(self):
		to = self.request.get("to")
		group_id = self.request.get("group_id")
		invitor_id = self.request.get("invitor_id")
		invite_url = self.request.get("invite_url")

		# admin of the pool
		sender = config.contact_sender

		# test to see if the sender_id and group number is real
		invitor = User.get_by_id(long(invitor_id))
		group = Group.get_by_id(long(group_id))

		# if we found the sending user and group
		if invitor and group:
			# rest of the email stuff
			subject = "You've Been Invited to the %s Group on %s" % (group.name, config.app_name)
			body = """
Howdy!

You've been invited to the %s group on %s by %s.  Acceptance of the group invite will require linking the site to your Google account.

%s

This invite will allow you to start instances which are managed exclusively by appliances in the %s group.  Your membership also allows you to add your own OpenStack cluster and appliance to the group.  This is a very good thing for all involved.

If this email comes as a complete surprise to you, simply delete it.  We may yet meet again.

Cheers,

%s
%s
		""" % (group.name, config.app_name, invitor.username, invite_url, group.name, config.app_owner, config.app_name)

			logEmail = LogEmail(
				sender = sender,
				to = to,
				subject = subject,
				body = body,
				when = utils.get_date_time("datetimeProperty")
			)
			logEmail.put()

			try:
				mail.send_mail(sender, to, subject, body)
			except Exception as ex:
				logging.error("Failed attempt to send invite email because %s." % ex)
		else:
			# doing nothing, you fuckers
			logging.error("Failed attempt to send invite email.")
Beispiel #45
0
	def delete(self, group_id = None, member_id = None):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))
		
		# get the group in question
		group = Group.get_by_id(long(group_id))
		member = User.get_by_id(long(member_id))

		# get this user's admin rights
		is_admin = False
		if group.owner == user_info.key:
			is_admin = True

		# bail if group doesn't exist or user is not admin
		if not group or not is_admin:
			# log to alert
			self.add_message("You may not remove this user from group.", "error")
		else:	
			# look up the other user's group membership
			membership = GroupMembers.get_by_userid_groupid(member.key, group.key)

			# kill the membership
			membership.key.delete()

			# find member's appliances that match that group and remove
			appliances = Appliance.get_by_user_group(member.key, group.key)
			for appliance in appliances:
				appliance.group = None # public group
				appliance.put()

			# log to alert
			self.add_message("User removed from group!", "success")
			
		# use the channel to tell the browser we are done and reload
		channel_token = self.request.get('channel_token')
		channel.send_message(channel_token, 'reload')
		return
Beispiel #46
0
    def get(self):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # look up appliances
        appliances = Appliance.get_by_user(user_info.key)

        # setup channel to do page refresh
        channel_token = user_info.key.urlsafe()
        refresh_channel = channel.create_channel(channel_token)

        # params build out
        params = {"appliances": appliances, "refresh_channel": refresh_channel, "channel_token": channel_token}

        return self.render_template("appliance/list.html", **params)
Beispiel #47
0
	def get(self):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# look up user's articles
		images = Image.get_all()

		# setup channel to do page refresh
		channel_token = user_info.key.urlsafe()
		refresh_channel = channel.create_channel(channel_token)
		params = {
			'images': images, 
			'refresh_channel': refresh_channel,
			'channel_token': channel_token 
		}
		return self.render_template('admin/images.html', **params)
Beispiel #48
0
	def get(self, group_id = None):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))
		
		# get the group in question
		group = Group.get_by_id(long(group_id))

		# scan if this user is a member and/or admin
		if group.owner == user_info.key:
			is_admin = True
			is_member = True # obvious
		else:
			is_admin = False
			is_member = GroupMembers.is_member(user_info.key, group.key)

		# bail if group doesn't exist or user isn't in the membership list
		if not group or not is_member:
			return self.redirect_to('account-groups')

		# get the members
		members = GroupMembers.get_group_users(group.key)

		# create an object with appliance counts per user
		appliance_count = {}
		for member in members:
			# get the appliance counts per user for this group
			count = Appliance.get_appliance_count_by_user_group(member.key, group.key)
			appliance_count[member.key.id()] = count

		# setup channel to do page refresh
		channel_token = user_info.key.urlsafe()
		refresh_channel = channel.create_channel(channel_token)

		# params build out - ugly cause instructions/admin stuff
		params = {
			'is_admin': is_admin,
			'is_member': is_member,
			'group': group,
			'members': members,
			'appliance_count': appliance_count,
			'num_members': len(members),
			'gmform': self.gmform,
			'refresh_channel': refresh_channel,
			'channel_token': channel_token 
		}

		return self.render_template('groups/edit.html', **params)
Beispiel #49
0
    def get(self, appliance_id=None):
        # lookup user's auth info
        user_info = User.get_by_id(long(self.user_id))

        # seek out the appliance in question
        appliance = Appliance.get_by_id(long(appliance_id))

        # bail if appliance doesn't exist user isn't the owner
        if not appliance or appliance.owner != user_info.key:
            return self.redirect_to("account-appliances")

            # find instances associated with this appliance
        instances = Instance.get_by_appliance(appliance.key)

        # render new appliance page
        parms = {"appliance": appliance, "instances": instances}
        return self.render_template("appliance/view.html", **parms)
	def get(self):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# look up appliances
		clouds = Cloud.get_by_user(user_info.key)

		# setup channel to do page refresh
		channel_token = user_info.key.urlsafe()
		refresh_channel = channel.create_channel(channel_token)

		# params build out
		params = {
			'clouds': clouds, 
			'refresh_channel': refresh_channel,
			'channel_token': channel_token 
		}

		return self.render_template('cloud/clouds.html', **params)
Beispiel #51
0
	def post(self, group_id = None):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))
		
		# get the group in question
		group = Group.get_by_id(long(group_id))

		# get this user's membership
		is_member	= GroupMembers.is_member(user_info.key, group.key)

		# bail if group doesn't exist or user not a member
		if not group or not is_member:
			return self.redirect_to('account-groups')

		# check what was returned from form validates
		if not self.form.validate():          
			self.add_message("The email form did not validate.", "error")
			return self.redirect_to('account-groups-configure', group_id = group.key.id())

		# load form values
		email = self.form.email.data.strip()

		# create the invite
		member = GroupMembers.invite(email, group.key, user_info.key)
		
		time.sleep(1)

		# build an invite URL, load the email_url, and then execute the task to send invite
		invite_url = "%s%s?token=%s" % (self.request.host_url, self.uri_for('account-groups-invites'), member.token)
		email_url = self.uri_for('tasks-sendinvite')
		taskqueue.add(url = email_url, params={
				'to': str(email),
				'group_id': group.key.id(),
				'invitor_id' : user_info.key.id(),
				'invite_url' : invite_url
		})

		# log to alert
		self.add_message("User invited to group!", "success")
		
		return self.redirect_to('account-groups-configure', group_id = group.key.id())
Beispiel #52
0
	def post(self):
		# lookup user's auth info
		user_info = User.get_by_id(long(self.user_id))

		# load form values
		name = self.form.name.data.strip()
		description = self.form.description.data.strip()

		# check if we have it already
		if Group.get_by_name(name):
			self.add_message("A group with that name already exists!", "error")
			return self.redirect_to('account-groups')

		# check what was returned from form validates
		if not self.form.validate():          
			self.add_message("The new group form did not validate.", "error")
			return self.get()

		# create the group
		group = Group(
			name = name,
			description = description,
			owner = user_info.key,
		)
		group.put()

		# create the group member entry
		groupmember = GroupMembers(
			group = group.key,
			member = user_info.key,
			invitor = user_info.key, # same same
			active = True
		)
		groupmember.put()
		
		# log to alert
		self.add_message("Group %s successfully created!" % name, "success")

		# give it a few seconds to update db, then redirect
		time.sleep(1)
		return self.redirect_to('account-groups-configure', group_id = group.key.id())