"""PSLA - Perforce Server Log Analyzer """ import os from flask import Flask, request, redirect, url_for, render_template, flash from flask_wtf.csrf import CSRFProtect from werkzeug import secure_filename from config import Config from forms import UploadForm, AccessLog import logging import pandas as pd import sqlite3 import flask_login from app.utils import generatePassword, createDbFolderName, getDatabaseFolders from app import app from app.log2sql import Log2sql UPLOAD_FOLDER = '/logs' ALLOWED_EXTENSIONS = set(['txt']) app.config.from_object(Config) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER csrf = CSRFProtect(app) login_manager = flask_login.LoginManager() login_manager.init_app(app) # Valid users in system - loaded from directories in /logs dir users = {} def allowed_file(filename): return True return '.' in filename and \ filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS class MyOptions(): def __init__(self, dbname, logfile, sql=False, verbosity=logging.INFO, outlog=None): self.dbname = dbname self.logfile = logfile self.sql = sql self.verbosity = verbosity self.interval = 10 self.outlog = outlog self.output = None class User(flask_login.UserMixin): def __init__(self, email, access_key): self.id = "%s|%s" % (email, access_key) self.email = email self.access_key = access_key def __repr__(self): return "%s/%s" % (self.email, self.access_key) @login_manager.user_loader def user_loader(id): app.logger.debug("Loading user: %s" % id) if id not in users: return return users[id] @app.route('/') def index(): """Front page for application""" return render_template('index.html') def initUsers(): databases = getDatabaseFolders(app.config['UPLOAD_FOLDER']) for d in databases: user = User(d['email'], d['access_key']) users[user.id] = user @app.route('/uploadLog', methods=['GET', 'POST']) def uploadLog(): "Upload log file" form = UploadForm() app.logger.debug("uploadLog: %s" % form.errors) app.logger.debug('------ {0}'.format(request.form)) if form.is_submitted(): app.logger.debug(form.errors) if form.validate(): app.logger.debug(form.errors) app.logger.debug(form.errors) if form.validate_on_submit(): filename = secure_filename(form.uploadFile.data.filename) email = form.email.data access_key = generatePassword(8, 3) user = User(email, access_key) users[user.id] = user app.logger.debug("user %s, access_key %s" % (email, access_key)) dbFolder = createDbFolderName(filename, email, access_key) absDbFolder = os.path.join(app.config['UPLOAD_FOLDER'], dbFolder) app.logger.debug("Saving in: %s" % absDbFolder) os.makedirs(absDbFolder) file_path = os.path.join(absDbFolder, filename) form.uploadFile.data.save(file_path) os.chdir(absDbFolder) optionsSQL = MyOptions("testdb", [file_path], sql=True, outlog='log.out') dbname = "%s.db" % optionsSQL.dbname if os.path.exists(dbname): os.remove(dbname) log2sql = Log2sql(optionsSQL) log2sql.processLog() msgs = [] return redirect(url_for('accessLog')) return render_template('uploadLog.html', title='Upload Log', form=form) @app.route('/analyzeLog') @flask_login.login_required def analyzeLog(): "Access previously uploaded log" user = flask_login.current_user app.logger.debug("Current logged in user: %s" % str(user)) databases = getDatabaseFolders(app.config['UPLOAD_FOLDER']) app.logger.debug("Databases: %s" % str(databases)) dbname = os.path.join(databases[0]['folderName'], "testdb.db") if not os.path.exists(dbname): flash('Database does not exist', 'error') return render_template('loginError.html', title='Database error') try: conn = sqlite3.connect(dbname) data = pd.read_sql_query(""" select cmd, count(cmd) from process group by cmd """, conn) return render_template('analyzeLog.html', tables=[data.to_html()], titles = ['na', 'Main SQL'], LogFile='t1.log') except: flash('Error executing SQL Query', 'error') return render_template('loginError.html', title='Database SQL error') @app.route('/accessLog', methods=['GET', 'POST']) def accessLog(): form = AccessLog() app.logger.debug(form.errors) app.logger.debug('------ {0}'.format(request.form)) if form.is_submitted(): app.logger.debug(form.errors) app.logger.debug(form.errors) if form.validate_on_submit(): initUsers() email = form.email.data access_key = form.access_key.data user = User(email, access_key) if user.id not in users: flash('Unrecognised details', 'error') return render_template('loginError.html', title='Login Error') # if access_key in users[email]: # user = User(email, access_key) flask_login.login_user(user) return redirect(url_for('analyzeLog')) flash('Unknown access key', 'error') return render_template('loginError.html', title='Login Error') return render_template('accessLog.html', title='Access Log', form=form) @login_manager.unauthorized_handler def unauthorized_handler(): return render_template('loginError.html', title='Unauthorized User Error')