mirror of
				https://github.com/ComputerScienceHouse/proxstar.git
				synced 2025-03-09 15:40:09 +00:00 
			
		
		
		
	add allowed users setting for current students, replace all user stuff with user dict, add beginning of vnc cleanup
This commit is contained in:
		
							parent
							
								
									6d71f49a7a
								
							
						
					
					
						commit
						7aadd423e7
					
				
					 10 changed files with 195 additions and 97 deletions
				
			
		| 
						 | 
				
			
			@ -76,34 +76,28 @@ if 'process_expiring_vms' not in scheduler:
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
@app.route("/")
 | 
			
		||||
@app.route("/user/<string:user>")
 | 
			
		||||
@app.route("/user/<string:user_view>")
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def list_vms(user=None):
 | 
			
		||||
def list_vms(user_view=None):
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    rtp_view = False
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    active = 'active' in session['userinfo']['groups']
 | 
			
		||||
    proxmox = connect_proxmox()
 | 
			
		||||
    if user and not rtp:
 | 
			
		||||
    if user_view and not user['rtp']:
 | 
			
		||||
        return '', 403
 | 
			
		||||
    elif user and rtp:
 | 
			
		||||
        vms = get_vms_for_user(proxmox, db, user)
 | 
			
		||||
        rtp_view = user
 | 
			
		||||
        user = session['userinfo']['preferred_username']
 | 
			
		||||
    elif rtp:
 | 
			
		||||
        user = session['userinfo']['preferred_username']
 | 
			
		||||
    elif user_view and user['rtp']:
 | 
			
		||||
        vms = get_vms_for_user(proxmox, db, user_view)
 | 
			
		||||
        rtp_view = user_view
 | 
			
		||||
    elif user['rtp']:
 | 
			
		||||
        vms = get_pool_cache(db)
 | 
			
		||||
        rtp_view = True
 | 
			
		||||
    else:
 | 
			
		||||
        user = session['userinfo']['preferred_username']
 | 
			
		||||
        if active:
 | 
			
		||||
            vms = get_vms_for_user(proxmox, db, user)
 | 
			
		||||
        if user['active']:
 | 
			
		||||
            vms = get_vms_for_user(proxmox, db, user['username'])
 | 
			
		||||
        else:
 | 
			
		||||
            vms = 'INACTIVE'
 | 
			
		||||
    return render_template(
 | 
			
		||||
        'list_vms.html',
 | 
			
		||||
        username=user,
 | 
			
		||||
        rtp=rtp,
 | 
			
		||||
        active=active,
 | 
			
		||||
        user=user,
 | 
			
		||||
        rtp_view=rtp_view,
 | 
			
		||||
        vms=vms)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -131,11 +125,9 @@ def hostname(name):
 | 
			
		|||
@app.route("/vm/<string:vmid>")
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def vm_details(vmid):
 | 
			
		||||
    user = session['userinfo']['preferred_username']
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    active = 'active' in session['userinfo']['groups']
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    proxmox = connect_proxmox()
 | 
			
		||||
    if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user):
 | 
			
		||||
    if user['rtp'] or int(vmid) in get_user_allowed_vms(proxmox, db, user['username']):
 | 
			
		||||
        vm = get_vm(proxmox, vmid)
 | 
			
		||||
        vm['vmid'] = vmid
 | 
			
		||||
        vm['config'] = get_vm_config(proxmox, vmid)
 | 
			
		||||
