From c48ff8dfd4bd4ce2f95b36e71dce13da5446a658 Mon Sep 17 00:00:00 2001 From: Hemna Date: Mon, 9 Dec 2024 13:36:01 -0500 Subject: [PATCH 01/40] Migrate admin web out of aprsd. This patch removes the admin command out of aprsd proper. The admin interface will be an aprsd extension called aprsd-admin-extension. This is the start of the effort to trim down the base of APRSD and the commands to server, healthcheck, list_plugins, list_extensions. This will reduce the number of required packages that APRSD core needs. This is useful for others using APRSD as their base to their applications. --- aprsd/cmds/admin.py | 57 ------- aprsd/cmds/server.py | 74 +++++--- aprsd/cmds/webchat.py | 19 --- aprsd/conf/common.py | 36 ---- aprsd/log/log.py | 21 ++- aprsd/main.py | 2 +- aprsd/threads/log_monitor.py | 121 ------------- aprsd/wsgi.py | 322 ----------------------------------- 8 files changed, 62 insertions(+), 590 deletions(-) delete mode 100644 aprsd/cmds/admin.py delete mode 100644 aprsd/threads/log_monitor.py delete mode 100644 aprsd/wsgi.py diff --git a/aprsd/cmds/admin.py b/aprsd/cmds/admin.py deleted file mode 100644 index 6f3a8d9..0000000 --- a/aprsd/cmds/admin.py +++ /dev/null @@ -1,57 +0,0 @@ -import logging -import os -import signal - -import click -from oslo_config import cfg -import socketio - -import aprsd -from aprsd import cli_helper -from aprsd import main as aprsd_main -from aprsd import utils -from aprsd.main import cli - - -os.environ["APRSD_ADMIN_COMMAND"] = "1" -# this import has to happen AFTER we set the -# above environment variable, so that the code -# inside the wsgi.py has the value -from aprsd import wsgi as aprsd_wsgi # noqa - - -CONF = cfg.CONF -LOG = logging.getLogger("APRSD") - - -# main() ### -@cli.command() -@cli_helper.add_options(cli_helper.common_options) -@click.pass_context -@cli_helper.process_standard_options -def admin(ctx): - """Start the aprsd admin interface.""" - signal.signal(signal.SIGINT, aprsd_main.signal_handler) - signal.signal(signal.SIGTERM, aprsd_main.signal_handler) - - level, msg = utils._check_version() - if level: - LOG.warning(msg) - else: - LOG.info(msg) - LOG.info(f"APRSD Started version: {aprsd.__version__}") - # Dump all the config options now. - CONF.log_opt_values(LOG, logging.DEBUG) - - async_mode = "threading" - sio = socketio.Server(logger=True, async_mode=async_mode) - aprsd_wsgi.app.wsgi_app = socketio.WSGIApp(sio, aprsd_wsgi.app.wsgi_app) - aprsd_wsgi.init_app() - sio.register_namespace(aprsd_wsgi.LoggingNamespace("/logs")) - CONF.log_opt_values(LOG, logging.DEBUG) - aprsd_wsgi.app.run( - threaded=True, - debug=False, - port=CONF.admin.web_port, - host=CONF.admin.web_ip, - ) diff --git a/aprsd/cmds/server.py b/aprsd/cmds/server.py index bf418a6..0732a8d 100644 --- a/aprsd/cmds/server.py +++ b/aprsd/cmds/server.py @@ -13,15 +13,49 @@ from aprsd.client import client_factory from aprsd.main import cli from aprsd.packets import collector as packet_collector from aprsd.packets import seen_list -from aprsd.threads import keep_alive, log_monitor, registry, rx +from aprsd.threads import aprsd as aprsd_threads +from aprsd.threads import keep_alive, registry, rx from aprsd.threads import stats as stats_thread from aprsd.threads import tx +from aprsd.utils import singleton CONF = cfg.CONF LOG = logging.getLogger("APRSD") +@singleton +class ServerThreads: + """Registry for threads that the server command runs. + + This enables extensions to register a thread to run during + the server command. + + """ + def __init__(self): + self.threads: list[aprsd_threads.APRSDThread] = [] + + def register(self, thread: aprsd_threads.APRSDThread): + if not isinstance(thread, aprsd_threads.APRSDThread): + raise TypeError(f"Thread {thread} is not an APRSDThread") + self.threads.append(thread) + + def unregister(self, thread: aprsd_threads.APRSDThread): + if not isinstance(thread, aprsd_threads.APRSDThread): + raise TypeError(f"Thread {thread} is not an APRSDThread") + self.threads.remove(thread) + + def start(self): + """Start all threads in the list.""" + for thread in self.threads: + thread.start() + + def join(self): + """Join all the threads in the list""" + for thread in self.threads: + thread.join() + + # main() ### @cli.command() @cli_helper.add_options(cli_helper.common_options) @@ -41,6 +75,8 @@ def server(ctx, flush): signal.signal(signal.SIGINT, aprsd_main.signal_handler) signal.signal(signal.SIGTERM, aprsd_main.signal_handler) + server_threads = ServerThreads() + level, msg = utils._check_version() if level: LOG.warning(msg) @@ -110,36 +146,28 @@ def server(ctx, flush): # Now start all the main processing threads. - keepalive = keep_alive.KeepAliveThread() - keepalive.start() - - stats_store_thread = stats_thread.APRSDStatsStoreThread() - stats_store_thread.start() - - rx_thread = rx.APRSDPluginRXThread( - packet_queue=threads.packet_queue, + server_threads.register(keep_alive.KeepAliveThread()) + server_threads.register(stats_thread.APRSDStatsStoreThread()) + server_threads.register( + rx.APRSDPluginRXThread( + packet_queue=threads.packet_queue, + ), ) - process_thread = rx.APRSDPluginProcessPacketThread( - packet_queue=threads.packet_queue, + server_threads.register( + rx.APRSDPluginProcessPacketThread( + packet_queue=threads.packet_queue, + ), ) - rx_thread.start() - process_thread.start() if CONF.enable_beacon: LOG.info("Beacon Enabled. Starting Beacon thread.") - bcn_thread = tx.BeaconSendThread() - bcn_thread.start() + server_threads.register(tx.BeaconSendThread()) if CONF.aprs_registry.enabled: LOG.info("Registry Enabled. Starting Registry thread.") - registry_thread = registry.APRSRegistryThread() - registry_thread.start() + server_threads.register(registry.APRSRegistryThread()) - if CONF.admin.web_enabled: - log_monitor_thread = log_monitor.LogMonitorThread() - log_monitor_thread.start() - - rx_thread.join() - process_thread.join() + server_threads.start() + server_threads.join() return 0 diff --git a/aprsd/cmds/webchat.py b/aprsd/cmds/webchat.py index 26df7c9..143d2e2 100644 --- a/aprsd/cmds/webchat.py +++ b/aprsd/cmds/webchat.py @@ -14,7 +14,6 @@ from flask_socketio import Namespace, SocketIO from geopy.distance import geodesic from oslo_config import cfg import timeago -from werkzeug.security import check_password_hash, generate_password_hash import wrapt import aprsd @@ -33,7 +32,6 @@ from aprsd.utils import trace CONF = cfg.CONF LOG = logging.getLogger() auth = HTTPBasicAuth() -users = {} socketio = None # List of callsigns that we don't want to track/fetch their location @@ -122,17 +120,6 @@ class SentMessages: self.data[id]["reply"] = packet -# 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[username], password): - return username - - def _build_location_from_repeat(message): # This is a location message Format is # ^ld^callsign:latitude,longitude,altitude,course,speed,timestamp @@ -340,10 +327,6 @@ class LocationProcessingThread(aprsd_threads.APRSDThread): pass -def set_config(): - global users - - def _get_transport(stats): if CONF.aprs_network.enabled: transport = "aprs-is" @@ -603,8 +586,6 @@ def webchat(ctx, flush, port): LOG.info(f"APRSD Started version: {aprsd.__version__}") CONF.log_opt_values(logging.getLogger(), logging.DEBUG) - user = CONF.admin.user - users[user] = generate_password_hash(CONF.admin.password) if not port: port = CONF.webchat.web_port diff --git a/aprsd/conf/common.py b/aprsd/conf/common.py index 19b02aa..c713fd8 100644 --- a/aprsd/conf/common.py +++ b/aprsd/conf/common.py @@ -7,10 +7,6 @@ home = str(Path.home()) DEFAULT_CONFIG_DIR = f"{home}/.config/aprsd/" APRSD_DEFAULT_MAGIC_WORD = "CHANGEME!!!" -admin_group = cfg.OptGroup( - name="admin", - title="Admin web interface settings", -) watch_list_group = cfg.OptGroup( name="watch_list", title="Watch List settings", @@ -178,35 +174,6 @@ watch_list_opts = [ ), ] -admin_opts = [ - cfg.BoolOpt( - "web_enabled", - default=False, - help="Enable the Admin Web Interface", - ), - cfg.StrOpt( - "web_ip", - default="0.0.0.0", - help="The ip address to listen on", - ), - cfg.PortOpt( - "web_port", - default=8001, - help="The port to listen on", - ), - cfg.StrOpt( - "user", - default="admin", - help="The admin user for the admin web interface", - ), - cfg.StrOpt( - "password", - default="password", - secret=True, - help="Admin interface password", - ), -] - enabled_plugins_opts = [ cfg.ListOpt( @@ -292,8 +259,6 @@ registry_opts = [ def register_opts(config): config.register_opts(aprsd_opts) config.register_opts(enabled_plugins_opts) - config.register_group(admin_group) - config.register_opts(admin_opts, group=admin_group) config.register_group(watch_list_group) config.register_opts(watch_list_opts, group=watch_list_group) config.register_group(webchat_group) @@ -305,7 +270,6 @@ def register_opts(config): def list_opts(): return { "DEFAULT": (aprsd_opts + enabled_plugins_opts), - admin_group.name: admin_opts, watch_list_group.name: watch_list_opts, webchat_group.name: webchat_opts, registry_group.name: registry_opts, diff --git a/aprsd/log/log.py b/aprsd/log/log.py index e5c20d5..e50a38f 100644 --- a/aprsd/log/log.py +++ b/aprsd/log/log.py @@ -1,5 +1,4 @@ import logging -from logging.handlers import QueueHandler import queue import sys @@ -122,16 +121,16 @@ def setup_logging(loglevel=None, quiet=False): for name in imap_list: logging.getLogger(name).propagate = True - if CONF.admin.web_enabled: - qh = QueueHandler(logging_queue) - handlers.append( - { - "sink": qh, "serialize": False, - "format": CONF.logging.logformat, - "level": log_level, - "colorize": False, - }, - ) + # if CONF.admin.web_enabled: + # qh = QueueHandler(logging_queue) + # handlers.append( + # { + # "sink": qh, "serialize": False, + # "format": CONF.logging.logformat, + # "level": log_level, + # "colorize": False, + # }, + # ) # configure loguru logger.configure(handlers=handlers) diff --git a/aprsd/main.py b/aprsd/main.py index 7609bc0..669f254 100644 --- a/aprsd/main.py +++ b/aprsd/main.py @@ -54,7 +54,7 @@ def cli(ctx): def load_commands(): from .cmds import ( # noqa - admin, completion, dev, fetch_stats, healthcheck, list_plugins, listen, + completion, dev, fetch_stats, healthcheck, list_plugins, listen, send_message, server, webchat, ) diff --git a/aprsd/threads/log_monitor.py b/aprsd/threads/log_monitor.py deleted file mode 100644 index f4a17ca..0000000 --- a/aprsd/threads/log_monitor.py +++ /dev/null @@ -1,121 +0,0 @@ -import datetime -import logging -import threading - -from oslo_config import cfg -import requests -import wrapt - -from aprsd import threads -from aprsd.log import log - - -CONF = cfg.CONF -LOG = logging.getLogger("APRSD") - - -def send_log_entries(force=False): - """Send all of the log entries to the web interface.""" - if CONF.admin.web_enabled: - if force or LogEntries().is_purge_ready(): - entries = LogEntries().get_all_and_purge() - if entries: - try: - requests.post( - f"http://{CONF.admin.web_ip}:{CONF.admin.web_port}/log_entries", - json=entries, - auth=(CONF.admin.user, CONF.admin.password), - ) - except Exception: - LOG.warning(f"Failed to send log entries. len={len(entries)}") - - -class LogEntries: - entries = [] - lock = threading.Lock() - _instance = None - last_purge = datetime.datetime.now() - max_delta = datetime.timedelta( - hours=0.0, minutes=0, seconds=2, - ) - - def __new__(cls, *args, **kwargs): - if cls._instance is None: - cls._instance = super().__new__(cls) - return cls._instance - - def stats(self) -> dict: - return { - "log_entries": self.entries, - } - - @wrapt.synchronized(lock) - def add(self, entry): - self.entries.append(entry) - - @wrapt.synchronized(lock) - def get_all_and_purge(self): - entries = self.entries.copy() - self.entries = [] - self.last_purge = datetime.datetime.now() - return entries - - def is_purge_ready(self): - now = datetime.datetime.now() - if ( - now - self.last_purge > self.max_delta - and len(self.entries) > 1 - ): - return True - return False - - @wrapt.synchronized(lock) - def __len__(self): - return len(self.entries) - - -class LogMonitorThread(threads.APRSDThread): - - def __init__(self): - super().__init__("LogMonitorThread") - - def stop(self): - send_log_entries(force=True) - super().stop() - - def loop(self): - try: - record = log.logging_queue.get(block=True, timeout=2) - if isinstance(record, list): - for item in record: - entry = self.json_record(item) - LogEntries().add(entry) - else: - entry = self.json_record(record) - LogEntries().add(entry) - except Exception: - # Just ignore thi - pass - - send_log_entries() - return True - - def json_record(self, record): - entry = {} - entry["filename"] = record.filename - entry["funcName"] = record.funcName - entry["levelname"] = record.levelname - entry["lineno"] = record.lineno - entry["module"] = record.module - entry["name"] = record.name - entry["pathname"] = record.pathname - entry["process"] = record.process - entry["processName"] = record.processName - if hasattr(record, "stack_info"): - entry["stack_info"] = record.stack_info - else: - entry["stack_info"] = None - entry["thread"] = record.thread - entry["threadName"] = record.threadName - entry["message"] = record.getMessage() - return entry diff --git a/aprsd/wsgi.py b/aprsd/wsgi.py deleted file mode 100644 index 47da201..0000000 --- a/aprsd/wsgi.py +++ /dev/null @@ -1,322 +0,0 @@ -import datetime -import importlib.metadata as imp -import io -import json -import logging -import os -import queue - -import flask -from flask import Flask, request -from flask_httpauth import HTTPBasicAuth -from oslo_config import cfg, generator -import socketio -from werkzeug.security import check_password_hash - -import aprsd -from aprsd import cli_helper, client, conf, packets, plugin, threads -from aprsd.log import log -from aprsd.threads import stats as stats_threads -from aprsd.utils import json as aprsd_json - - -CONF = cfg.CONF -LOG = logging.getLogger("gunicorn.access") -logging_queue = queue.Queue() - - -# ADMIN_COMMAND True means we are running from `aprsd admin` -# the `aprsd admin` command will import this file after setting -# the APRSD_ADMIN_COMMAND environment variable. -ADMIN_COMMAND = os.environ.get("APRSD_ADMIN_COMMAND", False) - -auth = HTTPBasicAuth() -users: dict[str, str] = {} -app = Flask( - "aprsd", - static_url_path="/static", - static_folder="web/admin/static", - template_folder="web/admin/templates", -) -bg_thread = None -app.config["SECRET_KEY"] = "secret!" - - -# 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 - - -def _stats(): - stats_obj = stats_threads.StatsStore() - stats_obj.load() - now = datetime.datetime.now() - time_format = "%m-%d-%Y %H:%M:%S" - stats = { - "time": now.strftime(time_format), - "stats": stats_obj.data, - } - return stats - - -@app.route("/stats") -def stats(): - LOG.debug("/stats called") - return json.dumps(_stats(), cls=aprsd_json.SimpleJSONEncoder) - - -@app.route("/") -def index(): - stats = _stats() - pm = plugin.PluginManager() - plugins = pm.get_plugins() - plugin_count = len(plugins) - client_stats = stats["stats"].get("APRSClientStats", {}) - - if CONF.aprs_network.enabled: - transport = "aprs-is" - if client_stats: - aprs_connection = client_stats.get("server_string", "") - else: - aprs_connection = "APRS-IS" - aprs_connection = ( - "APRS-IS Server: " - "{}".format(aprs_connection) - ) - else: - # We might be connected to a KISS socket? - if client.KISSClient.kiss_enabled(): - transport = client.KISSClient.transport() - if transport == client.TRANSPORT_TCPKISS: - aprs_connection = ( - "TCPKISS://{}:{}".format( - CONF.kiss_tcp.host, - CONF.kiss_tcp.port, - ) - ) - elif transport == client.TRANSPORT_SERIALKISS: - aprs_connection = ( - "SerialKISS://{}@{} baud".format( - CONF.kiss_serial.device, - CONF.kiss_serial.baudrate, - ) - ) - - if client_stats: - stats["stats"]["APRSClientStats"]["transport"] = transport - stats["stats"]["APRSClientStats"]["aprs_connection"] = aprs_connection - entries = conf.conf_to_dict() - - thread_info = stats["stats"].get("APRSDThreadList", {}) - if thread_info: - thread_count = len(thread_info) - else: - thread_count = "unknown" - - return flask.render_template( - "index.html", - initial_stats=json.dumps(stats, cls=aprsd_json.SimpleJSONEncoder), - aprs_connection=aprs_connection, - callsign=CONF.callsign, - version=aprsd.__version__, - config_json=json.dumps( - entries, indent=4, - sort_keys=True, default=str, - ), - plugin_count=plugin_count, - thread_count=thread_count, - # oslo_out=generate_oslo() - ) - - -@auth.login_required -def messages(): - track = packets.PacketTrack() - 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 -@app.route("/packets") -def get_packets(): - stats = _stats() - stats_dict = stats["stats"] - packets = stats_dict.get("PacketList", {}) - return json.dumps(packets, cls=aprsd_json.SimpleJSONEncoder) - - -@auth.login_required -@app.route("/plugins") -def plugins(): - LOG.debug("/plugins called") - pm = plugin.PluginManager() - pm.reload_plugins() - - return "reloaded" - - -def _get_namespaces(): - args = [] - - all = imp.entry_points() - selected = [] - if "oslo.config.opts" in all: - for x in all["oslo.config.opts"]: - if x.group == "oslo.config.opts": - selected.append(x) - for entry in selected: - if "aprsd" in entry.name: - args.append("--namespace") - args.append(entry.name) - - return args - - -def generate_oslo(): - CONF.namespace = _get_namespaces() - string_out = io.StringIO() - generator.generate(CONF, string_out) - return string_out.getvalue() - - -@auth.login_required -@app.route("/oslo") -def oslo(): - return generate_oslo() - - -@auth.login_required -@app.route("/save") -def save(): - """Save the existing queue to disk.""" - track = packets.PacketTrack() - track.save() - return json.dumps({"messages": "saved"}) - - -@app.route("/log_entries", methods=["POST"]) -def log_entries(): - """The url that the server can call to update the logs.""" - entries = request.json - LOG.info(f"Log entries called {len(entries)}") - for entry in entries: - logging_queue.put(entry) - return json.dumps({"messages": "saved"}) - - -class LogUpdateThread(threads.APRSDThread): - - def __init__(self, logging_queue=None): - super().__init__("LogUpdate") - self.logging_queue = logging_queue - - def loop(self): - if sio: - try: - log_entry = self.logging_queue.get(block=True, timeout=1) - if log_entry: - sio.emit( - "log_entry", - log_entry, - namespace="/logs", - ) - except queue.Empty: - pass - return True - - -class LoggingNamespace(socketio.Namespace): - log_thread = None - - def on_connect(self, sid, environ): - global sio, logging_queue - LOG.info(f"LOG on_connect {sid}") - sio.emit( - "connected", {"data": "/logs Connected"}, - namespace="/logs", - ) - self.log_thread = LogUpdateThread(logging_queue=logging_queue) - self.log_thread.start() - - def on_disconnect(self, sid): - LOG.info(f"LOG Disconnected {sid}") - if self.log_thread: - self.log_thread.stop() - - -def init_app(config_file=None, log_level=None): - default_config_file = cli_helper.DEFAULT_CONFIG_FILE - if not config_file: - config_file = default_config_file - - CONF( - [], project="aprsd", version=aprsd.__version__, - default_config_files=[config_file], - ) - - if not log_level: - log_level = CONF.logging.log_level - - return log_level - - -if __name__ == "__main__": - async_mode = "threading" - sio = socketio.Server(logger=True, async_mode=async_mode) - app.wsgi_app = socketio.WSGIApp(sio, app.wsgi_app) - log_level = init_app() - log.setup_logging(log_level) - sio.register_namespace(LoggingNamespace("/logs")) - CONF.log_opt_values(LOG, logging.DEBUG) - app.run( - threaded=True, - debug=False, - port=CONF.admin.web_port, - host=CONF.admin.web_ip, - ) - - -if __name__ == "uwsgi_file_aprsd_wsgi": - # Start with - # uwsgi --http :8000 --gevent 1000 --http-websockets --master -w aprsd.wsgi --callable app - - async_mode = "gevent_uwsgi" - sio = socketio.Server(logger=True, async_mode=async_mode) - app.wsgi_app = socketio.WSGIApp(sio, app.wsgi_app) - log_level = init_app( - # log_level="DEBUG", - config_file="/config/aprsd.conf", - # Commented out for local development. - # config_file=cli_helper.DEFAULT_CONFIG_FILE - ) - log.setup_logging(log_level) - sio.register_namespace(LoggingNamespace("/logs")) - CONF.log_opt_values(LOG, logging.DEBUG) - - -if __name__ == "aprsd.wsgi" and not ADMIN_COMMAND: - # set async_mode to 'threading', 'eventlet', 'gevent' or 'gevent_uwsgi' to - # force a mode else, the best mode is selected automatically from what's - # installed - async_mode = "gevent_uwsgi" - sio = socketio.Server(logger=True, async_mode=async_mode) - app.wsgi_app = socketio.WSGIApp(sio, app.wsgi_app) - - log_level = init_app( - # log_level="DEBUG", - config_file="/config/aprsd.conf", - # config_file=cli_helper.DEFAULT_CONFIG_FILE, - ) - log.setup_logging(log_level) - sio.register_namespace(LoggingNamespace("/logs")) - CONF.log_opt_values(LOG, logging.DEBUG) From 8f8887f0e496d960b0e71275893b75408a40fdb2 Mon Sep 17 00:00:00 2001 From: Hemna Date: Mon, 9 Dec 2024 16:53:51 -0500 Subject: [PATCH 02/40] Remove webchat as a built in command. Webchat will now be an extension that can be installed. the extension is here: https://github.com/hemna/aprsd-webchat-extension Install it from git or pypi. --- aprsd/cmds/webchat.py | 643 -------- aprsd/conf/common.py | 36 - aprsd/log/log.py | 18 +- aprsd/main.py | 2 +- aprsd/web/__init__.py | 0 aprsd/web/admin/__init__.py | 0 aprsd/web/admin/static/css/index.css | 84 -- aprsd/web/admin/static/css/prism.css | 4 - aprsd/web/admin/static/css/tabs.css | 35 - aprsd/web/admin/static/images/Untitled.png | Bin 37797 -> 0 bytes .../admin/static/images/aprs-symbols-16-0.png | Bin 52962 -> 0 bytes .../admin/static/images/aprs-symbols-16-1.png | Bin 48951 -> 0 bytes .../admin/static/images/aprs-symbols-64-0.png | Bin 52962 -> 0 bytes .../admin/static/images/aprs-symbols-64-1.png | Bin 48951 -> 0 bytes .../admin/static/images/aprs-symbols-64-2.png | Bin 40716 -> 0 bytes aprsd/web/admin/static/js/charts.js | 235 --- aprsd/web/admin/static/js/echarts.js | 465 ------ aprsd/web/admin/static/js/logs.js | 26 - aprsd/web/admin/static/js/main.js | 231 --- aprsd/web/admin/static/js/prism.js | 12 - aprsd/web/admin/static/js/send-message.js | 114 -- aprsd/web/admin/static/js/tabs.js | 28 - aprsd/web/admin/templates/index.html | 196 --- aprsd/web/chat/static/css/chat.css | 115 -- aprsd/web/chat/static/css/index.css | 66 - aprsd/web/chat/static/css/style.css.map | 1 - aprsd/web/chat/static/css/tabs.css | 41 - .../static/css/upstream/bootstrap.min.css | 6 - aprsd/web/chat/static/css/upstream/font.woff2 | Bin 883712 -> 0 bytes .../chat/static/css/upstream/google-fonts.css | 23 - .../chat/static/css/upstream/jquery-ui.css | 1311 ----------------- .../chat/static/css/upstream/jquery.toast.css | 28 - .../default/assets/fonts/LatoLatin-Bold.woff | Bin 72376 -> 0 bytes .../default/assets/fonts/LatoLatin-Bold.woff2 | Bin 44380 -> 0 bytes .../assets/fonts/LatoLatin-Regular.woff | Bin 72456 -> 0 bytes .../assets/fonts/LatoLatin-Regular.woff2 | Bin 43760 -> 0 bytes .../themes/default/assets/fonts/icons.woff | Bin 101648 -> 0 bytes .../themes/default/assets/fonts/icons.woff2 | Bin 78268 -> 0 bytes .../default/assets/fonts/outline-icons.woff | Bin 16276 -> 0 bytes .../default/assets/fonts/outline-icons.woff2 | Bin 13224 -> 0 bytes aprsd/web/chat/static/images/Untitled.png | Bin 37797 -> 0 bytes .../chat/static/images/aprs-symbols-16-0.png | Bin 52962 -> 0 bytes .../chat/static/images/aprs-symbols-16-1.png | Bin 48951 -> 0 bytes .../chat/static/images/aprs-symbols-64-0.png | Bin 52962 -> 0 bytes .../chat/static/images/aprs-symbols-64-1.png | Bin 48951 -> 0 bytes .../chat/static/images/aprs-symbols-64-2.png | Bin 40716 -> 0 bytes aprsd/web/chat/static/images/globe.svg | 3 - aprsd/web/chat/static/js/gps.js | 84 -- aprsd/web/chat/static/js/main.js | 45 - aprsd/web/chat/static/js/send-message.js | 612 -------- aprsd/web/chat/static/js/tabs.js | 28 - .../js/upstream/bootstrap.bundle.min.js | 7 - .../static/js/upstream/jquery-3.7.1.min.js | 2 - .../chat/static/js/upstream/jquery-ui.min.js | 13 - .../chat/static/js/upstream/jquery.toast.js | 374 ----- .../chat/static/js/upstream/semantic.min.js | 11 - .../chat/static/js/upstream/socket.io.min.js | 7 - aprsd/web/chat/templates/index.html | 139 -- requirements-dev.txt | 8 +- requirements.in | 8 - requirements.txt | 28 +- tests/cmds/test_send_message.py | 4 +- tests/cmds/test_webchat.py | 90 -- 63 files changed, 11 insertions(+), 5172 deletions(-) delete mode 100644 aprsd/cmds/webchat.py delete mode 100644 aprsd/web/__init__.py delete mode 100644 aprsd/web/admin/__init__.py delete mode 100644 aprsd/web/admin/static/css/index.css delete mode 100644 aprsd/web/admin/static/css/prism.css delete mode 100644 aprsd/web/admin/static/css/tabs.css delete mode 100644 aprsd/web/admin/static/images/Untitled.png delete mode 100644 aprsd/web/admin/static/images/aprs-symbols-16-0.png delete mode 100644 aprsd/web/admin/static/images/aprs-symbols-16-1.png delete mode 100644 aprsd/web/admin/static/images/aprs-symbols-64-0.png delete mode 100644 aprsd/web/admin/static/images/aprs-symbols-64-1.png delete mode 100644 aprsd/web/admin/static/images/aprs-symbols-64-2.png delete mode 100644 aprsd/web/admin/static/js/charts.js delete mode 100644 aprsd/web/admin/static/js/echarts.js delete mode 100644 aprsd/web/admin/static/js/logs.js delete mode 100644 aprsd/web/admin/static/js/main.js delete mode 100644 aprsd/web/admin/static/js/prism.js delete mode 100644 aprsd/web/admin/static/js/send-message.js delete mode 100644 aprsd/web/admin/static/js/tabs.js delete mode 100644 aprsd/web/admin/templates/index.html delete mode 100644 aprsd/web/chat/static/css/chat.css delete mode 100644 aprsd/web/chat/static/css/index.css delete mode 100644 aprsd/web/chat/static/css/style.css.map delete mode 100644 aprsd/web/chat/static/css/tabs.css delete mode 100644 aprsd/web/chat/static/css/upstream/bootstrap.min.css delete mode 100644 aprsd/web/chat/static/css/upstream/font.woff2 delete mode 100644 aprsd/web/chat/static/css/upstream/google-fonts.css delete mode 100644 aprsd/web/chat/static/css/upstream/jquery-ui.css delete mode 100644 aprsd/web/chat/static/css/upstream/jquery.toast.css delete mode 100644 aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Bold.woff delete mode 100644 aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Bold.woff2 delete mode 100644 aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Regular.woff delete mode 100644 aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/LatoLatin-Regular.woff2 delete mode 100644 aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/icons.woff delete mode 100644 aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/icons.woff2 delete mode 100644 aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/outline-icons.woff delete mode 100644 aprsd/web/chat/static/css/upstream/themes/default/assets/fonts/outline-icons.woff2 delete mode 100644 aprsd/web/chat/static/images/Untitled.png delete mode 100644 aprsd/web/chat/static/images/aprs-symbols-16-0.png delete mode 100644 aprsd/web/chat/static/images/aprs-symbols-16-1.png delete mode 100644 aprsd/web/chat/static/images/aprs-symbols-64-0.png delete mode 100644 aprsd/web/chat/static/images/aprs-symbols-64-1.png delete mode 100644 aprsd/web/chat/static/images/aprs-symbols-64-2.png delete mode 100644 aprsd/web/chat/static/images/globe.svg delete mode 100644 aprsd/web/chat/static/js/gps.js delete mode 100644 aprsd/web/chat/static/js/main.js delete mode 100644 aprsd/web/chat/static/js/send-message.js delete mode 100644 aprsd/web/chat/static/js/tabs.js delete mode 100644 aprsd/web/chat/static/js/upstream/bootstrap.bundle.min.js delete mode 100644 aprsd/web/chat/static/js/upstream/jquery-3.7.1.min.js delete mode 100644 aprsd/web/chat/static/js/upstream/jquery-ui.min.js delete mode 100644 aprsd/web/chat/static/js/upstream/jquery.toast.js delete mode 100644 aprsd/web/chat/static/js/upstream/semantic.min.js delete mode 100644 aprsd/web/chat/static/js/upstream/socket.io.min.js delete mode 100644 aprsd/web/chat/templates/index.html delete mode 100644 tests/cmds/test_webchat.py diff --git a/aprsd/cmds/webchat.py b/aprsd/cmds/webchat.py deleted file mode 100644 index 143d2e2..0000000 --- a/aprsd/cmds/webchat.py +++ /dev/null @@ -1,643 +0,0 @@ -import datetime -import json -import logging -import signal -import sys -import threading -import time - -import click -import flask -from flask import request -from flask_httpauth import HTTPBasicAuth -from flask_socketio import Namespace, SocketIO -from geopy.distance import geodesic -from oslo_config import cfg -import timeago -import wrapt - -import aprsd -from aprsd import cli_helper, client, packets, plugin_utils, stats, threads -from aprsd import utils -from aprsd import utils as aprsd_utils -from aprsd.client import client_factory, kiss -from aprsd.main import cli -from aprsd.threads import aprsd as aprsd_threads -from aprsd.threads import keep_alive, rx -from aprsd.threads import stats as stats_thread -from aprsd.threads import tx -from aprsd.utils import trace - - -CONF = cfg.CONF -LOG = logging.getLogger() -auth = HTTPBasicAuth() -socketio = None - -# List of callsigns that we don't want to track/fetch their location -callsign_no_track = [ - "APDW16", "BLN0", "BLN1", "BLN2", - "BLN3", "BLN4", "BLN5", "BLN6", "BLN7", "BLN8", "BLN9", -] - -# Callsign location information -# callsign: {lat: 0.0, long: 0.0, last_update: datetime} -callsign_locations = {} - -flask_app = flask.Flask( - "aprsd", - static_url_path="/static", - static_folder="web/chat/static", - template_folder="web/chat/templates", -) - - -def signal_handler(sig, frame): - - click.echo("signal_handler: called") - LOG.info( - f"Ctrl+C, Sending all threads({len(threads.APRSDThreadList())}) exit! " - f"Can take up to 10 seconds {datetime.datetime.now()}", - ) - threads.APRSDThreadList().stop_all() - if "subprocess" not in str(frame): - time.sleep(1.5) - stats.stats_collector.collect() - LOG.info("Telling flask to bail.") - signal.signal(signal.SIGTERM, sys.exit(0)) - - -class SentMessages: - - _instance = None - lock = threading.Lock() - - data = {} - - def __new__(cls, *args, **kwargs): - """This magic turns this into a singleton.""" - if cls._instance is None: - cls._instance = super().__new__(cls) - return cls._instance - - def is_initialized(self): - return True - - @wrapt.synchronized(lock) - def add(self, msg): - self.data[msg.msgNo] = msg.__dict__ - - @wrapt.synchronized(lock) - def __len__(self): - return len(self.data.keys()) - - @wrapt.synchronized(lock) - def get(self, id): - if id in self.data: - return self.data[id] - - @wrapt.synchronized(lock) - def get_all(self): - return self.data - - @wrapt.synchronized(lock) - def set_status(self, id, status): - if id in self.data: - self.data[id]["last_update"] = str(datetime.datetime.now()) - self.data[id]["status"] = status - - @wrapt.synchronized(lock) - def ack(self, id): - """The message got an ack!""" - if id in self.data: - self.data[id]["last_update"] = str(datetime.datetime.now()) - self.data[id]["ack"] = True - - @wrapt.synchronized(lock) - def reply(self, id, packet): - """We got a packet back from the sent message.""" - if id in self.data: - self.data[id]["reply"] = packet - - -def _build_location_from_repeat(message): - # This is a location message Format is - # ^ld^callsign:latitude,longitude,altitude,course,speed,timestamp - a = message.split(":") - LOG.warning(a) - if len(a) == 2: - callsign = a[0].replace("^ld^", "") - b = a[1].split(",") - LOG.warning(b) - if len(b) == 6: - lat = float(b[0]) - lon = float(b[1]) - alt = float(b[2]) - course = float(b[3]) - speed = float(b[4]) - time = int(b[5]) - compass_bearing = aprsd_utils.degrees_to_cardinal(course) - data = { - "callsign": callsign, - "lat": lat, - "lon": lon, - "altitude": alt, - "course": course, - "compass_bearing": compass_bearing, - "speed": speed, - "lasttime": time, - "timeago": timeago.format(time), - } - LOG.debug(f"Location data from REPEAT {data}") - return data - - -def _calculate_location_data(location_data): - """Calculate all of the location data from data from aprs.fi or REPEAT.""" - lat = location_data["lat"] - lon = location_data["lon"] - alt = location_data["altitude"] - speed = location_data["speed"] - lasttime = location_data["lasttime"] - timeago_str = location_data.get( - "timeago", - timeago.format(lasttime), - ) - # now calculate distance from our own location - distance = 0 - if CONF.webchat.latitude and CONF.webchat.longitude: - our_lat = float(CONF.webchat.latitude) - our_lon = float(CONF.webchat.longitude) - distance = geodesic((our_lat, our_lon), (lat, lon)).kilometers - bearing = aprsd_utils.calculate_initial_compass_bearing( - (our_lat, our_lon), - (lat, lon), - ) - compass_bearing = aprsd_utils.degrees_to_cardinal(bearing) - return { - "callsign": location_data["callsign"], - "lat": lat, - "lon": lon, - "altitude": alt, - "course": f"{bearing:0.1f}", - "compass_bearing": compass_bearing, - "speed": speed, - "lasttime": lasttime, - "timeago": timeago_str, - "distance": f"{distance:0.1f}", - } - - -def send_location_data_to_browser(location_data): - global socketio - callsign = location_data["callsign"] - LOG.info(f"Got location for {callsign} {callsign_locations[callsign]}") - socketio.emit( - "callsign_location", callsign_locations[callsign], - namespace="/sendmsg", - ) - - -def populate_callsign_location(callsign, data=None): - """Populate the location for the callsign. - - if data is passed in, then we have the location already from - an APRS packet. If data is None, then we need to fetch the - location from aprs.fi or REPEAT. - """ - global socketio - """Fetch the location for the callsign.""" - LOG.debug(f"populate_callsign_location {callsign}") - if data: - location_data = _calculate_location_data(data) - callsign_locations[callsign] = location_data - send_location_data_to_browser(location_data) - return - - # First we are going to try to get the location from aprs.fi - # if there is no internets, then this will fail and we will - # fallback to calling REPEAT for the location for the callsign. - fallback = False - if not CONF.aprs_fi.apiKey: - LOG.warning( - "Config aprs_fi.apiKey is not set. Can't get location from aprs.fi " - " falling back to sending REPEAT to get location.", - ) - fallback = True - else: - try: - aprs_data = plugin_utils.get_aprs_fi(CONF.aprs_fi.apiKey, callsign) - if not len(aprs_data["entries"]): - LOG.error("Didn't get any entries from aprs.fi") - return - lat = float(aprs_data["entries"][0]["lat"]) - lon = float(aprs_data["entries"][0]["lng"]) - try: # altitude not always provided - alt = float(aprs_data["entries"][0]["altitude"]) - except Exception: - alt = 0 - location_data = { - "callsign": callsign, - "lat": lat, - "lon": lon, - "altitude": alt, - "lasttime": int(aprs_data["entries"][0]["lasttime"]), - "course": float(aprs_data["entries"][0].get("course", 0)), - "speed": float(aprs_data["entries"][0].get("speed", 0)), - } - location_data = _calculate_location_data(location_data) - callsign_locations[callsign] = location_data - send_location_data_to_browser(location_data) - return - except Exception as ex: - LOG.error(f"Failed to fetch aprs.fi '{ex}'") - LOG.error(ex) - fallback = True - - if fallback: - # We don't have the location data - # and we can't get it from aprs.fi - # Send a special message to REPEAT to get the location data - LOG.info(f"Sending REPEAT to get location for callsign {callsign}.") - tx.send( - packets.MessagePacket( - from_call=CONF.callsign, - to_call="REPEAT", - message_text=f"ld {callsign}", - ), - ) - - -class WebChatProcessPacketThread(rx.APRSDProcessPacketThread): - """Class that handles packets being sent to us.""" - - def __init__(self, packet_queue, socketio): - self.socketio = socketio - self.connected = False - super().__init__(packet_queue) - - def process_ack_packet(self, packet: packets.AckPacket): - super().process_ack_packet(packet) - ack_num = packet.get("msgNo") - SentMessages().ack(ack_num) - msg = SentMessages().get(ack_num) - if msg: - self.socketio.emit( - "ack", msg, - namespace="/sendmsg", - ) - self.got_ack = True - - def process_our_message_packet(self, packet: packets.MessagePacket): - global callsign_locations - # ok lets see if we have the location for the - # person we just sent a message to. - from_call = packet.get("from_call").upper() - if from_call == "REPEAT": - # We got a message from REPEAT. Is this a location message? - message = packet.get("message_text") - if message.startswith("^ld^"): - location_data = _build_location_from_repeat(message) - callsign = location_data["callsign"] - location_data = _calculate_location_data(location_data) - callsign_locations[callsign] = location_data - send_location_data_to_browser(location_data) - return - elif ( - from_call not in callsign_locations - and from_call not in callsign_no_track - and client_factory.create().transport() in [client.TRANSPORT_APRSIS, client.TRANSPORT_FAKE] - ): - # We have to ask aprs for the location for the callsign - # We send a message packet to wb4bor-11 asking for location. - populate_callsign_location(from_call) - # Send the packet to the browser. - self.socketio.emit( - "new", packet.__dict__, - namespace="/sendmsg", - ) - - -class LocationProcessingThread(aprsd_threads.APRSDThread): - """Class to handle the location processing.""" - def __init__(self): - super().__init__("LocationProcessingThread") - - def loop(self): - pass - - -def _get_transport(stats): - if CONF.aprs_network.enabled: - transport = "aprs-is" - aprs_connection = ( - "APRS-IS Server: " - "{}".format(stats["APRSClientStats"]["server_string"]) - ) - elif kiss.KISSClient.is_enabled(): - transport = kiss.KISSClient.transport() - if transport == client.TRANSPORT_TCPKISS: - aprs_connection = ( - "TCPKISS://{}:{}".format( - CONF.kiss_tcp.host, - CONF.kiss_tcp.port, - ) - ) - elif transport == client.TRANSPORT_SERIALKISS: - # for pep8 violation - aprs_connection = ( - "SerialKISS://{}@{} baud".format( - CONF.kiss_serial.device, - CONF.kiss_serial.baudrate, - ), - ) - elif CONF.fake_client.enabled: - transport = client.TRANSPORT_FAKE - aprs_connection = "Fake Client" - - return transport, aprs_connection - - -@flask_app.route("/location/", methods=["POST"]) -def location(callsign): - LOG.debug(f"Fetch location for callsign {callsign}") - if not callsign in callsign_no_track: - populate_callsign_location(callsign) - - -@auth.login_required -@flask_app.route("/") -def index(): - stats = _stats() - - # For development - html_template = "index.html" - LOG.debug(f"Template {html_template}") - - transport, aprs_connection = _get_transport(stats["stats"]) - LOG.debug(f"transport {transport} aprs_connection {aprs_connection}") - - stats["transport"] = transport - stats["aprs_connection"] = aprs_connection - LOG.debug(f"initial stats = {stats}") - latitude = CONF.webchat.latitude - if latitude: - latitude = float(CONF.webchat.latitude) - - longitude = CONF.webchat.longitude - if longitude: - longitude = float(longitude) - - return flask.render_template( - html_template, - initial_stats=stats, - aprs_connection=aprs_connection, - callsign=CONF.callsign, - version=aprsd.__version__, - latitude=latitude, - longitude=longitude, - ) - - -@auth.login_required -@flask_app.route("/send-message-status") -def send_message_status(): - LOG.debug(request) - msgs = SentMessages() - info = msgs.get_all() - return json.dumps(info) - - -def _stats(): - now = datetime.datetime.now() - - time_format = "%m-%d-%Y %H:%M:%S" - stats_dict = stats.stats_collector.collect(serializable=True) - # Webchat doesnt need these - if "WatchList" in stats_dict: - del stats_dict["WatchList"] - if "SeenList" in stats_dict: - del stats_dict["SeenList"] - if "APRSDThreadList" in stats_dict: - del stats_dict["APRSDThreadList"] - if "PacketList" in stats_dict: - del stats_dict["PacketList"] - if "EmailStats" in stats_dict: - del stats_dict["EmailStats"] - if "PluginManager" in stats_dict: - del stats_dict["PluginManager"] - - result = { - "time": now.strftime(time_format), - "stats": stats_dict, - } - return result - - -@flask_app.route("/stats") -def get_stats(): - return json.dumps(_stats()) - - -class SendMessageNamespace(Namespace): - """Class to handle the socketio interactions.""" - got_ack = False - reply_sent = False - msg = None - request = None - - def __init__(self, namespace=None, config=None): - super().__init__(namespace) - - def on_connect(self): - global socketio - LOG.debug("Web socket connected") - socketio.emit( - "connected", {"data": "/sendmsg Connected"}, - namespace="/sendmsg", - ) - - def on_disconnect(self): - LOG.debug("WS Disconnected") - - def on_send(self, data): - global socketio - LOG.debug(f"WS: on_send {data}") - self.request = data - data["from"] = CONF.callsign - path = data.get("path", None) - if not path: - path = [] - elif "," in path: - path_opts = path.split(",") - path = [x.strip() for x in path_opts] - else: - path = [path] - - pkt = packets.MessagePacket( - from_call=data["from"], - to_call=data["to"].upper(), - message_text=data["message"], - path=path, - ) - pkt.prepare() - self.msg = pkt - msgs = SentMessages() - tx.send(pkt) - msgs.add(pkt) - msgs.set_status(pkt.msgNo, "Sending") - obj = msgs.get(pkt.msgNo) - socketio.emit( - "sent", obj, - namespace="/sendmsg", - ) - - def on_gps(self, data): - LOG.debug(f"WS on_GPS: {data}") - lat = data["latitude"] - long = data["longitude"] - LOG.debug(f"Lat {lat}") - LOG.debug(f"Long {long}") - path = data.get("path", None) - if not path: - path = [] - elif "," in path: - path_opts = path.split(",") - path = [x.strip() for x in path_opts] - else: - path = [path] - - tx.send( - packets.BeaconPacket( - from_call=CONF.callsign, - to_call="APDW16", - latitude=lat, - longitude=long, - comment="APRSD WebChat Beacon", - path=path, - ), - direct=True, - ) - - def handle_message(self, data): - LOG.debug(f"WS Data {data}") - - def handle_json(self, data): - LOG.debug(f"WS json {data}") - - def on_get_callsign_location(self, data): - LOG.debug(f"on_callsign_location {data}") - if data["callsign"] not in callsign_no_track: - populate_callsign_location(data["callsign"]) - - -@trace.trace -def init_flask(loglevel, quiet): - global socketio, flask_app - - socketio = SocketIO( - flask_app, logger=False, engineio_logger=False, - async_mode="threading", - ) - - socketio.on_namespace( - SendMessageNamespace( - "/sendmsg", - ), - ) - return socketio - - -# main() ### -@cli.command() -@cli_helper.add_options(cli_helper.common_options) -@click.option( - "-f", - "--flush", - "flush", - is_flag=True, - show_default=True, - default=False, - help="Flush out all old aged messages on disk.", -) -@click.option( - "-p", - "--port", - "port", - show_default=True, - default=None, - help="Port to listen to web requests. This overrides the config.webchat.web_port setting.", -) -@click.pass_context -@cli_helper.process_standard_options -def webchat(ctx, flush, port): - """Web based HAM Radio chat program!""" - loglevel = ctx.obj["loglevel"] - quiet = ctx.obj["quiet"] - - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGTERM, signal_handler) - - level, msg = utils._check_version() - if level: - LOG.warning(msg) - else: - LOG.info(msg) - LOG.info(f"APRSD Started version: {aprsd.__version__}") - - CONF.log_opt_values(logging.getLogger(), logging.DEBUG) - if not port: - port = CONF.webchat.web_port - - # Initialize the client factory and create - # The correct client object ready for use - # Make sure we have 1 client transport enabled - if not client_factory.is_client_enabled(): - LOG.error("No Clients are enabled in config.") - sys.exit(-1) - - if not client_factory.is_client_configured(): - LOG.error("APRS client is not properly configured in config file.") - sys.exit(-1) - - # Creates the client object - LOG.info("Creating client connection") - aprs_client = client_factory.create() - LOG.info(aprs_client) - if not aprs_client.login_success: - # We failed to login, will just quit! - msg = f"Login Failure: {aprs_client.login_failure}" - LOG.error(msg) - print(msg) - sys.exit(-1) - - keepalive = keep_alive.KeepAliveThread() - LOG.info("Start KeepAliveThread") - keepalive.start() - - stats_store_thread = stats_thread.APRSDStatsStoreThread() - stats_store_thread.start() - - socketio = init_flask(loglevel, quiet) - rx_thread = rx.APRSDPluginRXThread( - packet_queue=threads.packet_queue, - ) - rx_thread.start() - process_thread = WebChatProcessPacketThread( - packet_queue=threads.packet_queue, - socketio=socketio, - ) - process_thread.start() - - LOG.info("Start socketio.run()") - socketio.run( - flask_app, - # This is broken for now after removing cryptography - # and pyopenssl - # ssl_context="adhoc", - host=CONF.webchat.web_ip, - port=port, - allow_unsafe_werkzeug=True, - ) - - LOG.info("WebChat exiting!!!! Bye.") diff --git a/aprsd/conf/common.py b/aprsd/conf/common.py index c713fd8..2ff0991 100644 --- a/aprsd/conf/common.py +++ b/aprsd/conf/common.py @@ -11,17 +11,12 @@ watch_list_group = cfg.OptGroup( name="watch_list", title="Watch List settings", ) -webchat_group = cfg.OptGroup( - name="webchat", - title="Settings specific to the webchat command", -) registry_group = cfg.OptGroup( name="aprs_registry", title="APRS Registry settings", ) - aprsd_opts = [ cfg.StrOpt( "callsign", @@ -194,34 +189,6 @@ enabled_plugins_opts = [ ), ] -webchat_opts = [ - cfg.StrOpt( - "web_ip", - default="0.0.0.0", - help="The ip address to listen on", - ), - cfg.PortOpt( - "web_port", - default=8001, - help="The port to listen on", - ), - cfg.StrOpt( - "latitude", - default=None, - help="Latitude for the GPS Beacon button. If not set, the button will not be enabled.", - ), - cfg.StrOpt( - "longitude", - default=None, - help="Longitude for the GPS Beacon button. If not set, the button will not be enabled.", - ), - cfg.BoolOpt( - "disable_url_request_logging", - default=False, - help="Disable the logging of url requests in the webchat command.", - ), -] - registry_opts = [ cfg.BoolOpt( "enabled", @@ -261,8 +228,6 @@ def register_opts(config): config.register_opts(enabled_plugins_opts) config.register_group(watch_list_group) config.register_opts(watch_list_opts, group=watch_list_group) - config.register_group(webchat_group) - config.register_opts(webchat_opts, group=webchat_group) config.register_group(registry_group) config.register_opts(registry_opts, group=registry_group) @@ -271,6 +236,5 @@ def list_opts(): return { "DEFAULT": (aprsd_opts + enabled_plugins_opts), watch_list_group.name: watch_list_opts, - webchat_group.name: webchat_opts, registry_group.name: registry_opts, } diff --git a/aprsd/log/log.py b/aprsd/log/log.py index e50a38f..8204106 100644 --- a/aprsd/log/log.py +++ b/aprsd/log/log.py @@ -68,19 +68,9 @@ def setup_logging(loglevel=None, quiet=False): "aprslib.parsing", "aprslib.exceptions", ] - webserver_list = [ - "werkzeug", - "werkzeug._internal", - "socketio", - "urllib3.connectionpool", - "chardet", - "chardet.charsetgroupprober", - "chardet.eucjpprober", - "chardet.mbcharsetprober", - ] # We don't really want to see the aprslib parsing debug output. - disable_list = imap_list + aprslib_list + webserver_list + disable_list = imap_list + aprslib_list # remove every other logger's handlers # and propagate to root logger @@ -91,12 +81,6 @@ def setup_logging(loglevel=None, quiet=False): else: logging.getLogger(name).propagate = True - if CONF.webchat.disable_url_request_logging: - for name in webserver_list: - logging.getLogger(name).handlers = [] - logging.getLogger(name).propagate = True - logging.getLogger(name).setLevel(logging.ERROR) - handlers = [ { "sink": sys.stdout, diff --git a/aprsd/main.py b/aprsd/main.py index 669f254..eb409f3 100644 --- a/aprsd/main.py +++ b/aprsd/main.py @@ -55,7 +55,7 @@ def cli(ctx): def load_commands(): from .cmds import ( # noqa completion, dev, fetch_stats, healthcheck, list_plugins, listen, - send_message, server, webchat, + send_message, server, ) diff --git a/aprsd/web/__init__.py b/aprsd/web/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/aprsd/web/admin/__init__.py b/aprsd/web/admin/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/aprsd/web/admin/static/css/index.css b/aprsd/web/admin/static/css/index.css deleted file mode 100644 index 0fe80e1..0000000 --- a/aprsd/web/admin/static/css/index.css +++ /dev/null @@ -1,84 +0,0 @@ -body { - background: #eeeeee; - margin: 2em; - text-align: center; - font-family: system-ui, sans-serif; -} - -footer { - padding: 2em; - text-align: center; - height: 10vh; -} - -.ui.segment { - background: #eeeeee; -} - -#graphs { - display: grid; - width: 100%; - height: 300px; - grid-template-columns: 1fr 1fr; -} -#graphs_center { - display: block; - margin-top: 10px; - margin-bottom: 10px; - width: 100%; - height: 300px; -} -#left { - margin-right: 2px; - height: 300px; -} -#right { - height: 300px; -} -#center { - height: 300px; -} -#packetsChart, #messageChart, #emailChart, #memChart { - border: 1px solid #ccc; - background: #ddd; -} -#stats { - margin: auto; - width: 80%; -} -#jsonstats { - display: none; -} -#title { - font-size: 4em; -} -#version{ - font-size: .5em; -} -#uptime, #aprsis { - font-size: 1em; -} -#callsign { - font-size: 1.4em; - color: #00F; - padding-top: 8px; - margin:10px; -} - -#title_rx { - background-color: darkseagreen; - text-align: left; -} - -#title_tx { - background-color: lightcoral; - text-align: left; -} - -.aprsd_1 { - background-image: url(/static/images/aprs-symbols-16-0.png); - background-repeat: no-repeat; - background-position: -160px -48px; - width: 16px; - height: 16px; -} diff --git a/aprsd/web/admin/static/css/prism.css b/aprsd/web/admin/static/css/prism.css deleted file mode 100644 index e088b7f..0000000 --- a/aprsd/web/admin/static/css/prism.css +++ /dev/null @@ -1,4 +0,0 @@ -/* PrismJS 1.29.0 -https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+json+json5+log&plugins=show-language+toolbar */ -code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green} -div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none} diff --git a/aprsd/web/admin/static/css/tabs.css b/aprsd/web/admin/static/css/tabs.css deleted file mode 100644 index b3a67a5..0000000 --- a/aprsd/web/admin/static/css/tabs.css +++ /dev/null @@ -1,35 +0,0 @@ -/* Style the tab */ -.tab { - overflow: hidden; - border: 1px solid #ccc; - background-color: #f1f1f1; -} - -/* Style the buttons that are used to open the tab content */ -.tab button { - background-color: inherit; - float: left; - border: none; - outline: none; - cursor: pointer; - padding: 14px 16px; - transition: 0.3s; -} - -/* Change background color of buttons on hover */ -.tab button:hover { - background-color: #ddd; -} - -/* Create an active/current tablink class */ -.tab button.active { - background-color: #ccc; -} - -/* Style the tab content */ -.tabcontent { - display: none; - padding: 6px 12px; - border: 1px solid #ccc; - border-top: none; -} diff --git a/aprsd/web/admin/static/images/Untitled.png b/aprsd/web/admin/static/images/Untitled.png deleted file mode 100644 index 666fbc4bfedf447da0139a03297f12c34f362867..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37797 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 Vw?{v%#MS@+002ovPDHLkV1oN<>N)@b diff --git a/aprsd/web/admin/static/images/aprs-symbols-64-0.png b/aprsd/web/admin/static/images/aprs-symbols-64-0.png deleted file mode 100644 index 81eec3d42edcab4b257bf7bd220661bdc1386fe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52962 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 Vw?{v%#MS@+002ovPDHLkV1oN<>N)@b diff --git a/aprsd/web/admin/static/images/aprs-symbols-64-2.png b/aprsd/web/admin/static/images/aprs-symbols-64-2.png deleted file mode 100644 index 1f940d4356107f648d260997921f5f6c398f90ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40716 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 P`Gwz}!Z}x;{4VW(H?$oS diff --git a/aprsd/web/admin/static/js/charts.js b/aprsd/web/admin/static/js/charts.js deleted file mode 100644 index 237641a..0000000 --- a/aprsd/web/admin/static/js/charts.js +++ /dev/null @@ -1,235 +0,0 @@ -var packet_list = {}; - -window.chartColors = { - red: 'rgb(255, 99, 132)', - orange: 'rgb(255, 159, 64)', - yellow: 'rgb(255, 205, 86)', - green: 'rgb(26, 181, 77)', - blue: 'rgb(54, 162, 235)', - purple: 'rgb(153, 102, 255)', - grey: 'rgb(201, 203, 207)', - black: 'rgb(0, 0, 0)', - lightcoral: 'rgb(240,128,128)', - darkseagreen: 'rgb(143, 188,143)' - -}; - -function size_dict(d){c=0; for (i in d) ++c; return c} - -function start_charts() { - Chart.scaleService.updateScaleDefaults('linear', { - ticks: { - min: 0 - } - }); - - packets_chart = new Chart($("#packetsChart"), { - label: 'APRS Packets', - type: 'line', - data: { - labels: [], - datasets: [{ - label: 'Packets Sent', - borderColor: window.chartColors.lightcoral, - data: [], - }, - { - label: 'Packets Recieved', - borderColor: window.chartColors.darkseagreen, - data: [], - }] - }, - options: { - responsive: true, - maintainAspectRatio: false, - title: { - display: true, - text: 'APRS Packets', - }, - scales: { - x: { - type: 'timeseries', - offset: true, - ticks: { - major: { enabled: true }, - fontStyle: context => context.tick.major ? 'bold' : undefined, - source: 'data', - maxRotation: 0, - autoSkip: true, - autoSkipPadding: 75, - } - } - } - } - }); - - message_chart = new Chart($("#messageChart"), { - label: 'Messages', - type: 'line', - data: { - labels: [], - datasets: [{ - label: 'Messages Sent', - borderColor: window.chartColors.lightcoral, - data: [], - }, - { - label: 'Messages Recieved', - borderColor: window.chartColors.darkseagreen, - data: [], - }, - { - label: 'Ack Sent', - borderColor: window.chartColors.purple, - data: [], - }, - { - label: 'Ack Recieved', - borderColor: window.chartColors.black, - data: [], - }], - }, - options: { - responsive: true, - maintainAspectRatio: false, - title: { - display: true, - text: 'APRS Messages', - }, - scales: { - x: { - type: 'timeseries', - offset: true, - ticks: { - major: { enabled: true }, - fontStyle: context => context.tick.major ? 'bold' : undefined, - source: 'data', - maxRotation: 0, - autoSkip: true, - autoSkipPadding: 75, - } - } - } - } - }); - - email_chart = new Chart($("#emailChart"), { - label: 'Email Messages', - type: 'line', - data: { - labels: [], - datasets: [{ - label: 'Sent', - borderColor: window.chartColors.lightcoral, - data: [], - }, - { - label: 'Recieved', - borderColor: window.chartColors.darkseagreen, - data: [], - }], - }, - options: { - responsive: true, - maintainAspectRatio: false, - title: { - display: true, - text: 'Email Messages', - }, - scales: { - x: { - type: 'timeseries', - offset: true, - ticks: { - major: { enabled: true }, - fontStyle: context => context.tick.major ? 'bold' : undefined, - source: 'data', - maxRotation: 0, - autoSkip: true, - autoSkipPadding: 75, - } - } - } - } - }); - - memory_chart = new Chart($("#memChart"), { - label: 'Memory Usage', - type: 'line', - data: { - labels: [], - datasets: [{ - label: 'Peak Ram usage', - borderColor: window.chartColors.red, - data: [], - }, - { - label: 'Current Ram usage', - borderColor: window.chartColors.blue, - data: [], - }], - }, - options: { - responsive: true, - maintainAspectRatio: false, - title: { - display: true, - text: 'Memory Usage', - }, - scales: { - x: { - type: 'timeseries', - offset: true, - ticks: { - major: { enabled: true }, - fontStyle: context => context.tick.major ? 'bold' : undefined, - source: 'data', - maxRotation: 0, - autoSkip: true, - autoSkipPadding: 75, - } - } - } - } - }); -} - - -function addData(chart, label, newdata) { - chart.data.labels.push(label); - chart.data.datasets.forEach((dataset) => { - dataset.data.push(newdata); - }); - chart.update(); -} - -function updateDualData(chart, label, first, second) { - chart.data.labels.push(label); - chart.data.datasets[0].data.push(first); - chart.data.datasets[1].data.push(second); - chart.update(); -} -function updateQuadData(chart, label, first, second, third, fourth) { - chart.data.labels.push(label); - chart.data.datasets[0].data.push(first); - chart.data.datasets[1].data.push(second); - chart.data.datasets[2].data.push(third); - chart.data.datasets[3].data.push(fourth); - chart.update(); -} - -function update_stats( data ) { - our_callsign = data["APRSDStats"]["callsign"]; - $("#version").text( data["APRSDStats"]["version"] ); - $("#aprs_connection").html( data["aprs_connection"] ); - $("#uptime").text( "uptime: " + data["APRSDStats"]["uptime"] ); - const html_pretty = Prism.highlight(JSON.stringify(data, null, '\t'), Prism.languages.json, 'json'); - $("#jsonstats").html(html_pretty); - short_time = data["time"].split(/\s(.+)/)[1]; - packet_list = data["PacketList"]["packets"]; - updateDualData(packets_chart, short_time, data["PacketList"]["sent"], data["PacketList"]["received"]); - updateQuadData(message_chart, short_time, packet_list["MessagePacket"]["tx"], packet_list["MessagePacket"]["rx"], - packet_list["AckPacket"]["tx"], packet_list["AckPacket"]["rx"]); - updateDualData(email_chart, short_time, data["EmailStats"]["sent"], data["EmailStats"]["recieved"]); - updateDualData(memory_chart, short_time, data["APRSDStats"]["memory_peak"], data["APRSDStats"]["memory_current"]); -} diff --git a/aprsd/web/admin/static/js/echarts.js b/aprsd/web/admin/static/js/echarts.js deleted file mode 100644 index 9edcb65..0000000 --- a/aprsd/web/admin/static/js/echarts.js +++ /dev/null @@ -1,465 +0,0 @@ -var packet_list = {}; - -var tx_data = []; -var rx_data = []; - -var packet_types_data = {}; - -var mem_current = [] -var mem_peak = [] - -var thread_current = [] - - -function start_charts() { - console.log("start_charts() called"); - // Initialize the echarts instance based on the prepared dom - create_packets_chart(); - create_packets_types_chart(); - create_messages_chart(); - create_ack_chart(); - create_memory_chart(); - create_thread_chart(); -} - - -function create_packets_chart() { - // The packets totals TX/RX chart. - pkt_c_canvas = document.getElementById('packetsChart'); - packets_chart = echarts.init(pkt_c_canvas); - - // Specify the configuration items and data for the chart - var option = { - title: { - text: 'APRS Packet totals' - }, - legend: {}, - tooltip : { - trigger: 'axis' - }, - toolbox: { - show : true, - feature : { - mark : {show: true}, - dataView : {show: true, readOnly: true}, - magicType : {show: true, type: ['line', 'bar']}, - restore : {show: true}, - saveAsImage : {show: true} - } - }, - calculable : true, - xAxis: { type: 'time' }, - yAxis: { }, - series: [ - { - name: 'tx', - type: 'line', - smooth: true, - color: 'red', - encode: { - x: 'timestamp', - y: 'tx' // refer sensor 1 value - } - },{ - name: 'rx', - type: 'line', - smooth: true, - encode: { - x: 'timestamp', - y: 'rx' - } - }] - }; - - // Display the chart using the configuration items and data just specified. - packets_chart.setOption(option); -} - - -function create_packets_types_chart() { - // The packets types chart - pkt_types_canvas = document.getElementById('packetTypesChart'); - packet_types_chart = echarts.init(pkt_types_canvas); - - // The series and data are built and updated on the fly - // as packets come in. - var option = { - title: { - text: 'Packet Types' - }, - legend: {}, - tooltip : { - trigger: 'axis' - }, - toolbox: { - show : true, - feature : { - mark : {show: true}, - dataView : {show: true, readOnly: true}, - magicType : {show: true, type: ['line', 'bar']}, - restore : {show: true}, - saveAsImage : {show: true} - } - }, - calculable : true, - xAxis: { type: 'time' }, - yAxis: { }, - } - - packet_types_chart.setOption(option); -} - - -function create_messages_chart() { - msg_c_canvas = document.getElementById('messagesChart'); - message_chart = echarts.init(msg_c_canvas); - - // Specify the configuration items and data for the chart - var option = { - title: { - text: 'Message Packets' - }, - legend: {}, - tooltip: { - trigger: 'axis' - }, - toolbox: { - show: true, - feature: { - mark : {show: true}, - dataView : {show: true, readOnly: true}, - magicType : {show: true, type: ['line', 'bar']}, - restore : {show: true}, - saveAsImage : {show: true} - } - }, - calculable: true, - xAxis: { type: 'time' }, - yAxis: { }, - series: [ - { - name: 'tx', - type: 'line', - smooth: true, - color: 'red', - encode: { - x: 'timestamp', - y: 'tx' // refer sensor 1 value - } - },{ - name: 'rx', - type: 'line', - smooth: true, - encode: { - x: 'timestamp', - y: 'rx' - } - }] - }; - - // Display the chart using the configuration items and data just specified. - message_chart.setOption(option); -} - -function create_ack_chart() { - ack_canvas = document.getElementById('acksChart'); - ack_chart = echarts.init(ack_canvas); - - // Specify the configuration items and data for the chart - var option = { - title: { - text: 'Ack Packets' - }, - legend: {}, - tooltip: { - trigger: 'axis' - }, - toolbox: { - show: true, - feature: { - mark : {show: true}, - dataView : {show: true, readOnly: false}, - magicType : {show: true, type: ['line', 'bar']}, - restore : {show: true}, - saveAsImage : {show: true} - } - }, - calculable: true, - xAxis: { type: 'time' }, - yAxis: { }, - series: [ - { - name: 'tx', - type: 'line', - smooth: true, - color: 'red', - encode: { - x: 'timestamp', - y: 'tx' // refer sensor 1 value - } - },{ - name: 'rx', - type: 'line', - smooth: true, - encode: { - x: 'timestamp', - y: 'rx' - } - }] - }; - - ack_chart.setOption(option); -} - -function create_memory_chart() { - ack_canvas = document.getElementById('memChart'); - memory_chart = echarts.init(ack_canvas); - - // Specify the configuration items and data for the chart - var option = { - title: { - text: 'Memory Usage' - }, - legend: {}, - tooltip: { - trigger: 'axis' - }, - toolbox: { - show: true, - feature: { - mark : {show: true}, - dataView : {show: true, readOnly: false}, - magicType : {show: true, type: ['line', 'bar']}, - restore : {show: true}, - saveAsImage : {show: true} - } - }, - calculable: true, - xAxis: { type: 'time' }, - yAxis: { }, - series: [ - { - name: 'current', - type: 'line', - smooth: true, - color: 'red', - encode: { - x: 'timestamp', - y: 'current' // refer sensor 1 value - } - },{ - name: 'peak', - type: 'line', - smooth: true, - encode: { - x: 'timestamp', - y: 'peak' - } - }] - }; - - memory_chart.setOption(option); -} - -function create_thread_chart() { - thread_canvas = document.getElementById('threadChart'); - thread_chart = echarts.init(thread_canvas); - - // Specify the configuration items and data for the chart - var option = { - title: { - text: 'Active Threads' - }, - legend: {}, - tooltip: { - trigger: 'axis' - }, - toolbox: { - show: true, - feature: { - mark : {show: true}, - dataView : {show: true, readOnly: false}, - magicType : {show: true, type: ['line', 'bar']}, - restore : {show: true}, - saveAsImage : {show: true} - } - }, - calculable: true, - xAxis: { type: 'time' }, - yAxis: { }, - series: [ - { - name: 'current', - type: 'line', - smooth: true, - color: 'red', - encode: { - x: 'timestamp', - y: 'current' // refer sensor 1 value - } - } - ] - }; - - thread_chart.setOption(option); -} - - - - -function updatePacketData(chart, time, first, second) { - tx_data.push([time, first]); - rx_data.push([time, second]); - option = { - series: [ - { - name: 'tx', - data: tx_data, - }, - { - name: 'rx', - data: rx_data, - } - ] - } - chart.setOption(option); -} - -function updatePacketTypesData(time, typesdata) { - //The options series is created on the fly each time based on - //the packet types we have in the data - var series = [] - - for (const k in typesdata) { - tx = [time, typesdata[k]["tx"]] - rx = [time, typesdata[k]["rx"]] - - if (packet_types_data.hasOwnProperty(k)) { - packet_types_data[k]["tx"].push(tx) - packet_types_data[k]["rx"].push(rx) - } else { - packet_types_data[k] = {'tx': [tx], 'rx': [rx]} - } - } -} - -function updatePacketTypesChart() { - series = [] - for (const k in packet_types_data) { - entry = { - name: k+"tx", - data: packet_types_data[k]["tx"], - type: 'line', - smooth: true, - encode: { - x: 'timestamp', - y: k+'tx' // refer sensor 1 value - } - } - series.push(entry) - entry = { - name: k+"rx", - data: packet_types_data[k]["rx"], - type: 'line', - smooth: true, - encode: { - x: 'timestamp', - y: k+'rx' // refer sensor 1 value - } - } - series.push(entry) - } - - option = { - series: series - } - packet_types_chart.setOption(option); -} - -function updateTypeChart(chart, key) { - //Generic function to update a packet type chart - if (! packet_types_data.hasOwnProperty(key)) { - return; - } - - if (! packet_types_data[key].hasOwnProperty('tx')) { - return; - } - var option = { - series: [{ - name: "tx", - data: packet_types_data[key]["tx"], - }, - { - name: "rx", - data: packet_types_data[key]["rx"] - }] - } - - chart.setOption(option); -} - -function updateMemChart(time, current, peak) { - mem_current.push([time, current]); - mem_peak.push([time, peak]); - option = { - series: [ - { - name: 'current', - data: mem_current, - }, - { - name: 'peak', - data: mem_peak, - } - ] - } - memory_chart.setOption(option); -} - -function updateThreadChart(time, threads) { - keys = Object.keys(threads); - thread_count = keys.length; - thread_current.push([time, thread_count]); - option = { - series: [ - { - name: 'current', - data: thread_current, - } - ] - } - thread_chart.setOption(option); -} - -function updateMessagesChart() { - updateTypeChart(message_chart, "MessagePacket") -} - -function updateAcksChart() { - updateTypeChart(ack_chart, "AckPacket") -} - -function update_stats( data ) { - console.log("update_stats() echarts.js called") - stats = data["stats"]; - our_callsign = stats["APRSDStats"]["callsign"]; - $("#version").text( stats["APRSDStats"]["version"] ); - $("#aprs_connection").html( stats["aprs_connection"] ); - $("#uptime").text( "uptime: " + stats["APRSDStats"]["uptime"] ); - const html_pretty = Prism.highlight(JSON.stringify(data, null, '\t'), Prism.languages.json, 'json'); - $("#jsonstats").html(html_pretty); - - t = Date.parse(data["time"]); - ts = new Date(t); - updatePacketData(packets_chart, ts, stats["PacketList"]["tx"], stats["PacketList"]["rx"]); - updatePacketTypesData(ts, stats["PacketList"]["types"]); - updatePacketTypesChart(); - updateMessagesChart(); - updateAcksChart(); - updateMemChart(ts, stats["APRSDStats"]["memory_current"], stats["APRSDStats"]["memory_peak"]); - updateThreadChart(ts, stats["APRSDThreadList"]); - //updateQuadData(message_chart, short_time, data["stats"]["messages"]["sent"], data["stats"]["messages"]["received"], data["stats"]["messages"]["ack_sent"], data["stats"]["messages"]["ack_recieved"]); - //updateDualData(email_chart, short_time, data["stats"]["email"]["sent"], data["stats"]["email"]["recieved"]); - //updateDualData(memory_chart, short_time, data["stats"]["aprsd"]["memory_peak"], data["stats"]["aprsd"]["memory_current"]); -} diff --git a/aprsd/web/admin/static/js/logs.js b/aprsd/web/admin/static/js/logs.js deleted file mode 100644 index f85d292..0000000 --- a/aprsd/web/admin/static/js/logs.js +++ /dev/null @@ -1,26 +0,0 @@ -function init_logs() { - const socket = io("/logs"); - socket.on('connect', function () { - console.log("Connected to logs socketio"); - }); - - socket.on('connected', function(msg) { - console.log("Connected to /logs"); - console.log(msg); - }); - - socket.on('log_entry', function(data) { - update_logs(data); - }); - -}; - - -function update_logs(data) { - var code_block = $('#logtext') - entry = data["message"] - const html_pretty = Prism.highlight(entry, Prism.languages.log, 'log'); - code_block.append(html_pretty + "
"); - var div = document.getElementById('logContainer'); - div.scrollTop = div.scrollHeight; -} diff --git a/aprsd/web/admin/static/js/main.js b/aprsd/web/admin/static/js/main.js deleted file mode 100644 index 5eba2e0..0000000 --- a/aprsd/web/admin/static/js/main.js +++ /dev/null @@ -1,231 +0,0 @@ -// watchlist is a dict of ham callsign => symbol, packets -var watchlist = {}; -var our_callsign = ""; - -function aprs_img(item, x_offset, y_offset) { - var x = x_offset * -16; - if (y_offset > 5) { - y_offset = 5; - } - var y = y_offset * -16; - var loc = x + 'px '+ y + 'px' - item.css('background-position', loc); -} - -function show_aprs_icon(item, symbol) { - var offset = ord(symbol) - 33; - var col = Math.floor(offset / 16); - var row = offset % 16; - //console.log("'" + symbol+"' off: "+offset+" row: "+ row + " col: " + col) - aprs_img(item, row, col); -} - -function ord(str){return str.charCodeAt(0);} - - -function update_watchlist( data ) { - // Update the watch list - stats = data["stats"]; - if (stats.hasOwnProperty("WatchList") == false) { - return - } - var watchdiv = $("#watchDiv"); - var html_str = '' - watchdiv.html('') - jQuery.each(stats["WatchList"], function(i, val) { - html_str += '' - }); - html_str += "
HAM CallsignAge since last seen by APRSD
' + i + '' + val["last"] + '
"; - watchdiv.append(html_str); - - jQuery.each(watchlist, function(i, val) { - //update the symbol - var call_img = $('#callsign_'+i); - show_aprs_icon(call_img, val['symbol']) - }); -} - -function update_watchlist_from_packet(callsign, val) { - if (!watchlist.hasOwnProperty(callsign)) { - watchlist[callsign] = { - "symbol": '[', - "packets": {}, - } - } else { - if (val.hasOwnProperty('symbol')) { - //console.log("Updating symbol for "+callsign + " to "+val["symbol"]) - watchlist[callsign]["symbol"] = val["symbol"] - } - } - if (watchlist[callsign]["packets"].hasOwnProperty(val['ts']) == false) { - watchlist[callsign]["packets"][val['ts']]= val; - } - //console.log(watchlist) -} - -function update_seenlist( data ) { - stats = data["stats"]; - if (stats.hasOwnProperty("SeenList") == false) { - return - } - var seendiv = $("#seenDiv"); - var html_str = '' - html_str += '' - html_str += '' - seendiv.html('') - var seen_list = stats["SeenList"] - var len = Object.keys(seen_list).length - $('#seen_count').html(len) - jQuery.each(seen_list, function(i, val) { - html_str += '' - html_str += '' - html_str += '' - }); - html_str += "
HAM CallsignAge since last seen by APRSDNumber of packets RX
' - html_str += '' + i + '' + val["last"] + '' + val["count"] + '
"; - seendiv.append(html_str); -} - -function update_plugins( data ) { - stats = data["stats"]; - if (stats.hasOwnProperty("PluginManager") == false) { - return - } - var plugindiv = $("#pluginDiv"); - var html_str = '' - html_str += '' - html_str += '' - html_str += '' - html_str += '' - plugindiv.html('') - - var plugins = stats["PluginManager"]; - var keys = Object.keys(plugins); - keys.sort(); - for (var i=0; i'; - html_str += ''; - html_str += ''; - } - html_str += "
Plugin NamePlugin Enabled?Processed PacketsSent PacketsVersion
' + val["enabled"] + '' + val["rx"] + '' + val["tx"] + '' + val["version"] +'
"; - plugindiv.append(html_str); -} - -function update_threads( data ) { - stats = data["stats"]; - if (stats.hasOwnProperty("APRSDThreadList") == false) { - return - } - var threadsdiv = $("#threadsDiv"); - var countdiv = $("#thread_count"); - var html_str = '' - html_str += '' - html_str += '' - html_str += '' - threadsdiv.html('') - - var threads = stats["APRSDThreadList"]; - var keys = Object.keys(threads); - countdiv.html(keys.length); - keys.sort(); - for (var i=0; i'; - html_str += ''; - html_str += ''; - } - html_str += "
Thread NameAlive?AgeLoop Count
' + val["alive"] + '' + val["age"] + '' + val["loop_count"] + '
"; - threadsdiv.append(html_str); -} - -function update_packets( data ) { - var packetsdiv = $("#packetsDiv"); - //nuke the contents first, then add to it. - if (size_dict(packet_list) == 0 && size_dict(data) > 0) { - packetsdiv.html('') - } - jQuery.each(data.packets, function(i, val) { - pkt = val; - - update_watchlist_from_packet(pkt['from_call'], pkt); - if ( packet_list.hasOwnProperty(pkt['timestamp']) == false ) { - // Store the packet - packet_list[pkt['timestamp']] = pkt; - //ts_str = val["timestamp"].toString(); - //ts = ts_str.split(".")[0]*1000; - ts = pkt['timestamp'] * 1000; - var d = new Date(ts).toLocaleDateString(); - var t = new Date(ts).toLocaleTimeString(); - var from_call = pkt.from_call; - if (from_call == our_callsign) { - title_id = 'title_tx'; - } else { - title_id = 'title_rx'; - } - var from_to = d + " " + t + "    " + from_call + " > " - - if (val.hasOwnProperty('addresse')) { - from_to = from_to + pkt['addresse'] - } else if (pkt.hasOwnProperty('to_call')) { - from_to = from_to + pkt['to_call'] - } else if (pkt.hasOwnProperty('format') && pkt['format'] == 'mic-e') { - from_to = from_to + "Mic-E" - } - - from_to = from_to + "  -  " + pkt['raw'] - - json_pretty = Prism.highlight(JSON.stringify(pkt, null, '\t'), Prism.languages.json, 'json'); - pkt_html = '

' + from_to + '
' + json_pretty + '

' - packetsdiv.prepend(pkt_html); - } - }); - - $('.ui.accordion').accordion('refresh'); - - // Update the count of messages shown - cnt = size_dict(packet_list); - //console.log("packets list " + cnt) - $('#packets_count').html(cnt); - - const html_pretty = Prism.highlight(JSON.stringify(data, null, '\t'), Prism.languages.json, 'json'); - $("#packetsjson").html(html_pretty); -} - - -function start_update() { - - (function statsworker() { - $.ajax({ - url: "/stats", - type: 'GET', - dataType: 'json', - success: function(data) { - update_stats(data); - update_watchlist(data); - update_seenlist(data); - update_plugins(data); - update_threads(data); - }, - complete: function() { - setTimeout(statsworker, 10000); - } - }); - })(); - - (function packetsworker() { - $.ajax({ - url: "/packets", - type: 'GET', - dataType: 'json', - success: function(data) { - update_packets(data); - }, - complete: function() { - setTimeout(packetsworker, 10000); - } - }); - })(); -} diff --git a/aprsd/web/admin/static/js/prism.js b/aprsd/web/admin/static/js/prism.js deleted file mode 100644 index 2b957cb..0000000 --- a/aprsd/web/admin/static/js/prism.js +++ /dev/null @@ -1,12 +0,0 @@ -/* PrismJS 1.29.0 -https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+json+json5+log&plugins=show-language+toolbar */ -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); -Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; -!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:[^;{\\s\"']|\\s+(?!\\s)|"+e.source+")*?(?:;|(?=\\s*\\{))"),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); -Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; -Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; -Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},Prism.languages.webmanifest=Prism.languages.json; -!function(n){var e=/("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/;n.languages.json5=n.languages.extend("json",{property:[{pattern:RegExp(e.source+"(?=\\s*:)"),greedy:!0},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,alias:"unquoted"}],string:{pattern:e,greedy:!0},number:/[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/})}(Prism); -Prism.languages.log={string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,greedy:!0},exception:{pattern:/(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,lookbehind:!0,greedy:!0,alias:["javastacktrace","language-javastacktrace"],inside:Prism.languages.javastacktrace||{keyword:/\bat\b/,function:/[a-z_][\w$]*(?=\()/,punctuation:/[.:()]/}},level:[{pattern:/\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,alias:["error","important"]},{pattern:/\b(?:WARN|WARNING|WRN)\b/,alias:["warning","important"]},{pattern:/\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,alias:["info","keyword"]},{pattern:/\b(?:DBG|DEBUG|FINE)\b/,alias:["debug","keyword"]},{pattern:/\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,alias:["trace","comment"]}],property:{pattern:/((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,lookbehind:!0},separator:{pattern:/(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,lookbehind:!0,alias:"comment"},url:/\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,email:{pattern:/(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,lookbehind:!0,alias:"url"},"ip-address":{pattern:/\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,alias:"constant"},"mac-address":{pattern:/\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,alias:"constant"},domain:{pattern:/(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,lookbehind:!0,alias:"constant"},uuid:{pattern:/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,alias:"constant"},hash:{pattern:/\b(?:[a-f0-9]{32}){1,2}\b/i,alias:"constant"},"file-path":{pattern:/\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,lookbehind:!0,greedy:!0,alias:"string"},date:{pattern:RegExp("\\b\\d{4}[-/]\\d{2}[-/]\\d{2}(?:T(?=\\d{1,2}:)|(?=\\s\\d{1,2}:))|\\b\\d{1,4}[-/ ](?:\\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\\d{2,4}T?\\b|\\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\\s{1,2}\\d{1,2}\\b","i"),alias:"number"},time:{pattern:/\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,alias:"number"},boolean:/\b(?:false|null|true)\b/i,number:{pattern:/(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,lookbehind:!0},operator:/[;:?<=>~/@!$%&+\-|^(){}*#]/,punctuation:/[\[\].,]/}; -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var e=[],t={},n=function(){};Prism.plugins.toolbar={};var a=Prism.plugins.toolbar.registerButton=function(n,a){var r;r="function"==typeof a?a:function(e){var t;return"function"==typeof a.onClick?((t=document.createElement("button")).type="button",t.addEventListener("click",(function(){a.onClick.call(this,e)}))):"string"==typeof a.url?(t=document.createElement("a")).href=a.url:t=document.createElement("span"),a.className&&t.classList.add(a.className),t.textContent=a.text,t},n in t?console.warn('There is a button with the key "'+n+'" registered already.'):e.push(t[n]=r)},r=Prism.plugins.toolbar.hook=function(a){var r=a.element.parentNode;if(r&&/pre/i.test(r.nodeName)&&!r.parentNode.classList.contains("code-toolbar")){var o=document.createElement("div");o.classList.add("code-toolbar"),r.parentNode.insertBefore(o,r),o.appendChild(r);var i=document.createElement("div");i.classList.add("toolbar");var l=e,d=function(e){for(;e;){var t=e.getAttribute("data-toolbar-order");if(null!=t)return(t=t.trim()).length?t.split(/\s*,\s*/g):[];e=e.parentElement}}(a.element);d&&(l=d.map((function(e){return t[e]||n}))),l.forEach((function(e){var t=e(a);if(t){var n=document.createElement("div");n.classList.add("toolbar-item"),n.appendChild(t),i.appendChild(n)}})),o.appendChild(i)}};a("label",(function(e){var t=e.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&t.hasAttribute("data-label")){var n,a,r=t.getAttribute("data-label");try{a=document.querySelector("template#"+r)}catch(e){}return a?n=a.content:(t.hasAttribute("data-url")?(n=document.createElement("a")).href=t.getAttribute("data-url"):n=document.createElement("span"),n.textContent=r),n}})),Prism.hooks.add("complete",r)}}(); -!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document)if(Prism.plugins.toolbar){var e={none:"Plain text",plain:"Plain text",plaintext:"Plain text",text:"Plain text",txt:"Plain text",html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",rss:"RSS",css:"CSS",clike:"C-like",js:"JavaScript",abap:"ABAP",abnf:"ABNF",al:"AL",antlr4:"ANTLR4",g4:"ANTLR4",apacheconf:"Apache Configuration",apl:"APL",aql:"AQL",ino:"Arduino",arff:"ARFF",armasm:"ARM Assembly","arm-asm":"ARM Assembly",art:"Arturo",asciidoc:"AsciiDoc",adoc:"AsciiDoc",aspnet:"ASP.NET (C#)",asm6502:"6502 Assembly",asmatmel:"Atmel AVR Assembly",autohotkey:"AutoHotkey",autoit:"AutoIt",avisynth:"AviSynth",avs:"AviSynth","avro-idl":"Avro IDL",avdl:"Avro IDL",awk:"AWK",gawk:"GAWK",sh:"Shell",basic:"BASIC",bbcode:"BBcode",bbj:"BBj",bnf:"BNF",rbnf:"RBNF",bqn:"BQN",bsl:"BSL (1C:Enterprise)",oscript:"OneScript",csharp:"C#",cs:"C#",dotnet:"C#",cpp:"C++",cfscript:"CFScript",cfc:"CFScript",cil:"CIL",cilkc:"Cilk/C","cilk-c":"Cilk/C",cilkcpp:"Cilk/C++","cilk-cpp":"Cilk/C++",cilk:"Cilk/C++",cmake:"CMake",cobol:"COBOL",coffee:"CoffeeScript",conc:"Concurnas",csp:"Content-Security-Policy","css-extras":"CSS Extras",csv:"CSV",cue:"CUE",dataweave:"DataWeave",dax:"DAX",django:"Django/Jinja2",jinja2:"Django/Jinja2","dns-zone-file":"DNS zone file","dns-zone":"DNS zone file",dockerfile:"Docker",dot:"DOT (Graphviz)",gv:"DOT (Graphviz)",ebnf:"EBNF",editorconfig:"EditorConfig",ejs:"EJS",etlua:"Embedded Lua templating",erb:"ERB","excel-formula":"Excel Formula",xlsx:"Excel Formula",xls:"Excel Formula",fsharp:"F#","firestore-security-rules":"Firestore security rules",ftl:"FreeMarker Template Language",gml:"GameMaker Language",gamemakerlanguage:"GameMaker Language",gap:"GAP (CAS)",gcode:"G-code",gdscript:"GDScript",gedcom:"GEDCOM",gettext:"gettext",po:"gettext",glsl:"GLSL",gn:"GN",gni:"GN","linker-script":"GNU Linker Script",ld:"GNU Linker Script","go-module":"Go module","go-mod":"Go module",graphql:"GraphQL",hbs:"Handlebars",hs:"Haskell",hcl:"HCL",hlsl:"HLSL",http:"HTTP",hpkp:"HTTP Public-Key-Pins",hsts:"HTTP Strict-Transport-Security",ichigojam:"IchigoJam","icu-message-format":"ICU Message Format",idr:"Idris",ignore:".ignore",gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore",inform7:"Inform 7",javadoc:"JavaDoc",javadoclike:"JavaDoc-like",javastacktrace:"Java stack trace",jq:"JQ",jsdoc:"JSDoc","js-extras":"JS Extras",json:"JSON",webmanifest:"Web App Manifest",json5:"JSON5",jsonp:"JSONP",jsstacktrace:"JS stack trace","js-templates":"JS Templates",keepalived:"Keepalived Configure",kts:"Kotlin Script",kt:"Kotlin",kumir:"KuMir (КуМир)",kum:"KuMir (КуМир)",latex:"LaTeX",tex:"TeX",context:"ConTeXt",lilypond:"LilyPond",ly:"LilyPond",emacs:"Lisp",elisp:"Lisp","emacs-lisp":"Lisp",llvm:"LLVM IR",log:"Log file",lolcode:"LOLCODE",magma:"Magma (CAS)",md:"Markdown","markup-templating":"Markup templating",matlab:"MATLAB",maxscript:"MAXScript",mel:"MEL",metafont:"METAFONT",mongodb:"MongoDB",moon:"MoonScript",n1ql:"N1QL",n4js:"N4JS",n4jsd:"N4JS","nand2tetris-hdl":"Nand To Tetris HDL",naniscript:"Naninovel Script",nani:"Naninovel Script",nasm:"NASM",neon:"NEON",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",objc:"Objective-C",ocaml:"OCaml",opencl:"OpenCL",openqasm:"OpenQasm",qasm:"OpenQasm",parigp:"PARI/GP",objectpascal:"Object Pascal",psl:"PATROL Scripting Language",pcaxis:"PC-Axis",px:"PC-Axis",peoplecode:"PeopleCode",pcode:"PeopleCode",php:"PHP",phpdoc:"PHPDoc","php-extras":"PHP Extras","plant-uml":"PlantUML",plantuml:"PlantUML",plsql:"PL/SQL",powerquery:"PowerQuery",pq:"PowerQuery",mscript:"PowerQuery",powershell:"PowerShell",promql:"PromQL",properties:".properties",protobuf:"Protocol Buffers",purebasic:"PureBasic",pbfasm:"PureBasic",purs:"PureScript",py:"Python",qsharp:"Q#",qs:"Q#",q:"Q (kdb+ database)",qml:"QML",rkt:"Racket",cshtml:"Razor C#",razor:"Razor C#",jsx:"React JSX",tsx:"React TSX",renpy:"Ren'py",rpy:"Ren'py",res:"ReScript",rest:"reST (reStructuredText)",robotframework:"Robot Framework",robot:"Robot Framework",rb:"Ruby",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (SCSS)","shell-session":"Shell session","sh-session":"Shell session",shellsession:"Shell session",sml:"SML",smlnj:"SML/NJ",solidity:"Solidity (Ethereum)",sol:"Solidity (Ethereum)","solution-file":"Solution file",sln:"Solution file",soy:"Soy (Closure Template)",sparql:"SPARQL",rq:"SPARQL","splunk-spl":"Splunk SPL",sqf:"SQF: Status Quo Function (Arma 3)",sql:"SQL",stata:"Stata Ado",iecst:"Structured Text (IEC 61131-3)",supercollider:"SuperCollider",sclang:"SuperCollider",systemd:"Systemd configuration file","t4-templating":"T4 templating","t4-cs":"T4 Text Templates (C#)",t4:"T4 Text Templates (C#)","t4-vb":"T4 Text Templates (VB)",tap:"TAP",tt2:"Template Toolkit 2",toml:"TOML",trickle:"trickle",troy:"troy",trig:"TriG",ts:"TypeScript",tsconfig:"TSConfig",uscript:"UnrealScript",uc:"UnrealScript",uorazor:"UO Razor Script",uri:"URI",url:"URL",vbnet:"VB.Net",vhdl:"VHDL",vim:"vim","visual-basic":"Visual Basic",vba:"VBA",vb:"Visual Basic",wasm:"WebAssembly","web-idl":"Web IDL",webidl:"Web IDL",wgsl:"WGSL",wiki:"Wiki markup",wolfram:"Wolfram language",nb:"Mathematica Notebook",wl:"Wolfram language",xeoracube:"XeoraCube","xml-doc":"XML doc (.net)",xojo:"Xojo (REALbasic)",xquery:"XQuery",yaml:"YAML",yml:"YAML",yang:"YANG"};Prism.plugins.toolbar.registerButton("show-language",(function(a){var t=a.element.parentNode;if(t&&/pre/i.test(t.nodeName)){var o,i=t.getAttribute("data-language")||e[a.language]||((o=a.language)?(o.substring(0,1).toUpperCase()+o.substring(1)).replace(/s(?=cript)/,"S"):o);if(i){var s=document.createElement("span");return s.textContent=i,s}}}))}else console.warn("Show Languages plugin loaded before Toolbar plugin.")}(); diff --git a/aprsd/web/admin/static/js/send-message.js b/aprsd/web/admin/static/js/send-message.js deleted file mode 100644 index 9bcb470..0000000 --- a/aprsd/web/admin/static/js/send-message.js +++ /dev/null @@ -1,114 +0,0 @@ -var cleared = false; - -function size_dict(d){c=0; for (i in d) ++c; return c} - -function init_messages() { - const socket = io("/sendmsg"); - socket.on('connect', function () { - console.log("Connected to socketio"); - }); - socket.on('connected', function(msg) { - console.log("Connected!"); - console.log(msg); - }); - - socket.on("sent", function(msg) { - if (cleared == false) { - var msgsdiv = $("#msgsDiv"); - msgsdiv.html('') - cleared = true - } - add_msg(msg); - }); - - socket.on("ack", function(msg) { - update_msg(msg); - }); - socket.on("reply", function(msg) { - update_msg(msg); - }); - -} - -function add_msg(msg) { - var msgsdiv = $("#sendMsgsDiv"); - - ts_str = msg["ts"].toString(); - ts = ts_str.split(".")[0]*1000; - var d = new Date(ts).toLocaleDateString("en-US") - var t = new Date(ts).toLocaleTimeString("en-US") - - from = msg['from'] - title_id = 'title_tx' - var from_to = d + " " + t + "    " + from + " > " - - if (msg.hasOwnProperty('to')) { - from_to = from_to + msg['to'] - } - from_to = from_to + "  -  " + msg['message'] - - id = ts_str.split('.')[0] - pretty_id = "pretty_" + id - loader_id = "loader_" + id - ack_id = "ack_" + id - reply_id = "reply_" + id - span_id = "span_" + id - json_pretty = Prism.highlight(JSON.stringify(msg, null, '\t'), Prism.languages.json, 'json'); - msg_html = '
'; - msg_html += '
 '; - msg_html += ' '; - msg_html += ' '; - msg_html += '' + from_to +'
'; - msg_html += '
' + json_pretty + '

' - msgsdiv.prepend(msg_html); - $('.ui.accordion').accordion('refresh'); -} - -function update_msg(msg) { - var msgsdiv = $("#sendMsgsDiv"); - // We have an existing entry - ts_str = msg["ts"].toString(); - id = ts_str.split('.')[0] - pretty_id = "pretty_" + id - loader_id = "loader_" + id - reply_id = "reply_" + id - ack_id = "ack_" + id - span_id = "span_" + id - - - - if (msg['ack'] == true) { - var loader_div = $('#' + loader_id); - var ack_div = $('#' + ack_id); - loader_div.removeClass('ui active inline loader'); - loader_div.addClass('ui disabled loader'); - ack_div.removeClass('thumbs up outline icon'); - ack_div.addClass('thumbs up outline icon'); - } - - if (msg['reply'] !== null) { - var reply_div = $('#' + reply_id); - reply_div.removeClass("thumbs down outline icon"); - reply_div.addClass('reply icon'); - reply_div.attr('data-content', 'Got Reply'); - - var d = new Date(ts).toLocaleDateString("en-US") - var t = new Date(ts).toLocaleTimeString("en-US") - var from_to = d + " " + t + "    " + from + " > " - - if (msg.hasOwnProperty('to')) { - from_to = from_to + msg['to'] - } - from_to = from_to + "  -  " + msg['message'] - from_to += "   ===> " + msg["reply"]["message_text"] - - var span_div = $('#' + span_id); - span_div.html(from_to); - } - - var pretty_pre = $("#" + pretty_id); - pretty_pre.html(''); - json_pretty = Prism.highlight(JSON.stringify(msg, null, '\t'), Prism.languages.json, 'json'); - pretty_pre.html(json_pretty); - $('.ui.accordion').accordion('refresh'); -} diff --git a/aprsd/web/admin/static/js/tabs.js b/aprsd/web/admin/static/js/tabs.js deleted file mode 100644 index 97cd2f8..0000000 --- a/aprsd/web/admin/static/js/tabs.js +++ /dev/null @@ -1,28 +0,0 @@ -function openTab(evt, tabName) { - // Declare all variables - var i, tabcontent, tablinks; - - if (typeof tabName == 'undefined') { - return - } - - // Get all elements with class="tabcontent" and hide them - tabcontent = document.getElementsByClassName("tabcontent"); - for (i = 0; i < tabcontent.length; i++) { - tabcontent[i].style.display = "none"; - } - - // Get all elements with class="tablinks" and remove the class "active" - tablinks = document.getElementsByClassName("tablinks"); - for (i = 0; i < tablinks.length; i++) { - tablinks[i].className = tablinks[i].className.replace(" active", ""); - } - - // Show the current tab, and add an "active" class to the button that opened the tab - document.getElementById(tabName).style.display = "block"; - if (typeof evt.currentTarget == 'undefined') { - return - } else { - evt.currentTarget.className += " active"; - } -} diff --git a/aprsd/web/admin/templates/index.html b/aprsd/web/admin/templates/index.html deleted file mode 100644 index e8058e3..0000000 --- a/aprsd/web/admin/templates/index.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

APRSD {{ version }}

-
- -
-
- {{ callsign }} - connected to - {{ aprs_connection|safe }} -
- -
- NONE -
-
- - - - - -
-

Charts

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
- - - -
-

Messages (0)

-
-
Loading
-
-
- -
-

- Callsign Seen List ({{ seen_count }}) -

-
Loading
-
- -
-

- Callsign Watch List ({{ watch_count }}) -     - Notification age - {{ watch_age }} -

-
Loading
-
- -
-

- Plugins Loaded ({{ plugin_count }}) -

-
Loading
-
- -
-

- Threads Loaded ({{ thread_count }}) -

-
Loading
-
- -
-

Config

-
{{ config_json|safe }}
-
- -
-

LOGFILE

-
-
- - - -
-

Raw JSON

-
{{ initial_stats|safe }}
-
- -
- PyPI version - -
- - diff --git a/aprsd/web/chat/static/css/chat.css b/aprsd/web/chat/static/css/chat.css deleted file mode 100644 index 7971f01..0000000 --- a/aprsd/web/chat/static/css/chat.css +++ /dev/null @@ -1,115 +0,0 @@ -input[type=search]::-webkit-search-cancel-button { - -webkit-appearance: searchfield-cancel-button; -} - -.speech-wrapper { - padding-top: 0px; - padding: 5px 30px; - background-color: #CCCCCC; -} - -.bubble-row { - display: flex; - width: 100%; - justify-content: flex-start; -} - -.bubble-row.alt { - justify-content: flex-end; -} - -.bubble { - /*width: 350px; */ - height: auto; - display: block; - background: #f5f5f5; - border-radius: 4px; - box-shadow: 2px 8px 5px #555; - position: relative; - margin: 0 0 15px; -} - -.bubble.alt { - margin: 0 0 15px; -} - -.bubble-text { - padding: 5px 5px 0px 8px; -} - -.bubble-name { - width: 280px; - font-weight: 600; - font-size: 12px; - margin: 0 0 0px; - color: #3498db; - display: flex; - align-items: center; - .material-symbols-rounded { - margin-left: auto; - font-weight: normal; - color: #808080; - } -} -.bubble-name.alt { - color: #2ecc71; -} - -.bubble-timestamp { - margin-right: auto; - font-size: 11px; - text-transform: uppercase; - color: #bbb -} - -.bubble-message { - font-size: 16px; - margin: 0px; - padding: 0px 0px 0px 0px; - color: #2b2b2b; - text-align: left; -} - -.bubble-arrow { - position: absolute; - width: 0; - bottom:30px; - left: -16px; - height: 0px; -} - -.bubble-arrow.alt { - right: -2px; - bottom: 30px; - left: auto; -} - -.bubble-arrow:after { - content: ""; - position: absolute; - border: 0 solid transparent; - border-top: 9px solid #f5f5f5; - border-radius: 0 20px 0; - width: 15px; - height: 30px; - transform: rotate(145deg); -} -.bubble-arrow.alt:after { - transform: rotate(45deg) scaleY(-1); -} - -.popover { - max-width: 400px; -} -.popover-header { - font-size: 8pt; - max-width: 400px; - padding: 5px; - background-color: #ee; -} - -.popover-body { - white-space: pre-line; - max-width: 400px; - padding: 5px; -} diff --git a/aprsd/web/chat/static/css/index.css b/aprsd/web/chat/static/css/index.css deleted file mode 100644 index e876335..0000000 --- a/aprsd/web/chat/static/css/index.css +++ /dev/null @@ -1,66 +0,0 @@ -body { - background: #eeeeee; - /*margin: 1em;*/ - text-align: center; - font-family: system-ui, sans-serif; - height: 100%; -} - -#title { - font-size: 4em; -} -#version{ - font-size: .5em; -} - -#uptime, #aprsis { - font-size: 1em; -} -#callsign { - font-size: 1.4em; - color: #00F; - padding-top: 8px; - margin:10px; -} - -#title_rx { - background-color: darkseagreen; - text-align: left; -} - -#title_tx { - background-color: lightcoral; - text-align: left; -} - -.aprsd_1 { - background-image: url(/static/images/aprs-symbols-16-0.png); - background-repeat: no-repeat; - background-position: -160px -48px; - width: 16px; - height: 16px; -} - -.wc-container { - display: flex; - flex-flow: column; - height: 100%; -} -.wc-container .wc-row { - /*border: 1px dotted #0313fc;*/ - padding: 2px; -} -.wc-container .wc-row.header { - flex: 0 1 auto; -} -.wc-container .wc-row.content { - flex: 1 1 auto; - overflow-y: auto; -} -.wc-container .wc-row.footer { - flex: 0 1 0px; -} - -.material-symbols-rounded.md-10 { - font-size: 18px !important; -} diff --git a/aprsd/web/chat/static/css/style.css.map b/aprsd/web/chat/static/css/style.css.map deleted file mode 100644 index 299ffa9..0000000 --- a/aprsd/web/chat/static/css/style.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"css/style.css","mappings":"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AC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,aAAgB,CAC5B,UAAY,UAAa,CACzB,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,wBAA2B,CACvC,UAAY,o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","sources":["webpack://thelounge/./node_modules/normalize.css/normalize.css","webpack://thelounge/./client/css/fontawesome.css","webpack://thelounge/./node_modules/primer-tooltips/build/build.css","webpack://thelounge/./client/css/style.css","webpack://thelounge/./client/components/NetworkList.vue","webpack://thelounge/./client/components/ConfirmDialog.vue","webpack://thelounge/./client/components/Mentions.vue","webpack://thelounge/./client/components/NetworkForm.vue","webpack://thelounge/./client/components/Session.vue","webpack://thelounge/./client/components/Windows/Settings.vue","webpack://thelounge/./client/components/MessageSearchForm.vue","webpack://thelounge/./client/components/Windows/SearchResults.vue"],"sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","@font-face {\n\t/* We use free solid icons - https://fontawesome.com/icons?s=solid&m=free */\n\tfont-family: FontAwesome;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tsrc:\n\t\turl(\"../fonts/fa-solid-900.woff2\") format(\"woff2\"),\n\t\turl(\"../fonts/fa-solid-900.woff\") format(\"woff\");\n}\n",".tooltipped{position:relative}.tooltipped::after{position:absolute;z-index:1000000;display:none;padding:.5em .75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,\"Segoe UI\",Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\";-webkit-font-smoothing:subpixel-antialiased;color:#fff;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:#1b1f23;border-radius:3px;opacity:0}.tooltipped::before{position:absolute;z-index:1000001;display:none;width:0;height:0;color:#1b1f23;pointer-events:none;content:\"\";border:6px solid transparent;opacity:0}@keyframes tooltip-appear{from{opacity:0}to{opacity:1}}.tooltipped:hover::before,.tooltipped:hover::after,.tooltipped:active::before,.tooltipped:active::after,.tooltipped:focus::before,.tooltipped:focus::after{display:inline-block;text-decoration:none;animation-name:tooltip-appear;animation-duration:.1s;animation-fill-mode:forwards;animation-timing-function:ease-in;animation-delay:.4s}.tooltipped-no-delay:hover::before,.tooltipped-no-delay:hover::after,.tooltipped-no-delay:active::before,.tooltipped-no-delay:active::after,.tooltipped-no-delay:focus::before,.tooltipped-no-delay:focus::after{animation-delay:0s}.tooltipped-multiline:hover::after,.tooltipped-multiline:active::after,.tooltipped-multiline:focus::after{display:table-cell}.tooltipped-s::after,.tooltipped-se::after,.tooltipped-sw::after{top:100%;right:50%;margin-top:6px}.tooltipped-s::before,.tooltipped-se::before,.tooltipped-sw::before{top:auto;right:50%;bottom:-7px;margin-right:-6px;border-bottom-color:#1b1f23}.tooltipped-se::after{right:auto;left:50%;margin-left:-16px}.tooltipped-sw::after{margin-right:-16px}.tooltipped-n::after,.tooltipped-ne::after,.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px}.tooltipped-n::before,.tooltipped-ne::before,.tooltipped-nw::before{top:-7px;right:50%;bottom:auto;margin-right:-6px;border-top-color:#1b1f23}.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px}.tooltipped-nw::after{margin-right:-16px}.tooltipped-s::after,.tooltipped-n::after{transform:translateX(50%)}.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;transform:translateY(50%)}.tooltipped-w::before{top:50%;bottom:50%;left:-7px;margin-top:-6px;border-left-color:#1b1f23}.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;transform:translateY(50%)}.tooltipped-e::before{top:50%;right:-7px;bottom:50%;margin-top:-6px;border-right-color:#1b1f23}.tooltipped-align-right-1::after,.tooltipped-align-right-2::after{right:0;margin-right:0}.tooltipped-align-right-1::before{right:10px}.tooltipped-align-right-2::before{right:15px}.tooltipped-align-left-1::after,.tooltipped-align-left-2::after{left:0;margin-left:0}.tooltipped-align-left-1::before{left:5px}.tooltipped-align-left-2::before{left:10px}.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate}.tooltipped-multiline.tooltipped-s::after,.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;transform:translateX(-50%)}.tooltipped-multiline.tooltipped-w::after,.tooltipped-multiline.tooltipped-e::after{right:100%}@media screen and (min-width: 0\\0){.tooltipped-multiline::after{width:250px}}.tooltipped-sticky::before,.tooltipped-sticky::after{display:inline-block}.tooltipped-sticky.tooltipped-multiline::after{display:table-cell}\n","@import \"../../node_modules/normalize.css/normalize.css\";\n@import \"fontawesome.css\";\n@import \"../../node_modules/primer-tooltips/build/build.css\";\n\n:root {\n\t/* Main text color */\n\t--body-color: #222;\n\n\t/* Secondary text color, dimmed. Make sure to keep contrast WCAG 2.0 AA compliant on var(--window-bg-color) */\n\t--body-color-muted: #767676;\n\n\t/* Background color of the whole page */\n\t--body-bg-color: #415364;\n\n\t/* Main button color. Applies to border, text, and background on hover */\n\t--button-color: #84ce88;\n\t--button-text-color-hover: #fff;\n\n\t/* Color for sidebar overlay and other things that dim the viewport when something else is on top */\n\t--overlay-bg-color: rgb(0 0 0 / 50%);\n\n\t/* Links and link-looking buttons */\n\t--link-color: #50a656;\n\n\t/* Background color of the main window */\n\t--window-bg-color: #fff;\n\n\t/* Text color for

and

headings in windows */\n\t--window-heading-color: #6c797a;\n\n\t/* Color of the date marker, text and separator */\n\t--date-marker-color: rgb(0 107 59 / 50%);\n\n\t/* Color of the unread message marker, text and separator */\n\t--unread-marker-color: rgb(231 76 60 / 50%);\n\n\t/* Background and left-border color of highlight messages */\n\t--highlight-bg-color: #efe8dc;\n\t--highlight-border-color: #b08c4f;\n\n\t/* Color of the progress bar that appears as a file is being uploaded to the server. Defaults to button color */\n\t--upload-progressbar-color: var(--button-color);\n}\n\n::placeholder {\n\tcolor: rgb(0 0 0 / 35%);\n\topacity: 1; /* fix opacity in Firefox */\n}\n\nhtml {\n\tbox-sizing: border-box;\n\t-webkit-tap-highlight-color: transparent; /* remove tap highlight on touch devices */\n}\n\n*,\n*::before,\n*::after {\n\tbox-sizing: inherit;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n\tfont: inherit;\n\tcolor: inherit;\n}\n\nimg {\n\tvertical-align: middle;\n}\n\n.sr-only {\n\tposition: absolute;\n\twidth: 1px;\n\theight: 1px;\n\tmargin: -1px;\n\tpadding: 0;\n\toverflow: hidden;\n\tclip: rect(0, 0, 0, 0);\n\tborder: 0;\n}\n\nabbr[title] {\n\tcursor: help;\n}\n\nhtml,\nbody {\n\theight: 100%;\n\toverscroll-behavior: none; /* prevent overscroll navigation actions */\n}\n\nbody {\n\tbackground: var(--body-bg-color);\n\tcolor: var(--body-color);\n\tfont: 16px -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n\tmargin: 0;\n\tuser-select: none;\n\tcursor: default;\n\ttouch-action: none;\n\n\t/**\n\t * Disable pull-to-refresh on mobile that conflicts with scrolling the message list.\n\t * See http://stackoverflow.com/a/29313685/1935861\n\t */\n\toverflow: hidden; /* iOS Safari requires overflow rather than overflow-y */\n}\n\nbody.force-no-select * {\n\tuser-select: none !important;\n}\n\na,\na:hover,\na:focus {\n\tcolor: var(--link-color);\n\ttext-decoration: none;\n}\n\na:hover {\n\ttext-decoration: underline;\n}\n\na:focus {\n\toutline: thin dotted;\n\toutline: 5px auto -webkit-focus-ring-color;\n\toutline-offset: -2px;\n}\n\nh1,\nh2,\nh3 {\n\tfont: inherit;\n\tline-height: inherit;\n\tmargin: 0;\n}\n\nbutton {\n\tborder: none;\n\tbackground: none;\n\tmargin: 0;\n\toutline: none;\n\tpadding: 0;\n\tuser-select: inherit;\n\tcursor: pointer;\n}\n\ncode,\npre,\n#chat .msg[data-type=\"monospace_block\"] .text,\n.irc-monospace,\ntextarea#user-specified-css-input {\n\tfont-family: Consolas, Menlo, Monaco, \"Lucida Console\", \"DejaVu Sans Mono\", \"Courier New\", monospace;\n}\n\ncode,\n.irc-monospace {\n\tfont-size: 13px;\n\tpadding: 2px 4px;\n\tcolor: #e74c3c;\n\tbackground-color: #f9f2f4;\n\tborder-radius: 2px;\n}\n\npre {\n\tdisplay: block;\n\tpadding: 9.5px;\n\tmargin: 0 0 10px;\n\tfont-size: 13px;\n\tline-height: 1.4286;\n\tcolor: #333;\n\tword-break: break-all;\n\tword-wrap: break-word;\n\tbackground-color: #f5f5f5;\n\tborder-radius: 4px;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tfont-family: inherit;\n\tline-height: 1em;\n\tmin-width: 28px; /* Ensure 1-char keys have the same width */\n\tmargin: 0 1px;\n\tpadding: 4px 6px;\n\tcolor: #444;\n\ttext-align: center;\n\ttext-shadow: 0 1px 0 #fff;\n\tbackground-color: white;\n\tbackground-image: linear-gradient(180deg, rgb(0 0 0 / 5%), transparent);\n\tborder: 1px solid #bbb;\n\tborder-radius: 4px;\n\tbox-shadow: 0 2px 0 #bbb, inset 0 1px 1px #fff, inset 0 -1px 3px #ccc;\n}\n\np {\n\tmargin: 0 0 10px;\n}\n\n.btn {\n\tborder: 2px solid var(--button-color);\n\tborder-radius: 3px;\n\tcolor: var(--button-color);\n\tdisplay: inline-block;\n\tfont-size: 12px;\n\tfont-weight: bold;\n\tletter-spacing: 1px;\n\tmargin-bottom: 10px;\n\tpadding: 9px 17px;\n\ttext-transform: uppercase;\n\ttransition: background 0.2s, border-color 0.2s, color 0.2s, box-shadow 0.2s;\n\tword-spacing: 3px;\n\tcursor: pointer; /* This is useful for `' - - callsignTabs.append(item_html); - create_callsign_tab_content(callsign, active); -} - -function create_callsign_tab_content(callsign, active=false) { - var callsignTabsContent = $("#msgsTabContent"); - tab_id = tab_string(callsign); - tab_content = tab_content_name(callsign); - wrapper_id = tab_content_speech_wrapper(callsign); - if (active) { - active_str = "show active"; - } else { - active_str = ''; - } - - location_str = "Unknown Location" - if (callsign in callsign_location) { - location_str = build_location_string_small(callsign_location[callsign]); - location_class = ''; - } - - location_id = callsign_location_content(callsign); - - item_html = '
'; - item_html += '
'; - item_html += '
'; - item_html += '
'; - item_html += ''; - item_html += ' '+location_str+'
'; - item_html += '
'; - item_html += '
'; - item_html += '
'; - callsignTabsContent.append(item_html); -} - -function delete_tab(callsign) { - // User asked to delete the tab and the conversation - tab_id = tab_string(callsign, true); - tab_id_li = tab_li_string(callsign, true); - tab_content = tab_content_name(callsign, true); - $(tab_id_li).remove(); - $(tab_content).remove(); - delete callsign_list[callsign]; - delete message_list[callsign]; - delete callsign_location[callsign]; - - // Now select the first tab - first_tab = $("#msgsTabList").children().first().children().first(); - console.log(first_tab); - $(first_tab).click(); - save_data(); -} - -function add_callsign(callsign, msg) { - /* Ensure a callsign exists in the left hand nav */ - if (callsign in callsign_list) { - return false - } - len = Object.keys(callsign_list).length; - if (len == 0) { - active = true; - } else { - active = false; - } - create_callsign_tab(callsign, active); - callsign_list[callsign] = ''; - return true; -} - -function update_callsign_path(callsign, msg) { - //Get the selected path to save for this callsign - path = msg['path'] - $('#pkt_path').val(path); - callsign_list[callsign] = path; - -} - -function append_message(callsign, msg, msg_html) { - new_callsign = false - if (!message_list.hasOwnProperty(callsign)) { - message_list[callsign] = {}; - } - ts_id = message_ts_id(msg); - id = ts_id['id'] - message_list[callsign][id] = msg; - if (selected_tab_callsign != callsign) { - // We need to update the notification for the tab - tab_notify_id = tab_notification_id(callsign, true); - // get the current count of notifications - count = parseInt($(tab_notify_id).text()); - if (isNaN(count)) { - count = 0; - } - count += 1; - $(tab_notify_id).text(count); - $(tab_notify_id).removeClass('visually-hidden'); - } - - // Find the right div to place the html - new_callsign = add_callsign(callsign, msg); - //update_callsign_path(callsign, msg); - append_message_html(callsign, msg_html, new_callsign); - len = Object.keys(callsign_list).length; - if (new_callsign) { - //Now click the tab if and only if there is only one tab - callsign_tab_id = callsign_tab(callsign); - $(callsign_tab_id).click(); - callsign_select(callsign); - } -} - - -function append_message_html(callsign, msg_html, new_callsign) { - var msgsTabs = $('#msgsTabsDiv'); - divname_str = tab_content_name(callsign); - divname = content_divname(callsign); - tab_content = tab_content_name(callsign); - wrapper_id = tab_content_speech_wrapper_id(callsign); - - $(wrapper_id).append(msg_html); - - if ($(wrapper_id).children().length > 0) { - $(wrapper_id).animate({scrollTop: $(wrapper_id)[0].scrollHeight}, "fast"); - } -} - -function create_message_html(date, time, from, to, message, ack_id, msg, acked=false) { - div_id = from + "_" + msg.msgNo; - if (ack_id) { - alt = " alt" - } else { - alt = "" - } - - bubble_class = "bubble" + alt + " text-nowrap" - bubble_name_class = "bubble-name" + alt - bubble_msgid = bubble_msg_id(msg); - date_str = date + " " + time; - sane_date_str = date_str.replace(/ /g,"").replaceAll("/","").replaceAll(":",""); - - bubble_msg_class = "bubble-message"; - if (ack_id) { - bubble_arrow_class = "bubble-arrow alt"; - popover_placement = "left"; - } else { - bubble_arrow_class = "bubble-arrow"; - popover_placement = "right"; - } - - msg_html = '
'; - msg_html += '
'; - msg_html += '
'; - msg_html += '

'+from+'  '; - msg_html += ''+date_str+''; - - if (ack_id) { - if (acked) { - msg_html += 'thumb_up'; - } else { - msg_html += 'thumb_down'; - } - } - msg_html += "

"; - msg_html += '

'+message+'

'; - msg_html += '
'; - msg_html += "
"; - - return msg_html -} - -function flash_message(msg) { - // Callback function to bring a hidden box back - msg_id = bubble_msg_id(msg, true); - $(msg_id).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn(100); -} - -function sent_msg(msg) { - info = time_ack_from_msg(msg); - t = info['time']; - d = info['date']; - ack_id = info['ack_id']; - - msg_html = create_message_html(d, t, msg['from_call'], msg['to_call'], msg['message_text'], ack_id, msg, false); - append_message(msg['to_call'], msg, msg_html); - save_data(); - scroll_main_content(msg['to_call']); - reload_popovers(); -} - -function str_to_int(my_string) { - total = 0 - for (let i = 0; i < my_string.length; i++) { - total += my_string.charCodeAt(i); - } - return total -} - -function from_msg(msg) { - if (!from_msg_list.hasOwnProperty(msg["from_call"])) { - from_msg_list[msg["from_call"]] = new Array(); - } - - // Try to account for messages that have no msgNo - console.log(msg) - if (msg["msgNo"] == null) { - console.log("Need to add msgNO!!") - // create an artificial msgNo - total = str_to_int(msg["from_call"]) - total += str_to_int(msg["addresse"]) - total += str_to_int(msg["message_text"]) - msg["msgNo"] = total - } - - if (msg["msgNo"] in from_msg_list[msg["from_call"]]) { - // We already have this message - //console.log("We already have this message msgNo=" + msg["msgNo"]); - // Do some flashy thing? - flash_message(msg); - return false - } else { - from_msg_list[msg["from_call"]][msg["msgNo"]] = msg - } - info = time_ack_from_msg(msg); - t = info['time']; - d = info['date']; - ack_id = info['ack_id']; - - from = msg['from_call'] - msg_html = create_message_html(d, t, from, false, msg['message_text'], false, msg, false); - append_message(from, msg, msg_html); - save_data(); - scroll_main_content(from); - reload_popovers(); -} - -function ack_msg(msg) { - // Acknowledge a message - // We have an existing entry - ts_id = message_ts_id(msg); - id = ts_id['id']; - //Mark the message as acked - callsign = msg['to_call']; - // Ensure the message_list has this callsign - if (!message_list.hasOwnProperty(callsign)) { - return false - } - // Ensure the message_list has this id - if (!message_list[callsign].hasOwnProperty(id)) { - return false - } - if (message_list[callsign][id]['ack'] == true) { - return false; - } - message_list[callsign][id]['ack'] = true; - ack_id = "ack_" + id - - if (msg['ack'] == true) { - var ack_div = $('#' + ack_id); - ack_div.html('thumb_up'); - } - - //$('.ui.accordion').accordion('refresh'); - save_data(); - scroll_main_content(); -} - -function activate_callsign_tab(callsign) { - tab_content = tab_string(callsign, id=true); - $(tab_content).click(); -} - -function callsign_select(callsign) { - var tocall = $("#to_call"); - tocall.val(callsign.toUpperCase()); - scroll_main_content(callsign); - selected_tab_callsign = callsign; - tab_notify_id = tab_notification_id(callsign, true); - $(tab_notify_id).addClass('visually-hidden'); - $(tab_notify_id).text(0); - // Now update the path - // $('#pkt_path').val(callsign_list[callsign]); -} - -function call_callsign_location(callsign) { - msg = {'callsign': callsign}; - socket.emit("get_callsign_location", msg); - location_id = callsign_location_content(callsign, true)+"Spinner"; - $(location_id).removeClass('d-none'); -} diff --git a/aprsd/web/chat/static/js/tabs.js b/aprsd/web/chat/static/js/tabs.js deleted file mode 100644 index 97cd2f8..0000000 --- a/aprsd/web/chat/static/js/tabs.js +++ /dev/null @@ -1,28 +0,0 @@ -function openTab(evt, tabName) { - // Declare all variables - var i, tabcontent, tablinks; - - if (typeof tabName == 'undefined') { - return - } - - // Get all elements with class="tabcontent" and hide them - tabcontent = document.getElementsByClassName("tabcontent"); - for (i = 0; i < tabcontent.length; i++) { - tabcontent[i].style.display = "none"; - } - - // Get all elements with class="tablinks" and remove the class "active" - tablinks = document.getElementsByClassName("tablinks"); - for (i = 0; i < tablinks.length; i++) { - tablinks[i].className = tablinks[i].className.replace(" active", ""); - } - - // Show the current tab, and add an "active" class to the button that opened the tab - document.getElementById(tabName).style.display = "block"; - if (typeof evt.currentTarget == 'undefined') { - return - } else { - evt.currentTarget.className += " active"; - } -} diff --git a/aprsd/web/chat/static/js/upstream/bootstrap.bundle.min.js b/aprsd/web/chat/static/js/upstream/bootstrap.bundle.min.js deleted file mode 100644 index 61d9d6b..0000000 --- a/aprsd/web/chat/static/js/upstream/bootstrap.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?n(i.trim()):null}return e},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=".dropdown-toggle",zs=`:not(${Bs})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ks extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ks.getOrCreateInstance(i).show())}_getChildren(){return z.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(Bs,Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:z.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ks.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Ks.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(Vs))Ks.getOrCreateInstance(t)})),m(Ks);const Qs=".bs.toast",Xs=`mouseover${Qs}`,Ys=`mouseout${Qs}`,Us=`focusin${Qs}`,Gs=`focusout${Qs}`,Js=`hide${Qs}`,Zs=`hidden${Qs}`,to=`show${Qs}`,eo=`shown${Qs}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){N.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),d(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),N.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),N.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Xs,(t=>this._onInteraction(t,!0))),N.on(this._element,Ys,(t=>this._onInteraction(t,!1))),N.on(this._element,Us,(t=>this._onInteraction(t,!0))),N.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ao),m(ao),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Ks,Toast:ao,Tooltip:cs}})); -//# sourceMappingURL=bootstrap.bundle.min.js.map diff --git a/aprsd/web/chat/static/js/upstream/jquery-3.7.1.min.js b/aprsd/web/chat/static/js/upstream/jquery-3.7.1.min.js deleted file mode 100644 index 7f37b5d..0000000 --- a/aprsd/web/chat/static/js/upstream/jquery-3.7.1.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="
",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0
"))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(m.inline?m.dpDiv.parent()[0]:m.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var h=0,l=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=l.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=l.call(arguments,1),r=this;return o?this.length||"instance"!==n?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(r=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):r=void 0:(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),r}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}});var c="ui-effects-",u="ui-effects-style",d="ui-effects-animated",p=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("

")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(p),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(p.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),l=l.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(d)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(c+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(c+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("

").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(u,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(u)||"",t.removeData(u)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(c+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=c+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(d),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(h)&&h.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[l](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===l:"show"===l)?(r[l](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",h=s.complete,l=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,l)||o;i.data(d,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?l?this[l](s.duration,h):this.each(function(){h&&h.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n) -}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("
").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var f=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),l&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=h?2*u:u/2;h&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,h=r||"horizontal"===a,l=r||"vertical"===a;s=o.cssClip(),n.clip={top:l?(s.bottom-s.top)/2:s.top,right:h?(s.right-s.left)/2:s.right,bottom:l?(s.bottom-s.top)/2:s.bottom,left:h?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r?"-=":"+=",c="+="===l?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===h?"outerHeight":"outerWidth"](!0)/2,u[h]=l+s,a&&(n.css(u),u[h]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,l=a-(d-1)/2,p.clone().appendTo("body").wrap("
").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,h=/([0-9]+)%/.exec(r),l=!!e.horizFirst,c=l?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;h&&(r=parseInt(h[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);h>u;u++)s.animate({opacity:c},l,e.easing),c=1-c;s.animate({opacity:c},l,e.easing),s.queue(i),t.effects.unshift(s,d,h+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,h=2*r+1,l=Math.round(e.duration/h),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,l,e.easing);r>s;s++)n.animate(p,l,e.easing).animate(f,l,e.easing);n.animate(p,l,e.easing).animate(d,l/2,e.easing).queue(i),t.effects.unshift(n,g,h+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u=e.distance||o["top"===l?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[l],d[l]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[h][1]]=d.clip[a[h][0]],"show"===r&&(o.cssClip(d.clip),o.css(l,d[l]),d.clip=s,d[l]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var f;t.uiBackCompat!==!1&&(f=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)})),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t(""),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=h?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=h.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n; -this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t(""},prompt:function(e){if(1===e.length)return e[0];var n='
    ';return R.each(e,function(e,t){n+="
  • "+t+"
  • "}),n+="
"}},formatter:{date:function(e){return Intl.DateTimeFormat("en-GB").format(e)},datetime:function(e){return Intl.DateTimeFormat("en-GB",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(e)},time:function(e){return Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(e)},month:function(e){return Intl.DateTimeFormat("en-GB",{month:"2-digit",year:"numeric"}).format(e)},year:function(e){return Intl.DateTimeFormat("en-GB",{year:"numeric"}).format(e)}},rules:{empty:function(e){return!(e===j||""===e||Array.isArray(e)&&0===e.length)},checked:function(){return 0=t},exactLength:function(e,t){return e!==j&&e.length==t},maxLength:function(e,t){return e!==j&&e.length<=t},match:function(e,t,n){var i,o;return 0<(o=n.find('[data-validate="'+t+'"]')).length||0<(o=n.find("#"+t)).length||0<(o=n.find('[name="'+t+'"]')).length?i=o.val():0<(o=n.find('[name="'+t+'[]"]')).length&&(i=o),i!==j&&e.toString()==i.toString()},different:function(e,t,n){var i,o;return 0<(o=n.find('[data-validate="'+t+'"]')).length||0<(o=n.find("#"+t)).length||0<(o=n.find('[name="'+t+'"]')).length?i=o.val():0<(o=n.find('[name="'+t+'[]"]')).length&&(i=o),i!==j&&e.toString()!==i.toString()},creditCard:function(n,e){var i,o={visa:{pattern:/^4/,length:[16]},amex:{pattern:/^3[47]/,length:[15]},mastercard:{pattern:/^5[1-5]/,length:[16]},discover:{pattern:/^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)/,length:[16]},unionPay:{pattern:/^(62|88)/,length:[16,17,18,19]},jcb:{pattern:/^35(2[89]|[3-8][0-9])/,length:[16]},maestro:{pattern:/^(5018|5020|5038|6304|6759|676[1-3])/,length:[12,13,14,15,16,17,18,19]},dinersClub:{pattern:/^(30[0-5]|^36)/,length:[14]},laser:{pattern:/^(6304|670[69]|6771)/,length:[16,17,18,19]},visaElectron:{pattern:/^(4026|417500|4508|4844|491(3|7))/,length:[16]}},a=!1,e="string"==typeof e&&e.split(",");if("string"==typeof n&&0!==n.length){if(n=n.replace(/[\s\-]/g,""),e&&(R.each(e,function(e,t){(i=o[t])&&(i={length:-1!==R.inArray(n.length,i.length),pattern:-1!==n.search(i.pattern)}).length&&i.pattern&&(a=!0)}),!a))return!1;if((e={number:-1!==R.inArray(n.length,o.unionPay.length),pattern:-1!==n.search(o.unionPay.pattern)}).number&&e.pattern)return!0;for(var t=n.length,r=0,s=[[0,1,2,3,4,5,6,7,8,9],[0,2,4,6,8,1,3,5,7,9]],l=0;t--;)l+=s[r][parseInt(n.charAt(t),10)],r^=1;return l%10==0&&0=t)},exactCount:function(e,t){return 0==t?""===e:1==t?""!==e&&-1===e.search(","):e.split(",").length==t},maxCount:function(e,t){return 0!=t&&(1==t?-1===e.search(","):e.split(",").length<=t)}}}}(jQuery,window,document),function(k,T,S){"use strict";k.isFunction=k.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},T=void 0!==T&&T.Math==Math?T:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),k.fn.accordion=function(p){var h,v=k(this),b=(new Date).getTime(),y=[],x=p,C="string"==typeof x,w=[].slice.call(arguments,1);return v.each(function(){var e,a=k.isPlainObject(p)?k.extend(!0,{},k.fn.accordion.settings,p):k.extend({},k.fn.accordion.settings),r=a.className,t=a.namespace,s=a.selector,l=a.error,n="."+t,i="module-"+t,o=v.selector||"",c=k(this),u=c.find(s.title),d=c.find(s.content),f=this,m=c.data(i),g={initialize:function(){g.debug("Initializing",c),g.bind.events(),a.observeChanges&&g.observeChanges(),g.instantiate()},instantiate:function(){m=g,c.data(i,g)},destroy:function(){g.debug("Destroying previous instance",c),c.off(n).removeData(i)},refresh:function(){u=c.find(s.title),d=c.find(s.content)},observeChanges:function(){"MutationObserver"in T&&((e=new MutationObserver(function(e){g.debug("DOM tree modified, updating selector cache"),g.refresh()})).observe(f,{childList:!0,subtree:!0}),g.debug("Setting up mutation observer",e))},bind:{events:function(){g.debug("Binding delegated events"),c.on(a.on+n,s.trigger,g.event.click)}},event:{click:function(e){0===k(e.target).closest(s.ignore).length&&g.toggle.call(this)}},toggle:function(e){var e=e!==S?"number"==typeof e?u.eq(e):k(e).closest(s.title):k(this).closest(s.title),t=e.next(d),n=t.hasClass(r.animating),t=t.hasClass(r.active),i=t&&!n,t=!t&&n;g.debug("Toggling visibility of content",e),i||t?a.collapsible?g.close.call(e):g.debug("Cannot close accordion content collapsing is disabled"):g.open.call(e)},open:function(e){var e=e!==S?"number"==typeof e?u.eq(e):k(e).closest(s.title):k(this).closest(s.title),t=e.next(d),n=t.hasClass(r.animating);t.hasClass(r.active)||n?g.debug("Accordion already open, skipping",t):(g.debug("Opening accordion content",e),a.onOpening.call(t),a.onChanging.call(t),a.exclusive&&g.closeOthers.call(e),e.addClass(r.active),t.stop(!0,!0).addClass(r.animating),a.animateChildren&&(k.fn.transition!==S&&c.transition("is supported")?t.children().transition({animation:"fade in",queue:!1,useFailSafe:!0,debug:a.debug,verbose:a.verbose,silent:a.silent,duration:a.duration,skipInlineHidden:!0,onComplete:function(){t.children().removeClass(r.transition)}}):t.children().stop(!0,!0).animate({opacity:1},a.duration,g.resetOpacity)),t.slideDown(a.duration,a.easing,function(){t.removeClass(r.animating).addClass(r.active),g.reset.display.call(this),a.onOpen.call(this),a.onChange.call(this)}))},close:function(e){var e=e!==S?"number"==typeof e?u.eq(e):k(e).closest(s.title):k(this).closest(s.title),t=e.next(d),n=t.hasClass(r.animating),i=t.hasClass(r.active);!i&&!(!i&&n)||i&&n||(g.debug("Closing accordion content",t),a.onClosing.call(t),a.onChanging.call(t),e.removeClass(r.active),t.stop(!0,!0).addClass(r.animating),a.animateChildren&&(k.fn.transition!==S&&c.transition("is supported")?t.children().transition({animation:"fade out",queue:!1,useFailSafe:!0,debug:a.debug,verbose:a.verbose,silent:a.silent,duration:a.duration,skipInlineHidden:!0}):t.children().stop(!0,!0).animate({opacity:0},a.duration,g.resetOpacity)),t.slideUp(a.duration,a.easing,function(){t.removeClass(r.animating).removeClass(r.active),g.reset.display.call(this),a.onClose.call(this),a.onChange.call(this)}))},closeOthers:function(e){var t,e=e!==S?u.eq(e):k(this).closest(s.title),n=e.parents(s.content).prev(s.title),e=e.closest(s.accordion),i=s.title+"."+r.active+":visible",o=s.content+"."+r.active+":visible",o=a.closeNested?(t=e.find(i).not(n)).next(d):(t=e.find(i).not(n),e=e.find(o).find(i).not(n),(t=t.not(e)).next(d));0").addClass(G.popup)[e](t)),ee.addClass(G.calendar),te&&ee.addClass(G.inverted),e=function(){return ne.refreshTooltips(),$.onVisible.apply(ee,arguments)},l.length||(ee.attr("tabindex","0"),e=function(){return ne.refreshTooltips(),ne.focus(),$.onVisible.apply(ee,arguments)}),t=ne.setting("on"),t=oe.extend({},$.popupOptions,{popup:ee,on:t,hoverable:"hover"===t,closable:"click"===t,onShow:function(){return ne.set.focusDate(ne.get.date()),ne.set.mode(ne.get.validatedMode($.startMode)),$.onShow.apply(ee,arguments)},onVisible:e,onHide:$.onHide,onHidden:function(){return ne.blur(),$.onHidden.apply(ee,arguments)}}),ne.popup(t)))},inline:function(){c.length&&!$.inline||($.inline=!0,ee=oe("
").addClass(G.calendar).appendTo(r),l.length||ee.attr("tabindex","0"))},input:function(){$.touchReadonly&&l.length&&d&&l.prop("readonly",!0),ne.check.disabled()},date:function(){var e;$.initialDate?e=i.date($.initialDate,$):r.data(_.date)!==ae?e=i.date(r.data(_.date),$):l.length&&(e=i.date(l.val(),$)),ne.set.date(e,$.formatInput,!1),ne.set.mode(ne.get.mode(),!1)}},trigger:{change:function(){var e,t=l[0];t&&(e=D.createEvent("HTMLEvents"),ne.verbose("Triggering native change event"),e.initEvent("change",!0,!1),t.dispatchEvent(e))}},create:{calendar:function(){var e,t,j,n=ne.get.mode(),i=new Date,V=ne.get.date(),o=ne.get.focusDate(),a=ne.helper.dateInRange(o||V||$.initialDate||i),r=(o||ne.set.focusDate(o=a,!1,!1),"year"===n),s="month"===n,l="day"===n,c="hour"===n,u="minute"===n,q="time"===$.type,z=Math.max($.multiMonth,1),N=l?ne.get.monthOffset():0,d=a.getMinutes(),f=a.getHours(),m=a.getDate(),H=a.getMonth()+N,g=a.getFullYear(),p=l?$.showWeekNumbers?8:7:c?4:Z.column,U=l||c?6:Z.row,h=l?z:1,v=(b=ee).hasClass("left")?"right center":"left center";for(b.empty(),1").addClass(G.grid).appendTo(b)),t=0;t").addClass(G.column).appendTo(j));var b,y=H+t,B=(new Date(g,y,1).getDay()-$.firstDayOfWeek%7+7)%7,x=(!$.constantHeight&&l&&(x=new Date(g,y+1,0).getDate()+B,U=Math.ceil(x/7)),r?10:s?1:0),C=l?1:0,w=c||u?1:0,k=c||u?m:1,T=new Date(g-x,y-C,k-w,f),C=new Date(g+x,y+C,k+w,f),k=r?new Date(10*Math.ceil(g/10)-9,0,0):s?new Date(g,0,0):l?new Date(g,y,0):new Date(g,y,m,-1),w=r?new Date(10*Math.ceil(g/10)+1,0,1):s?new Date(g+1,0,1):l?new Date(g,y+1,1):new Date(g,y,m+1),S=n,S=(l&&$.showWeekNumbers&&(S+=" andweek"),oe("").addClass(G.table).addClass(S).addClass(ie[p]+" column").appendTo(b)),W=(te&&S.addClass(G.inverted),p);if(!q){var Y=oe("").appendTo(S),D=oe("").appendTo(Y),A=oe("").appendTo(Y),$.showWeekNumbers&&((A=oe("").appendTo(S),O=r?10*Math.ceil(g/10)-9:l?1-B:0,K=0;K").appendTo(Q),l&&$.showWeekNumbers&&((A=oe("").appendTo(Q),(k=oe("
").attr("colspan",""+p).appendTo(D),E=r||s?new Date(g,0,1):l?new Date(g,y,1):new Date(g,y,m,f,d),F=oe("").addClass(G.link).appendTo(A),E=(F.text(ne.helper.dateFormat(J[n+"Header"],E)),s?$.disableYear?"day":"year":l?$.disableMonth?"year":"month":"day");if(F.data(_.mode,E),0===t&&((F=oe("").addClass(G.prev).appendTo(A)).data(_.focusDate,T),F.toggleClass(G.disabledCell,!ne.helper.isDateInRange(k,n)),oe("").addClass(G.prevIcon).appendTo(F)),t===h-1&&((E=oe("").addClass(G.next).appendTo(A)).data(_.focusDate,C),E.toggleClass(G.disabledCell,!ne.helper.isDateInRange(w,n)),oe("").addClass(G.nextIcon).appendTo(E)),l)for(D=oe("
").appendTo(D)).text($.text.weekNo),A.addClass(G.weekCell),W--),O=0;O").appendTo(D)).text(J.dayColumnHeader((O+$.firstDayOfWeek)%7,$))}for(var Q=oe("
").appendTo(D)).text(ne.get.weekOfYear(g,y,O+1-$.firstDayOfWeek)),A.addClass(G.weekCell)),e=0;e").addClass(G.cell).appendTo(D)).text(R),A.data(_.date,M),l&&M.getMonth()!==(y+12)%12),I=!$.selectAdjacentDays&&R||!ne.helper.isDateInRange(M,n)||$.isDisabled(M,n)||ne.helper.isDisabled(M,n)||!ne.helper.isEnabled(M,n),L=(I?(null!==(L=ne.helper.findDayAsObject(M,n,$.disabledDates))&&L[_.message]&&(A.attr("data-tooltip",L[_.message]),A.attr("data-position",L[_.position]||v),(L[_.inverted]||te&&L[_.inverted]===ae)&&A.attr("data-inverted",""),L[_.variation]&&A.attr("data-variation",L[_.variation])),"hour"===n&&null!==(L=ne.helper.findHourAsObject(M,n,$.disabledHours))&&L[_.message]&&(A.attr("data-tooltip",L[_.message]),A.attr("data-position",L[_.position]||v),(L[_.inverted]||te&&L[_.inverted]===ae)&&A.attr("data-inverted",""),L[_.variation]&&A.attr("data-variation",L[_.variation]))):null!==(P=ne.helper.findDayAsObject(M,n,$.eventDates))&&(A.addClass(P[_.class]||$.eventClass),P[_.message]&&(A.attr("data-tooltip",P[_.message]),A.attr("data-position",P[_.position]||v),(P[_.inverted]||te&&P[_.inverted]===ae)&&A.attr("data-inverted",""),P[_.variation]&&A.attr("data-variation",P[_.variation]))),ne.helper.dateEqual(M,V,n)),X=ne.helper.dateEqual(M,i,n),R=(A.toggleClass(G.adjacentCell,R&&!P),A.toggleClass(G.disabledCell,I),A.toggleClass(G.activeCell,L&&!(R&&I)),c||u||A.toggleClass(G.todayCell,!R&&X),{mode:n,adjacent:R,disabled:I,active:L,today:X});J.cell(A,M,R),ne.helper.dateEqual(M,o,n)&&ne.set.focusDate(M,!1,!1)}$.today&&(T=oe("
").attr("colspan",""+p).addClass(G.today).appendTo(T)).text(J.today($)),k.data(_.date,i)),ne.update.focus(!1,S),$.inline&&ne.refreshTooltips()}}},update:{focus:function(e,t){t=t||ee;var r=ne.get.mode(),n=ne.get.date(),s=ne.get.focusDate(),l=ne.get.startDate(),c=ne.get.endDate(),u=(e?s:null)||n||(d?null:s);t.find("td").each(function(){var e,t,n,i,o=oe(this),a=o.data(_.date);a&&(e=o.hasClass(G.disabledCell),t=o.hasClass(G.activeCell),n=o.hasClass(G.adjacentCell),i=ne.helper.dateEqual(a,s,r),a=!!u&&(!!l&&ne.helper.isDateInRange(a,r,l,u)||!!c&&ne.helper.isDateInRange(a,r,u,c)),o.toggleClass(G.focusCell,i&&(!d||m)&&(!n||$.selectAdjacentDays&&n)&&!e),ne.helper.isTodayButton(o)||o.toggleClass(G.rangeCell,a&&!t&&!e))})}},refresh:function(){ne.create.calendar()},refreshTooltips:function(){var i=oe(S).width();ee.find("td[data-position]").each(function(){var e=oe(this),t=S.getComputedStyle(e[0],"::after").width.replace(/[^0-9\.]/g,""),n=e.attr("data-position"),t=i-e.width()-(parseInt(t,10)||250)>e.offset().left?"right":"left";-1===n.indexOf(t)&&e.attr("data-position",n.replace(/(left|right)/,t))})},bind:{events:function(){ne.debug("Binding events"),ee.on("mousedown"+o,ne.event.mousedown),ee.on("touchstart"+o,ne.event.mousedown),ee.on("mouseup"+o,ne.event.mouseup),ee.on("touchend"+o,ne.event.mouseup),ee.on("mouseover"+o,ne.event.mouseover),l.length?(l.on("input"+o,ne.event.inputChange),l.on("focus"+o,ne.event.inputFocus),l.on("blur"+o,ne.event.inputBlur),l.on("keydown"+o,ne.event.keydown)):ee.on("keydown"+o,ne.event.keydown)}},unbind:{events:function(){ne.debug("Unbinding events"),ee.off(o),l.length&&l.off(o)}},event:{mouseover:function(e){var t=oe(e.target).data(_.date),e=1===e.buttons;t&&ne.set.focusDate(t,!1,!0,e)},mousedown:function(e){l.length&&e.preventDefault(),m=0<=e.type.indexOf("touch");e=oe(e.target).data(_.date);e&&ne.set.focusDate(e,!1,!0,!0)},mouseup:function(e){ne.focus(),e.preventDefault(),e.stopPropagation(),m=!1;var t,n,i,e=oe(e.target);e.hasClass("disabled")||(t=(e=(t=e.parent()).data(_.date)||t.data(_.focusDate)||t.data(_.mode)?t:e).data(_.date),n=e.data(_.focusDate),i=e.data(_.mode),t&&!1!==$.onSelect.call(u,t,ne.get.mode())?(e=e.hasClass(G.today),ne.selectDate(t,e)):n?ne.set.focusDate(n):i&&ne.set.mode(i))},keydown:function(e){var t,n,i,o,a,r,s,l=e.which;9===l&&ne.popup("hide"),ne.popup("is visible")&&(t=ne.get.mode(),37===l||38===l||39===l||40===l?(a="day"===t?7:"hour"===t?4:"minute"===t?Z.column:3,a=37===l?-1:38===l?-a:39==l?1:a,a*="minute"===t?$.minTimeGap:1,r=(n=ne.get.focusDate()||ne.get.date()||new Date).getFullYear()+("year"===t?a:0),s=n.getMonth()+("month"===t?a:0),i=n.getDate()+("day"===t?a:0),o=n.getHours()+("hour"===t?a:0),a=n.getMinutes()+("minute"===t?a:0),r=new Date(r,s,i,o,a),"time"===$.type&&(r=ne.helper.mergeDateTime(n,r)),ne.helper.isDateInRange(r,t)&&ne.set.focusDate(r)):13===l?((s=ne.get.focusDate())&&!$.isDisabled(s,t)&&!ne.helper.isDisabled(s,t)&&ne.helper.isEnabled(s,t)&&!1!==$.onSelect.call(u,s,ne.get.mode())&&ne.selectDate(s),e.preventDefault(),e.stopPropagation()):27===l&&(ne.popup("hide"),e.stopPropagation())),38!==l&&40!==l||(e.preventDefault(),ne.popup("show"))},inputChange:function(){var e=l.val(),e=i.date(e,$);ne.set.date(e,!1)},inputFocus:function(){ee.addClass(G.active)},inputBlur:function(){var e;ee.removeClass(G.active),$.formatInput&&(e=ne.get.date(),e=ne.helper.dateFormat(J[$.type],e),l.val(e)),p&&(ne.trigger.change(),p=!1)},class:{mutation:function(e){e.forEach(function(e){"class"===e.attributeName&&ne.check.disabled()})}}},observeChanges:function(){"MutationObserver"in S&&(e=new MutationObserver(ne.event.class.mutation),ne.debug("Setting up mutation observer",e),ne.observe.class())},disconnect:{classObserver:function(){l.length&&e&&e.disconnect()}},observe:{class:function(){l.length&&e&&e.observe(r[0],{attributes:!0})}},is:{disabled:function(){return r.hasClass(G.disabled)}},check:{disabled:function(){l.attr("tabindex",ne.is.disabled()?-1:0)}},get:{weekOfYear:function(e,t,n){return e=Date.UTC(e,t,n+3)/864e5,e=Math.floor(e/7),t=new Date(6048e5*e).getUTCFullYear(),e-Math.floor(Date.UTC(t,0,7)/6048e5)+1},formattedDate:function(e,t){return ne.helper.dateFormat(e||J[$.type],t||ne.get.date())},date:function(){return ne.helper.sanitiseDate(r.data(_.date))||null},inputDate:function(){return l.val()},focusDate:function(){return r.data(_.focusDate)||null},startDate:function(){var e=ne.get.calendarModule($.startCalendar);return(e?e.get.date():r.data(_.startDate))||null},endDate:function(){var e=ne.get.calendarModule($.endCalendar);return(e?e.get.date():r.data(_.endDate))||null},minDate:function(){return r.data(_.minDate)||null},maxDate:function(){return r.data(_.maxDate)||null},monthOffset:function(){return r.data(_.monthOffset)||$.monthOffset||0},mode:function(){var e=r.data(_.mode)||$.startMode;return ne.get.validatedMode(e)},validatedMode:function(e){var t=ne.get.validModes();return 0<=oe.inArray(e,t)?e:"time"===$.type?"hour":"month"===$.type?"month":"year"===$.type?"year":"day"},type:function(){return r.data(_.type)||$.type},validModes:function(){var e=[];return"time"!==$.type&&($.disableYear&&"year"!==$.type||e.push("year"),($.disableMonth||"year"===$.type)&&"month"!==$.type||e.push("month"),0<=$.type.indexOf("date")&&e.push("day")),0<=$.type.indexOf("time")&&(e.push("hour"),$.disableMinute||e.push("minute")),e},isTouch:function(){try{return D.createEvent("TouchEvent"),!0}catch(e){return!1}},calendarModule:function(e){return e?(e=e instanceof oe?e:oe(D).find(e).first()).data(a):null}},set:{date:function(e,t,n){t=!1!==t,n=!1!==n,e=ne.helper.sanitiseDate(e),e=ne.helper.dateInRange(e);var i=ne.get.mode(),o=ne.helper.dateFormat(J[$.type],e);if(n&&!1===$.onBeforeChange.call(u,e,o,i))return!1;if(ne.set.focusDate(e),$.isDisabled(e,i))return!1;var a=ne.get.endDate();a&&e&&a=e?ne.verbose("Unable to set maxDate variable lower that minDate variable",e,$.minDate):(ne.setting("maxDate",e),ne.set.dataKeyValue(_.maxDate,e))},monthOffset:function(e,t){var n=Math.max($.multiMonth,1);e=Math.max(1-n,Math.min(0,e)),ne.set.dataKeyValue(_.monthOffset,e,t)},mode:function(e,t){ne.set.dataKeyValue(_.mode,e,t)},dataKeyValue:function(e,t,n){var i=r.data(e),i=i===t||i<=t&&t<=i;return t?r.data(e,t):r.removeData(e),(n=!1!==n&&!i)&&ne.refresh(),!i}},selectDate:function(e,t){ne.verbose("New date selection",e);var n=ne.get.mode();t||"minute"===n||$.disableMinute&&"hour"===n||"date"===$.type&&"day"===n||"month"===$.type&&"month"===n||"year"===$.type&&"year"===n?!1!==ne.set.date(e)&&(p=!0,$.closable&&(ne.popup("hide"),(t=ne.get.calendarModule($.endCalendar))&&(t.refresh(),"focus"!==t.setting("on")&&t.popup("show"),t.focus()))):(t="year"===n?$.disableMonth?"day":"month":"month"===n?"day":"day"===n?"hour":"minute",ne.set.mode(t),"hour"===n||"day"===n&&ne.get.date()?ne.set.date(e,!0,!1):ne.set.focusDate(e))},changeDate:function(e){ne.set.date(e)},clear:function(){ne.set.date(ae)},popup:function(){return c.popup.apply(c,arguments)},focus:function(){(l.length?l:ee).focus()},blur:function(){(l.length?l:ee).blur()},helper:{dateFormat:function(e,t){if(!(t instanceof Date))return"";if("function"==typeof e)return e.call(ne,t,$);var n=t.getDate(),i=t.getMonth(),o=t.getFullYear(),a=t.getDay(),r=t.getHours(),s=t.getMinutes(),t=t.getSeconds(),l=ne.get.weekOfYear(o,i,n+1-$.firstDayOfWeek),c=r%12||12,u=(r<12?$.text.am:$.text.pm).toLowerCase(),d={D:n,DD:("0"+n).slice(-2),M:i+1,MM:("0"+(i+1)).slice(-2),MMM:$.text.monthsShort[i],MMMM:$.text.months[i],Y:o,YY:String(o).slice(2),YYYY:o,d:a,dd:$.text.dayNamesShort[a].slice(0,2),ddd:$.text.dayNamesShort[a],dddd:$.text.dayNames[a],h:c,hh:("0"+c).slice(-2),H:r,HH:("0"+r).slice(-2),m:s,mm:("0"+s).slice(-2),s:t,ss:("0"+t).slice(-2),a:u,A:u.toUpperCase(),S:["th","st","nd","rd"][3=t.centuryBreak&&n===v.length-1){i<=99&&(i+=t.currentCentury-100),m=i,v.splice(n,1);break}if(f<0)for(n=0;n adjusting invoked element"),p=p.closest(g.checkbox),y.refresh())}},setup:function(){y.set.initialLoad(),y.is.indeterminate()?(y.debug("Initial value is indeterminate"),y.indeterminate()):y.is.checked()?(y.debug("Initial value is checked"),y.check()):(y.debug("Initial value is unchecked"),y.uncheck()),y.remove.initialLoad()},refresh:function(){a=p.children(g.label),h=p.children(g.input),v=h[0]},hide:{input:function(){y.verbose("Modifying z-index to be unselectable"),h.addClass(t.hidden)}},show:{input:function(){y.verbose("Modifying z-index to be selectable"),h.removeClass(t.hidden)}},observeChanges:function(){"MutationObserver"in D&&((e=new MutationObserver(function(e){y.debug("DOM tree modified, updating selector cache"),y.refresh()})).observe(c,{childList:!0,subtree:!0}),y.debug("Setting up mutation observer",e))},attachEvents:function(e,t){var n=S(e);t=S.isFunction(y[t])?y[t]:y.toggle,0").insertAfter(h),y.debug("Creating label",a))}},has:{label:function(){return 0 .ui.dimmer",content:".ui.dimmer > .content, .ui.dimmer > .content > .center"},template:{dimmer:function(e){var t,n=k("
").addClass("ui dimmer");return e.displayLoader&&(t=k("
").addClass(e.className.loader).addClass(e.loaderVariation),e.loaderText&&(t.text(e.loaderText),t.addClass("text")),n.append(t)),n}}}}(jQuery,window,document),function(Z,ee,te,ne){"use strict";Z.isFunction=Z.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},ee=void 0!==ee&&ee.Math==Math?ee:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),Z.fn.dropdown=function(B){var W,Y=Z(this),Q=Z(te),K=Y.selector||"",X=(new Date).getTime(),$=[],G=B,J="string"==typeof G,_=[].slice.call(arguments,1);return Y.each(function(j){var f,e,t,n,i,o,a,r,s,m=Z.isPlainObject(B)?Z.extend(!0,{},Z.fn.dropdown.settings,B):Z.extend({},Z.fn.dropdown.settings),g=m.className,p=m.message,l=m.fields,h=m.keys,v=m.metadata,V=m.namespace,c=m.regExp,b=m.selector,u=m.error,q=m.templates,d="."+V,y="module-"+V,x=Z(this),C=[ee,te].indexOf(m.context)<0?Q.find(m.context):Z(m.context),w=x.find(b.text),k=x.find(b.search),T=x.find(b.sizer),S=x.find(b.input),z=x.find(b.icon),N=x.find(b.clearIcon),D=0").html(i).attr("data-"+v.value,t).attr("data-"+v.text,t).addClass(g.addition).addClass(g.item),m.hideAdditions&&i.addClass(g.hidden),n=n===ne?i:n.add(i),L.verbose("Creating user choices for value",t,i))}),n)},userLabels:function(e){var t=L.get.userValues();t&&(L.debug("Adding user labels",t),Z.each(t,function(e,t){L.verbose("Adding custom user value"),L.add.label(t,t)}))},menu:function(){A=Z("
").addClass(g.menu).appendTo(x)},sizer:function(){T=Z("").addClass(g.sizer).insertAfter(k)}},search:function(e){e=e!==ne?e:L.get.query(),L.verbose("Searching for query",e),!1===m.fireOnInit&&L.is.initialLoad()?L.verbose("Skipping callback on initial load",m.onSearch):L.has.minCharacters(e)&&!1!==m.onSearch.call(M,e)?L.filter(e):L.hide(null,!0)},select:{firstUnfiltered:function(){L.verbose("Selecting first non-filtered element"),L.remove.selectedItem(),E.not(b.unselectable).not(b.addition+b.hidden).eq(0).addClass(g.selected)},nextAvailable:function(e){var t=(e=e.eq(0)).nextAll(b.item).not(b.unselectable).eq(0),e=e.prevAll(b.item).not(b.unselectable).eq(0);0").addClass("remove icon").insertBefore(w)),L.is.search()&&!L.has.search()&&(L.verbose("Adding search input"),e=x.prev("label"),k=Z("").addClass(g.search).prop("autocomplete",L.is.chrome()?"fomantic-search":"off"),e.length&&(e.attr("id")||e.attr("id","_"+L.get.id()+"_formLabel"),k.attr("aria-labelledby",e.attr("id"))),k.insertBefore(w)),L.is.multiple()&&L.is.searchSelection()&&!L.has.sizer()&&L.create.sizer(),m.allowTab&&L.set.tabbable()},select:function(){var e=L.get.selectValues();L.debug("Dropdown initialized on a select",e),0<(S=x.is("select")?x:S).parent(b.dropdown).length?(L.debug("UI dropdown already exists. Creating dropdown menu only"),x=S.closest(b.dropdown),L.has.menu()||L.create.menu(),A=x.children(b.menu),L.setup.menu(e)):(L.debug("Creating entire dropdown from select"),x=Z("
").attr("class",S.attr("class")).addClass(g.selection).addClass(g.dropdown).html(q.dropdown(e,l,m.preserveHTML,m.className)).insertBefore(S),S.hasClass(g.multiple)&&!1===S.prop("multiple")&&(L.error(u.missingMultiple),S.prop("multiple",!0)),S.is("[multiple]")&&L.set.multiple(),S.prop("disabled")&&(L.debug("Disabling dropdown"),x.addClass(g.disabled)),S.is("[required]")&&(m.forceSelection=!0),S.removeAttr("required").removeAttr("class").detach().prependTo(x)),L.refresh()},menu:function(e){A.html(q.menu(e,l,m.preserveHTML,m.className)),E=A.find(b.item),F=m.hideDividers?E.parent().children(b.divider):Z()},reference:function(){L.debug("Dropdown behavior was called on select, replacing with closest dropdown"),x=x.parent(b.dropdown),I=x.data(y),M=x[0],L.refresh(),L.setup.returnedObject()},returnedObject:function(){var e=Y.slice(0,j),t=Y.slice(j+1);Y=e.add(x).add(t)}},refresh:function(){L.refreshSelectors(),L.refreshData()},refreshItems:function(){E=A.find(b.item),F=m.hideDividers?E.parent().children(b.divider):Z()},refreshSelectors:function(){L.verbose("Refreshing selector cache"),w=x.find(b.text),k=x.find(b.search),S=x.find(b.input),z=x.find(b.icon),D=0"),Z.each(e,function(e,t){var n=m.templates.deQuote(t[l.value]),i=m.templates.escape(t[l.name]||"",m.preserveHTML);S.append('")}),L.observe.select())}},event:{paste:function(e){(e.originalEvent.clipboardData||ee.clipboardData).getData("text").split(m.delimiter).forEach(function(e){L.set.selected(L.escape.htmlEntities(e.trim()),null,!0,!0)}),e.preventDefault()},change:function(){U||(L.debug("Input changed, updating selection"),L.set.selected())},focus:function(){m.showOnFocus&&!O&&L.is.hidden()&&!t&&(R=!0,L.show())},blur:function(e){t=te.activeElement===this,O||t||(L.remove.activeLabel(),L.hide())},mousedown:function(){L.is.searchSelection(!0)?n=!0:O=!0},mouseup:function(){L.is.searchSelection(!0)?n=!1:O=!1},click:function(e){Z(e.target).is(x)&&(L.is.focusedOnSearch()?L.show():L.focusSearch())},search:{focus:function(e){O=!0,L.is.multiple()&&L.remove.activeLabel(),R||L.is.active()||!(m.showOnFocus||"focus"!==e.type&&"focusin"!==e.type)||"touchstart"===e.type||(R=!0,L.search())},blur:function(e){t=te.activeElement===this,!L.is.searchSelection(!0)||n||H||t||(m.forceSelection?L.forceSelection():m.allowAdditions||L.remove.searchTerm(),L.hide()),n=!1}},clearIcon:{click:function(e){L.clear(),L.is.searchSelection()&&L.remove.searchTerm(),L.hide(),e.stopPropagation()}},icon:{click:function(e){P=!0,L.has.search()?L.is.active()?L.blurSearch():m.showOnFocus?L.focusSearch():L.toggle():L.toggle(),e.stopPropagation()}},text:{focus:function(e){O=!0,L.focusSearch()}},input:function(e){(L.is.multiple()||L.is.searchSelection())&&L.set.filtered(),clearTimeout(L.timer),L.timer=setTimeout(L.search,m.delay.search)},label:{click:function(e){var t=Z(this),n=x.find(b.label),i=n.filter("."+g.active),o=t.nextAll("."+g.active),a=t.prevAll("."+g.active),o=(0 modified, recreating menu"),L.disconnect.selectObserver(),L.refresh(),L.setup.select(),L.set.selected(),L.observe.select())}},menu:{mutation:function(e){var e=e[0],t=e.addedNodes?Z(e.addedNodes[0]):Z(!1),e=e.removedNodes?Z(e.removedNodes[0]):Z(!1),t=t.add(e),e=t.is(b.addition)||0=m.maxSelections?(L.debug("Maximum selection count reached"),m.useLabels&&(E.addClass(g.filtered),L.add.message(p.maxSelections)),!0):(L.verbose("No longer at maximum selection count"),L.remove.message(),L.remove.filteredItem(),L.is.searchSelection()&&L.filterItems(),!1))},disabled:function(){k.attr("tabindex",L.is.disabled()?-1:0)}},restore:{defaults:function(e){L.clear(e),L.restore.defaultText(),L.restore.defaultValue()},defaultText:function(){var e=L.get.defaultText();e===L.get.placeholderText?(L.debug("Restoring default placeholder text",e),L.set.placeholderText(e)):(L.debug("Restoring default text",e),L.set.text(e))},placeholderText:function(){L.set.placeholderText()},defaultValue:function(){var e=L.get.defaultValue();e!==ne&&(L.debug("Restoring default value",e),""!==e?(L.set.value(e),L.set.selected()):(L.remove.activeItem(),L.remove.selectedItem()))},labels:function(){m.allowAdditions&&(m.useLabels||(L.error(u.labels),m.useLabels=!0),L.debug("Restoring selected values"),L.create.userLabels()),L.check.maxSelections()},selected:function(){L.restore.values(),L.is.multiple()?(L.debug("Restoring previously selected values and labels"),L.restore.labels()):L.debug("Restoring previously selected values")},values:function(){L.set.initialLoad(),m.apiSettings&&m.saveRemoteData&&L.get.remoteValues()?L.restore.remoteValues():L.set.selected();var e=L.get.value();!e||""===e||Array.isArray(e)&&0===e.length?S.addClass(g.noselection):S.removeClass(g.noselection),L.remove.initialLoad()},remoteValues:function(){var e=L.get.remoteValues();L.debug("Recreating selected from session data",e),e&&(L.is.single()?Z.each(e,function(e,t){L.set.text(t)}):Z.each(e,function(e,t){L.add.label(e,t)}))}},read:{remoteData:function(e){if(ee.Storage!==ne)return(e=sessionStorage.getItem(e+i))!==ne&&e;L.error(u.noStorage)}},save:{defaults:function(){L.save.defaultText(),L.save.placeholderText(),L.save.defaultValue()},defaultValue:function(){var e=L.get.value();L.verbose("Saving default value as",e),x.data(v.defaultValue,e)},defaultText:function(){var e=L.get.text();L.verbose("Saving default text as",e),x.data(v.defaultText,e)},placeholderText:function(){var e;!1!==m.placeholder&&w.hasClass(g.placeholder)&&(e=L.get.text(),L.verbose("Saving placeholder text as",e),x.data(v.placeholderText,e))},remoteData:function(e,t){ee.Storage===ne?L.error(u.noStorage):(L.verbose("Saving remote data to session storage",t,e),sessionStorage.setItem(t+i,e))}},clear:function(e){L.is.multiple()&&m.useLabels?L.remove.labels(x.find(b.label),e):(L.remove.activeItem(),L.remove.selectedItem(),L.remove.filteredItem()),L.set.placeholderText(),L.clearValue(e)},clearValue:function(e){L.set.value("",null,null,e)},scrollPage:function(e,t){var t=t||L.get.selectedItem(),n=t.closest(b.menu),i=n.outerHeight(),o=n.scrollTop(),a=E.eq(0).outerHeight(),i=Math.floor(i/a),o="up"==e?o-a*i:o+a*i,a=E.not(b.unselectable),i="up"==e?a.index(t)-i:a.index(t)+i,i=("up"==e?0<=i:i").addClass(g.label).attr("data-"+v.value,a).html(q.label(a,t,m.preserveHTML,m.className)),i=m.onLabelCreate.call(i,a,t),L.has.label(e)?L.debug("User selection already exists, skipping",a):(m.label.variation&&i.addClass(m.label.variation),!0===n?(L.debug("Animating in label",i),i.addClass(g.hidden).insertBefore(o).transition({animation:m.label.transition,debug:m.debug,verbose:m.verbose,silent:m.silent,duration:m.label.duration})):(L.debug("Adding selection label",i),i.insertBefore(o)))},message:function(e){var t=A.children(b.message),e=m.templates.message(L.add.variables(e));0").html(e).addClass(g.message).appendTo(A)},optionValue:function(e){var t=L.escape.value(e);0").prop("value",t).addClass(g.addition).text(e).appendTo(S),L.verbose("Adding user addition as an
-
- -
-
-
-
-
-
-
-
- -
- - diff --git a/requirements-dev.txt b/requirements-dev.txt index 93c3948..b8d95c3 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.10 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile --annotation-style=line requirements-dev.in @@ -20,10 +20,9 @@ click==8.1.7 # via black, fixit, moreorless, pip-tools colorama==0.4.6 # via tox commonmark==0.9.1 # via rich configargparse==1.7 # via gray -coverage[toml]==7.6.8 # via pytest-cov +coverage[toml]==7.6.9 # via pytest-cov distlib==0.3.9 # via virtualenv docutils==0.21.2 # via m2r, sphinx -exceptiongroup==1.2.2 # via pytest filelock==3.16.1 # via tox, virtualenv fixit==2.1.0 # via gray flake8==7.1.1 # via -r requirements-dev.in, pep8-naming @@ -71,10 +70,9 @@ sphinxcontrib-qthelp==2.0.0 # via sphinx sphinxcontrib-serializinghtml==2.0.0 # via sphinx tokenize-rt==6.1.0 # via add-trailing-comma, pyupgrade toml==0.10.2 # via autoflake -tomli==2.2.1 # via black, build, check-manifest, coverage, fixit, mypy, pip-tools, pyproject-api, pytest, sphinx, tox tox==4.23.2 # via -r requirements-dev.in trailrunner==1.4.0 # via fixit -typing-extensions==4.12.2 # via black, mypy, tox +typing-extensions==4.12.2 # via mypy unify==0.5 # via gray untokenize==0.1.1 # via unify urllib3==2.2.3 # via requests diff --git a/requirements.in b/requirements.in index 4686c2a..520ccc9 100644 --- a/requirements.in +++ b/requirements.in @@ -2,25 +2,17 @@ aprslib>=0.7.0 # For the list-plugins pypi.org search scraping beautifulsoup4 click -click-params dataclasses-json -flask -flask-httpauth -flask-socketio geopy imapclient kiss3 loguru oslo.config pluggy -python-socketio requests # Pinned due to gray needing 12.6.0 rich~=12.6.0 rush -shellingham -six -tabulate thesmuggler tzlocal update_checker diff --git a/requirements.txt b/requirements.txt index f0194fc..87051ce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.10 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile --annotation-style=line requirements.in @@ -8,31 +8,20 @@ aprslib==0.7.2 # via -r requirements.in attrs==24.2.0 # via ax253, kiss3, rush ax253==0.1.5.post1 # via kiss3 beautifulsoup4==4.12.3 # via -r requirements.in -bidict==0.23.1 # via python-socketio bitarray==3.0.0 # via ax253, kiss3 -blinker==1.9.0 # via flask certifi==2024.8.30 # via requests charset-normalizer==3.4.0 # via requests -click==8.1.7 # via -r requirements.in, click-params, flask -click-params==0.5.0 # via -r requirements.in +click==8.1.7 # via -r requirements.in commonmark==0.9.1 # via rich dataclasses-json==0.6.7 # via -r requirements.in debtcollector==3.0.0 # via oslo-config -deprecated==1.2.15 # via click-params -flask==3.1.0 # via -r requirements.in, flask-httpauth, flask-socketio -flask-httpauth==4.8.0 # via -r requirements.in -flask-socketio==5.4.1 # via -r requirements.in geographiclib==2.0 # via geopy geopy==2.4.1 # via -r requirements.in -h11==0.14.0 # via wsproto idna==3.10 # via requests imapclient==3.0.1 # via -r requirements.in importlib-metadata==8.5.0 # via ax253, kiss3 -itsdangerous==2.2.0 # via flask -jinja2==3.1.4 # via flask kiss3==8.0.0 # via -r requirements.in -loguru==0.7.2 # via -r requirements.in -markupsafe==3.0.2 # via jinja2, werkzeug +loguru==0.7.3 # via -r requirements.in marshmallow==3.23.1 # via dataclasses-json mypy-extensions==1.0.0 # via typing-inspect netaddr==1.3.0 # via oslo-config @@ -44,20 +33,14 @@ pluggy==1.5.0 # via -r requirements.in pygments==2.18.0 # via rich pyserial==3.5 # via pyserial-asyncio pyserial-asyncio==0.6 # via kiss3 -python-engineio==4.10.1 # via python-socketio -python-socketio==5.11.4 # via -r requirements.in, flask-socketio pytz==2024.2 # via -r requirements.in pyyaml==6.0.2 # via oslo-config requests==2.32.3 # via -r requirements.in, oslo-config, update-checker rfc3986==2.0.0 # via oslo-config rich==12.6.0 # via -r requirements.in rush==2021.4.0 # via -r requirements.in -shellingham==1.5.4 # via -r requirements.in -simple-websocket==1.1.0 # via python-engineio -six==1.16.0 # via -r requirements.in soupsieve==2.6 # via beautifulsoup4 stevedore==5.4.0 # via oslo-config -tabulate==0.9.0 # via -r requirements.in thesmuggler==1.0.1 # via -r requirements.in timeago==1.0.16 # via -r requirements.in typing-extensions==4.12.2 # via typing-inspect @@ -65,8 +48,5 @@ typing-inspect==0.9.0 # via dataclasses-json tzlocal==5.2 # via -r requirements.in update-checker==0.18.0 # via -r requirements.in urllib3==2.2.3 # via requests -validators==0.22.0 # via click-params -werkzeug==3.1.3 # via flask -wrapt==1.17.0 # via -r requirements.in, debtcollector, deprecated -wsproto==1.2.0 # via simple-websocket +wrapt==1.17.0 # via -r requirements.in, debtcollector zipp==3.21.0 # via importlib-metadata diff --git a/tests/cmds/test_send_message.py b/tests/cmds/test_send_message.py index 701a83d..b91f36b 100644 --- a/tests/cmds/test_send_message.py +++ b/tests/cmds/test_send_message.py @@ -27,8 +27,8 @@ class TestSendMessageCommand(unittest.TestCase): if password: CONF.aprs_network.password = password - CONF.admin.user = "admin" - CONF.admin.password = "password" + # CONF.aprsd_admin_extension.user = "admin" + # CONF.aprsd_admin_extension.password = "password" @mock.patch("aprsd.log.log.setup_logging") def test_no_tocallsign(self, mock_logging): diff --git a/tests/cmds/test_webchat.py b/tests/cmds/test_webchat.py deleted file mode 100644 index d9db09b..0000000 --- a/tests/cmds/test_webchat.py +++ /dev/null @@ -1,90 +0,0 @@ -import typing as t -import unittest -from unittest import mock - -from click.testing import CliRunner -import flask -import flask_socketio -from oslo_config import cfg - -from aprsd import conf # noqa: F401 -from aprsd.client import fake as fake_client -from aprsd.cmds import webchat # noqa -from aprsd.packets import core - -from .. import fake - - -CONF = cfg.CONF -F = t.TypeVar("F", bound=t.Callable[..., t.Any]) - - -class TestSendMessageCommand(unittest.TestCase): - - def config_and_init(self, login=None, password=None): - CONF.callsign = fake.FAKE_TO_CALLSIGN - CONF.trace_enabled = False - CONF.watch_list.packet_keep_count = 1 - if login: - CONF.aprs_network.login = login - if password: - CONF.aprs_network.password = password - - CONF.admin.user = "admin" - CONF.admin.password = "password" - - @mock.patch("aprsd.log.log.setup_logging") - def test_init_flask(self, mock_logging): - """Make sure we get an error if there is no login and config.""" - - CliRunner() - self.config_and_init() - - socketio = webchat.init_flask("DEBUG", False) - self.assertIsInstance(socketio, flask_socketio.SocketIO) - self.assertIsInstance(webchat.flask_app, flask.Flask) - - @mock.patch("aprsd.packets.tracker.PacketTrack.remove") - @mock.patch("aprsd.cmds.webchat.socketio") - def test_process_ack_packet( - self, - mock_remove, mock_socketio, - ): - self.config_and_init() - mock_socketio.emit = mock.MagicMock() - # Create an ACK packet - packet = fake.fake_ack_packet() - mock_queue = mock.MagicMock() - socketio = mock.MagicMock() - wcp = webchat.WebChatProcessPacketThread(mock_queue, socketio) - - wcp.process_ack_packet(packet) - mock_remove.called_once() - mock_socketio.called_once() - - @mock.patch("aprsd.threads.tx.send") - @mock.patch("aprsd.packets.PacketList.rx") - @mock.patch("aprsd.cmds.webchat.socketio") - @mock.patch("aprsd.client.factory.ClientFactory.create") - def test_process_our_message_packet( - self, - mock_tx_send, - mock_packet_add, - mock_socketio, - mock_factory, - ): - self.config_and_init() - mock_socketio.emit = mock.MagicMock() - packet = fake.fake_packet( - message="blah", - msg_number=1, - message_format=core.PACKET_TYPE_MESSAGE, - ) - mock_factory.return_value = fake_client.APRSDFakeClient() - mock_queue = mock.MagicMock() - socketio = mock.MagicMock() - wcp = webchat.WebChatProcessPacketThread(mock_queue, socketio) - - wcp.process_our_message_packet(packet) - mock_packet_add.called_once() - mock_socketio.called_once() From 0880a356e6df1a0924cbf6e815e68cba5f5c6cf1 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 10 Dec 2024 11:20:15 -0500 Subject: [PATCH 03/40] Remove email plugin This patch removes the email plugin from APRSD core. The new home for email plugin is here: http://github.com/hemna/aprsd-email-plugin.git --- aprsd/conf/__init__.py | 3 +- aprsd/conf/common.py | 1 - aprsd/conf/plugin_email.py | 105 ------ aprsd/plugins/email.py | 715 ------------------------------------- requirements.in | 1 - requirements.txt | 1 - tests/test_email.py | 32 -- tests/test_main.py | 16 - 8 files changed, 1 insertion(+), 873 deletions(-) delete mode 100644 aprsd/conf/plugin_email.py delete mode 100644 aprsd/plugins/email.py delete mode 100644 tests/test_email.py delete mode 100644 tests/test_main.py diff --git a/aprsd/conf/__init__.py b/aprsd/conf/__init__.py index be2e46c..df5008b 100644 --- a/aprsd/conf/__init__.py +++ b/aprsd/conf/__init__.py @@ -1,6 +1,6 @@ from oslo_config import cfg -from aprsd.conf import client, common, log, plugin_common, plugin_email +from aprsd.conf import client, common, log, plugin_common CONF = cfg.CONF @@ -11,7 +11,6 @@ client.register_opts(CONF) # plugins plugin_common.register_opts(CONF) -plugin_email.register_opts(CONF) def set_lib_defaults(): diff --git a/aprsd/conf/common.py b/aprsd/conf/common.py index 2ff0991..0ee1fa1 100644 --- a/aprsd/conf/common.py +++ b/aprsd/conf/common.py @@ -174,7 +174,6 @@ enabled_plugins_opts = [ cfg.ListOpt( "enabled_plugins", default=[ - "aprsd.plugins.email.EmailPlugin", "aprsd.plugins.fortune.FortunePlugin", "aprsd.plugins.location.LocationPlugin", "aprsd.plugins.ping.PingPlugin", diff --git a/aprsd/conf/plugin_email.py b/aprsd/conf/plugin_email.py deleted file mode 100644 index f0f3ea7..0000000 --- a/aprsd/conf/plugin_email.py +++ /dev/null @@ -1,105 +0,0 @@ -from oslo_config import cfg - - -email_group = cfg.OptGroup( - name="email_plugin", - title="Options for the APRSD Email plugin", -) - -email_opts = [ - cfg.StrOpt( - "callsign", - help="(Required) Callsign to validate for doing email commands." - "Only this callsign can check email. This is also where the " - "email notifications for new emails will be sent.", - ), - cfg.BoolOpt( - "enabled", - default=False, - help="Enable the Email plugin?", - ), - cfg.BoolOpt( - "debug", - default=False, - help="Enable the Email plugin Debugging?", - ), -] - -email_imap_opts = [ - cfg.StrOpt( - "imap_login", - help="Login username/email for IMAP server", - ), - cfg.StrOpt( - "imap_password", - secret=True, - help="Login password for IMAP server", - ), - cfg.HostnameOpt( - "imap_host", - help="Hostname/IP of the IMAP server", - ), - cfg.PortOpt( - "imap_port", - default=993, - help="Port to use for IMAP server", - ), - cfg.BoolOpt( - "imap_use_ssl", - default=True, - help="Use SSL for connection to IMAP Server", - ), -] - -email_smtp_opts = [ - cfg.StrOpt( - "smtp_login", - help="Login username/email for SMTP server", - ), - cfg.StrOpt( - "smtp_password", - secret=True, - help="Login password for SMTP server", - ), - cfg.HostnameOpt( - "smtp_host", - help="Hostname/IP of the SMTP server", - ), - cfg.PortOpt( - "smtp_port", - default=465, - help="Port to use for SMTP server", - ), - cfg.BoolOpt( - "smtp_use_ssl", - default=True, - help="Use SSL for connection to SMTP Server", - ), -] - -email_shortcuts_opts = [ - cfg.ListOpt( - "email_shortcuts", - help="List of email shortcuts for checking/sending email " - "For Exmaple: wb=walt@walt.com,cl=cl@cl.com\n" - "Means use 'wb' to send an email to walt@walt.com", - ), -] - -ALL_OPTS = ( - email_opts - + email_imap_opts - + email_smtp_opts - + email_shortcuts_opts -) - - -def register_opts(config): - config.register_group(email_group) - config.register_opts(ALL_OPTS, group=email_group) - - -def list_opts(): - return { - email_group.name: ALL_OPTS, - } diff --git a/aprsd/plugins/email.py b/aprsd/plugins/email.py deleted file mode 100644 index b7cd526..0000000 --- a/aprsd/plugins/email.py +++ /dev/null @@ -1,715 +0,0 @@ -import datetime -import email -from email.mime.text import MIMEText -import imaplib -import logging -import re -import smtplib -import threading -import time - -import imapclient -from oslo_config import cfg - -from aprsd import packets, plugin, threads, utils -from aprsd.stats import collector -from aprsd.threads import tx -from aprsd.utils import trace - - -CONF = cfg.CONF -LOG = logging.getLogger("APRSD") -shortcuts_dict = None - - -class EmailInfo: - """A singleton thread safe mechanism for the global check_email_delay. - - This has to be done because we have 2 separate threads that access - the delay value. - 1) when EmailPlugin runs from a user message and - 2) when the background EmailThread runs to check email. - - Access the check email delay with - EmailInfo().delay - - Set it with - EmailInfo().delay = 100 - or - EmailInfo().delay += 10 - - """ - - _instance = None - - def __new__(cls, *args, **kwargs): - """This magic turns this into a singleton.""" - if cls._instance is None: - cls._instance = super().__new__(cls) - cls._instance.lock = threading.Lock() - cls._instance._delay = 60 - return cls._instance - - @property - def delay(self): - with self.lock: - return self._delay - - @delay.setter - def delay(self, val): - with self.lock: - self._delay = val - - -@utils.singleton -class EmailStats: - """Singleton object to store stats related to email.""" - _instance = None - tx = 0 - rx = 0 - email_thread_last_time = None - - def stats(self, serializable=False): - if CONF.email_plugin.enabled: - last_check_time = self.email_thread_last_time - if serializable and last_check_time: - last_check_time = last_check_time.isoformat() - stats = { - "tx": self.tx, - "rx": self.rx, - "last_check_time": last_check_time, - } - else: - stats = {} - return stats - - def tx_inc(self): - self.tx += 1 - - def rx_inc(self): - self.rx += 1 - - def email_thread_update(self): - self.email_thread_last_time = datetime.datetime.now() - - -class EmailPlugin(plugin.APRSDRegexCommandPluginBase): - """Email Plugin.""" - - command_regex = "^-.*" - command_name = "email" - short_description = "Send and Receive email" - - # message_number:time combos so we don't resend the same email in - # five mins {int:int} - email_sent_dict = {} - enabled = False - - def setup(self): - """Ensure that email is enabled and start the thread.""" - if CONF.email_plugin.enabled: - self.enabled = True - - if not CONF.email_plugin.callsign: - self.enabled = False - LOG.error("email_plugin.callsign is not set.") - return - - if not CONF.email_plugin.imap_login: - LOG.error("email_plugin.imap_login not set. Disabling Plugin") - self.enabled = False - return - - if not CONF.email_plugin.smtp_login: - LOG.error("email_plugin.smtp_login not set. Disabling Plugin") - self.enabled = False - return - - shortcuts = _build_shortcuts_dict() - LOG.info(f"Email shortcuts {shortcuts}") - - # Register the EmailStats producer with the stats collector - # We do this here to prevent EmailStats from being registered - # when email is not enabled in the config file. - collector.Collector().register_producer(EmailStats) - else: - LOG.info("Email services not enabled.") - self.enabled = False - - def create_threads(self): - if self.enabled: - return APRSDEmailThread() - - @trace.trace - def process(self, packet: packets.MessagePacket): - LOG.info("Email COMMAND") - if not self.enabled: - # Email has not been enabled - # so the plugin will just NOOP - return packets.NULL_MESSAGE - - fromcall = packet.from_call - message = packet.message_text - ack = packet.get("msgNo", "0") - - reply = None - if not CONF.email_plugin.enabled: - LOG.debug("Email is not enabled in config file ignoring.") - return "Email not enabled." - - searchstring = "^" + CONF.email_plugin.callsign + ".*" - # only I can do email - if re.search(searchstring, fromcall): - # digits only, first one is number of emails to resend - r = re.search("^-([0-9])[0-9]*$", message) - if r is not None: - LOG.debug("RESEND EMAIL") - resend_email(r.group(1), fromcall) - reply = packets.NULL_MESSAGE - # -user@address.com body of email - elif re.search(r"^-([A-Za-z0-9_\-\.@]+) (.*)", message): - # (same search again) - a = re.search(r"^-([A-Za-z0-9_\-\.@]+) (.*)", message) - if a is not None: - to_addr = a.group(1) - content = a.group(2) - - email_address = get_email_from_shortcut(to_addr) - if not email_address: - reply = "Bad email address" - return reply - - # send recipient link to aprs.fi map - if content == "mapme": - content = ( - "Click for my location: http://aprs.fi/{}" "" - ).format( - CONF.email_plugin.callsign, - ) - too_soon = 0 - now = time.time() - # see if we sent this msg number recently - if ack in self.email_sent_dict: - # BUG(hemna) - when we get a 2 different email command - # with the same ack #, we don't send it. - timedelta = now - self.email_sent_dict[ack] - if timedelta < 300: # five minutes - too_soon = 1 - if not too_soon or ack == 0: - LOG.info(f"Send email '{content}'") - send_result = send_email(to_addr, content) - reply = packets.NULL_MESSAGE - if send_result != 0: - reply = f"-{to_addr} failed" - else: - # clear email sent dictionary if somehow goes - # over 100 - if len(self.email_sent_dict) > 98: - LOG.debug( - "DEBUG: email_sent_dict is big (" - + str(len(self.email_sent_dict)) - + ") clearing out.", - ) - self.email_sent_dict.clear() - self.email_sent_dict[ack] = now - else: - reply = packets.NULL_MESSAGE - LOG.info( - "Email for message number " - + ack - + " recently sent, not sending again.", - ) - else: - reply = "Bad email address" - - return reply - - -def _imap_connect(): - imap_port = CONF.email_plugin.imap_port - use_ssl = CONF.email_plugin.imap_use_ssl - - try: - server = imapclient.IMAPClient( - CONF.email_plugin.imap_host, - port=imap_port, - use_uid=True, - ssl=use_ssl, - timeout=30, - ) - except Exception: - LOG.exception("Failed to connect IMAP server") - return - - try: - server.login( - CONF.email_plugin.imap_login, - CONF.email_plugin.imap_password, - ) - except (imaplib.IMAP4.error, Exception) as e: - msg = getattr(e, "message", repr(e)) - LOG.error(f"Failed to login {msg}") - return - - server.select_folder("INBOX") - - server.fetch = trace.trace(server.fetch) - server.search = trace.trace(server.search) - server.remove_flags = trace.trace(server.remove_flags) - server.add_flags = trace.trace(server.add_flags) - return server - - -def _smtp_connect(): - host = CONF.email_plugin.smtp_host - smtp_port = CONF.email_plugin.smtp_port - use_ssl = CONF.email_plugin.smtp_use_ssl - msg = "{}{}:{}".format("SSL " if use_ssl else "", host, smtp_port) - LOG.debug( - "Connect to SMTP host {} with user '{}'".format( - msg, - CONF.email_plugin.smtp_login, - ), - ) - - try: - if use_ssl: - server = smtplib.SMTP_SSL( - host=host, - port=smtp_port, - timeout=30, - ) - else: - server = smtplib.SMTP( - host=host, - port=smtp_port, - timeout=30, - ) - except Exception: - LOG.error("Couldn't connect to SMTP Server") - return - - LOG.debug(f"Connected to smtp host {msg}") - - debug = CONF.email_plugin.debug - if debug: - server.set_debuglevel(5) - server.sendmail = trace.trace(server.sendmail) - - try: - server.login( - CONF.email_plugin.smtp_login, - CONF.email_plugin.smtp_password, - ) - except Exception: - LOG.error("Couldn't connect to SMTP Server") - return - - LOG.debug(f"Logged into SMTP server {msg}") - return server - - -def _build_shortcuts_dict(): - global shortcuts_dict - if not shortcuts_dict: - if CONF.email_plugin.email_shortcuts: - shortcuts_dict = {} - tmp = CONF.email_plugin.email_shortcuts - for combo in tmp: - entry = combo.split("=") - shortcuts_dict[entry[0]] = entry[1] - else: - shortcuts_dict = {} - - return shortcuts_dict - - -def get_email_from_shortcut(addr): - if CONF.email_plugin.email_shortcuts: - shortcuts = _build_shortcuts_dict() - LOG.info(f"Shortcut lookup {addr} returns {shortcuts.get(addr, addr)}") - return shortcuts.get(addr, addr) - else: - return addr - - -def validate_email_config(disable_validation=False): - """function to simply ensure we can connect to email services. - - This helps with failing early during startup. - """ - LOG.info("Checking IMAP configuration") - imap_server = _imap_connect() - LOG.info("Checking SMTP configuration") - smtp_server = _smtp_connect() - - if imap_server and smtp_server: - return True - else: - return False - - -@trace.trace -def parse_email(msgid, data, server): - envelope = data[b"ENVELOPE"] - # email address match - # use raw string to avoid invalid escape secquence errors r"string here" - f = re.search(r"([\.\w_-]+@[\.\w_-]+)", str(envelope.from_[0])) - if f is not None: - from_addr = f.group(1) - else: - from_addr = "noaddr" - LOG.debug(f"Got a message from '{from_addr}'") - try: - m = server.fetch([msgid], ["RFC822"]) - except Exception: - LOG.exception("Couldn't fetch email from server in parse_email") - return - - msg = email.message_from_string(m[msgid][b"RFC822"].decode(errors="ignore")) - if msg.is_multipart(): - text = "" - html = None - # default in case body somehow isn't set below - happened once - body = b"* unreadable msg received" - # this uses the last text or html part in the email, - # phone companies often put content in an attachment - for part in msg.get_payload(): - if part.get_content_charset() is None: - # or BREAK when we hit a text or html? - # We cannot know the character set, - # so return decoded "something" - LOG.debug("Email got unknown content type") - text = part.get_payload(decode=True) - continue - - charset = part.get_content_charset() - - if part.get_content_type() == "text/plain": - LOG.debug("Email got text/plain") - text = str( - part.get_payload(decode=True), - str(charset), - "ignore", - ).encode("utf8", "replace") - - if part.get_content_type() == "text/html": - LOG.debug("Email got text/html") - html = str( - part.get_payload(decode=True), - str(charset), - "ignore", - ).encode("utf8", "replace") - - if text is not None: - # strip removes white space fore and aft of string - body = text.strip() - else: - body = html.strip() - else: # message is not multipart - # email.uscc.net sends no charset, blows up unicode function below - LOG.debug("Email is not multipart") - if msg.get_content_charset() is None: - text = str(msg.get_payload(decode=True), "US-ASCII", "ignore").encode( - "utf8", - "replace", - ) - else: - text = str( - msg.get_payload(decode=True), - msg.get_content_charset(), - "ignore", - ).encode("utf8", "replace") - body = text.strip() - - # FIXED: UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 - # in position 6: ordinal not in range(128) - # decode with errors='ignore'. be sure to encode it before we return - # it below, also with errors='ignore' - try: - body = body.decode(errors="ignore") - except Exception: - LOG.exception("Unicode decode failure") - LOG.error(f"Unidoce decode failed: {str(body)}") - body = "Unreadable unicode msg" - # strip all html tags - body = re.sub("<[^<]+?>", "", body) - # strip CR/LF, make it one line, .rstrip fails at this - body = body.replace("\n", " ").replace("\r", " ") - # ascii might be out of range, so encode it, removing any error characters - body = body.encode(errors="ignore") - return body, from_addr - - -# end parse_email - - -@trace.trace -def send_email(to_addr, content): - shortcuts = _build_shortcuts_dict() - email_address = get_email_from_shortcut(to_addr) - LOG.info("Sending Email_________________") - - if to_addr in shortcuts: - LOG.info(f"To : {to_addr}") - to_addr = email_address - LOG.info(f" ({to_addr})") - subject = CONF.email_plugin.callsign - # content = content + "\n\n(NOTE: reply with one line)" - LOG.info(f"Subject : {subject}") - LOG.info(f"Body : {content}") - - # check email more often since there's activity right now - EmailInfo().delay = 60 - - msg = MIMEText(content) - msg["Subject"] = subject - msg["From"] = CONF.email_plugin.smtp_login - msg["To"] = to_addr - server = _smtp_connect() - if server: - try: - server.sendmail( - CONF.email_plugin.smtp_login, - [to_addr], - msg.as_string(), - ) - EmailStats().tx_inc() - except Exception: - LOG.exception("Sendmail Error!!!!") - server.quit() - return -1 - server.quit() - return 0 - - -@trace.trace -def resend_email(count, fromcall): - date = datetime.datetime.now() - month = date.strftime("%B")[:3] # Nov, Mar, Apr - day = date.day - year = date.year - today = f"{day}-{month}-{year}" - - shortcuts = _build_shortcuts_dict() - # swap key/value - shortcuts_inverted = {v: k for k, v in shortcuts.items()} - - try: - server = _imap_connect() - except Exception: - LOG.exception("Failed to Connect to IMAP. Cannot resend email ") - return - - try: - messages = server.search(["SINCE", today]) - except Exception: - LOG.exception("Couldn't search for emails in resend_email ") - return - - # LOG.debug("%d messages received today" % len(messages)) - - msgexists = False - - messages.sort(reverse=True) - del messages[int(count) :] # only the latest "count" messages - for message in messages: - try: - parts = server.fetch(message, ["ENVELOPE"]).items() - except Exception: - LOG.exception("Couldn't fetch email parts in resend_email") - continue - - for msgid, data in list(parts): - # one at a time, otherwise order is random - (body, from_addr) = parse_email(msgid, data, server) - # unset seen flag, will stay bold in email client - try: - server.remove_flags(msgid, [imapclient.SEEN]) - except Exception: - LOG.exception("Failed to remove SEEN flag in resend_email") - - if from_addr in shortcuts_inverted: - # reverse lookup of a shortcut - from_addr = shortcuts_inverted[from_addr] - # asterisk indicates a resend - reply = "-" + from_addr + " * " + body.decode(errors="ignore") - tx.send( - packets.MessagePacket( - from_call=CONF.callsign, - to_call=fromcall, - message_text=reply, - ), - ) - msgexists = True - - if msgexists is not True: - stm = time.localtime() - h = stm.tm_hour - m = stm.tm_min - s = stm.tm_sec - # append time as a kind of serial number to prevent FT1XDR from - # thinking this is a duplicate message. - # The FT1XDR pretty much ignores the aprs message number in this - # regard. The FTM400 gets it right. - reply = "No new msg {}:{}:{}".format( - str(h).zfill(2), - str(m).zfill(2), - str(s).zfill(2), - ) - tx.send( - packets.MessagePacket( - from_call=CONF.callsign, - to_call=fromcall, - message_text=reply, - ), - ) - - # check email more often since we're resending one now - EmailInfo().delay = 60 - - server.logout() - # end resend_email() - - -class APRSDEmailThread(threads.APRSDThread): - def __init__(self): - super().__init__("EmailThread") - self.past = datetime.datetime.now() - - def loop(self): - time.sleep(5) - EmailStats().email_thread_update() - # always sleep for 5 seconds and see if we need to check email - # This allows CTRL-C to stop the execution of this loop sooner - # than check_email_delay time - now = datetime.datetime.now() - if now - self.past > datetime.timedelta(seconds=EmailInfo().delay): - # It's time to check email - - # slowly increase delay every iteration, max out at 300 seconds - # any send/receive/resend activity will reset this to 60 seconds - if EmailInfo().delay < 300: - EmailInfo().delay += 10 - LOG.debug( - f"check_email_delay is {EmailInfo().delay} seconds ", - ) - - shortcuts = _build_shortcuts_dict() - # swap key/value - shortcuts_inverted = {v: k for k, v in shortcuts.items()} - - date = datetime.datetime.now() - month = date.strftime("%B")[:3] # Nov, Mar, Apr - day = date.day - year = date.year - today = f"{day}-{month}-{year}" - - try: - server = _imap_connect() - except Exception: - LOG.exception("IMAP Failed to connect") - return True - - try: - messages = server.search(["SINCE", today]) - except Exception: - LOG.exception("IMAP failed to search for messages since today.") - return True - LOG.debug(f"{len(messages)} messages received today") - - try: - _msgs = server.fetch(messages, ["ENVELOPE"]) - except Exception: - LOG.exception("IMAP failed to fetch/flag messages: ") - return True - - for msgid, data in _msgs.items(): - envelope = data[b"ENVELOPE"] - LOG.debug( - 'ID:%d "%s" (%s)' - % (msgid, envelope.subject.decode(), envelope.date), - ) - f = re.search( - r"'([[A-a][0-9]_-]+@[[A-a][0-9]_-\.]+)", - str(envelope.from_[0]), - ) - if f is not None: - from_addr = f.group(1) - else: - from_addr = "noaddr" - - # LOG.debug("Message flags/tags: " + - # str(server.get_flags(msgid)[msgid])) - # if "APRS" not in server.get_flags(msgid)[msgid]: - # in python3, imap tags are unicode. in py2 they're strings. - # so .decode them to handle both - try: - taglist = [ - x.decode(errors="ignore") - for x in server.get_flags(msgid)[msgid] - ] - except Exception: - LOG.error("Failed to get flags.") - break - - if "APRS" not in taglist: - # if msg not flagged as sent via aprs - try: - server.fetch([msgid], ["RFC822"]) - except Exception: - LOG.exception("Failed single server fetch for RFC822") - break - - (body, from_addr) = parse_email(msgid, data, server) - # unset seen flag, will stay bold in email client - try: - server.remove_flags(msgid, [imapclient.SEEN]) - except Exception: - LOG.exception("Failed to remove flags SEEN") - # Not much we can do here, so lets try and - # send the aprs message anyway - - if from_addr in shortcuts_inverted: - # reverse lookup of a shortcut - from_addr = shortcuts_inverted[from_addr] - - reply = "-" + from_addr + " " + body.decode(errors="ignore") - # Send the message to the registered user in the - # config ham.callsign - tx.send( - packets.MessagePacket( - from_call=CONF.callsign, - to_call=CONF.email_plugin.callsign, - message_text=reply, - ), - ) - # flag message as sent via aprs - try: - server.add_flags(msgid, ["APRS"]) - # unset seen flag, will stay bold in email client - except Exception: - LOG.exception("Couldn't add APRS flag to email") - - try: - server.remove_flags(msgid, [imapclient.SEEN]) - except Exception: - LOG.exception("Couldn't remove seen flag from email") - - # check email more often since we just received an email - EmailInfo().delay = 60 - - # reset clock - LOG.debug("Done looping over Server.fetch, log out.") - self.past = datetime.datetime.now() - try: - server.logout() - except Exception: - LOG.exception("IMAP failed to logout: ") - return True - else: - # We haven't hit the email delay yet. - # LOG.debug("Delta({}) < {}".format(now - past, check_email_delay)) - return True - - return True diff --git a/requirements.in b/requirements.in index 520ccc9..d4fb12a 100644 --- a/requirements.in +++ b/requirements.in @@ -4,7 +4,6 @@ beautifulsoup4 click dataclasses-json geopy -imapclient kiss3 loguru oslo.config diff --git a/requirements.txt b/requirements.txt index 87051ce..e744506 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,7 +18,6 @@ debtcollector==3.0.0 # via oslo-config geographiclib==2.0 # via geopy geopy==2.4.1 # via -r requirements.in idna==3.10 # via requests -imapclient==3.0.1 # via -r requirements.in importlib-metadata==8.5.0 # via ax253, kiss3 kiss3==8.0.0 # via -r requirements.in loguru==0.7.3 # via -r requirements.in diff --git a/tests/test_email.py b/tests/test_email.py deleted file mode 100644 index 9a752b2..0000000 --- a/tests/test_email.py +++ /dev/null @@ -1,32 +0,0 @@ -import unittest - -from oslo_config import cfg - -from aprsd import conf # noqa: F401 -from aprsd.plugins import email - - -CONF = cfg.CONF - - -class TestEmail(unittest.TestCase): - def test_get_email_from_shortcut(self): - CONF.email_plugin.shortcuts = None - email_address = "something@something.com" - addr = f"-{email_address}" - actual = email.get_email_from_shortcut(addr) - self.assertEqual(addr, actual) - - CONF.email_plugin.shortcuts = None - actual = email.get_email_from_shortcut(addr) - self.assertEqual(addr, actual) - - CONF.email_plugin.shortcuts = None - actual = email.get_email_from_shortcut(addr) - self.assertEqual(addr, actual) - - CONF.email_plugin.email_shortcuts = ["wb=something@something.com"] - email.shortcuts_dict = None - short = "wb" - actual = email.get_email_from_shortcut(short) - self.assertEqual(email_address, actual) diff --git a/tests/test_main.py b/tests/test_main.py deleted file mode 100644 index 276a42c..0000000 --- a/tests/test_main.py +++ /dev/null @@ -1,16 +0,0 @@ -import unittest -from unittest import mock - -from aprsd.plugins import email - - -class TestMain(unittest.TestCase): - @mock.patch("aprsd.plugins.email._imap_connect") - @mock.patch("aprsd.plugins.email._smtp_connect") - def test_validate_email(self, imap_mock, smtp_mock): - """Test to make sure we fail.""" - imap_mock.return_value = None - smtp_mock.return_value = {"smaiof": "fire"} - mock.MagicMock() - - email.validate_email_config(True) From ae28dbb0e6bc216bf78c0bd9d7804f57b39091d1 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 10 Dec 2024 11:46:40 -0500 Subject: [PATCH 04/40] Fixed make clean Just changed the order of things to clean up. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0f9cdb2..d286605 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ docs: changelog mv ChangeLog.rst docs/changelog.rst tox -edocs -clean: clean-build clean-pyc clean-test clean-dev ## remove all build, test, coverage and Python artifacts +clean: clean-dev clean-test clean-build clean-pyc ## remove all build, test, coverage and Python artifacts clean-build: ## remove build artifacts rm -fr build/ From fcd1629fdebb485fc763e19d73bfdafc10de6251 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 10 Dec 2024 11:48:27 -0500 Subject: [PATCH 05/40] removed email reference From the list-plugins command --- aprsd/cmds/list_plugins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aprsd/cmds/list_plugins.py b/aprsd/cmds/list_plugins.py index 5ff3f4d..7022933 100644 --- a/aprsd/cmds/list_plugins.py +++ b/aprsd/cmds/list_plugins.py @@ -21,7 +21,7 @@ from aprsd import cli_helper from aprsd import plugin as aprsd_plugin from aprsd.main import cli from aprsd.plugins import ( - email, fortune, location, notify, ping, time, version, weather, + fortune, location, notify, ping, time, version, weather, ) From f0c02606ebfc5170b80b55c73de191d27a8778a0 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 10 Dec 2024 16:55:05 -0500 Subject: [PATCH 06/40] Removed more email references. --- aprsd/cmds/list_plugins.py | 2 +- aprsd/log/log.py | 30 +++--------------------------- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/aprsd/cmds/list_plugins.py b/aprsd/cmds/list_plugins.py index 7022933..617671e 100644 --- a/aprsd/cmds/list_plugins.py +++ b/aprsd/cmds/list_plugins.py @@ -122,7 +122,7 @@ def get_installed_extensions(): def show_built_in_plugins(console): - modules = [email, fortune, location, notify, ping, time, version, weather] + modules = [fortune, location, notify, ping, time, version, weather] plugins = [] for module in modules: diff --git a/aprsd/log/log.py b/aprsd/log/log.py index 8204106..c751d63 100644 --- a/aprsd/log/log.py +++ b/aprsd/log/log.py @@ -59,27 +59,18 @@ def setup_logging(loglevel=None, quiet=False): logging.root.handlers = [InterceptHandler()] logging.root.setLevel(log_level) - imap_list = [ - "imapclient.imaplib", "imaplib", "imapclient", - "imapclient.util", - ] - aprslib_list = [ + # We don't really want to see the aprslib parsing debug output. + disable_list = [ "aprslib", "aprslib.parsing", "aprslib.exceptions", ] - # We don't really want to see the aprslib parsing debug output. - disable_list = imap_list + aprslib_list - # remove every other logger's handlers # and propagate to root logger for name in logging.root.manager.loggerDict.keys(): logging.getLogger(name).handlers = [] - if name in disable_list: - logging.getLogger(name).propagate = False - else: - logging.getLogger(name).propagate = True + logging.getLogger(name).propagate = name not in disable_list handlers = [ { @@ -101,21 +92,6 @@ def setup_logging(loglevel=None, quiet=False): }, ) - if CONF.email_plugin.enabled and CONF.email_plugin.debug: - for name in imap_list: - logging.getLogger(name).propagate = True - - # if CONF.admin.web_enabled: - # qh = QueueHandler(logging_queue) - # handlers.append( - # { - # "sink": qh, "serialize": False, - # "format": CONF.logging.logformat, - # "level": log_level, - # "colorize": False, - # }, - # ) - # configure loguru logger.configure(handlers=handlers) logger.level("DEBUG", color="") From 3bba8a19da88b0912064cea786bc9f8203038946 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 10 Dec 2024 17:30:17 -0500 Subject: [PATCH 07/40] Removed LocationPlugin from aprsd core This eliminates the requirement for geopy library and all it's deps. The new location for the LocationPlugin is here: https://github.com/hemna/aprsd-location-plugin --- aprsd/cmds/list_plugins.py | 6 +- aprsd/conf/plugin_common.py | 108 -------------------- aprsd/plugins/location.py | 181 --------------------------------- requirements.in | 1 - requirements.txt | 2 - tests/plugins/test_location.py | 109 -------------------- 6 files changed, 2 insertions(+), 405 deletions(-) delete mode 100644 aprsd/plugins/location.py delete mode 100644 tests/plugins/test_location.py diff --git a/aprsd/cmds/list_plugins.py b/aprsd/cmds/list_plugins.py index 617671e..46a7b9c 100644 --- a/aprsd/cmds/list_plugins.py +++ b/aprsd/cmds/list_plugins.py @@ -20,9 +20,7 @@ from thesmuggler import smuggle from aprsd import cli_helper from aprsd import plugin as aprsd_plugin from aprsd.main import cli -from aprsd.plugins import ( - fortune, location, notify, ping, time, version, weather, -) +from aprsd.plugins import fortune, notify, ping, time, version, weather LOG = logging.getLogger("APRSD") @@ -122,7 +120,7 @@ def get_installed_extensions(): def show_built_in_plugins(console): - modules = [fortune, location, notify, ping, time, version, weather] + modules = [fortune, notify, ping, time, version, weather] plugins = [] for module in modules: diff --git a/aprsd/conf/plugin_common.py b/aprsd/conf/plugin_common.py index b1d96e3..7101b82 100644 --- a/aprsd/conf/plugin_common.py +++ b/aprsd/conf/plugin_common.py @@ -18,11 +18,6 @@ owm_wx_group = cfg.OptGroup( title="Options for the OWMWeatherPlugin", ) -location_group = cfg.OptGroup( - name="location_plugin", - title="Options for the LocationPlugin", -) - aprsfi_opts = [ cfg.StrOpt( "apiKey", @@ -60,106 +55,6 @@ avwx_opts = [ ), ] -location_opts = [ - cfg.StrOpt( - "geopy_geocoder", - choices=[ - "ArcGIS", "AzureMaps", "Baidu", "Bing", "GoogleV3", "HERE", - "Nominatim", "OpenCage", "TomTom", "USGov", "What3Words", "Woosmap", - ], - default="Nominatim", - help="The geopy geocoder to use. Default is Nominatim." - "See https://geopy.readthedocs.io/en/stable/#module-geopy.geocoders" - "for more information.", - ), - cfg.StrOpt( - "user_agent", - default="APRSD", - help="The user agent to use for the Nominatim geocoder." - "See https://geopy.readthedocs.io/en/stable/#module-geopy.geocoders" - "for more information.", - ), - cfg.StrOpt( - "arcgis_username", - default=None, - help="The username to use for the ArcGIS geocoder." - "See https://geopy.readthedocs.io/en/latest/#arcgis" - "for more information." - "Only used for the ArcGIS geocoder.", - ), - cfg.StrOpt( - "arcgis_password", - default=None, - help="The password to use for the ArcGIS geocoder." - "See https://geopy.readthedocs.io/en/latest/#arcgis" - "for more information." - "Only used for the ArcGIS geocoder.", - ), - cfg.StrOpt( - "azuremaps_subscription_key", - help="The subscription key to use for the AzureMaps geocoder." - "See https://geopy.readthedocs.io/en/latest/#azuremaps" - "for more information." - "Only used for the AzureMaps geocoder.", - ), - cfg.StrOpt( - "baidu_api_key", - help="The API key to use for the Baidu geocoder." - "See https://geopy.readthedocs.io/en/latest/#baidu" - "for more information." - "Only used for the Baidu geocoder.", - ), - cfg.StrOpt( - "bing_api_key", - help="The API key to use for the Bing geocoder." - "See https://geopy.readthedocs.io/en/latest/#bing" - "for more information." - "Only used for the Bing geocoder.", - ), - cfg.StrOpt( - "google_api_key", - help="The API key to use for the Google geocoder." - "See https://geopy.readthedocs.io/en/latest/#googlev3" - "for more information." - "Only used for the Google geocoder.", - ), - cfg.StrOpt( - "here_api_key", - help="The API key to use for the HERE geocoder." - "See https://geopy.readthedocs.io/en/latest/#here" - "for more information." - "Only used for the HERE geocoder.", - ), - cfg.StrOpt( - "opencage_api_key", - help="The API key to use for the OpenCage geocoder." - "See https://geopy.readthedocs.io/en/latest/#opencage" - "for more information." - "Only used for the OpenCage geocoder.", - ), - cfg.StrOpt( - "tomtom_api_key", - help="The API key to use for the TomTom geocoder." - "See https://geopy.readthedocs.io/en/latest/#tomtom" - "for more information." - "Only used for the TomTom geocoder.", - ), - cfg.StrOpt( - "what3words_api_key", - help="The API key to use for the What3Words geocoder." - "See https://geopy.readthedocs.io/en/latest/#what3words" - "for more information." - "Only used for the What3Words geocoder.", - ), - cfg.StrOpt( - "woosmap_api_key", - help="The API key to use for the Woosmap geocoder." - "See https://geopy.readthedocs.io/en/latest/#woosmap" - "for more information." - "Only used for the Woosmap geocoder.", - ), -] - def register_opts(config): config.register_group(aprsfi_group) @@ -169,8 +64,6 @@ def register_opts(config): config.register_opts(owm_wx_opts, group=owm_wx_group) config.register_group(avwx_group) config.register_opts(avwx_opts, group=avwx_group) - config.register_group(location_group) - config.register_opts(location_opts, group=location_group) def list_opts(): @@ -178,5 +71,4 @@ def list_opts(): aprsfi_group.name: aprsfi_opts, owm_wx_group.name: owm_wx_opts, avwx_group.name: avwx_opts, - location_group.name: location_opts, } diff --git a/aprsd/plugins/location.py b/aprsd/plugins/location.py deleted file mode 100644 index 879f12b..0000000 --- a/aprsd/plugins/location.py +++ /dev/null @@ -1,181 +0,0 @@ -import logging -import re -import time - -from geopy.geocoders import ( - ArcGIS, AzureMaps, Baidu, Bing, GoogleV3, HereV7, Nominatim, OpenCage, - TomTom, What3WordsV3, Woosmap, -) -from oslo_config import cfg - -from aprsd import packets, plugin, plugin_utils -from aprsd.utils import trace - - -CONF = cfg.CONF -LOG = logging.getLogger("APRSD") - - -class UsLocation: - raw = {} - - def __init__(self, info): - self.info = info - - def __str__(self): - return self.info - - -class USGov: - """US Government geocoder that uses the geopy API. - - This is a dummy class the implements the geopy reverse API, - so the factory can return an object that conforms to the API. - """ - def reverse(self, coordinates): - """Reverse geocode a coordinate.""" - LOG.info(f"USGov reverse geocode {coordinates}") - coords = coordinates.split(",") - lat = float(coords[0]) - lon = float(coords[1]) - result = plugin_utils.get_weather_gov_for_gps(lat, lon) - # LOG.info(f"WEATHER: {result}") - # LOG.info(f"area description {result['location']['areaDescription']}") - if "location" in result: - loc = UsLocation(result["location"]["areaDescription"]) - else: - loc = UsLocation("Unknown Location") - - LOG.info(f"USGov reverse geocode LOC {loc}") - return loc - - -def geopy_factory(): - """Factory function for geopy geocoders.""" - geocoder = CONF.location_plugin.geopy_geocoder - LOG.info(f"Using geocoder: {geocoder}") - user_agent = CONF.location_plugin.user_agent - LOG.info(f"Using user_agent: {user_agent}") - - if geocoder == "Nominatim": - return Nominatim(user_agent=user_agent) - elif geocoder == "USGov": - return USGov() - elif geocoder == "ArcGIS": - return ArcGIS( - username=CONF.location_plugin.arcgis_username, - password=CONF.location_plugin.arcgis_password, - user_agent=user_agent, - ) - elif geocoder == "AzureMaps": - return AzureMaps( - user_agent=user_agent, - subscription_key=CONF.location_plugin.azuremaps_subscription_key, - ) - elif geocoder == "Baidu": - return Baidu(user_agent=user_agent, api_key=CONF.location_plugin.baidu_api_key) - elif geocoder == "Bing": - return Bing(user_agent=user_agent, api_key=CONF.location_plugin.bing_api_key) - elif geocoder == "GoogleV3": - return GoogleV3(user_agent=user_agent, api_key=CONF.location_plugin.google_api_key) - elif geocoder == "HERE": - return HereV7(user_agent=user_agent, api_key=CONF.location_plugin.here_api_key) - elif geocoder == "OpenCage": - return OpenCage(user_agent=user_agent, api_key=CONF.location_plugin.opencage_api_key) - elif geocoder == "TomTom": - return TomTom(user_agent=user_agent, api_key=CONF.location_plugin.tomtom_api_key) - elif geocoder == "What3Words": - return What3WordsV3(user_agent=user_agent, api_key=CONF.location_plugin.what3words_api_key) - elif geocoder == "Woosmap": - return Woosmap(user_agent=user_agent, api_key=CONF.location_plugin.woosmap_api_key) - else: - raise ValueError(f"Unknown geocoder: {geocoder}") - - -class LocationPlugin(plugin.APRSDRegexCommandPluginBase, plugin.APRSFIKEYMixin): - """Location!""" - - command_regex = r"^([l]|[l]\s|location)" - command_name = "location" - short_description = "Where in the world is a CALLSIGN's last GPS beacon?" - - def setup(self): - self.ensure_aprs_fi_key() - - @trace.trace - def process(self, packet: packets.MessagePacket): - LOG.info("Location Plugin") - fromcall = packet.from_call - message = packet.get("message_text", None) - - api_key = CONF.aprs_fi.apiKey - - # optional second argument is a callsign to search - a = re.search(r"^.*\s+(.*)", message) - if a is not None: - searchcall = a.group(1) - searchcall = searchcall.upper() - else: - # if no second argument, search for calling station - searchcall = fromcall - - try: - aprs_data = plugin_utils.get_aprs_fi(api_key, searchcall) - except Exception as ex: - LOG.error(f"Failed to fetch aprs.fi '{ex}'") - return "Failed to fetch aprs.fi location" - - LOG.debug(f"LocationPlugin: aprs_data = {aprs_data}") - if not len(aprs_data["entries"]): - LOG.error("Didn't get any entries from aprs.fi") - return "Failed to fetch aprs.fi location" - - lat = float(aprs_data["entries"][0]["lat"]) - lon = float(aprs_data["entries"][0]["lng"]) - - # Get some information about their location - try: - tic = time.perf_counter() - geolocator = geopy_factory() - LOG.info(f"Using GEOLOCATOR: {geolocator}") - coordinates = f"{lat:0.6f}, {lon:0.6f}" - location = geolocator.reverse(coordinates) - address = location.raw.get("address") - LOG.debug(f"GEOLOCATOR address: {address}") - toc = time.perf_counter() - if address: - LOG.info(f"Geopy address {address} took {toc - tic:0.4f}") - if address.get("country_code") == "us": - area_info = f"{address.get('county')}, {address.get('state')}" - else: - # what to do for address for non US? - area_info = f"{address.get('country'), 'Unknown'}" - else: - area_info = str(location) - except Exception as ex: - LOG.error(ex) - LOG.error(f"Failed to fetch Geopy address {ex}") - area_info = "Unknown Location" - - try: # altitude not always provided - alt = float(aprs_data["entries"][0]["altitude"]) - except Exception: - alt = 0 - altfeet = int(alt * 3.28084) - aprs_lasttime_seconds = aprs_data["entries"][0]["lasttime"] - # aprs_lasttime_seconds = aprs_lasttime_seconds.encode( - # "ascii", errors="ignore" - # ) # unicode to ascii - delta_seconds = time.time() - int(aprs_lasttime_seconds) - delta_hours = delta_seconds / 60 / 60 - - reply = "{}: {} {}' {},{} {}h ago".format( - searchcall, - area_info, - str(altfeet), - f"{lat:0.2f}", - f"{lon:0.2f}", - str("%.1f" % round(delta_hours, 1)), - ).rstrip() - - return reply diff --git a/requirements.in b/requirements.in index d4fb12a..55694eb 100644 --- a/requirements.in +++ b/requirements.in @@ -3,7 +3,6 @@ aprslib>=0.7.0 beautifulsoup4 click dataclasses-json -geopy kiss3 loguru oslo.config diff --git a/requirements.txt b/requirements.txt index e744506..1e7fae0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,8 +15,6 @@ click==8.1.7 # via -r requirements.in commonmark==0.9.1 # via rich dataclasses-json==0.6.7 # via -r requirements.in debtcollector==3.0.0 # via oslo-config -geographiclib==2.0 # via geopy -geopy==2.4.1 # via -r requirements.in idna==3.10 # via requests importlib-metadata==8.5.0 # via ax253, kiss3 kiss3==8.0.0 # via -r requirements.in diff --git a/tests/plugins/test_location.py b/tests/plugins/test_location.py deleted file mode 100644 index 6c60998..0000000 --- a/tests/plugins/test_location.py +++ /dev/null @@ -1,109 +0,0 @@ -from unittest import mock - -from oslo_config import cfg - -from aprsd import conf # noqa: F401 -from aprsd.plugins import location as location_plugin - -from .. import fake, test_plugin - - -CONF = cfg.CONF - - -class TestLocationPlugin(test_plugin.TestPlugin): - - def test_location_not_enabled_missing_aprs_fi_key(self): - # When the aprs.fi api key isn't set, then - # the LocationPlugin will be disabled. - CONF.callsign = fake.FAKE_TO_CALLSIGN - CONF.aprs_fi.apiKey = None - fortune = location_plugin.LocationPlugin() - expected = "LocationPlugin isn't enabled" - packet = fake.fake_packet(message="location") - actual = fortune.filter(packet) - self.assertEqual(expected, actual) - - @mock.patch("aprsd.plugin_utils.get_aprs_fi") - def test_location_failed_aprs_fi_location(self, mock_check): - # When the aprs.fi api key isn't set, then - # the LocationPlugin will be disabled. - mock_check.side_effect = Exception - CONF.callsign = fake.FAKE_TO_CALLSIGN - fortune = location_plugin.LocationPlugin() - expected = "Failed to fetch aprs.fi location" - packet = fake.fake_packet(message="location") - actual = fortune.filter(packet) - self.assertEqual(expected, actual) - - @mock.patch("aprsd.plugin_utils.get_aprs_fi") - def test_location_failed_aprs_fi_location_no_entries(self, mock_check): - # When the aprs.fi api key isn't set, then - # the LocationPlugin will be disabled. - mock_check.return_value = {"entries": []} - CONF.callsign = fake.FAKE_TO_CALLSIGN - fortune = location_plugin.LocationPlugin() - expected = "Failed to fetch aprs.fi location" - packet = fake.fake_packet(message="location") - actual = fortune.filter(packet) - self.assertEqual(expected, actual) - - @mock.patch("aprsd.plugin_utils.get_aprs_fi") - @mock.patch("geopy.geocoders.Nominatim.reverse") - @mock.patch("time.time") - def test_location_unknown_gps(self, mock_time, mock_geocode, mock_check_aprs): - # When the aprs.fi api key isn't set, then - # the LocationPlugin will be disabled. - mock_check_aprs.return_value = { - "entries": [ - { - "lat": 1, - "lng": 1, - "lasttime": 10, - }, - ], - } - mock_geocode.side_effect = Exception - mock_time.return_value = 10 - CONF.callsign = fake.FAKE_TO_CALLSIGN - fortune = location_plugin.LocationPlugin() - expected = "KFAKE: Unknown Location 0' 1.00,1.00 0.0h ago" - packet = fake.fake_packet(message="location") - actual = fortune.filter(packet) - self.assertEqual(expected, actual) - - @mock.patch("aprsd.plugin_utils.get_aprs_fi") - @mock.patch("geopy.geocoders.Nominatim.reverse") - @mock.patch("time.time") - def test_location_works(self, mock_time, mock_geocode, mock_check_aprs): - # When the aprs.fi api key isn't set, then - # the LocationPlugin will be disabled. - mock_check_aprs.return_value = { - "entries": [ - { - "lat": 1, - "lng": 1, - "lasttime": 10, - }, - ], - } - expected = "Appomattox" - state = "VA" - - class TempLocation: - raw = { - "address": { - "county": expected, - "country_code": "us", - "state": state, - "country": "United States", - }, - } - mock_geocode.return_value = TempLocation() - mock_time.return_value = 10 - CONF.callsign = fake.FAKE_TO_CALLSIGN - fortune = location_plugin.LocationPlugin() - expected = f"KFAKE: {expected}, {state} 0' 1.00,1.00 0.0h ago" - packet = fake.fake_packet(message="location") - actual = fortune.filter(packet) - self.assertEqual(expected, actual) From bbdbb9aba189d536497ea3cd7d30911fe3d9d706 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 10 Dec 2024 17:59:11 -0500 Subject: [PATCH 08/40] Include haversine library This patch changes the geopy to haversine library for logging packet distances. haversine is quite a bit lighter than geopy. --- aprsd/packets/core.py | 3 +-- aprsd/packets/log.py | 8 ++++---- requirements.in | 1 + requirements.txt | 1 + 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/aprsd/packets/core.py b/aprsd/packets/core.py index 195ed31..361646e 100644 --- a/aprsd/packets/core.py +++ b/aprsd/packets/core.py @@ -12,7 +12,7 @@ from dataclasses_json import ( ) from loguru import logger -from aprsd.utils import counter, trace +from aprsd.utils import counter # For mypy to be happy @@ -129,7 +129,6 @@ class Packet: msg = self._filter_for_send(self.raw).rstrip("\n") return msg - @trace.trace def prepare(self, create_msg_number=False) -> None: """Do stuff here that is needed prior to sending over the air.""" # now build the raw message for sending diff --git a/aprsd/packets/log.py b/aprsd/packets/log.py index 3c2d522..621fa15 100644 --- a/aprsd/packets/log.py +++ b/aprsd/packets/log.py @@ -1,7 +1,7 @@ import logging from typing import Optional -from geopy.distance import geodesic +from haversine import Unit, haversine from loguru import logger from oslo_config import cfg @@ -145,8 +145,8 @@ def log(packet, tx: Optional[bool] = False, header: Optional[bool] = True) -> No # is there distance information? if isinstance(packet, GPSPacket) and CONF.latitude and CONF.longitude: - my_coords = (CONF.latitude, CONF.longitude) - packet_coords = (packet.latitude, packet.longitude) + my_coords = (float(CONF.latitude), float(CONF.longitude)) + packet_coords = (float(packet.latitude), float(packet.longitude)) try: bearing = utils.calculate_initial_compass_bearing(my_coords, packet_coords) except Exception as e: @@ -154,7 +154,7 @@ def log(packet, tx: Optional[bool] = False, header: Optional[bool] = True) -> No bearing = 0 logit.append( f" : <{DEGREES_COLOR}>{utils.degrees_to_cardinal(bearing, full_string=True)}" - f"<{DISTANCE_COLOR}>@{geodesic(my_coords, packet_coords).miles:.2f}miles", + f"<{DISTANCE_COLOR}>@{haversine(my_coords, packet_coords, unit=Unit.MILES):.2f}miles", ) LOGU.opt(colors=True).info(" ".join(logit)) diff --git a/requirements.in b/requirements.in index 55694eb..ca989ed 100644 --- a/requirements.in +++ b/requirements.in @@ -3,6 +3,7 @@ aprslib>=0.7.0 beautifulsoup4 click dataclasses-json +haversine kiss3 loguru oslo.config diff --git a/requirements.txt b/requirements.txt index 1e7fae0..35ac177 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,6 +15,7 @@ click==8.1.7 # via -r requirements.in commonmark==0.9.1 # via rich dataclasses-json==0.6.7 # via -r requirements.in debtcollector==3.0.0 # via oslo-config +haversine==2.9.0 # via -r requirements.in idna==3.10 # via requests importlib-metadata==8.5.0 # via ax253, kiss3 kiss3==8.0.0 # via -r requirements.in From 30d1eb57dd249c609f5b092d8084c40cadda7bd9 Mon Sep 17 00:00:00 2001 From: Hemna Date: Wed, 18 Dec 2024 16:55:26 -0500 Subject: [PATCH 09/40] Added new KeepAliveCollector This new collector allows external extensions and plugins to get callbacks during the keepalive thread runs. Every 60 seconds the keepalive thread will do some checks and log some entries in the logfile to keep the user/admin aware of the state of aprsd itself. --- aprsd/client/aprsis.py | 25 +++++++-- aprsd/client/base.py | 12 +++++ aprsd/client/kiss.py | 17 ++++++ aprsd/cmds/listen.py | 6 +-- aprsd/cmds/server.py | 4 +- aprsd/threads/{keep_alive.py => keepalive.py} | 50 +++-------------- aprsd/threads/keepalive_collector.py | 54 +++++++++++++++++++ 7 files changed, 116 insertions(+), 52 deletions(-) rename aprsd/threads/{keep_alive.py => keepalive.py} (61%) create mode 100644 aprsd/threads/keepalive_collector.py diff --git a/aprsd/client/aprsis.py b/aprsd/client/aprsis.py index d6ad9ec..9773f7f 100644 --- a/aprsd/client/aprsis.py +++ b/aprsd/client/aprsis.py @@ -3,7 +3,9 @@ import logging import time from aprslib.exceptions import LoginError +from loguru import logger from oslo_config import cfg +import timeago from aprsd import client, exception from aprsd.client import base @@ -13,11 +15,13 @@ from aprsd.packets import core CONF = cfg.CONF LOG = logging.getLogger("APRSD") +LOGU = logger class APRSISClient(base.APRSClient): _client = None + _checks = False def __init__(self): max_timeout = {"hours": 0.0, "minutes": 2, "seconds": 0} @@ -45,6 +49,20 @@ class APRSISClient(base.APRSClient): return stats + def keepalive_check(self): + # Don't check the first time through. + if not self.is_alive() and self._checks: + LOG.warning("Resetting client. It's not alive.") + self.reset() + self._checks = True + + def keepalive_log(self): + if ka := self._client.aprsd_keepalive: + keepalive = timeago.format(ka) + else: + keepalive = "N/A" + LOGU.opt(colors=True).info(f"Client keepalive {keepalive}") + @staticmethod def is_enabled(): # Defaults to True if the enabled flag is non existent @@ -81,14 +99,13 @@ class APRSISClient(base.APRSClient): if delta > self.max_delta: LOG.error(f"Connection is stale, last heard {delta} ago.") return True + return False def is_alive(self): - if self._client: - return self._client.is_alive() and not self._is_stale_connection() - else: + if not self._client: LOG.warning(f"APRS_CLIENT {self._client} alive? NO!!!") return False - + return self._client.is_alive() and not self._is_stale_connection() def close(self): if self._client: self._client.stop() diff --git a/aprsd/client/base.py b/aprsd/client/base.py index 8470546..c0bfbe8 100644 --- a/aprsd/client/base.py +++ b/aprsd/client/base.py @@ -6,6 +6,7 @@ from oslo_config import cfg import wrapt from aprsd.packets import core +from aprsd.threads import keepalive_collector CONF = cfg.CONF @@ -30,6 +31,7 @@ class APRSClient: """This magic turns this into a singleton.""" if cls._instance is None: cls._instance = super().__new__(cls) + keepalive_collector.KeepAliveCollector().register(cls) # Put any initialization here. cls._instance._create_client() return cls._instance @@ -42,6 +44,16 @@ class APRSClient: dict: Statistics about the connection and packet handling """ + @abc.abstractmethod + def keepalive_check(self) -> None: + """Called during keepalive run to check status.""" + ... + + @abc.abstractmethod + def keepalive_log(self) -> None: + """Log any keepalive information.""" + ... + @property def is_connected(self): return self.connected diff --git a/aprsd/client/kiss.py b/aprsd/client/kiss.py index d413aa1..eaa546e 100644 --- a/aprsd/client/kiss.py +++ b/aprsd/client/kiss.py @@ -2,7 +2,9 @@ import datetime import logging import aprslib +from loguru import logger from oslo_config import cfg +import timeago from aprsd import client, exception from aprsd.client import base @@ -12,6 +14,7 @@ from aprsd.packets import core CONF = cfg.CONF LOG = logging.getLogger("APRSD") +LOGU = logger class KISSClient(base.APRSClient): @@ -79,6 +82,20 @@ class KISSClient(base.APRSClient): if self._client: self._client.stop() + def keepalive_check(self): + # Don't check the first time through. + if not self.is_alive() and self._checks: + LOG.warning("Resetting client. It's not alive.") + self.reset() + self._checks = True + + def keepalive_log(self): + if ka := self._client.aprsd_keepalive: + keepalive = timeago.format(ka) + else: + keepalive = "N/A" + LOGU.opt(colors=True).info(f"Client keepalive {keepalive}") + @staticmethod def transport(): if CONF.kiss_serial.enabled: diff --git a/aprsd/cmds/listen.py b/aprsd/cmds/listen.py index fc18e64..17f49e4 100644 --- a/aprsd/cmds/listen.py +++ b/aprsd/cmds/listen.py @@ -23,7 +23,7 @@ from aprsd.packets import collector as packet_collector from aprsd.packets import log as packet_log from aprsd.packets import seen_list from aprsd.stats import collector -from aprsd.threads import keep_alive, rx +from aprsd.threads import keepalive, rx from aprsd.threads import stats as stats_thread from aprsd.threads.aprsd import APRSDThread @@ -126,7 +126,7 @@ class ListenStatsThread(APRSDThread): thread_hex = f"fg {utils.hex_from_name(k)}" LOGU.opt(colors=True).info( f"<{thread_hex}>{k:<15} " - f"RX: {v['rx']} TX: {v['tx']}", + f"RX: {v["rx"]} TX: {v["tx"]}", ) time.sleep(1) @@ -265,7 +265,7 @@ def listen( LOG.debug(f"Filter by '{filter}'") aprs_client.set_filter(filter) - keepalive = keep_alive.KeepAliveThread() + keepalive = keepalive.KeepAliveThread() if not CONF.enable_seen_list: # just deregister the class from the packet collector diff --git a/aprsd/cmds/server.py b/aprsd/cmds/server.py index 0732a8d..fc0bce9 100644 --- a/aprsd/cmds/server.py +++ b/aprsd/cmds/server.py @@ -14,7 +14,7 @@ from aprsd.main import cli from aprsd.packets import collector as packet_collector from aprsd.packets import seen_list from aprsd.threads import aprsd as aprsd_threads -from aprsd.threads import keep_alive, registry, rx +from aprsd.threads import keepalive, registry, rx from aprsd.threads import stats as stats_thread from aprsd.threads import tx from aprsd.utils import singleton @@ -146,7 +146,7 @@ def server(ctx, flush): # Now start all the main processing threads. - server_threads.register(keep_alive.KeepAliveThread()) + server_threads.register(keepalive.KeepAliveThread()) server_threads.register(stats_thread.APRSDStatsStoreThread()) server_threads.register( rx.APRSDPluginRXThread( diff --git a/aprsd/threads/keep_alive.py b/aprsd/threads/keepalive.py similarity index 61% rename from aprsd/threads/keep_alive.py rename to aprsd/threads/keepalive.py index a47e4a5..d4f53ca 100644 --- a/aprsd/threads/keep_alive.py +++ b/aprsd/threads/keepalive.py @@ -5,13 +5,11 @@ import tracemalloc from loguru import logger from oslo_config import cfg -import timeago from aprsd import packets, utils -from aprsd.client import client_factory from aprsd.log import log as aprsd_log from aprsd.stats import collector -from aprsd.threads import APRSDThread, APRSDThreadList +from aprsd.threads import APRSDThread, APRSDThreadList, keepalive_collector CONF = cfg.CONF @@ -36,15 +34,6 @@ class KeepAliveThread(APRSDThread): thread_list = APRSDThreadList() now = datetime.datetime.now() - if "EmailStats" in stats_json: - email_stats = stats_json["EmailStats"] - if email_stats.get("last_check_time"): - email_thread_time = utils.strfdelta(now - email_stats["last_check_time"]) - else: - email_thread_time = "N/A" - else: - email_thread_time = "N/A" - if "APRSClientStats" in stats_json and stats_json["APRSClientStats"].get("transport") == "aprsis": if stats_json["APRSClientStats"].get("server_keepalive"): last_msg_time = utils.strfdelta(now - stats_json["APRSClientStats"]["server_keepalive"]) @@ -64,7 +53,7 @@ class KeepAliveThread(APRSDThread): keepalive = ( "{} - Uptime {} RX:{} TX:{} Tracker:{} Msgs TX:{} RX:{} " - "Last:{} Email: {} - RAM Current:{} Peak:{} Threads:{} LoggingQueue:{}" + "Last:{} - RAM Current:{} Peak:{} Threads:{} LoggingQueue:{}" ).format( stats_json["APRSDStats"]["callsign"], stats_json["APRSDStats"]["uptime"], @@ -74,7 +63,6 @@ class KeepAliveThread(APRSDThread): tx_msg, rx_msg, last_msg_time, - email_thread_time, stats_json["APRSDStats"]["memory_current_str"], stats_json["APRSDStats"]["memory_peak_str"], len(thread_list), @@ -97,35 +85,11 @@ class KeepAliveThread(APRSDThread): LOGU.opt(colors=True).info(thread_msg) # LOG.info(f"{key: <15} Alive? {str(alive): <5} {str(age): <20}") - # check the APRS connection - cl = client_factory.create() - cl_stats = cl.stats() - ka = cl_stats.get("connection_keepalive", None) - if ka: - keepalive = timeago.format(ka) - else: - keepalive = "N/A" - LOGU.opt(colors=True).info(f"Client keepalive {keepalive}") - # Reset the connection if it's dead and this isn't our - # First time through the loop. - # The first time through the loop can happen at startup where - # The keepalive thread starts before the client has a chance - # to make it's connection the first time. - if not cl.is_alive() and self.cntr > 0: - LOG.error(f"{cl.__class__.__name__} is not alive!!! Resetting") - client_factory.create().reset() - # else: - # # See if we should reset the aprs-is client - # # Due to losing a keepalive from them - # delta_dict = utils.parse_delta_str(last_msg_time) - # delta = datetime.timedelta(**delta_dict) - # - # if delta > self.max_delta: - # # We haven't gotten a keepalive from aprs-is in a while - # # reset the connection.a - # if not client.KISSClient.is_enabled(): - # LOG.warning(f"Resetting connection to APRS-IS {delta}") - # client.factory.create().reset() + # Go through the registered keepalive collectors + # and check them as well as call log. + collect = keepalive_collector.KeepAliveCollector() + collect.check() + collect.log() # Check version every day delta = now - self.checker_time diff --git a/aprsd/threads/keepalive_collector.py b/aprsd/threads/keepalive_collector.py new file mode 100644 index 0000000..52dd0b0 --- /dev/null +++ b/aprsd/threads/keepalive_collector.py @@ -0,0 +1,54 @@ +import logging +from typing import Callable, Protocol, runtime_checkable + +from aprsd.utils import singleton + + +LOG = logging.getLogger("APRSD") + + +@runtime_checkable +class KeepAliveProducer(Protocol): + """The KeepAliveProducer protocol is used to define the interface for running Keepalive checks.""" + def keepalive_check(self) -> dict: + """Check for keepalive.""" + ... + + def keepalive_log(self): + """Log any keepalive information.""" + ... + + +@singleton +class KeepAliveCollector: + """The Collector class is used to collect stats from multiple StatsProducer instances.""" + def __init__(self): + self.producers: list[Callable] = [] + + def check(self) -> None: + """Do any keepalive checks.""" + for name in self.producers: + cls = name() + try: + cls.keepalive_check() + except Exception as e: + LOG.error(f"Error in producer {name} (check): {e}") + + def log(self) -> None: + """Log any relevant information during a KeepAlive check""" + for name in self.producers: + cls = name() + try: + cls.keepalive_log() + except Exception as e: + LOG.error(f"Error in producer {name} (check): {e}") + + def register(self, producer_name: Callable): + if not isinstance(producer_name, KeepAliveProducer): + raise TypeError(f"Producer {producer_name} is not a KeepAliveProducer") + self.producers.append(producer_name) + + def unregister(self, producer_name: Callable): + if not isinstance(producer_name, KeepAliveProducer): + raise TypeError(f"Producer {producer_name} is not a KeepAliveProducer") + self.producers.remove(producer_name) From 72d068c0b8944c8c9eed494fc23de8d7179ee09b Mon Sep 17 00:00:00 2001 From: Hemna Date: Fri, 20 Dec 2024 22:00:54 -0500 Subject: [PATCH 10/40] Changed to ruff This patch changes to the ruff linter. SO MUCH quicker. Removed grey and mypy as well. --- .pre-commit-config.yaml | 14 +- aprsd/cli_helper.py | 17 ++- aprsd/client/aprsis.py | 19 ++- aprsd/client/base.py | 5 +- aprsd/client/drivers/aprsis.py | 9 +- aprsd/client/drivers/fake.py | 5 +- aprsd/client/factory.py | 2 - aprsd/client/fake.py | 2 - aprsd/client/kiss.py | 4 +- aprsd/client/stats.py | 4 +- aprsd/cmds/completion.py | 11 +- aprsd/cmds/dev.py | 5 +- aprsd/cmds/fetch_stats.py | 13 +- aprsd/cmds/healthcheck.py | 8 +- aprsd/cmds/list_plugins.py | 52 ++++++-- aprsd/cmds/listen.py | 17 ++- aprsd/cmds/server.py | 8 +- aprsd/conf/client.py | 7 +- aprsd/conf/common.py | 39 +++--- aprsd/conf/log.py | 6 +- aprsd/conf/opts.py | 9 +- aprsd/conf/plugin_common.py | 24 ++-- aprsd/exception.py | 2 + aprsd/log/log.py | 6 +- aprsd/main.py | 14 +- aprsd/packets/__init__.py | 18 ++- aprsd/packets/core.py | 121 ++++++++---------- aprsd/packets/log.py | 8 +- aprsd/packets/packet_list.py | 15 ++- aprsd/plugin.py | 33 +++-- aprsd/plugins/notify.py | 5 +- aprsd/plugins/weather.py | 18 +-- aprsd/stats/collector.py | 7 +- aprsd/threads/__init__.py | 5 +- aprsd/threads/aprsd.py | 19 ++- aprsd/threads/keepalive.py | 13 +- aprsd/threads/registry.py | 6 +- aprsd/threads/rx.py | 15 ++- aprsd/threads/stats.py | 4 +- aprsd/threads/tx.py | 7 +- aprsd/utils/__init__.py | 52 ++++++-- aprsd/utils/json.py | 13 +- .../{threads => utils}/keepalive_collector.py | 3 +- aprsd/utils/trace.py | 2 - pyproject.toml | 2 +- requirements-dev.in | 8 -- requirements-dev.txt | 51 ++------ requirements.txt | 8 +- tests/client/test_aprsis.py | 1 + tests/client/test_client_base.py | 3 +- tests/cmds/test_send_message.py | 8 +- tests/fake.py | 2 - tests/plugins/test_notify.py | 14 +- tests/plugins/test_time.py | 4 +- tests/plugins/test_version.py | 2 - tests/plugins/test_weather.py | 5 +- tests/test_packets.py | 22 +++- tests/test_plugin.py | 12 +- tox.ini | 30 +++-- 59 files changed, 459 insertions(+), 379 deletions(-) rename aprsd/{threads => utils}/keepalive_collector.py (99%) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 431ef0e..f506539 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v5.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -10,13 +10,19 @@ repos: - id: check-case-conflict - id: check-docstring-first - id: check-builtin-literals + - id: check-illegal-windows-names - repo: https://github.com/asottile/setup-cfg-fmt rev: v2.5.0 hooks: - id: setup-cfg-fmt -- repo: https://github.com/dizballanze/gray - rev: v0.14.0 +- repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.8.4 hooks: - - id: gray + - id: ruff + ###### Relevant part below ###### + - id: ruff + args: ["check", "--select", "I", "--fix"] + ###### Relevant part above ###### + - id: ruff-format diff --git a/aprsd/cli_helper.py b/aprsd/cli_helper.py index faf5087..b99a8b0 100644 --- a/aprsd/cli_helper.py +++ b/aprsd/cli_helper.py @@ -1,7 +1,7 @@ -from functools import update_wrapper import logging -from pathlib import Path import typing as t +from functools import update_wrapper +from pathlib import Path import click from oslo_config import cfg @@ -11,7 +11,6 @@ from aprsd import conf # noqa: F401 from aprsd.log import log from aprsd.utils import trace - CONF = cfg.CONF home = str(Path.home()) DEFAULT_CONFIG_DIR = f"{home}/.config/aprsd/" @@ -58,6 +57,7 @@ class AliasedGroup(click.Group): calling into :meth:`add_command`. Copied from `click` and extended for `aliases`. """ + def decorator(f): aliases = kwargs.pop("aliases", []) cmd = click.decorators.command(*args, **kwargs)(f) @@ -65,6 +65,7 @@ class AliasedGroup(click.Group): for alias in aliases: self.add_command(cmd, name=alias) return cmd + return decorator def group(self, *args, **kwargs): @@ -74,6 +75,7 @@ class AliasedGroup(click.Group): calling into :meth:`add_command`. Copied from `click` and extended for `aliases`. """ + def decorator(f): aliases = kwargs.pop("aliases", []) cmd = click.decorators.group(*args, **kwargs)(f) @@ -81,6 +83,7 @@ class AliasedGroup(click.Group): for alias in aliases: self.add_command(cmd, name=alias) return cmd + return decorator @@ -89,6 +92,7 @@ def add_options(options): for option in reversed(options): func = option(func) return func + return _add_options @@ -103,7 +107,9 @@ def process_standard_options(f: F) -> F: default_config_files = None try: CONF( - [], project="aprsd", version=aprsd.__version__, + [], + project="aprsd", + version=aprsd.__version__, default_config_files=default_config_files, ) except cfg.ConfigFilesNotFoundError: @@ -119,7 +125,7 @@ def process_standard_options(f: F) -> F: trace.setup_tracing(["method", "api"]) if not config_file_found: - LOG = logging.getLogger("APRSD") # noqa: N806 + LOG = logging.getLogger("APRSD") # noqa: N806 LOG.error("No config file found!! run 'aprsd sample-config'") del kwargs["loglevel"] @@ -132,6 +138,7 @@ def process_standard_options(f: F) -> F: def process_standard_options_no_config(f: F) -> F: """Use this as a decorator when config isn't needed.""" + def new_func(*args, **kwargs): ctx = args[0] ctx.ensure_object(dict) diff --git a/aprsd/client/aprsis.py b/aprsd/client/aprsis.py index 9773f7f..e2ff163 100644 --- a/aprsd/client/aprsis.py +++ b/aprsd/client/aprsis.py @@ -2,24 +2,22 @@ import datetime import logging import time +import timeago from aprslib.exceptions import LoginError from loguru import logger from oslo_config import cfg -import timeago from aprsd import client, exception from aprsd.client import base from aprsd.client.drivers import aprsis from aprsd.packets import core - CONF = cfg.CONF LOG = logging.getLogger("APRSD") LOGU = logger class APRSISClient(base.APRSClient): - _client = None _checks = False @@ -106,6 +104,7 @@ class APRSISClient(base.APRSClient): LOG.warning(f"APRS_CLIENT {self._client} alive? NO!!!") return False return self._client.is_alive() and not self._is_stale_connection() + def close(self): if self._client: self._client.stop() @@ -134,8 +133,12 @@ class APRSISClient(base.APRSClient): if retry_count >= retries: break try: - LOG.info(f"Creating aprslib client({host}:{port}) and logging in {user}.") - aprs_client = aprsis.Aprsdis(user, passwd=password, host=host, port=port) + LOG.info( + f"Creating aprslib client({host}:{port}) and logging in {user}." + ) + aprs_client = aprsis.Aprsdis( + user, passwd=password, host=host, port=port + ) # Force the log to be the same aprs_client.logger = LOG aprs_client.connect() @@ -166,8 +169,10 @@ class APRSISClient(base.APRSClient): if self._client: try: self._client.consumer( - callback, blocking=blocking, - immortal=immortal, raw=raw, + callback, + blocking=blocking, + immortal=immortal, + raw=raw, ) except Exception as e: LOG.error(e) diff --git a/aprsd/client/base.py b/aprsd/client/base.py index c0bfbe8..9bf5a14 100644 --- a/aprsd/client/base.py +++ b/aprsd/client/base.py @@ -2,12 +2,11 @@ import abc import logging import threading -from oslo_config import cfg import wrapt +from oslo_config import cfg from aprsd.packets import core -from aprsd.threads import keepalive_collector - +from aprsd.utils import keepalive_collector CONF = cfg.CONF LOG = logging.getLogger("APRSD") diff --git a/aprsd/client/drivers/aprsis.py b/aprsd/client/drivers/aprsis.py index afcbd63..61953de 100644 --- a/aprsd/client/drivers/aprsis.py +++ b/aprsd/client/drivers/aprsis.py @@ -4,17 +4,20 @@ import select import threading import aprslib +import wrapt from aprslib import is_py3 from aprslib.exceptions import ( - ConnectionDrop, ConnectionError, GenericError, LoginError, ParseError, + ConnectionDrop, + ConnectionError, + GenericError, + LoginError, + ParseError, UnknownFormat, ) -import wrapt import aprsd from aprsd.packets import core - LOG = logging.getLogger("APRSD") diff --git a/aprsd/client/drivers/fake.py b/aprsd/client/drivers/fake.py index c93a6c3..a8810be 100644 --- a/aprsd/client/drivers/fake.py +++ b/aprsd/client/drivers/fake.py @@ -3,20 +3,19 @@ import threading import time import aprslib -from oslo_config import cfg import wrapt +from oslo_config import cfg from aprsd import conf # noqa from aprsd.packets import core from aprsd.utils import trace - CONF = cfg.CONF LOG = logging.getLogger("APRSD") class APRSDFakeClient(metaclass=trace.TraceWrapperMetaclass): - '''Fake client for testing.''' + """Fake client for testing.""" # flag to tell us to stop thread_stop = False diff --git a/aprsd/client/factory.py b/aprsd/client/factory.py index a179dca..e312344 100644 --- a/aprsd/client/factory.py +++ b/aprsd/client/factory.py @@ -4,13 +4,11 @@ from typing import Callable, Protocol, runtime_checkable from aprsd import exception from aprsd.packets import core - LOG = logging.getLogger("APRSD") @runtime_checkable class Client(Protocol): - def __init__(self): pass diff --git a/aprsd/client/fake.py b/aprsd/client/fake.py index b17262d..384468e 100644 --- a/aprsd/client/fake.py +++ b/aprsd/client/fake.py @@ -7,13 +7,11 @@ from aprsd.client import base from aprsd.client.drivers import fake as fake_driver from aprsd.utils import trace - CONF = cfg.CONF LOG = logging.getLogger("APRSD") class APRSDFakeClient(base.APRSClient, metaclass=trace.TraceWrapperMetaclass): - def stats(self, serializable=False) -> dict: return { "transport": "Fake", diff --git a/aprsd/client/kiss.py b/aprsd/client/kiss.py index eaa546e..c7d0dd2 100644 --- a/aprsd/client/kiss.py +++ b/aprsd/client/kiss.py @@ -2,23 +2,21 @@ import datetime import logging import aprslib +import timeago from loguru import logger from oslo_config import cfg -import timeago from aprsd import client, exception from aprsd.client import base from aprsd.client.drivers import kiss from aprsd.packets import core - CONF = cfg.CONF LOG = logging.getLogger("APRSD") LOGU = logger class KISSClient(base.APRSClient): - _client = None keepalive = datetime.datetime.now() diff --git a/aprsd/client/stats.py b/aprsd/client/stats.py index 29692ad..0097224 100644 --- a/aprsd/client/stats.py +++ b/aprsd/client/stats.py @@ -1,18 +1,16 @@ import threading -from oslo_config import cfg import wrapt +from oslo_config import cfg from aprsd import client from aprsd.utils import singleton - CONF = cfg.CONF @singleton class APRSClientStats: - lock = threading.Lock() @wrapt.synchronized(lock) diff --git a/aprsd/cmds/completion.py b/aprsd/cmds/completion.py index 0f695d4..5f75ce7 100644 --- a/aprsd/cmds/completion.py +++ b/aprsd/cmds/completion.py @@ -3,12 +3,13 @@ import click.shell_completion from aprsd.main import cli - CONTEXT_SETTINGS = dict(help_option_names=["-h", "--help"]) @cli.command() -@click.argument("shell", type=click.Choice(list(click.shell_completion._available_shells))) +@click.argument( + "shell", type=click.Choice(list(click.shell_completion._available_shells)) +) def completion(shell): """Show the shell completion code""" from click.utils import _detect_program_name @@ -17,6 +18,8 @@ def completion(shell): prog_name = _detect_program_name() complete_var = f"_{prog_name}_COMPLETE".replace("-", "_").upper() print(cls(cli, {}, prog_name, complete_var).source()) - print("# Add the following line to your shell configuration file to have aprsd command line completion") + print( + "# Add the following line to your shell configuration file to have aprsd command line completion" + ) print("# but remove the leading '#' character.") - print(f"# eval \"$(aprsd completion {shell})\"") + print(f'# eval "$(aprsd completion {shell})"') diff --git a/aprsd/cmds/dev.py b/aprsd/cmds/dev.py index dc760e8..cf03083 100644 --- a/aprsd/cmds/dev.py +++ b/aprsd/cmds/dev.py @@ -9,12 +9,12 @@ import click from oslo_config import cfg from aprsd import cli_helper, conf, packets, plugin + # local imports here from aprsd.client import base from aprsd.main import cli from aprsd.utils import trace - CONF = cfg.CONF LOG = logging.getLogger("APRSD") CONTEXT_SETTINGS = dict(help_option_names=["-h", "--help"]) @@ -112,7 +112,8 @@ def test_plugin( # Register the plugin they wanted tested. LOG.info( "Testing plugin {} Version {}".format( - obj.__class__, obj.version, + obj.__class__, + obj.version, ), ) pm.register_msg(obj) diff --git a/aprsd/cmds/fetch_stats.py b/aprsd/cmds/fetch_stats.py index fa235c1..1dbb11f 100644 --- a/aprsd/cmds/fetch_stats.py +++ b/aprsd/cmds/fetch_stats.py @@ -2,8 +2,8 @@ import logging import click -from oslo_config import cfg import requests +from oslo_config import cfg from rich.console import Console from rich.table import Table @@ -13,7 +13,6 @@ from aprsd import cli_helper from aprsd.main import cli from aprsd.threads.stats import StatsStore - # setup the global logger # log.basicConfig(level=log.DEBUG) # level=10 LOG = logging.getLogger("APRSD") @@ -23,12 +22,14 @@ CONF = cfg.CONF @cli.command() @cli_helper.add_options(cli_helper.common_options) @click.option( - "--host", type=str, + "--host", + type=str, default=None, help="IP address of the remote aprsd admin web ui fetch stats from.", ) @click.option( - "--port", type=int, + "--port", + type=int, default=None, help="Port of the remote aprsd web admin interface to fetch stats from.", ) @@ -169,8 +170,8 @@ def fetch_stats(ctx, host, port): "--show-section", default=["All"], help="Show specific sections of the stats. " - " Choices: All, APRSDStats, APRSDThreadList, APRSClientStats," - " PacketList, SeenList, WatchList", + " Choices: All, APRSDStats, APRSDThreadList, APRSClientStats," + " PacketList, SeenList, WatchList", multiple=True, type=click.Choice( [ diff --git a/aprsd/cmds/healthcheck.py b/aprsd/cmds/healthcheck.py index dcbb52b..feec6d0 100644 --- a/aprsd/cmds/healthcheck.py +++ b/aprsd/cmds/healthcheck.py @@ -13,13 +13,15 @@ from oslo_config import cfg from rich.console import Console import aprsd -from aprsd import cli_helper -from aprsd import conf # noqa +from aprsd import ( + cli_helper, + conf, # noqa +) + # local imports here from aprsd.main import cli from aprsd.threads import stats as stats_threads - # setup the global logger # log.basicConfig(level=log.DEBUG) # level=10 CONF = cfg.CONF diff --git a/aprsd/cmds/list_plugins.py b/aprsd/cmds/list_plugins.py index 46a7b9c..82507c9 100644 --- a/aprsd/cmds/list_plugins.py +++ b/aprsd/cmds/list_plugins.py @@ -9,9 +9,9 @@ import sys from traceback import print_tb from urllib.parse import urljoin -from bs4 import BeautifulSoup import click import requests +from bs4 import BeautifulSoup from rich.console import Console from rich.table import Table from rich.text import Text @@ -22,7 +22,6 @@ from aprsd import plugin as aprsd_plugin from aprsd.main import cli from aprsd.plugins import fortune, notify, ping, time, version, weather - LOG = logging.getLogger("APRSD") PYPI_URL = "https://pypi.org/search/" @@ -79,7 +78,8 @@ def get_module_info(package_name, module_name, module_path): obj_list.append( { "package": package_name, - "name": mem_name, "obj": obj, + "name": mem_name, + "obj": obj, "version": obj.version, "path": f"{'.'.join([module_name, obj.__name__])}", }, @@ -99,7 +99,9 @@ def _get_installed_aprsd_items(): module = importlib.import_module(name) pkgs = walk_package(module) for pkg in pkgs: - pkg_info = get_module_info(module.__name__, pkg.name, module.__path__[0]) + pkg_info = get_module_info( + module.__name__, pkg.name, module.__path__[0] + ) if "plugin" in name: plugins[name] = pkg_info elif "extension" in name: @@ -193,10 +195,18 @@ def show_pypi_plugins(installed_plugins, console): table.add_column("Installed?", style="red", justify="center") for snippet in snippets: link = urljoin(PYPI_URL, snippet.get("href")) - package = re.sub(r"\s+", " ", snippet.select_one('span[class*="name"]').text.strip()) - version = re.sub(r"\s+", " ", snippet.select_one('span[class*="version"]').text.strip()) - created = re.sub(r"\s+", " ", snippet.select_one('span[class*="created"]').text.strip()) - description = re.sub(r"\s+", " ", snippet.select_one('p[class*="description"]').text.strip()) + package = re.sub( + r"\s+", " ", snippet.select_one('span[class*="name"]').text.strip() + ) + version = re.sub( + r"\s+", " ", snippet.select_one('span[class*="version"]').text.strip() + ) + created = re.sub( + r"\s+", " ", snippet.select_one('span[class*="created"]').text.strip() + ) + description = re.sub( + r"\s+", " ", snippet.select_one('p[class*="description"]').text.strip() + ) emoji = ":open_file_folder:" if "aprsd-" not in package or "-plugin" not in package: @@ -210,7 +220,10 @@ def show_pypi_plugins(installed_plugins, console): table.add_row( f"[link={link}]{emoji}[/link] {package}", - description, version, created, installed, + description, + version, + created, + installed, ) console.print("\n") @@ -234,10 +247,18 @@ def show_pypi_extensions(installed_extensions, console): table.add_column("Installed?", style="red", justify="center") for snippet in snippets: link = urljoin(PYPI_URL, snippet.get("href")) - package = re.sub(r"\s+", " ", snippet.select_one('span[class*="name"]').text.strip()) - version = re.sub(r"\s+", " ", snippet.select_one('span[class*="version"]').text.strip()) - created = re.sub(r"\s+", " ", snippet.select_one('span[class*="created"]').text.strip()) - description = re.sub(r"\s+", " ", snippet.select_one('p[class*="description"]').text.strip()) + package = re.sub( + r"\s+", " ", snippet.select_one('span[class*="name"]').text.strip() + ) + version = re.sub( + r"\s+", " ", snippet.select_one('span[class*="version"]').text.strip() + ) + created = re.sub( + r"\s+", " ", snippet.select_one('span[class*="created"]').text.strip() + ) + description = re.sub( + r"\s+", " ", snippet.select_one('p[class*="description"]').text.strip() + ) emoji = ":open_file_folder:" if "aprsd-" not in package or "-extension" not in package: @@ -251,7 +272,10 @@ def show_pypi_extensions(installed_extensions, console): table.add_row( f"[link={link}]{emoji}[/link] {package}", - description, version, created, installed, + description, + version, + created, + installed, ) console.print("\n") diff --git a/aprsd/cmds/listen.py b/aprsd/cmds/listen.py index 17f49e4..f5851c8 100644 --- a/aprsd/cmds/listen.py +++ b/aprsd/cmds/listen.py @@ -27,7 +27,6 @@ from aprsd.threads import keepalive, rx from aprsd.threads import stats as stats_thread from aprsd.threads.aprsd import APRSDThread - # setup the global logger # log.basicConfig(level=log.DEBUG) # level=10 LOG = logging.getLogger("APRSD") @@ -51,8 +50,12 @@ def signal_handler(sig, frame): class APRSDListenThread(rx.APRSDRXThread): def __init__( - self, packet_queue, packet_filter=None, plugin_manager=None, - enabled_plugins=[], log_packets=False, + self, + packet_queue, + packet_filter=None, + plugin_manager=None, + enabled_plugins=[], + log_packets=False, ): super().__init__(packet_queue) self.packet_filter = packet_filter @@ -126,7 +129,7 @@ class ListenStatsThread(APRSDThread): thread_hex = f"fg {utils.hex_from_name(k)}" LOGU.opt(colors=True).info( f"<{thread_hex}>{k:<15} " - f"RX: {v["rx"]} TX: {v["tx"]}", + f"RX: {v['rx']} TX: {v['tx']}", ) time.sleep(1) @@ -265,7 +268,7 @@ def listen( LOG.debug(f"Filter by '{filter}'") aprs_client.set_filter(filter) - keepalive = keepalive.KeepAliveThread() + keepalive_thread = keepalive.KeepAliveThread() if not CONF.enable_seen_list: # just deregister the class from the packet collector @@ -309,9 +312,9 @@ def listen( listen_stats = ListenStatsThread() listen_stats.start() - keepalive.start() + keepalive_thread.start() LOG.debug("keepalive Join") - keepalive.join() + keepalive_thread.join() LOG.debug("listen_thread Join") listen_thread.join() stats.join() diff --git a/aprsd/cmds/server.py b/aprsd/cmds/server.py index fc0bce9..3c812d2 100644 --- a/aprsd/cmds/server.py +++ b/aprsd/cmds/server.py @@ -6,20 +6,17 @@ import click from oslo_config import cfg import aprsd -from aprsd import cli_helper +from aprsd import cli_helper, plugin, threads, utils from aprsd import main as aprsd_main -from aprsd import plugin, threads, utils from aprsd.client import client_factory from aprsd.main import cli from aprsd.packets import collector as packet_collector from aprsd.packets import seen_list from aprsd.threads import aprsd as aprsd_threads -from aprsd.threads import keepalive, registry, rx +from aprsd.threads import keepalive, registry, rx, tx from aprsd.threads import stats as stats_thread -from aprsd.threads import tx from aprsd.utils import singleton - CONF = cfg.CONF LOG = logging.getLogger("APRSD") @@ -32,6 +29,7 @@ class ServerThreads: the server command. """ + def __init__(self): self.threads: list[aprsd_threads.APRSDThread] = [] diff --git a/aprsd/conf/client.py b/aprsd/conf/client.py index 31bf16c..d7b394a 100644 --- a/aprsd/conf/client.py +++ b/aprsd/conf/client.py @@ -4,7 +4,6 @@ The options for log setup from oslo_config import cfg - DEFAULT_LOGIN = "NOCALL" aprs_group = cfg.OptGroup( @@ -31,7 +30,7 @@ aprs_opts = [ "enabled", default=True, help="Set enabled to False if there is no internet connectivity." - "This is useful for a direwolf KISS aprs connection only.", + "This is useful for a direwolf KISS aprs connection only.", ), cfg.StrOpt( "login", @@ -42,8 +41,8 @@ aprs_opts = [ "password", secret=True, help="APRS Password " - "Get the passcode for your callsign here: " - "https://apps.magicbug.co.uk/passcode", + "Get the passcode for your callsign here: " + "https://apps.magicbug.co.uk/passcode", ), cfg.HostAddressOpt( "host", diff --git a/aprsd/conf/common.py b/aprsd/conf/common.py index 0ee1fa1..897c3b1 100644 --- a/aprsd/conf/common.py +++ b/aprsd/conf/common.py @@ -2,7 +2,6 @@ from pathlib import Path from oslo_config import cfg - home = str(Path.home()) DEFAULT_CONFIG_DIR = f"{home}/.config/aprsd/" APRSD_DEFAULT_MAGIC_WORD = "CHANGEME!!!" @@ -47,15 +46,15 @@ aprsd_opts = [ "ack_rate_limit_period", default=1, help="The wait period in seconds per Ack packet being sent." - "1 means 1 ack packet per second allowed." - "2 means 1 pack packet every 2 seconds allowed", + "1 means 1 ack packet per second allowed." + "2 means 1 pack packet every 2 seconds allowed", ), cfg.IntOpt( "msg_rate_limit_period", default=2, help="Wait period in seconds per non AckPacket being sent." - "2 means 1 packet every 2 seconds allowed." - "5 means 1 pack packet every 5 seconds allowed", + "2 means 1 packet every 2 seconds allowed." + "5 means 1 pack packet every 5 seconds allowed", ), cfg.IntOpt( "packet_dupe_timeout", @@ -66,7 +65,7 @@ aprsd_opts = [ "enable_beacon", default=False, help="Enable sending of a GPS Beacon packet to locate this service. " - "Requires latitude and longitude to be set.", + "Requires latitude and longitude to be set.", ), cfg.IntOpt( "beacon_interval", @@ -93,8 +92,8 @@ aprsd_opts = [ choices=["compact", "multiline", "both"], default="compact", help="When logging packets 'compact' will use a single line formatted for each packet." - "'multiline' will use multiple lines for each packet and is the traditional format." - "both will log both compact and multiline.", + "'multiline' will use multiple lines for each packet and is the traditional format." + "both will log both compact and multiline.", ), cfg.IntOpt( "default_packet_send_count", @@ -120,7 +119,7 @@ aprsd_opts = [ "enable_seen_list", default=True, help="Enable the Callsign seen list tracking feature. This allows aprsd to keep track of " - "callsigns that have been seen and when they were last seen.", + "callsigns that have been seen and when they were last seen.", ), cfg.BoolOpt( "enable_packet_logging", @@ -136,7 +135,7 @@ aprsd_opts = [ "enable_sending_ack_packets", default=True, help="Set this to False, to disable sending of ack packets. This will entirely stop" - "APRSD from sending ack packets.", + "APRSD from sending ack packets.", ), ] @@ -145,8 +144,8 @@ watch_list_opts = [ "enabled", default=False, help="Enable the watch list feature. Still have to enable " - "the correct plugin. Built-in plugin to use is " - "aprsd.plugins.notify.NotifyPlugin", + "the correct plugin. Built-in plugin to use is " + "aprsd.plugins.notify.NotifyPlugin", ), cfg.ListOpt( "callsigns", @@ -165,7 +164,7 @@ watch_list_opts = [ "alert_time_seconds", default=3600, help="Time to wait before alert is sent on new message for " - "users in callsigns.", + "users in callsigns.", ), ] @@ -183,8 +182,8 @@ enabled_plugins_opts = [ "aprsd.plugins.notify.NotifySeenPlugin", ], help="Comma separated list of enabled plugins for APRSD." - "To enable installed external plugins add them here." - "The full python path to the class name must be used", + "To enable installed external plugins add them here." + "The full python path to the class name must be used", ), ] @@ -193,16 +192,16 @@ registry_opts = [ "enabled", default=False, help="Enable sending aprs registry information. This will let the " - "APRS registry know about your service and it's uptime. " - "No personal information is sent, just the callsign, uptime and description. " - "The service callsign is the callsign set in [DEFAULT] section.", + "APRS registry know about your service and it's uptime. " + "No personal information is sent, just the callsign, uptime and description. " + "The service callsign is the callsign set in [DEFAULT] section.", ), cfg.StrOpt( "description", default=None, help="Description of the service to send to the APRS registry. " - "This is what will show up in the APRS registry." - "If not set, the description will be the same as the callsign.", + "This is what will show up in the APRS registry." + "If not set, the description will be the same as the callsign.", ), cfg.StrOpt( "registry_url", diff --git a/aprsd/conf/log.py b/aprsd/conf/log.py index 5d4fa9d..f74d513 100644 --- a/aprsd/conf/log.py +++ b/aprsd/conf/log.py @@ -1,11 +1,11 @@ """ The options for log setup """ + import logging from oslo_config import cfg - LOG_LEVELS = { "CRITICAL": logging.CRITICAL, "ERROR": logging.ERROR, @@ -59,7 +59,5 @@ def register_opts(config): def list_opts(): return { - logging_group.name: ( - logging_opts - ), + logging_group.name: (logging_opts), } diff --git a/aprsd/conf/opts.py b/aprsd/conf/opts.py index 70618d1..7dbd491 100644 --- a/aprsd/conf/opts.py +++ b/aprsd/conf/opts.py @@ -31,7 +31,6 @@ import importlib import os import pkgutil - LIST_OPTS_FUNC_NAME = "list_opts" @@ -64,9 +63,11 @@ def _import_modules(module_names): for modname in module_names: mod = importlib.import_module("aprsd.conf." + modname) if not hasattr(mod, LIST_OPTS_FUNC_NAME): - msg = "The module 'aprsd.conf.%s' should have a '%s' "\ - "function which returns the config options." % \ - (modname, LIST_OPTS_FUNC_NAME) + msg = ( + "The module 'aprsd.conf.%s' should have a '%s' " + "function which returns the config options." + % (modname, LIST_OPTS_FUNC_NAME) + ) raise Exception(msg) else: imported_modules.append(mod) diff --git a/aprsd/conf/plugin_common.py b/aprsd/conf/plugin_common.py index 7101b82..b08487d 100644 --- a/aprsd/conf/plugin_common.py +++ b/aprsd/conf/plugin_common.py @@ -1,6 +1,5 @@ from oslo_config import cfg - aprsfi_group = cfg.OptGroup( name="aprs_fi", title="APRS.FI website settings", @@ -21,8 +20,7 @@ owm_wx_group = cfg.OptGroup( aprsfi_opts = [ cfg.StrOpt( "apiKey", - help="Get the apiKey from your aprs.fi account here:" - "http://aprs.fi/account", + help="Get the apiKey from your aprs.fi account here:" "http://aprs.fi/account", ), ] @@ -30,11 +28,11 @@ owm_wx_opts = [ cfg.StrOpt( "apiKey", help="OWMWeatherPlugin api key to OpenWeatherMap's API." - "This plugin uses the openweathermap API to fetch" - "location and weather information." - "To use this plugin you need to get an openweathermap" - "account and apikey." - "https://home.openweathermap.org/api_keys", + "This plugin uses the openweathermap API to fetch" + "location and weather information." + "To use this plugin you need to get an openweathermap" + "account and apikey." + "https://home.openweathermap.org/api_keys", ), ] @@ -42,16 +40,16 @@ avwx_opts = [ cfg.StrOpt( "apiKey", help="avwx-api is an opensource project that has" - "a hosted service here: https://avwx.rest/" - "You can launch your own avwx-api in a container" - "by cloning the githug repo here:" - "https://github.com/avwx-rest/AVWX-API", + "a hosted service here: https://avwx.rest/" + "You can launch your own avwx-api in a container" + "by cloning the githug repo here:" + "https://github.com/avwx-rest/AVWX-API", ), cfg.StrOpt( "base_url", default="https://avwx.rest", help="The base url for the avwx API. If you are hosting your own" - "Here is where you change the url to point to yours.", + "Here is where you change the url to point to yours.", ), ] diff --git a/aprsd/exception.py b/aprsd/exception.py index 7de4bf7..2f15728 100644 --- a/aprsd/exception.py +++ b/aprsd/exception.py @@ -1,11 +1,13 @@ class MissingConfigOptionException(Exception): """Missing a config option.""" + def __init__(self, config_option): self.message = f"Option '{config_option}' was not in config file" class ConfigOptionBogusDefaultException(Exception): """Missing a config option.""" + def __init__(self, config_option, default_fail): self.message = ( f"Config file option '{config_option}' needs to be " diff --git a/aprsd/log/log.py b/aprsd/log/log.py index c751d63..a94f770 100644 --- a/aprsd/log/log.py +++ b/aprsd/log/log.py @@ -7,7 +7,6 @@ from oslo_config import cfg from aprsd.conf import log as conf_log - CONF = cfg.CONF # LOG = logging.getLogger("APRSD") LOG = logger @@ -18,6 +17,7 @@ class QueueLatest(queue.Queue): This prevents the queue from blowing up in size. """ + def put(self, *args, **kwargs): try: super().put(*args, **kwargs) @@ -43,7 +43,9 @@ class InterceptHandler(logging.Handler): frame = frame.f_back depth += 1 - logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage()) + logger.opt(depth=depth, exception=record.exc_info).log( + level, record.getMessage() + ) # Setup the log faciility diff --git a/aprsd/main.py b/aprsd/main.py index eb409f3..5db0d78 100644 --- a/aprsd/main.py +++ b/aprsd/main.py @@ -22,11 +22,11 @@ # python included libs import datetime import importlib.metadata as imp -from importlib.metadata import version as metadata_version import logging import signal import sys import time +from importlib.metadata import version as metadata_version import click from oslo_config import cfg, generator @@ -36,7 +36,6 @@ import aprsd from aprsd import cli_helper, packets, threads, utils from aprsd.stats import collector - # setup the global logger # log.basicConfig(level=log.DEBUG) # level=10 CONF = cfg.CONF @@ -54,8 +53,14 @@ def cli(ctx): def load_commands(): from .cmds import ( # noqa - completion, dev, fetch_stats, healthcheck, list_plugins, listen, - send_message, server, + completion, + dev, + fetch_stats, + healthcheck, + list_plugins, + listen, + send_message, + server, ) @@ -115,6 +120,7 @@ def sample_config(ctx): def _get_selected_entry_points(): import sys + if sys.version_info < (3, 10): all = imp.entry_points() selected = [] diff --git a/aprsd/packets/__init__.py b/aprsd/packets/__init__.py index 32f7d80..62760fb 100644 --- a/aprsd/packets/__init__.py +++ b/aprsd/packets/__init__.py @@ -1,15 +1,25 @@ from aprsd.packets import collector from aprsd.packets.core import ( # noqa: F401 - AckPacket, BeaconPacket, BulletinPacket, GPSPacket, MessagePacket, - MicEPacket, ObjectPacket, Packet, RejectPacket, StatusPacket, - ThirdPartyPacket, UnknownPacket, WeatherPacket, factory, + AckPacket, + BeaconPacket, + BulletinPacket, + GPSPacket, + MessagePacket, + MicEPacket, + ObjectPacket, + Packet, + RejectPacket, + StatusPacket, + ThirdPartyPacket, + UnknownPacket, + WeatherPacket, + factory, ) from aprsd.packets.packet_list import PacketList # noqa: F401 from aprsd.packets.seen_list import SeenList # noqa: F401 from aprsd.packets.tracker import PacketTrack # noqa: F401 from aprsd.packets.watch_list import WatchList # noqa: F401 - # Register all the packet tracking objects. collector.PacketCollector().register(PacketList) collector.PacketCollector().register(SeenList) diff --git a/aprsd/packets/core.py b/aprsd/packets/core.py index 361646e..18a3c91 100644 --- a/aprsd/packets/core.py +++ b/aprsd/packets/core.py @@ -1,20 +1,23 @@ -from dataclasses import dataclass, field -from datetime import datetime import logging import re import time +from dataclasses import dataclass, field +from datetime import datetime + # Due to a failure in python 3.8 from typing import Any, List, Optional, Type, TypeVar, Union from aprslib import util as aprslib_util from dataclasses_json import ( - CatchAll, DataClassJsonMixin, Undefined, dataclass_json, + CatchAll, + DataClassJsonMixin, + Undefined, + dataclass_json, ) from loguru import logger from aprsd.utils import counter - # For mypy to be happy A = TypeVar("A", bound="DataClassJsonMixin") Json = Union[dict, list, str, int, float, bool, None] @@ -51,7 +54,7 @@ def _init_send_time(): return NO_DATE -def _init_msgNo(): # noqa: N802 +def _init_msgNo(): # noqa: N802 """For some reason __post__init doesn't get called. So in order to initialize the msgNo field in the packet @@ -84,14 +87,16 @@ class Packet: to_call: Optional[str] = field(default=None) addresse: Optional[str] = field(default=None) format: Optional[str] = field(default=None) - msgNo: Optional[str] = field(default=None) # noqa: N815 - ackMsgNo: Optional[str] = field(default=None) # noqa: N815 + msgNo: Optional[str] = field(default=None) # noqa: N815 + ackMsgNo: Optional[str] = field(default=None) # noqa: N815 packet_type: Optional[str] = field(default=None) timestamp: float = field(default_factory=_init_timestamp, compare=False, hash=False) # Holds the raw text string to be sent over the wire # or holds the raw string from input packet raw: Optional[str] = field(default=None, compare=False, hash=False) - raw_dict: dict = field(repr=False, default_factory=lambda: {}, compare=False, hash=False) + raw_dict: dict = field( + repr=False, default_factory=lambda: {}, compare=False, hash=False + ) # Built by calling prepare(). raw needs this built first. payload: Optional[str] = field(default=None) @@ -140,12 +145,12 @@ class Packet: def _build_payload(self) -> None: """The payload is the non headers portion of the packet.""" if not self.to_call: - raise ValueError("to_call isn't set. Must set to_call before calling prepare()") + raise ValueError( + "to_call isn't set. Must set to_call before calling prepare()" + ) # The base packet class has no real payload - self.payload = ( - f":{self.to_call.ljust(9)}" - ) + self.payload = f":{self.to_call.ljust(9)}" def _build_raw(self) -> None: """Build the self.raw which is what is sent over the air.""" @@ -166,8 +171,10 @@ class Packet: message = msg[:67] # We all miss George Carlin return re.sub( - "fuck|shit|cunt|piss|cock|bitch", "****", - message, flags=re.IGNORECASE, + "fuck|shit|cunt|piss|cock|bitch", + "****", + message, + flags=re.IGNORECASE, ) def __str__(self) -> str: @@ -214,10 +221,7 @@ class BulletinPacket(Packet): return f"BLN{self.bid} {self.message_text}" def _build_payload(self) -> None: - self.payload = ( - f":BLN{self.bid:<9}" - f":{self.message_text}" - ) + self.payload = f":BLN{self.bid:<9}" f":{self.message_text}" @dataclass_json @@ -335,10 +339,7 @@ class GPSPacket(Packet): self.payload = "".join(payload) def _build_raw(self): - self.raw = ( - f"{self.from_call}>{self.to_call},WIDE2-1:" - f"{self.payload}" - ) + self.raw = f"{self.from_call}>{self.to_call},WIDE2-1:" f"{self.payload}" @property def human_info(self) -> str: @@ -370,10 +371,7 @@ class BeaconPacket(GPSPacket): lat = aprslib_util.latitude_to_ddm(self.latitude) lon = aprslib_util.longitude_to_ddm(self.longitude) - self.payload = ( - f"@{time_zulu}z{lat}{self.symbol_table}" - f"{lon}" - ) + self.payload = f"@{time_zulu}z{lat}{self.symbol_table}" f"{lon}" if self.comment: comment = self._filter_for_send(self.comment) @@ -382,10 +380,7 @@ class BeaconPacket(GPSPacket): self.payload = f"{self.payload}{self.symbol}APRSD Beacon" def _build_raw(self): - self.raw = ( - f"{self.from_call}>APZ100:" - f"{self.payload}" - ) + self.raw = f"{self.from_call}>APZ100:" f"{self.payload}" @property def key(self) -> str: @@ -474,10 +469,7 @@ class ObjectPacket(GPSPacket): lat = aprslib_util.latitude_to_ddm(self.latitude) long = aprslib_util.longitude_to_ddm(self.longitude) - self.payload = ( - f"*{time_zulu}z{lat}{self.symbol_table}" - f"{long}{self.symbol}" - ) + self.payload = f"*{time_zulu}z{lat}{self.symbol_table}" f"{long}{self.symbol}" if self.comment: comment = self._filter_for_send(self.comment) @@ -494,10 +486,7 @@ class ObjectPacket(GPSPacket): The frequency, uplink_tone, offset is part of the comment """ - self.raw = ( - f"{self.from_call}>APZ100:;{self.to_call:9s}" - f"{self.payload}" - ) + self.raw = f"{self.from_call}>APZ100:;{self.to_call:9s}" f"{self.payload}" @property def human_info(self) -> str: @@ -547,11 +536,13 @@ class WeatherPacket(GPSPacket, DataClassJsonMixin): if "speed" in raw: del raw["speed"] # Let's adjust the rain numbers as well, since it's wrong - raw["rain_1h"] = round((raw.get("rain_1h", 0) / .254) * .01, 3) + raw["rain_1h"] = round((raw.get("rain_1h", 0) / 0.254) * 0.01, 3) raw["weather"]["rain_1h"] = raw["rain_1h"] - raw["rain_24h"] = round((raw.get("rain_24h", 0) / .254) * .01, 3) + raw["rain_24h"] = round((raw.get("rain_24h", 0) / 0.254) * 0.01, 3) raw["weather"]["rain_24h"] = raw["rain_24h"] - raw["rain_since_midnight"] = round((raw.get("rain_since_midnight", 0) / .254) * .01, 3) + raw["rain_since_midnight"] = round( + (raw.get("rain_since_midnight", 0) / 0.254) * 0.01, 3 + ) raw["weather"]["rain_since_midnight"] = raw["rain_since_midnight"] if "wind_direction" not in raw: @@ -593,26 +584,26 @@ class WeatherPacket(GPSPacket, DataClassJsonMixin): def _build_payload(self): """Build an uncompressed weather packet - Format = + Format = - _CSE/SPDgXXXtXXXrXXXpXXXPXXXhXXbXXXXX%type NEW FORMAT APRS793 June 97 - NOT BACKWARD COMPATIBLE + _CSE/SPDgXXXtXXXrXXXpXXXPXXXhXXbXXXXX%type NEW FORMAT APRS793 June 97 + NOT BACKWARD COMPATIBLE - Where: CSE/SPD is wind direction and sustained 1 minute speed - t is in degrees F + Where: CSE/SPD is wind direction and sustained 1 minute speed + t is in degrees F - r is Rain per last 60 minutes - 1.04 inches of rain will show as r104 - p is precipitation per last 24 hours (sliding 24 hour window) - P is precip per last 24 hours since midnight - b is Baro in tenths of a mb - h is humidity in percent. 00=100 - g is Gust (peak winds in last 5 minutes) - # is the raw rain counter for remote WX stations - See notes on remotes below - % shows software type d=Dos, m=Mac, w=Win, etc - type shows type of WX instrument + r is Rain per last 60 minutes + 1.04 inches of rain will show as r104 + p is precipitation per last 24 hours (sliding 24 hour window) + P is precip per last 24 hours since midnight + b is Baro in tenths of a mb + h is humidity in percent. 00=100 + g is Gust (peak winds in last 5 minutes) + # is the raw rain counter for remote WX stations + See notes on remotes below + % shows software type d=Dos, m=Mac, w=Win, etc + type shows type of WX instrument """ time_zulu = self._build_time_zulu() @@ -622,7 +613,8 @@ class WeatherPacket(GPSPacket, DataClassJsonMixin): f"{self.longitude}{self.symbol}", f"{self.wind_direction:03d}", # Speed = sustained 1 minute wind speed in mph - f"{self.symbol_table}", f"{self.wind_speed:03.0f}", + f"{self.symbol_table}", + f"{self.wind_speed:03.0f}", # wind gust (peak wind speed in mph in the last 5 minutes) f"g{self.wind_gust:03.0f}", # Temperature in degrees F @@ -644,11 +636,7 @@ class WeatherPacket(GPSPacket, DataClassJsonMixin): self.payload = "".join(contents) def _build_raw(self): - - self.raw = ( - f"{self.from_call}>{self.to_call},WIDE1-1,WIDE2-1:" - f"{self.payload}" - ) + self.raw = f"{self.from_call}>{self.to_call},WIDE1-1,WIDE2-1:" f"{self.payload}" @dataclass(unsafe_hash=True) @@ -692,14 +680,17 @@ class UnknownPacket: All of the unknown attributes are stored in the unknown_fields """ + unknown_fields: CatchAll _type: str = "UnknownPacket" from_call: Optional[str] = field(default=None) to_call: Optional[str] = field(default=None) - msgNo: str = field(default_factory=_init_msgNo) # noqa: N815 + msgNo: str = field(default_factory=_init_msgNo) # noqa: N815 format: Optional[str] = field(default=None) raw: Optional[str] = field(default=None) - raw_dict: dict = field(repr=False, default_factory=lambda: {}, compare=False, hash=False) + raw_dict: dict = field( + repr=False, default_factory=lambda: {}, compare=False, hash=False + ) path: List[str] = field(default_factory=list, compare=False, hash=False) packet_type: Optional[str] = field(default=None) via: Optional[str] = field(default=None, compare=False, hash=False) diff --git a/aprsd/packets/log.py b/aprsd/packets/log.py index 621fa15..f3905f6 100644 --- a/aprsd/packets/log.py +++ b/aprsd/packets/log.py @@ -8,7 +8,6 @@ from oslo_config import cfg from aprsd import utils from aprsd.packets.core import AckPacket, GPSPacket, RejectPacket - LOG = logging.getLogger() LOGU = logger CONF = cfg.CONF @@ -22,7 +21,9 @@ DISTANCE_COLOR = "fg #FF5733" DEGREES_COLOR = "fg #FFA900" -def log_multiline(packet, tx: Optional[bool] = False, header: Optional[bool] = True) -> None: +def log_multiline( + packet, tx: Optional[bool] = False, header: Optional[bool] = True +) -> None: """LOG a packet to the logfile.""" if not CONF.enable_packet_logging: return @@ -121,8 +122,7 @@ def log(packet, tx: Optional[bool] = False, header: Optional[bool] = True) -> No via_color = "green" arrow = f"<{via_color}>->" logit.append( - f"{name}" - f":{packet.msgNo}", + f"{name}" f":{packet.msgNo}", ) tmp = None diff --git a/aprsd/packets/packet_list.py b/aprsd/packets/packet_list.py index cc31da8..106a770 100644 --- a/aprsd/packets/packet_list.py +++ b/aprsd/packets/packet_list.py @@ -1,18 +1,18 @@ -from collections import OrderedDict import logging +from collections import OrderedDict from oslo_config import cfg from aprsd.packets import core from aprsd.utils import objectstore - CONF = cfg.CONF LOG = logging.getLogger("APRSD") class PacketList(objectstore.ObjectStoreMixin): """Class to keep track of the packets we tx/rx.""" + _instance = None _total_rx: int = 0 _total_tx: int = 0 @@ -38,7 +38,8 @@ class PacketList(objectstore.ObjectStoreMixin): self._add(packet) ptype = packet.__class__.__name__ type_stats = self.data["types"].setdefault( - ptype, {"tx": 0, "rx": 0}, + ptype, + {"tx": 0, "rx": 0}, ) type_stats["rx"] += 1 @@ -49,7 +50,8 @@ class PacketList(objectstore.ObjectStoreMixin): self._add(packet) ptype = packet.__class__.__name__ type_stats = self.data["types"].setdefault( - ptype, {"tx": 0, "rx": 0}, + ptype, + {"tx": 0, "rx": 0}, ) type_stats["tx"] += 1 @@ -86,10 +88,11 @@ class PacketList(objectstore.ObjectStoreMixin): with self.lock: # Get last N packets directly using list slicing packets_list = list(self.data.get("packets", {}).values()) - pkts = packets_list[-CONF.packet_list_stats_maxlen:][::-1] + pkts = packets_list[-CONF.packet_list_stats_maxlen :][::-1] stats = { - "total_tracked": self._total_rx + self._total_tx, # Fixed typo: was rx + rx + "total_tracked": self._total_rx + + self._total_tx, # Fixed typo: was rx + rx "rx": self._total_rx, "tx": self._total_tx, "types": self.data.get("types", {}), # Changed default from [] to {} diff --git a/aprsd/plugin.py b/aprsd/plugin.py index 20d8d5e..94f15df 100644 --- a/aprsd/plugin.py +++ b/aprsd/plugin.py @@ -8,14 +8,13 @@ import re import textwrap import threading -from oslo_config import cfg import pluggy +from oslo_config import cfg import aprsd from aprsd import client, packets, threads from aprsd.packets import watch_list - # setup the global logger CONF = cfg.CONF LOG = logging.getLogger("APRSD") @@ -166,7 +165,8 @@ class APRSDWatchListPluginBase(APRSDPluginBase, metaclass=abc.ABCMeta): except Exception as ex: LOG.error( "Plugin {} failed to process packet {}".format( - self.__class__, ex, + self.__class__, + ex, ), ) if result: @@ -214,7 +214,9 @@ class APRSDRegexCommandPluginBase(APRSDPluginBase, metaclass=abc.ABCMeta): return result if not isinstance(packet, packets.MessagePacket): - LOG.warning(f"{self.__class__.__name__} Got a {packet.__class__.__name__} ignoring") + LOG.warning( + f"{self.__class__.__name__} Got a {packet.__class__.__name__} ignoring" + ) return packets.NULL_MESSAGE result = None @@ -236,7 +238,8 @@ class APRSDRegexCommandPluginBase(APRSDPluginBase, metaclass=abc.ABCMeta): except Exception as ex: LOG.error( "Plugin {} failed to process packet {}".format( - self.__class__, ex, + self.__class__, + ex, ), ) LOG.exception(ex) @@ -286,7 +289,8 @@ class HelpPlugin(APRSDRegexCommandPluginBase): reply = None for p in pm.get_plugins(): if ( - p.enabled and isinstance(p, APRSDRegexCommandPluginBase) + p.enabled + and isinstance(p, APRSDRegexCommandPluginBase) and p.command_name.lower() == command_name ): reply = p.help() @@ -345,6 +349,7 @@ class PluginManager: def stats(self, serializable=False) -> dict: """Collect and return stats for all plugins.""" + def full_name_with_qualname(obj): return "{}.{}".format( obj.__class__.__module__, @@ -354,7 +359,6 @@ class PluginManager: plugin_stats = {} plugins = self.get_plugins() if plugins: - for p in plugins: plugin_stats[full_name_with_qualname(p)] = { "enabled": p.enabled, @@ -439,7 +443,9 @@ class PluginManager: ) self._watchlist_pm.register(plugin_obj) else: - LOG.warning(f"Plugin {plugin_obj.__class__.__name__} is disabled") + LOG.warning( + f"Plugin {plugin_obj.__class__.__name__} is disabled" + ) elif isinstance(plugin_obj, APRSDRegexCommandPluginBase): if plugin_obj.enabled: LOG.info( @@ -451,7 +457,9 @@ class PluginManager: ) self._pluggy_pm.register(plugin_obj) else: - LOG.warning(f"Plugin {plugin_obj.__class__.__name__} is disabled") + LOG.warning( + f"Plugin {plugin_obj.__class__.__name__} is disabled" + ) elif isinstance(plugin_obj, APRSDPluginBase): if plugin_obj.enabled: LOG.info( @@ -462,7 +470,9 @@ class PluginManager: ) self._pluggy_pm.register(plugin_obj) else: - LOG.warning(f"Plugin {plugin_obj.__class__.__name__} is disabled") + LOG.warning( + f"Plugin {plugin_obj.__class__.__name__} is disabled" + ) except Exception as ex: LOG.error(f"Couldn't load plugin '{plugin_name}'") LOG.exception(ex) @@ -473,7 +483,8 @@ class PluginManager: self.setup_plugins(load_help_plugin=CONF.load_help_plugin) def setup_plugins( - self, load_help_plugin=True, + self, + load_help_plugin=True, plugin_list=[], ): """Create the plugin manager and register plugins.""" diff --git a/aprsd/plugins/notify.py b/aprsd/plugins/notify.py index 01ac90f..1a47f9f 100644 --- a/aprsd/plugins/notify.py +++ b/aprsd/plugins/notify.py @@ -4,7 +4,6 @@ from oslo_config import cfg from aprsd import packets, plugin - CONF = cfg.CONF LOG = logging.getLogger("APRSD") @@ -43,9 +42,7 @@ class NotifySeenPlugin(plugin.APRSDWatchListPluginBase): pkt = packets.MessagePacket( from_call=CONF.callsign, to_call=notify_callsign, - message_text=( - f"{fromcall} was just seen by type:'{packet_type}'" - ), + message_text=(f"{fromcall} was just seen by type:'{packet_type}'"), allow_delay=False, ) pkt.allow_delay = False diff --git a/aprsd/plugins/weather.py b/aprsd/plugins/weather.py index 1e57115..065a933 100644 --- a/aprsd/plugins/weather.py +++ b/aprsd/plugins/weather.py @@ -2,13 +2,12 @@ import json import logging import re -from oslo_config import cfg import requests +from oslo_config import cfg from aprsd import plugin, plugin_utils from aprsd.utils import trace - CONF = cfg.CONF LOG = logging.getLogger("APRSD") @@ -205,8 +204,9 @@ class OWMWeatherPlugin(plugin.APRSDRegexCommandPluginBase): def help(self): _help = [ - "openweathermap: Send {} to get weather " - "from your location".format(self.command_regex), + "openweathermap: Send {} to get weather " "from your location".format( + self.command_regex + ), "openweathermap: Send {} to get " "weather from ".format(self.command_regex), ] @@ -327,10 +327,12 @@ class AVWXWeatherPlugin(plugin.APRSDRegexCommandPluginBase): def help(self): _help = [ - "avwxweather: Send {} to get weather " - "from your location".format(self.command_regex), - "avwxweather: Send {} to get " - "weather from ".format(self.command_regex), + "avwxweather: Send {} to get weather " "from your location".format( + self.command_regex + ), + "avwxweather: Send {} to get " "weather from ".format( + self.command_regex + ), ] return _help diff --git a/aprsd/stats/collector.py b/aprsd/stats/collector.py index c63dd31..10d0b81 100644 --- a/aprsd/stats/collector.py +++ b/aprsd/stats/collector.py @@ -3,13 +3,13 @@ from typing import Callable, Protocol, runtime_checkable from aprsd.utils import singleton - LOG = logging.getLogger("APRSD") @runtime_checkable class StatsProducer(Protocol): """The StatsProducer protocol is used to define the interface for collecting stats.""" + def stats(self, serializable=False) -> dict: """provide stats in a dictionary format.""" ... @@ -18,6 +18,7 @@ class StatsProducer(Protocol): @singleton class Collector: """The Collector class is used to collect stats from multiple StatsProducer instances.""" + def __init__(self): self.producers: list[Callable] = [] @@ -26,7 +27,9 @@ class Collector: for name in self.producers: cls = name() try: - stats[cls.__class__.__name__] = cls.stats(serializable=serializable).copy() + stats[cls.__class__.__name__] = cls.stats( + serializable=serializable + ).copy() except Exception as e: LOG.error(f"Error in producer {name} (stats): {e}") return stats diff --git a/aprsd/threads/__init__.py b/aprsd/threads/__init__.py index bd26e01..eea5d2e 100644 --- a/aprsd/threads/__init__.py +++ b/aprsd/threads/__init__.py @@ -4,8 +4,9 @@ import queue # aprsd.threads from .aprsd import APRSDThread, APRSDThreadList # noqa: F401 from .rx import ( # noqa: F401 - APRSDDupeRXThread, APRSDProcessPacketThread, APRSDRXThread, + APRSDDupeRXThread, + APRSDProcessPacketThread, + APRSDRXThread, ) - packet_queue = queue.Queue(maxsize=20) diff --git a/aprsd/threads/aprsd.py b/aprsd/threads/aprsd.py index a7415c7..09ac525 100644 --- a/aprsd/threads/aprsd.py +++ b/aprsd/threads/aprsd.py @@ -7,7 +7,6 @@ from typing import List import wrapt - LOG = logging.getLogger("APRSD") @@ -25,7 +24,7 @@ class APRSDThread(threading.Thread, metaclass=abc.ABCMeta): self._last_loop = datetime.datetime.now() def _should_quit(self): - """ see if we have a quit message from the global queue.""" + """see if we have a quit message from the global queue.""" if self.thread_stop: return True @@ -51,7 +50,9 @@ class APRSDThread(threading.Thread, metaclass=abc.ABCMeta): """Add code to subclass to do any cleanup""" def __str__(self): - out = f"Thread <{self.__class__.__name__}({self.name}) Alive? {self.is_alive()}>" + out = ( + f"Thread <{self.__class__.__name__}({self.name}) Alive? {self.is_alive()}>" + ) return out def loop_age(self): @@ -124,7 +125,7 @@ class APRSDThreadList: for th in self.threads_list: LOG.info(f"Stopping Thread {th.name}") if hasattr(th, "packet"): - LOG.info(F"{th.name} packet {th.packet}") + LOG.info(f"{th.name} packet {th.packet}") th.stop() @wrapt.synchronized @@ -133,7 +134,7 @@ class APRSDThreadList: for th in self.threads_list: LOG.info(f"Pausing Thread {th.name}") if hasattr(th, "packet"): - LOG.info(F"{th.name} packet {th.packet}") + LOG.info(f"{th.name} packet {th.packet}") th.pause() @wrapt.synchronized @@ -142,7 +143,7 @@ class APRSDThreadList: for th in self.threads_list: LOG.info(f"Resuming Thread {th.name}") if hasattr(th, "packet"): - LOG.info(F"{th.name} packet {th.packet}") + LOG.info(f"{th.name} packet {th.packet}") th.unpause() @wrapt.synchronized(lock) @@ -153,7 +154,11 @@ class APRSDThreadList: alive = thread.is_alive() age = thread.loop_age() key = thread.__class__.__name__ - info[key] = {"alive": True if alive else False, "age": age, "name": thread.name} + info[key] = { + "alive": True if alive else False, + "age": age, + "name": thread.name, + } return info @wrapt.synchronized(lock) diff --git a/aprsd/threads/keepalive.py b/aprsd/threads/keepalive.py index d4f53ca..5e259af 100644 --- a/aprsd/threads/keepalive.py +++ b/aprsd/threads/keepalive.py @@ -9,8 +9,8 @@ from oslo_config import cfg from aprsd import packets, utils from aprsd.log import log as aprsd_log from aprsd.stats import collector -from aprsd.threads import APRSDThread, APRSDThreadList, keepalive_collector - +from aprsd.threads import APRSDThread, APRSDThreadList +from aprsd.utils import keepalive_collector CONF = cfg.CONF LOG = logging.getLogger("APRSD") @@ -34,9 +34,14 @@ class KeepAliveThread(APRSDThread): thread_list = APRSDThreadList() now = datetime.datetime.now() - if "APRSClientStats" in stats_json and stats_json["APRSClientStats"].get("transport") == "aprsis": + if ( + "APRSClientStats" in stats_json + and stats_json["APRSClientStats"].get("transport") == "aprsis" + ): if stats_json["APRSClientStats"].get("server_keepalive"): - last_msg_time = utils.strfdelta(now - stats_json["APRSClientStats"]["server_keepalive"]) + last_msg_time = utils.strfdelta( + now - stats_json["APRSClientStats"]["server_keepalive"] + ) else: last_msg_time = "N/A" else: diff --git a/aprsd/threads/registry.py b/aprsd/threads/registry.py index 9141c5c..97b4932 100644 --- a/aprsd/threads/registry.py +++ b/aprsd/threads/registry.py @@ -1,19 +1,19 @@ import logging import time -from oslo_config import cfg import requests +from oslo_config import cfg import aprsd from aprsd import threads as aprsd_threads - CONF = cfg.CONF LOG = logging.getLogger("APRSD") class APRSRegistryThread(aprsd_threads.APRSDThread): """This sends service information to the configured APRS Registry.""" + _loop_cnt: int = 1 def __init__(self): @@ -41,7 +41,7 @@ class APRSRegistryThread(aprsd_threads.APRSDThread): "description": CONF.aprs_registry.description, "service_website": CONF.aprs_registry.service_website, "software": f"APRSD version {aprsd.__version__} " - "https://github.com/craigerl/aprsd", + "https://github.com/craigerl/aprsd", } try: requests.post( diff --git a/aprsd/threads/rx.py b/aprsd/threads/rx.py index 95330df..8a5383b 100644 --- a/aprsd/threads/rx.py +++ b/aprsd/threads/rx.py @@ -13,7 +13,6 @@ from aprsd.packets import log as packet_log from aprsd.threads import APRSDThread, tx from aprsd.utils import trace - CONF = cfg.CONF LOG = logging.getLogger("APRSD") @@ -53,7 +52,9 @@ class APRSDRXThread(APRSDThread): # kwargs. :( # https://github.com/rossengeorgiev/aprs-python/pull/56 self._client.consumer( - self._process_packet, raw=False, blocking=False, + self._process_packet, + raw=False, + blocking=False, ) except ( aprslib.exceptions.ConnectionDrop, @@ -138,7 +139,9 @@ class APRSDDupeRXThread(APRSDRXThread): elif packet.timestamp - found.timestamp < CONF.packet_dupe_timeout: # If the packet came in within N seconds of the # Last time seeing the packet, then we drop it as a dupe. - LOG.warning(f"Packet {packet.from_call}:{packet.msgNo} already tracked, dropping.") + LOG.warning( + f"Packet {packet.from_call}:{packet.msgNo} already tracked, dropping." + ) else: LOG.warning( f"Packet {packet.from_call}:{packet.msgNo} already tracked " @@ -149,7 +152,7 @@ class APRSDDupeRXThread(APRSDRXThread): class APRSDPluginRXThread(APRSDDupeRXThread): - """"Process received packets. + """ "Process received packets. For backwards compatibility, we keep the APRSDPluginRXThread. """ @@ -249,7 +252,8 @@ class APRSDProcessPacketThread(APRSDThread): self.process_other_packet(packet, for_us=False) else: self.process_other_packet( - packet, for_us=(to_call.lower() == our_call), + packet, + for_us=(to_call.lower() == our_call), ) LOG.debug(f"Packet processing complete for pkt '{packet.key}'") return False @@ -349,7 +353,6 @@ class APRSDPluginProcessPacketThread(APRSDProcessPacketThread): # If the message was for us and we didn't have a # response, then we send a usage statement. if to_call == CONF.callsign and not replied: - # Tailor the messages accordingly if CONF.load_help_plugin: LOG.warning("Sending help!") diff --git a/aprsd/threads/stats.py b/aprsd/threads/stats.py index 9d5c120..6058781 100644 --- a/aprsd/threads/stats.py +++ b/aprsd/threads/stats.py @@ -2,20 +2,20 @@ import logging import threading import time -from oslo_config import cfg import wrapt +from oslo_config import cfg from aprsd.stats import collector from aprsd.threads import APRSDThread from aprsd.utils import objectstore - CONF = cfg.CONF LOG = logging.getLogger("APRSD") class StatsStore(objectstore.ObjectStoreMixin): """Container to save the stats from the collector.""" + lock = threading.Lock() data = {} diff --git a/aprsd/threads/tx.py b/aprsd/threads/tx.py index 70d5864..72f33b6 100644 --- a/aprsd/threads/tx.py +++ b/aprsd/threads/tx.py @@ -2,20 +2,18 @@ import logging import threading import time +import wrapt from oslo_config import cfg from rush import quota, throttle from rush.contrib import decorator from rush.limiters import periodic from rush.stores import dictionary -import wrapt from aprsd import conf # noqa from aprsd import threads as aprsd_threads from aprsd.client import client_factory -from aprsd.packets import collector, core +from aprsd.packets import collector, core, tracker from aprsd.packets import log as packet_log -from aprsd.packets import tracker - CONF = cfg.CONF LOG = logging.getLogger("APRSD") @@ -238,6 +236,7 @@ class BeaconSendThread(aprsd_threads.APRSDThread): Settings are in the [DEFAULT] section of the config file. """ + _loop_cnt: int = 1 def __init__(self): diff --git a/aprsd/utils/__init__.py b/aprsd/utils/__init__.py index 6998d82..51a5ae9 100644 --- a/aprsd/utils/__init__.py +++ b/aprsd/utils/__init__.py @@ -13,11 +13,11 @@ import update_checker import aprsd from .fuzzyclock import fuzzy # noqa: F401 + # Make these available by anyone importing # aprsd.utils from .ring_buffer import RingBuffer # noqa: F401 - if sys.version_info.major == 3 and sys.version_info.minor >= 3: from collections.abc import MutableMapping else: @@ -26,11 +26,13 @@ else: def singleton(cls): """Make a class a Singleton class (only one instance)""" + @functools.wraps(cls) def wrapper_singleton(*args, **kwargs): if wrapper_singleton.instance is None: wrapper_singleton.instance = cls(*args, **kwargs) return wrapper_singleton.instance + wrapper_singleton.instance = None return wrapper_singleton @@ -170,7 +172,10 @@ def load_entry_points(group): try: ep.load() except Exception as e: - print(f"Extension {ep.name} of group {group} failed to load with {e}", file=sys.stderr) + print( + f"Extension {ep.name} of group {group} failed to load with {e}", + file=sys.stderr, + ) print(traceback.format_exc(), file=sys.stderr) @@ -200,8 +205,7 @@ def calculate_initial_compass_bearing(point_a, point_b): x = math.sin(diff_long) * math.cos(lat2) y = math.cos(lat1) * math.sin(lat2) - ( - math.sin(lat1) - * math.cos(lat2) * math.cos(diff_long) + math.sin(lat1) * math.cos(lat2) * math.cos(diff_long) ) initial_bearing = math.atan2(x, y) @@ -218,15 +222,43 @@ def calculate_initial_compass_bearing(point_a, point_b): def degrees_to_cardinal(bearing, full_string=False): if full_string: directions = [ - "North", "North-Northeast", "Northeast", "East-Northeast", "East", "East-Southeast", - "Southeast", "South-Southeast", "South", "South-Southwest", "Southwest", "West-Southwest", - "West", "West-Northwest", "Northwest", "North-Northwest", "North", + "North", + "North-Northeast", + "Northeast", + "East-Northeast", + "East", + "East-Southeast", + "Southeast", + "South-Southeast", + "South", + "South-Southwest", + "Southwest", + "West-Southwest", + "West", + "West-Northwest", + "Northwest", + "North-Northwest", + "North", ] else: directions = [ - "N", "NNE", "NE", "ENE", "E", "ESE", - "SE", "SSE", "S", "SSW", "SW", "WSW", - "W", "WNW", "NW", "NNW", "N", + "N", + "NNE", + "NE", + "ENE", + "E", + "ESE", + "SE", + "SSE", + "S", + "SSW", + "SW", + "WSW", + "W", + "WNW", + "NW", + "NNW", + "N", ] cardinal = directions[round(bearing / 22.5)] diff --git a/aprsd/utils/json.py b/aprsd/utils/json.py index 648238a..ebf5aca 100644 --- a/aprsd/utils/json.py +++ b/aprsd/utils/json.py @@ -10,8 +10,13 @@ class EnhancedJSONEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.datetime): args = ( - "year", "month", "day", "hour", "minute", - "second", "microsecond", + "year", + "month", + "day", + "hour", + "minute", + "second", + "microsecond", ) return { "__type__": "datetime.datetime", @@ -63,10 +68,10 @@ class SimpleJSONEncoder(json.JSONEncoder): class EnhancedJSONDecoder(json.JSONDecoder): - def __init__(self, *args, **kwargs): super().__init__( - *args, object_hook=self.object_hook, + *args, + object_hook=self.object_hook, **kwargs, ) diff --git a/aprsd/threads/keepalive_collector.py b/aprsd/utils/keepalive_collector.py similarity index 99% rename from aprsd/threads/keepalive_collector.py rename to aprsd/utils/keepalive_collector.py index 52dd0b0..9c53b06 100644 --- a/aprsd/threads/keepalive_collector.py +++ b/aprsd/utils/keepalive_collector.py @@ -3,13 +3,13 @@ from typing import Callable, Protocol, runtime_checkable from aprsd.utils import singleton - LOG = logging.getLogger("APRSD") @runtime_checkable class KeepAliveProducer(Protocol): """The KeepAliveProducer protocol is used to define the interface for running Keepalive checks.""" + def keepalive_check(self) -> dict: """Check for keepalive.""" ... @@ -22,6 +22,7 @@ class KeepAliveProducer(Protocol): @singleton class KeepAliveCollector: """The Collector class is used to collect stats from multiple StatsProducer instances.""" + def __init__(self): self.producers: list[Callable] = [] diff --git a/aprsd/utils/trace.py b/aprsd/utils/trace.py index 4ee827f..0253209 100644 --- a/aprsd/utils/trace.py +++ b/aprsd/utils/trace.py @@ -5,7 +5,6 @@ import logging import time import types - VALID_TRACE_FLAGS = {"method", "api"} TRACE_API = False TRACE_METHOD = False @@ -27,7 +26,6 @@ def trace(*dec_args, **dec_kwargs): """ def _decorator(f): - func_name = f.__qualname__ func_file = "/".join(f.__code__.co_filename.split("/")[-4:]) diff --git a/pyproject.toml b/pyproject.toml index 4059939..e61b071 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ description = "APRSd is a APRS-IS server that can be used to connect to APRS-IS # 'Programming Language' classifiers in this file, 'pip install' will check this # and refuse to install the project if the version does not match. See # https://packaging.python.org/guides/distributing-packages-using-setuptools/#python-requires -requires-python = ">=3.8" +requires-python = ">=3.9" dynamic = ["version", "dependencies", "optional-dependencies"] diff --git a/requirements-dev.in b/requirements-dev.in index d3d281b..6fa77c9 100644 --- a/requirements-dev.in +++ b/requirements-dev.in @@ -1,12 +1,4 @@ build -check-manifest -flake8 -gray -isort -mypy -pep8-naming -pytest -pytest-cov pip pip-tools pre-commit diff --git a/requirements-dev.txt b/requirements-dev.txt index b8d95c3..bcfdee1 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,65 +1,40 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile --annotation-style=line requirements-dev.in # -add-trailing-comma==3.1.0 # via gray alabaster==1.0.0 # via sphinx -autoflake==1.5.3 # via gray babel==2.16.0 # via sphinx -black==24.10.0 # via gray -build==1.2.2.post1 # via -r requirements-dev.in, check-manifest, pip-tools +build==1.2.2.post1 # via -r requirements-dev.in, pip-tools cachetools==5.5.0 # via tox -certifi==2024.8.30 # via requests +certifi==2024.12.14 # via requests cfgv==3.4.0 # via pre-commit chardet==5.2.0 # via tox charset-normalizer==3.4.0 # via requests -check-manifest==0.50 # via -r requirements-dev.in -click==8.1.7 # via black, fixit, moreorless, pip-tools +click==8.1.7 # via pip-tools colorama==0.4.6 # via tox -commonmark==0.9.1 # via rich -configargparse==1.7 # via gray -coverage[toml]==7.6.9 # via pytest-cov distlib==0.3.9 # via virtualenv docutils==0.21.2 # via m2r, sphinx filelock==3.16.1 # via tox, virtualenv -fixit==2.1.0 # via gray -flake8==7.1.1 # via -r requirements-dev.in, pep8-naming -gray==0.15.0 # via -r requirements-dev.in identify==2.6.3 # via pre-commit idna==3.10 # via requests imagesize==1.4.1 # via sphinx -iniconfig==2.0.0 # via pytest -isort==5.13.2 # via -r requirements-dev.in, gray jinja2==3.1.4 # via sphinx -libcst==1.5.1 # via fixit m2r==0.3.1 # via -r requirements-dev.in markupsafe==3.0.2 # via jinja2 -mccabe==0.7.0 # via flake8 mistune==0.8.4 # via m2r -moreorless==0.4.0 # via fixit -mypy==1.13.0 # via -r requirements-dev.in -mypy-extensions==1.0.0 # via black, mypy nodeenv==1.9.1 # via pre-commit -packaging==24.2 # via black, build, fixit, pyproject-api, pytest, sphinx, tox -pathspec==0.12.1 # via black, trailrunner -pep8-naming==0.14.1 # via -r requirements-dev.in +packaging==24.2 # via build, pyproject-api, sphinx, tox pip-tools==7.4.1 # via -r requirements-dev.in -platformdirs==4.3.6 # via black, tox, virtualenv -pluggy==1.5.0 # via pytest, tox +platformdirs==4.3.6 # via tox, virtualenv +pluggy==1.5.0 # via tox pre-commit==4.0.1 # via -r requirements-dev.in -pycodestyle==2.12.1 # via flake8 -pyflakes==3.2.0 # via autoflake, flake8 -pygments==2.18.0 # via rich, sphinx +pygments==2.18.0 # via sphinx pyproject-api==1.8.0 # via tox pyproject-hooks==1.2.0 # via build, pip-tools -pytest==8.3.4 # via -r requirements-dev.in, pytest-cov -pytest-cov==6.0.0 # via -r requirements-dev.in -pyupgrade==3.19.0 # via gray -pyyaml==6.0.2 # via libcst, pre-commit +pyyaml==6.0.2 # via pre-commit requests==2.32.3 # via sphinx -rich==12.6.0 # via gray snowballstemmer==2.2.0 # via sphinx sphinx==8.1.3 # via -r requirements-dev.in sphinxcontrib-applehelp==2.0.0 # via sphinx @@ -68,13 +43,9 @@ sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-qthelp==2.0.0 # via sphinx sphinxcontrib-serializinghtml==2.0.0 # via sphinx -tokenize-rt==6.1.0 # via add-trailing-comma, pyupgrade -toml==0.10.2 # via autoflake +tomli==2.2.1 # via build, pip-tools, pyproject-api, sphinx, tox tox==4.23.2 # via -r requirements-dev.in -trailrunner==1.4.0 # via fixit -typing-extensions==4.12.2 # via mypy -unify==0.5 # via gray -untokenize==0.1.1 # via unify +typing-extensions==4.12.2 # via tox urllib3==2.2.3 # via requests virtualenv==20.28.0 # via pre-commit, tox wheel==0.45.1 # via -r requirements-dev.in, pip-tools diff --git a/requirements.txt b/requirements.txt index 35ac177..e79dde2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,15 +1,15 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile --annotation-style=line requirements.in # aprslib==0.7.2 # via -r requirements.in -attrs==24.2.0 # via ax253, kiss3, rush +attrs==24.3.0 # via ax253, kiss3, rush ax253==0.1.5.post1 # via kiss3 beautifulsoup4==4.12.3 # via -r requirements.in bitarray==3.0.0 # via ax253, kiss3 -certifi==2024.8.30 # via requests +certifi==2024.12.14 # via requests charset-normalizer==3.4.0 # via requests click==8.1.7 # via -r requirements.in commonmark==0.9.1 # via rich @@ -20,7 +20,7 @@ idna==3.10 # via requests importlib-metadata==8.5.0 # via ax253, kiss3 kiss3==8.0.0 # via -r requirements.in loguru==0.7.3 # via -r requirements.in -marshmallow==3.23.1 # via dataclasses-json +marshmallow==3.23.2 # via dataclasses-json mypy-extensions==1.0.0 # via typing-inspect netaddr==1.3.0 # via oslo-config oslo-config==9.7.0 # via -r requirements.in diff --git a/tests/client/test_aprsis.py b/tests/client/test_aprsis.py index a4f01a0..a5bf542 100644 --- a/tests/client/test_aprsis.py +++ b/tests/client/test_aprsis.py @@ -54,6 +54,7 @@ class TestAPRSISClient(unittest.TestCase): with mock.patch.object(APRSISClient, "is_configured", return_value=True): stats = self.client.stats() from rich.console import Console + c = Console() c.print(stats) self.assertEqual( diff --git a/tests/client/test_client_base.py b/tests/client/test_client_base.py index b6faf2c..08667cb 100644 --- a/tests/client/test_client_base.py +++ b/tests/client/test_client_base.py @@ -109,7 +109,8 @@ class TestAPRSClient(unittest.TestCase): """Test handling of client creation failure.""" # Make setup_connection raise an exception with mock.patch.object( - self.client, "setup_connection", + self.client, + "setup_connection", side_effect=Exception("Connection failed"), ): with self.assertRaises(Exception): diff --git a/tests/cmds/test_send_message.py b/tests/cmds/test_send_message.py index b91f36b..afda63d 100644 --- a/tests/cmds/test_send_message.py +++ b/tests/cmds/test_send_message.py @@ -11,13 +11,11 @@ from aprsd.main import cli from .. import fake - CONF = cfg.CONF F = t.TypeVar("F", bound=t.Callable[..., t.Any]) class TestSendMessageCommand(unittest.TestCase): - def config_and_init(self, login=None, password=None): CONF.callsign = fake.FAKE_TO_CALLSIGN CONF.trace_enabled = False @@ -41,7 +39,8 @@ class TestSendMessageCommand(unittest.TestCase): runner = CliRunner() result = runner.invoke( - cli, ["send-message"], + cli, + ["send-message"], catch_exceptions=False, ) assert result.exit_code == 2 @@ -58,7 +57,8 @@ class TestSendMessageCommand(unittest.TestCase): runner = CliRunner() result = runner.invoke( - cli, ["send-message", "WB4BOR"], + cli, + ["send-message", "WB4BOR"], catch_exceptions=False, ) assert result.exit_code == 2 diff --git a/tests/fake.py b/tests/fake.py index 4a7c816..fd3e592 100644 --- a/tests/fake.py +++ b/tests/fake.py @@ -1,7 +1,6 @@ from aprsd import plugin, threads from aprsd.packets import core - FAKE_MESSAGE_TEXT = "fake MeSSage" FAKE_FROM_CALLSIGN = "KFAKE" FAKE_TO_CALLSIGN = "KMINE" @@ -88,6 +87,5 @@ class FakeRegexCommandPlugin(plugin.APRSDRegexCommandPluginBase): class FakeWatchListPlugin(plugin.APRSDWatchListPluginBase): - def process(self, packet): return FAKE_MESSAGE_TEXT diff --git a/tests/plugins/test_notify.py b/tests/plugins/test_notify.py index b1a6954..ed1c81d 100644 --- a/tests/plugins/test_notify.py +++ b/tests/plugins/test_notify.py @@ -2,13 +2,15 @@ from unittest import mock from oslo_config import cfg -from aprsd import client, packets -from aprsd import conf # noqa: F401 +from aprsd import ( + client, + conf, # noqa: F401 + packets, +) from aprsd.plugins import notify as notify_plugin from .. import fake, test_plugin - CONF = cfg.CONF DEFAULT_WATCHLIST_CALLSIGNS = fake.FAKE_FROM_CALLSIGN @@ -49,7 +51,6 @@ class TestWatchListPlugin(test_plugin.TestPlugin): class TestAPRSDWatchListPluginBase(TestWatchListPlugin): - def test_watchlist_not_enabled(self): self.config_and_init(watchlist_enabled=False) plugin = fake.FakeWatchListPlugin() @@ -79,7 +80,6 @@ class TestAPRSDWatchListPluginBase(TestWatchListPlugin): class TestNotifySeenPlugin(TestWatchListPlugin): - def test_disabled(self): self.config_and_init(watchlist_enabled=False) plugin = notify_plugin.NotifySeenPlugin() @@ -128,7 +128,9 @@ class TestNotifySeenPlugin(TestWatchListPlugin): @mock.patch("aprsd.client.factory.ClientFactory", autospec=True) @mock.patch("aprsd.packets.WatchList.is_old") - def test_callsign_in_watchlist_old_same_alert_callsign(self, mock_is_old, mock_factory): + def test_callsign_in_watchlist_old_same_alert_callsign( + self, mock_is_old, mock_factory + ): client.client_factory = mock_factory mock_is_old.return_value = True self.config_and_init( diff --git a/tests/plugins/test_time.py b/tests/plugins/test_time.py index 22d2527..2adef59 100644 --- a/tests/plugins/test_time.py +++ b/tests/plugins/test_time.py @@ -1,19 +1,17 @@ from unittest import mock -from oslo_config import cfg import pytz +from oslo_config import cfg from aprsd.plugins import time as time_plugin from aprsd.utils import fuzzy from .. import fake, test_plugin - CONF = cfg.CONF class TestTimePlugins(test_plugin.TestPlugin): - @mock.patch("aprsd.plugins.time.TimePlugin._get_local_tz") @mock.patch("aprsd.plugins.time.TimePlugin._get_utcnow") def test_time(self, mock_utcnow, mock_localtz): diff --git a/tests/plugins/test_version.py b/tests/plugins/test_version.py index 8cf4f69..14d2af0 100644 --- a/tests/plugins/test_version.py +++ b/tests/plugins/test_version.py @@ -7,12 +7,10 @@ from aprsd.plugins import version as version_plugin from .. import fake, test_plugin - CONF = cfg.CONF class TestVersionPlugin(test_plugin.TestPlugin): - @mock.patch("aprsd.stats.app.APRSDStats.uptime") def test_version(self, mock_stats): mock_stats.return_value = "00:00:00" diff --git a/tests/plugins/test_weather.py b/tests/plugins/test_weather.py index c8d814d..76f98fb 100644 --- a/tests/plugins/test_weather.py +++ b/tests/plugins/test_weather.py @@ -7,12 +7,10 @@ from aprsd.plugins import weather as weather_plugin from .. import fake, test_plugin - CONF = cfg.CONF class TestUSWeatherPlugin(test_plugin.TestPlugin): - def test_not_enabled_missing_aprs_fi_key(self): # When the aprs.fi api key isn't set, then # the LocationPlugin will be disabled. @@ -108,7 +106,6 @@ class TestUSWeatherPlugin(test_plugin.TestPlugin): class TestUSMetarPlugin(test_plugin.TestPlugin): - def test_not_enabled_missing_aprs_fi_key(self): # When the aprs.fi api key isn't set, then # the LocationPlugin will be disabled. @@ -161,9 +158,9 @@ class TestUSMetarPlugin(test_plugin.TestPlugin): @mock.patch("aprsd.plugin_utils.get_weather_gov_metar") def test_airport_works(self, mock_metar): - class Response: text = '{"properties": {"rawMessage": "BOGUSMETAR"}}' + mock_metar.return_value = Response() CONF.aprs_fi.apiKey = "abc123" diff --git a/tests/test_packets.py b/tests/test_packets.py index 9fe7990..61d91da 100644 --- a/tests/test_packets.py +++ b/tests/test_packets.py @@ -11,7 +11,6 @@ from . import fake class TestPacketBase(unittest.TestCase): - def _fake_dict( self, from_call=fake.FAKE_FROM_CALLSIGN, @@ -79,7 +78,6 @@ class TestPacketBase(unittest.TestCase): @mock.patch("aprsd.packets.core.GPSPacket._build_time_zulu") def test_packet_format_rain_1h(self, mock_time_zulu): - mock_time_zulu.return_value = "221450" wx = packets.WeatherPacket( @@ -106,7 +104,9 @@ class TestPacketBase(unittest.TestCase): def test_beacon_factory(self): """Test to ensure a beacon packet is created.""" - packet_raw = "WB4BOR-12>APZ100,WIDE2-1:@161647z3724.15N107847.58W$ APRSD WebChat" + packet_raw = ( + "WB4BOR-12>APZ100,WIDE2-1:@161647z3724.15N107847.58W$ APRSD WebChat" + ) packet_dict = aprslib.parse(packet_raw) packet = packets.factory(packet_dict) self.assertIsInstance(packet, packets.BeaconPacket) @@ -162,7 +162,9 @@ class TestPacketBase(unittest.TestCase): # Packet with telemetry and DAO # http://www.aprs.org/datum.txt - packet_raw = 'KD9YIL>T0PX9W,WIDE1-1,WIDE2-1,qAO,NU9R-10:`sB,l#P>/\'"6+}|#*%U\'a|!whl!|3' + packet_raw = ( + "KD9YIL>T0PX9W,WIDE1-1,WIDE2-1,qAO,NU9R-10:`sB,l#P>/'\"6+}|#*%U'a|!whl!|3" + ) packet_dict = aprslib.parse(packet_raw) packet = packets.factory(packet_dict) self.assertIsInstance(packet, packets.MicEPacket) @@ -175,7 +177,9 @@ class TestPacketBase(unittest.TestCase): msgNo=123, ) - expected = f"{fake.FAKE_FROM_CALLSIGN}>APZ100::{fake.FAKE_TO_CALLSIGN:<9}:ack123" + expected = ( + f"{fake.FAKE_FROM_CALLSIGN}>APZ100::{fake.FAKE_TO_CALLSIGN:<9}:ack123" + ) self.assertEqual(expected, str(ack)) def test_reject_format(self): @@ -186,7 +190,9 @@ class TestPacketBase(unittest.TestCase): msgNo=123, ) - expected = f"{fake.FAKE_FROM_CALLSIGN}>APZ100::{fake.FAKE_TO_CALLSIGN:<9}:rej123" + expected = ( + f"{fake.FAKE_FROM_CALLSIGN}>APZ100::{fake.FAKE_TO_CALLSIGN:<9}:rej123" + ) self.assertEqual(expected, str(reject)) def test_beacon_format(self): @@ -240,7 +246,9 @@ class TestPacketBase(unittest.TestCase): bid=0, ) - expected = f"{fake.FAKE_FROM_CALLSIGN}>APZ100::BLN{bid:<9}:{packet.message_text}" + expected = ( + f"{fake.FAKE_FROM_CALLSIGN}>APZ100::BLN{bid:<9}:{packet.message_text}" + ) self.assertEqual(expected, str(packet)) # bulletin id = 1 diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 7e2cdab..def058f 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -3,20 +3,20 @@ from unittest import mock from oslo_config import cfg -from aprsd import conf # noqa: F401 -from aprsd import packets +from aprsd import ( + conf, # noqa: F401 + packets, + plugins, +) from aprsd import plugin as aprsd_plugin -from aprsd import plugins from aprsd.packets import core from . import fake - CONF = cfg.CONF class TestPluginManager(unittest.TestCase): - def setUp(self) -> None: self.fromcall = fake.FAKE_FROM_CALLSIGN self.config_and_init() @@ -82,7 +82,6 @@ class TestPluginManager(unittest.TestCase): class TestPlugin(unittest.TestCase): - def setUp(self) -> None: self.fromcall = fake.FAKE_FROM_CALLSIGN self.ack = 1 @@ -103,7 +102,6 @@ class TestPlugin(unittest.TestCase): class TestPluginBase(TestPlugin): - @mock.patch.object(fake.FakeBaseNoThreadsPlugin, "process") def test_base_plugin_no_threads(self, mock_process): p = fake.FakeBaseNoThreadsPlugin() diff --git a/tox.ini b/tox.ini index d0dd878..dec5424 100644 --- a/tox.ini +++ b/tox.ini @@ -2,7 +2,7 @@ minversion = 2.9.0 skipdist = True skip_missing_interpreters = true -envlist = pep8,py{310} +envlist = pep8,py{310,311} #requires = tox-pipenv # pip==22.0.4 # pip-tools==5.4.0 @@ -21,10 +21,9 @@ setenv = usedevelop = True install_command = pip install {opts} {packages} extras = tests -deps = coverage: coverage - -r{toxinidir}/requirements.txt - -r{toxinidir}/requirements-dev.txt - pytestmain: git+https://github.com/pytest-dev/pytest.git@main +deps = + pytest-cov + pytest commands = pytest -v --cov-report term-missing --cov=aprsd {posargs} coverage: coverage report -m @@ -43,6 +42,8 @@ commands = sphinx-build -a -W . _build [testenv:pep8] +deps = + flake8 commands = flake8 {posargs} aprsd tests @@ -57,9 +58,9 @@ passenv = FAST8_NUM_COMMITS [testenv:lint] skip_install = true deps = - -r{toxinidir}/requirements-dev.txt + ruff commands = - flake8 aprsd tests + ruff check aprsd tests [flake8] max-line-length = 99 @@ -74,25 +75,26 @@ exclude = .venv,.git,.tox,dist,doc,.ropeproject # This section is not needed if not using GitHub Actions for CI. [gh-actions] python = - 3.6: py36, pep8 - 3.7: py38, pep8 - 3.8: py38, pep8 3.9: py39, pep8, type-check, docs 3.10: py39, pep8, type-check, docs + 3.11: py311, pep8, type-check, docs [testenv:fmt] # This will reformat your code to comply with pep8 # and standard formatting skip_install = true deps = - -r{toxinidir}/requirements-dev.txt + ruff commands = - gray aprsd tests + ruff format aprsd tests [testenv:type-check] skip_install = true -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/requirements-dev.txt +deps = + mypy + types-pytz + types-requests + types-tzlocal commands = mypy --ignore-missing-imports --install-types aprsd From b1a830d54e9dec473074b34f9566f161bdec0030 Mon Sep 17 00:00:00 2001 From: Hemna Date: Fri, 3 Jan 2025 12:29:31 -0500 Subject: [PATCH 11/40] Changed README.rst -> README.md --- .pre-commit-config.yaml | 13 ++ CONTRIBUTING.md | 31 +++ README.rst => README.md | 425 ++++++++++++++++++---------------------- requirements.txt | 154 ++++++++++----- 4 files changed, 336 insertions(+), 287 deletions(-) create mode 100644 CONTRIBUTING.md rename README.rst => README.md (65%) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f506539..b2842ef 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,3 +26,16 @@ repos: args: ["check", "--select", "I", "--fix"] ###### Relevant part above ###### - id: ruff-format + +- repo: https://github.com/astral-sh/uv-pre-commit + # uv version. + rev: 0.5.11 + hooks: + # Compile requirements + - id: pip-compile + name: pip-compile requirements.in + args: [requirements.in, -o, requirements.txt] + - id: pip-compile + name: pip-compile requirements-dev.in + args: [requirements-dev.in, -o, requirements-dev.txt] + files: ^requirements-dev\.(in|txt)$ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..029200c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# CONTRIBUTING + +Code contributions are welcomed and appreciated. Just submit a PR! + +The current build environment uses `pre-commit`, and `uv`. + +### Environment setup: + +```console +pip install uv +uv venv +uv pip install pip-tools +git clone git@github.com:craigerl/aprsd.git +cd aprsd +pre-commit install + +# Optionally run the pre-commit scripts at any time +pre-commit run --all-files +``` + +### Running and testing: + +From the aprstastic directory: + +```console +cd aprsd +uv pip install -e . + +# Running +uv run aprsd +``` diff --git a/README.rst b/README.md similarity index 65% rename from README.rst rename to README.md index 401c1d5..403a806 100644 --- a/README.rst +++ b/README.md @@ -1,105 +1,115 @@ -=============================================== -APRSD - Ham radio APRS-IS Message plugin server -=============================================== +# APRSD - Ham radio APRS-IS Message plugin server -KM6LYW and WB4BOR -____________________ +## KM6LYW and WB4BOR -|pypi| |pytest| |versions| |slack| |issues| |commit| |imports| |down| +[![pypi](https://badge.fury.io/py/aprsd.svg)](https://badge.fury.io/py/aprsd) +[![pytest](https://github.com/craigerl/aprsd/workflows/python/badge.svg)](https://github.com/craigerl/aprsd/actions) +[![versions](https://img.shields.io/pypi/pyversions/aprsd.svg)](https://pypi.org/pypi/aprsd) +[![slack](https://img.shields.io/badge/slack-@hemna/aprsd-blue.svg?logo=slack)](https://hemna.slack.com/app_redirect?channel=C01KQSCP5RP) +![issues](https://img.shields.io/github/issues/craigerl/aprsd) +![commit](https://img.shields.io/github/last-commit/craigerl/aprsd) +[![imports](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://timothycrosley.github.io/isort/) +[![down](https://static.pepy.tech/personalized-badge/aprsd?period=month&units=international_system&left_color=black&right_color=orange&left_text=Downloads)](https://pepy.tech/project/aprsd) +[APRSD](http://github.com/craigerl/aprsd) is a Ham radio +[APRS](http://aprs.org) message command gateway built on python. -`APRSD `_ is a Ham radio `APRS `_ message command gateway built on python. +### Table of Contents +1. [What is APRSD](#what-is-aprsd) +2. [APRSD Overview Diagram](#aprsd-overview-diagram) +3. [Typical Use Case](#typical-use-case) +4. [Installation](#installation) +5. [Example Usage](#example-usage) +6. [Help](#help) +7. [Commands](#commands) + - [Configuration](#configuration) + - [Server](#server) + - [Current List of Built-in + Plugins](#current-list-of-built-in-plugins) + - [Pypi.org APRSD Installable Plugin + Packages](#pypiorg-aprsd-installable-plugin-packages) + - [🐍 APRSD Installed 3rd Party + Plugins](#aprsd-installed-3rd-party-plugins) + - [Send Message](#send-message) + - [Send Email (Radio to SMTP + Server)](#send-email-radio-to-smtp-server) + - [Receive Email (IMAP Server to + Radio)](#receive-email-imap-server-to-radio) + - [Location](#location) + - [Web Admin Interface](#web-admin-interface) +8. [Development](#development) + - [Building Your Own APRSD + Plugins](#building-your-own-aprsd-plugins) +9. [Workflow](#workflow) +10. [Release](#release) +11. [Docker Container](#docker-container) + - [Building](#building-1) + - [Official Build](#official-build) + - [Development Build](#development-build) + - [Running the Container](#running-the-container) -Table of Contents -================= +--- -1. `What is APRSD <#what-is-aprsd>`_ -2. `APRSD Overview Diagram <#aprsd-overview-diagram>`_ -3. `Typical Use Case <#typical-use-case>`_ -4. `Installation <#installation>`_ -5. `Example Usage <#example-usage>`_ -6. `Help <#help>`_ -7. `Commands <#commands>`_ - - `Configuration <#configuration>`_ - - `Server <#server>`_ - - `Current List of Built-in Plugins <#current-list-of-built-in-plugins>`_ - - `Pypi.org APRSD Installable Plugin Packages <#pypiorg-aprsd-installable-plugin-packages>`_ - - `🐍 APRSD Installed 3rd Party Plugins <#aprsd-installed-3rd-party-plugins>`_ - - `Send Message <#send-message>`_ - - `Send Email (Radio to SMTP Server) <#send-email-radio-to-smtp-server>`_ - - `Receive Email (IMAP Server to Radio) <#receive-email-imap-server-to-radio>`_ - - `Location <#location>`_ - - `Web Admin Interface <#web-admin-interface>`_ -8. `Development <#development>`_ - - `Building Your Own APRSD Plugins <#building-your-own-aprsd-plugins>`_ -9. `Workflow <#workflow>`_ -10. `Release <#release>`_ -11. `Docker Container <#docker-container>`_ - - `Building <#building-1>`_ - - `Official Build <#official-build>`_ - - `Development Build <#development-build>`_ - - `Running the Container <#running-the-container>`_ +> [!WARNING] +> Legal operation of this software requires an amateur radio license and a valid call sign. +> [!NOTE] +> Star this repo to follow our progress! This code is under active development, and contributions are both welcomed and appreciated. See [CONTRIBUTING.md]() for details. -What is APRSD -============= -APRSD is a python application for interacting with the APRS network and providing -APRS services for HAM radio operators. +### What is APRSD + +APRSD is a python application for interacting with the APRS network and +providing APRS services for HAM radio operators. APRSD currently has 4 main commands to use. - * server - Connect to APRS and listen/respond to APRS messages - * webchat - web based chat program over APRS - * send-message - Send a message to a callsign via APRS_IS. - * listen - Listen to packets on the APRS-IS Network based on FILTER. -Each of those commands can connect to the APRS-IS network if internet connectivity -is available. If internet is not available, then APRS can be configured to talk -to a TCP KISS TNC for radio connectivity. +: - server - Connect to APRS and listen/respond to APRS messages + - webchat - web based chat program over APRS + - send-message - Send a message to a callsign via APRS_IS. + - listen - Listen to packets on the APRS-IS Network based on + FILTER. -Please `read the docs`_ to learn more! +Each of those commands can connect to the APRS-IS network if internet +connectivity is available. If internet is not available, then APRS can +be configured to talk to a TCP KISS TNC for radio connectivity. -APRSD Overview Diagram -====================== +Please [read the docs](https://aprsd.readthedocs.io) to learn more! -.. image:: https://raw.githubusercontent.com/craigerl/aprsd/master/docs/_static/aprsd_overview.svg?sanitize=true +### APRSD Overview Diagram -Typical use case -================ +![image](https://raw.githubusercontent.com/craigerl/aprsd/master/docs/_static/aprsd_overview.svg?sanitize=true) -APRSD's typical use case is that of providing an APRS wide service to all HAM -radio operators. For example the callsign 'REPEAT' on the APRS network is actually -an instance of APRSD that can provide a list of HAM repeaters in the area of the -callsign that sent the message. +### Typical use case +APRSD\'s typical use case is that of providing an APRS wide service to +all HAM radio operators. For example the callsign \'REPEAT\' on the APRS +network is actually an instance of APRSD that can provide a list of HAM +repeaters in the area of the callsign that sent the message. -Ham radio operator using an APRS enabled HAM radio sends a message to check -the weather. An APRS message is sent, and then picked up by APRSD. The -APRS packet is decoded, and the message is sent through the list of plugins -for processing. For example, the WeatherPlugin picks up the message, fetches the weather -for the area around the user who sent the request, and then responds with -the weather conditions in that area. Also includes a watch list of HAM -callsigns to look out for. The watch list can notify you when a HAM callsign -in the list is seen and now available to message on the APRS network. +Ham radio operator using an APRS enabled HAM radio sends a message to +check the weather. An APRS message is sent, and then picked up by APRSD. +The APRS packet is decoded, and the message is sent through the list of +plugins for processing. For example, the WeatherPlugin picks up the +message, fetches the weather for the area around the user who sent the +request, and then responds with the weather conditions in that area. +Also includes a watch list of HAM callsigns to look out for. The watch +list can notify you when a HAM callsign in the list is seen and now +available to message on the APRS network. +### Installation +To install `aprsd`, use Pip: -Installation -============= +`pip install aprsd` -To install ``aprsd``, use Pip: +### Example usage -``pip install aprsd`` +`aprsd -h` -Example usage -============== - -``aprsd -h`` - -Help -==== -:: +### Help +: └─> aprsd -h Usage: aprsd [OPTIONS] COMMAND [ARGS]... @@ -123,29 +133,24 @@ Help version Show the APRSD version. webchat Web based HAM Radio chat program! +### Commands -Commands -======== +### Configuration -Configuration -============= -This command outputs a sample config yml formatted block that you can edit -and use to pass in to ``aprsd`` with ``-c``. By default aprsd looks in ``~/.config/aprsd/aprsd.yml`` +This command outputs a sample config yml formatted block that you can +edit and use to pass in to `aprsd` with `-c`. By default aprsd looks in +`~/.config/aprsd/aprsd.yml` -``aprsd sample-config`` - -:: +`aprsd sample-config` └─> aprsd sample-config ... -server -====== +### server This is the main server command that will listen to APRS-IS servers and -look for incomming commands to the callsign configured in the config file - -:: +look for incomming commands to the callsign configured in the config +file └─[$] > aprsd server --help Usage: aprsd server [OPTIONS] @@ -176,10 +181,7 @@ look for incomming commands to the callsign configured in the config file 12/07/2021 03:16:17 PM MainThread INFO aprs.port = 14580 server.py:60 12/07/2021 03:16:17 PM MainThread INFO aprs.logfile = /tmp/aprsd.log server.py:60 - -Current list of built-in plugins --------------------------------- -:: +#### Current list of built-in plugins └─> aprsd list-plugins 🐍 APRSD Built-in Plugins 🐍 @@ -226,15 +228,10 @@ Current list of built-in plugins │ aprsd-weewx-plugin │ WeewxMQTTPlugin │ 1.0 │ RegexCommand │ aprsd_weewx_plugin.weewx.WeewxMQTTPlugin │ └────────────────────┴─────────────────┴─────────┴──────────────┴──────────────────────────────────────────┘ +### send-message - -send-message -============ - -This command is typically used for development to send another aprsd instance -test messages - -:: +This command is typically used for development to send another aprsd +instance test messages └─[$] > aprsd send-message -h Usage: aprsd send-message [OPTIONS] TOCALLSIGN COMMAND... @@ -260,11 +257,7 @@ test messages --raw TEXT Send a raw message. Implies --no-ack -h, --help Show this message and exit. - -SEND EMAIL (radio to smtp server) -================================= - -:: +### SEND EMAIL (radio to smtp server) Received message______________ Raw : KM6XXX>APY400,WIDE1-1,qAO,KM6XXX-1::KM6XXX-9 :-user@host.com test new shortcuts global, radio to pc{29 @@ -282,11 +275,7 @@ SEND EMAIL (radio to smtp server) To : KM6XXX Ack number : 29 - -RECEIVE EMAIL (imap server to radio) -==================================== - -:: +### RECEIVE EMAIL (imap server to radio) Sending message_______________ 6(Tx3) Raw : KM6XXX-9>APRS::KM6XXX :-somebody@gmail.com email from internet to radio{6 @@ -299,11 +288,7 @@ RECEIVE EMAIL (imap server to radio) Message : ack6 Msg number : 0 - -LOCATION -======== - -:: +### LOCATION Received Message _______________ Raw : KM6XXX-6>APRS,TCPIP*,qAC,T2CAEAST::KM6XXX-14:location{2 @@ -325,178 +310,144 @@ LOCATION Ack : 2 Sending ack _______________ Complete -AND... ping, fortune, time..... +AND\... ping, fortune, time\..... +### Web Admin Interface -Web Admin Interface -=================== -APRSD has a web admin interface that allows you to view the status of the running APRSD server instance. -The web admin interface shows graphs of packet counts, packet types, number of threads running, the latest -packets sent and received, and the status of each of the plugins that are loaded. You can also view the logfile -and view the raw APRSD configuration file. +APRSD has a web admin interface that allows you to view the status of +the running APRSD server instance. The web admin interface shows graphs +of packet counts, packet types, number of threads running, the latest +packets sent and received, and the status of each of the plugins that +are loaded. You can also view the logfile and view the raw APRSD +configuration file. -To start the web admin interface, You have to install gunicorn in your virtualenv that already has aprsd installed. +To start the web admin interface, You have to install gunicorn in your +virtualenv that already has aprsd installed. -:: + source /bin/activate + aprsd admin --loglevel INFO - source /bin/activate - aprsd admin --loglevel INFO +The web admin interface will be running on port 8080 on the local +machine. -The web admin interface will be running on port 8080 on the local machine. http://localhost:8080 +### Development +- `git clone git@github.com:craigerl/aprsd.git` +- `cd aprsd` +- `make` -Development -=========== - -* ``git clone git@github.com:craigerl/aprsd.git`` -* ``cd aprsd`` -* ``make`` - -Workflow --------- +#### Workflow While working aprsd, The workflow is as follows: -* Checkout a new branch to work on by running +- Checkout a new branch to work on by running - ``git checkout -b mybranch`` + `git checkout -b mybranch` -* Make your changes to the code -* Run Tox with the following options: +- Make your changes to the code - - ``tox -epep8`` - - ``tox -efmt`` - - ``tox -p`` +- Run Tox with the following options: -* Commit your changes. This will run the pre-commit hooks which does checks too + - `tox -epep8` + - `tox -efmt` + - `tox -p` - ``git commit`` +- Commit your changes. This will run the pre-commit hooks which does + checks too -* Once you are done with all of your commits, then push up the branch to - github with: + `git commit` - ``git push -u origin mybranch`` +- Once you are done with all of your commits, then push up the branch + to github with: -* Create a pull request from your branch so github tests can run and we can do - a code review. + `git push -u origin mybranch` +- Create a pull request from your branch so github tests can run and + we can do a code review. -Release -------- +#### Release To do release to pypi: -* Tag release with: +- Tag release with: - ``git tag -v1.XX -m "New release"`` + `git tag -v1.XX -m "New release"` -* Push release tag: +- Push release tag: - ``git push origin master --tags`` + `git push origin master --tags` -* Do a test build and verify build is valid by running: +- Do a test build and verify build is valid by running: - ``make build`` + `make build` -* Once twine is happy, upload release to pypi: +- Once twine is happy, upload release to pypi: - ``make upload`` + `make upload` +#### Building your own APRSD plugins -Building your own APRSD plugins -------------------------------- +APRSD plugins are the mechanism by which APRSD can respond to APRS +Messages. The plugins are loaded at server startup and can also be +loaded at listen startup. When a packet is received by APRSD, it is +passed to each of the plugins in the order they were registered in the +config file. The plugins can then decide what to do with the packet. +When a plugin is called, it is passed a APRSD Packet object. The plugin +can then do something with the packet and return a reply message if +desired. If a plugin does not want to reply to the packet, it can just +return None. When a plugin does return a reply message, APRSD will send +the reply message to the appropriate destination. -APRSD plugins are the mechanism by which APRSD can respond to APRS Messages. The plugins are loaded at server startup -and can also be loaded at listen startup. When a packet is received by APRSD, it is passed to each of the plugins -in the order they were registered in the config file. The plugins can then decide what to do with the packet. -When a plugin is called, it is passed a APRSD Packet object. The plugin can then do something with the packet and -return a reply message if desired. If a plugin does not want to reply to the packet, it can just return None. -When a plugin does return a reply message, APRSD will send the reply message to the appropriate destination. +For example, when a \'ping\' message is received, the PingPlugin will +return a reply message of \'pong\'. When APRSD receives the \'pong\' +message, it will be sent back to the original caller of the ping +message. -For example, when a 'ping' message is received, the PingPlugin will return a reply message of 'pong'. When APRSD -receives the 'pong' message, it will be sent back to the original caller of the ping message. +APRSD plugins are simply python packages that can be installed from +pypi.org. They are installed into the aprsd virtualenv and can be +imported by APRSD at runtime. The plugins are registered in the config +file and loaded at startup of the aprsd server command or the aprsd +listen command. -APRSD plugins are simply python packages that can be installed from pypi.org. They are installed into the -aprsd virtualenv and can be imported by APRSD at runtime. The plugins are registered in the config file and loaded -at startup of the aprsd server command or the aprsd listen command. +#### Overview -Overview --------- -You can build your own plugins by following the instructions in the `Building your own APRSD plugins`_ section. +You can build your own plugins by following the instructions in the +[Building your own APRSD plugins](#building-your-own-aprsd-plugins) +section. Plugins are called by APRSD when packe -Docker Container -================ +### Docker Container -Building -======== +### Building -There are 2 versions of the container Dockerfile that can be used. -The main Dockerfile, which is for building the official release container +There are 2 versions of the container Dockerfile that can be used. The +main Dockerfile, which is for building the official release container based off of the pip install version of aprsd and the Dockerfile-dev, -which is used for building a container based off of a git branch of -the repo. +which is used for building a container based off of a git branch of the +repo. -Official Build -============== +### Official Build -``docker build -t hemna6969/aprsd:latest .`` +`docker build -t hemna6969/aprsd:latest .` -Development Build -================= +### Development Build -``docker build -t hemna6969/aprsd:latest -f Dockerfile-dev .`` +`docker build -t hemna6969/aprsd:latest -f Dockerfile-dev .` +### Running the container -Running the container -===================== +There is a `docker-compose.yml` file in the `docker/` directory that can +be used to run your container. To provide the container an `aprsd.conf` +configuration file, change your `docker-compose.yml` as shown below: -There is a ``docker-compose.yml`` file in the ``docker/`` directory -that can be used to run your container. To provide the container -an ``aprsd.conf`` configuration file, change your -``docker-compose.yml`` as shown below: - -:: - - volumes: - - $HOME/.config/aprsd:/config + volumes: + - $HOME/.config/aprsd:/config To install plugins at container start time, pass in a list of -comma-separated list of plugins on PyPI using the ``APRSD_PLUGINS`` -environment variable in the ``docker-compose.yml`` file. Note that -version constraints may also be provided. For example: - -:: +comma-separated list of plugins on PyPI using the `APRSD_PLUGINS` +environment variable in the `docker-compose.yml` file. Note that version +constraints may also be provided. For example: environment: - APRSD_PLUGINS=aprsd-slack-plugin>=1.0.2,aprsd-twitter-plugin - - -.. badges - -.. |pypi| image:: https://badge.fury.io/py/aprsd.svg - :target: https://badge.fury.io/py/aprsd - -.. |pytest| image:: https://github.com/craigerl/aprsd/workflows/python/badge.svg - :target: https://github.com/craigerl/aprsd/actions - -.. |versions| image:: https://img.shields.io/pypi/pyversions/aprsd.svg - :target: https://pypi.org/pypi/aprsd - -.. |slack| image:: https://img.shields.io/badge/slack-@hemna/aprsd-blue.svg?logo=slack - :target: https://hemna.slack.com/app_redirect?channel=C01KQSCP5RP - -.. |imports| image:: https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336 - :target: https://timothycrosley.github.io/isort/ - -.. |issues| image:: https://img.shields.io/github/issues/craigerl/aprsd - -.. |commit| image:: https://img.shields.io/github/last-commit/craigerl/aprsd - -.. |down| image:: https://static.pepy.tech/personalized-badge/aprsd?period=month&units=international_system&left_color=black&right_color=orange&left_text=Downloads - :target: https://pepy.tech/project/aprsd - -.. links -.. _read the docs: - https://aprsd.readthedocs.io diff --git a/requirements.txt b/requirements.txt index e79dde2..cc2a453 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,50 +1,104 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --annotation-style=line requirements.in -# -aprslib==0.7.2 # via -r requirements.in -attrs==24.3.0 # via ax253, kiss3, rush -ax253==0.1.5.post1 # via kiss3 -beautifulsoup4==4.12.3 # via -r requirements.in -bitarray==3.0.0 # via ax253, kiss3 -certifi==2024.12.14 # via requests -charset-normalizer==3.4.0 # via requests -click==8.1.7 # via -r requirements.in -commonmark==0.9.1 # via rich -dataclasses-json==0.6.7 # via -r requirements.in -debtcollector==3.0.0 # via oslo-config -haversine==2.9.0 # via -r requirements.in -idna==3.10 # via requests -importlib-metadata==8.5.0 # via ax253, kiss3 -kiss3==8.0.0 # via -r requirements.in -loguru==0.7.3 # via -r requirements.in -marshmallow==3.23.2 # via dataclasses-json -mypy-extensions==1.0.0 # via typing-inspect -netaddr==1.3.0 # via oslo-config -oslo-config==9.7.0 # via -r requirements.in -oslo-i18n==6.5.0 # via oslo-config -packaging==24.2 # via marshmallow -pbr==6.1.0 # via oslo-i18n, stevedore -pluggy==1.5.0 # via -r requirements.in -pygments==2.18.0 # via rich -pyserial==3.5 # via pyserial-asyncio -pyserial-asyncio==0.6 # via kiss3 -pytz==2024.2 # via -r requirements.in -pyyaml==6.0.2 # via oslo-config -requests==2.32.3 # via -r requirements.in, oslo-config, update-checker -rfc3986==2.0.0 # via oslo-config -rich==12.6.0 # via -r requirements.in -rush==2021.4.0 # via -r requirements.in -soupsieve==2.6 # via beautifulsoup4 -stevedore==5.4.0 # via oslo-config -thesmuggler==1.0.1 # via -r requirements.in -timeago==1.0.16 # via -r requirements.in -typing-extensions==4.12.2 # via typing-inspect -typing-inspect==0.9.0 # via dataclasses-json -tzlocal==5.2 # via -r requirements.in -update-checker==0.18.0 # via -r requirements.in -urllib3==2.2.3 # via requests -wrapt==1.17.0 # via -r requirements.in, debtcollector -zipp==3.21.0 # via importlib-metadata +# This file was autogenerated by uv via the following command: +# uv pip compile requirements.in -o requirements.txt +aprslib==0.7.2 + # via -r requirements.in +attrs==24.3.0 + # via + # ax253 + # kiss3 + # rush +ax253==0.1.5.post1 + # via kiss3 +beautifulsoup4==4.12.3 + # via -r requirements.in +bitarray==3.0.0 + # via + # ax253 + # kiss3 +certifi==2024.12.14 + # via requests +charset-normalizer==3.4.1 + # via requests +click==8.1.8 + # via -r requirements.in +commonmark==0.9.1 + # via rich +dataclasses-json==0.6.7 + # via -r requirements.in +debtcollector==3.0.0 + # via oslo-config +haversine==2.9.0 + # via -r requirements.in +idna==3.10 + # via requests +importlib-metadata==8.5.0 + # via + # ax253 + # kiss3 +kiss3==8.0.0 + # via -r requirements.in +loguru==0.7.3 + # via -r requirements.in +marshmallow==3.23.2 + # via dataclasses-json +mypy-extensions==1.0.0 + # via typing-inspect +netaddr==1.3.0 + # via oslo-config +oslo-config==9.7.0 + # via -r requirements.in +oslo-i18n==6.5.0 + # via oslo-config +packaging==24.2 + # via marshmallow +pbr==6.1.0 + # via + # oslo-i18n + # stevedore +pluggy==1.5.0 + # via -r requirements.in +pygments==2.18.0 + # via rich +pyserial==3.5 + # via pyserial-asyncio +pyserial-asyncio==0.6 + # via kiss3 +pytz==2024.2 + # via -r requirements.in +pyyaml==6.0.2 + # via oslo-config +requests==2.32.3 + # via + # -r requirements.in + # oslo-config + # update-checker +rfc3986==2.0.0 + # via oslo-config +rich==12.6.0 + # via -r requirements.in +rush==2021.4.0 + # via -r requirements.in +soupsieve==2.6 + # via beautifulsoup4 +stevedore==5.4.0 + # via oslo-config +thesmuggler==1.0.1 + # via -r requirements.in +timeago==1.0.16 + # via -r requirements.in +typing-extensions==4.12.2 + # via typing-inspect +typing-inspect==0.9.0 + # via dataclasses-json +tzlocal==5.2 + # via -r requirements.in +update-checker==0.18.0 + # via -r requirements.in +urllib3==2.3.0 + # via requests +wrapt==1.17.0 + # via + # -r requirements.in + # debtcollector +zipp==3.21.0 + # via importlib-metadata From ec1adf418203fc7d1a8fb175a075c73fa27d772b Mon Sep 17 00:00:00 2001 From: Hemna Date: Fri, 3 Jan 2025 16:52:10 -0500 Subject: [PATCH 12/40] fixed list-plugins This patch fixes the list-plugins and list-extensions. Pypi changed their search page to require javascript, which breaks python scripts.... --- aprsd/cmds/healthcheck.py | 4 +- aprsd/cmds/list_plugins.py | 106 ++++++++++++++++++----------------- requirements.in | 2 - requirements.txt | 6 +- tests/plugins/test_notify.py | 4 +- tests/test_plugin.py | 4 +- 6 files changed, 62 insertions(+), 64 deletions(-) diff --git a/aprsd/cmds/healthcheck.py b/aprsd/cmds/healthcheck.py index feec6d0..8820fc7 100644 --- a/aprsd/cmds/healthcheck.py +++ b/aprsd/cmds/healthcheck.py @@ -13,9 +13,9 @@ from oslo_config import cfg from rich.console import Console import aprsd -from aprsd import ( +from aprsd import ( # noqa: F401 cli_helper, - conf, # noqa + conf, ) # local imports here diff --git a/aprsd/cmds/list_plugins.py b/aprsd/cmds/list_plugins.py index 82507c9..75b7256 100644 --- a/aprsd/cmds/list_plugins.py +++ b/aprsd/cmds/list_plugins.py @@ -4,10 +4,8 @@ import inspect import logging import os import pkgutil -import re import sys from traceback import print_tb -from urllib.parse import urljoin import click import requests @@ -162,13 +160,15 @@ def show_built_in_plugins(console): console.print(table) -def _get_pypi_packages(): +def _get_pypi_packages_OLD(): query = "aprsd" snippets = [] s = requests.Session() + c = Console() for page in range(1, 3): params = {"q": query, "page": page} r = s.get(PYPI_URL, params=params) + c.print(f"r = {r.text}") soup = BeautifulSoup(r.text, "html.parser") snippets += soup.select('a[class*="snippet"]') if not hasattr(s, "start_url"): @@ -177,8 +177,34 @@ def _get_pypi_packages(): return snippets +def _get_pypi_packages(): + if simple_r := requests.get( + "https://pypi.org/simple", + headers={"Accept": "application/vnd.pypi.simple.v1+json"}, + ): + simple_response = simple_r.json() + else: + simple_response = {} + + key = "aprsd" + matches = [ + p["name"] for p in simple_response["projects"] if p["name"].startswith(key) + ] + + packages = [] + for pkg in matches: + # Get info for first match + if r := requests.get( + f"https://pypi.org/pypi/{pkg}/json", + headers={"Accept": "application/json"}, + ): + packages.append(r.json()) + + return packages + + def show_pypi_plugins(installed_plugins, console): - snippets = _get_pypi_packages() + packages = _get_pypi_packages() title = Text.assemble( ("Pypi.org APRSD Installable Plugin Packages\n\n", "bold magenta"), @@ -193,33 +219,21 @@ def show_pypi_plugins(installed_plugins, console): table.add_column("Version", style="yellow", justify="center") table.add_column("Released", style="bold green", justify="center") table.add_column("Installed?", style="red", justify="center") - for snippet in snippets: - link = urljoin(PYPI_URL, snippet.get("href")) - package = re.sub( - r"\s+", " ", snippet.select_one('span[class*="name"]').text.strip() - ) - version = re.sub( - r"\s+", " ", snippet.select_one('span[class*="version"]').text.strip() - ) - created = re.sub( - r"\s+", " ", snippet.select_one('span[class*="created"]').text.strip() - ) - description = re.sub( - r"\s+", " ", snippet.select_one('p[class*="description"]').text.strip() - ) - emoji = ":open_file_folder:" + emoji = ":open_file_folder:" + for package in packages: + link = package["info"]["package_url"] + version = package["info"]["version"] + package_name = package["info"]["name"] + description = package["info"]["summary"] + created = package["releases"][version][0]["upload_time"] - if "aprsd-" not in package or "-plugin" not in package: + if "aprsd-" not in package_name or "-plugin" not in package_name: continue - under = package.replace("-", "_") - if under in installed_plugins: - installed = "Yes" - else: - installed = "No" - + under = package_name.replace("-", "_") + installed = "Yes" if under in installed_plugins else "No" table.add_row( - f"[link={link}]{emoji}[/link] {package}", + f"[link={link}]{emoji}[/link] {package_name}", description, version, created, @@ -231,7 +245,7 @@ def show_pypi_plugins(installed_plugins, console): def show_pypi_extensions(installed_extensions, console): - snippets = _get_pypi_packages() + packages = _get_pypi_packages() title = Text.assemble( ("Pypi.org APRSD Installable Extension Packages\n\n", "bold magenta"), @@ -245,33 +259,21 @@ def show_pypi_extensions(installed_extensions, console): table.add_column("Version", style="yellow", justify="center") table.add_column("Released", style="bold green", justify="center") table.add_column("Installed?", style="red", justify="center") - for snippet in snippets: - link = urljoin(PYPI_URL, snippet.get("href")) - package = re.sub( - r"\s+", " ", snippet.select_one('span[class*="name"]').text.strip() - ) - version = re.sub( - r"\s+", " ", snippet.select_one('span[class*="version"]').text.strip() - ) - created = re.sub( - r"\s+", " ", snippet.select_one('span[class*="created"]').text.strip() - ) - description = re.sub( - r"\s+", " ", snippet.select_one('p[class*="description"]').text.strip() - ) - emoji = ":open_file_folder:" + emoji = ":open_file_folder:" - if "aprsd-" not in package or "-extension" not in package: + for package in packages: + link = package["info"]["package_url"] + version = package["info"]["version"] + package_name = package["info"]["name"] + description = package["info"]["summary"] + created = package["releases"][version][0]["upload_time"] + if "aprsd-" not in package_name or "-extension" not in package_name: continue - under = package.replace("-", "_") - if under in installed_extensions: - installed = "Yes" - else: - installed = "No" - + under = package_name.replace("-", "_") + installed = "Yes" if under in installed_extensions else "No" table.add_row( - f"[link={link}]{emoji}[/link] {package}", + f"[link={link}]{emoji}[/link] {package_name}", description, version, created, @@ -337,5 +339,7 @@ def list_extensions(ctx): with console.status("Show APRSD Extensions") as status: status.update("Fetching pypi.org APRSD Extensions") + + status.update("Looking for installed APRSD Extensions") installed_extensions = get_installed_extensions() show_pypi_extensions(installed_extensions, console) diff --git a/requirements.in b/requirements.in index ca989ed..5c2cddf 100644 --- a/requirements.in +++ b/requirements.in @@ -1,6 +1,4 @@ aprslib>=0.7.0 -# For the list-plugins pypi.org search scraping -beautifulsoup4 click dataclasses-json haversine diff --git a/requirements.txt b/requirements.txt index cc2a453..4d4f2d0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,8 +9,6 @@ attrs==24.3.0 # rush ax253==0.1.5.post1 # via kiss3 -beautifulsoup4==4.12.3 - # via -r requirements.in bitarray==3.0.0 # via # ax253 @@ -39,7 +37,7 @@ kiss3==8.0.0 # via -r requirements.in loguru==0.7.3 # via -r requirements.in -marshmallow==3.23.2 +marshmallow==3.23.3 # via dataclasses-json mypy-extensions==1.0.0 # via typing-inspect @@ -78,8 +76,6 @@ rich==12.6.0 # via -r requirements.in rush==2021.4.0 # via -r requirements.in -soupsieve==2.6 - # via beautifulsoup4 stevedore==5.4.0 # via oslo-config thesmuggler==1.0.1 diff --git a/tests/plugins/test_notify.py b/tests/plugins/test_notify.py index ed1c81d..4cb2638 100644 --- a/tests/plugins/test_notify.py +++ b/tests/plugins/test_notify.py @@ -2,9 +2,9 @@ from unittest import mock from oslo_config import cfg -from aprsd import ( +from aprsd import ( # noqa: F401 client, - conf, # noqa: F401 + conf, packets, ) from aprsd.plugins import notify as notify_plugin diff --git a/tests/test_plugin.py b/tests/test_plugin.py index def058f..636a245 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -3,8 +3,8 @@ from unittest import mock from oslo_config import cfg -from aprsd import ( - conf, # noqa: F401 +from aprsd import ( # noqa: F401 + conf, packets, plugins, ) From fd74405b5fb2ec3d0b432e95d715a8934d76dcd8 Mon Sep 17 00:00:00 2001 From: Hemna Date: Mon, 6 Jan 2025 17:13:40 -0500 Subject: [PATCH 13/40] Updated README.md --- README.md | 181 ++++++++++++++++++++++-------------------------------- 1 file changed, 73 insertions(+), 108 deletions(-) diff --git a/README.md b/README.md index 403a806..a339eb8 100644 --- a/README.md +++ b/README.md @@ -64,11 +64,15 @@ providing APRS services for HAM radio operators. APRSD currently has 4 main commands to use. -: - server - Connect to APRS and listen/respond to APRS messages - - webchat - web based chat program over APRS - - send-message - Send a message to a callsign via APRS_IS. - - listen - Listen to packets on the APRS-IS Network based on - FILTER. + - server - Connect to APRS and listen/respond to APRS messages + - send-message - Send a message to a callsign via APRS_IS. + - listen - Listen to packets on the APRS-IS Network based on FILTER. + - check-version - check the version of aprsd + - sample-config - generate a sample config file + - dev - helpful for testing new aprsd plugins under development + - dump-stats - output the stats of a running aprsd server command + - list-plugins - list the built in plugins, available plugins on pypi.org and installed plugins + - list-extensions - list the available extensions on pypi.org and installed extensions Each of those commands can connect to the APRS-IS network if internet connectivity is available. If internet is not available, then APRS can @@ -76,6 +80,13 @@ be configured to talk to a TCP KISS TNC for radio connectivity. Please [read the docs](https://aprsd.readthedocs.io) to learn more! + +### APRSD Plugins/Extensions + +APRSD Has the ability to add plugins and extensions. Plugins add new message filters that can look for specific messages and respond. For example, the aprsd-email-plugin adds the ability to send/recieve email to/from an APRS callsign. Extensions add new unique capabilities to APRSD itself. For example the aprsd-admin-extension adds a web interface command that shows the running status of the aprsd server command. aprsd-webchat-extension is a new web based APRS 'chat' command. + +You can see the [available plugins/extensions on pypi here:](https://pypi.org/search/?q=aprsd) [https://pypi.org/search/?q=aprsd](https://pypi.org/search/?q=aprsd) + ### APRSD Overview Diagram ![image](https://raw.githubusercontent.com/craigerl/aprsd/master/docs/_static/aprsd_overview.svg?sanitize=true) @@ -170,32 +181,32 @@ file -h, --help Show this message and exit. └─> aprsd server - Load config - 12/07/2021 03:16:17 PM MainThread INFO APRSD is up to date server.py:51 - 12/07/2021 03:16:17 PM MainThread INFO APRSD Started version: 2.5.6 server.py:52 - 12/07/2021 03:16:17 PM MainThread INFO Using CONFIG values: server.py:55 - 12/07/2021 03:16:17 PM MainThread INFO ham.callsign = WB4BOR server.py:60 - 12/07/2021 03:16:17 PM MainThread INFO aprs.login = WB4BOR-12 server.py:60 - 12/07/2021 03:16:17 PM MainThread INFO aprs.password = XXXXXXXXXXXXXXXXXXX server.py:58 - 12/07/2021 03:16:17 PM MainThread INFO aprs.host = noam.aprs2.net server.py:60 - 12/07/2021 03:16:17 PM MainThread INFO aprs.port = 14580 server.py:60 - 12/07/2021 03:16:17 PM MainThread INFO aprs.logfile = /tmp/aprsd.log server.py:60 + Registering LogMonitorThread + 2025-01-06 16:27:12.398 | MainThread | INFO | APRSD is up to date | aprsd.cmds.server:server:82 + 2025-01-06 16:27:12.398 | MainThread | INFO | APRSD Started version: 3.5.1.dev0+g72d068c.d20250102 | aprsd.cmds.server:server:83 + 2025-01-06 16:27:12.398 | MainThread | INFO | Creating client connection | aprsd.cmds.server:server:101 + 2025-01-06 16:27:12.398 | MainThread | INFO | Creating aprslib client(noam.aprs2.net:14580) and logging in WB4BOR-1. | aprsd.client.aprsis:setup_connection:136 + 2025-01-06 16:27:12.398 | MainThread | INFO | Attempting connection to noam.aprs2.net:14580 | aprslib.inet:_connect:226 + 2025-01-06 16:27:12.473 | MainThread | INFO | Connected to ('44.135.208.225', 14580) | aprslib.inet:_connect:233 + 2025-01-06 16:27:12.617 | MainThread | INFO | Login successful | aprsd.client.drivers.aprsis:_send_login:154 + 2025-01-06 16:27:12.618 | MainThread | INFO | Connected to T2BC | aprsd.client.drivers.aprsis:_send_login:156 + 2025-01-06 16:27:12.618 | MainThread | INFO | | aprsd.cmds.server:server:103 + 2025-01-06 16:27:12.618 | MainThread | INFO | Loading Plugin Manager and registering plugins | aprsd.cmds.server:server:117 + 2025-01-06 16:27:12.619 | MainThread | INFO | Loading APRSD Plugins | aprsd.plugin:setup_plugins:492 -#### Current list of built-in plugins + +#### Current list plugins └─> aprsd list-plugins - 🐍 APRSD Built-in Plugins 🐍 + 🐍 APRSD Built-in Plugins 🐍 ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Plugin Name ┃ Info ┃ Type ┃ Plugin Path ┃ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ AVWXWeatherPlugin │ AVWX weather of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.AVWXWeatherPlugin │ - │ EmailPlugin │ Send and Receive email │ RegexCommand │ aprsd.plugins.email.EmailPlugin │ │ FortunePlugin │ Give me a fortune │ RegexCommand │ aprsd.plugins.fortune.FortunePlugin │ - │ LocationPlugin │ Where in the world is a CALLSIGN's last GPS beacon? │ RegexCommand │ aprsd.plugins.location.LocationPlugin │ │ NotifySeenPlugin │ Notify me when a CALLSIGN is recently seen on APRS-IS │ WatchList │ aprsd.plugins.notify.NotifySeenPlugin │ │ OWMWeatherPlugin │ OpenWeatherMap weather of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.OWMWeatherPlugin │ │ PingPlugin │ reply with a Pong! │ RegexCommand │ aprsd.plugins.ping.PingPlugin │ - │ QueryPlugin │ APRSD Owner command to query messages in the MsgTrack │ RegexCommand │ aprsd.plugins.query.QueryPlugin │ │ TimeOWMPlugin │ Current time of GPS beacon's timezone. Uses OpenWeatherMap │ RegexCommand │ aprsd.plugins.time.TimeOWMPlugin │ │ TimePlugin │ What is the current local time. │ RegexCommand │ aprsd.plugins.time.TimePlugin │ │ USMetarPlugin │ USA only METAR of GPS Beacon location │ RegexCommand │ aprsd.plugins.weather.USMetarPlugin │ @@ -206,28 +217,55 @@ file Pypi.org APRSD Installable Plugin Packages - Install any of the following plugins with 'pip install ' - ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓ - ┃ Plugin Package Name ┃ Description ┃ Version ┃ Released ┃ Installed? ┃ - ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩ - │ 📂 aprsd-stock-plugin │ Ham Radio APRSD Plugin for fetching stock quotes │ 0.1.3 │ Dec 2, 2022 │ No │ - │ 📂 aprsd-sentry-plugin │ Ham radio APRSD plugin that does.... │ 0.1.2 │ Dec 2, 2022 │ No │ - │ 📂 aprsd-timeopencage-plugin │ APRSD plugin for fetching time based on GPS location │ 0.1.0 │ Dec 2, 2022 │ No │ - │ 📂 aprsd-weewx-plugin │ HAM Radio APRSD that reports weather from a weewx weather station. │ 0.1.4 │ Dec 7, 2021 │ Yes │ - │ 📂 aprsd-repeat-plugins │ APRSD Plugins for the REPEAT service │ 1.0.12 │ Dec 2, 2022 │ No │ - │ 📂 aprsd-telegram-plugin │ Ham Radio APRS APRSD plugin for Telegram IM service │ 0.1.3 │ Dec 2, 2022 │ No │ - │ 📂 aprsd-twitter-plugin │ Python APRSD plugin to send tweets │ 0.3.0 │ Dec 7, 2021 │ No │ - │ 📂 aprsd-slack-plugin │ Amateur radio APRS daemon which listens for messages and responds │ 1.0.5 │ Dec 18, 2022 │ No │ - └──────────────────────────────┴────────────────────────────────────────────────────────────────────┴─────────┴──────────────┴────────────┘ + Install any of the following plugins with + 'pip install ' + ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓ + ┃ Plugin Package Name ┃ Description ┃ Version ┃ Released ┃ Installed? ┃ + ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩ + │ 📂 aprsd-assistant-plugin │ APRSd plugin for hosting the APRS Assistant chatbot │ 0.0.3 │ 2024-10-20T02:59:39 │ No │ + │ │ (aprs-assistant) │ │ │ │ + │ 📂 aprsd-borat-plugin │ Borat quotes for aprsd plugin │ 0.1.1.dev1 │ 2024-01-19T16:04:38 │ No │ + │ 📂 aprsd-locationdata-plugin │ Fetch location information from a callsign │ 0.3.0 │ 2024-02-06T17:20:43 │ No │ + │ 📂 aprsd-mqtt-plugin │ APRSD MQTT Plugin sends APRS packets to mqtt queue │ 0.2.0 │ 2023-04-17T16:01:50 │ No │ + │ 📂 aprsd-repeat-plugins │ APRSD Plugins for the REPEAT service │ 1.2.0 │ 2023-01-10T17:15:36 │ No │ + │ 📂 aprsd-sentry-plugin │ Ham radio APRSD plugin that does.... │ 0.1.2 │ 2022-12-02T19:07:33 │ No │ + │ 📂 aprsd-slack-plugin │ Amateur radio APRS daemon which listens for messages and │ 1.2.0 │ 2023-01-10T19:21:33 │ No │ + │ │ responds │ │ │ │ + │ 📂 aprsd-stock-plugin │ Ham Radio APRSD Plugin for fetching stock quotes │ 0.1.3 │ 2022-12-02T18:56:19 │ Yes │ + │ 📂 aprsd-telegram-plugin │ Ham Radio APRS APRSD plugin for Telegram IM service │ 0.1.3 │ 2022-12-02T19:07:15 │ No │ + │ 📂 aprsd-timeopencage-plugin │ APRSD plugin for fetching time based on GPS location │ 0.2.0 │ 2023-01-10T17:07:11 │ No │ + │ 📂 aprsd-twitter-plugin │ Python APRSD plugin to send tweets │ 0.5.0 │ 2023-01-10T16:51:47 │ No │ + │ 📂 aprsd-weewx-plugin │ HAM Radio APRSD that reports weather from a weewx weather │ 0.3.2 │ 2023-04-20T20:16:19 │ No │ + │ │ station. │ │ │ │ + │ 📂 aprsd-wxnow-plugin │ APRSD Plugin for getting the closest wx reports to last │ 0.2.0 │ 2023-10-08T01:27:29 │ Yes │ + │ │ beacon │ │ │ │ + └──────────────────────────────┴──────────────────────────────────────────────────────────────┴────────────┴─────────────────────┴────────────┘ - 🐍 APRSD Installed 3rd party Plugins 🐍 + 🐍 APRSD Installed 3rd party Plugins 🐍 ┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Package Name ┃ Plugin Name ┃ Version ┃ Type ┃ Plugin Path ┃ ┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ - │ aprsd-weewx-plugin │ WeewxMQTTPlugin │ 1.0 │ RegexCommand │ aprsd_weewx_plugin.weewx.WeewxMQTTPlugin │ + │ aprsd-stock-plugin │ YahooStockQuote │ 0.1.3 │ RegexCommand │ aprsd_stock_plugin.stock.YahooStockQuote │ + │ aprsd-wxnow-plugin │ WXNowPlugin │ 0.2.0 │ RegexCommand │ aprsd_wxnow_plugin.conf.opts.WXNowPlugin │ └────────────────────┴─────────────────┴─────────┴──────────────┴──────────────────────────────────────────┘ +#### Current list extensions + └─> aprsd list-extensions + + + Pypi.org APRSD Installable Extension Packages + + Install any of the following extensions by running + 'pip install ' + ┏━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓ + ┃ Extension Package Name ┃ Description ┃ Version ┃ Released ┃ Installed? ┃ + ┡━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩ + │ 📂 aprsd-admin-extension │ Administration extension for the Ham radio APRSD Server │ 1.0.1 │ 2025-01-06T21:57:24 │ Yes │ + │ 📂 aprsd-irc-extension │ An Extension to Ham radio APRSD Daemon to act like an irc server │ 0.0.5 │ 2024-04-09T11:28:47 │ No │ + │ │ for APRS │ │ │ │ + └──────────────────────────┴─────────────────────────────────────────────────────────────────────┴─────────┴─────────────────────┴────────────┘ + ### send-message This command is typically used for development to send another aprsd @@ -257,79 +295,6 @@ instance test messages --raw TEXT Send a raw message. Implies --no-ack -h, --help Show this message and exit. -### SEND EMAIL (radio to smtp server) - - Received message______________ - Raw : KM6XXX>APY400,WIDE1-1,qAO,KM6XXX-1::KM6XXX-9 :-user@host.com test new shortcuts global, radio to pc{29 - From : KM6XXX - Message : -user@host.com test new shortcuts global, radio to pc - Msg number : 29 - - Sending Email_________________ - To : user@host.com - Subject : KM6XXX - Body : test new shortcuts global, radio to pc - - Sending ack __________________ Tx(3) - Raw : KM6XXX-9>APRS::KM6XXX :ack29 - To : KM6XXX - Ack number : 29 - -### RECEIVE EMAIL (imap server to radio) - - Sending message_______________ 6(Tx3) - Raw : KM6XXX-9>APRS::KM6XXX :-somebody@gmail.com email from internet to radio{6 - To : KM6XXX - Message : -somebody@gmail.com email from internet to radio - - Received message______________ - Raw : KM6XXX>APY400,WIDE1-1,qAO,KM6XXX-1::KM6XXX-9 :ack6 - From : KM6XXX - Message : ack6 - Msg number : 0 - -### LOCATION - - Received Message _______________ - Raw : KM6XXX-6>APRS,TCPIP*,qAC,T2CAEAST::KM6XXX-14:location{2 - From : KM6XXX-6 - Message : location - Msg number : 2 - Received Message _______________ Complete - - Sending Message _______________ - Raw : KM6XXX-14>APRS::KM6XXX-6 :KM6XXX-6: 8 Miles E Auburn CA 0' 0,-120.93584 1873.7h ago{2 - To : KM6XXX-6 - Message : KM6XXX-6: 8 Miles E Auburn CA 0' 0,-120.93584 1873.7h ago - Msg number : 2 - Sending Message _______________ Complete - - Sending ack _______________ - Raw : KM6XXX-14>APRS::KM6XXX-6 :ack2 - To : KM6XXX-6 - Ack : 2 - Sending ack _______________ Complete - -AND\... ping, fortune, time\..... - -### Web Admin Interface - -APRSD has a web admin interface that allows you to view the status of -the running APRSD server instance. The web admin interface shows graphs -of packet counts, packet types, number of threads running, the latest -packets sent and received, and the status of each of the plugins that -are loaded. You can also view the logfile and view the raw APRSD -configuration file. - -To start the web admin interface, You have to install gunicorn in your -virtualenv that already has aprsd installed. - - source /bin/activate - aprsd admin --loglevel INFO - -The web admin interface will be running on port 8080 on the local -machine. - ### Development - `git clone git@github.com:craigerl/aprsd.git` From df14eb8f288aa8cd8cab9b9263ca64093bb63c34 Mon Sep 17 00:00:00 2001 From: Hemna Date: Mon, 6 Jan 2025 17:14:01 -0500 Subject: [PATCH 14/40] updated workflow --- .github/workflows/master-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/master-build.yml b/.github/workflows/master-build.yml index 2210b30..1ca87eb 100644 --- a/.github/workflows/master-build.yml +++ b/.github/workflows/master-build.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} From 5274c5dc563b40f87436378558ad843517be6939 Mon Sep 17 00:00:00 2001 From: Hemna Date: Mon, 6 Jan 2025 17:14:55 -0500 Subject: [PATCH 15/40] Some cleanup with list plugins --- aprsd/cmds/list_plugins.py | 24 +++++++++++------------- aprsd/cmds/listen.py | 4 +++- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/aprsd/cmds/list_plugins.py b/aprsd/cmds/list_plugins.py index 75b7256..af82a93 100644 --- a/aprsd/cmds/list_plugins.py +++ b/aprsd/cmds/list_plugins.py @@ -91,19 +91,17 @@ def _get_installed_aprsd_items(): plugins = {} extensions = {} for finder, name, ispkg in pkgutil.iter_modules(): - if name.startswith("aprsd_"): - print(f"Found aprsd_ module: {name}") - if ispkg: - module = importlib.import_module(name) - pkgs = walk_package(module) - for pkg in pkgs: - pkg_info = get_module_info( - module.__name__, pkg.name, module.__path__[0] - ) - if "plugin" in name: - plugins[name] = pkg_info - elif "extension" in name: - extensions[name] = pkg_info + if ispkg and name.startswith("aprsd_"): + module = importlib.import_module(name) + pkgs = walk_package(module) + for pkg in pkgs: + pkg_info = get_module_info( + module.__name__, pkg.name, module.__path__[0] + ) + if "plugin" in name: + plugins[name] = pkg_info + elif "extension" in name: + extensions[name] = pkg_info return plugins, extensions diff --git a/aprsd/cmds/listen.py b/aprsd/cmds/listen.py index f5851c8..d949e3e 100644 --- a/aprsd/cmds/listen.py +++ b/aprsd/cmds/listen.py @@ -113,6 +113,7 @@ class ListenStatsThread(APRSDThread): stats_json = collector.Collector().collect() stats = stats_json["PacketList"] total_rx = stats["rx"] + packet_count = len(stats["packets"]) rx_delta = total_rx - self._last_total_rx rate = rx_delta / 10 @@ -120,7 +121,8 @@ class ListenStatsThread(APRSDThread): LOGU.opt(colors=True).info( f"RX Rate: {rate} pps " f"Total RX: {total_rx} " - f"RX Last 10 secs: {rx_delta}", + f"RX Last 10 secs: {rx_delta} " + f"Packets in PacketList: {packet_count}", ) self._last_total_rx = total_rx From 275e33538db7f014eeb02deddd76bfbb63516871 Mon Sep 17 00:00:00 2001 From: Hemna Date: Mon, 6 Jan 2025 17:18:15 -0500 Subject: [PATCH 16/40] Updated README.md Added links to aprsd-admin-extension and aprsd-webchat-extension since they are now external. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index a339eb8..04b4975 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,11 @@ APRSD Has the ability to add plugins and extensions. Plugins add new message fi You can see the [available plugins/extensions on pypi here:](https://pypi.org/search/?q=aprsd) [https://pypi.org/search/?q=aprsd](https://pypi.org/search/?q=aprsd) +> [!NOTE] +> aprsd admin and webchat have been extracted into separate extensions. +> [See admin extension here](https://github.com/hemna/aprsd-admin-extension) +> [See webchat extension here](https://github.com/hemna/aprsd-webchat-extension) + ### APRSD Overview Diagram ![image](https://raw.githubusercontent.com/craigerl/aprsd/master/docs/_static/aprsd_overview.svg?sanitize=true) From a21432fb249577489795e8a9f5d969b63c2af716 Mon Sep 17 00:00:00 2001 From: Hemna Date: Mon, 6 Jan 2025 17:27:39 -0500 Subject: [PATCH 17/40] removed BeautifulSoup usage --- README.md | 1 - aprsd/cmds/list_plugins.py | 18 ------------------ 2 files changed, 19 deletions(-) diff --git a/README.md b/README.md index 04b4975..1e1d2e8 100644 --- a/README.md +++ b/README.md @@ -147,7 +147,6 @@ To install `aprsd`, use Pip: send-message Send a message to a callsign via APRS_IS. server Start the aprsd server gateway process. version Show the APRSD version. - webchat Web based HAM Radio chat program! ### Commands diff --git a/aprsd/cmds/list_plugins.py b/aprsd/cmds/list_plugins.py index af82a93..bb5f866 100644 --- a/aprsd/cmds/list_plugins.py +++ b/aprsd/cmds/list_plugins.py @@ -9,7 +9,6 @@ from traceback import print_tb import click import requests -from bs4 import BeautifulSoup from rich.console import Console from rich.table import Table from rich.text import Text @@ -158,23 +157,6 @@ def show_built_in_plugins(console): console.print(table) -def _get_pypi_packages_OLD(): - query = "aprsd" - snippets = [] - s = requests.Session() - c = Console() - for page in range(1, 3): - params = {"q": query, "page": page} - r = s.get(PYPI_URL, params=params) - c.print(f"r = {r.text}") - soup = BeautifulSoup(r.text, "html.parser") - snippets += soup.select('a[class*="snippet"]') - if not hasattr(s, "start_url"): - s.start_url = r.url.rsplit("&page", maxsplit=1).pop(0) - - return snippets - - def _get_pypi_packages(): if simple_r := requests.get( "https://pypi.org/simple", From e3a7e7fb8a8448f7893fbe3f8cf7e876a5e2ff58 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 7 Jan 2025 09:35:39 -0500 Subject: [PATCH 18/40] updated github workflows --- .github/workflows/manual_build.yml | 9 ++++----- .github/workflows/master-build.yml | 11 +++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/.github/workflows/manual_build.yml b/.github/workflows/manual_build.yml index f3e49cc..4158068 100644 --- a/.github/workflows/manual_build.yml +++ b/.github/workflows/manual_build.yml @@ -18,7 +18,6 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - name: Get Branch Name id: branch-name uses: tj-actions/branch-names@v8 @@ -30,16 +29,16 @@ jobs: run: | echo "Selected Branch '${{ steps.extract_branch.outputs.branch }}'" - name: Setup QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Setup Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to Docker HUB - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build the Docker image - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v6 with: context: "{{defaultContext}}:docker" platforms: linux/amd64,linux/arm64 diff --git a/.github/workflows/master-build.yml b/.github/workflows/master-build.yml index 1ca87eb..bd2c134 100644 --- a/.github/workflows/master-build.yml +++ b/.github/workflows/master-build.yml @@ -7,7 +7,7 @@ on: branches: - "**" tags: - - "v*.*.*" + - "*.*.*" pull_request: branches: - "master" @@ -35,21 +35,20 @@ jobs: needs: tox runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - name: Get Branch Name id: branch-name uses: tj-actions/branch-names@v8 - name: Setup QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Setup Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to Docker HUB - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build the Docker image - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v6 with: context: "{{defaultContext}}:docker" platforms: linux/amd64,linux/arm64 From fbec7168eb37621c0f3ca54274148704c857f506 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 7 Jan 2025 10:01:41 -0500 Subject: [PATCH 19/40] updated requirements-dev --- requirements-dev.txt | 176 +++++++++++++++++++++++++++++-------------- 1 file changed, 121 insertions(+), 55 deletions(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index bcfdee1..a0fe7a7 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,55 +1,121 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# pip-compile --annotation-style=line requirements-dev.in -# -alabaster==1.0.0 # via sphinx -babel==2.16.0 # via sphinx -build==1.2.2.post1 # via -r requirements-dev.in, pip-tools -cachetools==5.5.0 # via tox -certifi==2024.12.14 # via requests -cfgv==3.4.0 # via pre-commit -chardet==5.2.0 # via tox -charset-normalizer==3.4.0 # via requests -click==8.1.7 # via pip-tools -colorama==0.4.6 # via tox -distlib==0.3.9 # via virtualenv -docutils==0.21.2 # via m2r, sphinx -filelock==3.16.1 # via tox, virtualenv -identify==2.6.3 # via pre-commit -idna==3.10 # via requests -imagesize==1.4.1 # via sphinx -jinja2==3.1.4 # via sphinx -m2r==0.3.1 # via -r requirements-dev.in -markupsafe==3.0.2 # via jinja2 -mistune==0.8.4 # via m2r -nodeenv==1.9.1 # via pre-commit -packaging==24.2 # via build, pyproject-api, sphinx, tox -pip-tools==7.4.1 # via -r requirements-dev.in -platformdirs==4.3.6 # via tox, virtualenv -pluggy==1.5.0 # via tox -pre-commit==4.0.1 # via -r requirements-dev.in -pygments==2.18.0 # via sphinx -pyproject-api==1.8.0 # via tox -pyproject-hooks==1.2.0 # via build, pip-tools -pyyaml==6.0.2 # via pre-commit -requests==2.32.3 # via sphinx -snowballstemmer==2.2.0 # via sphinx -sphinx==8.1.3 # via -r requirements-dev.in -sphinxcontrib-applehelp==2.0.0 # via sphinx -sphinxcontrib-devhelp==2.0.0 # via sphinx -sphinxcontrib-htmlhelp==2.1.0 # via sphinx -sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==2.0.0 # via sphinx -sphinxcontrib-serializinghtml==2.0.0 # via sphinx -tomli==2.2.1 # via build, pip-tools, pyproject-api, sphinx, tox -tox==4.23.2 # via -r requirements-dev.in -typing-extensions==4.12.2 # via tox -urllib3==2.2.3 # via requests -virtualenv==20.28.0 # via pre-commit, tox -wheel==0.45.1 # via -r requirements-dev.in, pip-tools - -# The following packages are considered to be unsafe in a requirements file: -# pip -# setuptools +# This file was autogenerated by uv via the following command: +# uv pip compile requirements-dev.in -o requirements-dev.txt +alabaster==1.0.0 + # via sphinx +babel==2.16.0 + # via sphinx +build==1.2.2.post1 + # via + # -r requirements-dev.in + # pip-tools +cachetools==5.5.0 + # via tox +certifi==2024.12.14 + # via requests +cfgv==3.4.0 + # via pre-commit +chardet==5.2.0 + # via tox +charset-normalizer==3.4.1 + # via requests +click==8.1.8 + # via pip-tools +colorama==0.4.6 + # via tox +distlib==0.3.9 + # via virtualenv +docutils==0.21.2 + # via + # m2r + # sphinx +filelock==3.16.1 + # via + # tox + # virtualenv +identify==2.6.5 + # via pre-commit +idna==3.10 + # via requests +imagesize==1.4.1 + # via sphinx +jinja2==3.1.5 + # via sphinx +m2r==0.3.1 + # via -r requirements-dev.in +markupsafe==3.0.2 + # via jinja2 +mistune==0.8.4 + # via m2r +nodeenv==1.9.1 + # via pre-commit +packaging==24.2 + # via + # build + # pyproject-api + # sphinx + # tox +pip==24.3.1 + # via + # -r requirements-dev.in + # pip-tools +pip-tools==7.4.1 + # via -r requirements-dev.in +platformdirs==4.3.6 + # via + # tox + # virtualenv +pluggy==1.5.0 + # via tox +pre-commit==4.0.1 + # via -r requirements-dev.in +pygments==2.19.1 + # via sphinx +pyproject-api==1.8.0 + # via tox +pyproject-hooks==1.2.0 + # via + # build + # pip-tools +pyyaml==6.0.2 + # via pre-commit +requests==2.32.3 + # via sphinx +setuptools==75.7.0 + # via pip-tools +snowballstemmer==2.2.0 + # via sphinx +sphinx==8.1.3 + # via -r requirements-dev.in +sphinxcontrib-applehelp==2.0.0 + # via sphinx +sphinxcontrib-devhelp==2.0.0 + # via sphinx +sphinxcontrib-htmlhelp==2.1.0 + # via sphinx +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==2.0.0 + # via sphinx +sphinxcontrib-serializinghtml==2.0.0 + # via sphinx +tomli==2.2.1 + # via + # build + # pip-tools + # pyproject-api + # sphinx + # tox +tox==4.23.2 + # via -r requirements-dev.in +typing-extensions==4.12.2 + # via tox +urllib3==2.3.0 + # via requests +virtualenv==20.28.1 + # via + # pre-commit + # tox +wheel==0.45.1 + # via + # -r requirements-dev.in + # pip-tools From 7f2c1d712417b55cd3535888d18d41c6a00e4d07 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 7 Jan 2025 10:05:25 -0500 Subject: [PATCH 20/40] updated requirements --- .pre-commit-config.yaml | 4 +- requirements-dev.txt | 168 ++++++++++++---------------------------- requirements.txt | 142 ++++++++++----------------------- 3 files changed, 93 insertions(+), 221 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b2842ef..6dd193e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,8 +34,8 @@ repos: # Compile requirements - id: pip-compile name: pip-compile requirements.in - args: [requirements.in, -o, requirements.txt] + args: [--resolver, backtracking, --annotation-style=line, requirements.in, -o, requirements.txt] - id: pip-compile name: pip-compile requirements-dev.in - args: [requirements-dev.in, -o, requirements-dev.txt] + args: [--resolver, backtracking, --annotation-style=line, requirements-dev.in, -o, requirements-dev.txt] files: ^requirements-dev\.(in|txt)$ diff --git a/requirements-dev.txt b/requirements-dev.txt index a0fe7a7..f550f73 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,121 +1,49 @@ # This file was autogenerated by uv via the following command: -# uv pip compile requirements-dev.in -o requirements-dev.txt -alabaster==1.0.0 - # via sphinx -babel==2.16.0 - # via sphinx -build==1.2.2.post1 - # via - # -r requirements-dev.in - # pip-tools -cachetools==5.5.0 - # via tox -certifi==2024.12.14 - # via requests -cfgv==3.4.0 - # via pre-commit -chardet==5.2.0 - # via tox -charset-normalizer==3.4.1 - # via requests -click==8.1.8 - # via pip-tools -colorama==0.4.6 - # via tox -distlib==0.3.9 - # via virtualenv -docutils==0.21.2 - # via - # m2r - # sphinx -filelock==3.16.1 - # via - # tox - # virtualenv -identify==2.6.5 - # via pre-commit -idna==3.10 - # via requests -imagesize==1.4.1 - # via sphinx -jinja2==3.1.5 - # via sphinx -m2r==0.3.1 - # via -r requirements-dev.in -markupsafe==3.0.2 - # via jinja2 -mistune==0.8.4 - # via m2r -nodeenv==1.9.1 - # via pre-commit -packaging==24.2 - # via - # build - # pyproject-api - # sphinx - # tox -pip==24.3.1 - # via - # -r requirements-dev.in - # pip-tools -pip-tools==7.4.1 - # via -r requirements-dev.in -platformdirs==4.3.6 - # via - # tox - # virtualenv -pluggy==1.5.0 - # via tox -pre-commit==4.0.1 - # via -r requirements-dev.in -pygments==2.19.1 - # via sphinx -pyproject-api==1.8.0 - # via tox -pyproject-hooks==1.2.0 - # via - # build - # pip-tools -pyyaml==6.0.2 - # via pre-commit -requests==2.32.3 - # via sphinx -setuptools==75.7.0 - # via pip-tools -snowballstemmer==2.2.0 - # via sphinx -sphinx==8.1.3 - # via -r requirements-dev.in -sphinxcontrib-applehelp==2.0.0 - # via sphinx -sphinxcontrib-devhelp==2.0.0 - # via sphinx -sphinxcontrib-htmlhelp==2.1.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==2.0.0 - # via sphinx -sphinxcontrib-serializinghtml==2.0.0 - # via sphinx -tomli==2.2.1 - # via - # build - # pip-tools - # pyproject-api - # sphinx - # tox -tox==4.23.2 - # via -r requirements-dev.in -typing-extensions==4.12.2 - # via tox -urllib3==2.3.0 - # via requests -virtualenv==20.28.1 - # via - # pre-commit - # tox -wheel==0.45.1 - # via - # -r requirements-dev.in - # pip-tools +# uv pip compile --resolver backtracking --annotation-style=line requirements-dev.in -o requirements-dev.txt +alabaster==1.0.0 # via sphinx +babel==2.16.0 # via sphinx +build==1.2.2.post1 # via pip-tools, -r requirements-dev.in +cachetools==5.5.0 # via tox +certifi==2024.12.14 # via requests +cfgv==3.4.0 # via pre-commit +chardet==5.2.0 # via tox +charset-normalizer==3.4.1 # via requests +click==8.1.8 # via pip-tools +colorama==0.4.6 # via tox +distlib==0.3.9 # via virtualenv +docutils==0.21.2 # via m2r, sphinx +filelock==3.16.1 # via tox, virtualenv +identify==2.6.5 # via pre-commit +idna==3.10 # via requests +imagesize==1.4.1 # via sphinx +jinja2==3.1.5 # via sphinx +m2r==0.3.1 # via -r requirements-dev.in +markupsafe==3.0.2 # via jinja2 +mistune==0.8.4 # via m2r +nodeenv==1.9.1 # via pre-commit +packaging==24.2 # via build, pyproject-api, sphinx, tox +pip==24.3.1 # via pip-tools, -r requirements-dev.in +pip-tools==7.4.1 # via -r requirements-dev.in +platformdirs==4.3.6 # via tox, virtualenv +pluggy==1.5.0 # via tox +pre-commit==4.0.1 # via -r requirements-dev.in +pygments==2.19.1 # via sphinx +pyproject-api==1.8.0 # via tox +pyproject-hooks==1.2.0 # via build, pip-tools +pyyaml==6.0.2 # via pre-commit +requests==2.32.3 # via sphinx +setuptools==75.7.0 # via pip-tools +snowballstemmer==2.2.0 # via sphinx +sphinx==8.1.3 # via -r requirements-dev.in +sphinxcontrib-applehelp==2.0.0 # via sphinx +sphinxcontrib-devhelp==2.0.0 # via sphinx +sphinxcontrib-htmlhelp==2.1.0 # via sphinx +sphinxcontrib-jsmath==1.0.1 # via sphinx +sphinxcontrib-qthelp==2.0.0 # via sphinx +sphinxcontrib-serializinghtml==2.0.0 # via sphinx +tomli==2.2.1 # via build, pip-tools, pyproject-api, sphinx, tox +tox==4.23.2 # via -r requirements-dev.in +typing-extensions==4.12.2 # via tox +urllib3==2.3.0 # via requests +virtualenv==20.28.1 # via pre-commit, tox +wheel==0.45.1 # via pip-tools, -r requirements-dev.in diff --git a/requirements.txt b/requirements.txt index 4d4f2d0..b1f4430 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,100 +1,44 @@ # This file was autogenerated by uv via the following command: -# uv pip compile requirements.in -o requirements.txt -aprslib==0.7.2 - # via -r requirements.in -attrs==24.3.0 - # via - # ax253 - # kiss3 - # rush -ax253==0.1.5.post1 - # via kiss3 -bitarray==3.0.0 - # via - # ax253 - # kiss3 -certifi==2024.12.14 - # via requests -charset-normalizer==3.4.1 - # via requests -click==8.1.8 - # via -r requirements.in -commonmark==0.9.1 - # via rich -dataclasses-json==0.6.7 - # via -r requirements.in -debtcollector==3.0.0 - # via oslo-config -haversine==2.9.0 - # via -r requirements.in -idna==3.10 - # via requests -importlib-metadata==8.5.0 - # via - # ax253 - # kiss3 -kiss3==8.0.0 - # via -r requirements.in -loguru==0.7.3 - # via -r requirements.in -marshmallow==3.23.3 - # via dataclasses-json -mypy-extensions==1.0.0 - # via typing-inspect -netaddr==1.3.0 - # via oslo-config -oslo-config==9.7.0 - # via -r requirements.in -oslo-i18n==6.5.0 - # via oslo-config -packaging==24.2 - # via marshmallow -pbr==6.1.0 - # via - # oslo-i18n - # stevedore -pluggy==1.5.0 - # via -r requirements.in -pygments==2.18.0 - # via rich -pyserial==3.5 - # via pyserial-asyncio -pyserial-asyncio==0.6 - # via kiss3 -pytz==2024.2 - # via -r requirements.in -pyyaml==6.0.2 - # via oslo-config -requests==2.32.3 - # via - # -r requirements.in - # oslo-config - # update-checker -rfc3986==2.0.0 - # via oslo-config -rich==12.6.0 - # via -r requirements.in -rush==2021.4.0 - # via -r requirements.in -stevedore==5.4.0 - # via oslo-config -thesmuggler==1.0.1 - # via -r requirements.in -timeago==1.0.16 - # via -r requirements.in -typing-extensions==4.12.2 - # via typing-inspect -typing-inspect==0.9.0 - # via dataclasses-json -tzlocal==5.2 - # via -r requirements.in -update-checker==0.18.0 - # via -r requirements.in -urllib3==2.3.0 - # via requests -wrapt==1.17.0 - # via - # -r requirements.in - # debtcollector -zipp==3.21.0 - # via importlib-metadata +# uv pip compile --resolver backtracking --annotation-style=line requirements.in -o requirements.txt +aprslib==0.7.2 # via -r requirements.in +attrs==24.3.0 # via ax253, kiss3, rush +ax253==0.1.5.post1 # via kiss3 +bitarray==3.0.0 # via ax253, kiss3 +certifi==2024.12.14 # via requests +charset-normalizer==3.4.1 # via requests +click==8.1.8 # via -r requirements.in +commonmark==0.9.1 # via rich +dataclasses-json==0.6.7 # via -r requirements.in +debtcollector==3.0.0 # via oslo-config +haversine==2.9.0 # via -r requirements.in +idna==3.10 # via requests +importlib-metadata==8.5.0 # via ax253, kiss3 +kiss3==8.0.0 # via -r requirements.in +loguru==0.7.3 # via -r requirements.in +marshmallow==3.24.1 # via dataclasses-json +mypy-extensions==1.0.0 # via typing-inspect +netaddr==1.3.0 # via oslo-config +oslo-config==9.7.0 # via -r requirements.in +oslo-i18n==6.5.0 # via oslo-config +packaging==24.2 # via marshmallow +pbr==6.1.0 # via oslo-i18n, stevedore +pluggy==1.5.0 # via -r requirements.in +pygments==2.19.1 # via rich +pyserial==3.5 # via pyserial-asyncio +pyserial-asyncio==0.6 # via kiss3 +pytz==2024.2 # via -r requirements.in +pyyaml==6.0.2 # via oslo-config +requests==2.32.3 # via oslo-config, update-checker, -r requirements.in +rfc3986==2.0.0 # via oslo-config +rich==12.6.0 # via -r requirements.in +rush==2021.4.0 # via -r requirements.in +stevedore==5.4.0 # via oslo-config +thesmuggler==1.0.1 # via -r requirements.in +timeago==1.0.16 # via -r requirements.in +typing-extensions==4.12.2 # via typing-inspect +typing-inspect==0.9.0 # via dataclasses-json +tzlocal==5.2 # via -r requirements.in +update-checker==0.18.0 # via -r requirements.in +urllib3==2.3.0 # via requests +wrapt==1.17.0 # via debtcollector, -r requirements.in +zipp==3.21.0 # via importlib-metadata From 007386505ab539200b8eef438250bc73dac0079f Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 7 Jan 2025 10:22:01 -0500 Subject: [PATCH 21/40] updated plugin example --- examples/plugins/example_plugin.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/plugins/example_plugin.py b/examples/plugins/example_plugin.py index 04ea2ce..8ca5e0a 100644 --- a/examples/plugins/example_plugin.py +++ b/examples/plugins/example_plugin.py @@ -1,7 +1,6 @@ import logging -from aprsd import plugin - +from aprsd import packets, plugin LOG = logging.getLogger("APRSD") @@ -14,7 +13,7 @@ class HelloPlugin(plugin.APRSDRegexCommandPluginBase): command_regex = "^[hH]" command_name = "hello" - def process(self, packet): + def process(self, packet: packets.MessagePacket): LOG.info("HelloPlugin") reply = f"Hello '{packet.from_call}'" return reply From 3cd9bfa7bb79fb2ebaad7d921c7d9fd2128392f3 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 7 Jan 2025 10:22:26 -0500 Subject: [PATCH 22/40] updated docs rst files --- docs/apidoc/aprsd.cmds.rst | 8 -------- docs/apidoc/aprsd.conf.rst | 8 -------- docs/apidoc/aprsd.plugins.rst | 16 ---------------- docs/apidoc/aprsd.rst | 17 ----------------- docs/apidoc/aprsd.threads.rst | 14 +++----------- docs/apidoc/aprsd.utils.rst | 8 ++++++++ docs/apidoc/aprsd.web.admin.rst | 10 ---------- docs/apidoc/aprsd.web.rst | 18 ------------------ 8 files changed, 11 insertions(+), 88 deletions(-) delete mode 100644 docs/apidoc/aprsd.web.admin.rst delete mode 100644 docs/apidoc/aprsd.web.rst diff --git a/docs/apidoc/aprsd.cmds.rst b/docs/apidoc/aprsd.cmds.rst index 802588f..cce281b 100644 --- a/docs/apidoc/aprsd.cmds.rst +++ b/docs/apidoc/aprsd.cmds.rst @@ -68,14 +68,6 @@ aprsd.cmds.server module :undoc-members: :show-inheritance: -aprsd.cmds.webchat module -------------------------- - -.. automodule:: aprsd.cmds.webchat - :members: - :undoc-members: - :show-inheritance: - Module contents --------------- diff --git a/docs/apidoc/aprsd.conf.rst b/docs/apidoc/aprsd.conf.rst index db49f3b..7094a66 100644 --- a/docs/apidoc/aprsd.conf.rst +++ b/docs/apidoc/aprsd.conf.rst @@ -44,14 +44,6 @@ aprsd.conf.plugin\_common module :undoc-members: :show-inheritance: -aprsd.conf.plugin\_email module -------------------------------- - -.. automodule:: aprsd.conf.plugin_email - :members: - :undoc-members: - :show-inheritance: - Module contents --------------- diff --git a/docs/apidoc/aprsd.plugins.rst b/docs/apidoc/aprsd.plugins.rst index 93e0548..a946668 100644 --- a/docs/apidoc/aprsd.plugins.rst +++ b/docs/apidoc/aprsd.plugins.rst @@ -4,14 +4,6 @@ aprsd.plugins package Submodules ---------- -aprsd.plugins.email module --------------------------- - -.. automodule:: aprsd.plugins.email - :members: - :undoc-members: - :show-inheritance: - aprsd.plugins.fortune module ---------------------------- @@ -20,14 +12,6 @@ aprsd.plugins.fortune module :undoc-members: :show-inheritance: -aprsd.plugins.location module ------------------------------ - -.. automodule:: aprsd.plugins.location - :members: - :undoc-members: - :show-inheritance: - aprsd.plugins.notify module --------------------------- diff --git a/docs/apidoc/aprsd.rst b/docs/apidoc/aprsd.rst index 47c694d..413fdf6 100644 --- a/docs/apidoc/aprsd.rst +++ b/docs/apidoc/aprsd.rst @@ -16,7 +16,6 @@ Subpackages aprsd.stats aprsd.threads aprsd.utils - aprsd.web Submodules ---------- @@ -45,14 +44,6 @@ aprsd.main module :undoc-members: :show-inheritance: -aprsd.messaging module ----------------------- - -.. automodule:: aprsd.messaging - :members: - :undoc-members: - :show-inheritance: - aprsd.plugin module ------------------- @@ -69,14 +60,6 @@ aprsd.plugin\_utils module :undoc-members: :show-inheritance: -aprsd.wsgi module ------------------ - -.. automodule:: aprsd.wsgi - :members: - :undoc-members: - :show-inheritance: - Module contents --------------- diff --git a/docs/apidoc/aprsd.threads.rst b/docs/apidoc/aprsd.threads.rst index c1aa82b..4ef323c 100644 --- a/docs/apidoc/aprsd.threads.rst +++ b/docs/apidoc/aprsd.threads.rst @@ -12,18 +12,10 @@ aprsd.threads.aprsd module :undoc-members: :show-inheritance: -aprsd.threads.keep\_alive module --------------------------------- +aprsd.threads.keepalive module +------------------------------ -.. automodule:: aprsd.threads.keep_alive - :members: - :undoc-members: - :show-inheritance: - -aprsd.threads.log\_monitor module ---------------------------------- - -.. automodule:: aprsd.threads.log_monitor +.. automodule:: aprsd.threads.keepalive :members: :undoc-members: :show-inheritance: diff --git a/docs/apidoc/aprsd.utils.rst b/docs/apidoc/aprsd.utils.rst index e54dbfd..7edb534 100644 --- a/docs/apidoc/aprsd.utils.rst +++ b/docs/apidoc/aprsd.utils.rst @@ -28,6 +28,14 @@ aprsd.utils.json module :undoc-members: :show-inheritance: +aprsd.utils.keepalive\_collector module +--------------------------------------- + +.. automodule:: aprsd.utils.keepalive_collector + :members: + :undoc-members: + :show-inheritance: + aprsd.utils.objectstore module ------------------------------ diff --git a/docs/apidoc/aprsd.web.admin.rst b/docs/apidoc/aprsd.web.admin.rst deleted file mode 100644 index 01f28bb..0000000 --- a/docs/apidoc/aprsd.web.admin.rst +++ /dev/null @@ -1,10 +0,0 @@ -aprsd.web.admin package -======================= - -Module contents ---------------- - -.. automodule:: aprsd.web.admin - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/apidoc/aprsd.web.rst b/docs/apidoc/aprsd.web.rst deleted file mode 100644 index 9821807..0000000 --- a/docs/apidoc/aprsd.web.rst +++ /dev/null @@ -1,18 +0,0 @@ -aprsd.web package -================= - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - aprsd.web.admin - -Module contents ---------------- - -.. automodule:: aprsd.web - :members: - :undoc-members: - :show-inheritance: From c8735c257a32b31974508c2ed9c1cdc8848b5150 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 7 Jan 2025 10:46:59 -0500 Subject: [PATCH 23/40] added authors.yml --- .github/workflows/authors.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/workflows/authors.yml diff --git a/.github/workflows/authors.yml b/.github/workflows/authors.yml new file mode 100644 index 0000000..fa272c6 --- /dev/null +++ b/.github/workflows/authors.yml @@ -0,0 +1,15 @@ +name: Update Authors +on: + push: + branches: + - master +jobs: + run: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: wow-actions/update-authors@v1 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + template: '{{email}} : {{commits}}' + path: 'AUTHORS' From 7702d68cf722746952b94782ac4ed5cba935d53b Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 7 Jan 2025 10:48:12 -0500 Subject: [PATCH 24/40] updated action versions --- .github/workflows/python.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 7d75f8f..c72ed26 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -9,9 +9,9 @@ jobs: matrix: python-version: ["3.10", "3.11"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies From 3ee422b5c9f79e9ee2d757abd1de9b9f2d0fc52e Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 7 Jan 2025 10:50:22 -0500 Subject: [PATCH 25/40] update to py 3.10 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e61b071..9aea1f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ description = "APRSd is a APRS-IS server that can be used to connect to APRS-IS # 'Programming Language' classifiers in this file, 'pip install' will check this # and refuse to install the project if the version does not match. See # https://packaging.python.org/guides/distributing-packages-using-setuptools/#python-requires -requires-python = ">=3.9" +requires-python = ">=3.10" dynamic = ["version", "dependencies", "optional-dependencies"] From 8d9854605584fa35117af888fe219df610fb7cb4 Mon Sep 17 00:00:00 2001 From: Hemna Date: Tue, 7 Jan 2025 15:57:19 -0500 Subject: [PATCH 26/40] Added .mailmap --- .mailmap | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .mailmap diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000..fb46eeb --- /dev/null +++ b/.mailmap @@ -0,0 +1,4 @@ +Craig Lamparter +Craig Lamparter craigerl +Craig Lamparter craigerl +Walter A. Boring IV Hemna From e4f82d6054d4d859023423bccdd5c402d7a83494 Mon Sep 17 00:00:00 2001 From: Hemna Date: Fri, 10 Jan 2025 17:07:45 -0500 Subject: [PATCH 27/40] updated tools in pre-commit --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6dd193e..f874f72 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,12 +13,12 @@ repos: - id: check-illegal-windows-names - repo: https://github.com/asottile/setup-cfg-fmt - rev: v2.5.0 + rev: v2.7.0 hooks: - id: setup-cfg-fmt - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.4 + rev: v0.9.0 hooks: - id: ruff ###### Relevant part below ###### @@ -29,7 +29,7 @@ repos: - repo: https://github.com/astral-sh/uv-pre-commit # uv version. - rev: 0.5.11 + rev: 0.5.16 hooks: # Compile requirements - id: pip-compile From e332d7c9d046066e2686ea0522ae06b86d2f162d Mon Sep 17 00:00:00 2001 From: Hemna Date: Fri, 10 Jan 2025 17:09:42 -0500 Subject: [PATCH 28/40] some cleanup --- aprsd/client/drivers/fake.py | 30 ++-- aprsd/cmds/dev.py | 75 +++++----- aprsd/cmds/fetch_stats.py | 276 +++++++++++++++++------------------ aprsd/cmds/list_plugins.py | 196 ++++++++++++------------- pyproject.toml | 17 +++ 5 files changed, 299 insertions(+), 295 deletions(-) diff --git a/aprsd/client/drivers/fake.py b/aprsd/client/drivers/fake.py index a8810be..77fe677 100644 --- a/aprsd/client/drivers/fake.py +++ b/aprsd/client/drivers/fake.py @@ -11,7 +11,7 @@ from aprsd.packets import core from aprsd.utils import trace CONF = cfg.CONF -LOG = logging.getLogger("APRSD") +LOG = logging.getLogger('APRSD') class APRSDFakeClient(metaclass=trace.TraceWrapperMetaclass): @@ -24,12 +24,12 @@ class APRSDFakeClient(metaclass=trace.TraceWrapperMetaclass): path = [] def __init__(self): - LOG.info("Starting APRSDFakeClient client.") - self.path = ["WIDE1-1", "WIDE2-1"] + LOG.info('Starting APRSDFakeClient client.') + self.path = ['WIDE1-1', 'WIDE2-1'] def stop(self): self.thread_stop = True - LOG.info("Shutdown APRSDFakeClient client.") + LOG.info('Shutdown APRSDFakeClient client.') def is_alive(self): """If the connection is alive or not.""" @@ -38,35 +38,31 @@ class APRSDFakeClient(metaclass=trace.TraceWrapperMetaclass): @wrapt.synchronized(lock) def send(self, packet: core.Packet): """Send an APRS Message object.""" - LOG.info(f"Sending packet: {packet}") + LOG.info(f'Sending packet: {packet}') payload = None if isinstance(packet, core.Packet): packet.prepare() - payload = packet.payload.encode("US-ASCII") - if packet.path: - packet.path - else: - self.path + payload = packet.payload.encode('US-ASCII') else: - msg_payload = f"{packet.raw}{{{str(packet.msgNo)}" + msg_payload = f'{packet.raw}{{{str(packet.msgNo)}' payload = ( - ":{:<9}:{}".format( + ':{:<9}:{}'.format( packet.to_call, msg_payload, ) - ).encode("US-ASCII") + ).encode('US-ASCII') LOG.debug( f"FAKE::Send '{payload}' TO '{packet.to_call}' From " - f"'{packet.from_call}' with PATH \"{self.path}\"", + f'\'{packet.from_call}\' with PATH "{self.path}"', ) def consumer(self, callback, blocking=False, immortal=False, raw=False): - LOG.debug("Start non blocking FAKE consumer") + LOG.debug('Start non blocking FAKE consumer') # Generate packets here? - raw = "GTOWN>APDW16,WIDE1-1,WIDE2-1:}KM6LYW-9>APZ100,TCPIP,GTOWN*::KM6LYW :KM6LYW: 19 Miles SW" + raw = 'GTOWN>APDW16,WIDE1-1,WIDE2-1:}KM6LYW-9>APZ100,TCPIP,GTOWN*::KM6LYW :KM6LYW: 19 Miles SW' pkt_raw = aprslib.parse(raw) pkt = core.factory(pkt_raw) callback(packet=pkt) - LOG.debug(f"END blocking FAKE consumer {self}") + LOG.debug(f'END blocking FAKE consumer {self}') time.sleep(8) diff --git a/aprsd/cmds/dev.py b/aprsd/cmds/dev.py index cf03083..428c4d5 100644 --- a/aprsd/cmds/dev.py +++ b/aprsd/cmds/dev.py @@ -16,11 +16,11 @@ from aprsd.main import cli from aprsd.utils import trace CONF = cfg.CONF -LOG = logging.getLogger("APRSD") -CONTEXT_SETTINGS = dict(help_option_names=["-h", "--help"]) +LOG = logging.getLogger('APRSD') +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) -@cli.group(help="Development type subcommands", context_settings=CONTEXT_SETTINGS) +@cli.group(help='Development type subcommands', context_settings=CONTEXT_SETTINGS) @click.pass_context def dev(ctx): pass @@ -29,37 +29,37 @@ def dev(ctx): @dev.command() @cli_helper.add_options(cli_helper.common_options) @click.option( - "--aprs-login", - envvar="APRS_LOGIN", + '--aprs-login', + envvar='APRS_LOGIN', show_envvar=True, - help="What callsign to send the message from.", + help='What callsign to send the message from.', ) @click.option( - "-p", - "--plugin", - "plugin_path", + '-p', + '--plugin', + 'plugin_path', show_default=True, default=None, - help="The plugin to run. Ex: aprsd.plugins.ping.PingPlugin", + help='The plugin to run. Ex: aprsd.plugins.ping.PingPlugin', ) @click.option( - "-a", - "--all", - "load_all", + '-a', + '--all', + 'load_all', show_default=True, is_flag=True, default=False, - help="Load all the plugins in config?", + help='Load all the plugins in config?', ) @click.option( - "-n", - "--num", - "number", + '-n', + '--num', + 'number', show_default=True, default=1, - help="Number of times to call the plugin", + help='Number of times to call the plugin', ) -@click.argument("message", nargs=-1, required=True) +@click.argument('message', nargs=-1, required=True) @click.pass_context @cli_helper.process_standard_options def test_plugin( @@ -76,7 +76,7 @@ def test_plugin( if not aprs_login: if CONF.aprs_network.login == conf.client.DEFAULT_LOGIN: - click.echo("Must set --aprs_login or APRS_LOGIN") + click.echo('Must set --aprs_login or APRS_LOGIN') ctx.exit(-1) return else: @@ -86,16 +86,16 @@ def test_plugin( if not plugin_path: click.echo(ctx.get_help()) - click.echo("") - click.echo("Failed to provide -p option to test a plugin") + click.echo('') + click.echo('Failed to provide -p option to test a plugin') ctx.exit(-1) return if type(message) is tuple: - message = " ".join(message) + message = ' '.join(message) if CONF.trace_enabled: - trace.setup_tracing(["method", "api"]) + trace.setup_tracing(['method', 'api']) base.APRSClient() @@ -105,13 +105,13 @@ def test_plugin( obj = pm._create_class(plugin_path, plugin.APRSDPluginBase) if not obj: click.echo(ctx.get_help()) - click.echo("") + click.echo('') ctx.fail(f"Failed to create object from plugin path '{plugin_path}'") ctx.exit() # Register the plugin they wanted tested. LOG.info( - "Testing plugin {} Version {}".format( + 'Testing plugin {} Version {}'.format( obj.__class__, obj.version, ), @@ -126,7 +126,7 @@ def test_plugin( ) LOG.info(f"P'{plugin_path}' F'{fromcall}' C'{message}'") - for x in range(number): + for _ in range(number): replies = pm.run(packet) # Plugin might have threads, so lets stop them so we can exit. # obj.stop_threads() @@ -147,17 +147,12 @@ def test_plugin( elif isinstance(reply, packets.Packet): # We have a message based object. LOG.info(reply) - else: - # A plugin can return a null message flag which signals - # us that they processed the message correctly, but have - # nothing to reply with, so we avoid replying with a - # usage string - if reply is not packets.NULL_MESSAGE: - LOG.info( - packets.MessagePacket( - from_call=CONF.callsign, - to_call=fromcall, - message_text=reply, - ), - ) + elif reply is not packets.NULL_MESSAGE: + LOG.info( + packets.MessagePacket( + from_call=CONF.callsign, + to_call=fromcall, + message_text=reply, + ), + ) pm.stop() diff --git a/aprsd/cmds/fetch_stats.py b/aprsd/cmds/fetch_stats.py index 1dbb11f..ec76bbb 100644 --- a/aprsd/cmds/fetch_stats.py +++ b/aprsd/cmds/fetch_stats.py @@ -15,30 +15,30 @@ from aprsd.threads.stats import StatsStore # setup the global logger # log.basicConfig(level=log.DEBUG) # level=10 -LOG = logging.getLogger("APRSD") +LOG = logging.getLogger('APRSD') CONF = cfg.CONF @cli.command() @cli_helper.add_options(cli_helper.common_options) @click.option( - "--host", + '--host', type=str, default=None, - help="IP address of the remote aprsd admin web ui fetch stats from.", + help='IP address of the remote aprsd admin web ui fetch stats from.', ) @click.option( - "--port", + '--port', type=int, default=None, - help="Port of the remote aprsd web admin interface to fetch stats from.", + help='Port of the remote aprsd web admin interface to fetch stats from.', ) @click.pass_context @cli_helper.process_standard_options def fetch_stats(ctx, host, port): """Fetch stats from a APRSD admin web interface.""" console = Console() - console.print(f"APRSD Fetch-Stats started version: {aprsd.__version__}") + console.print(f'APRSD Fetch-Stats started version: {aprsd.__version__}') CONF.log_opt_values(LOG, logging.DEBUG) if not host: @@ -46,114 +46,110 @@ def fetch_stats(ctx, host, port): if not port: port = CONF.admin.web_port - msg = f"Fetching stats from {host}:{port}" + msg = f'Fetching stats from {host}:{port}' console.print(msg) with console.status(msg): - response = requests.get(f"http://{host}:{port}/stats", timeout=120) + response = requests.get(f'http://{host}:{port}/stats', timeout=120) if not response: console.print( - f"Failed to fetch stats from {host}:{port}?", - style="bold red", + f'Failed to fetch stats from {host}:{port}?', + style='bold red', ) return stats = response.json() if not stats: console.print( - f"Failed to fetch stats from aprsd admin ui at {host}:{port}", - style="bold red", + f'Failed to fetch stats from aprsd admin ui at {host}:{port}', + style='bold red', ) return aprsd_title = ( - "APRSD " - f"[bold cyan]v{stats['APRSDStats']['version']}[/] " - f"Callsign [bold green]{stats['APRSDStats']['callsign']}[/] " - f"Uptime [bold yellow]{stats['APRSDStats']['uptime']}[/]" + 'APRSD ' + f'[bold cyan]v{stats["APRSDStats"]["version"]}[/] ' + f'Callsign [bold green]{stats["APRSDStats"]["callsign"]}[/] ' + f'Uptime [bold yellow]{stats["APRSDStats"]["uptime"]}[/]' ) - console.rule(f"Stats from {host}:{port}") - console.print("\n\n") + console.rule(f'Stats from {host}:{port}') + console.print('\n\n') console.rule(aprsd_title) # Show the connection to APRS # It can be a connection to an APRS-IS server or a local TNC via KISS or KISSTCP - if "aprs-is" in stats: - title = f"APRS-IS Connection {stats['APRSClientStats']['server_string']}" + if 'aprs-is' in stats: + title = f'APRS-IS Connection {stats["APRSClientStats"]["server_string"]}' table = Table(title=title) - table.add_column("Key") - table.add_column("Value") - for key, value in stats["APRSClientStats"].items(): + table.add_column('Key') + table.add_column('Value') + for key, value in stats['APRSClientStats'].items(): table.add_row(key, value) console.print(table) - threads_table = Table(title="Threads") - threads_table.add_column("Name") - threads_table.add_column("Alive?") - for name, alive in stats["APRSDThreadList"].items(): + threads_table = Table(title='Threads') + threads_table.add_column('Name') + threads_table.add_column('Alive?') + for name, alive in stats['APRSDThreadList'].items(): threads_table.add_row(name, str(alive)) console.print(threads_table) - packet_totals = Table(title="Packet Totals") - packet_totals.add_column("Key") - packet_totals.add_column("Value") - packet_totals.add_row("Total Received", str(stats["PacketList"]["rx"])) - packet_totals.add_row("Total Sent", str(stats["PacketList"]["tx"])) + packet_totals = Table(title='Packet Totals') + packet_totals.add_column('Key') + packet_totals.add_column('Value') + packet_totals.add_row('Total Received', str(stats['PacketList']['rx'])) + packet_totals.add_row('Total Sent', str(stats['PacketList']['tx'])) console.print(packet_totals) # Show each of the packet types - packets_table = Table(title="Packets By Type") - packets_table.add_column("Packet Type") - packets_table.add_column("TX") - packets_table.add_column("RX") - for key, value in stats["PacketList"]["packets"].items(): - packets_table.add_row(key, str(value["tx"]), str(value["rx"])) + packets_table = Table(title='Packets By Type') + packets_table.add_column('Packet Type') + packets_table.add_column('TX') + packets_table.add_column('RX') + for key, value in stats['PacketList']['packets'].items(): + packets_table.add_row(key, str(value['tx']), str(value['rx'])) console.print(packets_table) - if "plugins" in stats: - count = len(stats["PluginManager"]) - plugins_table = Table(title=f"Plugins ({count})") - plugins_table.add_column("Plugin") - plugins_table.add_column("Enabled") - plugins_table.add_column("Version") - plugins_table.add_column("TX") - plugins_table.add_column("RX") - plugins = stats["PluginManager"] - for key, value in plugins.items(): + if 'plugins' in stats: + count = len(stats['PluginManager']) + plugins_table = Table(title=f'Plugins ({count})') + plugins_table.add_column('Plugin') + plugins_table.add_column('Enabled') + plugins_table.add_column('Version') + plugins_table.add_column('TX') + plugins_table.add_column('RX') + plugins = stats['PluginManager'] + for key, _ in plugins.items(): plugins_table.add_row( key, - str(plugins[key]["enabled"]), - plugins[key]["version"], - str(plugins[key]["tx"]), - str(plugins[key]["rx"]), + str(plugins[key]['enabled']), + plugins[key]['version'], + str(plugins[key]['tx']), + str(plugins[key]['rx']), ) console.print(plugins_table) - seen_list = stats.get("SeenList") - - if seen_list: + if seen_list := stats.get('SeenList'): count = len(seen_list) - seen_table = Table(title=f"Seen List ({count})") - seen_table.add_column("Callsign") - seen_table.add_column("Message Count") - seen_table.add_column("Last Heard") + seen_table = Table(title=f'Seen List ({count})') + seen_table.add_column('Callsign') + seen_table.add_column('Message Count') + seen_table.add_column('Last Heard') for key, value in seen_list.items(): - seen_table.add_row(key, str(value["count"]), value["last"]) + seen_table.add_row(key, str(value['count']), value['last']) console.print(seen_table) - watch_list = stats.get("WatchList") - - if watch_list: + if watch_list := stats.get('WatchList'): count = len(watch_list) - watch_table = Table(title=f"Watch List ({count})") - watch_table.add_column("Callsign") - watch_table.add_column("Last Heard") + watch_table = Table(title=f'Watch List ({count})') + watch_table.add_column('Callsign') + watch_table.add_column('Last Heard') for key, value in watch_list.items(): - watch_table.add_row(key, value["last"]) + watch_table.add_row(key, value['last']) console.print(watch_table) @@ -161,27 +157,27 @@ def fetch_stats(ctx, host, port): @cli.command() @cli_helper.add_options(cli_helper.common_options) @click.option( - "--raw", + '--raw', is_flag=True, default=False, - help="Dump raw stats instead of formatted output.", + help='Dump raw stats instead of formatted output.', ) @click.option( - "--show-section", - default=["All"], - help="Show specific sections of the stats. " - " Choices: All, APRSDStats, APRSDThreadList, APRSClientStats," - " PacketList, SeenList, WatchList", + '--show-section', + default=['All'], + help='Show specific sections of the stats. ' + ' Choices: All, APRSDStats, APRSDThreadList, APRSClientStats,' + ' PacketList, SeenList, WatchList', multiple=True, type=click.Choice( [ - "All", - "APRSDStats", - "APRSDThreadList", - "APRSClientStats", - "PacketList", - "SeenList", - "WatchList", + 'All', + 'APRSDStats', + 'APRSDThreadList', + 'APRSClientStats', + 'PacketList', + 'SeenList', + 'WatchList', ], case_sensitive=False, ), @@ -191,122 +187,122 @@ def fetch_stats(ctx, host, port): def dump_stats(ctx, raw, show_section): """Dump the current stats from the running APRSD instance.""" console = Console() - console.print(f"APRSD Dump-Stats started version: {aprsd.__version__}") + console.print(f'APRSD Dump-Stats started version: {aprsd.__version__}') - with console.status("Dumping stats"): + with console.status('Dumping stats'): ss = StatsStore() ss.load() stats = ss.data if raw: - if "All" in show_section: + if 'All' in show_section: console.print(stats) return else: for section in show_section: - console.print(f"Dumping {section} section:") + console.print(f'Dumping {section} section:') console.print(stats[section]) return - t = Table(title="APRSD Stats") - t.add_column("Key") - t.add_column("Value") - for key, value in stats["APRSDStats"].items(): + t = Table(title='APRSD Stats') + t.add_column('Key') + t.add_column('Value') + for key, value in stats['APRSDStats'].items(): t.add_row(key, str(value)) - if "All" in show_section or "APRSDStats" in show_section: + if 'All' in show_section or 'APRSDStats' in show_section: console.print(t) # Show the thread list - t = Table(title="Thread List") - t.add_column("Name") - t.add_column("Class") - t.add_column("Alive?") - t.add_column("Loop Count") - t.add_column("Age") - for name, value in stats["APRSDThreadList"].items(): + t = Table(title='Thread List') + t.add_column('Name') + t.add_column('Class') + t.add_column('Alive?') + t.add_column('Loop Count') + t.add_column('Age') + for name, value in stats['APRSDThreadList'].items(): t.add_row( name, - value["class"], - str(value["alive"]), - str(value["loop_count"]), - str(value["age"]), + value['class'], + str(value['alive']), + str(value['loop_count']), + str(value['age']), ) - if "All" in show_section or "APRSDThreadList" in show_section: + if 'All' in show_section or 'APRSDThreadList' in show_section: console.print(t) # Show the plugins - t = Table(title="Plugin List") - t.add_column("Name") - t.add_column("Enabled") - t.add_column("Version") - t.add_column("TX") - t.add_column("RX") - for name, value in stats["PluginManager"].items(): + t = Table(title='Plugin List') + t.add_column('Name') + t.add_column('Enabled') + t.add_column('Version') + t.add_column('TX') + t.add_column('RX') + for name, value in stats['PluginManager'].items(): t.add_row( name, - str(value["enabled"]), - value["version"], - str(value["tx"]), - str(value["rx"]), + str(value['enabled']), + value['version'], + str(value['tx']), + str(value['rx']), ) - if "All" in show_section or "PluginManager" in show_section: + if 'All' in show_section or 'PluginManager' in show_section: console.print(t) # Now show the client stats - t = Table(title="Client Stats") - t.add_column("Key") - t.add_column("Value") - for key, value in stats["APRSClientStats"].items(): + t = Table(title='Client Stats') + t.add_column('Key') + t.add_column('Value') + for key, value in stats['APRSClientStats'].items(): t.add_row(key, str(value)) - if "All" in show_section or "APRSClientStats" in show_section: + if 'All' in show_section or 'APRSClientStats' in show_section: console.print(t) # now show the packet list - packet_list = stats.get("PacketList") - t = Table(title="Packet List") - t.add_column("Key") - t.add_column("Value") - t.add_row("Total Received", str(packet_list["rx"])) - t.add_row("Total Sent", str(packet_list["tx"])) + packet_list = stats.get('PacketList') + t = Table(title='Packet List') + t.add_column('Key') + t.add_column('Value') + t.add_row('Total Received', str(packet_list['rx'])) + t.add_row('Total Sent', str(packet_list['tx'])) - if "All" in show_section or "PacketList" in show_section: + if 'All' in show_section or 'PacketList' in show_section: console.print(t) # now show the seen list - seen_list = stats.get("SeenList") + seen_list = stats.get('SeenList') sorted_seen_list = sorted( seen_list.items(), ) - t = Table(title="Seen List") - t.add_column("Callsign") - t.add_column("Message Count") - t.add_column("Last Heard") + t = Table(title='Seen List') + t.add_column('Callsign') + t.add_column('Message Count') + t.add_column('Last Heard') for key, value in sorted_seen_list: t.add_row( key, - str(value["count"]), - str(value["last"]), + str(value['count']), + str(value['last']), ) - if "All" in show_section or "SeenList" in show_section: + if 'All' in show_section or 'SeenList' in show_section: console.print(t) # now show the watch list - watch_list = stats.get("WatchList") + watch_list = stats.get('WatchList') sorted_watch_list = sorted( watch_list.items(), ) - t = Table(title="Watch List") - t.add_column("Callsign") - t.add_column("Last Heard") + t = Table(title='Watch List') + t.add_column('Callsign') + t.add_column('Last Heard') for key, value in sorted_watch_list: t.add_row( key, - str(value["last"]), + str(value['last']), ) - if "All" in show_section or "WatchList" in show_section: + if 'All' in show_section or 'WatchList' in show_section: console.print(t) diff --git a/aprsd/cmds/list_plugins.py b/aprsd/cmds/list_plugins.py index bb5f866..740286a 100644 --- a/aprsd/cmds/list_plugins.py +++ b/aprsd/cmds/list_plugins.py @@ -19,12 +19,12 @@ from aprsd import plugin as aprsd_plugin from aprsd.main import cli from aprsd.plugins import fortune, notify, ping, time, version, weather -LOG = logging.getLogger("APRSD") -PYPI_URL = "https://pypi.org/search/" +LOG = logging.getLogger('APRSD') +PYPI_URL = 'https://pypi.org/search/' def onerror(name): - print(f"Error importing module {name}") + print(f'Error importing module {name}') type, value, traceback = sys.exc_info() print_tb(traceback) @@ -40,19 +40,19 @@ def is_plugin(obj): def plugin_type(obj): for c in inspect.getmro(obj): if issubclass(c, aprsd_plugin.APRSDRegexCommandPluginBase): - return "RegexCommand" + return 'RegexCommand' if issubclass(c, aprsd_plugin.APRSDWatchListPluginBase): - return "WatchList" + return 'WatchList' if issubclass(c, aprsd_plugin.APRSDPluginBase): - return "APRSDPluginBase" + return 'APRSDPluginBase' - return "Unknown" + return 'Unknown' def walk_package(package): return pkgutil.walk_packages( package.__path__, - package.__name__ + ".", + package.__name__ + '.', onerror=onerror, ) @@ -62,23 +62,23 @@ def get_module_info(package_name, module_name, module_path): return None dir_path = os.path.realpath(module_path) - pattern = "*.py" + pattern = '*.py' obj_list = [] for path, _subdirs, files in os.walk(dir_path): for name in files: if fnmatch.fnmatch(name, pattern): - module = smuggle(f"{path}/{name}") + module = smuggle(f'{path}/{name}') for mem_name, obj in inspect.getmembers(module): if inspect.isclass(obj) and is_plugin(obj): obj_list.append( { - "package": package_name, - "name": mem_name, - "obj": obj, - "version": obj.version, - "path": f"{'.'.join([module_name, obj.__name__])}", + 'package': package_name, + 'name': mem_name, + 'obj': obj, + 'version': obj.version, + 'path': f'{".".join([module_name, obj.__name__])}', }, ) @@ -89,17 +89,17 @@ def _get_installed_aprsd_items(): # installed plugins plugins = {} extensions = {} - for finder, name, ispkg in pkgutil.iter_modules(): - if ispkg and name.startswith("aprsd_"): + for _finder, name, ispkg in pkgutil.iter_modules(): + if ispkg and name.startswith('aprsd_'): module = importlib.import_module(name) pkgs = walk_package(module) for pkg in pkgs: pkg_info = get_module_info( module.__name__, pkg.name, module.__path__[0] ) - if "plugin" in name: + if 'plugin' in name: plugins[name] = pkg_info - elif "extension" in name: + elif 'extension' in name: extensions[name] = pkg_info return plugins, extensions @@ -126,57 +126,57 @@ def show_built_in_plugins(console): cls = entry[1] if issubclass(cls, aprsd_plugin.APRSDPluginBase): info = { - "name": cls.__qualname__, - "path": f"{cls.__module__}.{cls.__qualname__}", - "version": cls.version, - "docstring": cls.__doc__, - "short_desc": cls.short_description, + 'name': cls.__qualname__, + 'path': f'{cls.__module__}.{cls.__qualname__}', + 'version': cls.version, + 'docstring': cls.__doc__, + 'short_desc': cls.short_description, } if issubclass(cls, aprsd_plugin.APRSDRegexCommandPluginBase): - info["command_regex"] = cls.command_regex - info["type"] = "RegexCommand" + info['command_regex'] = cls.command_regex + info['type'] = 'RegexCommand' if issubclass(cls, aprsd_plugin.APRSDWatchListPluginBase): - info["type"] = "WatchList" + info['type'] = 'WatchList' plugins.append(info) - plugins = sorted(plugins, key=lambda i: i["name"]) + plugins = sorted(plugins, key=lambda i: i['name']) table = Table( - title="[not italic]:snake:[/] [bold][magenta]APRSD Built-in Plugins [not italic]:snake:[/]", + title='[not italic]:snake:[/] [bold][magenta]APRSD Built-in Plugins [not italic]:snake:[/]', ) - table.add_column("Plugin Name", style="cyan", no_wrap=True) - table.add_column("Info", style="bold yellow") - table.add_column("Type", style="bold green") - table.add_column("Plugin Path", style="bold blue") + table.add_column('Plugin Name', style='cyan', no_wrap=True) + table.add_column('Info', style='bold yellow') + table.add_column('Type', style='bold green') + table.add_column('Plugin Path', style='bold blue') for entry in plugins: - table.add_row(entry["name"], entry["short_desc"], entry["type"], entry["path"]) + table.add_row(entry['name'], entry['short_desc'], entry['type'], entry['path']) console.print(table) def _get_pypi_packages(): if simple_r := requests.get( - "https://pypi.org/simple", - headers={"Accept": "application/vnd.pypi.simple.v1+json"}, + 'https://pypi.org/simple', + headers={'Accept': 'application/vnd.pypi.simple.v1+json'}, ): simple_response = simple_r.json() else: simple_response = {} - key = "aprsd" + key = 'aprsd' matches = [ - p["name"] for p in simple_response["projects"] if p["name"].startswith(key) + p['name'] for p in simple_response['projects'] if p['name'].startswith(key) ] packages = [] for pkg in matches: # Get info for first match if r := requests.get( - f"https://pypi.org/pypi/{pkg}/json", - headers={"Accept": "application/json"}, + f'https://pypi.org/pypi/{pkg}/json', + headers={'Accept': 'application/json'}, ): packages.append(r.json()) @@ -187,40 +187,40 @@ def show_pypi_plugins(installed_plugins, console): packages = _get_pypi_packages() title = Text.assemble( - ("Pypi.org APRSD Installable Plugin Packages\n\n", "bold magenta"), - ("Install any of the following plugins with\n", "bold yellow"), - ("'pip install ", "bold white"), - ("'", "cyan"), + ('Pypi.org APRSD Installable Plugin Packages\n\n', 'bold magenta'), + ('Install any of the following plugins with\n', 'bold yellow'), + ("'pip install ", 'bold white'), + ("'", 'cyan'), ) table = Table(title=title) - table.add_column("Plugin Package Name", style="cyan", no_wrap=True) - table.add_column("Description", style="yellow") - table.add_column("Version", style="yellow", justify="center") - table.add_column("Released", style="bold green", justify="center") - table.add_column("Installed?", style="red", justify="center") - emoji = ":open_file_folder:" + table.add_column('Plugin Package Name', style='cyan', no_wrap=True) + table.add_column('Description', style='yellow') + table.add_column('Version', style='yellow', justify='center') + table.add_column('Released', style='bold green', justify='center') + table.add_column('Installed?', style='red', justify='center') + emoji = ':open_file_folder:' for package in packages: - link = package["info"]["package_url"] - version = package["info"]["version"] - package_name = package["info"]["name"] - description = package["info"]["summary"] - created = package["releases"][version][0]["upload_time"] + link = package['info']['package_url'] + version = package['info']['version'] + package_name = package['info']['name'] + description = package['info']['summary'] + created = package['releases'][version][0]['upload_time'] - if "aprsd-" not in package_name or "-plugin" not in package_name: + if 'aprsd-' not in package_name or '-plugin' not in package_name: continue - under = package_name.replace("-", "_") - installed = "Yes" if under in installed_plugins else "No" + under = package_name.replace('-', '_') + installed = 'Yes' if under in installed_plugins else 'No' table.add_row( - f"[link={link}]{emoji}[/link] {package_name}", + f'[link={link}]{emoji}[/link] {package_name}', description, version, created, installed, ) - console.print("\n") + console.print('\n') console.print(table) @@ -228,39 +228,39 @@ def show_pypi_extensions(installed_extensions, console): packages = _get_pypi_packages() title = Text.assemble( - ("Pypi.org APRSD Installable Extension Packages\n\n", "bold magenta"), - ("Install any of the following extensions by running\n", "bold yellow"), - ("'pip install ", "bold white"), - ("'", "cyan"), + ('Pypi.org APRSD Installable Extension Packages\n\n', 'bold magenta'), + ('Install any of the following extensions by running\n', 'bold yellow'), + ("'pip install ", 'bold white'), + ("'", 'cyan'), ) table = Table(title=title) - table.add_column("Extension Package Name", style="cyan", no_wrap=True) - table.add_column("Description", style="yellow") - table.add_column("Version", style="yellow", justify="center") - table.add_column("Released", style="bold green", justify="center") - table.add_column("Installed?", style="red", justify="center") - emoji = ":open_file_folder:" + table.add_column('Extension Package Name', style='cyan', no_wrap=True) + table.add_column('Description', style='yellow') + table.add_column('Version', style='yellow', justify='center') + table.add_column('Released', style='bold green', justify='center') + table.add_column('Installed?', style='red', justify='center') + emoji = ':open_file_folder:' for package in packages: - link = package["info"]["package_url"] - version = package["info"]["version"] - package_name = package["info"]["name"] - description = package["info"]["summary"] - created = package["releases"][version][0]["upload_time"] - if "aprsd-" not in package_name or "-extension" not in package_name: + link = package['info']['package_url'] + version = package['info']['version'] + package_name = package['info']['name'] + description = package['info']['summary'] + created = package['releases'][version][0]['upload_time'] + if 'aprsd-' not in package_name or '-extension' not in package_name: continue - under = package_name.replace("-", "_") - installed = "Yes" if under in installed_extensions else "No" + under = package_name.replace('-', '_') + installed = 'Yes' if under in installed_extensions else 'No' table.add_row( - f"[link={link}]{emoji}[/link] {package_name}", + f'[link={link}]{emoji}[/link] {package_name}', description, version, created, installed, ) - console.print("\n") + console.print('\n') console.print(table) @@ -269,24 +269,24 @@ def show_installed_plugins(installed_plugins, console): return table = Table( - title="[not italic]:snake:[/] [bold][magenta]APRSD Installed 3rd party Plugins [not italic]:snake:[/]", + title='[not italic]:snake:[/] [bold][magenta]APRSD Installed 3rd party Plugins [not italic]:snake:[/]', ) - table.add_column("Package Name", style=" bold white", no_wrap=True) - table.add_column("Plugin Name", style="cyan", no_wrap=True) - table.add_column("Version", style="yellow", justify="center") - table.add_column("Type", style="bold green") - table.add_column("Plugin Path", style="bold blue") + table.add_column('Package Name', style=' bold white', no_wrap=True) + table.add_column('Plugin Name', style='cyan', no_wrap=True) + table.add_column('Version', style='yellow', justify='center') + table.add_column('Type', style='bold green') + table.add_column('Plugin Path', style='bold blue') for name in installed_plugins: for plugin in installed_plugins[name]: table.add_row( - name.replace("_", "-"), - plugin["name"], - plugin["version"], - plugin_type(plugin["obj"]), - plugin["path"], + name.replace('_', '-'), + plugin['name'], + plugin['version'], + plugin_type(plugin['obj']), + plugin['path'], ) - console.print("\n") + console.print('\n') console.print(table) @@ -298,14 +298,14 @@ def list_plugins(ctx): """List the built in plugins available to APRSD.""" console = Console() - with console.status("Show Built-in Plugins") as status: + with console.status('Show Built-in Plugins') as status: show_built_in_plugins(console) - status.update("Fetching pypi.org plugins") + status.update('Fetching pypi.org plugins') installed_plugins = get_installed_plugins() show_pypi_plugins(installed_plugins, console) - status.update("Looking for installed APRSD plugins") + status.update('Looking for installed APRSD plugins') show_installed_plugins(installed_plugins, console) @@ -317,9 +317,9 @@ def list_extensions(ctx): """List the built in plugins available to APRSD.""" console = Console() - with console.status("Show APRSD Extensions") as status: - status.update("Fetching pypi.org APRSD Extensions") + with console.status('Show APRSD Extensions') as status: + status.update('Fetching pypi.org APRSD Extensions') - status.update("Looking for installed APRSD Extensions") + status.update('Looking for installed APRSD Extensions') installed_extensions = get_installed_extensions() show_pypi_extensions(installed_extensions, console) diff --git a/pyproject.toml b/pyproject.toml index 9aea1f1..4de98a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -173,3 +173,20 @@ skip_gitignore = true branch = true [tool.setuptools_scm] + +[tool.ruff] +line-length = 88 +select = [ + "F", # pyflakes rules + "E", # pycodestyle error rules + "W", # pycodestyle warning rules + "B", # flake8-bugbear rules + # "I", # isort rules +] +ignore = [ + "E501", # line-too-long +] + +[tool.ruff.format] +indent-style = "space" +quote-style = "single" From cdd297c5bbc8b93f4739f5850a3e5971ce8baeba Mon Sep 17 00:00:00 2001 From: Hemna Date: Wed, 15 Jan 2025 08:18:48 -0500 Subject: [PATCH 29/40] Added activity to README --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 1e1d2e8..fb98140 100644 --- a/README.md +++ b/README.md @@ -420,3 +420,8 @@ constraints may also be provided. For example: environment: - APRSD_PLUGINS=aprsd-slack-plugin>=1.0.2,aprsd-twitter-plugin + + +### Activity + +![Alt](https://repobeats.axiom.co/api/embed/8b96657861770a15f0b851a5eebafb34d0e0b3d3.svg "Repobeats analytics image") From 02e29405ce2f8310e4f87f68498dfd6575c2e43b Mon Sep 17 00:00:00 2001 From: Hemna Date: Wed, 15 Jan 2025 17:52:21 -0500 Subject: [PATCH 30/40] Added star history to readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index fb98140..e78f6d2 100644 --- a/README.md +++ b/README.md @@ -425,3 +425,7 @@ constraints may also be provided. For example: ### Activity ![Alt](https://repobeats.axiom.co/api/embed/8b96657861770a15f0b851a5eebafb34d0e0b3d3.svg "Repobeats analytics image") + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=craigerl/aprsd&type=Date)](https://star-history.com/#craigerl/aprsd&Date) From 1cba31f0ac9bd5ee532721a909fc752f023f3b06 Mon Sep 17 00:00:00 2001 From: Hemna Date: Wed, 15 Jan 2025 17:55:12 -0500 Subject: [PATCH 31/40] removed pytest from README --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index e78f6d2..2fd6163 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ ## KM6LYW and WB4BOR [![pypi](https://badge.fury.io/py/aprsd.svg)](https://badge.fury.io/py/aprsd) -[![pytest](https://github.com/craigerl/aprsd/workflows/python/badge.svg)](https://github.com/craigerl/aprsd/actions) [![versions](https://img.shields.io/pypi/pyversions/aprsd.svg)](https://pypi.org/pypi/aprsd) [![slack](https://img.shields.io/badge/slack-@hemna/aprsd-blue.svg?logo=slack)](https://hemna.slack.com/app_redirect?channel=C01KQSCP5RP) ![issues](https://img.shields.io/github/issues/craigerl/aprsd) From 24db814c82c9bb6634566d7428603bf7a9ae37d1 Mon Sep 17 00:00:00 2001 From: Hemna Date: Wed, 15 Jan 2025 18:00:12 -0500 Subject: [PATCH 32/40] Updated Docker for using alpine and uv --- docker/Dockerfile | 67 +++++++++++++++++++++++++-------------------- docker/bin/run.sh | 8 ++++-- docker/bin/setup.sh | 6 ++-- 3 files changed, 47 insertions(+), 34 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 33747fe..1c87e5b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,6 +1,6 @@ -FROM python:3.11-slim AS build +FROM ghcr.io/astral-sh/uv:python3.11-alpine AS build -ARG VERSION=3.4.0 +ARG VERSION=3.5.0 # pass this in as 'dev' if you want to install from github repo vs pypi ARG INSTALL_TYPE=pypi @@ -8,7 +8,7 @@ ARG BRANCH=master ARG BUILDX_QEMU_ENV ENV APRSD_BRANCH=${BRANCH:-master} -ENV TZ=${TZ:-US/Eastern} +#ENV TZ=${TZ:-US/Eastern} ENV LC_ALL=C.UTF-8 ENV LANG=C.UTF-8 ENV APRSD_PIP_VERSION=${VERSION} @@ -23,49 +23,58 @@ ENV PIP_DEFAULT_TIMEOUT=100 \ PIP_NO_CACHE_DIR=1 -RUN set -ex \ - # Create a non-root user - && addgroup --system --gid 1001 appgroup \ - && useradd --uid 1001 --gid 1001 -s /usr/bin/bash -m -d /app appuser \ - && usermod -aG sudo appuser \ +#RUN set -ex \ +# # Create a non-root user +# && addgroup --system --gid 1001 appgroup \ +# && useradd --uid 1001 --gid 1001 -s /usr/bin/bash -m -d /app appuser \ +# && usermod -aG sudo appuser + +RUN apk add git + +#RUN set -ex \ # Upgrade the package index and install security upgrades - && apt-get update \ - && apt-get upgrade -y \ - && apt-get install -y git build-essential curl libffi-dev \ - python3-dev libssl-dev libxml2-dev libxslt-dev telnet sudo fortune \ +# && apt-get update \ +# && apt-get upgrade -y \ +# && apt-get install -y git build-essential curl libffi-dev \ +# python3-dev libssl-dev libxml2-dev libxslt-dev telnet sudo fortune \ # Install dependencies # Clean up - && apt-get autoremove -y \ - && apt-get clean -y +# && apt-get autoremove -y \ +# && apt-get clean -y + ### Final stage FROM build AS install WORKDIR /app - -RUN pip3 install -U pip RUN mkdir /config -RUN chown -R appuser:appgroup /app -RUN chown -R appuser:appgroup /config -USER appuser +RUN uv venv +RUN uv pip install -U pip + RUN if [ "$INSTALL_TYPE" = "pypi" ]; then \ - pip3 install aprsd==$APRSD_PIP_VERSION; \ + uv pip install aprsd==$APRSD_PIP_VERSION; \ elif [ "$INSTALL_TYPE" = "github" ]; then \ git clone -b $APRSD_BRANCH https://github.com/craigerl/aprsd; \ - cd /app/aprsd && pip install .; \ - ls -al /app/.local/lib/python3.11/site-packages/aprsd*; \ + cd /app/aprsd && uv pip install .; \ + ls -al /app/.venv/lib/python3.11/site-packages/aprsd*; \ fi -RUN pip install gevent uwsgi +# RUN uv pip install gevent uwsgi RUN echo "PATH=\$PATH:/usr/games:/app/.local/bin" >> /app/.bashrc -RUN which aprsd -RUN aprsd sample-config > /config/aprsd.conf -RUN aprsd --version +#RUN which aprsd +RUN uv run aprsd sample-config > /config/aprsd.conf +RUN uv run aprsd --version + +FROM ghcr.io/astral-sh/uv:python3.11-alpine +RUN apk add fortune bash git +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ +COPY --from=install /app /app +COPY --from=install /config config ADD bin/setup.sh /app ADD bin/admin.sh /app +ADD bin/listen.sh /app - -FROM install AS final +RUN ls -al /app # For the web admin interface EXPOSE 8001 @@ -74,7 +83,7 @@ ENTRYPOINT ["/app/setup.sh"] CMD ["server"] # Set the user to run the application -USER appuser +# USER appuser HEALTHCHECK --interval=1m --timeout=12s --start-period=30s \ CMD aprsd healthcheck --config /config/aprsd.conf --loglevel DEBUG diff --git a/docker/bin/run.sh b/docker/bin/run.sh index bd8adb3..eb8bdca 100755 --- a/docker/bin/run.sh +++ b/docker/bin/run.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash set -x +source /app/.venv/bin/activate + if [ ! -z "${APRSD_PLUGINS}" ]; then OLDIFS=$IFS IFS=',' @@ -9,7 +11,7 @@ if [ ! -z "${APRSD_PLUGINS}" ]; then IFS=$OLDIFS # call your procedure/other scripts here below echo "Installing '$plugin'" - pip3 install --user $plugin + uv pip install --user $plugin done fi @@ -21,7 +23,7 @@ if [ ! -z "${APRSD_EXTENSIONS}" ]; then IFS=$OLDIFS # call your procedure/other scripts here below echo "Installing '$extension'" - pip3 install --user $extension + uv pip install --user $extension done fi @@ -35,7 +37,7 @@ echo "Log level is set to ${LOG_LEVEL}"; APRSD_CONFIG="/config/aprsd.conf" if [ ! -e "$APRSD_CONFIG" ]; then echo "'$APRSD_CONFIG' File does not exist. Creating." - aprsd sample-config > $APRSD_CONFIG + uv run aprsd sample-config > $APRSD_CONFIG fi export COLUMNS=200 diff --git a/docker/bin/setup.sh b/docker/bin/setup.sh index 38125db..7c11e86 100755 --- a/docker/bin/setup.sh +++ b/docker/bin/setup.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash set -x +source /app/.venv/bin/activate + # The default command # Override the command in docker-compose.yml to change # what command you want to run in the container @@ -18,7 +20,7 @@ if [ ! -z "${APRSD_PLUGINS}" ]; then IFS=$OLDIFS # call your procedure/other scripts here below echo "Installing '$plugin'" - pip3 install --user $plugin + uv pip install --user $plugin done fi @@ -30,7 +32,7 @@ if [ ! -z "${APRSD_EXTENSIONS}" ]; then IFS=$OLDIFS # call your procedure/other scripts here below echo "Installing '$extension'" - pip3 install --user $extension + uv pip install --user $extension done fi From 044ea4cc9a0059101851d6e722e986ee236833e8 Mon Sep 17 00:00:00 2001 From: Hemna Date: Fri, 17 Jan 2025 00:40:39 +0000 Subject: [PATCH 33/40] Update the admin and setup.sh for container --- docker/bin/admin.sh | 10 +++++++--- docker/bin/setup.sh | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/docker/bin/admin.sh b/docker/bin/admin.sh index b0c6962..fe87084 100755 --- a/docker/bin/admin.sh +++ b/docker/bin/admin.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash set -x +source /app/.venv/bin/activate + if [ ! -z "${APRSD_PLUGINS}" ]; then OLDIFS=$IFS IFS=',' @@ -9,7 +11,7 @@ if [ ! -z "${APRSD_PLUGINS}" ]; then IFS=$OLDIFS # call your procedure/other scripts here below echo "Installing '$plugin'" - pip3 install --user $plugin + uv pip install $plugin done fi if [ ! -z "${APRSD_EXTENSIONS}" ]; then @@ -20,7 +22,7 @@ if [ ! -z "${APRSD_EXTENSIONS}" ]; then IFS=$OLDIFS # call your procedure/other scripts here below echo "Installing '$extension'" - pip3 install --user $extension + uv pip install $extension done fi @@ -40,5 +42,7 @@ fi export COLUMNS=200 #exec gunicorn -b :8000 --workers 4 "aprsd.admin_web:create_app(config_file='$APRSD_CONFIG', log_level='$LOG_LEVEL')" # exec gunicorn -b :8000 --workers 4 "aprsd.wsgi:app" -exec uwsgi --http :8000 --gevent 1000 --http-websockets --master -w aprsd.wsgi --callable app +#exec uwsgi --http :8000 --gevent 1000 --http-websockets --master -w aprsd.wsgi --callable app #exec aprsd listen -c $APRSD_CONFIG --loglevel ${LOG_LEVEL} ${APRSD_LOAD_PLUGINS} ${APRSD_LISTEN_FILTER} +# +uv run aprsd admin web -c $APRSD_CONFIG --loglevel ${LOG_LEVEL} diff --git a/docker/bin/setup.sh b/docker/bin/setup.sh index 7c11e86..105b71a 100755 --- a/docker/bin/setup.sh +++ b/docker/bin/setup.sh @@ -20,7 +20,7 @@ if [ ! -z "${APRSD_PLUGINS}" ]; then IFS=$OLDIFS # call your procedure/other scripts here below echo "Installing '$plugin'" - uv pip install --user $plugin + uv pip install $plugin done fi @@ -32,7 +32,7 @@ if [ ! -z "${APRSD_EXTENSIONS}" ]; then IFS=$OLDIFS # call your procedure/other scripts here below echo "Installing '$extension'" - uv pip install --user $extension + uv pip install $extension done fi From 10549995686b08e4c166f780efdec5bdae496cab Mon Sep 17 00:00:00 2001 From: Hemna Date: Fri, 17 Jan 2025 00:44:43 +0000 Subject: [PATCH 34/40] added healthcheck.sh --- docker/Dockerfile | 2 +- docker/bin/healthcheck.sh | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100755 docker/bin/healthcheck.sh diff --git a/docker/Dockerfile b/docker/Dockerfile index 1c87e5b..fd7ff03 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -86,4 +86,4 @@ CMD ["server"] # USER appuser HEALTHCHECK --interval=1m --timeout=12s --start-period=30s \ - CMD aprsd healthcheck --config /config/aprsd.conf --loglevel DEBUG + CMD uv run aprsd healthcheck --config /config/aprsd.conf --loglevel DEBUG diff --git a/docker/bin/healthcheck.sh b/docker/bin/healthcheck.sh new file mode 100755 index 0000000..fd4eed2 --- /dev/null +++ b/docker/bin/healthcheck.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# +# This is the docker container healthcheck script +# It's assumed to be running in a working aprsd container. +set -x + +source /app/.venv/bin/activate + +if [ -z "${LOG_LEVEL}" ] || [[ ! "${LOG_LEVEL}" =~ ^(CRITICAL|ERROR|WARNING|INFO)$ ]]; then + LOG_LEVEL="DEBUG" +fi + +echo "Log level is set to ${LOG_LEVEL}"; + +# check to see if there is a config file +APRSD_CONFIG="/config/aprsd.conf" +if [ ! -e "$APRSD_CONFIG" ]; then + echo "'$APRSD_CONFIG' File does not exist. Creating." + aprsd sample-config > $APRSD_CONFIG +fi + +uv run aprsd healthcheck --config $APRSD_CONFIG --loglevel ${LOG_LEVEL} From dabb48c6f64062c1fed8f83a4f0b8ffba0c206a5 Mon Sep 17 00:00:00 2001 From: Hemna Date: Sat, 18 Jan 2025 21:25:47 +0000 Subject: [PATCH 35/40] updated healthcheck.sh --- docker/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index fd7ff03..ad5c6af 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -73,6 +73,7 @@ COPY --from=install /config config ADD bin/setup.sh /app ADD bin/admin.sh /app ADD bin/listen.sh /app +ADD bin/healthcheck.sh /app RUN ls -al /app # For the web admin interface @@ -86,4 +87,4 @@ CMD ["server"] # USER appuser HEALTHCHECK --interval=1m --timeout=12s --start-period=30s \ - CMD uv run aprsd healthcheck --config /config/aprsd.conf --loglevel DEBUG + CMD /app/healthcheck.sh From ba8acdc5849fc7b2d8a1ee11af6f5e317cf30f45 Mon Sep 17 00:00:00 2001 From: Hemna Date: Wed, 22 Jan 2025 16:49:12 -0500 Subject: [PATCH 36/40] try making image for webchat --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2fd6163..f32304b 100644 --- a/README.md +++ b/README.md @@ -88,8 +88,10 @@ You can see the [available plugins/extensions on pypi here:](https://pypi.org/se > [!NOTE] > aprsd admin and webchat have been extracted into separate extensions. -> [See admin extension here](https://github.com/hemna/aprsd-admin-extension) -> [See webchat extension here](https://github.com/hemna/aprsd-webchat-extension) + * [See admin extension here](https://github.com/hemna/aprsd-admin-extension) + + * [See webchat extension here](https://github.com/hemna/aprsd-webchat-extension) + ### APRSD Overview Diagram From 0ed648f8f8a961dbbd9e22bcebadcde525ee41ae Mon Sep 17 00:00:00 2001 From: Hemna Date: Thu, 23 Jan 2025 08:23:11 -0500 Subject: [PATCH 37/40] Added APRSD logo --- README.md | 2 ++ aprsd_logo.png | Bin 0 -> 215396 bytes 2 files changed, 2 insertions(+) create mode 100644 aprsd_logo.png diff --git a/README.md b/README.md index f32304b..ecc205f 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ [APRSD](http://github.com/craigerl/aprsd) is a Ham radio [APRS](http://aprs.org) message command gateway built on python. +![image](./aprsd_logo.png) + ### Table of Contents 1. [What is APRSD](#what-is-aprsd) diff --git a/aprsd_logo.png b/aprsd_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f5a44ae68a5297a75572e6369f7e953e5a642464 GIT binary patch literal 215396 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 WI-H*vc=Ze5I(8WLW1+3rum1w}EwEVt literal 0 HcmV?d00001 From 447451c6c97e1f2d3d0bf580db21ecd176690258 Mon Sep 17 00:00:00 2001 From: Hemna Date: Thu, 23 Jan 2025 08:51:23 -0500 Subject: [PATCH 38/40] Added plugin and extension links This patch updates the README.md file to link to existing plugins and extensions. --- README.md | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ecc205f..dcb64f8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# APRSD - Ham radio APRS-IS Message plugin server +# APRSD - Ham radio APRS-IS Message platform software ## KM6LYW and WB4BOR @@ -11,7 +11,7 @@ [![down](https://static.pepy.tech/personalized-badge/aprsd?period=month&units=international_system&left_color=black&right_color=orange&left_text=Downloads)](https://pepy.tech/project/aprsd) [APRSD](http://github.com/craigerl/aprsd) is a Ham radio -[APRS](http://aprs.org) message command gateway built on python. +[APRS](http://aprs.org) message platform built with python. ![image](./aprsd_logo.png) @@ -60,7 +60,7 @@ ### What is APRSD -APRSD is a python application for interacting with the APRS network and +APRSD is a python application for interacting with the APRS network and Ham radios with KISS interfaces and providing APRS services for HAM radio operators. APRSD currently has 4 main commands to use. @@ -77,7 +77,7 @@ APRSD currently has 4 main commands to use. Each of those commands can connect to the APRS-IS network if internet connectivity is available. If internet is not available, then APRS can -be configured to talk to a TCP KISS TNC for radio connectivity. +be configured to talk to a TCP KISS TNC for radio connectivity directly. Please [read the docs](https://aprsd.readthedocs.io) to learn more! @@ -89,12 +89,37 @@ APRSD Has the ability to add plugins and extensions. Plugins add new message fi You can see the [available plugins/extensions on pypi here:](https://pypi.org/search/?q=aprsd) [https://pypi.org/search/?q=aprsd](https://pypi.org/search/?q=aprsd) > [!NOTE] -> aprsd admin and webchat have been extracted into separate extensions. +> aprsd admin and webchat commands have been extracted into separate extensions. * [See admin extension here](https://github.com/hemna/aprsd-admin-extension) * [See webchat extension here](https://github.com/hemna/aprsd-webchat-extension) +### List of existing plugins - APRS Message processing/responders + + - [aprsd-email-plugin](https://github.com/hemna/aprsd-email-plugin) - send/receive email! + - [aprsd-location-plugin](https://github.com/hemna/aprsd-location-plugin) - get latest GPS location. + - [aprsd-locationdata-plugin](https://github.com/hemna/aprsd-locationdata-plugin) - get latest GPS location + - [aprsd-digipi-plugin](https://github.com/hemna/aprsd-digipi-plugin) - Look for digipi beacon packets + - [aprsd-w3w-plugin](https://github.com/hemna/aprsd-w3w-plugin) - get your w3w coordinates + - [aprsd-mqtt-plugin](https://github.com/hemna/aprsd-mqtt-plugin) - send aprs packets to an MQTT topic + - [aprsd-telegram-plugin](https://github.com/hemna/aprsd-telegram-plugin) - send/receive messages to telegram + - [aprsd-borat-plugin](https://github.com/hemna/aprsd-borat-plugin) - get Borat quotes + - [aprsd-wxnow-plugin](https://github.com/hemna/aprsd-wxnow-plugin) - get closest N weather station reports + - [aprsd-weewx-plugin](https://github.com/hemna/aprsd-weewx-plugin) - get weather from your weewx weather station + - [aprsd-slack-plugin](https://github.com/hemna/aprsd-slack-plugin) - send/receive messages to a slack channel + - [aprsd-sentry-plugin](https://github.com/hemna/aprsd-sentry-plugin) - + - [aprsd-repeat-plugins](https://github.com/hemna/aprsd-repeat-plugins) - plugins for the REPEAT service. Get nearest Ham radio repeaters! + - [aprsd-twitter-plugin](https://github.com/hemna/aprsd-twitter-plugin) - make tweets from your Ham Radio! + - [aprsd-timeopencage-plugin](https://github.com/hemna/aprsd-timeopencage-plugin) - Get local time for a callsign + - [aprsd-stock-plugin](https://github.com/hemna/aprsd-stock-plugin) - get stock quotes from your Ham radio + +### List of existing extensions - Add new capabilities to APRSD + + - [aprsd-admin-extension](https://github.com/hemna/aprsd-admin-extension) - Web Administration page for APRSD + - [aprsd-webchat-extension](https://github.com/hemna/aprsd-webchat-extension) - Web page for APRS Messaging + - [aprsd-irc-extension](https://github.com/hemna/aprsd-irc-extension) - an IRC like server command for APRS + ### APRSD Overview Diagram ![image](https://raw.githubusercontent.com/craigerl/aprsd/master/docs/_static/aprsd_overview.svg?sanitize=true) From cf4a29f0cb3ed366b21ec3120a189614e0955180 Mon Sep 17 00:00:00 2001 From: Hemna Date: Thu, 23 Jan 2025 08:55:06 -0500 Subject: [PATCH 39/40] reduced logo size 50% --- aprsd_logo.png | Bin 215396 -> 101680 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/aprsd_logo.png b/aprsd_logo.png index f5a44ae68a5297a75572e6369f7e953e5a642464..16c52814fac394225aac361e91ad94c247599eb7 100644 GIT binary patch delta 99241 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

qRaWpd5;xcrjrqM4&K~y}UEU#~<6#fq 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%0DS_S0GdKw(cW$Skvtv!f|!dx*xpX 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 WgeXTsA&mP1{!x}!m#dO73;I8=5%9eL literal 215396 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 WI-H*vc=Ze5I(8WLW1+3rum1w}EwEVt From 375a5e5b34718cadc6ee8a51484fc91441440a61 Mon Sep 17 00:00:00 2001 From: Hemna Date: Fri, 24 Jan 2025 16:23:42 -0500 Subject: [PATCH 40/40] Updated README.md TOC Updated the table of contents --- README.md | 61 +++++++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index dcb64f8..6cd8254 100644 --- a/README.md +++ b/README.md @@ -15,40 +15,35 @@ ![image](./aprsd_logo.png) -### Table of Contents +# Table of Contents -1. [What is APRSD](#what-is-aprsd) -2. [APRSD Overview Diagram](#aprsd-overview-diagram) -3. [Typical Use Case](#typical-use-case) -4. [Installation](#installation) -5. [Example Usage](#example-usage) -6. [Help](#help) -7. [Commands](#commands) - - [Configuration](#configuration) - - [Server](#server) - - [Current List of Built-in - Plugins](#current-list-of-built-in-plugins) - - [Pypi.org APRSD Installable Plugin - Packages](#pypiorg-aprsd-installable-plugin-packages) - - [🐍 APRSD Installed 3rd Party - Plugins](#aprsd-installed-3rd-party-plugins) - - [Send Message](#send-message) - - [Send Email (Radio to SMTP - Server)](#send-email-radio-to-smtp-server) - - [Receive Email (IMAP Server to - Radio)](#receive-email-imap-server-to-radio) - - [Location](#location) - - [Web Admin Interface](#web-admin-interface) -8. [Development](#development) - - [Building Your Own APRSD - Plugins](#building-your-own-aprsd-plugins) -9. [Workflow](#workflow) -10. [Release](#release) -11. [Docker Container](#docker-container) - - [Building](#building-1) - - [Official Build](#official-build) - - [Development Build](#development-build) - - [Running the Container](#running-the-container) +1. [APRSD - Ham radio APRS-IS Message platform software](#aprsd---ham-radio-aprs-is-message-platform-software) +2. [What is APRSD](#what-is-aprsd) +3. [APRSD Plugins/Extensions](#aprsd-pluginsextensions) +4. [List of existing plugins - APRS Message processing/responders](#list-of-existing-plugins---aprs-message-processingresponders) +5. [List of existing extensions - Add new capabilities to APRSD](#list-of-existing-extensions---add-new-capabilities-to-aprsd) +6. [APRSD Overview Diagram](#aprsd-overview-diagram) +7. [Typical use case](#typical-use-case) +8. [Installation](#installation) +9. [Example usage](#example-usage) +10. [Help](#help) +11. [Commands](#commands) +12. [Configuration](#configuration) +13. [server](#server) +14. [Current list plugins](#current-list-plugins) +15. [Current list extensions](#current-list-extensions) +16. [send-message](#send-message) +17. [Development](#development) +18. [Release](#release) +19. [Building your own APRSD plugins](#building-your-own-aprsd-plugins) +20. [Overview](#overview) +21. [Docker Container](#docker-container) +22. [Building](#building) +23. [Official Build](#official-build) +24. [Development Build](#development-build) +25. [Running the container](#running-the-container) +26. [Activity](#activity) +27. [Star History](#star-history) ---