add rtp view for vm list, simplify proxmox and starrs auth, add requirements.txt

This commit is contained in:
Jordan Rodgers 2017-12-12 16:48:16 -05:00
parent bd39b0f0d1
commit b9e5236f0a
5 changed files with 82 additions and 66 deletions

74
app.py
View file

@ -28,23 +28,15 @@ auth = OIDCAuthentication(
def list_vms(): def list_vms():
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'], vms = get_vms_for_user(proxmox, user, rtp)
app.config['PROXMOX_PASS'])
vms = get_vms_for_user(proxmox, user)
for vm in vms:
if 'name' not in vm:
vms.remove(vm)
vms = sorted(vms, key=lambda k: k['name'])
return render_template('list_vms.html', username=user, rtp=rtp, vms=vms) return render_template('list_vms.html', username=user, rtp=rtp, vms=vms)
@app.route("/isos") @app.route("/isos")
@auth.oidc_auth @auth.oidc_auth
def isos(): def isos():
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'],
app.config['PROXMOX_PASS'])
isos = get_isos(proxmox, app.config['PROXMOX_ISO_STORAGE']) isos = get_isos(proxmox, app.config['PROXMOX_ISO_STORAGE'])
return ','.join(isos) return ','.join(isos)
@ -52,9 +44,7 @@ def isos():
@app.route("/hostname/<string:name>") @app.route("/hostname/<string:name>")
@auth.oidc_auth @auth.oidc_auth
def hostname(name): def hostname(name):
starrs = connect_starrs( starrs = connect_starrs()
app.config['STARRS_DB_NAME'], app.config['STARRS_DB_USER'],
app.config['STARRS_DB_HOST'], app.config['STARRS_DB_PASS'])
valid, available = check_hostname(starrs, name) valid, available = check_hostname(starrs, name)
if not valid: if not valid:
return 'invalid' return 'invalid'
@ -69,12 +59,8 @@ def hostname(name):
def vm_details(vmid): def vm_details(vmid):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'], starrs = connect_starrs()
app.config['PROXMOX_PASS'])
starrs = connect_starrs(
app.config['STARRS_DB_NAME'], app.config['STARRS_DB_USER'],
app.config['STARRS_DB_HOST'], app.config['STARRS_DB_PASS'])
if int(vmid) in get_user_allowed_vms( if int(vmid) in get_user_allowed_vms(
proxmox, user) or 'rtp' in session['userinfo']['groups']: proxmox, user) or 'rtp' in session['userinfo']['groups']:
vm = get_vm(proxmox, vmid) vm = get_vm(proxmox, vmid)
@ -110,9 +96,7 @@ def vm_details(vmid):
@auth.oidc_auth @auth.oidc_auth
def vm_power(vmid, action): def vm_power(vmid, action):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'],
app.config['PROXMOX_PASS'])
if int(vmid) in get_user_allowed_vms( if int(vmid) in get_user_allowed_vms(
proxmox, user) or 'rtp' in session['userinfo']['groups']: proxmox, user) or 'rtp' in session['userinfo']['groups']:
if action == 'start': if action == 'start':
@ -131,9 +115,7 @@ def vm_power(vmid, action):
@auth.oidc_auth @auth.oidc_auth
def vm_cpu(vmid, cores): def vm_cpu(vmid, cores):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'],
app.config['PROXMOX_PASS'])
if int(vmid) in get_user_allowed_vms( if int(vmid) in get_user_allowed_vms(
proxmox, user) or 'rtp' in session['userinfo']['groups']: proxmox, user) or 'rtp' in session['userinfo']['groups']:
cur_cores = get_vm_config(proxmox, vmid)['cores'] cur_cores = get_vm_config(proxmox, vmid)['cores']
@ -156,9 +138,7 @@ def vm_cpu(vmid, cores):
@auth.oidc_auth @auth.oidc_auth
def vm_mem(vmid, mem): def vm_mem(vmid, mem):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'],
app.config['PROXMOX_PASS'])
if int(vmid) in get_user_allowed_vms( if int(vmid) in get_user_allowed_vms(
proxmox, user) or 'rtp' in session['userinfo']['groups']: proxmox, user) or 'rtp' in session['userinfo']['groups']:
cur_mem = get_vm_config(proxmox, vmid)['memory'] // 1024 cur_mem = get_vm_config(proxmox, vmid)['memory'] // 1024
@ -181,12 +161,8 @@ def vm_mem(vmid, mem):
@auth.oidc_auth @auth.oidc_auth
def vm_renew(vmid): def vm_renew(vmid):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'], starrs = connect_starrs()
app.config['PROXMOX_PASS'])
starrs = connect_starrs(
app.config['STARRS_DB_NAME'], app.config['STARRS_DB_USER'],
app.config['STARRS_DB_HOST'], app.config['STARRS_DB_PASS'])
if int(vmid) in get_user_allowed_vms( if int(vmid) in get_user_allowed_vms(
proxmox, user) or 'rtp' in session['userinfo']['groups']: proxmox, user) or 'rtp' in session['userinfo']['groups']:
renew_vm_expire(vmid, app.config['VM_EXPIRE_MONTHS']) renew_vm_expire(vmid, app.config['VM_EXPIRE_MONTHS'])
@ -201,9 +177,7 @@ def vm_renew(vmid):
@auth.oidc_auth @auth.oidc_auth
def iso_eject(vmid): def iso_eject(vmid):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'],
app.config['PROXMOX_PASS'])
if int(vmid) in get_user_allowed_vms( if int(vmid) in get_user_allowed_vms(
proxmox, user) or 'rtp' in session['userinfo']['groups']: proxmox, user) or 'rtp' in session['userinfo']['groups']:
eject_vm_iso(proxmox, vmid) eject_vm_iso(proxmox, vmid)
@ -216,9 +190,7 @@ def iso_eject(vmid):
@auth.oidc_auth @auth.oidc_auth
def iso_mount(vmid, iso): def iso_mount(vmid, iso):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'],
app.config['PROXMOX_PASS'])
if int(vmid) in get_user_allowed_vms( if int(vmid) in get_user_allowed_vms(
proxmox, user) or 'rtp' in session['userinfo']['groups']: proxmox, user) or 'rtp' in session['userinfo']['groups']:
iso = "{}:iso/{}".format(app.config['PROXMOX_ISO_STORAGE'], iso) iso = "{}:iso/{}".format(app.config['PROXMOX_ISO_STORAGE'], iso)
@ -232,12 +204,8 @@ def iso_mount(vmid, iso):
@auth.oidc_auth @auth.oidc_auth
def delete(vmid): def delete(vmid):
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'], starrs = connect_starrs()
app.config['PROXMOX_PASS'])
starrs = connect_starrs(
app.config['STARRS_DB_NAME'], app.config['STARRS_DB_USER'],
app.config['STARRS_DB_HOST'], app.config['STARRS_DB_PASS'])
if int(vmid) in get_user_allowed_vms( if int(vmid) in get_user_allowed_vms(
proxmox, user) or 'rtp' in session['userinfo']['groups']: proxmox, user) or 'rtp' in session['userinfo']['groups']:
vmname = get_vm_config(proxmox, vmid)['name'] vmname = get_vm_config(proxmox, vmid)['name']
@ -254,12 +222,8 @@ def delete(vmid):
def create(): def create():
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'], starrs = connect_starrs()
app.config['PROXMOX_PASS'])
starrs = connect_starrs(
app.config['STARRS_DB_NAME'], app.config['STARRS_DB_USER'],
app.config['STARRS_DB_HOST'], app.config['STARRS_DB_PASS'])
if request.method == 'GET': if request.method == 'GET':
usage = get_user_usage(proxmox, user) usage = get_user_usage(proxmox, user)
limits = get_user_usage_limits(user) limits = get_user_usage_limits(user)
@ -325,9 +289,7 @@ def limits():
if 'rtp' in session['userinfo']['groups']: if 'rtp' in session['userinfo']['groups']:
user = session['userinfo']['preferred_username'] user = session['userinfo']['preferred_username']
rtp = 'rtp' in session['userinfo']['groups'] rtp = 'rtp' in session['userinfo']['groups']
proxmox = connect_proxmox(app.config['PROXMOX_HOST'], proxmox = connect_proxmox()
app.config['PROXMOX_USER'],
app.config['PROXMOX_PASS'])
pools = get_pools(proxmox) pools = get_pools(proxmox)
pools = sorted(pools) pools = sorted(pools)
user_limits = [] user_limits = []

