This patch updates the aprsd listen command to add the packet-plugins
argument which allows enabling a single plugin to work against the
packets recieved from the aprsis network.
This patch adds basic ratelimiting to sending out AckPackets
and non AckPackets. This provides a basic way to prevent
aprsd from sending out packets as fast as possible, which isn't
great for a bandwidth limited network.
This patch also adds some keepalive checks to all threads in the
threadslist as well as the network client objects (apris, kiss)
For whatever reason passing in group in python 3.9.x
fails for importlib_metadata.entry_points. This patch
fetches all and filters through them to get the real
oslo.config.opts entry points now. This is to find all
of the config options of aprsd and the plugins
After adding the rpc service for aprsd server and separating the
admin web REST interface, healthcheck no longer worked. The stats
are available via rpc now.
This patch adds the ObjectPacket. This is used by the REPEAT plugins
to send out an object in message packet to let radios tune directly
to the station.
The regex search is now by default case insensitive.
Also update each core plugin to better match the command.
ping plugin can now match on
p
p foo
ping
pIng
Weather plugins can now match on
w
wx
wX
Wx KM6LYW
weather
WeaTher
This patch moves the plugin manager to early in the startup
process so that the plugins get loaded, which also means each
plugin's custom config settings will be in the CONF object.
This allows dumping the entire CONF with all the plugin settings.
This patch introduces rpyc based RPC client/server for
the flask web interface to call into the running aprsd server
command to fetch stats, logs, etc to send to the browser.
This allows running the web interface via gunicorn command
gunicorn -k gevent --reload --threads 10 -w 1 aprsd.flask:app --log-level DEBUG
This patch is the initial conversion of the custom config
and config file yaml format to oslo_config's configuration mechanism.
The resulting config format is now an ini type file.
The default location is ~/.config/aprsd/aprsd.conf
This is a backwards incompatible change. You will have to rebuild
the config file and edit it.
Also any aprsd plugins can now define config options in code and
add an setup.cfg entry_point definition
oslo_config.opts =
foo.conf = foo.conf:list_opts
This patch decouples sending a message from the internals of
the Packet classes. This allows the rest of the code to use
Packet objects as type hints in methods to enforce Packets
in the plugins.
The send method was moved to a single place in the threads.tx.send()
This patch updates both the webchat and listen commands
to be able to use the new queue based packet RX processing.
APRSD used to start a thread for every packet received, now
packets are pushed into a queue for processing by other threads
already running.
This patch cleans up the Packet class attributes used to
keep track of how many times packets have been sent and
the last time they were sent. This is used by the PacketTracker
and the tx threads for transmitting packets
The messaging.py now is nothing but a shell that
contains a link to packets.NULL_MESSAGE to help maintain
some backwards compatibility with plugins.
Packets dataclass has fully replaced messaging objects.
This patch adds the needed code to construct the raw output
string for sending a GPSPacket.
TODO: Need to incorporate speed, course, rng, position ambiguity ?
TODO: Need to add option to 'compress' the output location data.
This patch reworks all the packet processing to use the new
Packets objects. Nuked all of the messaging classes.
backwards incompatible changes
all messaging.py classes are now gone and replaced by
packets.py classes
With more testing of the webchat beaconing, found a problem
with the packet format for the beacon. This patch fixes the
packet format of the beacon.
Also added a timeout when trying to get the GPS location in the browser,
otherwise it could never come back.
the device detector was taking 1 minute on a raspi to parse out the
user-agent string from the browser. user-agents takes 2 seconds,
which still isn't great, but 'doable' for the webchat interface.
This patch refactors the rx threads a bit to reuse some code
responsible for processing acks when packets are received.
This also eliminates a custom thread in the webchat command for
processing received packets now that there is common code in the base
classes.
This patch fixes an issue where aprsd was deciding if it was
supposed to process a packet destined for itself or not. It was
making a case sensitive comparison. This patch makes that comparison
case insensitive for the callsign itself.
This patchset allow getting the GPS coordinates from the browser's
geolocation API (which can be denied by user), then send's the GPS
coordinates to aprsd via socketio and then aprsd sends a beacon.
This allows the APRS network to know the location of the person running
the webchat app via browser so packets can get routed back to it.
This patch reworks the KISS client to get rid of
aioax25 as it was too difficult to work with due to
heavy use of asyncio.
Switched to the kiss3 pypi library.
This patch updates the main aprsd threads class to use
a shared queue to notify all aprsd thread classes they need
to exit. This ensures any closing down of sockets, etc happens from
inside the context of the thread itself, not the MainThread that
calls stop.
This patch changes how aprsd identifies itself when connected to
any client, which is not relying on the login for each client.
There are 3 supported clients currently
aprsis,
tcpkiss
serialkiss.
Each client has their own potential login/callsign to connect
to the remote. This patch tells aprsd to use the new config option
aprsd.callsign as a means to identify itself. It will accept
packets as <aprsd.callsign> and reply as <aprsd.callsign> regardless
of which client object is being used to connect to the remote.
Note: this breaks backwards compatibility. This patch now requires
the new config option
aprsd:
callsign: <callsign>
This patch creates a threads directory and separates out
the contents of threads.py into separate files in the
threads directory to make it easier to find and maintain.
This patch updates the config option checking for
required fields in the config yaml file. Specifically
for the existence of the aprsd: section
and the required fields for the 3 supported client types
apris,
kiss serial,
kiss tcp
This patch changes the base Message class to
ensure that all printing of the message class only
outputs the message in the truncated and bad word filtering
enabled in the log.
The APRS_LOGIN and APRS_PASSWORD arguments now fallback
to the config file if it exists.
First it checks the passed in parameters, then checks the
environement vars, then checks the parsed config to find the
login and password.
This patch also adds unit tests for the send-message command to
check the fallback.
This patch fixes an issue with the processing of packets
and updateing the watchlist. Previously after the
notify plugin processed the packet it would update the watchlist.
This doesn't work when there are more than 1 notify plugins
enabled, only the first notify plugin seeing the packet will
recognize that the callsign is old.
This patch updates the logging facility to ensure that
logging to a file works even when --quiet mode is selected.
Also update the listen and list-plugins command to show
a console.status line while waiting for results to come in.
This patch updates the ouput of the list-plugins command.
This also adds the ability to show the available plugins
to install that are published packages on pypi.org.
This also shows the list of installed packages from pypi.org
The watchlist notify plugin is supposed to send an APRS message
to the configured callsign. This patch makes sure that the
message is sent to the notify_callsign
The python rich library is extensive and has a really nice
log format that is easier to read and has built in formatting
and coloring of the log output.
To enable rich logging add rich_logging: True in the config file.
This patch updates the healthcheck command to not require
the aprsd.yml config file to exist. The healthcheck
calls a running aprsd, collects the stats to determine if it's
healthy.
This removed the requirement of running APRSD for specifying
the aprs.fi key in the config file. The plugins that need the
key have been updated to set enabled = False when the key is missing.
This patch refactors the cli to incorporate
the dev, send-message, listen commands into the main aprsd app.
This also moves the command line completion installer/show into
it's own subgroup.
This patch fixes a problem with the packets object
not being initialized correctly for the send-message command
from the command line.
Also adds the --wait-response option for send-message, which by
default is now False
This patch ensures that the pickle file is opened and closed correctly
as well as trapping for any exceptions that might occur while loading
a pickle file.
This patch initializes all of the MsgTrack, WatchList and SeenList
prior to the plugins loading. Some plugins may kick off messages
being sent immediately. So everything has to be ready to go
prior to the plugins being loaded.
This patch adds the new objectstore Mixin class that enables
classes that store their date in self.data as a serializeable dict,
to be able to be stored to disk at shutdown and loaded at startup.
The SeenList and WatchList are now saved/loaded to/from disk.
This patch adds the always enabled HelpPlugin. This plugin
now will respond to the 'help' or 'h' commands that will
automatically build a help string based on the number of
enabled plugins. It will also respond to
help <plugin> with the plugin specific help
This patch updates the aprsd-dev command's log file format
to use what's defined as the default and/or use the config file
setting like aprsd server does.
The email plugin was still using globals for tracking
the check_email_delay as well as the config. This
patch creates a new singleton thread safe mechanism for
check_email_delay with the EmailInfo class.
This patch completely refactors and simplifies how the clients
are created and used. There is no need now to have a separate
KISSRXThread. Since all the custom work for the KISS client is
encapsulated in the kiss client itself, the same RX thread and
callback mechanism works for both the APRSIS client and KISS Client
objects. There is also no need to determine which transport
(aprsis vs kiss) is being used at runtime by any of the messages
objects. The same API works for both APRSIS and KISS Client objects
Started noticing that aprs-is keepalive messages just stop
getting sent. This causes aprsd to basically disconnect from
the APRS network. Added a check into the KeepAlive thread to
restart the aprs-is connecter if the last time we got a keepalive
from apris is > 5 minutes.
This patch enables the ability for plugins to return:
* string
* list of strings
* message object
* list of strings and message ojects
Each string will be encapsulated in a message object prior being sent.
each message object will be sent directly.
Each list will be iterated over and processed according to the above 2
options.
This allows the admin interface to see which plugins are registered and
enabled. Enabled is a flag that is set in the setup() method of the
plugin. This gives the plugin developer a chance to disable the plugin
if something isn't right at setup time. This allows aprsd to ignore
plugins that are registered but not emabled.