From bf19241bed9ef0a1cb8492012dc7d8b6d3793e36 Mon Sep 17 00:00:00 2001 From: Jordan Rodgers Date: Wed, 24 Jan 2018 03:26:15 -0500 Subject: [PATCH] fix renewals, add email for vm expiration --- proxstar/__init__.py | 4 ++-- proxstar/db.py | 10 ++++++++++ proxstar/mail.py | 30 ++++++++++++++++++++++++++++++ proxstar/tasks.py | 19 +++++++++++++++++++ 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 proxstar/mail.py diff --git a/proxstar/__init__.py b/proxstar/__init__.py index db31202..5aa2d31 100644 --- a/proxstar/__init__.py +++ b/proxstar/__init__.py @@ -211,8 +211,8 @@ def vm_mem(vmid, mem): def vm_renew(vmid): user = session['userinfo']['preferred_username'] proxmox = connect_proxmox() - if int(vmid) in get_user_allowed_vms( - proxmox, user) or 'rtp' in session['userinfo']['groups']: + if 'rtp' in session['userinfo']['groups'] or int( + vmid) in get_user_allowed_vms(proxmox, user): renew_vm_expire(vmid, app.config['VM_EXPIRE_MONTHS']) for interface in get_vm_interfaces(proxmox, vmid): renew_ip(starrs, get_ip_for_mac(starrs, interface[1])) diff --git a/proxstar/db.py b/proxstar/db.py index e341d2d..f1d9de0 100644 --- a/proxstar/db.py +++ b/proxstar/db.py @@ -47,6 +47,16 @@ def get_expired_vms(db): return expired +def get_expiring_vms(db): + expiring = [] + today = datetime.date.today() + expire = db.query(VM_Expiration).filter( + (VM_Expiration.expire_date - today) <= 10).all() + for vm in expire: + expiring.append(vm.id) + return expiring + + def get_user_usage_limits(db, user): limits = dict() if is_rtp(user): diff --git a/proxstar/mail.py b/proxstar/mail.py new file mode 100644 index 0000000..be691b3 --- /dev/null +++ b/proxstar/mail.py @@ -0,0 +1,30 @@ +import smtplib +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart + + +def send_email(toaddr, subject, body): + fromaddr = 'proxstar@csh.rit.edu' + msg = MIMEMultipart() + msg['From'] = fromaddr + msg['To'] = toaddr + msg['Subject'] = subject + body = body + msg.attach(MIMEText(body, 'plain')) + server = smtplib.SMTP('mail.csh.rit.edu', 25) + server.starttls() + text = msg.as_string() + server.sendmail(fromaddr, toaddr, text) + server.quit() + + +def send_vm_expire_email(user, name, days): + toaddr = "{}@csh.rit.edu".format(user) + subject = 'Proxstar VM Expiration Notice' + if days != 1: + body = "{} is expiring in {} days. If you would like to keep this VM, please log into Proxstar and renew it.".format( + name, days) + else: + body = "{} is expiring in {} day. If you would like to keep this VM, please log into Proxstar and renew it.".format( + name, days) + send_email(toaddr, subject, body) diff --git a/proxstar/tasks.py b/proxstar/tasks.py index 1a76eb4..52b3324 100644 --- a/proxstar/tasks.py +++ b/proxstar/tasks.py @@ -3,6 +3,7 @@ from flask import Flask from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from proxstar.db import * +from proxstar.mail import * from proxstar.starrs import * from proxstar.proxmox import * @@ -68,3 +69,21 @@ def process_expired_vms_task(): # delete_vm(proxmox, starrs, vmid) # delete_starrs(starrs, vmname) # delete_vm_expire(vmid) + + +def process_expiring_vms_task(): + with app.app_context(): + proxmox = connect_proxmox() + db = connect_db() + starrs = connect_starrs() + pools = get_pools(proxmox) + for pool in pools: + vms = get_vms_for_user(proxmox, pool) + for vm in vms: + vmid = vm['vmid'] + expire = get_vm_expire(db, vmid, + app.config['VM_EXPIRE_MONTHS']) + days = (expire - datetime.date.today()).days + if days in [10, 7, 3, 1]: + name = get_vm_config(proxmox, vmid)['name'] + send_vm_expire_email('com6056', name, days)