mirror of
https://github.com/ComputerScienceHouse/proxstar.git
synced 2025-03-09 15:40:09 +00:00
add rtp view for vm list, simplify proxmox and starrs auth, add requirements.txt
This commit is contained in:
parent
bd39b0f0d1
commit
b9e5236f0a
5 changed files with 82 additions and 66 deletions
74
app.py
74
app.py
|
@ -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 = []
|
||||||
|
|
35
proxmox.py
35
proxmox.py
|
@ -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
6
requirements.txt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
flask
|
||||||
|
flask_pyoidc
|
||||||
|
proxmoxer
|
||||||
|
psycopg2
|
||||||
|
sqlalchemy
|
||||||
|
python-dateutil
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue