Commit graph

2922 commits

Author SHA1 Message Date
657b2cc87d
Create the default configuration file even if --config is supplied but the file doesn't exist. 2023-08-17 11:25:49 +02:00
24b04d9103
s/--config-file/--config/ option in Dockerfile. 2023-08-17 10:35:40 +02:00
bf7d060b81
Added @ensure_initialized decorator to actions in variable.
The `variable` plugin may break in the constructor the first time the
application is started.

That's because it tries to initialize the cache of stored variables, but
the local database hasn't yet been initialized.

That's because plugins are registered _before_ the entities engine is
initialized, as the entities engine assumes that it already has plugins
to scan for entities.

Therefore, the initialization of the `variable` plugin's cache should be
lazy (only done upon the first call to `get`/`set` etc.), in order to
prevent deadlock situations where the plugin waits for the engine to
start, but the engine will be initialized only after the plugin is
ready.

And the lazy initialization logic should also ensure that the entities
engine has been properly started (and emit a `TimeoutError` if that's
not the case), in order to prevent race conditions.
2023-08-17 02:47:30 +02:00
adfedfa2dd
s/TimeoutError/AssertionError/ if get_entities_engine times out. 2023-08-17 02:36:40 +02:00
ec2b8da983
Ignore Redis errors when a backend sends an unregister notify event.
When that happens, it's most likely that the application is already
stopping and the Redis service has already been terminated.
2023-08-17 01:49:41 +02:00
3bf068e0b2
The __main__ function should take no arguments.
setup.py won't pass any arguments to `main()`, so the default entry
point should get them itself from `sys.argv`.
2023-08-17 01:35:39 +02:00
98e9abde18
Extended manifest files with Python system packages (if available).
- If a Python optional dependency is available as a system package on
  the target system, try and install it that route rather than pip. It's
  usually faster and it decreases the risk of breaking system packages.

- Added support for apk dependencies in manifest files. This brings the
  number of distros officially supported by all the extensions to four:

  - Alpine
  - Arch
  - Debian
  - Ubuntu
2023-08-16 22:43:51 +02:00
00863a176e
Added application plugin. 2023-08-15 11:20:24 +02:00
f51beb271e
Large refactor + stability fixes for the external process control logic. 2023-08-15 11:12:21 +02:00
46245e851f
Synchronize with the currently running stop thread (if any) in Backend.wait_stop. 2023-08-15 02:08:47 +02:00
a8a7ceb2ac
Implemented HttpBackend._stop_workers.
The Tornado WSGI container won't guarantee the termination of the
spawned workers upon termination, so the code of the backend has to take
care of it and terminate all the children processes of the server
process when it terminates.

This also means that `psutil` is now a required base dependency, as we
need to expand the process subtree under the webserver launcher.
2023-08-15 00:13:34 +02:00
04921c759f
Added wait_stop method to the entities engine and cron scheduler. 2023-08-14 23:49:47 +02:00
ceb9d6d1ba
Removed redundant Backend._get_redis() method.
It was used only once, and it could easily be replaced by
`platypush.utils.get_redis()`.
2023-08-14 23:37:38 +02:00
7157936b87
Added get_remaining_timeout utility function. 2023-08-14 23:17:50 +02:00
dc1a152433
Added get_default_pid_file utility method. 2023-08-14 10:47:25 +02:00
c11bc69a66
Handle KeyboardInterrupt and process return code in the main. 2023-08-13 23:55:40 +02:00
8819a0ed4c
Added CommandStream to the main Application.
The stream will be used to communicate command messages from the
application to its runner.
2023-08-13 23:51:21 +02:00
06111587f7
Added CommandStream class.
This abstraction is used to write and read commands over a UNIX socket.
2023-08-13 23:37:51 +02:00
c89f992867
Added StopCommand and RestartCommand. 2023-08-13 23:36:36 +02:00
b1f244a812
Added ControllableProcess class.
This class can be used to easily control the execution of underlying
processes.
2023-08-13 23:33:08 +02:00
efef9d7bc0
Added commands module. 2023-08-13 23:21:36 +02:00
97adc3f775
Moved application argument parser to an external platypush.cli module. 2023-08-13 22:27:16 +02:00
1819ee75ef
s/Application.stop_app/Application.stop/g 2023-08-13 22:23:15 +02:00
827b564006
Using a single constant for DEFAULT_REDIS_QUEUE.
Also, catch `AttributeError` on `self._proc.terminate` in the
`HttpBackend`, since the process may already have been terminated and
set to null by another worker process.
2023-08-13 22:20:16 +02:00
4062ddbcf0
More improvements to the inspect plugin.
- Support for distinct `type` field on constructor and method arguments.