View file

@ -1,22 +1,40 @@
import time import time
from flask import current_app as app
from proxmoxer import ProxmoxAPI from proxmoxer import ProxmoxAPI
from db import * from db import *
def connect_proxmox(host, user, password): def connect_proxmox():
try: try:
proxmox = ProxmoxAPI( proxmox = ProxmoxAPI(
host, user=user, password=password, verify_ssl=False) app.config['PROXMOX_HOST'], user=app.config['PROXMOX_USER'], password=app.config['PROXMOX_PASS'], verify_ssl=False)
except: except:
print("Unable to connect to Proxmox!") print("Unable to connect to Proxmox!")
raise raise
return proxmox return proxmox
def get_vms_for_user(proxmox, user): def get_vms_for_user(proxmox, user, rtp=False):
if user not in get_pools(proxmox): pools = get_pools(proxmox)
proxmox.pools.post(poolid=user, comment='Managed by Proxstar') if not rtp:
return proxmox.pools(user).get()['members'] if user not in pools:
proxmox.pools.post(poolid=user, comment='Managed by Proxstar')
vms = proxmox.pools(user).get()['members']
for vm in vms:
if 'name' not in vm:
vms.remove(vm)
vms = sorted(vms, key=lambda k: k['name'])
return vms
else:
pool_vms = []
for pool in pools:
vms = proxmox.pools(pool).get()['members']
for vm in vms:
if 'name' not in vm:
vms.remove(vm)
vms = sorted(vms, key=lambda k: k['name'])
pool_vms.append([pool, vms])
return pool_vms
def get_user_allowed_vms(proxmox, user): def get_user_allowed_vms(proxmox, user):
@ -232,5 +250,8 @@ def mount_vm_iso(proxmox, vmid, iso):
def get_pools(proxmox): def get_pools(proxmox):
pools = [] pools = []
for pool in proxmox.pools.get(): for pool in proxmox.pools.get():
pools.append(pool['poolid']) poolid = pool['poolid']
if poolid not in app.config['IGNORED_POOLS']:
pools.append(poolid)
pools = sorted(pools)
return pools return pools

