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

View file

@ -1,22 +1,40 @@
import time
from flask import current_app as app
from proxmoxer import ProxmoxAPI
from db import *
def connect_proxmox(host, user, password):
def connect_proxmox():
try:
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:
print("Unable to connect to Proxmox!")
raise
return proxmox
def get_vms_for_user(proxmox, user):
if user not in get_pools(proxmox):
proxmox.pools.post(poolid=user, comment='Managed by Proxstar')
return proxmox.pools(user).get()['members']
def get_vms_for_user(proxmox, user, rtp=False):
pools = get_pools(proxmox)
if not rtp:
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):
@ -232,5 +250,8 @@ def mount_vm_iso(proxmox, vmid, iso):
def get_pools(proxmox):
pools = []
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

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
from flask import current_app as app
def connect_starrs(db, user, host, password):
def connect_starrs():
try:
starrs = psycopg2.connect(
"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:
print("Unable to connect to STARRS database.")
raise

View file

@ -11,7 +11,7 @@
</div>
</div>
</div>
{% else %}
{% elif not rtp %}
{% for vm in vms %}
<div class="col-md-3 col-sm-4 col-xs-6">
<div class="panel panel-default">
@ -24,6 +24,32 @@
</div>
</div>
{% 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 %}
</div>
</div>