| @@ -24,5 +24,5 @@ ENTRYPOINT ["/entrypoint.sh"] | |||||
| # Allow waiting script to be executed | # Allow waiting script to be executed | ||||
| RUN chmod +x ./wait-for-it.sh | RUN chmod +x ./wait-for-it.sh | ||||
| # Hold the webserver from launching until the database is ready. Default timeout = 30s | |||||
| CMD ["./wait-for-it.sh", "-h", "10.5.0.5", "db:3306", "--", "/start.sh"] | |||||
| # Hold the webserver from launching until the database is ready with 50s timeout | |||||
| CMD ["./wait-for-it.sh", "-t", "50", "-h", "10.5.0.5", "db:3306", "--", "/start.sh"] | |||||
| @@ -0,0 +1,15 @@ | |||||
| from web import form | |||||
| # Define the login form | |||||
| login_form = form.Form( | |||||
| form.Textbox("username", description="Username"), | |||||
| form.Password("password", description="Password"), | |||||
| form.Button("Log In", type="submit", description="Login"), | |||||
| ) | |||||
| # Define the register form | |||||
| register_form = form.Form( | |||||
| form.Textbox("username", description="Username"), | |||||
| form.Password("password", description="Password"), | |||||
| form.Button("Register", type="submit", description="Register"), | |||||
| ) | |||||
| @@ -1,111 +1,7 @@ | |||||
| import web | |||||
| from web import form | |||||
| import mysql.connector | |||||
| # Define application routes | |||||
| urls = ( | |||||
| '/', 'index', | |||||
| '/logout', 'logout', | |||||
| '/register', 'register', | |||||
| ) | |||||
| # Access datavase using mysql connector package | |||||
| db = mysql.connector.connect( | |||||
| user='root', | |||||
| password='root', | |||||
| host='10.5.0.5', | |||||
| database='db' | |||||
| ) | |||||
| # Initialize application using the web py framework | |||||
| app = web.application(urls, globals()) | |||||
| # Get html templates | |||||
| render = web.template.render('templates/') | |||||
| # Workaround to use sessions with reloader (debugger) http://webpy.org/cookbook/session_with_reloader | |||||
| if web.config.get('_session') is None: | |||||
| session = web.session.Session(app, web.session.DiskStore("sessions"), initializer={"username": None}) | |||||
| web.config._session = session | |||||
| else: | |||||
| session = web.config._session | |||||
| # Add session to global variables | |||||
| render._add_global(session, 'session') | |||||
| class index(): | |||||
| # Define the login form | |||||
| login_form = form.Form( | |||||
| form.Textbox("username", description="Username"), | |||||
| form.Password("password", description="Password"), | |||||
| form.Button("Log In", type="submit", description="Login"), | |||||
| ) | |||||
| # Get main page | |||||
| def GET(self): | |||||
| # Show other registered users if the user is logged in | |||||
| if session.username: | |||||
| cursor = db.cursor() | |||||
| query = ("SELECT userid, username from users") | |||||
| cursor.execute(query) | |||||
| friends = cursor.fetchall() | |||||
| cursor.close() | |||||
| else: | |||||
| friends = [[],[]] | |||||
| return render.index(self.login_form, friends) | |||||
| # Log In | |||||
| def POST(self): | |||||
| # Validate login credential with database query | |||||
| cursor = db.cursor() | |||||
| query = ("SELECT userid, username from users where username = (%s) and password = (%s)") | |||||
| data = web.input() | |||||
| cursor.execute(query, (data.username, data.password)) | |||||
| friends = cursor.fetchall() | |||||
| # If there is a matching user/password in the database the user is logged in | |||||
| if len(friends) == 1: | |||||
| query = ("SELECT userid, username from users") | |||||
| cursor.execute(query) | |||||
| friends = cursor.fetchall() | |||||
| session.username = data.username | |||||
| cursor.close() | |||||
| return render.index(self.login_form, friends) | |||||
| cursor.close() | |||||
| class register: | |||||
| # Define the register form | |||||
| register_form = form.Form( | |||||
| form.Textbox("username", description="Username"), | |||||
| form.Password("password", description="Password"), | |||||
| form.Button("Register", type="submit", description="Register"), | |||||
| ) | |||||
| # Get the registration form | |||||
| def GET(self): | |||||
| return render.register(self.register_form) | |||||
| # Register new user in database | |||||
| def POST(self): | |||||
| cursor = db.cursor() | |||||
| query = ("INSERT INTO users VALUES (NULL, (%s), (%s))") | |||||
| data = web.input() | |||||
| cursor.execute(query, (data.username, data.password)) | |||||
| cursor.close() | |||||
| return render.register(self.register_form) | |||||
| class logout: | |||||
| # Kill session | |||||
| def GET(self): | |||||
| session.kill() | |||||
| return "Logged Out" | |||||
| from views import app | |||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||
| app.run() | app.run() | ||||
| # Use webpy module to create a wsgi function | |||||
| application = app.wsgifunc() | application = app.wsgifunc() | ||||
| @@ -0,0 +1,91 @@ | |||||
| import web | |||||
| import mysql.connector | |||||
| from forms import login_form, register_form | |||||
| # Define application routes | |||||
| urls = ( | |||||
| '/', 'index', | |||||
| '/logout', 'logout', | |||||
| '/register', 'register', | |||||
| ) | |||||
| # Access datavase using mysql connector package | |||||
| db = mysql.connector.connect( | |||||
| user='root', | |||||
| password='root', | |||||
| host='10.5.0.5', | |||||
| database='db' | |||||
| ) | |||||
| # Initialize application using the web py framework | |||||
| app = web.application(urls, globals()) | |||||
| # Get html templates | |||||
| render = web.template.render('templates/') | |||||
| # Workaround to use sessions with reloader (debugger) http://webpy.org/cookbook/session_with_reloader | |||||
| if web.config.get('_session') is None: | |||||
| session = web.session.Session(app, web.session.DiskStore("sessions"), initializer={"username": None}) | |||||
| web.config._session = session | |||||
| else: | |||||
| session = web.config._session | |||||
| # Add session to global variables | |||||
| render._add_global(session, 'session') | |||||
| class index(): | |||||
| # Get main page | |||||
| def GET(self): | |||||
| # Show other registered users if the user is logged in | |||||
| if session.username: | |||||
| cursor = db.cursor() | |||||
| query = ("SELECT userid, username from users") | |||||
| cursor.execute(query) | |||||
| friends = cursor.fetchall() | |||||
| cursor.close() | |||||
| else: | |||||
| friends = [[],[]] | |||||
| return render.index(login_form, friends) | |||||
| # Log In | |||||
| def POST(self): | |||||
| # Validate login credential with database query | |||||
| cursor = db.cursor() | |||||
| query = ("SELECT userid, username from users where username = (%s) and password = (%s)") | |||||
| data = web.input() | |||||
| cursor.execute(query, (data.username, data.password)) | |||||
| friends = cursor.fetchall() | |||||
| # If there is a matching user/password in the database the user is logged in | |||||
| if len(friends) == 1: | |||||
| query = ("SELECT userid, username from users") | |||||
| cursor.execute(query) | |||||
| friends = cursor.fetchall() | |||||
| session.username = data.username | |||||
| cursor.close() | |||||
| return render.index(login_form, friends) | |||||
| cursor.close() | |||||
| class register: | |||||
| # Get the registration form | |||||
| def GET(self): | |||||
| return render.register(register_form) | |||||
| # Register new user in database | |||||
| def POST(self): | |||||
| cursor = db.cursor() | |||||
| query = ("INSERT INTO users VALUES (NULL, (%s), (%s))") | |||||
| data = web.input() | |||||
| cursor.execute(query, (data.username, data.password)) | |||||
| cursor.close() | |||||
| return render.register(register_form) | |||||
| class logout: | |||||
| # Kill session | |||||
| def GET(self): | |||||
| session.kill() | |||||
| return "Logged Out" | |||||
| @@ -1,29 +1,6 @@ | |||||
| #!/usr/bin/env bash | #!/usr/bin/env bash | ||||
| # Use this script to test if a given TCP host/port are available | # Use this script to test if a given TCP host/port are available | ||||
| """ | |||||
| The MIT License (MIT) | |||||
| Copyright (c) 2016 Giles Hall | |||||
| Permission is hereby granted, free of charge, to any person obtaining a copy of | |||||
| this software and associated documentation files (the \"Software\"), to deal in | |||||
| the Software without restriction, including without limitation the rights to | |||||
| use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies | |||||
| of the Software, and to permit persons to whom the Software is furnished to do | |||||
| so, subject to the following conditions: | |||||
| The above copyright notice and this permission notice shall be included in all | |||||
| copies or substantial portions of the Software. | |||||
| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||||
| SOFTWARE. | |||||
| """ | |||||
| WAITFORIT_cmdname=${0##*/} | WAITFORIT_cmdname=${0##*/} | ||||
| echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } | echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } | ||||
| @@ -159,7 +136,7 @@ if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then | |||||
| usage | usage | ||||
| fi | fi | ||||
| WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-30} | |||||
| WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} | |||||
| WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} | WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} | ||||
| WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} | WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} | ||||
| WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} | WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} | ||||