"""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
import logging
import pandas as pd
import sqlite3
from app import app
from log2sql import Log2sql
UPLOAD_FOLDER = '/logs'
ALLOWED_EXTENSIONS = set(['txt'])
app.config.from_object(Config)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
csrf = CSRFProtect(app)
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
@app.route('/')
def index():
"""Front page for application"""
return render_template('index.html')
@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():
db_folder = app.config['UPLOAD_FOLDER']
filename = secure_filename(form.uploadFile.data.filename)
file_path = os.path.join(db_folder, filename)
form.uploadFile.data.save(file_path)
os.chdir(db_folder)
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('analyzeLog'))
return render_template('uploadLog.html', title='Upload Log', form=form)
@app.route('/analyzeLog')
def analyzeLog():
"Access previously uploaded log"
db_folder = app.config['UPLOAD_FOLDER']
dbname = os.path.join(db_folder, "testdb.db")
if not os.path.exists(dbname):
flash('Database does not exist', 'error')
return render_template('error.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('error.html', title='Database SQL error')