| 
						 | 
				
			
			@ -150,16 +142,14 @@ def vm_details(vmid):
 | 
			
		|||
                 get_ip_for_mac(starrs, interface[1])])
 | 
			
		||||
        vm['expire'] = get_vm_expire(
 | 
			
		||||
            db, vmid, app.config['VM_EXPIRE_MONTHS']).strftime('%m/%d/%Y')
 | 
			
		||||
        usage = get_user_usage(proxmox, db, user)
 | 
			
		||||
        limits = get_user_usage_limits(db, user)
 | 
			
		||||
        usage_check = check_user_usage(proxmox, db, user,
 | 
			
		||||
        usage = get_user_usage(proxmox, db, user['username'])
 | 
			
		||||
        limits = get_user_usage_limits(db, user['username'])
 | 
			
		||||
        usage_check = check_user_usage(proxmox, db, user['username'],
 | 
			
		||||
                                       vm['config']['cores'],
 | 
			
		||||
                                       vm['config']['memory'], 0)
 | 
			
		||||
        return render_template(
 | 
			
		||||
            'vm_details.html',
 | 
			
		||||
            username=user,
 | 
			
		||||
            rtp=rtp,
 | 
			
		||||
            active=active,
 | 
			
		||||
            user=user,
 | 
			
		||||
            vm=vm,
 | 
			
		||||
            usage=usage,
 | 
			
		||||
            limits=limits,
 | 
			
		||||
| 
						 | 
				
			
			@ -171,13 +161,12 @@ def vm_details(vmid):
 | 
			
		|||
@app.route("/vm/<string:vmid>/power/<string:action>", methods=['POST'])
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def vm_power(vmid, action):
 | 
			
		||||
    user = session['userinfo']['preferred_username']
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    proxmox = connect_proxmox()
 | 
			
		||||
    if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user):
 | 
			
		||||
    if user['rtp'] or int(vmid) in get_user_allowed_vms(proxmox, db, user['username']):
 | 
			
		||||
        if action == 'start':
 | 
			
		||||
            config = get_vm_config(proxmox, vmid)
 | 
			
		||||
            usage_check = check_user_usage(proxmox, db, user, config['cores'],
 | 
			
		||||
            usage_check = check_user_usage(proxmox, db, user['username'], config['cores'],
 | 
			
		||||
                                           config['memory'], 0)
 | 
			
		||||
            if usage_check:
 | 
			
		||||
                return usage_check
 | 
			
		||||
| 
						 | 
				
			
			@ -190,10 +179,9 @@ def vm_power(vmid, action):
 | 
			
		|||
@app.route("/vm/<string:vmid>/console", methods=['POST'])
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def vm_console(vmid):
 | 
			
		||||
    user = session['userinfo']['preferred_username']
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    proxmox = connect_proxmox()
 | 
			
		||||
    if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user):
 | 
			
		||||
    if user['rtp'] or int(vmid) in get_user_allowed_vms(proxmox, db, user['username']):
 | 
			
		||||
        port = str(5900 + int(vmid))
 | 
			
		||||
        token = add_vnc_target(port)
 | 
			
		||||
        node = "{}.csh.rit.edu".format(get_vm_node(proxmox, vmid))
 | 
			
		||||
| 
						 | 
				
			
			@ -212,18 +200,17 @@ def vm_console(vmid):
 | 
			
		|||
@app.route("/vm/<string:vmid>/cpu/<int:cores>", methods=['POST'])
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def vm_cpu(vmid, cores):
 | 
			
		||||
    user = session['userinfo']['preferred_username']
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    proxmox = connect_proxmox()
 | 
			
		||||
    if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user):
 | 
			
		||||
    if user['rtp'] or int(vmid) in get_user_allowed_vms(proxmox, db, user['username']):
 | 
			
		||||
        cur_cores = get_vm_config(proxmox, vmid)['cores']
 | 
			
		||||
        if cores >= cur_cores:
 | 
			
		||||
            status = get_vm(proxmox, vmid)['qmpstatus']
 | 
			
		||||
            if status == 'running' or status == 'paused':
 | 
			
		||||
                usage_check = check_user_usage(proxmox, db, user,
 | 
			
		||||
                usage_check = check_user_usage(proxmox, db, user['username'],
 | 
			
		||||
                                               cores - cur_cores, 0, 0)
 | 
			
		||||
            else:
 | 
			
		||||
                usage_check = check_user_usage(proxmox, db, user, cores, 0, 0)
 | 
			
		||||
                usage_check = check_user_usage(proxmox, db, user['username'], cores, 0, 0)
 | 
			
		||||
            if usage_check:
 | 
			
		||||
                return usage_check
 | 
			
		||||
        change_vm_cpu(proxmox, vmid, cores)
 | 
			
		||||
| 
						 | 
				
			
			@ -235,18 +222,17 @@ def vm_cpu(vmid, cores):
 | 
			
		|||
@app.route("/vm/<string:vmid>/mem/<int:mem>", methods=['POST'])
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def vm_mem(vmid, mem):
 | 
			
		||||
    user = session['userinfo']['preferred_username']
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    proxmox = connect_proxmox()
 | 
			
		||||
    if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user):
 | 
			
		||||
    if user['rtp'] or int(vmid) in get_user_allowed_vms(proxmox, db, user['username']):
 | 
			
		||||
        cur_mem = get_vm_config(proxmox, vmid)['memory'] // 1024
 | 
			
		||||
        if mem >= cur_mem:
 | 
			
		||||
            status = get_vm(proxmox, vmid)['qmpstatus']
 | 
			
		||||
            if status == 'running' or status == 'paused':
 | 
			
		||||
                usage_check = check_user_usage(proxmox, db, user, 0,
 | 
			
		||||
                usage_check = check_user_usage(proxmox, db, user['username'], 0,
 | 
			
		||||
                                               mem - cur_mem, 0)
 | 
			
		||||
            else:
 | 
			
		||||
                usage_check = check_user_usage(proxmox, db, user, 0, mem, 0)
 | 
			
		||||
                usage_check = check_user_usage(proxmox, db, user['username'], 0, mem, 0)
 | 
			
		||||
            if usage_check:
 | 
			
		||||
                return usage_check
 | 
			
		||||
        change_vm_mem(proxmox, vmid, mem * 1024)
 | 
			
		||||
| 
						 | 
				
			
			@ -258,10 +244,9 @@ def vm_mem(vmid, mem):
 | 
			
		|||
@app.route("/vm/<string:vmid>/renew", methods=['POST'])
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def vm_renew(vmid):
 | 
			
		||||
    user = session['userinfo']['preferred_username']
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    proxmox = connect_proxmox()
 | 
			
		||||
    if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user):
 | 
			
		||||
    if user['rtp'] or int(vmid) in get_user_allowed_vms(proxmox, db, user['username']):
 | 
			
		||||
        renew_vm_expire(db, vmid, app.config['VM_EXPIRE_MONTHS'])
 | 
			
		||||
        for interface in get_vm_interfaces(proxmox, vmid):
 | 
			
		||||
            renew_ip(starrs, get_ip_for_mac(starrs, interface[1]))
 | 
			
		||||