- Added `has_varargs` field.

- Added `required` field.

- Better logic for parsing arguments `default` values.
2023-08-08 20:47:27 +02:00
9beb0a7af3
Skip :type: annotations from docstring args documentation. 2023-08-08 20:47:27 +02:00
2a30f060b4
Parse the arguments list from obj_type.__init__.__doc__ too. 2023-08-08 20:47:27 +02:00
1474685cc0
[Automatic] Updated UI files 2023-08-06 22:51:57 +00:00
26b4dcba46
Reduced padding of ConfirmDialog body element. 2023-08-07 00:50:10 +02:00
5184543a3e
Normalize the size of the camera frame container from window size.
If the window is smaller than the camera resolution, then we should
scale down the container size accordingly.
2023-08-07 00:38:19 +02:00
dd313c6371
[Automatic] Updated UI files 2023-08-06 21:50:25 +00:00
2f007888fc
[Automatic] Updated UI files 2023-08-06 21:48:33 +00:00
609a8c6052
[Automatic] Updated UI files 2023-08-06 21:46:44 +00:00
276a9a7421
[Automatic] Updated UI files 2023-08-06 21:44:51 +00:00
715cdcfcff
More consistent style for the buttons on the tokens settings page. 2023-08-06 23:42:50 +02:00
bd49e460d5
More style improvements for the user settings panel. 2023-08-06 23:36:06 +02:00
6eed558342
More improvements on the users settings panel. 2023-08-06 23:14:54 +02:00
1d47b35219
Updated UI dependencies 2023-08-06 20:38:46 +02:00
237e0c47cb
Redesigned config panel UI. 2023-08-06 18:49:03 +02:00
53aeb0b3b1
Better documentation for the Redis server + LINT fixes.
1. Added documentation to the README on the possible options to run the
   Redis service.

2. Show a relevant message to the user if the application is run with
   `--start-redis` and Redis couldn't start.

3. Some LINT/black chores on some files that hadn't been touched in a
   while.
