Create basic Warren structure.

master
josiah 3 years ago
commit bbd3c995f4

1
.gitignore vendored

@ -0,0 +1 @@
env/

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2021 jlj
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.

@ -0,0 +1,103 @@
#!/usr/bin/env python
"""Listen for stuff with flask!
This will listen on two endpoints, and when data is
posted to the proper one, matching a particular format,
it will save that data to a local sqlite3 db."""
from datetime import datetime
import logging
import os
from pathlib import Path
from flask import Flask, redirect, url_for, request
import json
import sqlite3
import pdb
__version__ = "0.1.0"
logging.basicConfig(level=logging.DEBUG)
dbpath = "warren.db"
app = Flask(__name__)
def parse_incoming_post(body):
"""given a body of a request, convert it from json to pydict"""
json_dict = json.loads(body)
return json_dict
def check_if_db_exists(dbpath):
"""checks to see if the db exists"""
if os.path.exists(dbpath):
return True
else:
return False
def init_new_db(dbpath):
"""when you create a DB connection with SQLite3 you
will automatically create a db file if one is not there.
This function handles explicitly creating the folder structure
and inniting the connection as required.
You can specify your own dbpath, or you can use the default dbpath."""
# TODO: write directory handling shit
# handle the DB stuff
conn = None
try:
conn = sqlite3.connect(dbpath)
cur = conn.cursor()
cur.execute('''CREATE TABLE weir (date, hostname, metadata)''')
conn.commit()
logging.DEBUG(sqlite3.version)
logging.DEBUG("Creating new weir table.")
conn.close()
except:
logging.error(logging.ERROR[0])
def write_to_db(data, dbpath):
pdb.set_trace()
if check_if_db_exists(dbpath) != True:
db = init_new_db(dbpath)
conn = sqlite3.connect(dbpath)
cur = conn.cursor()
right_now = datetime.utcnow().strftime("%Y%m%d")
sql_inputs = [(right_now, data['hostname'], data['metadata'])]
cur.executemany("INSERT INTO weir VALUES (?,?,?)", sql_inputs)
conn.commit()
logging.INFO(cur.lastrowid)
# always make sure to close db connection after you're done
conn.close()
@app.route('/')
def test():
return 'the website is up you little bitch'
@app.route('/weir',methods = ['POST'])
def weir():
""""""
try:
python_dict = request.get_json()
write_to_db(python_dict, "warren.db")
return "OK"
except:
return "Error.", 400
if __name__ == '__main__':
app.run(debug = True)

@ -0,0 +1,11 @@
[build-system]
requires = ["flit_core >=2,<4"]
build-backend = "flit_core.buildapi"
[tool.flit.metadata]
module = "warren"
author = "jlj"
author-email = "me@jowj.net"
home-page = "https://jowj.net"
classifiers = [ "License :: OSI Approved :: MIT License",]

@ -0,0 +1,12 @@
* warren is the server part of weir
Listen for http posts on two routes,
** roadmap
- [X] listen for posts on a specific url
- [X] save data extracted from body of post to sqlite
- [ ] Write directory handling stuff for new db create
- [ ] Make sure logging is working as expected; i think i've done something wrong with naming with caps.
- [ ] Migrate away from flask's dev server and use a real WSGI server per the in-app warning
- [ ] ^^ but postgresql and in a managed instance
- [ ] gui front end for sql queries
** references
gonna try this new packaging paradigm: https://antonz.org/python-packaging/