|
- # Created 2019-09-10 by NGnius
- from flask import Flask, Blueprint, jsonify, request, send_file
- import sqlite3 as dblib
- from hashlib import sha512
- from os import getcwd
- from threading import get_ident
- from time import time
-
- database_path = "rxsm-update.db"
-
- database_connections = dict()
- app = Flask("rxsm-update-server")
-
- def get_or_create_connection():
- global database_connections, database_path
- thread_id = get_ident()
- if thread_id not in database_connections:
- database_connections[thread_id] = dblib.connect(database_path)
- return database_connections[thread_id]
-
- @app.route('/release', methods=['POST'])
- def create_or_modify_release():
- try:
- req_json = request.get_json(force=True)
- token = req_json['token']
- version = req_json['version']
- url = req_json['url']
- except:
- return jsonify({'status':400, 'reason':'Invalid request; missing parameter or invalid JSON'}), 400
-
- with open(".token", "r") as f:
- master_token = f.read()
- if sha512(token.encode()).hexdigest() != master_token:
- return jsonify({'status':403, 'reason':'Permission denied; invalid token'}), 403
-
- db_connection = get_or_create_connection()
- cursor = db_connection.cursor()
- cursor.execute("SELECT version FROM releases WHERE version=?", (version,))
- result = cursor.fetchone()
- operation = ""
- if result is None:
- cursor.execute("INSERT INTO releases (version, url, created_date) VALUES (?,?,?)", (version, url, int(time())))
- operation = "create"
- else:
- cursor.execute("UPDATE releases SET url=?, created_date=? WHERE version=?", (url, int(time()), version))
- operation = "update"
- db_connection.commit()
-
- return jsonify({'status':200, 'reason':'Version %s %sd successfully' % (version, operation)}), 200
-
- @app.route('/database', methods=['GET'])
- def download_database():
- return send_file(database_path, cache_timeout=1, as_attachment=True, attachment_filename="rxsm.sqlite")
-
- # always try to create db table(s)
- conn = get_or_create_connection()
- cursor = conn.cursor()
- cursor.execute(\
- """CREATE TABLE IF NOT EXISTS releases (
- id INTEGER PRIMARY KEY,
- version TEXT UNIQUE NOT NULL,
- url TEXT NOT NULL,
- created_date INTEGER NOT NULL
- )""" )
- conn.commit()
-
- if __name__ == '__main__':
- print("Working directory: " + getcwd())
- app.run(host='0.0.0.0', port=9080, threaded=True)
|