mirror of
https://github.com/craigerl/aprsd.git
synced 2025-12-21 05:04:34 -05:00
This patch adds 2 items. First it adds the new StockPlugin, which fetches stock quotes from yahoo finance rest API using the yfinance python module. 2nd, the web interface contains a new url /plugins, which allows aprsd to reload all of it's plugins from disk. This is useful for development where the dev is editing an existing plugin and wants to run the edited plugin without restarting aprsd itself. The /plugins url requires admin login credentials. TODO: would be nice to live reload the aprsd.yml config file, so plugin reloading can start new plugins defined in aprsd.yml between /plugins being reloaded.
98 lines
2.6 KiB
Python
98 lines
2.6 KiB
Python
import json
|
|
import logging
|
|
|
|
import aprsd
|
|
from aprsd import messaging, plugin, stats
|
|
import flask
|
|
import flask_classful
|
|
from flask_httpauth import HTTPBasicAuth
|
|
from werkzeug.security import check_password_hash, generate_password_hash
|
|
|
|
LOG = logging.getLogger("APRSD")
|
|
|
|
auth = HTTPBasicAuth()
|
|
users = None
|
|
|
|
|
|
# HTTPBasicAuth doesn't work on a class method.
|
|
# This has to be out here. Rely on the APRSDFlask
|
|
# class to initialize the users from the config
|
|
@auth.verify_password
|
|
def verify_password(username, password):
|
|
global users
|
|
|
|
if username in users and check_password_hash(users.get(username), password):
|
|
return username
|
|
|
|
|
|
class APRSDFlask(flask_classful.FlaskView):
|
|
config = None
|
|
|
|
def set_config(self, config):
|
|
global users
|
|
self.config = config
|
|
self.users = {}
|
|
for user in self.config["aprsd"]["web"]["users"]:
|
|
self.users[user] = generate_password_hash(
|
|
self.config["aprsd"]["web"]["users"][user],
|
|
)
|
|
|
|
users = self.users
|
|
|
|
def index(self):
|
|
return "Hello"
|
|
# return flask.render_template("index.html", message=msg)
|
|
|
|
@auth.login_required
|
|
def messages(self):
|
|
track = messaging.MsgTrack()
|
|
msgs = []
|
|
for id in track:
|
|
LOG.info(track[id].dict())
|
|
msgs.append(track[id].dict())
|
|
|
|
return flask.render_template("messages.html", messages=json.dumps(msgs))
|
|
|
|
@auth.login_required
|
|
def plugins(self):
|
|
pm = plugin.PluginManager()
|
|
pm.reload_plugins()
|
|
|
|
return "reloaded"
|
|
|
|
@auth.login_required
|
|
def save(self):
|
|
"""Save the existing queue to disk."""
|
|
track = messaging.MsgTrack()
|
|
track.save()
|
|
return json.dumps({"messages": "saved"})
|
|
|
|
def stats(self):
|
|
stats_obj = stats.APRSDStats()
|
|
track = messaging.MsgTrack()
|
|
|
|
result = {
|
|
"version": aprsd.__version__,
|
|
"uptime": stats_obj.uptime,
|
|
"size_tracker": len(track),
|
|
"stats": stats_obj.stats(),
|
|
}
|
|
return json.dumps(result)
|
|
|
|
|
|
def init_flask(config):
|
|
flask_app = flask.Flask(
|
|
"aprsd",
|
|
static_url_path="",
|
|
static_folder="web/static",
|
|
template_folder="web/templates",
|
|
)
|
|
server = APRSDFlask()
|
|
server.set_config(config)
|
|
# flask_app.route('/', methods=['GET'])(server.index)
|
|
flask_app.route("/stats", methods=["GET"])(server.stats)
|
|
flask_app.route("/messages", methods=["GET"])(server.messages)
|
|
flask_app.route("/save", methods=["GET"])(server.save)
|
|
flask_app.route("/plugins", methods=["GET"])(server.plugins)
|
|
return flask_app
|