2023-08-02 22:17:11 +02:00
e4756eb639
Replaced deprecated flask.escape with markupsafe.escape. 2023-07-25 00:26:15 +02:00
91cd08cdff
Adapted tests to use a locally started Redis instance. 2023-07-24 10:37:07 +02:00
7a20fec52f
[#60] Added --workdir and --logsdir command-line options.
Also, the application is now using `XDG_CONFIG_HOME` and
`XDG_DATA_HOME` if available to lookup the configuration file and
working directory.

Closes: #60
2023-07-24 03:29:08 +02:00
c1d66abb89
[#60] Added --workdir and --logsdir command-line options.
Closes: #60
2023-07-24 03:20:18 +02:00
5fd40af285 Revert "Added explicit --help option."
This reverts commit 1304be0718.
2023-07-24 02:38:12 +02:00
1304be0718 Added explicit --help option.
argparse.ArgumentParser doesn't seem to add the option automatically
anymore.
2023-07-24 02:11:42 +02:00
e9a568fdd2
Unified interface to retrieve the Redis bus configuration.
A common `utils.get_redis_conf` has been created to handle the cascade
fallback logic used to retrive the default Redis configuration.
2023-07-24 01:04:13 +02:00
77ffefdccb
Added a Config.set method.
A useful interface to change configuration values at runtime.
2023-07-24 00:48:07 +02:00
dd862db29a
[chore] LINT fixes 2023-07-24 00:35:03 +02:00
3e3d47aa44
Check first the configuration of the Redis plugin and then that of the backend. 2023-07-24 00:26:49 +02:00
315a89fb65
Added a default parameter to Config.get. 2023-07-23 23:31:57 +02:00
37dcaba7a1
Refactored structure of main application and startup scripts.
The main application class has been moved from __init__ to the app
module.

__init__ will contain instead the relevant global variables and the
modules and objects exposed to external integrations - such as
`get_plugin` and `get_backend`, or the `main` itself.

This will make future integrations much easier - the global __init__
doesn't contain any business logic now, it can import anything without
fearing circular dependencies, and it can limit its exposed objects to
those that we want to expose to 3rd-party integrations and scripts.

It will also make it easier to extend the main entry point with
additional logic - such as a supervisor or an embedded Redis server.
2023-07-23 23:12:36 +02:00
0dc380fa94
Removed dependency from prctl.
Also, black'd and LINT-fixed some files that hadn't been touched in a
while.
2023-07-23 19:17:30 +02:00
15a34ebac9
Upgraded Docker base image.
Debian base image bumped from Bullseye -> Bookworm.
2023-07-23 17:25:52 +02:00
cfdecd5703
[#267] Don't show the PWA popup again after the user dismisses it.
Plus, upgraded a bunch of frontend libraries.

Closes: #267
2023-07-23 02:44:17 +02:00
454228c56e
Upgraded UI dependencies 2023-07-23 02:42:14 +02:00
dependabot[bot]
33699fcac8
Bump word-wrap from 1.2.3 to 1.2.5 in /platypush/backend/http/webapp
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.5.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.5)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-22 21:48:53 +00:00
dependabot[bot]
505cba44b8
Bump webpack from 5.70.0 to 5.88.2 in /platypush/backend/http/webapp
Bumps [webpack](https://github.com/webpack/webpack) from 5.70.0 to 5.88.2.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.70.0...v5.88.2)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-22 21:46:59 +00:00
1d98f54c54
Bump version: 0.50.2 → 0.50.3 2023-07-22 23:36:04 +02:00
66981bd00b
Updated email addresses and black'd some old source files. 2023-07-22 23:02:44 +02:00
3eda0c6f17
[#268] Implemented XMPP integration. 2023-07-22 22:36:36 +02:00
63afd90701
Serialize exceptions in the default JSON serializers.
This allows us to easily pass errors in internal JSON payloads, and
ensure that these are serialized consistently across all the
integrations.
2023-07-22 15:14:05 +02:00
cef9d0e007
Always serialize exception names when logging/returning request exceptions. 2023-07-22 15:13:17 +02:00
d49e5b1f6a
Expose Config.workdir property.
This is a useful proxy to avoid using `Config.get('workdir')` string
lookup.
2023-07-22 15:11:58 +02:00
c846c61493
Refactored Config.__init__.
The constructor of the `Config` class had grown too big. It's much more
manageable if split into multiple sub-constructor helpers.
2023-07-15 13:38:07 +02:00
0a3d6add83
Support ./config.yaml as a config file location. 2023-07-15 01:29:41 +02:00
fa1364d854
Improved logging for requests, responses and events.
- The following logging namespaces are now used, to make it easier to
  filter only log lines related to the logged application message:

  - `platypush:events`
  - `platypush:requests`
  - `platypush:responses`

- Those messages are always logged as JSON, with no prefixes nor
  suffixes.

- Requests are always logged when executed - no more delegation to the
  upstream backend.

- Responses are always logged when fully populated (including `id`,
  `origin`, `target` etc.), instead of being logged when still partially
  populated. This makes it particularly easy to link request/response
  IDs directly from the logs.
2023-07-15 01:11:45 +02:00
cb04af0bbd
Catch TypeError when execution an action.
Most of TypeError are due to the user passing wrong data. It usually
doesn't mean that we have to fail hard and reload the plugin, nor retry
the call with the same parameters.
2023-07-14 22:20:27 +02:00
27cf1bec52
Removed some optional top-level imports.
Optional top-level imports in Tornado route declarations will trigger
`ImportError`. While this will just mean that those routes will be
skipped, it will also generate a lot of noise on the logs.
2023-07-01 03:13:38 +02:00
e0af2daaff
Bump version: 0.50.1 → 0.50.2 2023-06-30 23:12:40 +02:00
42a990a132
Format string typo fix 2023-06-30 23:07:00 +02:00
9a7fc031d9
A more robust logic to detect plugins by class type in get_plugin. 2023-06-30 23:01:09 +02:00
f3b2386ed6
Bump version: 0.50.0 → 0.50.1 2023-06-28 02:44:13 +02:00
08c3a1e11a
Bump version: 0.24.5 → 0.50.0 2023-06-28 02:23:09 +02:00
5e5403287e
The inspect plugin should not fail hard if the cache couldn't be loaded.
This can happen for many reasons - not only if the cache file is not
accessible, but also if the structure/signature of some pickled objects
has changed. In that case, we should invalidate the current cache and
re-initialize it instead of failing.
2023-06-28 01:33:12 +02:00
ba827b0248
Added sound plugin documentation.
- Added example of how to stream audio over HTTP.

- Added Portaudio to the apt/pacman dependencies.
2023-06-28 00:10:36 +02:00
a103ea49f1
Fixed ffmpeg/audio consumer synchronization upon timeout. 2023-06-27 15:12:15 +02:00
77f7cd8b90
Don't use typing.Self (yet).
typing.Self has only been introduced in Python 3.10.
2023-06-27 14:17:04 +02:00
f2540437b7
Sound plugin rewritten almost from scratch. 2023-06-27 13:31:38 +02:00
2fb6e4d7d0
Updated webapp dist files 2023-06-16 15:48:23 +02:00
2f4229d7b1
pylint fixes for the camera plugin. 2023-06-16 15:40:05 +02:00
9aa8e4538a
Better termination logic for the ffmpeg audio converter. 2023-06-16 11:47:37 +02:00
a6351dddd4
Extracted AudioRecorder out of SoundPlugin. 2023-06-16 03:12:55 +02:00
da93f1b3b0
[Chore] pylint 2023-06-14 01:44:36 +02:00
c8786b75de
sound.recordplay merged into sound.record. 2023-06-12 22:15:02 +02:00
be794316a8
Merged sound.stream_recording and sound.record. 2023-06-12 13:06:02 +02:00
a415c5b231
Merged outfile/fifo logic in sound.stream_recording. 2023-06-12 12:33:14 +02:00
e238fcb6e4
Refactoring the sound plugin to use ffmpeg as a stream converter. 2023-06-11 12:48:49 +02:00
4587b262b0
Stream camera frames over HTTP using a Redis pub/sub mechanism. 2023-06-05 20:40:12 +02:00
d7208c6bbc
Refactored Tornado routes for native pub/sub support.
The Redis pub/sub mechanism is now a native feature for Tornado routes
through the `PubSubMixin`.

(Plus, lint/black chore for the sound plugin)
2023-05-30 21:58:27 +02:00
8b5eb82497
Camera stream writer fixes.
- The readiness condition should be `multiprocessing.Condition`, not
  `threading.Condition` - in most of the cases it will be checked in a
  multiprocess environment.

- Fixed parameter name for `write`.
2023-05-30 11:06:48 +02:00
4fffabd82a
Revert "Removed camera.gstreamer."
This reverts commit b4d714df8a.
2023-05-29 22:13:24 +02:00
4bf9c01ac9
Moved camera routes.
Camera routes migrated from Flask blueprints to Tornado handlers.
2023-05-27 22:24:45 +02:00
b4d714df8a
Removed camera.gstreamer.
Too much of a pain in the ass to handle, too many format options to
think of, too many combinations of pipelines to support, and if I don't
think of those beforehand then I'll have to offload all of that
complexity on the user.
2023-05-27 22:19:50 +02:00
1c40e5e843
Black'd the camera plugin and writer.
Also, proper fix for the multi-inheritance problem of
the ffmpeg writers.
2023-05-23 20:42:59 +02:00
a2f8e2f0d2
Fixed bottom margin for ConfirmDialog buttons 2023-05-22 16:44:53 +02:00
a7aabd7c52
Fixed handling of :meth: docstring annotations with relative paths. 2023-05-22 16:32:30 +02:00
7eca1c27c9
Blackened the qrcode and pushbullet plugins 2023-05-22 02:33:54 +02:00
aaac6488d6
Updated webapp dist files 2023-05-22 02:24:24 +02:00
d7405ad05d
Added multiple parsers for the entities referenced in docstrings.
The `inspect` plugin can now detect references to plugins, backends,
events, responses and schemas in docstrings and replace them either with
links to the documentation or auto-generated examples.
2023-05-22 02:20:58 +02:00