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)
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)
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)
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)
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)
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')
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)
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)
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 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, 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)
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
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)
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)
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, 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)
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
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")
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)
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
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)
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 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)
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
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)
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)
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!
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
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
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)
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())
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')
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)
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
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)
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.")
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')
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')
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.")
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
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)
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)
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)
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)
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())
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())