| 
						 | 
				
			
			@ -273,10 +258,9 @@ def vm_renew(vmid):
 | 
			
		|||
@app.route("/vm/<string:vmid>/eject", methods=['POST'])
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def iso_eject(vmid):
 | 
			
		||||
    user = session['userinfo']['preferred_username']
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    proxmox = connect_proxmox()
 | 
			
		||||
    if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user):
 | 
			
		||||
    if user['rtp'] or int(vmid) in get_user_allowed_vms(proxmox, db, user):
 | 
			
		||||
        eject_vm_iso(proxmox, vmid)
 | 
			
		||||
        return '', 200
 | 
			
		||||
    else:
 | 
			
		||||
| 
						 | 
				
			
			@ -286,10 +270,9 @@ def iso_eject(vmid):
 | 
			
		|||
@app.route("/vm/<string:vmid>/mount/<string:iso>", methods=['POST'])
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def iso_mount(vmid, iso):
 | 
			
		||||
    user = session['userinfo']['preferred_username']
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    proxmox = connect_proxmox()
 | 
			
		||||
    if rtp or int(vmid) in get_user_allowed_vms(proxmox, db, user):
 | 
			
		||||
    if user['rtp'] or int(vmid) in get_user_allowed_vms(proxmox, db, user['username']):
 | 
			
		||||
        iso = "{}:iso/{}".format(app.config['PROXMOX_ISO_STORAGE'], iso)
 | 
			
		||||
        mount_vm_iso(proxmox, vmid, iso)
 | 
			
		||||
        return '', 200
 | 
			
		||||