6
requirements.txt Normal file
View file

@ -0,0 +1,6 @@
flask
flask_pyoidc
proxmoxer
psycopg2
sqlalchemy
python-dateutil

View file

@ -1,11 +1,12 @@
import psycopg2 import psycopg2
from flask import current_app as app
def connect_starrs(db, user, host, password): def connect_starrs():
try: try:
starrs = psycopg2.connect( starrs = psycopg2.connect(
"dbname='{}' user='{}' host='{}' password='{}'".format( "dbname='{}' user='{}' host='{}' password='{}'".format(
db, user, host, password)) app.config['STARRS_DB_NAME'], app.config['STARRS_DB_USER'], app.config['STARRS_DB_HOST'], app.config['STARRS_DB_PASS']))
except: except:
print("Unable to connect to STARRS database.") print("Unable to connect to STARRS database.")
raise raise

View file

@ -11,7 +11,7 @@
</div> </div>
</div> </div>
</div> </div>
{% else %} {% elif not rtp %}
{% for vm in vms %} {% for vm in vms %}
<div class="col-md-3 col-sm-4 col-xs-6"> <div class="col-md-3 col-sm-4 col-xs-6">
<div class="panel panel-default"> <div class="panel panel-default">
@ -24,6 +24,32 @@
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
{% else %}
{% for pool in vms %}
{% if pool[1] %}
<div class="col-md-12 col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">{{ pool[0] }}</h3>
</div>
<div class="panel-body">
{% for vm in pool[1] %}
<div class="col-md-3 col-sm-4 col-xs-6">
<div class="panel panel-default">
<div class="panel-body">
<a href="/vm/{{ vm['vmid'] }}">
<p>{{ vm['name'] }}</p>
</a>
<p>Status: {{ vm['status'] }}</p>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endif %}
{% endfor %}
{% endif %} {% endif %}
</div> </div>
</div> </div>