Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • rc/account-app
  • louistw/account-app
  • krish94/self-reg-form
  • dwheel7/self-reg-form
  • dwheel7/feature-reanme-self-reg-app-to-account-app
  • atlurie/account-app
  • dwheel7/account-app
7 results
Show changes
Commits on Source (36)
Showing
with 170 additions and 270 deletions
...@@ -5,7 +5,7 @@ repos: ...@@ -5,7 +5,7 @@ repos:
- id: trailing-whitespace - id: trailing-whitespace
- id: end-of-file-fixer - id: end-of-file-fixer
- repo: https://github.com/psf/black - repo: https://github.com/psf/black
rev: 21.5b0 rev: 23.3.0
hooks: hooks:
- id: black - id: black
- repo: https://github.com/pycqa/flake8 - repo: https://github.com/pycqa/flake8
......
# Introduction
This is a flask application that leverages [RabbitMQ](https://www.rabbitmq.com/) and [Celery](https://docs.celeryproject.org/en/latest/getting-started/introduction.html)
to asynchronously create a Cheaha user account. Currently the project is being developed on an Openstack cluster.
# Project Setup
To clone this repo use the command: # Introduction
```
$ git clone https://gitlab.rc.uab.edu/mmoo97/flask_user_reg.git
$ cd flask_user_reg
```
## Prerequisites
### Setup a Virtual Environment
- Ensure you have created a [virtual environment](https://docs.python.org/3/library/venv.html)
called `venv` setup running python3.
- Note, this project requires a virtual environment running __python3__ (__3.6.8__ in this case).
- Create this by navigating to you home directory via typing `$ cd` and entering the following commands:<br>
```
$ python3 -m venv ~/venv
$ source ~/venv
```
- Upon Activation, you should see the prompt update accordingly:
```
[centos@ood ~]$ <------Old Prompt
(venv) [centos@ood ~]$ <------New Prompt
```
In this case, the env name is displayed as `venv` but would change to reflect whatever name you initialized it with
in the previous step. Additionally, this example is running on the `ood node` provisioned
via __OpenStack__.
- Ensure [pip](https://docs.python.org/3/installing/index.html) is installed.
- #### Mac/Linux
- Check if installed by typing `$ pip`
- Install pip using `$ python -m pip install --user --upgrade pip`.
- #### Windows
- Check if installed using `$ py`
- Install pip using `$ py -m pip install --upgrade pip`<br><br>
- Ensure Flask and other dependencies are installed to you virtual environment using the following commands:
```
$ cd ~/your/repo/path/flask_user_reg
$ pip install -r requirements.txt
```
- Note, to install flask in your own `$HOME` use `pip install --user Flask`.
### Install RabbitMQ
(Reference: [here](https://www.rabbitmq.com/tutorials/tutorial-four-python.html))
- Install RabbitMQ server on the host machine. ([Installation Guide](https://www.rabbitmq.com/download.html))
- #### Mac/Linux
- `$ brew update`
- `$ brew install rabbitmq`
- it is recommended that you add the following line to your `.bash_profile`:
`export PATH=$PATH:/usr/local/opt/rabbitmq/sbin`.
- Start server using the command `$ rabbitmq-server`. (Note, this implementation assumes RabbitMQ is running on localhost on standard port 5672)
- #### Windows
- Download the installer from [here](https://github.com/rabbitmq/rabbitmq-server/releases) and run.
- Post install, the server should be running. To check, run `$ rabbitmqctl.bat status`.
- #### CentOS 7
- First, import signing key using `$ rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc`
- Next, install Erlang using `$ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm`
- Finally, install RabbitMq using `$ yum install rabbitmq-server-3.8.2-1.el8.noarch.rpm`
- The server is not started as a daemon by default when the RabbitMQ server package is installed. To start the
daemon by default when the system boots, as an administrator run: `$ chkconfig rabbitmq-server on`.
- As an administrator, start and stop the server as usual: <br/>`/sbin/service rabbitmq-server start`
<br/> `/sbin/service rabbitmq-server stop`
- Add the user "reggie" using the command `$ rabbitmqctl add_user reggie reggie`.
- The current configuration assumes the following username password combination. To change the password, type
`$ rabbitmqctl change_password reggie <new_password>`.
- Note that rabbitmqctl may require sudo permissions and that changing the password will require a password
change in the credentials within `test_producer.py` and `base_consumer.py` as well.
### Setup pre commit hook
- via Homebrew(Mac) This is a flask application that leverages [RabbitMQ](https://www.rabbitmq.com/) and [Celery](https://docs.celeryproject.org/en/latest/getting-started/introduction.html)
```shell to asynchronously create a Cheaha user account. Currently the project is being developed on an Openstack cluster.
brew install pre-commit
```
- via pip # Project Setup
```shell Since this project is currently being developed only on an Openstack cluster all you will need to do to get started is to either create a new cluster referencing the steps [here](https://gitlab.rc.uab.edu/rc/cod-heat-stack) or work off of your existing one that will already have everything set up as part of the cluster creation through ansible.
pip install pre-commit
```
After pre-commit is installed, run install in the repo directory:
```shell
$ pre-commit install
> pre-commit installed at .git/hooks/pre-commit
```
# Run Project # Run Project
## 1. Connect to OHPC/OOD The project should already be running if your cluster deployment ran completely and correctly. You will need to edit your hosts file to point to the node you are wanting to work on if you haven't already done so in your cluster setup.
1. Network Setup: <br>
Assuming proper steps have been run to provision your openstack cluster, your network
topology should look like the following:<br>
![Openstack Network Topology](/docs/images/network_topology.png)
2. Locate Floating Ip for each instance: <br>
![Research Computing Network](/docs/images/rc-network%20.png)<br>
According to this diagram of the network infrastructure, the IP Addresses that you will need to
connect to in order to ssh into each machine will be `164.111.161.xxx` where
`.xxx` is the last octet of your assigned Floating IP Addresses shown below.<br>
![Floating IP Addresses](/docs/images/floating_ips.png)<br>
Note that these numbers will typically vary depending on factors in the provisioning
process.
3. SSH into each machine: <br>
Now that you have the IP Addresses of the OHPC and OOD nodes, you can connect
to them via the following command in two separate shell windows/tabs: <br>
```
$ ssh centos@164.111.161.xxx
```
4. Drop Firewall: <br>
Currently, the firewall prevents us from connecting to our soon to be running flask app.
To check if the firewall is active, type: <br>
`$ sudo systemctl status firewalld` <br>
In the case the firewall is still active, type: <br>
`$ sudo systemctl stop firewalld` <br>
In the case you need to turn the firewall back on, type: <br>
`sudo systemctl start firewalld`
5. Edit Security Rules: <br>
Lastly, we want to make sure that our network it open to run on our flask application
which runs on `localhost:5000` by default. Modify your __Default__ security group to
reflect the following rules: <br>
![Security Rules](/docs/images/security_rules.png) <br>
The main takeaway/modification in these rules is that traffic is allowed in and out of port 5000.
## 2. Initialize RabbitMQ
Make sure that you are running rabbitmq via the command `sudo rabbitmq server`.
## 3. Test RabbitMQ
For a simple example on the functionality of RabbitMQ, do the following:
- Open up a new ssh terminal and ssh into your ohpc node and, in a separate window, ssh into your ood node.
- Additionally, ensure you have a rabbitmq user configured with the username and password as `reggie`.
```
# Run consumer on ohpc node
$ python base_consumer.py ohpc
```
You will notice that the script is awaiting a message to display.
To produce a message, run the following on the ood node terminal session:
```
$ python test_producer.py ohpc
```
You should now see that the message has been sent and displayed on the ohpc node. From here you can confirm that the account-app is working by navigating to yourname.rc.uab.edu/account-app.
## 4. Celery Worker
In order to execute our tasks asychronously, we create a celery worker using the fllowing: <br>
`$ celery -A tasks worker --loglevel=info --concurrency=4 1> ~/celery.out 2> ~/celery.err &` <br><br>
In this case, the `celery -A tasks worker --loglevel=info --concurrency=4` portion of the command
is what is initiating the worker and the remainder serves to write the stdout and stderr to two separate files
located in the home directory and to run the process in the background. <br>
## 5. Initialize the Flask App For an example of how the account-app/rabbitmq-agents workflow progresses please refer to this chart ![chart](/docs/images/rabbitmq-agents-flowchart.png)
Simply type `$ python run.py` <br> and this for information about the messages being sent ![](/docs/images/rabbitmq-agents-messages.png)
Alternatively, type `$ python run.py > ~/flask.out 2> ~/flask.err &` to run the process in the background
and output to files in the home directory.
## 6. Check Job status
If all goes well, you should have your processes running in the background. Check the status of these by typing # Contribute to Project
`$ jobs`. You should now see the something similar to the following: <br>
```
(venv) [centos@ood flask_user_reg]$ jobs
[1]- Running celery -A tasks worker --loglevel=info --concurrency=4 > ~/celery.out 2> ~/celery.err &
[2]+ Running python run.py > ~/server.out 2> ~/server.err &
(venv) [centos@ood flask_user_reg]$
```
## 7. Connect to Server To begin you will need to navigate to /var/www/ood/register/register/account \(this may change in the future when upstream projects are updated to allow custom repos/project names to be injected\) and checkout your branch. From here you will also need to run `git config --global user.name "Your Name"` and `git config --global user.email "you@example.com"` to make sure that your commits will be properly tracked.
Open a new browser window and connect to the __OOD__ node by typing `http://164.111.161.xxx:5000` in the \ No newline at end of file
address bar replacing `.xxx` with the final octet of the __OOD__ node. You should see something like this: <br>
![Self Registration Site](/docs/images/site_example.png) <br>
## 8. Key Info/Observe
- Fill out the form and hit "Submit"
- You should see an overlay signifying the account is being created. After 5 seconds it should disappear and signify the account creation has been successful.
- You can now enter the command `kill %1 %2` to terminate the celery worker and the flask server.
- You can view the output/errors of either the worker and flask server by opening `flask.out`, `flask.err`,
`celery.out`, or `celery.err`.
"""
Initialize the main flask app
"""
# app/__init__.py # app/__init__.py
# local imports # standard imports
from __future__ import print_function from __future__ import print_function
import vars
import messages import sys
# third-party imports
import uuid import uuid
from flask import Flask, redirect, url_for, request, render_template, flash, session, send_from_directory
from flask_cors import CORS # third-party imports
from flask import Flask, render_template, request, session
from flask_bootstrap import Bootstrap from flask_bootstrap import Bootstrap
import random from flask_cors import CORS
import os
import json # local imports
import sys import app_vars
import re import messages
sys.path.append(app_vars.rabbitmq_agents_loc)
# pylint: disable=wrong-import-order,wrong-import-position
import rc_util # noqa: E402
# pylint: enable=wrong-import-order,wrong-import-position
sys.path.append(vars.rabbitmq_agents_loc)
import rc_util
def create_app(config_name): def create_app(config_name):
app = Flask(__name__, static_folder='static') # initialization of the flask app """
cors = CORS(app, resources={r"/*": {"origins": vars.cors_allowed_origins}}) Create main flask app
Bootstrap(app) # allowing app to use bootstrap
def get_authorized_user(): input:
config_name: environment of the app running
output:
Flask instance
"""
app = Flask(
__name__, static_folder="static"
) # initialization of the flask app
CORS(app, resources={r"/*": {"origins": app_vars.cors_allowed_origins}})
Bootstrap(app) # allowing app to use bootstrap
def get_authorized_user():
user = { user = {
"username": re.search("([^!]+?)(@uab\.edu)?$", request.headers.get("Persistent-Id")).group(1), "username": request.headers.get("REMOTE_USER"),
"fullname": f'{request.headers.get("Givenname")} {request.headers.get("Sn")}', "fullname": request.headers.get("Displayname"),
"email": request.headers.get("Mail"), "email": request.headers.get("Mail"),
"eppa": request.headers.get("Unscoped-Affiliation"), "eppa": request.headers.get("Unscoped-Affiliation"),
} }
return user return user
@app.route('/', methods=['GET', 'POST']) # initial route to display the reg page @app.route(
"/", methods=["GET", "POST"]
) # initial route to display the reg page
def index(): def index():
valid_eppa = app_vars.valid_eppa
valid_eppa = vars.valid_eppa if "uid" not in session:
session["uid"] = str(uuid.uuid4())
if 'uid' not in session: if "user" not in session:
session['uid']=str(uuid.uuid4())
if 'user' not in session:
session["user"] = get_authorized_user() session["user"] = get_authorized_user()
session['return_url'] = request.args.get('redir', vars.default_referrer) session["return_url"] = request.args.get(
"redir", app_vars.default_referrer
if (not any(item in session['user'].get('eppa') for item in valid_eppa)): )
return render_template('account/unauthorized.html', unauthorized_msg=messages.unauthorized_message)
if "eppa" in request.headers:
if rc_util.check_state(session['user'].get('username')) == "hold": if not any(
return render_template('account/hold.html', account_hold_msg=messages.account_hold_message) item in session["user"].get("eppa") for item in valid_eppa
):
elif rc_util.check_state(session['user'].get('username')) == "certification": return render_template(
return render_template('account/certify.html', room_id=session['uid'], "account/unauthorized.html",
username=session['user'].get('username'), unauthorized_msg=messages.unauthorized_message,
fullname=session['user'].get('fullname'), email=session['user'].get('email'), docs_url=app_vars.docs_url,
referrer=session['return_url'], cancel_url=vars.default_referrer, )
cancel_msg=messages.cancel_message,
pre_certification_msg=messages.pre_certification_message, if rc_util.check_state(session["user"].get("username")) == "hold":
certification_msg=messages.certification_message) return render_template(
"account/hold.html",
elif rc_util.check_state(session['user'].get('username')) == "ok": account_hold_msg=messages.account_hold_message,
return render_template('account/good_standing.html', good_standing_msg= messages.good_standing_message) docs_url=app_vars.docs_url,
)
else:
return render_template('auth/SignUp.html', room_id=session['uid'], if (
username=session['user'].get('username'), rc_util.check_state(session["user"].get("username"))
fullname=session['user'].get('fullname'), email=session['user'].get('email'), == "certification"
referrer=session['return_url'], cancel_url=vars.default_referrer, or rc_util.check_state(session["user"].get("username"))
welcome_msg=messages.welcome_message, == "pre_certification"
cancel_msg=messages.cancel_message, ):
error_msg=messages.error_message) return render_template(
"account/certify.html",
room_id=session["uid"],
username=session["user"].get("username"),
fullname=session["user"].get("fullname"),
email=session["user"].get("email"),
referrer=session["return_url"],
cancel_url=app_vars.default_referrer,
cancel_msg=messages.cancel_message,
pre_certification_msg=messages.pre_certification_message,
certification_msg=messages.certification_message,
docs_url=app_vars.docs_url,
)
if rc_util.check_state(session["user"].get("username")) == "ok":
return render_template(
"account/good_standing.html",
good_standing_msg=messages.good_standing_message,
docs_url=app_vars.docs_url,
)
return render_template(
"auth/SignUp.html",
room_id=session["uid"],
username=session["user"].get("username"),
fullname=session["user"].get("fullname"),
email=session["user"].get("email"),
referrer=session["return_url"],
cancel_url=app_vars.default_referrer,
welcome_msg=messages.welcome_message,
cancel_msg=messages.cancel_message,
error_msg=messages.error_message,
docs_url=app_vars.docs_url,
)
# misc page error catching # misc page error catching
@app.errorhandler(403) @app.errorhandler(403)
def forbidden(error): def forbidden(error):
return render_template('errors/403.html', title='Forbidden'), 403 return render_template("errors/403.html", title="Forbidden"), 403
@app.errorhandler(404) @app.errorhandler(404)
def page_not_found(error): def page_not_found(error):
return render_template('errors/404.html', title='Page Not Found'), 404 return render_template("errors/404.html", title="Page Not Found"), 404
@app.errorhandler(500) @app.errorhandler(500)
def internal_server_error(error): def internal_server_error(error):
return render_template('errors/500.html', title='Server Error'), 500 return render_template("errors/500.html", title="Server Error"), 500
return app return app
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -9,11 +9,10 @@ function preCertification() { ...@@ -9,11 +9,10 @@ function preCertification() {
} }
} }
function check() { function check() {
var submitButton = document.getElementById("submit"); var submitButton = document.getElementById("submit");
let ckbox1 = document.getElementById('agree1'); let ckbox = document.getElementById('agree');
let ckbox2 = document.getElementById('agree2'); submitButton.disabled = !(ckbox.checked);
submitButton.disabled = !(ckbox1.checked && ckbox2.checked);
}; };
function displayloading1() { function displayloading1() {
...@@ -50,7 +49,7 @@ function renderDom(title, message, error_msg) { ...@@ -50,7 +49,7 @@ function renderDom(title, message, error_msg) {
var error_button = document.createElement("BUTTON"); var error_button = document.createElement("BUTTON");
error_button.innerHTML = 'Read Error Message'; error_button.innerHTML = 'Read Error Message';
document.getElementById("form-wrapper").appendChild(error_button); document.getElementById("form-wrapper").appendChild(error_button);
error_button.onclick = function(){document.getElementById("form-wrapper").innerHTML += "<br>" +error_msg} error_button.onclick = function(){document.getElementById("form-wrapper").innerHTML += "<br>" +error_msg}
} }
} }
......
This diff is collapsed.
<html class="gr__rc_uab_edu"> <html class="gr__rc_uab_edu">
<title>Annual Certification</title> <title>Annual Account Certification</title>
<head> <head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script>
...@@ -21,16 +21,16 @@ ...@@ -21,16 +21,16 @@
}); });
socket.on( 'certified', function( msg ) { socket.on( 'certified', function( msg ) {
$('#myModal2 .modal-title').text("Account Certification Successful"); $('#myModal2 .modal-title').text("Account Certification Successful.");
$('#myModal2 .modal-body').text("Redirecting..."); $('#myModal2 .modal-body').text("Please allow 10-15 minutes for SSH access to be restored for your account. \nRedirecting...");
setTimeout(() => { setTimeout(() => {
window.location.replace('{{ referrer }}'); window.location.replace('{{ referrer }}');
}, 5000); }, 5000);
}); });
socket.on( 'certify error', function( msg ) { socket.on( 'certify error', function( msg ) {
console.log(msg); console.log(msg);
$('#myModal2').modal('hide'); $('#myModal2').modal('hide');
renderDom("Account Certification Error", "{{ error_msg }}", msg); renderDom("Account Certification Error", "{{ error_msg }}", msg);
}); });
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
<div class="navbar-right"> <div class="navbar-right">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li> <li>
<a target="_blank" href="https://uabrc.github.io/"> <a target="_blank" href="{{ docs_url }}">
<i class="fas fa-info-circle fa-fw"></i> Online Documentation <i class="fas fa-info-circle fa-fw"></i> Online Documentation
</a> </a>
</li> </li>
...@@ -82,7 +82,7 @@ ...@@ -82,7 +82,7 @@
<div class="col-md-10 col-sm-10 my-col"> <div class="col-md-10 col-sm-10 my-col">
<div id="form-wrapper"> <div id="form-wrapper">
<h2> Annual Certification</h2> <h2> Annual Account Certification</h2>
<div id="pre-certify"> <div id="pre-certify">
<p style="font-size:110%;"> {{ pre_certification_msg |safe }}</p> <p style="font-size:110%;"> {{ pre_certification_msg |safe }}</p>
<div class="col-md-7 col-sm-7 my-col"> <div class="col-md-7 col-sm-7 my-col">
...@@ -103,9 +103,8 @@ ...@@ -103,9 +103,8 @@
<label for="email" class="control-label">Email:</label>&#9;<input id="email" class="form-control" placeholder="Enter Email" required><br> <label for="email" class="control-label">Email:</label>&#9;<input id="email" class="form-control" placeholder="Enter Email" required><br>
</div> </div>
<div class="col-md-10 col-sm-10 my-col"> <div class="col-md-10 col-sm-10 my-col">
<br><input class="checks" id ="agree1" type="checkbox" name="agree" value="agree" onchange= check() /> I have read & accept UAB IT's <a href="https://secure2.compliancebridge.com/uab/public/index.php?fuseaction=print.preview&docID=786" target="_blank">Acceptable Use Policy</a> and <a href="https://www.uab.edu/it/home/policies/data-classification/classification-overview" target="_blank">Data Classification Policy</a><br/> <br><input class="checks" id ="agree" type="checkbox" name="agree" value="agree" onchange= check() /> I have read & accept UAB <a href="https://secure2.compliancebridge.com/uab/public/index.php?fuseaction=print.preview&docID=786" target="_blank">Acceptable Use</a>, <a href="https://www.uab.edu/it/home/policies/data-classification/classification-overview" target="_blank">Data Classification</a> and all other Information Technology <a href="https://www.uab.edu/it/home/policies" target="_blank">Policies.</a><br/>
<br><input class="checks" id ="agree2" type="checkbox" name="agree" value="agree" onchange= check() /> I also understand that it is my responsibility to follow all relevant <a href="https://www.uab.edu/it/home/policies" target="_blank">UAB IT policies</a> when using this resource.<br/> <br><button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="renderDom('Account Certification Cancelled','{{ cancel_msg |safe }}', null)">Cancel</button>
<br><button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="renderDom('Account Certification Cancelled','{{ cancel_msg |safe }}', null)">Cancel</button>
<button class="btn btn-primary btn-md" disabled id="submit" name="submit" type="button" value="Submit" onclick="displayloading1();certify_account()"> Certify Account</button> <button class="btn btn-primary btn-md" disabled id="submit" name="submit" type="button" value="Submit" onclick="displayloading1();certify_account()"> Certify Account</button>
</div> </div>
</form> </form>
...@@ -113,7 +112,7 @@ ...@@ -113,7 +112,7 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="modal fade" id="overlayModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static" data-keyboard="false"> <div class="modal fade" id="overlayModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog modal-sm" role="document"> <div class="modal-dialog modal-sm" role="document">
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
<div class="navbar-right"> <div class="navbar-right">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li> <li>
<a target="_blank" href="https://docs.uabgrid.uab.edu/wiki/Cheaha_GettingStarted"> <a target="_blank" href="{{ docs_url }}">
<i class="fas fa-info-circle fa-fw"></i> Online Documentation <i class="fas fa-info-circle fa-fw"></i> Online Documentation
</a> </a>
</li> </li>
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
<p style="font-size:110%;"> {{ good_standing_msg|safe }}</p> <p style="font-size:110%;"> {{ good_standing_msg|safe }}</p>
</div> </div>
</div> </div>
</div> </div>
<footer> <footer>
<div class="container-fluid"> <div class="container-fluid">
......
<html class="gr__rc_uab_edu"> <html class="gr__rc_uab_edu">
<title>Account on Hold</title> <title>Account On Hold</title>
<head> <head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script>
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
<div class="navbar-right"> <div class="navbar-right">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li> <li>
<a target="_blank" href="https://uabrc.github.io/"> <a target="_blank" href="{{ docs_url }}">
<i class="fas fa-info-circle fa-fw"></i> Online Documentation <i class="fas fa-info-circle fa-fw"></i> Online Documentation
</a> </a>
</li> </li>
...@@ -52,11 +52,11 @@ ...@@ -52,11 +52,11 @@
<div class="col-md-10 col-sm-10 my-col"> <div class="col-md-10 col-sm-10 my-col">
<div id="form-wrapper"> <div id="form-wrapper">
<h2> Account on Hold </h2> <h2> Account On Hold </h2>
<p style="font-size:110%;"> {{ account_hold_msg |safe }}</p> <p style="font-size:110%;"> {{ account_hold_msg |safe }}</p>
</div> </div>
</div> </div>
</div> </div>
<footer> <footer>
<div class="container-fluid"> <div class="container-fluid">
......
<html class="gr__rc_uab_edu"> <html class="gr__rc_uab_edu">
<title>User Authorization error </title> <title> Account Unauthorized </title>
<head> <head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script>
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
<div class="navbar-right"> <div class="navbar-right">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li> <li>
<a target="_blank" href="https://uabrc.github.io/"> <a target="_blank" href="{{ docs_url }}">
<i class="fas fa-info-circle fa-fw"></i> Online Documentation <i class="fas fa-info-circle fa-fw"></i> Online Documentation
</a> </a>
</li> </li>
...@@ -52,11 +52,11 @@ ...@@ -52,11 +52,11 @@
<div class="col-md-10 col-sm-10 my-col"> <div class="col-md-10 col-sm-10 my-col">
<div id="form-wrapper"> <div id="form-wrapper">
<h2> Account Authorization error </h2> <h2> Account Unauthorized </h2>
<p style="font-size:110%;"> {{ unauthorized_msg |safe }}</p> <p style="font-size:110%;"> {{ unauthorized_msg |safe }}</p>
</div> </div>
</div> </div>
</div> </div>
<footer> <footer>
<div class="container-fluid"> <div class="container-fluid">
......
...@@ -21,12 +21,16 @@ ...@@ -21,12 +21,16 @@
}); });
socket.on( 'account ready', function( msg ) { socket.on( 'account ready', function( msg ) {
window.location.replace('{{ referrer }}'); $('#myModal2 .modal-title').text("Account Creation Successful");
$('#myModal2 .modal-body').text("Redirecting...");
setTimeout(() => {
window.location.replace('{{ referrer }}');
}, 5000);
}); });
socket.on( 'account error', function( msg ) { socket.on( 'account error', function( msg ) {
console.log(msg); console.log(msg);
$('#myModal2').modal('hide'); $('#myModal2').modal('hide');
renderDom("Account Create Error", "{{ error_msg |safe}}", msg); renderDom("Account Create Error", "{{ error_msg |safe}}", msg);
}); });
...@@ -59,7 +63,7 @@ ...@@ -59,7 +63,7 @@
<div class="navbar-right"> <div class="navbar-right">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li> <li>
<a target="_blank" href="https://uabrc.github.io/"> <a target="_blank" href="{{ docs_url }}">
<i class="fas fa-info-circle fa-fw"></i> Online Documentation <i class="fas fa-info-circle fa-fw"></i> Online Documentation
</a> </a>
</li> </li>
...@@ -80,7 +84,7 @@ ...@@ -80,7 +84,7 @@
<div id="form-wrapper"> <div id="form-wrapper">
<h2>Welcome to UAB Research Computing</h2> <h2>Welcome to UAB Research Computing</h2>
<p style="font-size:110%;"> {{ welcome_msg |safe }}</p> <p style="font-size:110%;"> {{ welcome_msg |safe }}</p>
<div id="user-input"> <div id="user-input">
<form id="signup" data-toggle="validator" role="form" action="." method="post" onsubmit=""> <form id="signup" data-toggle="validator" role="form" action="." method="post" onsubmit="">
<div class="col-md-7 col-sm-7 my-col"> <div class="col-md-7 col-sm-7 my-col">
<label for="username" class="control-label">Blazer Id:</label>&#9;<input id="username" class="form-control" placeholder="Enter Username" required><br> <label for="username" class="control-label">Blazer Id:</label>&#9;<input id="username" class="form-control" placeholder="Enter Username" required><br>
...@@ -96,16 +100,15 @@ ...@@ -96,16 +100,15 @@
<textarea class="form-control" id="reason" name="reason" placeholder="Enter Reason for Account Request" required></textarea><br> <textarea class="form-control" id="reason" name="reason" placeholder="Enter Reason for Account Request" required></textarea><br>
</div> </div>
<div class="col-md-10 col-sm-10 my-col"> <div class="col-md-10 col-sm-10 my-col">
<br><input class="checks" id ="agree1" type="checkbox" name="agree" value="agree" onchange= check() /> I have read & accept UAB IT's <a href="https://secure2.compliancebridge.com/uab/public/index.php?fuseaction=print.preview&docID=786" target="_blank">Acceptable Use Policy</a> and <a href="https://www.uab.edu/it/home/policies/data-classification/classification-overview" target="_blank">Data Classification Policy</a><br/> <br><input class="checks" id ="agree" type="checkbox" name="agree" value="agree" onchange= check() /> I have read & accept UAB <a href="https://secure2.compliancebridge.com/uab/public/index.php?fuseaction=print.preview&docID=786" target="_blank">Acceptable Use</a>, <a href="https://www.uab.edu/it/home/policies/data-classification/classification-overview" target="_blank">Data Classification</a> and all other Information Technology <a href="https://www.uab.edu/it/home/policies" target="_blank">Policies.</a><br/>
<br><input class="checks" id ="agree2" type="checkbox" name="agree" value="agree" onchange= check() /> I also understand that it is my responsibility to follow all relevant <a href="https://www.uab.edu/it/home/policies" target="_blank">UAB IT policies</a> when using this resource.<br/> <br><button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="renderDom('Account Creation Cancelled','{{ cancel_msg |safe }}', null)">Cancel</button>
<br><button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="renderDom('Account Creation Cancelled','{{ cancel_msg |safe }}', null)">Cancel</button>
<button class="btn btn-primary btn-md" disabled id="submit" name="submit" type="button" value="Submit" onclick="displayloading1();request_account()"> Create Account</button> <button class="btn btn-primary btn-md" disabled id="submit" name="submit" type="button" value="Submit" onclick="displayloading1();request_account()"> Create Account</button>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="modal fade" id="overlayModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static" data-keyboard="false"> <div class="modal fade" id="overlayModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog modal-sm" role="document"> <div class="modal-dialog modal-sm" role="document">
......
...@@ -11,4 +11,4 @@ ...@@ -11,4 +11,4 @@
You will be emailed as soon as your request has been fulfilled. You will be emailed as soon as your request has been fulfilled.
</p> </p>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -12,4 +12,4 @@ ...@@ -12,4 +12,4 @@
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -9,4 +9,4 @@ ...@@ -9,4 +9,4 @@
<p>Page Not Found</p> <p>Page Not Found</p>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -9,4 +9,4 @@ ...@@ -9,4 +9,4 @@
<p>Internal Server Error</p> <p>Internal Server Error</p>
</body> </body>
</html> </html>
\ No newline at end of file
"""
Define different environment running the app
"""
# config.py # config.py
...@@ -34,8 +38,7 @@ class TestingConfig(Config): ...@@ -34,8 +38,7 @@ class TestingConfig(Config):
app_config = { app_config = {
"development": DevelopmentConfig,
'development': DevelopmentConfig, "production": ProductionConfig,
'production': ProductionConfig, "testing": TestingConfig,
'testing': TestingConfig
} }
docs/images/floating_ips.png

219 KiB

docs/images/network_topology.png

127 KiB