From d7983967c8ee85ebbc79ddbb0859be2719e55c22 Mon Sep 17 00:00:00 2001 From: Jijo Jose Date: Mon, 30 Jul 2018 08:44:33 +0200 Subject: [PATCH] first commit --- dbsetup.py | 98 +++++++++ microservice.py | 185 ++++++++++++++++ pythonsqlite.db | 0 static/css/sb-admin.css | 375 ++++++++++++++++++++++++++++++++ static/js/app.js | 47 ++++ static/js/sb-admin.js | 40 ++++ templates/New Text Document.txt | 98 +++++++++ templates/about.html | 9 + templates/dashboard-single.html | 129 +++++++++++ templates/dashboard.html | 167 ++++++++++++++ templates/index.html | 9 + 11 files changed, 1157 insertions(+) create mode 100644 dbsetup.py create mode 100644 microservice.py create mode 100644 pythonsqlite.db create mode 100644 static/css/sb-admin.css create mode 100644 static/js/app.js create mode 100644 static/js/sb-admin.js create mode 100644 templates/New Text Document.txt create mode 100644 templates/about.html create mode 100644 templates/dashboard-single.html create mode 100644 templates/dashboard.html create mode 100644 templates/index.html diff --git a/dbsetup.py b/dbsetup.py new file mode 100644 index 0000000..9f1653c --- /dev/null +++ b/dbsetup.py @@ -0,0 +1,98 @@ +import sqlite3 +from sqlite3 import Error + +def create_connection(database): + try: + conn = sqlite3.connect(database, isolation_level=None, check_same_thread = False) + conn.row_factory = lambda c, r: dict(zip([col[0] for col in c.description], r)) + + return conn + except Error as e: + print(e) + +def create_table(c,sql): + c.execute(sql) + +def update_or_create_page(c,data): + sql = "SELECT * FROM pages where name=? and session=?" + c.execute(sql,data[:-1]) + result = c.fetchone() + if result == None: + create_pages(c,data) + else: + print(result) + update_pages(c, result['id']) + +def create_pages(c, data): + print(data) + sql = ''' INSERT INTO pages(name,session,first_visited) + VALUES (?,?,?) ''' + c.execute(sql, data) + +def update_pages(c, pageId): + print(pageId) + sql = ''' UPDATE pages + SET visits = visits+1 + WHERE id = ?''' + c.execute(sql, [pageId]) + +def create_session(c, data): + sql = ''' INSERT INTO sessions(ip, continent, country, city, os, browser, session, created_at) + VALUES (?,?,?,?,?,?,?,?) ''' + c.execute(sql, data) + +def select_all_sessions(c): + sql = "SELECT * FROM sessions" + c.execute(sql) + rows = c.fetchall() + return rows + +def select_all_pages(c): + sql = "SELECT * FROM pages" + c.execute(sql) + rows = c.fetchall() + return rows + +def select_all_user_visits(c, session_id): + sql = "SELECT * FROM pages where session =?" + c.execute(sql,[session_id]) + rows = c.fetchall() + return rows + +def main(): + database = "./pythonsqlite.db" + sql_create_pages = """ + CREATE TABLE IF NOT EXISTS pages ( + id integer PRIMARY KEY, + name varchar(225) NOT NULL, + session varchar(255) NOT NULL, + first_visited datetime NOT NULL, + visits integer NOT NULL Default 1 + ); + """ + sql_create_session = """ + CREATE TABLE IF NOT EXISTS sessions ( + id integer PRIMARY KEY, + ip varchar(225) NOT NULL, + continent varchar(225) NOT NULL, + country varchar(225) NOT NULL, + city varchar(225) NOT NULL, + os varchar(225) NOT NULL, + browser varchar(225) NOT NULL, + session varchar(225) NOT NULL, + created_at datetime NOT NULL + ); + """ + + # create a database connection + conn = create_connection(database) + if conn is not None: + # create tables + create_table(conn, sql_create_pages) + create_table(conn, sql_create_session) + print("Connection established!") + else: + print("Could not establish connection") + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/microservice.py b/microservice.py new file mode 100644 index 0000000..dae82cb --- /dev/null +++ b/microservice.py @@ -0,0 +1,185 @@ +from flask import Flask, render_template, request, session, jsonify +import urllib +from pusher import Pusher +from datetime import datetime +import httpagentparser +import json +import os +import hashlib +from dbsetup import create_connection, create_session, update_or_create_page, select_all_sessions, \ + select_all_user_visits, select_all_pages + +app = Flask(__name__) +app.secret_key = os.urandom(24) + +# configure pusher object +# pusher = Pusher( +# app_id='PUSHER_APP_ID', +# key='PUSHER_APP_KEY', +# secret='PUSHER_APP_SECRET', +# cluster='PUSHER_APP_CLUSTER', +# ssl=True) + +database = "./pythonsqlite.db" +conn = create_connection(database) +c = conn.cursor() + +userOS = None +userIP = None +userCity = None +userBrowser = None +userCountry = None +userContinent = None +sessionID = None + + +def main(): + global conn, c + + +def parseVisitor(data): + update_or_create_page(c, data) + # pusher.trigger(u'pageview', u'new', { + # u'page': data[0], + # u'session': sessionID, + # u'ip': userIP + # }) + # pusher.trigger(u'numbers', u'update', { + # u'page': data[0], + # u'session': sessionID, + # u'ip': userIP + # }) + + +@app.before_request +def getAnalyticsData(): + global userOS, userBrowser, userIP, userContinent, userCity, userCountry, sessionID + userInfo = httpagentparser.detect(request.headers.get('User-Agent')) + userOS = userInfo['platform']['name'] + userBrowser = userInfo['browser']['name'] + userIP = "72.229.28.185" if request.remote_addr == '127.0.0.1' else request.remote_addr + api = "https://www.iplocate.io/api/lookup/" + userIP + try: + resp = urllib.request.urlopen(api) + result = resp.read() + result = json.loads(result.decode("utf-8")) + userCountry = result["country"] + userContinent = result["continent"] + userCity = result["city"] + except: + print("Could not find: ", userIP) + getSession() + + +def getSession(): + global sessionID + time = datetime.now().replace(microsecond=0) + if 'user' not in session: + lines = (str(time) + userIP).encode('utf-8') + session['user'] = hashlib.md5(lines).hexdigest() + sessionID = session['user'] + # pusher.trigger(u'session', u'new', { + # u'ip': userIP, + # u'continent': userContinent, + # u'country': userCountry, + # u'city': userCity, + # u'os': userOS, + # u'browser': userBrowser, + # u'session': sessionID, + # u'time': str(time), + # }) + data = [userIP, userContinent, userCountry, userCity, userOS, userBrowser, sessionID, time] + # create_session(c, data) + else: + sessionID = session['user'] + + +@app.route('/') +def index(): + data = ['home', sessionID, str(datetime.now().replace(microsecond=0))] + parseVisitor(data) + return render_template('index.html') + + +@app.route('/about') +def about(): + data = ['about', sessionID, str(datetime.now().replace(microsecond=0))] + parseVisitor(data) + return render_template('about.html') + + +@app.route('/dashboard') +def dashboard(): + return render_template('dashboard.html') + + +@app.route('/dashboard/', methods=['GET']) +def sessionPages(session_id): + result = select_all_user_visits(c, session_id) + return render_template("dashboard-single.html", data=result) + + +@app.route('/get-all-sessions') +def get_all_sessions(): + data = [] + dbRows = select_all_sessions(c) + for row in dbRows: + data.append({ + 'ip': row['ip'], + 'continent': row['continent'], + 'country': row['country'], + 'city': row['city'], + 'os': row['os'], + 'browser': row['browser'], + 'session': row['session'], + 'time': row['created_at'] + }) + return jsonify(data) + + +if __name__ == '__main__': + main() + app.run(debug=True) +# +# from flask import Flask +# from flask import jsonify +# +# app = Flask(__name__) +# +# +# empDB=[ +# +# +# ] +# @app.route('/rackStatus/getFtiState/',methods=['GET']) +# def getRackStatus(hostName): +# return "jijo" +# # jsonify({ +# # 'hostName': 'ABC1', +# # 'slotName': 8, +# # 'unAvailableSlots':'1,2' +# # }, +# # { +# # 'hostName': 'ABC2', +# # 'slotName': 7, +# # 'unAvailableSlots':'1,2,3' +# # }, +# # { +# # 'hostName': 'ABC3', +# # 'slotName': 8, +# # 'unAvailableSlots':'1,2' +# # }, +# # { +# # 'hostName': 'ABC4', +# # 'slotName': 8, +# # 'unAvailableSlots':'1,2' +# # } ) +# +# @app.route('/') +# @app.route('/index') +# def index(): +# return "Hello, World!" +# +# +# if __name__ == "__main__": +# app.run() \ No newline at end of file diff --git a/pythonsqlite.db b/pythonsqlite.db new file mode 100644 index 0000000..e69de29 diff --git a/static/css/sb-admin.css b/static/css/sb-admin.css new file mode 100644 index 0000000..6aeb397 --- /dev/null +++ b/static/css/sb-admin.css @@ -0,0 +1,375 @@ +/*! + * Start Bootstrap - SB Admin v5.0.1 (https://startbootstrap.com/template-overviews/sb-admin) + * Copyright 2013-2018 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-sb-admin/blob/master/LICENSE) + */ + +html { + position: relative; + min-height: 100%; +} + +body { + height: 100%; +} + +#wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +#wrapper #content-wrapper { + overflow-x: hidden; + width: 100%; + padding-top: 1rem; + padding-bottom: 80px; +} + +body.fixed-nav #content-wrapper { + margin-top: 56px; + padding-left: 90px; +} + +body.fixed-nav.sidebar-toggled #content-wrapper { + padding-left: 0; +} + +@media (min-width: 768px) { + body.fixed-nav #content-wrapper { + padding-left: 225px; + } + body.fixed-nav.sidebar-toggled #content-wrapper { + padding-left: 90px; + } +} + +.scroll-to-top { + position: fixed; + right: 15px; + bottom: 15px; + display: none; + width: 50px; + height: 50px; + text-align: center; + color: #fff; + background: rgba(52, 58, 64, 0.5); + line-height: 46px; +} + +.scroll-to-top:focus, .scroll-to-top:hover { + color: white; +} + +.scroll-to-top:hover { + background: #343a40; +} + +.scroll-to-top i { + font-weight: 800; +} + +.smaller { + font-size: 0.7rem; +} + +.o-hidden { + overflow: hidden !important; +} + +.z-0 { + z-index: 0; +} + +.z-1 { + z-index: 1; +} + +.navbar-nav .form-inline .input-group { + width: 100%; +} + +.navbar-nav .nav-item.active .nav-link { + color: #fff; +} + +.navbar-nav .nav-item.dropdown .dropdown-toggle::after { + width: 1rem; + text-align: center; + float: right; + vertical-align: 0; + border: 0; + font-weight: 900; + content: '\f105'; + font-family: 'Font Awesome 5 Free'; +} + +.navbar-nav .nav-item.dropdown.show .dropdown-toggle::after { + content: '\f107'; +} + +.navbar-nav .nav-item.dropdown.no-arrow .dropdown-toggle::after { + display: none; +} + +.navbar-nav .nav-item .nav-link:focus { + outline: none; +} + +.navbar-nav .nav-item .nav-link .badge { + position: absolute; + margin-left: 0.75rem; + top: 0.3rem; + font-weight: 400; + font-size: 0.5rem; +} + +@media (min-width: 768px) { + .navbar-nav .form-inline .input-group { + width: auto; + } +} + +.sidebar { + width: 90px !important; + background-color: #212529; + min-height: calc(100vh - 56px); +} + +.sidebar .nav-item:last-child { + margin-bottom: 1rem; +} + +.sidebar .nav-item .nav-link { + text-align: center; + padding: 0.75rem 1rem; + width: 90px; +} + +.sidebar .nav-item .nav-link span { + font-size: 0.65rem; + display: block; +} + +.sidebar .nav-item .dropdown-menu { + position: absolute !important; + -webkit-transform: none !important; + transform: none !important; + left: calc(90px + 0.5rem) !important; + margin: 0; +} + +.sidebar .nav-item .dropdown-menu.dropup { + bottom: 0; + top: auto !important; +} + +.sidebar .nav-item.dropdown .dropdown-toggle::after { + display: none; +} + +.sidebar .nav-item .nav-link { + color: rgba(255, 255, 255, 0.5); +} + +.sidebar .nav-item .nav-link:active, .sidebar .nav-item .nav-link:focus, .sidebar .nav-item .nav-link:hover { + color: rgba(255, 255, 255, 0.75); +} + +.sidebar.toggled { + width: 0 !important; + overflow: hidden; +} + +@media (min-width: 768px) { + .sidebar { + width: 225px !important; + } + .sidebar .nav-item .nav-link { + display: block; + width: 100%; + text-align: left; + padding: 1rem; + width: 225px; + } + .sidebar .nav-item .nav-link span { + font-size: 1rem; + display: inline; + } + .sidebar .nav-item .dropdown-menu { + position: static !important; + margin: 0 1rem; + top: 0; + } + .sidebar .nav-item.dropdown .dropdown-toggle::after { + display: block; + } + .sidebar.toggled { + overflow: visible; + width: 90px !important; + } + .sidebar.toggled .nav-item:last-child { + margin-bottom: 1rem; + } + .sidebar.toggled .nav-item .nav-link { + text-align: center; + padding: 0.75rem 1rem; + width: 90px; + } + .sidebar.toggled .nav-item .nav-link span { + font-size: 0.65rem; + display: block; + } + .sidebar.toggled .nav-item .dropdown-menu { + position: absolute !important; + -webkit-transform: none !important; + transform: none !important; + left: calc(90px + 0.5rem) !important; + margin: 0; + } + .sidebar.toggled .nav-item .dropdown-menu.dropup { + bottom: 0; + top: auto !important; + } + .sidebar.toggled .nav-item.dropdown .dropdown-toggle::after { + display: none; + } +} + +.sidebar.fixed-top { + top: 56px; + height: calc(100vh - 56px); + overflow-y: auto; +} + +.card-body-icon { + position: absolute; + z-index: 0; + top: -1.25rem; + right: -1rem; + opacity: 0.4; + font-size: 5rem; + -webkit-transform: rotate(15deg); + transform: rotate(15deg); +} + +@media (min-width: 576px) { + .card-columns { + -webkit-column-count: 1; + column-count: 1; + } +} + +@media (min-width: 768px) { + .card-columns { + -webkit-column-count: 2; + column-count: 2; + } +} + +@media (min-width: 1200px) { + .card-columns { + -webkit-column-count: 2; + column-count: 2; + } +} + +:root { + --input-padding-x: 0.75rem; + --input-padding-y: 0.75rem; +} + +.card-login { + max-width: 25rem; +} + +.card-register { + max-width: 40rem; +} + +.form-label-group { + position: relative; +} + +.form-label-group > input, +.form-label-group > label { + padding: var(--input-padding-y) var(--input-padding-x); + height: auto; +} + +.form-label-group > label { + position: absolute; + top: 0; + left: 0; + display: block; + width: 100%; + margin-bottom: 0; + /* Override default `