diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000000000000000000000000000000000000..810d6db84f8c195e088145f2a053988617ac39d7 --- /dev/null +++ b/.flake8 @@ -0,0 +1,9 @@ +[flake8] +count = True +max-line-length = 79 +show-source = True +statistics = True +exclude = + .git, + __pycache__, + venv diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d93cd99a0df80a4d1d81ec102262eaab431cb8b3..b813433acd0d6969592c883c2921990aac29fe29 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,15 +1,47 @@ -image: "python:3.7" +image: "python:3.6" + +# Change pip's cache directory to be inside the project directory since we can +# only cache local items. +variables: + PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" + +cache: + paths: + - .cache/pip + - venv/ before_script: - python --version - - pip install pylint + - python3 -m venv venv + - source venv/bin/activate + - pip install black==22.3.0 flake8==4.0.1 pylint==2.13.8 stages: - lint -linting: +black: + tags: + - lint + stage: lint + script: + - black --check --diff . + only: + - merge_requests + +flake8: + tags: + - lint + stage: lint + script: + - flake8 . + only: + - merge_requests + +pylint: tags: - lint stage: lint script: - - pylint --ignore=tests.py --max-line-length=120 *.py app + - pylint app *.py + only: + - merge_requests diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bcf55a7eecb2d086068cfe3bdf40c025505008f1 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,18 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.2.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - repo: https://github.com/psf/black + rev: 21.5b0 + hooks: + - id: black + - repo: https://github.com/pycqa/flake8 + rev: 3.9.1 + hooks: + - id: flake8 + - repo: https://github.com/PyCQA/pylint + rev: v2.13.8 + hooks: + - id: pylint diff --git a/README.md b/README.md index fb6c49f4037f737e34b88960114155a7ff10bf83..72f13610002f663703c5844434f5670156a24e31 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,24 @@ # 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 +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: +To clone this repo use the command: ``` $ git clone https://gitlab.rc.uab.edu/mmoo97/flask_user_reg.git $ cd flask_user_reg ``` -## Prerequisites +## Prerequisites ### Setup a Virtual Environment -- Ensure you have created a [virtual environment](https://docs.python.org/3/library/venv.html) +- 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 @@ -46,7 +46,7 @@ $ pip install -r requirements.txt - #### Mac/Linux - `$ brew update` - `$ brew install rabbitmq` - - it is recommended that you add the following line to your `.bash_profile`: + - 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 @@ -56,15 +56,37 @@ $ pip install -r requirements.txt - 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 + - 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` + - 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>`. + - 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) + +```shell +brew install pre-commit +``` + +- via pip + +```shell +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 ## 1. Connect to OHPC/OOD @@ -75,11 +97,11 @@ $ pip install -r requirements.txt 2. Locate Floating Ip for each instance: <br> <br> - According to this diagram of the network infrastructure, the IP Addresses that you will need to + 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> <br> - Note that these numbers will typically vary depending on factors in the provisioning + Note that these numbers will typically vary depending on factors in the provisioning process. 3. SSH into each machine: <br> @@ -90,21 +112,21 @@ $ pip install -r requirements.txt ``` 4. Drop Firewall: <br> - Currently, the firewall prevents us from connecting to our soon to be running flask app. + 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> + `$ 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> + In the case you need to turn the firewall back on, type: <br> `sudo systemctl start firewalld` -5. Edit Security Rules: <br> +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> + which runs on `localhost:5000` by default. Modify your __Default__ security group to + reflect the following rules: <br>  <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`. @@ -120,7 +142,7 @@ $ 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 +$ python test_producer.py ohpc ``` You should now see that the message has been sent and displayed on the ohpc node. @@ -129,7 +151,7 @@ You should now see that the message has been sent and displayed on the ohpc node 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 +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> @@ -138,15 +160,15 @@ Simply type `$ python run.py` <br> 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 +## 6. Check Job status -If all goes well, you should have your processes running in the background. Check the status of these by typing -`$ jobs`. You should now see the something similar to the following: <br> +If all goes well, you should have your processes running in the background. Check the status of these by typing +`$ 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]$ +(venv) [centos@ood flask_user_reg]$ ``` ## 7. Connect to Server @@ -157,5 +179,5 @@ address bar replacing `.xxx` with the final octet of the __OOD__ node. You shoul - 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`, +- You can view the output/errors of either the worker and flask server by opening `flask.out`, `flask.err`, `celery.out`, or `celery.err`. diff --git a/app/__init__.py b/app/__init__.py index c8e1877e5f37d59e72302cd8d2fdebe12e729b7c..45297b2db222e95da2c9dd4bab4e44d2ca5c37f2 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -58,9 +58,13 @@ def create_app(config_name): username=session['user'].get('username'), fullname=session['user'].get('fullname'), email=session['user'].get('email'), referrer=session['return_url'], cancel_url=vars.default_referrer, - cancel_msg=messages.cancel_message, pre_certification_msg=messages.pre_certification_message, + cancel_msg=messages.cancel_message, + pre_certification_msg=messages.pre_certification_message, certification_msg=messages.certification_message) + elif rc_util.check_state(session['user'].get('username')) == "ok": + return render_template('account/good_standing.html', good_standing_msg= messages.good_standing_message) + else: return render_template('auth/SignUp.html', room_id=session['uid'], username=session['user'].get('username'), diff --git a/app/templates/account/good_standing.html b/app/templates/account/good_standing.html new file mode 100644 index 0000000000000000000000000000000000000000..d66f5d908e6818acee381b77c1a3ffda0a67ded4 --- /dev/null +++ b/app/templates/account/good_standing.html @@ -0,0 +1,74 @@ +<html class="gr__rc_uab_edu"> +<title>Good Standing </title> +<head> +<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://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script> +<script src="{{ url_for('static', filename='scripts/function.js') }}"></script> + + +<link rel="shortcut icon" type="image/x-icon" href="/public/favicon.ico"> +<link rel="stylesheet" media="all" href="{{ url_for('static', filename='style/application.css') }}"> +<link rel="stylesheet" media="all" href="{{ url_for('static', filename='style/app2.css') }}"> + +<meta name="viewport" content="width=device-width, initial-scale=1"> +<style> + .navbar-inverse { background-color: rgb(0,99,65); } + button{ margin: 13px; + .important { color: #336699; }} +</style> + +</head> + + +<body data-gr-c-s-loaded="true"> +<header> + <nav class="navbar navbar-inverse navbar-static-top"> + <div class="container-fluid"> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-9" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> + <a class="navbar-brand" href="/"> UAB Research Computing</a> + </div> + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-9"> + <div class="navbar-right"> + <ul class="nav navbar-nav"> + <li> + <a target="_blank" href="https://docs.uabgrid.uab.edu/wiki/Cheaha_GettingStarted"> + <i class="fas fa-info-circle fa-fw"></i> Online Documentation + </a> + </li> + </ul> + </div> + </div> + </div> + </nav> +</header> + +<div class="container content" role="main" style="width: 100%"> + <div class="col-md-2 col-sm-2 my-col"> + <img alt="logo" height="auto" width="80%" src="{{ url_for('static', filename='img/logo_svg.svg') }}"> + <a href="https://tinyurl.com/cheahaAL" target="_blank"></a> + </div> + + <div class="col-md-10 col-sm-10 my-col"> + <div id="form-wrapper"> + <h2> Account in Good Standing </h2> + <p style="font-size:110%;"> {{ good_standing_msg|safe }}</p> + </div> + </div> +</div> + +<footer> + <div class="container-fluid"> + <div class="row"> + <div class="col-md-6 col-sm-6"> + <a href="https://osc.github.io/Open-OnDemand/"> + <img class="footer-logo" alt="Powered by Open OnDemand" height="40" style="margin-bottom: 20px" src="{{ url_for('static', filename='img/OpenOnDemand_powered_by_RGB-cb3aad5ff5350c7994f250fb334ddcc72e343233ce99eb71fda93beddd76a847.svg') }}"> + </a> + </div> + </div> + </div> +</footer> + +</body> +</html> diff --git a/messages.py b/messages.py index 6800391d4e87ea1f0a13f7b93b909941c58bf344..72af34c3cf8746fe2860919659544a373ddb4aaf 100644 --- a/messages.py +++ b/messages.py @@ -4,3 +4,4 @@ error_message = "An error occurred while creating your account. Research Computi unauthorized_message = "Your UAB Research Computing account is currently on hold.<br>Accounts are put on hold if there are changes with UAB affiliation or if there is an issue on one of the platforms.<br>Please reach out to <a href="'mailto:support@listserv.uab.edu'">Research Computing</a> or attend the weekly office hours and we'll work with you to clear your account." pre_certification_message = "Welcome back to the UAB Research Computing services page.<br>We are asking for researchers to recertify their accounts annually so that we'll know who is still actively using the systems. <br> To continue with the self certification process click on continue below" certification_message = "Welcome back to the UAB Research Computing services page.<br>The usage of this resource is governed by 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>To read and understand all UAB IT policies click <a href=' https://www.uab.edu/it/home/policies' target='_blank'>here</a><br>Verify your information in the form below and hit the Certify Account button when you are done." +good_standing_message= "Your account is in good standing. Click <a href=https://rc.uab.edu>here</a> to proceed to dashboard" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..8a8911eab457400a2abfcbb0167a3e6e3a33c6cd --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,8 @@ +[tool.black] +line-length = 79 +target-version = ['py36'] +preview = true +[tool.pylint.main] +disable = ["import-error", "unused-argument", "broad-except"] +[tool.pylint.format] +max-line-length = 79 diff --git a/tasks.py b/tasks.py index 72539c9f9bd4b6e451651c6d85736a0e8917a732..b2eddf3bf10f22e55af427fecc9ccbc0184675ac 100644 --- a/tasks.py +++ b/tasks.py @@ -90,11 +90,13 @@ def celery_certify_account(json, session): email= json['email'] fullname= json['fullname'] queuename= rc_util.encode_name(username) + updated_by= f'{username}' + host= vars.app_host print("CERTIFY : "+time.strftime("%m-%d-%Y_%H:%M:%S") + '\tUser ' + username + ' added to queue') send_msg('certifying account', room) print(username) - rc_util.certify_account(username, queuename, 'ok', 'all') + rc_util.certify_account(username, queuename, 'ok', 'all', updated_by, host) print('sent account info') print('Waiting for certification...') rc_util.consume(queuename, routing_key=f'certified.{queuename}', callback=certify_gen_f(room))