| 
						 | 
				
			
			@ -300,11 +283,10 @@ def iso_mount(vmid, iso):
 | 
			
		|||
@app.route("/vm/<string:vmid>/delete", methods=['POST'])
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def delete(vmid):
 | 
			
		||||
    user = session['userinfo']['preferred_username']
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    proxmox = connect_proxmox()
 | 
			
		||||
    if rtp or int(vmid) in get_user_allowed_vms(
 | 
			
		||||
            proxmox, db, user) or 'rtp' in session['userinfo']['groups']:
 | 
			
		||||
    if user['rtp'] or int(vmid) in get_user_allowed_vms(
 | 
			
		||||
            proxmox, db, user['username']) or 'rtp' in session['userinfo']['groups']:
 | 
			
		||||
        q.enqueue(delete_vm_task, vmid)
 | 
			
		||||
        return '', 200
 | 
			
		||||
    else:
 | 
			
		||||
| 
						 | 
				
			
			@ -314,23 +296,19 @@ def delete(vmid):
 | 
			
		|||
@app.route("/vm/create", methods=['GET', 'POST'])
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def create():
 | 
			
		||||
    user = session['userinfo']['preferred_username']
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    active = 'active' in session['userinfo']['groups']
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    proxmox = connect_proxmox()
 | 
			
		||||
    if active:
 | 
			
		||||
    if user['active']:
 | 
			
		||||
        if request.method == 'GET':
 | 
			
		||||
            usage = get_user_usage(proxmox, db, user)
 | 
			
		||||
            limits = get_user_usage_limits(db, user)
 | 
			
		||||
            percents = get_user_usage_percent(proxmox, user, usage, limits)
 | 
			
		||||
            usage = get_user_usage(proxmox, db, user['username'])
 | 
			
		||||
            limits = get_user_usage_limits(db, user['username'])
 | 
			
		||||
            percents = get_user_usage_percent(proxmox, user['username'], usage, limits)
 | 
			
		||||
            isos = get_isos(proxmox, app.config['PROXMOX_ISO_STORAGE'])
 | 
			
		||||
            pools = get_pools(proxmox, db)
 | 
			
		||||
            templates = get_templates(db)
 | 
			
		||||
            return render_template(
 | 
			
		||||
                'create.html',
 | 
			
		||||
                username=user,
 | 
			
		||||
                rtp=rtp,
 | 
			
		||||
                active=active,
 | 
			
		||||
                user=user,
 | 
			
		||||
                usage=usage,
 | 
			
		||||
                limits=limits,
 | 
			
		||||
                percents=percents,
 | 
			
		||||
| 
						 | 
				
			
			@ -347,11 +325,11 @@ def create():
 | 
			
		|||
            if iso != 'none':
 | 
			
		||||
                iso = "{}:iso/{}".format(app.config['PROXMOX_ISO_STORAGE'],
 | 
			
		||||
                                         iso)
 | 
			
		||||
            if not rtp:
 | 
			
		||||
                usage_check = check_user_usage(proxmox, db, user, 0, 0, disk)
 | 
			
		||||
            if not user['rtp']:
 | 
			
		||||
                usage_check = check_user_usage(proxmox, db, user['username'], 0, 0, disk)
 | 
			
		||||
            else:
 | 
			
		||||
                usage_check = None
 | 
			
		||||
                user = request.form['user']
 | 
			
		||||
                user['username'] = request.form['user']
 | 
			
		||||
            if usage_check:
 | 
			
		||||
                return usage_check
 | 
			
		||||
            else:
 | 
			
		||||
| 
						 | 
				
			
			@ -360,7 +338,7 @@ def create():
 | 
			
		|||
                    if template == 'none':
 | 
			
		||||
                        q.enqueue(
 | 
			
		||||
                            create_vm_task,
 | 
			
		||||
                            user,
 | 
			
		||||
                            user['username'],
 | 
			
		||||
                            name,
 | 
			
		||||
                            cores,
 | 
			
		||||
                            memory,
 | 
			
		||||
| 
						 | 
				
			
			@ -373,7 +351,7 @@ def create():
 | 
			
		|||
                            setup_template,
 | 
			
		||||
                            template,
 | 
			
		||||
                            name,
 | 
			
		||||
                            user,
 | 
			
		||||
                            user['username'],
 | 
			
		||||
                            password,
 | 
			
		||||
                            cores,
 | 
			
		||||
                            memory,
 | 
			
		||||
| 
						 | 
				
			
			@ -412,19 +390,17 @@ def delete_user(user):
 | 
			
		|||
@app.route("/settings")
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def settings():
 | 
			
		||||
    user = session['userinfo']['preferred_username']
 | 
			
		||||
    rtp = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    active = 'active' in session['userinfo']['groups']
 | 
			
		||||
    if rtp:
 | 
			
		||||
    user = build_user_dict(session, db)
 | 
			
		||||
    if user['rtp']:
 | 
			
		||||
        templates = get_templates(db)
 | 
			
		||||
        ignored_pools = get_ignored_pools(db)
 | 
			
		||||
        allowed_users = get_allowed_users(db)
 | 
			
		||||
        return render_template(
 | 
			
		||||
            'settings.html',
 | 
			
		||||
            username=user,
 | 
			
		||||
            rtp=rtp,
 | 
			
		||||
            active=active,
 | 
			
		||||
            user=user,
 | 
			
		||||
            templates=templates,
 | 
			
		||||
            ignored_pools=ignored_pools)
 | 
			
		||||
            ignored_pools=ignored_pools,
 | 
			
		||||
            allowed_users=allowed_users)
 | 
			
		||||
    else:
 | 
			
		||||
        return '', 403
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -442,6 +418,29 @@ def ignored_pools(pool):
 | 
			
		|||
        return '', 403
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route("/user/<string:user>/allow", methods=['POST', 'DELETE'])
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def allowed_users(user):
 | 
			
		||||
    if 'rtp' in session['userinfo']['groups']:
 | 
			
		||||
        if request.method == 'POST':
 | 
			
		||||
            add_allowed_user(db, user)
 | 
			
		||||
        elif request.method == "DELETE":
 | 
			
		||||
            delete_allowed_user(db, user)
 | 
			
		||||
        return '', 200
 | 
			
		||||
    else:
 | 
			
		||||
        return '', 403
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route("/targets/clear")
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def clear_targets():
 | 
			
		||||
    if 'rtp' in session['userinfo']['groups']:
 | 
			
		||||
        clear_vnc_targets()
 | 
			
		||||
        return '', 200
 | 
			
		||||
    else:
 | 
			
		||||
        return '', 403
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route('/template/<string:template_id>/disk')
 | 
			
		||||
@auth.oidc_auth
 | 
			
		||||
def template_disk(template_id):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@ import datetime
 | 
			
		|||
from sqlalchemy import exists
 | 
			
		||||
from dateutil.relativedelta import relativedelta
 | 
			
		||||
from proxstar.ldapdb import *
 | 
			
		||||
from proxstar.models import VM_Expiration, Usage_Limit, Pool_Cache, Ignored_Pools, Template, Base
 | 
			
		||||
from proxstar.models import VM_Expiration, Usage_Limit, Pool_Cache, Ignored_Pools, Template, Allowed_Users, Base
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_vm_expire(db, vmid, months):
 | 
			
		||||
| 
						 | 
				
			
			@ -180,3 +180,25 @@ def get_template_disk(db, template_id):
 | 
			
		|||
        template = db.query(Template).filter(Template.id == template_id).one()
 | 
			
		||||
        disk = template.disk
 | 
			
		||||
    return str(disk)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_allowed_users(db):
 | 
			
		||||
    allowed_users = []
 | 
			
		||||
    for user in db.query(Allowed_Users).all():
 | 
			
		||||
        allowed_users.append(user.id)
 | 
			
		||||
    return allowed_users
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def add_allowed_user(db, user):
 | 
			
		||||
    if not db.query(exists().where(Allowed_Users.id == user)).scalar():
 | 
			
		||||
        allowed_user = Allowed_Users(id=user)
 | 
			
		||||
        db.add(allowed_user)
 | 
			
		||||
        db.commit()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def delete_allowed_user(db, user):
 | 
			
		||||
    if db.query(exists().where(Allowed_Users.id == user)).scalar():
 | 
			
		||||
        allowed_user = db.query(Allowed_Users).filter(
 | 
			
		||||
            Allowed_Users.id == user).one()
 | 
			
		||||
        db.delete(allowed_user)
 | 
			
		||||
        db.commit()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,3 +43,8 @@ class Template(Base):
 | 
			
		|||
class Ignored_Pools(Base):
 | 
			
		||||
    __tablename__ = 'ignored_pools'
 | 
			
		||||
    id = Column(String(32), primary_key=True)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Allowed_Users(Base):
 | 
			
		||||
    __tablename__ = 'allowed_users'
 | 
			
		||||
    id = Column(String(32), primary_key=True)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -777,8 +777,9 @@ $(".delete-ignored-pool").click(function(){
 | 
			
		|||
    fetch(`/pool/${pool}/ignore`, {
 | 
			
		||||
        credentials: 'same-origin',
 | 
			
		||||
        method: 'delete'
 | 
			
		||||
    });
 | 
			
		||||
    }).then((response) => {
 | 
			
		||||
    location.reload();
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$(".add-ignored-pool").click(function(){
 | 
			
		||||
| 
						 | 
				
			
			@ -786,8 +787,9 @@ $(".add-ignored-pool").click(function(){
 | 
			
		|||
    fetch(`/pool/${pool}/ignore`, {
 | 
			
		||||
        credentials: 'same-origin',
 | 
			
		||||
        method: 'post'
 | 
			
		||||
    });
 | 
			
		||||
    }).then((response) => {
 | 
			
		||||
    location.reload();
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function hide_for_template(obj) {
 | 
			
		||||
| 
						 | 
				
			
			@ -822,3 +824,23 @@ $("#console-vm").click(function(){
 | 
			
		|||
        }
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$(".delete-allowed-user").click(function(){
 | 
			
		||||
    const user = $(this).data('user');
 | 
			
		||||
    fetch(`/user/${user}/allow`, {
 | 
			
		||||
        credentials: 'same-origin',
 | 
			
		||||
        method: 'delete'
 | 
			
		||||
    }).then((response) => {
 | 
			
		||||
    location.reload();
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
$(".add-allowed-user").click(function(){
 | 
			
		||||
    const user = document.getElementById('user').value;
 | 
			
		||||
    fetch(`/user/${user}/allow`, {
 | 
			
		||||
        credentials: 'same-origin',
 | 
			
		||||
        method: 'post'
 | 
			
		||||
    }).then((response) => {
 | 
			
		||||
    location.reload();
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@
 | 
			
		|||
            </div>
 | 
			
		||||
            <div id="navbar" class="navbar-collapse collapse">
 | 
			
		||||
                <ul class="nav navbar-nav">
 | 
			
		||||
                    {% if active %}
 | 
			
		||||
                    {% if user['active'] %}
 | 
			
		||||
                    <li>
 | 
			
		||||
                        <a href="/">
 | 
			
		||||
                            <span class="glyphicon glyphicon-th-list"></span>
 | 
			
		||||
| 
						 | 
				
			
			@ -40,7 +40,7 @@
 | 
			
		|||
                            Create VM
 | 
			
		||||
                        </a>
 | 
			
		||||
                    </li>
 | 
			
		||||
                    {% if rtp %}
 | 
			
		||||
                    {% if user['rtp'] %}
 | 
			
		||||
                    <li>
 | 
			
		||||
                        <a href="/settings">
 | 
			
		||||
                            <span class="glyphicon glyphicon-cog"></span>
 | 
			
		||||
| 
						 | 
				
			
			@ -54,9 +54,9 @@
 | 
			
		|||
                    <li class="dropdown navbar-user">
 | 
			
		||||
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown"
 | 
			
		||||
                           role="button" aria-expanded="false">
 | 
			
		||||
                            <img src="https://profiles.csh.rit.edu/image/{{ username }}"
 | 
			
		||||
                                 title="{{ username }}">
 | 
			
		||||
                            {{ username }}
 | 
			
		||||
                            <img src="https://profiles.csh.rit.edu/image/{{ user['username'] }}"
 | 
			
		||||
                                 title="{{ user['username'] }}">
 | 
			
		||||
                            {{ user['username'] }}
 | 
			
		||||
                            <span class="caret"></span>
 | 
			
		||||
                        </a>
 | 
			
		||||
                        <ul class="dropdown-menu" role="menu">
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@
 | 
			
		|||
                            </li>
 | 
			
		||||
                            <li class="divider"></li>
 | 
			
		||||
                            <li>
 | 
			
		||||
                                <a href="https://profiles.csh.rit.edu/user/{{ username }}">
 | 
			
		||||
                                <a href="https://profiles.csh.rit.edu/user/{{ user['username'] }}">
 | 
			
		||||
                                    <span class="glyphicon glyphicon-user"></span>
 | 
			
		||||
                                    Profile
 | 
			
		||||
                                </a>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@
 | 
			
		|||
 | 
			
		||||
<div class="container">
 | 
			
		||||
    <div class="row">
 | 
			
		||||
        {% if rtp %}
 | 
			
		||||
        {% if user['rtp'] %}
 | 
			
		||||
        <div class="col-md-12 col-sm-12">
 | 
			
		||||
        {% else %}
 | 
			
		||||
        <div class="col-md-9 col-sm-12">
 | 
			
		||||
| 
						 | 
				
			
			@ -61,7 +61,7 @@
 | 
			
		|||
                            </select>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    {% if rtp %}
 | 
			
		||||
                    {% if user['rtp'] %}
 | 
			
		||||
                    <div class="form-group">
 | 
			
		||||
                        <label for="user" class="pull-left">User</label>
 | 
			
		||||
                        <select name="user" id="user" class="form-control">
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +76,7 @@
 | 
			
		|||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        {% if not rtp %}
 | 
			
		||||
        {% if not user['rtp'] %}
 | 
			
		||||
        <div class="col-md-3 col-sm-12">
 | 
			
		||||
            <div class="panel panel-default">
 | 
			
		||||
                <div class="panel-heading">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@
 | 
			
		|||
 | 
			
		||||
<div class="container">
 | 
			
		||||
    <div class="row">
 | 
			
		||||
        {% if rtp and rtp_view != True %}
 | 
			
		||||
        {% if user['rtp'] and rtp_view != True %}
 | 
			
		||||
        <div class="col-md-12 col-sm-12">
 | 
			
		||||
            <div class="panel panel-default">
 | 
			
		||||
                <div class="panel-heading">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@
 | 
			
		|||
 | 
			
		||||
<div class="container">
 | 
			
		||||
    <div class="row">
 | 
			
		||||
        <div class="col-md-9 col-sm-12">
 | 
			
		||||
        <div class="col-md-6 col-sm-12">
 | 
			
		||||
            <div class="panel panel-default">
 | 
			
		||||
                <div class="panel-heading">
 | 
			
		||||
                    <h3 class="panel-title">Templates</h3>
 | 
			
		||||
| 
						 | 
				
			
			@ -66,11 +66,48 @@
 | 
			
		|||
                            {% endfor %}
 | 
			
		||||
                        </tbody>
 | 
			
		||||
                    </table>
 | 
			
		||||
                    <div class="col-md-9">
 | 
			
		||||
                    <div class="col-md-9 col-xs-9">
 | 
			
		||||
                        <input type="text" id="pool" class="form-control">
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="col-md-3">
 | 
			
		||||
                    <button class="btn btn-sm btn-success add-ignored-pool" data-pool="{{ pool }}">
 | 
			
		||||
                    <div class="col-md-3 col-xs-3">
 | 
			
		||||
                    <button class="btn btn-sm btn-success add-ignored-pool">
 | 
			
		||||
                        <span class="glyphicon glyphicon-plus"></span>
 | 
			
		||||
                    </button>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="col-md-3 col-sm-12">
 | 
			
		||||
            <div class="panel panel-default">
 | 
			
		||||
                <div class="panel-heading">
 | 
			
		||||
                    <h3 class="panel-title">Allowed Users</h3>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="panel-body">
 | 
			
		||||
                    <table class="table table-bordered table-striped">
 | 
			
		||||
                        <thead>
 | 
			
		||||
                            <tr role="row">
 | 
			
		||||
                                <th>User</th>
 | 
			
		||||
                                <th>Delete</th>
 | 
			
		||||
                            </tr>
 | 
			
		||||
                        </thead>
 | 
			
		||||
                        <tbody>
 | 
			
		||||
                            {% for username in allowed_users %}
 | 
			
		||||
                                <tr role="row">
 | 
			
		||||
                                    <td class="col-md-9">{{ username }}</td>
 | 
			
		||||
                                    <td class="col-md-3">
 | 
			
		||||
                                        <button class="btn btn-sm btn-danger delete-allowed-user" data-user="{{ username }}">
 | 
			
		||||
                                            <span class="glyphicon glyphicon-remove"></span>
 | 
			
		||||
                                        </button>
 | 
			
		||||
                                    </td>
 | 
			
		||||
                                </tr>
 | 
			
		||||
                            {% endfor %}
 | 
			
		||||
                        </tbody>
 | 
			
		||||
                    </table>
 | 
			
		||||
                    <div class="col-md-9 col-xs-9">
 | 
			
		||||
                        <input type="text" id="user" class="form-control">
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div class="col-md-3 col-xs-3">
 | 
			
		||||
                    <button class="btn btn-sm btn-success add-allowed-user">
 | 
			
		||||
                        <span class="glyphicon glyphicon-plus"></span>
 | 
			
		||||
                    </button>
 | 
			
		||||
                    </div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
import string
 | 
			
		||||
import random
 | 
			
		||||
from proxstar.db import *
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def gen_password(
 | 
			
		||||
| 
						 | 
				
			
			@ -8,3 +9,11 @@ def gen_password(
 | 
			
		|||
):
 | 
			
		||||
    # use secrets module once this works in python 3.6
 | 
			
		||||
    return ''.join(random.choice(charset) for x in range(length))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def build_user_dict(session, db):
 | 
			
		||||
    user_dict = dict()
 | 
			
		||||
    user_dict['username'] = session['userinfo']['preferred_username']
 | 
			
		||||
    user_dict['active'] = 'active' in session['userinfo']['groups'] or user_dict['username'] in get_allowed_users(db)
 | 
			
		||||
    user_dict['rtp'] = 'rtp' in session['userinfo']['groups']
 | 
			
		||||
    return user_dict
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,6 +60,10 @@ def add_vnc_target(port):
 | 
			
		|||
        return token
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def clear_vnc_targets():
 | 
			
		||||
    open(app.config['WEBSOCKIFY_TARGET_FILE'], 'w').close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def start_ssh_tunnel(node, port):
 | 
			
		||||
    port = int(port)
 | 
			
		||||
    server = SSHTunnelForwarder(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue