diff --git a/app/__init__.py b/app/__init__.py index 4e24858163f2acdacefa26d074449ce802919c99..463563425ce2f06a177c0ba9102163cfcfb57d8d 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -7,6 +7,7 @@ from __future__ import print_function import uuid from flask import Flask, redirect, url_for, request, render_template, flash, session from flask_bootstrap import Bootstrap +import random def create_app(config_name): @@ -19,7 +20,9 @@ def create_app(config_name): @app.route('/', methods=['GET', 'POST']) # initial route to display the reg page def index(): global return_url - username = "name_test" + + if 'username' not in session: + session['username'] = "name_test" + str(random.randint(0, 10000)) if 'uid' not in session: session['uid']=str(uuid.uuid4()) @@ -28,7 +31,7 @@ def create_app(config_name): return_url = request.args.get("redir") or "/pun/sys/dashboard" if name != "": - return render_template('auth/SignUp.html', user=username) + return render_template('auth/SignUp.html', user=session['username'], room_id=session['uid']) # misc page error catching @app.errorhandler(403) diff --git a/app/static/scripts/function.js b/app/static/scripts/function.js index 3c4d5cb848d88bdbfe6eddfdd1dcd68c0fa4b7d6..3517c02aaff4bbf55ecabe98227bc868f61bdceb 100644 --- a/app/static/scripts/function.js +++ b/app/static/scripts/function.js @@ -20,10 +20,10 @@ function request_account() { socket.emit('request account', { fullname: document.getElementById("fullname").value, reason: document.getElementById("reason").value, - username: document.getElementById("username").innerText + username: document.getElementById("bid").value }) } function refresh() { document.location.reload(true); -} \ No newline at end of file +} diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html index 8f60a381cf1705608839c72340719edbf01619ba..ea1b57f0318fab5403bd51cde58c26bcba0ac208 100644 --- a/app/templates/auth/SignUp.html +++ b/app/templates/auth/SignUp.html @@ -7,6 +7,7 @@ <script src="static/scripts/function.js"></script> <script> + console.info('Room ID: {{ room_id }}'); var socket = io.connect('http://' + document.domain + ':' + location.port); socket.on( 'connect', function() { @@ -85,10 +86,14 @@ </a> </div> - <h2>Hello, <span id="username">{{ user }}</span>!</h2> +<!-- <h2>Hello, <span id="username">{{ user }}</span>!</h2> --> + + <h2>Hi, </h2> <div id="test"> <form action="." method="post" onsubmit=""> <div class="signUpContainer"> + <label><b><label for="username">Blazer Id: </label><br></b></label> + <input class="form-control" id="bid" name="bid" placeholder="Enter BlazerId" required="" type="text"> <label><b><label for="fullname">Full Name: </label><br></b></label> <input class="form-control" id="fullname" name="fullname" placeholder="Enter Full Name" required="" type="text"> <label><b><label for="reason">Reason for Requesting Account: </label><br></b></label> diff --git a/base_consumer.py b/base_consumer.py deleted file mode 100644 index ebfe9dd0a65c9b4c9cdcf9b21cb1d15bf7dd2d9a..0000000000000000000000000000000000000000 --- a/base_consumer.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python -import pika # python client -import sys - -credentials = pika.PlainCredentials('reggie', 'reggie') -parameters = pika.ConnectionParameters('ood', - 5672, - '/', - credentials) -connection = pika.BlockingConnection(parameters) - -channel = connection.channel() - -channel.exchange_declare(exchange='direct_logs', exchange_type='direct') # create exchange to pass messages - -result = channel.queue_declare(queue='', exclusive=True) -queue_name = result.method.queue # creates a random name for the newly generated queue - -nodes = sys.argv[1:] -if not nodes: - sys.stderr.write("Usage: %s [ood] [ohpc] [manager]\n" % sys.argv[0]) - sys.exit(1) - -for node in nodes: - channel.queue_bind( - exchange='direct_logs', queue=queue_name, routing_key=node) # combine exchange, queue, and define routing name - -print(' [*] Waiting for logs. To exit press CTRL+C') - - -def callback(ch, method, properties, body): - print(" [x] %r:%r" % (method.routing_key, body)) - print('[%r] User creation task is done.' % method.routing_key) - - -channel.basic_consume( - queue=queue_name, on_message_callback=callback, auto_ack=True) # ingest messages, and assume delivered via auto_ack - -channel.start_consuming() # initiate message ingestion diff --git a/requirements.txt b/requirements.txt index c4d8f156fda234455b5f1ba290fcd017ef6241f5..482a9fe0ddfc26bcf7cf63c749938f4c36f18f73 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,65 +1,25 @@ -alembic==1.4.0 -appdirs==1.4.3 -argh==0.26.2 -blinker==1.4 -certifi==2019.11.28 -chardet==3.0.4 +amqp==2.5.2 +billiard==3.6.2.0 +celery==4.4.0 Click==7.0 -distlib==0.3.0 -dnspython==1.16.0 dominate==2.4.0 -enum34==1.1.6 -eventlet==0.25.1 -filelock==3.0.12 Flask==1.1.1 Flask-Bootstrap==3.3.7.1 -Flask-Dance==3.0.0 -Flask-DebugToolbar==0.11.0 -Flask-Login==0.5.0 -Flask-Migrate==2.5.2 -Flask-OAuth==0.12 -Flask-OAuthlib==0.9.5 Flask-SocketIO==4.2.1 -Flask-SQLAlchemy==2.4.1 Flask-Testing==0.7.1 -Flask-WTF==0.14.3 +gevent==1.4.0 greenlet==0.4.15 -gunicorn==20.0.4 -httplib2==0.17.0 -idna==2.9 importlib-metadata==1.5.0 itsdangerous==1.1.0 Jinja2==2.11.1 -lazy==1.4 -Mako==1.1.1 +kombu==4.6.7 MarkupSafe==1.1.1 -monotonic==1.5 -oauth2==1.9.0.post1 -oauthlib==3.1.0 -pathtools==0.1.2 -pbr==5.4.4 pika==1.1.0 -python-dateutil==2.8.1 -python-editor==1.0.4 python-engineio==3.11.2 python-socketio==4.4.0 pytz==2019.3 -PyYAML==5.3 -requests==2.23.0 -requests-oauthlib==1.3.0 six==1.14.0 -SQLAlchemy==1.3.13 -SQLAlchemy-Utils==0.36.1 -stevedore==1.32.0 -supervisor==4.1.0 -urllib3==1.25.8 -URLObject==2.4.3 -virtualenv==20.0.4 -virtualenv-clone==0.5.3 -virtualenvwrapper==4.8.4 +vine==1.3.0 visitor==0.1.3 -watchdog==0.10.2 Werkzeug==1.0.0 -wincertstore==0.2 -WTForms==2.2.1 zipp==3.0.0 diff --git a/run.py b/run.py index 2f96f6baa9f7f075f439edc8085566d4513605f8..0a4251f76c6a4705393f23353254280327b8ef61 100644 --- a/run.py +++ b/run.py @@ -3,8 +3,9 @@ import os import time import signal +import tasks + -import pika from flask import session from flask_socketio import SocketIO, join_room @@ -15,15 +16,14 @@ app = create_app(config_name) app.config['SECRET_KEY'] = 'vnkdjnfjknfl1232#' socketio = SocketIO(app) -global username_global +# global username_global +# global room_global def create_account(username, fullname, reason): # Todo: Ravi's and Louis's code goes here print (time.strftime("%m-%d-%Y_%H:%M:%S") + '\tUser ' + username + ' added to queue') - global username_global - username_global = username - socketio.emit("creating account") + socketio.emit("creating account", room=room_global) signal.signal(signal.SIGALRM, account_agent) signal.alarm(5) @@ -31,17 +31,18 @@ def create_account(username, fullname, reason): def account_agent(*args): # Todo: Code to create a consumer based on the username goes here # Todo: Goal is to have it listening for confirmation. - global username_global - username = username_global + username = session['username'] + room = str(session['uid']) + print(time.strftime("%m-%d-%Y_%H:%M:%S") + '\tAccount successfully created for ' + username) - socketio.emit("account ready") + socketio.emit("account ready", room=room) return True @socketio.on('user connected') def user_connected(json, methods=['GET', 'POST']): - username = json["user"] + username = json["user"] room = str(session['uid']) join_room(room) @@ -53,15 +54,18 @@ def user_connected(json, methods=['GET', 'POST']): @socketio.on('request account') def request_account(json, methods=['GET', 'POST']): print (time.strftime("%m-%d-%Y_%H:%M:%S") + '\tQueue request received: ' + str(json)) - + print(json) + room = str(session['uid']) + socketio.emit("creating account", room=room) try: - create_account(json['username'], json['fullname'], json['reason']) + # create_account(json['username'], json['fullname'], json['reason']) + tasks.celery_create_account(json['username'], json['fullname'], json['reason'], room, socketio) except Exception as e: print(time.strftime("%m-%d-%Y_%H:%M:%S") + "\tError in account creation: ", e) - socketio.emit("Account creation failed") + socketio.emit("Account creation failed", room) if __name__ == '__main__': # app.run() - socketio.run(app) + socketio.run(app, host='0.0.0.0') diff --git a/tasks.py b/tasks.py new file mode 100644 index 0000000000000000000000000000000000000000..18839c215cbc1f548cd5f7b00e519b1f5ccda224 --- /dev/null +++ b/tasks.py @@ -0,0 +1,26 @@ +from celery import Celery +import time +from flask_socketio import SocketIO +import subprocess + +from gevent import monkey +monkey.patch_all(subprocess=True) + +broker_url = 'amqp://reggie:reggie@ohpc:5672/' +#broker_url = 'amqp://' +celery = Celery('flask_user_reg', broker=broker_url) + +# socketio = SocketIO(message_queue='amqp:///socketio') + + +@celery.task +def celery_create_account(username, fullname, reason, room, socketio): + # Todo: Ravi's and Louis's code goes here + print(time.strftime("%m-%d-%Y_%H:%M:%S") + '\tUser ' + username + ' added to queue') + socketio.emit("creating account", room=room) + print(username) + subprocess.call(["/opt/rabbitmq_agents/flask_producer.py", "ohpc_account_create", username]) + time.sleep(5) + print(time.strftime("%m-%d-%Y_%H:%M:%S") + '\tAccount successfully created for ' + username) + socketio.emit('account ready', room=room) + diff --git a/test_producer.py b/test_producer.py deleted file mode 100644 index ce69cf63498e5dae3ee11404c433c20ad7553a59..0000000000000000000000000000000000000000 --- a/test_producer.py +++ /dev/null @@ -1,23 +0,0 @@ -import pika -import sys - -# Begin RabbitMQ process. -credentials = pika.PlainCredentials('reggie', 'reggie') -parameters = pika.ConnectionParameters('ood', - 5672, - '/', - credentials) - -connection = pika.BlockingConnection(parameters) - -channel = connection.channel() - -channel.exchange_declare(exchange='direct_logs', exchange_type='direct') - -node = sys.argv[1] if len(sys.argv) > 1 else 'info' -message = ' '.join(sys.argv[2:]) or 'Hello World!' -channel.basic_publish( - exchange='direct_logs', routing_key=node, body=message) -print(" [x] Sent %r:%r" % (node, message)) - -connection.close()