Compare commits

...

337 Commits

Author SHA1 Message Date
Fabio Manganiello cbc58c7330
Fix: /var/lib/platypush is still empty at the time of package creation.
continuous-integration/drone/push Build is passing Details
2024-05-23 03:37:46 +02:00
Fabio Manganiello 7ca2159acb
Fix: missing newline escape
continuous-integration/drone/push Build is failing Details
2024-05-23 03:34:00 +02:00
Fabio Manganiello 2dd5b6c122
systemd-rpm-macros is a build requirement for the Fedora build.
continuous-integration/drone/push Build is failing Details
2024-05-23 03:28:56 +02:00
Fabio Manganiello a51d8978e7
[#319] Added /etc/platypush and /var/lib/platypush to rpm packages.
continuous-integration/drone/push Build is failing Details
2024-05-23 03:24:24 +02:00
Fabio Manganiello a5adac9314
[#319] Added /etc and /var/lib dirs to Debian package. 2024-05-23 02:46:38 +02:00
Fabio Manganiello a211e2e2e4
Changed default permissions for /var/lib/platypush from 0755 to 0750. 2024-05-23 01:15:26 +02:00
Fabio Manganiello 7fa0dbda7b
Split Drone CI steps into separate shell scripts.
continuous-integration/drone/push Build is passing Details
A fully self-contained 1.5k LoC Drone file isn't very maintainable, and
it makes it hard to reuse parts that are shared across multiple steps
(like SSH and git configuration).
2024-05-23 00:17:55 +02:00
Fabio Manganiello 4038ef3bc1
[#319] Added `platypush/config/systemd` directory.
continuous-integration/drone/push Build is passing Details
It contains both `platypush.service` and the `sysusers.d` and
`tmpfiles.d` configurations used by the package managers.
2024-05-20 22:19:30 +02:00
Fabio Manganiello 1cad0394ab
systemd requirements tweak.
continuous-integration/drone/push Build is passing Details
`Requires=redis.service` should be commented unless the service is
started as a privileged user.

Also added some comments on how the systemd service usually works.
2024-05-20 21:51:08 +02:00
Fabio Manganiello 02a3385638
Tweaked Platypush systemd service.
continuous-integration/drone/push Build is passing Details
- A more informative Description
- `s/WantedBy=default.target/WantedBy=multi-user.target/`
- `redis.service` is a strong requirement
2024-05-20 13:02:36 +02:00
Fabio Manganiello c899627eca
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-20 00:03:25 +00:00
Fabio Manganiello d0f781919d
[#345] Rewritten `sun` plugin.
continuous-integration/drone/push Build is passing Details
Closes: #345
2024-05-20 02:01:40 +02:00
Fabio Manganiello 86b4b14112
Added the current running application as a static object.
continuous-integration/drone/push Build is passing Details
```python
from platypush import app
```
2024-05-20 01:54:25 +02:00
Fabio Manganiello 32b8296244
[#400] Dynamic logic to infer procedures/hooks arguments.
This allows procedures and event hooks to have more flexible signatures.
Along the lines of:

```python
@when(SomeEvent)
def hook(event):
  ...

@when(SomeOtherEvent)
def hook2():
  ...
```

Instead of supporting only the full context spec:

```python
@when(SomeEvent)
def hook(event, **ctx):
  ...
```

Closes: #400
2024-05-19 02:17:42 +02:00
Fabio Manganiello 2ab1743bec
[Docs UI] Fix filter bar to the top while scrolling. 2024-05-19 02:17:42 +02:00
Fabio Manganiello 70ffe0ec04
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-17 00:23:06 +00:00
Fabio Manganiello 3d5c60e4f4
[UI docs] Added filter bar for integrations and events.
continuous-integration/drone/push Build is passing Details
2024-05-17 02:21:57 +02:00
Fabio Manganiello f06233801b
[#394] Dynamically generate setup extras.
Also, convert all code that relied on `manifest.yaml` to use
`manifest.json` instead.

Closes: #394
2024-05-17 02:21:57 +02:00
Fabio Manganiello 59c693d6a0
[#394] All `manifest.yaml` converted to `manifest.json`.
YAML isn't part of the Python standard library, while JSON is.

If we want `setup.py` to dynamically parse the available integration
manifest files in order to populate the extra dependencies, then it's
better to rely on a JSON format for manifest files - the parser is part
of the standard library and it doesn't require the user to install
`pyyaml` before `platypush`.
2024-05-17 02:21:57 +02:00
Fabio Manganiello 79a71d00b4
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-16 00:44:03 +00:00
Fabio Manganiello c77cf2c98b
[#372] Removed Google Fit plugin.
continuous-integration/drone/push Build is passing Details
The Fit API has (unfortunately) been deprecated by Google with no
alternatives - the new Health Connect API is only available on Android
devices.

Other Google APIs don't seem to be affected by the refresh token issue
either, so this should hopefully close that issue too.

Closes: #372
2024-05-16 02:42:54 +02:00
Fabio Manganiello f514f7ce1e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-15 07:57:10 +00:00
Fabio Manganiello 98a98ea1dc
[#398] Removed custom `Response` objects from Tensorflow and response docs generation logic.
continuous-integration/drone/push Build is passing Details
Closes: #398
2024-05-15 09:55:58 +02:00
Fabio Manganiello 77c91aa5e3
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-15 06:35:17 +00:00
Fabio Manganiello 0e11bbeb05
Fixed schema reference.
continuous-integration/drone/push Build is passing Details
2024-05-15 08:33:49 +02:00
Fabio Manganiello 20f3eaf375
[#398] Refactored `esp` plugin.
continuous-integration/drone/push Build was killed Details
- Converted `Response` objects into `Schema`s.

- Removed the last references to the deprecated `Mapping` object.

- Fixed all errors and warnings in the plugin.
2024-05-15 01:29:45 +02:00
Fabio Manganiello 55e230c361
Removed `wiimote` events associated to removed `wiimote` plugin. 2024-05-15 01:29:45 +02:00
Fabio Manganiello ad4d929c28
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-13 00:23:15 +00:00
Fabio Manganiello 7ae99b4325
[#398] `cups` plugin refactor.
continuous-integration/drone/push Build is passing Details
1. Renamed plugin: `printer.cups` ➡️  `cups`.
2. Replaced `Response` objects with schemas.
2024-05-13 02:22:04 +02:00
Fabio Manganiello 2efffb8ebe
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-12 23:26:45 +00:00
Fabio Manganiello 15b1c1f3c0
[#398] Replaced `GoogleDriveFile` response with `GoogleDriveFileSchema`.
continuous-integration/drone/push Build is passing Details
2024-05-13 01:25:33 +02:00
Fabio Manganiello 6003b205c8
[#398] Removed `TranslateResponse`. 2024-05-13 01:25:33 +02:00
Fabio Manganiello 825f20ab77
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-09 23:48:43 +00:00
Fabio Manganiello 7d87c5e92a
Merge pull request #424 from blacklight/snyk-upgrade-5e98f9077cfce52b1250c6e6a38f95a0
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade core-js from 3.36.1 to 3.37.0
2024-05-10 01:46:32 +02:00
Fabio Manganiello 3b3f157086
Merge branch 'master' into snyk-upgrade-5e98f9077cfce52b1250c6e6a38f95a0 2024-05-10 01:46:24 +02:00
Fabio Manganiello ad20345505
Merge pull request #423 from blacklight/snyk-upgrade-d36bc5586dd237b84d10196576744320
[Snyk] Upgrade cronstrue from 2.48.0 to 2.49.0
2024-05-10 01:45:09 +02:00
Fabio Manganiello fc4d006064
Merge pull request #422 from blacklight/snyk-upgrade-782bd84f2e24c5ffc88e43f1d25d5de4
[Snyk] Upgrade axios from 1.6.7 to 1.6.8
2024-05-10 01:44:51 +02:00
Fabio Manganiello e10fb4e549
Merge pull request #421 from blacklight/snyk-upgrade-7087de73af11ecfaae1f5f0a8dc827f2
[Snyk] Upgrade vue-router from 4.3.0 to 4.3.2
2024-05-10 01:44:34 +02:00
Fabio Manganiello 404737dc24
Merge branch 'master' into snyk-upgrade-7087de73af11ecfaae1f5f0a8dc827f2 2024-05-10 01:44:19 +02:00
Fabio Manganiello 2896bd64b6
Merge pull request #420 from blacklight/snyk-upgrade-9cd3716e8d2fdaf3c323b2566785c607
[Snyk] Upgrade vue-skycons from 4.2.0 to 4.3.4
2024-05-10 01:43:16 +02:00
Fabio Manganiello 7e8f8a35fc
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-09 23:38:23 +00:00
Fabio Manganiello b662e98447
[#398] Removed `ssh` response objects.
continuous-integration/drone/push Build is passing Details
2024-05-10 01:37:17 +02:00
Fabio Manganiello f978d708cb
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-09 23:02:32 +00:00
Fabio Manganiello 6f8c2085f2
[#398] Replaced `qrcode` response objects with schemas.
continuous-integration/drone/push Build is passing Details
2024-05-10 01:01:22 +02:00
snyk-bot 6f0451b733
fix: upgrade core-js from 3.36.1 to 3.37.0
Snyk has created this PR to upgrade core-js from 3.36.1 to 3.37.0.

See this package in npm:
https://www.npmjs.com/package/core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:23 +00:00
snyk-bot c80af03e8d
fix: upgrade cronstrue from 2.48.0 to 2.49.0
Snyk has created this PR to upgrade cronstrue from 2.48.0 to 2.49.0.

See this package in npm:
https://www.npmjs.com/package/cronstrue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:18 +00:00
snyk-bot 186e85cc86
fix: upgrade axios from 1.6.7 to 1.6.8
Snyk has created this PR to upgrade axios from 1.6.7 to 1.6.8.

See this package in npm:
https://www.npmjs.com/package/axios

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:14 +00:00
snyk-bot 83ca9fd8e5
fix: upgrade vue-router from 4.3.0 to 4.3.2
Snyk has created this PR to upgrade vue-router from 4.3.0 to 4.3.2.

See this package in npm:
https://www.npmjs.com/package/vue-router

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:10 +00:00
snyk-bot 8437f05d6a
fix: upgrade vue-skycons from 4.2.0 to 4.3.4
Snyk has created this PR to upgrade vue-skycons from 4.2.0 to 4.3.4.

See this package in npm:
https://www.npmjs.com/package/vue-skycons

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-09 17:00:06 +00:00
Fabio Manganiello 8d04eadd77
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-09 12:17:46 +00:00
Fabio Manganiello e74137d4d1
Merge pull request #419 from blacklight/snyk-upgrade-83595b90e84b75cb5b628ea340bc6c3c
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade core-js from 3.36.0 to 3.36.1
2024-05-09 14:15:26 +02:00
Fabio Manganiello 6b12d5ca0e
Merge pull request #418 from blacklight/snyk-upgrade-f5b9569657478ec13c79bc3064807f15
[Snyk] Upgrade @fortawesome/fontawesome-free from 6.5.1 to 6.5.2
2024-05-09 14:15:10 +02:00
Fabio Manganiello e683912228
Merge pull request #417 from blacklight/snyk-upgrade-503e414934e3e9df4999abbd15eed244
[Snyk] Upgrade vue-router from 4.2.5 to 4.3.0
2024-05-09 14:14:52 +02:00
Fabio Manganiello 912dddd3da
Merge branch 'master' into snyk-upgrade-503e414934e3e9df4999abbd15eed244 2024-05-09 14:14:07 +02:00
Fabio Manganiello afbb61565b
Merge pull request #416 from blacklight/snyk-upgrade-eb696c7a079843109d9453f80144a956
[Snyk] Upgrade sass from 1.71.0 to 1.75.0
2024-05-09 14:12:35 +02:00
Fabio Manganiello df8299ab61
Merge pull request #415 from blacklight/snyk-upgrade-9b35134e9eafc25285fde220c6d0dc11
[Snyk] Upgrade vue from 3.4.19 to 3.4.23
2024-05-09 14:12:17 +02:00
Fabio Manganiello 741f1aef84
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-09 12:08:36 +00:00
Fabio Manganiello 3df76a4a9c
[#398] Replaced `pihole` response objects with schemas.
continuous-integration/drone/push Build is passing Details
2024-05-09 14:06:54 +02:00
Fabio Manganiello 929ac09cae
[#398] Removed unused `stt` response module.
continuous-integration/drone/push Build is passing Details
2024-05-09 11:01:42 +02:00
Fabio Manganiello 3277c56b43
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-08 23:48:25 +00:00
Fabio Manganiello c906aab64d
[camera.android.ipcam UI] Adapted to the new plugin API.
continuous-integration/drone/push Build is passing Details
2024-05-09 01:46:36 +02:00
Fabio Manganiello 2021e25752
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-08 23:42:25 +00:00
Fabio Manganiello 13bde4adba
[#398] Replaced `camera` response objects with schemas.
continuous-integration/drone/push Build is passing Details
2024-05-09 01:41:15 +02:00
Fabio Manganiello 579faf63bc
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-08 20:00:37 +00:00
Fabio Manganiello 7a849379f9
[#399] Added `@when` decorator as an alias for `@hook`.
continuous-integration/drone/push Build is passing Details
Closes: #399
2024-05-08 21:58:58 +02:00
snyk-bot 4a100b0dc0
fix: upgrade core-js from 3.36.0 to 3.36.1
Snyk has created this PR to upgrade core-js from 3.36.0 to 3.36.1.

See this package in npm:
https://www.npmjs.com/package/core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:30 +00:00
snyk-bot 5a1bccac4d
fix: upgrade @fortawesome/fontawesome-free from 6.5.1 to 6.5.2
Snyk has created this PR to upgrade @fortawesome/fontawesome-free from 6.5.1 to 6.5.2.

See this package in npm:
https://www.npmjs.com/package/@fortawesome/fontawesome-free

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:26 +00:00
snyk-bot 499b3cd9c9
fix: upgrade vue-router from 4.2.5 to 4.3.0
Snyk has created this PR to upgrade vue-router from 4.2.5 to 4.3.0.

See this package in npm:
https://www.npmjs.com/package/vue-router

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:22 +00:00
snyk-bot 8be6d80b45
fix: upgrade sass from 1.71.0 to 1.75.0
Snyk has created this PR to upgrade sass from 1.71.0 to 1.75.0.

See this package in npm:
https://www.npmjs.com/package/sass

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:19 +00:00
snyk-bot fc621a27f3
fix: upgrade vue from 3.4.19 to 3.4.23
Snyk has created this PR to upgrade vue from 3.4.19 to 3.4.23.

See this package in npm:
https://www.npmjs.com/package/vue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-05-07 18:19:15 +00:00
Fabio Manganiello 85e44542e2
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-05-07 10:49:01 +00:00
Fabio Manganiello c094fac7dc
Merge pull request #407 from blacklight/snyk-upgrade-1d870abd0ad2c511fe65000600f02a14
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade cronstrue from 2.47.0 to 2.48.0
2024-05-07 12:42:38 +02:00
Fabio Manganiello 9dc0fbe6e7
Merge branch 'master' into snyk-upgrade-1d870abd0ad2c511fe65000600f02a14 2024-05-07 12:42:30 +02:00
Fabio Manganiello d6b1337c5a
Merge pull request #413 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/express-4.19.2
Bump express from 4.18.2 to 4.19.2 in /platypush/backend/http/webapp
2024-05-07 12:40:57 +02:00
Fabio Manganiello 0adde5a107
Merge pull request #414 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/ejs-3.1.10
Bump ejs from 3.1.9 to 3.1.10 in /platypush/backend/http/webapp
2024-05-07 12:40:41 +02:00
Fabio Manganiello 89ced918f1
Merge pull request #412 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/webpack-dev-middleware-5.3.4
Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /platypush/backend/http/webapp
2024-05-07 12:40:28 +02:00
Fabio Manganiello bf52f44f92
Merge pull request #411 from blacklight/dependabot/npm_and_yarn/platypush/backend/http/webapp/follow-redirects-1.15.6
Bump follow-redirects from 1.15.4 to 1.15.6 in /platypush/backend/http/webapp
2024-05-07 12:40:08 +02:00
Fabio Manganiello e285009da3
Merge pull request #409 from blacklight/snyk-upgrade-f2aa58c6cb66ee05c32f925b535a8b1f
[Snyk] Upgrade core-js from 3.35.1 to 3.36.0
2024-05-07 12:39:56 +02:00
Fabio Manganiello 3edc8d1077
Merge pull request #408 from blacklight/snyk-upgrade-29d2bb6c813d352072249a6db7e3a805
[Snyk] Upgrade vue from 3.4.18 to 3.4.19
2024-05-07 12:39:36 +02:00
Fabio Manganiello cbaca5f303
Merge pull request #406 from blacklight/snyk-upgrade-bf6b4c595d14f755033e14807ed62fa7
[Snyk] Upgrade @fortawesome/fontawesome-free from 6.4.2 to 6.5.1
2024-05-07 12:39:20 +02:00
Fabio Manganiello df79bb3ea6
Merge pull request #410 from blacklight/snyk-upgrade-73632136d273593f5bc9c7ffc6fd9c71
[Snyk] Upgrade sass from 1.70.0 to 1.71.0
2024-05-07 12:39:04 +02:00
Fabio Manganiello 228031c4ad
[#331] Automatically initialize __init__.py in script dirs.
continuous-integration/drone/push Build is passing Details
Closes: #331
2024-05-07 02:59:13 +02:00
Fabio Manganiello fdeba9e53c
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-05-06 00:28:09 +00:00
Fabio Manganiello 3c88593e9a
[#293] Merged `midi` plugin and backend.
continuous-integration/drone/push Build is passing Details
Closes: #293
2024-05-06 02:26:27 +02:00
Fabio Manganiello 6a8c83f99b
🐛 Don't add the new password salt/iterations columns if already present.
continuous-integration/drone/push Build is passing Details
And, similarly, don't remove them if they aren't on the user table.
2024-05-05 21:58:51 +02:00
Fabio Manganiello 901338e228
[#397] Replaced bcrypt dependency with native hashlib logic.
continuous-integration/drone/push Build is failing Details
Closes: #397
2024-05-05 21:38:27 +02:00
dependabot[bot] 9651354fbf
Bump ejs from 3.1.9 to 3.1.10 in /platypush/backend/http/webapp
Bumps [ejs](https://github.com/mde/ejs) from 3.1.9 to 3.1.10.
- [Release notes](https://github.com/mde/ejs/releases)
- [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-02 10:39:57 +00:00
Fabio Manganiello a5826892dd
[CI/CD] Added `python-setuptools` to build dependencies.
continuous-integration/drone/push Build is passing Details
It's apparently been extracted out of the core Python library on the
version 3.12 of the interpreter.
2024-05-02 03:31:41 +02:00
Fabio Manganiello 373d98fc6a
[Automatic] Updated UI files
continuous-integration/drone/push Build is failing Details
2024-05-02 01:11:36 +00:00
Fabio Manganiello 61e466d8e2
[UI] Added `tts.picovoice` component and `assistant.picovoice` icon.
continuous-integration/drone/push Build is passing Details
2024-05-02 03:07:47 +02:00
Fabio Manganiello 4ac73837f6
[Automatic] Updated components cache
continuous-integration/drone/push Build is failing Details
2024-05-02 00:51:58 +00:00
Fabio Manganiello 72bc697122 [assistant.picovoice] Extended documentation. 2024-05-02 00:51:09 +00:00
Fabio Manganiello b2c07a31f2 Fixed tests 2024-05-02 00:51:09 +00:00
Fabio Manganiello d813356d9c [music.mopidy] Handle the case where `add` returns a list. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 1192782729 [tts.picovoice] Convert digits before replacing other substrings. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 4734909912 🐛 The `EventMatchResult` object shouldn't be initialized with `args` from the event.
If there's a good use-case for overriding `Event._matches_condition`
with a logic that also parses the event arguments, then those arguments
should be accessed directly from the event object, not from the match
result.

Initializing `EventMatchResult` with the arguments from the event means
that, if `EventMatchResult.parsed_args` are populated with custom
extracted arguments, then the upstream event arguments will also be
modified.

If the event is matched against multiple conditions, this will result in
the extracted tokens getting modified by each `matches_condition`
iteration.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 237fc58928 [tts.picovoice] A more robust logic for replacing unsupported characteres on the input. 2024-05-02 00:51:09 +00:00
Fabio Manganiello d8e24207c5 Added `openai` plugin. 2024-05-02 00:51:09 +00:00
Fabio Manganiello bd4b1d3e0f [assistant.picovoice] Sync between the speech and intent engines. 2024-05-02 00:51:09 +00:00
Fabio Manganiello a373091c64 Prevent duplicate hook runs.
Instead of being a list, the hooks in the hook processor should be
backed by by-name and by-value maps.

Don't insert a hook if its exact backing method has already been
inserted. This is actually very common when hooks are defined as Python
snippets imported in other scripts too.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 632d98703b New architecture for the assistant speech detection logic.
The assistant object now runs in its own thread and leverages an
external `SpeechProcessor` that uses two threads to scan for both
intents and speech in parallel on audio frames.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 6f8816d23d Prevent a potential recursion error in `wait_for_either`.
We shouldn't overwrite `event._set` and `event._clear` if those values
have already been set.

Those attributes hold the original references to `Event.set` and
`Event.clear` respectively, and the `OrEvent` logic overwrites them with
a callback-based logic.

This shouldn't happen if those attributes are already present.
2024-05-02 00:51:09 +00:00
Fabio Manganiello af1392b5b9 [assistant] Added `ResponseEndEvent` and `IntentMatchedEvent` 2024-05-02 00:51:09 +00:00
Fabio Manganiello bb9b6cd319 [assistant.picovoice] Various improvements.
- Added `intent_model_path` parameter.

- Always apply `expanduser` to configuration paths.

- Better logic to infer the fallback model path.

- The Picovoice Leonardo object should always be removed after
  `assistant.picovoice.transcribe` is called.
2024-05-02 00:51:09 +00:00
Fabio Manganiello f0a780b759 Added `assistant.picovoice.transcribe` and `assistant.picovoice.say`. 2024-05-02 00:51:09 +00:00
Fabio Manganiello f04f7ce9d7 [tts.picovoice] Better text pre-processing logic. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 37d70d67ac [assistant.picovoice] Implemented `assistant.picovoice.send_text_query`. 2024-05-02 00:51:09 +00:00
Fabio Manganiello fa1d5eb672 [tts.picovoice] Added text pre-processing workaround.
This workaround is required until
https://github.com/Picovoice/orca/issues/10 is fixed.
2024-05-02 00:51:09 +00:00
Fabio Manganiello a345b12244 [assistant.picovoice] Leverage upstream `_on_mute_changed`.
The plugin should leverage `AssistantPlugin._on_mute_changed` to handle
the boilerplate state managent on mute/unmute actions instead of
re-implementing the same logic.
2024-05-02 00:51:09 +00:00
Fabio Manganiello 2c197c275e [assistant.picovoice] Implemented mic mute/unmute handling. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 9de49c71a1 [assistant.picovoice] Conversation flow improvements.
- The `Responding` state should be modelled as an extra event/binary
  flag, not as an assistant state. The assistant may be listening for
  hotwords even while the `tts` plugin is responding, and we don't want
  the two states to interfere with each either - neither to build a more
  complex state machine that also needs to take concurrent states into
  account.

- Stop any responses being rendered upon the `tts` plugin when a new
  hotword audio is detected. If e.g. I say "Ok Google", I should always
  be able to trigger the assistant and stop any concurrent audio
  process.

- `SpeechRecognizedEvent` should be emitted even if `cheetah`'s latest
  audio frame results weren't marked as final, and the speech detection
  window timed out. Cheetah's `is_final` detection seems to be quite
  buggy sometimes, and it may not properly detect the end of utterances,
  especially with non-native accents. The workaround is to flush out
  whatever text is available (if at least some speech was detected) into
  a `SpeechRecognizedEvent` upon timeout.
2024-05-02 00:51:09 +00:00
Fabio Manganiello a6f7b6e790 Added more default imports under the `platypush` module root.
These objects can now also be imported in scripts through
`from platypush import <name>`:

- `Variable`
- `cron`
- `hook`
- `procedure`
2024-05-02 00:51:09 +00:00
Fabio Manganiello aa333db05c [assistant.picovoice] More features.
- Added wiring between `assistant.picovoice` and `tts.picovoice`.

- Added `RESPONDING` status to the assistant.

- Added ability to override the default speech model upon
  `start_conversation`.

- Better handling of conversation timeouts.

- Cache Cheetah objects in a `model -> object` map - at least the
  default model should be pre-loaded, since model loading at runtime
  seems to take a while, and that could impact the ability to detect the
  speech in the first seconds after a hotword is detected.
2024-05-02 00:51:09 +00:00
Fabio Manganiello af875c996e Added `tts.picovoice` plugin. 2024-05-02 00:51:09 +00:00
Fabio Manganiello a4c911a5d7 Added ffmpeg requirement for `assistant.picovoice`. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 8193c5702c s/partial_transcript/transcript/g 2024-05-02 00:51:09 +00:00
Fabio Manganiello 8378bee7c6 Refactored `AssistantEvent`.
`AssistantEvent.assistant` is now modelled as an opaque object that
behaves the following way:

- The underlying plugin name is saved under `event.args['_assistant']`.

- `event.assistant` is a property that returns the assistant instance
  via `get_plugin`.

- `event.assistant` is reported as a string (plugin qualified name) upon
  event dump.

This allows event hooks to easily use `event.assistant` to interact with
the underlying assistant and easily modify the conversation flow, while
event hook conditions can still be easily modelled as equality
operations between strings.
2024-05-02 00:51:09 +00:00
Fabio Manganiello a670f01647 [assistant.picovoice] Better partial transcript + flush handling logic. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 921025be0c `picovoice` -> `assistant.picovoice` 2024-05-02 00:51:09 +00:00
Fabio Manganiello bb38f2439c Better integration with the native base API of the assistant plugin. 2024-05-02 00:51:09 +00:00
Fabio Manganiello f7517eb321 [WIP] Added speech detection logic over Cheetah. 2024-05-02 00:51:09 +00:00
Fabio Manganiello a9498ea191 [WIP] Added initial hotword integration. 2024-05-02 00:51:09 +00:00
Fabio Manganiello 44f9c03bf3 [#304] Removed old Picovoice integrations 2024-05-02 00:51:09 +00:00
Fabio Manganiello 98c99c7888
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-17 02:09:18 +00:00
Fabio Manganiello e123463804
[media.chromecast] Refactored implementation.
continuous-integration/drone/push Build is passing Details
Explicitly use a `CastBrowser` object initialized at plugin boot instead
of relying on blocking calls to `pychromecast.get_chromecasts`.

1. It enables better event handling via callbacks instead of
   synchronously waiting for scan batches.

2. It optimizes resources - only one Zeroconf and one CastBrowser object
   will be created in the plugin, and destroyed upon stop.

3. No need for separate `get_chromecast`/`_refresh_chromecasts` methods:
   all the scanning is run continuously, so we can just return the
   results from the maps.
2024-04-17 03:56:45 +02:00
Fabio Manganiello f99f6bdab9
[media.chromecast] Resource clean up + new API adaptations.
continuous-integration/drone/push Build is passing Details
- `pychromecast.get_chromecasts` returns both a list of devices and a
  browser object. Since the Chromecast plugin is the most likely culprit
  of the excessive number of open MDNS sockets, it seems that we may
  need to explicitly stop discovery on the browser and close the
  ZeroConf object after the discovery is done.

- I was still using an ancient version of pychromecast on my RPi4, and I
  didn't notice that more recent versions implemented several breaking
  changes. Adapted the code to cope with those changes.
2024-04-17 02:49:31 +02:00
Fabio Manganiello 4972c8bdcf
Unregister a Zeroconf instance if it already exists before publishing a backend service.
continuous-integration/drone/push Build is passing Details
`mdns` connection are another culprit for the increasing number of open
files in the process.
2024-04-16 00:12:55 +02:00
Fabio Manganiello 33d4c8342d
[#389] Possible fix for "Too many open files" media issue.
continuous-integration/drone/push Build is passing Details
It seems that the process keeps a lot of open connections to Chromecast
devices during playback.

The most likely culprit is the `_refresh_chromecasts` logic.

We should start a `cast` object and register a status listener only if a
Chromecast with the same identifier isn't already registered in the
plugin.
2024-04-15 23:01:10 +02:00
Fabio Manganiello 027bcea612
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-08 21:05:46 +00:00
Fabio Manganiello b4d0716bc5
Added layer of compatibility with both paho.mqtt >= 2.0.0 and < 2.0.0.
See 28aa2e6b26/ChangeLog.txt (L6)
2024-04-08 23:01:54 +02:00
revil-O 584f226b62 mqtt CallbackAPIVersion fix for paho.mqtt >= 2.0.0
fix to work with paho.mqtt >= 2.0.0
2024-04-08 16:05:27 +02:00
Fabio Manganiello dba0acb82e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-05 18:57:53 +00:00
Fabio Manganiello a026a101cd
Removed `stt.deepspeech` integration.
continuous-integration/drone/push Build is passing Details
The project hasn't seen a commit in three years and it's probably been
abandoned by Mozilla.

New and better maintained speech-to-text integrations will be
investigated.
2024-04-05 20:56:45 +02:00
Fabio Manganiello b00623f655
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-04-05 02:00:03 +00:00
Fabio Manganiello 03765ad652
[UI] Better style for music widget.
continuous-integration/drone/push Build is passing Details
2024-04-05 03:58:12 +02:00
Fabio Manganiello 96f3420c8e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-05 01:47:09 +00:00
Fabio Manganiello c31180dae8
[music.mopidy] Fixed parsing of `new_state` upon `playback_state_changed`.
continuous-integration/drone/push Build is passing Details
2024-04-05 03:46:01 +02:00
Fabio Manganiello b1498bfc28
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-05 01:41:38 +00:00
Fabio Manganiello 083c9e250e
[music.mopidy] Better handling of client events.
continuous-integration/drone/push Build is passing Details
2024-04-05 03:40:27 +02:00
Fabio Manganiello 88ffc3b795
[Automatic] Updated components cache
continuous-integration/drone/push Build was killed Details
2024-04-05 00:56:48 +00:00
Fabio Manganiello 5f6fd4aa54
Added `--db` CLI option and support for configuration over environment.
continuous-integration/drone/push Build is passing Details
Closes: #280
2024-04-05 02:54:45 +02:00
Fabio Manganiello c8361aa475
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-04 00:53:18 +00:00
Fabio Manganiello 496a3f4911 Updated docs 2024-04-04 00:52:30 +00:00
Fabio Manganiello d2ec93b798 [#297] Removed `music.spotify` backend.
1. I no longer I use a Spotify account (I switched to Tidal after
   Spotify deprecated libspotify), and I wouldn't like to create one
   just to test this integration.

2. After a couple of years, the libspotify open fork (Librespot) seems
   to be still in an unstable stage and it's already been discontinued
   once - I would avoid rebuilding the integration against a dependency
   that may change a lot in the near future.
2024-04-04 00:52:30 +00:00
Fabio Manganiello 73cc47b964
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-04-03 23:57:10 +00:00
Fabio Manganiello 787b6a6af6
[UI] A more consistent light style for the music widget.
continuous-integration/drone/push Build is passing Details
2024-04-04 01:54:52 +02:00
Fabio Manganiello 6f24504cc4
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-04-03 23:11:49 +00:00
Fabio Manganiello 5d9a201a5b
[#297] Mopidy/MPD refactor+migration, UI side.
continuous-integration/drone/push Build is passing Details
2024-04-04 01:07:05 +02:00
Fabio Manganiello e2246c8d30
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-04-03 23:02:09 +00:00
Fabio Manganiello 58518a4d63 Better timeout management on mopidy status refresh. 2024-04-03 23:01:22 +00:00
Fabio Manganiello 5346833152 [WIP] API adaptations for `music.mpd` 2024-04-03 23:01:22 +00:00
Fabio Manganiello 89d618b35f [WIP] `music.mopidy` refactor, initial backend rewrite. 2024-04-03 23:01:22 +00:00
Fabio Manganiello d2e5e5230b [music.mpd] Removed deprecated actions.
- `setvol` ➡️  `set_volume`
- `seekcur` ➡️  `seek`
- `playlistinfo` ➡️  `get_tracks`
- `listplaylists` ➡️  `get_playlists`
- `listplaylist` ➡️  `get_playlist`
- `listplaylistinfo` ➡️  `get_playlist`
- `playlistadd` ➡️  `add_to_playlist`
- `playlistdelete` ➡️  `remove_from_playlist`
- `playlistmove` ➡️  `playlist_move`
- `playlistclear` ➡️  `playlist_clear`
- `rename` ➡️  `rename_playlist`
- `rm` ➡️  `delete_playlist`

stuff
2024-04-03 23:01:22 +00:00
Fabio Manganiello a3b6d411e4 [music.mpd] Adjust default poll_interval: 5 -> 20 seconds. 2024-04-03 23:01:22 +00:00
dependabot[bot] 749eda16b4
Bump express from 4.18.2 to 4.19.2 in /platypush/backend/http/webapp
Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-29 06:46:45 +00:00
dependabot[bot] 2d72ce9645
Bump webpack-dev-middleware in /platypush/backend/http/webapp
Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4.
- [Release notes](https://github.com/webpack/webpack-dev-middleware/releases)
- [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-23 19:14:44 +00:00
dependabot[bot] 8ed358fcc8
Bump follow-redirects in /platypush/backend/http/webapp
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-16 23:30:25 +00:00
snyk-bot a30042e1eb
fix: upgrade sass from 1.70.0 to 1.71.0
Snyk has created this PR to upgrade sass from 1.70.0 to 1.71.0.

See this package in npm:
https://www.npmjs.com/package/sass

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-08 18:50:38 +00:00
snyk-bot b9d637187c
fix: upgrade core-js from 3.35.1 to 3.36.0
Snyk has created this PR to upgrade core-js from 3.35.1 to 3.36.0.

See this package in npm:
https://www.npmjs.com/package/core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-06 15:26:22 +00:00
snyk-bot 6a55527694
fix: upgrade vue from 3.4.18 to 3.4.19
Snyk has created this PR to upgrade vue from 3.4.18 to 3.4.19.

See this package in npm:
https://www.npmjs.com/package/vue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-06 02:09:43 +00:00
snyk-bot 5488c97f4b
fix: upgrade cronstrue from 2.47.0 to 2.48.0
Snyk has created this PR to upgrade cronstrue from 2.47.0 to 2.48.0.

See this package in npm:
https://www.npmjs.com/package/cronstrue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-06 02:09:40 +00:00
snyk-bot e12054c484
fix: upgrade @fortawesome/fontawesome-free from 6.4.2 to 6.5.1
Snyk has created this PR to upgrade @fortawesome/fontawesome-free from 6.4.2 to 6.5.1.

See this package in npm:
https://www.npmjs.com/package/@fortawesome/fontawesome-free

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-06 02:09:36 +00:00
Fabio Manganiello 288344a348
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-03-05 10:19:13 +00:00
Fabio Manganiello 8f35fbed16
Merge pull request #404 from BlackLight/snyk-upgrade-66089ad9a01450eef161c7e7fac48843
continuous-integration/drone/push Build is passing Details
[Snyk] Upgrade axios from 1.6.4 to 1.6.7
2024-03-05 11:15:26 +01:00
Fabio Manganiello 0e8408a83f
Merge branch 'master' into snyk-upgrade-66089ad9a01450eef161c7e7fac48843 2024-03-05 11:15:09 +01:00
Fabio Manganiello 8c0939c308
Merge pull request #405 from BlackLight/snyk-upgrade-785cc8b707ebb00ef02379485bb64589
[Snyk] Upgrade sass-loader from 10.4.1 to 10.5.2
2024-03-05 11:14:19 +01:00
Fabio Manganiello 8c2abf5d9a
Merge branch 'master' into snyk-upgrade-785cc8b707ebb00ef02379485bb64589 2024-03-05 11:14:08 +01:00
Fabio Manganiello f7d651983a
Merge pull request #403 from BlackLight/snyk-upgrade-eaf91feb3c2e9502206ab6258f4f7a06
[Snyk] Upgrade sass from 1.69.3 to 1.70.0
2024-03-05 11:11:29 +01:00
Fabio Manganiello 57f269486c
Merge pull request #402 from BlackLight/snyk-upgrade-7bb8fbc94f3d6132decf153710b18875
[Snyk] Upgrade core-js from 3.33.0 to 3.35.1
2024-03-05 11:11:13 +01:00
Fabio Manganiello 82c8c79778
Merge pull request #401 from BlackLight/snyk-upgrade-6f8a6cdcfdde123a5d036b41986f9966
[Snyk] Upgrade vue from 3.3.6 to 3.4.18
2024-03-05 11:11:00 +01:00
snyk-bot 9de799f6a1
fix: upgrade sass-loader from 10.4.1 to 10.5.2
Snyk has created this PR to upgrade sass-loader from 10.4.1 to 10.5.2.

See this package in npm:
https://www.npmjs.com/package/sass-loader

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:51 +00:00
snyk-bot b21a27366c
fix: upgrade axios from 1.6.4 to 1.6.7
Snyk has created this PR to upgrade axios from 1.6.4 to 1.6.7.

See this package in npm:
https://www.npmjs.com/package/axios

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:47 +00:00
snyk-bot 50b712a8d3
fix: upgrade sass from 1.69.3 to 1.70.0
Snyk has created this PR to upgrade sass from 1.69.3 to 1.70.0.

See this package in npm:
https://www.npmjs.com/package/sass

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:44 +00:00
snyk-bot aaa38c0f2d
fix: upgrade core-js from 3.33.0 to 3.35.1
Snyk has created this PR to upgrade core-js from 3.33.0 to 3.35.1.

See this package in npm:
https://www.npmjs.com/package/core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:40 +00:00
snyk-bot 31222b3f05
fix: upgrade vue from 3.3.6 to 3.4.18
Snyk has created this PR to upgrade vue from 3.3.6 to 3.4.18.

See this package in npm:
https://www.npmjs.com/package/vue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-03-04 23:22:36 +00:00
Fabio Manganiello 3ebb59ed26
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-03-04 00:07:15 +00:00
Fabio Manganiello 5c9c9f0a61
[Nav UI] Better alignment of items on the expanded menu.
continuous-integration/drone/push Build is passing Details
2024-03-04 01:05:07 +01:00
Fabio Manganiello 41cbe40362
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-03-03 22:15:59 +00:00
Fabio Manganiello 0c6d3a5074
Merge pull request #399 from BlackLight/snyk-fix-cbc2d5f1b27baf97088c91fe8a0ed9ad
continuous-integration/drone/push Build is passing Details
[Snyk] Security upgrade axios from 1.6.0 to 1.6.4
2024-03-03 23:13:32 +01:00
Fabio Manganiello f78823981b
Merge pull request #396 from BlackLight/snyk-upgrade-f6fc128f6839afbdb22ffdb72a07ffb9
[Snyk] Upgrade vue from 3.3.4 to 3.3.6
2024-03-03 23:11:29 +01:00
Fabio Manganiello 0dea8c3b44
Merge branch 'master' into snyk-fix-cbc2d5f1b27baf97088c91fe8a0ed9ad 2024-03-03 23:10:22 +01:00
Fabio Manganiello c06d97d9b7
Merge branch 'master' into snyk-upgrade-f6fc128f6839afbdb22ffdb72a07ffb9 2024-03-03 23:06:23 +01:00
Fabio Manganiello 0653bcf5b9
Merge pull request #395 from BlackLight/snyk-upgrade-87b37fbfcf86065d749fecde13c6979c
[Snyk] Upgrade vue-router from 4.2.4 to 4.2.5
2024-03-03 23:03:33 +01:00
Fabio Manganiello 085cb1031a
Merge pull request #394 from BlackLight/snyk-upgrade-225081273089712ac56cf6c7af77c223
[Snyk] Upgrade core-js from 3.32.0 to 3.33.0
2024-03-03 23:03:16 +01:00
Fabio Manganiello 27afa90f9d
Merge pull request #393 from BlackLight/snyk-upgrade-8c58c38d04e6adb5e9a1902f135a9d45
[Snyk] Upgrade sass from 1.65.1 to 1.69.3
2024-03-03 23:02:43 +01:00
Fabio Manganiello 938b8761e7
Merge branch 'master' into snyk-upgrade-f6fc128f6839afbdb22ffdb72a07ffb9 2024-03-03 23:02:11 +01:00
Fabio Manganiello 3993a51aed
Merge branch 'master' into snyk-upgrade-87b37fbfcf86065d749fecde13c6979c 2024-03-03 23:00:23 +01:00
Fabio Manganiello 4a6f89582c
Merge branch 'master' into snyk-upgrade-225081273089712ac56cf6c7af77c223 2024-03-03 22:59:38 +01:00
Fabio Manganiello 3019ddfd0e
Merge branch 'master' into snyk-upgrade-8c58c38d04e6adb5e9a1902f135a9d45 2024-03-03 22:58:06 +01:00
Fabio Manganiello 05213d9afc
Updated docs
continuous-integration/drone/push Build is passing Details
2024-03-03 22:50:57 +01:00
Fabio Manganiello 91943304e1
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-03-03 21:38:37 +00:00
Fabio Manganiello 2066db463b
[#295] Merged `music.mpd` plugin and backend.
continuous-integration/drone/push Build is passing Details
Closes: #295
2024-03-03 22:37:26 +01:00
Fabio Manganiello e96eae73ec
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-03-03 14:41:00 +00:00
Fabio Manganiello 6bdc9e77ee
[#349] Refactored/rewritten `telegram` plugin.
continuous-integration/drone/push Build is passing Details
1. `chat.telegram` -> `telegram` plugin.

2. Merged `backend.chat.telegram` logic into `telegram` plugin.

3. Rewritten the architecture of the integration to adapt to the new
   asyncio API introduced in the latest versions of telegram-bot-api.

Closes: #349
2024-03-03 15:39:47 +01:00
Fabio Manganiello 7637890a54
[irc] Plugin rename/refactor.
The `chat.irc` plugin is now `irc`.
2024-03-03 15:39:47 +01:00
Fabio Manganiello 1ba85231d8
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-03-01 00:10:21 +00:00
Fabio Manganiello 66e19d608a
Fixed flic events module name and path
continuous-integration/drone/push Build is passing Details
2024-02-29 23:48:10 +01:00
Fabio Manganiello e462f3becf
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 23:51:02 +00:00
Fabio Manganiello d415d65bff
Removed legacy wiimote plugin
continuous-integration/drone/push Build is passing Details
2024-02-29 00:49:56 +01:00
Fabio Manganiello b30dc7ddb5
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 23:28:39 +00:00
Fabio Manganiello c7b0440562
[#357] Migrated `backend.button.flic` to `flic` plugin.
continuous-integration/drone/push Build is passing Details
Closes: #357
2024-02-29 00:27:32 +01:00
Fabio Manganiello 765ac6143e
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:57:12 +00:00
Fabio Manganiello d16daa3fdf
Removed `backend.sensor.ir.zeroborg`.
continuous-integration/drone/push Build is passing Details
That code is very old and broken, and it covers a very marginal feature
(events from the IR sensor of a Zeroborg board) that can be easily
covered by any general-purpose IR sensors.
2024-02-28 01:56:06 +01:00
Fabio Manganiello b46d3da5de
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:50:56 +00:00
Fabio Manganiello f1e568d6c8
FIX: Fixed refactored plugin name
continuous-integration/drone/push Build is passing Details
2024-02-28 01:49:52 +01:00
Fabio Manganiello ef5c65ff4d
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:45:11 +00:00
Fabio Manganiello ac9b82236e
Renamed `http.request` plugin as `http`.
continuous-integration/drone/push Build is passing Details
2024-02-28 01:44:04 +01:00
Fabio Manganiello d0d80c1edf
Removed old backend.http.request.* files 2024-02-28 01:44:04 +01:00
Fabio Manganiello 3e4b7ac1b5
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-28 00:28:53 +00:00
Fabio Manganiello 553c4090b7
[#309] Remove `wiimote` integration.
continuous-integration/drone/push Build is passing Details
The `cwiid` library and the Python bindings haven't been updated in
years, the `cwiid-git` package on Arch Linux still targets Python 2, and
installing `cwiid` via `pip` breaks recent versions of Python 3.

Closes: #309
2024-02-28 01:25:49 +01:00
Fabio Manganiello 7ccbf9347f
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-27 22:19:30 +00:00
Fabio Manganiello ea4e293338 [#352] Migrated `backend.sensor.leap` to `leap` plugin.
Closes: #352
2024-02-27 22:18:41 +00:00
Fabio Manganiello fc45b606ab Removed (currently) incomplete paragraph from README 2024-02-27 21:41:39 +00:00
Fabio Manganiello d77aa0b167 Removed legacy `backend.scard`.
Closes: #303
2024-02-27 21:39:02 +00:00
Fabio Manganiello 07dfc19bf5 Added `nfc.status` action. 2024-02-27 21:39:02 +00:00
Fabio Manganiello 99f9737211
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-26 23:55:43 +00:00
Fabio Manganiello 850cbe4237
Updated docs
continuous-integration/drone/push Build is passing Details
2024-02-27 00:53:27 +01:00
Fabio Manganiello dfaa5447ac
[#299] Refactored NFC backend into a runnable plugin. 2024-02-27 00:53:26 +01:00
Fabio Manganiello bbf755eef2
[#299] Refactored NFC backend into a runnable plugin.
continuous-integration/drone/push Build is passing Details
2024-02-27 00:10:15 +01:00
Fabio Manganiello c7c31fb48d
Log the canonical name of plugins when starting them. 2024-02-27 00:02:30 +01:00
Fabio Manganiello 5ab66e6746
[UI] Render docs link on `ExtensionIcon` only on docs panel.
continuous-integration/drone/push Build was killed Details
2024-02-26 23:47:07 +01:00
Fabio Manganiello 8079b08a54
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-26 20:36:57 +00:00
Fabio Manganiello f8e0b5e17e
[#366] Context variables should be dynamically assigned through `locals()` instead of `exec()`.
continuous-integration/drone/push Build is passing Details
Closes: #366
2024-02-26 21:29:35 +01:00
Fabio Manganiello 6c2e9deda4
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-26 20:11:46 +00:00
Fabio Manganiello 6de9f741f0
[UI] Use extension icons also for menu entries.
continuous-integration/drone/push Build is passing Details
2024-02-26 21:09:36 +01:00
Fabio Manganiello e7c1e2f44e
[UI] Added icons to plugins and backends. 2024-02-26 17:39:19 +01:00
Fabio Manganiello 2d8c34522f
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-26 00:57:55 +00:00
Fabio Manganiello 5961b08387
[Carousel UI] Removed margin
continuous-integration/drone/push Build is passing Details
2024-02-26 01:55:49 +01:00
Fabio Manganiello d6ea4a1c42
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-26 00:29:32 +00:00
Fabio Manganiello e58f5d2fa1
[Camera] The `wait_for_either` barrier should be enabled on streaming by default.
continuous-integration/drone/push Build is passing Details
`camera.pi*` plugins are an exception, as they handle the lifecycle of
the camera streaming process through the `picamera*` libraries.

Otherwise, the streaming thread should explicitly wait on either the
plugin stop or streaming stop events and exit accordingly, or the camera
thread may be streaming indefinitely.
2024-02-26 01:28:25 +01:00
Fabio Manganiello 56a04975ae
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-26 00:20:42 +00:00
Fabio Manganiello 9df08de24f
[Carousel UI] Replaced `blur` filter with `brightness` for background.
continuous-integration/drone/push Build is passing Details
It's much less expensive on the CPU side, and the effect is similar.

Closes: #359
2024-02-26 01:18:51 +01:00
Fabio Manganiello 18f2c26725
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-25 22:12:19 +00:00
Fabio Manganiello 195a4b58b9
[chore] Updated caniuse db
continuous-integration/drone/push Build is passing Details
2024-02-25 23:10:15 +01:00
Fabio Manganiello 4ebc29a151
[UI] Added icon for `camera.pi.legacy` web panel. 2024-02-25 23:10:14 +01:00
Fabio Manganiello b246fbe328
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-02-25 22:08:34 +00:00
Fabio Manganiello 31528e3c0e
[UI] Added `camera.pi.legacy` web panel.
continuous-integration/drone/push Build is passing Details
2024-02-25 23:06:24 +01:00
Fabio Manganiello b6bd86794b
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-25 20:42:51 +00:00
Fabio Manganiello 9445bd4dc4
Added `config.yaml` example/docs for camera streaming configuration.
continuous-integration/drone/push Build is passing Details
2024-02-25 21:39:12 +01:00
Fabio Manganiello 1c14450781 FIX: Remove `wait_for_either` barrier from the streaming thread.
continuous-integration/drone/push Build is passing Details
The `_accept_client` logic will be executed anyway at the next
iteration, unless the server socket is closed - in that case, the thread
will fail and exit anyway.

The `wait_for_either` barrier in the streaming thread may instead
prevent other connections from being established after the first one is
closed.
2024-02-25 16:02:52 +01:00
Fabio Manganiello 4c92bdd11c
FIX: Handle `stop_streaming` exceptions in the main loop of the camera plugin.
continuous-integration/drone/push Build is passing Details
Otherwise camera process teardown errors may bubble up and prevent the
plugin from restarting the streaming.
2024-02-24 21:36:08 +01:00
Fabio Manganiello 8999a226b1
[WIP] Updated documentation for `camera.pi`.
continuous-integration/drone/push Build is passing Details
2024-02-24 21:16:43 +01:00
Fabio Manganiello e46704010b
[WIP] Rewritten `camera.pi.legacy` plugin.
continuous-integration/drone/push Build is passing Details
2024-02-24 14:07:07 +01:00
Fabio Manganiello 9ad9bd20e4
Added `stream_on_start` argument to `camera` plugins.
continuous-integration/drone/push Build is passing Details
It replaces the functionalities of the deprecated `camera` backends.
2024-02-24 01:31:05 +01:00
Fabio Manganiello 9cf95125a6 [WIP] Added streaming support to camera.pi using new picamera2 API
continuous-integration/drone/push Build is passing Details
2024-02-22 22:52:52 +01:00
Fabio Manganiello 659c33837e [WIP] Using new picamera2 module for camera.pi, and moved old picamera integration to camera.pi.legacy
continuous-integration/drone/push Build is passing Details
2024-02-19 00:07:29 +00:00
Fabio Manganiello d0f1ee0582
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-16 23:03:08 +00:00
Fabio Manganiello c59446fdb1
Fixed setting of `output_file` on `FfmpegWriter`.
continuous-integration/drone/push Build is passing Details
Also, fixed parameters passed to camera
writer objects.
2024-02-17 00:01:47 +01:00
Fabio Manganiello a38ef6bc7a Workaround for possible `multiple camera parameter` error.
continuous-integration/drone/push Build was killed Details
2024-02-15 00:51:04 +00:00
Fabio Manganiello 191d7a75ea
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-06 22:29:48 +00:00
Fabio Manganiello 8f7aad2af7
google-assistant-sdk is no longer a dependency for the Google Assistant integration
continuous-integration/drone/push Build is passing Details
2024-02-06 20:08:57 +01:00
Fabio Manganiello 48756e6287
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-05 01:19:21 +00:00
Fabio Manganiello 2b595623b3
[#348] Converted `gps` backend into a plugin.
continuous-integration/drone/push Build is passing Details
Closes: #348
2024-02-05 02:16:02 +01:00
Fabio Manganiello 8351463a11
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-03 21:11:01 +00:00
Fabio Manganiello c8944feca4 [#348] Merge + refactor for the `mail` backend/plugin (#362)
continuous-integration/drone/push Build is passing Details
Closes: #348

Reviewed-on: #362
2024-02-03 22:09:40 +01:00
Fabio Manganiello 5badc935ac
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-02-03 21:08:07 +00:00
Fabio Manganiello 7d362cae1a
FIX: Redis pub/sub error can also raise a `ValueError` on close.
continuous-integration/drone/push Build is passing Details
2024-02-03 22:06:36 +01:00
Fabio Manganiello 39d5c48088
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-19 20:59:26 +00:00
Fabio Manganiello 746423a113 [#356] Merged `adafruit.io` plugin and backend. 2024-01-19 20:58:35 +00:00
Fabio Manganiello f21a1dd8e6
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-19 02:15:39 +00:00
Fabio Manganiello eb47f9ded0 [#351] Merged `google.pubsub` plugin and backend.
Closes: #351
2024-01-19 02:14:49 +00:00
Fabio Manganiello 2e9cb44caf
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-19 00:50:24 +00:00
Fabio Manganiello 1323156838
Fixed `google.credentials` script order of arguments in the docstring.
continuous-integration/drone/push Build is passing Details
2024-01-19 01:48:33 +01:00
Fabio Manganiello a5b7e2b52e
[CI/CD] Fixed version format for the `platypush-git` Arch package.
continuous-integration/drone/push Build is passing Details
The format should be `<MAJ>.<MIN>.<PATCH>.r<REVISION>.g<HEAD>`.

The `g` prefix was missing.
2024-01-19 01:06:47 +01:00
Fabio Manganiello aceb9b940a
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-18 23:32:23 +00:00
Fabio Manganiello 6775208b2e Fixed minor docstring typo. 2024-01-18 23:31:27 +00:00
Fabio Manganiello f9bd5b3abc [#350] Merge `google.fit` backend and plugin.
Closes: #350.
2024-01-18 23:31:27 +00:00
Fabio Manganiello e3c04d9316 Fixed bullet points indentation in Google plugins docstrings. 2024-01-18 23:31:27 +00:00
Fabio Manganiello e022712b7b [Google] Updated authorization flow for Google plugins.
The new authorization flow also requires the user to input a code
returned on the browser's authorization page.

Since the Google authentication libraries seem to use a simple `input()`
to read this code, things are likely to fail quite badly if Platypush is
run in non-interactive mode - e.g. through a systemd service or in a
Docker container.

Thus we need to go with Google's automatic flow only if `DISPLAY` or
`BROWSER` are set (thus the interactive flow can proceed), and throw an
`AssertionError` with the command to execute if no display/browser are
detected.
2024-01-18 23:31:27 +00:00
Fabio Manganiello 31de917631 [Google] Updated documentation of Google plugins.
Expanded explanation of the desktop vs. headless authentication process
and where the credential files are supposed to be copied if the user
opts for a non-automatic authentication flow.
2024-01-18 23:31:27 +00:00
Fabio Manganiello dec2a54740
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-18 23:29:13 +00:00
Fabio Manganiello 998b7be7b8
[media.vlc] Always add `--play-and-exit` to args.
continuous-integration/drone/push Build is passing Details
Without this option VLC seems to hang in the background, and it may
cause PulseAudio failures or memory issues after several videos have
been played - each in its own session.
2024-01-18 21:21:15 +01:00
Fabio Manganiello a47f9f1852
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-18 01:29:46 +00:00
Fabio Manganiello 95c15f3f5f [#347] Merge `kafka` backend and plugin.
Closes: #347
2024-01-18 01:28:56 +00:00
Fabio Manganiello a596ed80a2
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-17 23:27:34 +00:00
Fabio Manganiello 1c5956c38b
Fixed some docstring warnings.
continuous-integration/drone/push Build was killed Details
2024-01-18 00:26:22 +01:00
Fabio Manganiello 85db77bb7b
[#298] Merged `nextcloud` backend and plugin.
Closes: #298
2024-01-18 00:26:22 +01:00
Fabio Manganiello dd5bc7639b
Added `disable_monitor` flag to `RunnablePlugin`.
This is useful when users want to use a runnable plugin in a stateless
way. In some cases (for example systems with high latency or limited
quotas for API calls) the user may want to leverage the actions of a
plugin, but without running monitoring/polling logic nor generating
events.
2024-01-18 00:26:22 +01:00
Fabio Manganiello fb91be7628
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-15 23:56:02 +00:00
Fabio Manganiello e9d91471ce
[media.mplayer] Plugin rewrite.
continuous-integration/drone/push Build is passing Details
Too many things were falling apart, and many others of MPlayer's "API
smells" had never been addressed.

The plugin has now largely been rewritten, and some workarounds (like
accessory monitoring processes) have been added to deal with the fact
that events like end-of-file aren't published by the player, and some
polling is required.
2024-01-16 00:41:01 +01:00
Fabio Manganiello ca25b3a4e6
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-15 23:39:51 +00:00
Fabio Manganiello 3598253558
Reduced Docker images to a single layer.
continuous-integration/drone/push Build is passing Details
2024-01-15 21:54:22 +01:00
Fabio Manganiello bf1b8aaf70
Delete pubsub closure to `_pubsub_close()`.
The Redis channel may be closed, and in that case we need to handle the
exception instead of throwing it - which causes the upstream Tornado
worker to fail too.
2024-01-14 21:27:08 +01:00
Fabio Manganiello 6fe1ed44ad
[media] Fixed base interface of `media.seek` and `media.set_position`. 2024-01-13 22:39:33 +01:00
Fabio Manganiello cf314f2615
[mpv] Refactored plugin.
I hadn't paid attention to this plugin in a while and the newest mpv API
has diverged so much that it was entirely incompatible with recent mpv
versions.
2024-01-13 22:36:42 +01:00
Fabio Manganiello 641a2fd135
Renamed parameter of `volup`/`voldown` for music plugins.
To be consistent with all other media plugins, the parameter name should
be `step`, not `delta`.

A back-compatibility layer has however been introduced for plugins
(namely `music.mpd` and `music.spotify`) that already exposed the old
interface.
2024-01-13 22:35:18 +01:00
Fabio Manganiello f0dcb94862
[pushbullet] Fixed `on_error` callback on the listener.
The `Listener` class from the `pushbullet.py` library is a mess, and it
has two internal functions to handle errors.
2024-01-13 13:24:47 +01:00
Fabio Manganiello 18bba7e3bf
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-01-09 23:47:38 +00:00
Fabio Manganiello 9fa5989e21 [#302] Merged `pushbullet` backend and plugin.
Also, added support for more granular Pushbullet events.

Closes: #302
2024-01-09 23:46:07 +00:00
Fabio Manganiello 4e1943d197
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-08 22:04:48 +00:00
Fabio Manganiello 4505c46071
[Sound] Don't override device index if it's already defined in the info.
continuous-integration/drone/push Build is passing Details
2024-01-08 23:03:08 +01:00
Fabio Manganiello b097a4c1f4
Remove also the dist directory in the build-ui step before running npm run build
continuous-integration/drone/push Build is passing Details
2024-01-08 22:56:05 +01:00
Fabio Manganiello bb2f86f1a5
An empty commit to re-trigger the CI/CD pipelines
continuous-integration/drone/push Build is passing Details
2024-01-08 22:38:31 +01:00
Fabio Manganiello 314e1a98ef
Updated dist files
continuous-integration/drone/push Build is failing Details
2024-01-08 22:35:57 +01:00
Fabio Manganiello deaedf2462
[Media UI] Don't display the torrent menu entry if no torrent plugin is enabled.
continuous-integration/drone/push Build was killed Details
2024-01-08 22:25:10 +01:00
Fabio Manganiello 5ef7313bdc
[Music UI] Use the `Playlist` component also for playlist editors. 2024-01-08 22:17:04 +01:00
Fabio Manganiello e881fedc59
[Automatic] Updated UI files
continuous-integration/drone/push Build was killed Details
2024-01-08 01:46:55 +00:00
Fabio Manganiello 3282588c6e
[Music UI] Many improvements to the interface.
continuous-integration/drone/push Build was killed Details
2024-01-08 02:44:53 +01:00
Fabio Manganiello 80c2f0d8dd
[UI] Full restyle of `Slider` component.
The component has been rewritten using only CSS 3 and no JS.
2024-01-08 02:44:52 +01:00
Fabio Manganiello b785609eda
[Music UI] New music nav logic.
Don't display the vertical nav on mobile by default - same logic as the
generic media nav.
2024-01-08 02:44:52 +01:00
Fabio Manganiello f59a276e09
[Media UI] Set `overflow: auto` on the innermost grid div only.
If a parent object of the `grid` DOM element has `overflow: auto` as
well, then it will intercept the `@scroll` events, so `Results` won't be
able to render an infinite scroll.
2024-01-08 02:44:52 +01:00
Fabio Manganiello 9f6ac4acd1
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-06 23:53:33 +00:00
Fabio Manganiello 3d2ee5d6bb
Replaced some new typing `|` notations with `Union`.
continuous-integration/drone/push Build is passing Details
The `|` notation breaks on Python < 3.10.
2024-01-07 00:52:24 +01:00
Fabio Manganiello 1cd328ef44
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-06 23:32:55 +00:00
Fabio Manganiello c64c28f7a8
(Re)-added `backend/sensor/__init__.py` file.
continuous-integration/drone/push Build is passing Details
If the empty file is missing then any remaining backends under that
package won't be indexed.
2024-01-07 00:31:45 +01:00
Fabio Manganiello f9e5117145
[Automatic] Updated components cache
continuous-integration/drone/push Build is passing Details
2024-01-06 23:07:31 +00:00
Fabio Manganiello f733c6318f
Moved optional import in constructor block.
continuous-integration/drone/push Build is passing Details
2024-01-07 00:05:51 +01:00
Fabio Manganiello 1ff8cfd240
[CI/CD] A more robust logic to regenerate `components.json.gz`.
continuous-integration/drone/push Build is passing Details
We shouldn't rely on `git diff`. Even when the underlying source code
hasn't changed, and the cache is dumped with `sort_keys=True`, some of
the generated snippets of docstrings may change, leading the CI/CD
pipeline to get stuck in a push loop.

We should instead look for changes to the plugins, backends, events and
schemas folders before and after the CI/CD trigger to infer if we need
to regenerate the file.
2024-01-06 23:45:51 +01:00
Fabio Manganiello e803807b8d
[Automatic] Updated components cache
continuous-integration/drone/push Build was killed Details
2024-01-06 21:51:43 +00:00
Fabio Manganiello edd92b8467
Fix: Ensure that components cache keys are ordered before dumping to file.
continuous-integration/drone/push Build is passing Details
Reason: The CI/CD automation regenerates the cache file, and commits
the changes if it differs from the previous version.

The only way to ensure semantic equivalence is to sort the keys upon
dump.
2024-01-06 22:50:34 +01:00
Fabio Manganiello 0f130235d3
[Automatic] Updated components cache
continuous-integration/drone/push Build was killed Details
2024-01-06 21:46:12 +00:00
Fabio Manganiello 4926f28f24
[Automatic] Updated components cache
continuous-integration/drone/push Build was killed Details
2024-01-06 21:45:04 +00:00
Fabio Manganiello bb6f859262
Fix: typo in git commit argument.
continuous-integration/drone/push Build is passing Details
2024-01-06 22:43:38 +01:00
Fabio Manganiello cce04ef729
Updated components file
continuous-integration/drone/push Build is failing Details
2024-01-06 22:41:25 +01:00
Fabio Manganiello f85fc02cce
Fix: git should be installed earlier in the update-components-cache step. 2024-01-06 22:41:25 +01:00
Fabio Manganiello 771ecd9a5b
Fixed typo in the package name of the Github manifest. 2024-01-06 22:41:24 +01:00
Fabio Manganiello 30bbc396fb
[Automatic] Updated UI files
continuous-integration/drone/push Build is failing Details
2024-01-06 21:27:39 +00:00
Fabio Manganiello 6e1ab92298
New components cache management.
continuous-integration/drone/push Build is passing Details
The cache is no longer generated at runtime when the application runs -
which may take quite a while, especially on fresh installations.

A `components.json.gz` file is instead generated by the CI/CD process on
every commit to the main branch, and distributed with the package.

The application will read this file when the `inspect` plugin is first
initialized.

This also means that we can no longer cache the `install_cmds`, as they
change depending on the target OS. A new
`application.get_install_commands` action has now been made available to
the UI, so it can get the correct installation commands at runtime.
2024-01-06 22:21:59 +01:00
Fabio Manganiello ef885e096f
Added `inspect.get_pkg_managers` internal action.
It will be used by the UI to put together the installation commands.
2024-01-06 03:02:31 +01:00
snyk-bot c6593cfa06
fix: platypush/backend/http/webapp/package.json & platypush/backend/http/webapp/package-lock.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-AXIOS-6144788
2024-01-05 14:12:29 +00:00
Fabio Manganiello e1b6be7673
Marshmallow has replaced `field.default` with `field.dump_default`.
continuous-integration/drone/push Build is passing Details
2024-01-05 02:56:10 +01:00
Fabio Manganiello 8fd5009553
[foursquare] Proper cast to number for db variables which may be strings. 2024-01-05 02:56:10 +01:00
Fabio Manganiello 5167597ace
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-01-05 01:27:29 +00:00
Fabio Manganiello afee6c5c85
[music UI] Implemented infinite scroll for playlist view.
continuous-integration/drone/push Build is passing Details
Instead of loading all the tracks in the DOM (very inefficient and slow
on slow devices and/or with big playlists), we should keep a window of
100 items in the screen and roll it over the playlists as the status
change or the user scrolls.
2024-01-05 02:19:38 +01:00
Fabio Manganiello dbae2ccc40
Added Redis db dump files to .gitignore 2024-01-04 23:32:03 +01:00
Fabio Manganiello 1e45aa5de9
A more robust logic to wait for the app to start in the tests.
continuous-integration/drone/push Build is passing Details
2024-01-04 23:24:25 +01:00
Fabio Manganiello 91a8fd3b56
[system] A more robust logic to parse cache size from `cpuinfo`.
continuous-integration/drone/push Build is passing Details
2024-01-04 13:55:08 +01:00
Fabio Manganiello 9c3da7a2a9
Several improvements for request/procedure execution.
continuous-integration/drone/push Build is passing Details
- Fixed regression introduced by incorrect format string in `exec`.

- LINT for the `procedure` module.

- Apply `Message.Encoder` when dumping values from the context.
2024-01-04 13:13:16 +01:00
Fabio Manganiello b72fb83d18
Merge branch '286/merge-foursquare-backend'
continuous-integration/drone/push Build is passing Details
2024-01-01 23:00:55 +01:00
Fabio Manganiello b8f8236c28
[Automatic] Updated UI files
continuous-integration/drone/push Build is passing Details
2024-01-01 13:24:56 +00:00
Fabio Manganiello 35772c0ae3 [Entities UI] Reverted `.extension-container` max-width. 2024-01-01 13:23:24 +00:00
Fabio Manganiello 3fbb0d289b Fixed docstring 2024-01-01 13:23:24 +00:00
Fabio Manganiello 5eb09eab1a [#287] Migrated `github` from a backend to a runnable plugin.
Closes: #287
2023-12-30 15:28:16 +00:00
snyk-bot d54970765e
fix: upgrade vue from 3.3.4 to 3.3.6
Snyk has created this PR to upgrade vue from 3.3.4 to 3.3.6.

See this package in npm:
https://www.npmjs.com/package/vue

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-11-10 14:35:37 +00:00
snyk-bot 9814292a2e
fix: upgrade vue-router from 4.2.4 to 4.2.5
Snyk has created this PR to upgrade vue-router from 4.2.4 to 4.2.5.

See this package in npm:
https://www.npmjs.com/package/vue-router

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-11-05 15:30:06 +00:00
snyk-bot eff126052d
fix: upgrade core-js from 3.32.0 to 3.33.0
Snyk has created this PR to upgrade core-js from 3.32.0 to 3.33.0.

See this package in npm:
https://www.npmjs.com/package/core-js

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-11-05 15:30:02 +00:00
snyk-bot 3ddac09412
fix: upgrade sass from 1.65.1 to 1.69.3
Snyk has created this PR to upgrade sass from 1.65.1 to 1.69.3.

See this package in npm:
https://www.npmjs.com/package/sass

See this project in Snyk:
https://app.snyk.io/org/blacklight/project/96bfd125-5816-4d9e-83c6-94d1569ab0f1?utm_source=github&utm_medium=referral&page=upgrade-pr
2023-11-05 15:29:57 +00:00
988 changed files with 25620 additions and 16528 deletions

View File

@ -27,19 +27,7 @@ steps:
from_secret: ssh_privkey
commands:
- apk add --update --no-cache git openssh
- mkdir -p ~/.ssh
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
- |
cat <<EOF > ~/.ssh/id_rsa
$SSH_PRIVKEY
EOF
- chmod 0600 ~/.ssh/id_rsa
- ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null
- git config --global --add safe.directory $PWD
- git remote add github git@github.com:/BlackLight/platypush.git
- git pull --rebase github "$(git branch | head -1 | awk '{print $2}')" || echo "No such branch on Github"
- git push --all -v github
- . .drone/github-mirror.sh
###
### Synchronize the `stable` branch to the new release
@ -58,44 +46,7 @@ steps:
from_secret: pgp_key_id
commands:
- apk add --update --no-cache git bash gnupg openssh
# Backup the original git configuration before changing attributes
- export GIT_CONF=$PWD/.git/config
- cp $GIT_CONF /tmp/git.config.orig
- git config --global --add safe.directory $PWD
# Install the SSH and PGP keys
- mkdir -p ~/.ssh
- |
cat <<EOF | gpg --import --armor
$PGP_KEY
EOF
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
- |
cat <<EOF > ~/.ssh/id_rsa
$SSH_PRIVKEY
EOF
- chmod 0600 ~/.ssh/id_rsa
- ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
# Git configuration
- git config user.name "Platypush CI/CD Automation"
- git config user.email "admin@platypush.tech"
- git config commit.gpgsign true
- git config user.signingkey $PGP_KEY_ID
- git remote rm origin
- git remote add origin git@git.platypush.tech:platypush/platypush.git
# Merge and push to the `stable` branch
- git checkout stable
- git rebase master
- git push -u origin stable
- git checkout master
# Restore the original git configuration
- mv /tmp/git.config.orig $GIT_CONF
- . .drone/sync-stable-branch.sh
when:
event:
@ -112,28 +63,7 @@ steps:
path: /docs
commands:
- echo "Installing required build dependencies"
- apk add --update --no-cache git make py3-sphinx py3-myst-parser py3-pip $(cat platypush/install/requirements/alpine.txt)
- pip install -U sphinx-rtd-theme sphinx-book-theme --break-system-packages
- pip install . --break-system-packages
- mkdir -p /docs/current
- export APPDIR=$PWD
- rm -rf "$APPDIR/docs/build"
- echo "Building the updated documentation"
- cd "$APPDIR/docs/source"
- git clone 'https://git.platypush.tech/platypush/platypush.wiki.git' wiki
- cd wiki
- ln -s Home.md index.md
- cd "$APPDIR/docs"
- make html
- rm -f config*.yaml
- cd "$APPDIR"
- echo "Copying the new documentation files to the target folder"
- mv -v "$APPDIR/docs/build" /docs/new
- cd /docs
- mv current old
- mv new current
- rm -rf old
- . .drone/rebuild-docs.sh
when:
event:
@ -149,10 +79,7 @@ steps:
- name: tests
image: alpine
commands:
- apk add --update --no-cache $(cat platypush/install/requirements/alpine.txt)
- pip install . --break-system-packages
- pip install -r requirements-tests.txt --break-system-packages
- pytest tests
- . .drone/run-tests.sh
###
### Rebuild the UI files
@ -181,68 +108,36 @@ steps:
- tests
commands:
- export SKIPCI="$PWD/.skipci"
- rm -rf "$SKIPCI"
- apk add --update --no-cache git
- . .drone/build-ui.sh
# Backup the original git configuration before changing attributes
- export GIT_CONF=$PWD/.git/config
- cp $GIT_CONF /tmp/git.config.orig
###
### Regenerate the components.json cache
###
- git config --global --add safe.directory $PWD
- cd platypush/backend/http/webapp
- |
if [ $(git log --pretty=oneline $DRONE_COMMIT_AFTER...$DRONE_COMMIT_BEFORE . | wc -l) -eq 0 ]; then
echo "No UI changes detected, skipping build"
exit 0
fi
- name: update-components-cache
image: alpine
- |
if [ "$(git log --pretty=format:%s HEAD...HEAD~1 | head -1)" == "[Automatic] Updated UI files" ]; then
echo "UI changes have already been committed, skipping build"
exit 0
fi
environment:
SSH_PUBKEY:
from_secret: ssh_pubkey
SSH_PRIVKEY:
from_secret: ssh_privkey
PGP_KEY:
from_secret: pgp_key
PGP_KEY_ID:
from_secret: pgp_key_id
- rm -rf node_modules
- npm install
- npm run build
- |
if [ $(git status --porcelain dist | wc -l) -eq 0 ]; then
echo "No build files have been changed"
exit 0
fi
when:
branch:
- master
event:
- push
# Create a .skipci file to mark the fact that the next steps should be skipped
# (we're going to do another push anyway, so another pipeline will be triggered)
- touch "$SKIPCI"
depends_on:
- build-ui
- apk add --update --no-cache bash gnupg openssh
- mkdir -p ~/.ssh
- |
cat <<EOF | gpg --import --armor
$PGP_KEY
EOF
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
- |
cat <<EOF > ~/.ssh/id_rsa
$SSH_PRIVKEY
EOF
- chmod 0600 ~/.ssh/id_rsa
- ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
- git config user.name "Platypush CI/CD Automation"
- git config user.email "admin@platypush.tech"
- git config commit.gpgsign true
- git config user.signingkey $PGP_KEY_ID
- git add dist
- git commit dist -S -m "[Automatic] Updated UI files" --no-verify
- git remote rm origin
- git remote add origin git@git.platypush.tech:platypush/platypush.git
- git push -f origin master
# Restore the original git configuration
- mv /tmp/git.config.orig $GIT_CONF
commands:
- . .drone/update-components-cache.sh
###
### Update the Arch packages
@ -264,82 +159,10 @@ steps:
- push
depends_on:
- build-ui
- update-components-cache
commands:
- |
[ -f .skipci ] && exit 0
- echo "-- Installing dependencies"
- apk add --update --no-cache curl git openssh pacman sudo
- echo "--- Parsing metadata"
- git config --global --add safe.directory $PWD
- git pull --rebase origin master --tags
- export VERSION=$(python setup.py --version)
- export HEAD=$(git log --pretty=format:%h HEAD...HEAD~1 | head -1)
- export GIT_VERSION="$VERSION.r$(git log --pretty=oneline HEAD...v$VERSION | wc -l).$HEAD"
- export TAG_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
- echo "--- Preparing environment"
- mkdir -p ~/.ssh
- echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
- |
cat <<EOF > ~/.ssh/id_rsa
$SSH_PRIVKEY
EOF
- chmod 0600 ~/.ssh/id_rsa
- ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null
- ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts 2>/dev/null
- adduser -u 1000 -D build
- mkdir -p $WORKDIR
- echo "--- Updating Arch git version"
- export PKGDIR=$WORKDIR/git
- git clone ssh://aur@aur.archlinux.org/platypush-git.git $PKGDIR
- git config --global --add safe.directory $PKGDIR
- chown -R build $PKGDIR
- cd $PKGDIR
- |
sed -i 'PKGBUILD' -r \
-e "s/^pkgver=.*/pkgver=$GIT_VERSION/" \
-e "s/^pkgrel=.*/pkgrel=1/" \
- sudo -u build makepkg --printsrcinfo > .SRCINFO
- export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
- |
if [ $FILES_CHANGED -gt 0 ]; then
echo "--- Pushing git package version $GIT_VERSION"
git commit -a -m '[Automatic] Package update'
git push origin master
fi
- echo "--- Updating Arch stable version"
- export PKGDIR=$WORKDIR/stable
- git clone ssh://aur@aur.archlinux.org/platypush.git $PKGDIR
- git config --global --add safe.directory $PKGDIR
- chown -R build $PKGDIR
- cd $PKGDIR
- export RELEASED_VERSION=$(grep -e '^pkgver=' PKGBUILD | sed -r -e 's/^pkgver=(.*)\s*/\1/')
- |
if [ "$RELEASED_VERSION" == "$VERSION" ]; then
exit 0
fi
- export TAG_CHECKSUM=$(curl --silent "$TAG_URL" | sha512sum | awk '{print $1}')
- |
sed -i 'PKGBUILD' -r \
-e "s/^pkgver=.*/pkgver=$VERSION/" \
-e "s/^pkgrel=.*/pkgrel=1/" \
-e "s/^sha512sums=.*/sha512sums=('$TAG_CHECKSUM')/"
- sudo -u build makepkg --printsrcinfo > .SRCINFO
- export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
- |
if [ $FILES_CHANGED -gt 0 ]; then
echo "--- Pushing stable package version $VERSION"
git commit -a -m '[Automatic] Package update'
git push origin master
fi
- . .drone/update-arch-packages.sh
###
### Update the Debian (stable) packages
@ -364,81 +187,10 @@ steps:
- push
depends_on:
- build-ui
- update-components-cache
commands:
- |
[ -f .skipci ] && exit 0
- echo "-- Installing dependencies"
- apt update
- apt install -y curl dpkg-dev gpg git python3 python3-pip
- echo "-- Copying source directory"
- mkdir -p "$WORKDIR"
- export SRCDIR="$WORKDIR/src"
- cp -r "$PWD" "$SRCDIR"
- cd "$SRCDIR"
- echo "--- Parsing metadata"
- git config --global --add safe.directory "$PWD"
- git pull --rebase origin master --tags
- export VERSION=$(python3 setup.py --version)
- export GIT_VERSION="$VERSION-$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
- export GIT_BUILD_DIR="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all"
- export GIT_DEB="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all.deb"
- export POOL_PATH="$APT_ROOT/pool/$DEB_VERSION/dev"
- echo "--- Building git package"
- pip install --prefix="$GIT_BUILD_DIR/usr" --no-cache --no-deps .
- |
find "$GIT_BUILD_DIR" -name "site-packages" | while read dir; do
base="$(dirname "$dir")"
mv "$dir" "$base/dist-packages"
done
- mkdir -p "$GIT_BUILD_DIR/DEBIAN"
- |
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/control"
Package: $PKG_NAME
Version: $GIT_VERSION
Maintainer: Fabio Manganiello <fabio@platypush.tech>
Depends: $(cat platypush/install/requirements/debian.txt | tr '\n' ',' | sed -re 's/,$//' -e 's/,/, /g')
Architecture: all
Homepage: https://platypush.tech
Description: Universal command executor and automation hub.
EOF
- mkdir -p "$POOL_PATH"
- rm -f "$POOL_PATH/"*.deb
- dpkg --build "$GIT_BUILD_DIR"
- echo "--- Copying $GIT_DEB to $POOL_PATH"
- cp "$GIT_DEB" "$POOL_PATH"
# If main/all/Packages doesn't exist, then we should create the first main release
- |
[ $(ls "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-"*"_all.deb" 2>/dev/null | wc -l) -eq 0 ] && export UPDATE_STABLE_PKG=1
- export PKGURL="https://apt.platypush.tech/dists/$DEB_VERSION/main/all/Packages"
- |
[ -z "$UPDATE_STABLE_PKG" ] &&
curl -ILs -o /dev/null -w "%{http_code}" "$PKGURL" |
grep -e '^4' >/dev/null && export UPDATE_STABLE_PKG=1
# If the published release version differs from the current one, then we should publish a new main release
- |
if [ -z "$UPDATE_STABLE_PKG" ]; then
RELEASED_VERSION=$(curl -s "$PKGURL" | grep -e '^Version: ' | head -1 | awk '{print $2}' | cut -d- -f 1)
[ "$RELEASED_VERSION" != "$VERSION" ] && export UPDATE_STABLE_PKG=1
fi
# Proceed and update the main release if the version number has changed
- |
if [ -n "$UPDATE_STABLE_PKG" ]; then
echo "--- Updating main package"
mkdir -p "$APT_ROOT/pool/$DEB_VERSION/main"
cp "$GIT_DEB" "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-1_all.deb"
fi
- . .drone/update-deb-packages.sh
###
### Update the Debian (oldstable) packages
@ -463,81 +215,10 @@ steps:
- push
depends_on:
- build-ui
- update-components-cache
commands:
- |
[ -f .skipci ] && exit 0
- echo "-- Copying source directory"
- mkdir -p "$WORKDIR"
- export SRCDIR="$WORKDIR/src"
- cp -r "$PWD" "$SRCDIR"
- cd "$SRCDIR"
- echo "-- Installing dependencies"
- apt update
- apt install -y curl dpkg-dev gpg git python3 python3-pip
- echo "--- Parsing metadata"
- git config --global --add safe.directory "$PWD"
- git pull --rebase origin master --tags
- export VERSION=$(python3 setup.py --version)
- export GIT_VERSION="$VERSION-$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
- export GIT_BUILD_DIR="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all"
- export GIT_DEB="$WORKDIR/$${PKG_NAME}_$${GIT_VERSION}_all.deb"
- export POOL_PATH="$APT_ROOT/pool/$DEB_VERSION/dev"
- echo "--- Building git package"
- pip install --prefix="$GIT_BUILD_DIR/usr" --no-cache --no-deps .
- |
find "$GIT_BUILD_DIR" -name "site-packages" | while read dir; do
base="$(dirname "$dir")"
mv "$dir" "$base/dist-packages"
done
- mkdir -p "$GIT_BUILD_DIR/DEBIAN"
- |
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/control"
Package: $PKG_NAME
Version: $GIT_VERSION
Maintainer: Fabio Manganiello <fabio@platypush.tech>
Depends: $(cat platypush/install/requirements/debian.txt | tr '\n' ',' | sed -re 's/,$//' -e 's/,/, /g')
Architecture: all
Homepage: https://platypush.tech
Description: Universal command executor and automation hub.
EOF
- mkdir -p "$POOL_PATH"
- rm -f "$POOL_PATH/"*.deb
- dpkg --build "$GIT_BUILD_DIR"
- echo "--- Copying $GIT_DEB to $POOL_PATH"
- cp "$GIT_DEB" "$POOL_PATH"
# If main/all/Packages doesn't exist, then we should create the first main release
- |
[ $(ls "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-"*"_all.deb" 2>/dev/null | wc -l) -eq 0 ] && export UPDATE_STABLE_PKG=1
- export PKGURL="https://apt.platypush.tech/dists/$DEB_VERSION/main/all/Packages"
- |
[ -z "$UPDATE_STABLE_PKG" ] &&
curl -ILs -o /dev/null -w "%{http_code}" "$PKGURL" |
grep -e '^4' >/dev/null && export UPDATE_STABLE_PKG=1
# If the published release version differs from the current one, then we should publish a new main release
- |
if [ -z "$UPDATE_STABLE_PKG" ]; then
RELEASED_VERSION=$(curl -s "$PKGURL" | grep -e '^Version: ' | head -1 | awk '{print $2}' | cut -d- -f 1)
[ "$RELEASED_VERSION" != "$VERSION" ] && export UPDATE_STABLE_PKG=1
fi
# Proceed and update the main release if the version number has changed
- |
if [ -n "$UPDATE_STABLE_PKG" ]; then
echo "--- Updating main package"
mkdir -p "$APT_ROOT/pool/$DEB_VERSION/main"
cp "$GIT_DEB" "$APT_ROOT/pool/$DEB_VERSION/main/$${PKG_NAME}_$${VERSION}-1_all.deb"
fi
- . .drone/update-deb-packages.sh
###
### Updates the APT repository after new packages have been pushed
@ -568,183 +249,7 @@ steps:
- update-debian-oldstable-packages
commands:
- |
[ -f .skipci ] && exit 0
- echo "-- Installing dependencies"
- apt update
- apt install -y dpkg-dev gpg
- echo "-- Creating a new apt root folder"
- export TMP_APT_ROOT="/tmp/apt"
- cp -r "$APT_ROOT" "$TMP_APT_ROOT"
- echo "-- Cleaning up older apt releases"
- |
find "$TMP_APT_ROOT/pool" -mindepth 2 -maxdepth 2 -type d | while read reldir; do
pkg_to_remove=$(( $(ls "$reldir"/*.deb | wc -l) - 1 ))
[ $pkg_to_remove -le 0 ] && continue
ls "$reldir"/*.deb | sort -V | head -n$pkg_to_remove | xargs rm -f
done
- echo "-- Updating Packages files"
- |
echo "stable\noldstable" | while read distro; do
echo "main\ndev" | while read branch; do
branch_dir="$TMP_APT_ROOT/pool/$distro/$branch"
echo "Checking pool folder: $branch_dir"
[ -d "$branch_dir" ] || mkdir -p "$branch_dir"
dist_dir="$TMP_APT_ROOT/dists/$distro/$branch/all"
mkdir -p "$dist_dir"
pkg_file="$dist_dir/Packages"
dpkg-scanpackages --arch all "$branch_dir" > "$pkg_file"
sed -i "$pkg_file" -re "s|^Filename: $TMP_APT_ROOT/|Filename: |"
cat "$pkg_file" | gzip -9 > "$pkg_file.gz"
echo "Generated Packages file: $pkg_file"
cat "$pkg_file"
done
done
- echo "-- Updating Release files"
- |
add_hashes() {
dist_dir=$1
hash_cmd=$2
hash_label=$3
echo "$hash_label:"
find "$dist_dir" -name 'Packages*' | while read file; do
basename="$(echo "$file" | sed -r -e "s|^$dist_dir/||")"
hash="$($hash_cmd "$file" | cut -d" " -f1)"
size="$(wc -c < $file)"
echo " $hash $size $basename"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-i386/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-amd64/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armel/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armhf/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-arm64/|')"
done
}
echo "stable\noldstable" | while read distro; do
dist_dir="$TMP_APT_ROOT/dists/$distro"
components=$(find "$dist_dir" -name Packages | awk -F '/' '{print $(NF-2)}' | uniq | tr '\n' ' ')
release_file="$dist_dir/Release"
cat <<EOF > "$release_file"
Origin: Platypush repository
Label: Platypush
Suite: $distro
Codename: $distro
Architectures: i386 amd64 armel armhf arm64
Components: $components
Description: The official APT repository for Platypush
Date: $(date -Ru)
EOF
add_hashes "$dist_dir" "md5sum" "MD5Sum" >> "$release_file"
add_hashes "$dist_dir" "sha1sum" "SHA1" >> "$release_file"
add_hashes "$dist_dir" "sha256sum" "SHA256" >> "$release_file"
done
- echo "-- Generating list files"
- mkdir -p "$TMP_APT_ROOT/lists"
- |
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-stable-main.list"
deb https://apt.platypush.tech/ stable main
EOF
- |
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-stable-dev.list"
deb https://apt.platypush.tech/ stable dev
EOF
- |
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-oldstable-main.list"
deb https://apt.platypush.tech/ oldstable main
EOF
- |
cat <<EOF > "$TMP_APT_ROOT/lists/platypush-oldstable-dev.list"
deb https://apt.platypush.tech/ oldstable dev
EOF
- echo "-- Updating index file"
- |
cat <<EOF > "$TMP_APT_ROOT/index.txt"
Welcome to the Platypush APT repository!
Project homepage: https://platypush.tech
Source code: https://git.platypush.tech/platypush/platypush
Documentation / API reference: https://docs.platypush.tech
You can use this APT repository to install Platypush on Debian, Ubuntu or any
Debian-based distro.
Steps:
1. Add this repository's PGP key to your apt keyring
====================================================
$ sudo wget -q -O \\\
/etc/apt/trusted.gpg.d/platypush.asc \\\
https://apt.platypush.tech/pubkey.txt
2. Add the repository to your sources
=====================================
$ sudo wget -q -O \\\
/etc/apt/sources.list.d/platypush.list \\\
https://apt.platypush.tech/lists/platypush-<deb_version>-<branch>.list
Where:
- deb_version can be either *stable* (for the current Debian stable version) or
*oldstable* (for the previous Debian stable version)
- branch can be either *main* (for the latest releases) or *dev* (for a package
that is always in sync with the git version)
For example, to install the latest stable tags on Debian stable:
$ sudo wget -q -O \\\
/etc/apt/sources.list.d/platypush.list \\\
https://apt.platypush.tech/lists/platypush-stable-main.list
3. Update your repos
====================
$ sudo apt update
4. Install Platypush
====================
$ sudo apt install platypush
EOF
- echo "-- Importing and refreshing PGP key"
- echo "$PGP_PUBKEY" > "$TMP_APT_ROOT/pubkey.txt"
- export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
- |
cat <<EOF | gpg --import --armor
$PGP_PRIVKEY
EOF
- echo "-- Signing Release files"
- |
find "$TMP_APT_ROOT/dists" -type f -name Release | while read file; do
dirname="$(dirname "$file")"
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs > "$file.gpg"
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs --clearsign > "$dirname/InRelease"
done
- echo "-- Updating the apt repo root"
- export OLD_APT_ROOT="$REPOS_ROOT/oldapt"
- rm -rf "$OLD_APT_ROOT"
- mv "$APT_ROOT" "$OLD_APT_ROOT"
- mv "$TMP_APT_ROOT" "$APT_ROOT"
- chmod -R a+r "$APT_ROOT"
- chmod a+x "$APT_ROOT"
- . .drone/update-apt-repo.sh
###
### Update the RPM (stable) packages
@ -774,215 +279,10 @@ steps:
- push
depends_on:
- build-ui
- update-components-cache
commands:
- |
[ -f .skipci ] && exit 0
- echo "-- Installing dependencies"
- yum install -y createrepo rpm-build rpm-sign gpg wget yum-utils git python python-pip
- echo "-- Copying source directory"
- mkdir -p "$WORKDIR"
- export SRCDIR="$WORKDIR/src"
- cp -r "$PWD" "$SRCDIR"
- cd "$SRCDIR"
- mkdir -p "$RPM_ROOT"
- echo "--- Parsing metadata"
- git config --global --add safe.directory $PWD
- git pull --rebase origin master --tags
- export VERSION=$(python3 setup.py --version)
- export RELNUM="$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
- export SPECFILE="$WORKDIR/$PKG_NAME.spec"
- export BUILD_DIR="$WORKDIR/build"
- export TMP_RPM_ROOT="$WORKDIR/repo"
- export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/master.tar.gz"
- echo "--- Creating git package spec"
- |
cat <<EOF > $SPECFILE
Summary: Universal command executor and automation hub.
Name: $PKG_NAME-git
Version: $VERSION
Release: $RELNUM
URL: https://platypush.tech
Group: System
License: MIT
Packager: Fabio Manganiello <fabio@platypush.tech>
Source: $SRC_URL
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
Conflicts: $PKG_NAME
Prefix: %{_prefix}
BuildRoot: %{_tmppath}/%{name}-root
%description
Universal command executor and automation hub.
%install
mkdir -p %{buildroot}/
cp -r "$BUILD_DIR"/* %{buildroot}/
%clean
%files
/usr/bin/*
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
%changelog
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
- [Automatic] Release $VERSION-$RELNUM
EOF
- echo "--- Building git package"
- mkdir -p "$BUILD_DIR"
- pip install --prefix="$BUILD_DIR/usr" --no-cache --no-deps .
- rpmbuild --target "noarch" -bb "$SPECFILE"
- echo "--- Copying the new RPM package"
- mkdir -p "$TMP_RPM_ROOT"
- cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-git-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
- echo "--- Checking the latest released stable version"
- export LATEST_STABLE_PKG=$(ls -rt "$RPM_ROOT/$PKG_NAME"*.rpm 2>/dev/null | grep -v "$PKG_NAME-git" | tail -1)
- |
if [ -z "$LATEST_STABLE_PKG" ]; then
# If not stable release is available, then create one
export UPDATE_STABLE_PKG=1
else
# Otherwise, create a new release if the reported version on the repo is different
# from the latest released version.
export LATEST_STABLE_VERSION=$(basename $LATEST_STABLE_PKG | cut -d- -f 2)
if [ "$VERSION" != "$LATEST_STABLE_VERSION" ]; then
export UPDATE_STABLE_PKG=1
else
# If the version has remained the same, then simply copy the existing RPM to the
# new repository directory.
echo "Copying the existing release $LATEST_STABLE_VERSION to the new repository"
cp "$LATEST_STABLE_PKG" "$TMP_RPM_ROOT"
fi
fi
# If a new stable release is required, build another RPM
- |
if [ -n "$UPDATE_STABLE_PKG" ]; then
export RELNUM=1
export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
cat <<EOF > $SPECFILE
Summary: Universal command executor and automation hub.
Name: $PKG_NAME
Version: $VERSION
Release: $RELNUM
URL: https://platypush.tech
Group: System
License: MIT
Packager: Fabio Manganiello <fabio@platypush.tech>
Source: $SRC_URL
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
Conflicts: $PKG_NAME-git
Prefix: %{_prefix}
BuildRoot: %{_tmppath}/%{name}-root
%description
Universal command executor and automation hub.
%install
mkdir -p %{buildroot}/
cp -r "$BUILD_DIR"/* %{buildroot}/
%clean
%files
/usr/bin/*
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
%changelog
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
- [Automatic] Release $VERSION-$RELNUM
EOF
echo "--- Building package for stable release $VERSION"
rpmbuild --target "noarch" -bb "$SPECFILE"
cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
fi
- echo "--- Importing the repository keys"
- |
cat <<EOF | gpg --import --armor
$PGP_PRIVKEY
EOF
- export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
- |
cat <<EOF > $HOME/.rpmmacros
%signature gpg
%_gpg_name $PGP_KEYID
EOF
- echo "--- Signing the new RPM packages"
- rpm --addsign "$TMP_RPM_ROOT"/*.rpm
- echo "--- Creating a new copy of the RPM repository"
- createrepo "$TMP_RPM_ROOT"
- gpg --detach-sign --armor "$TMP_RPM_ROOT/repodata/repomd.xml"
- |
cat <<EOF > "$TMP_RPM_ROOT/platypush.repo"
[platypush]
name=Platypush repository
baseurl=https://rpm.platypush.tech
enabled=1
type=rpm
gpgcheck=1
gpgkey=https://rpm.platypush.tech/pubkey.txt
EOF
- |
cat <<EOF > "$TMP_RPM_ROOT/index.txt"
Welcome to the Platypush RPM repository!
Project homepage: https://platypush.tech
Source code: https://git.platypush.tech/platypush/platypush
Documentation / API reference: https://docs.platypush.tech
You can use this RPM repository to install Platypush on Fedora or other
RPM-based distros - as long as they are compatible with the latest Fedora
release.
Steps:
1. Add the repository to your sources
=====================================
$ sudo yum config-manager --add-repo https://rpm.platypush.tech/platypush.repo
2. Install Platypush
====================
$ sudo yum install platypush
Or, if you want to install a version always up-to-date with the git repo:
$ sudo yum install platypush-git
EOF
- |
cat <<EOF > "$TMP_RPM_ROOT/pubkey.txt"
$PGP_PUBKEY
EOF
- echo "--- Updating the repository"
- export NEW_RPM_ROOT="$REPOS_ROOT/rpm_new"
- export OLD_RPM_ROOT="$REPOS_ROOT/rpm_old"
- cp -r "$TMP_RPM_ROOT" "$NEW_RPM_ROOT"
- rm -rf "$TMP_RPM_ROOT"
- mv "$RPM_ROOT" "$OLD_RPM_ROOT"
- mv "$NEW_RPM_ROOT" "$RPM_ROOT"
- rm -rf "$OLD_RPM_ROOT"
- . .drone/update-rpm-repo.sh
###
### Updates the pip package upon new releases
@ -1005,9 +305,7 @@ steps:
- docs
commands:
- apk add --update --no-cache py3-twine
- python setup.py sdist bdist_wheel
- twine upload dist/platypush-$(python setup.py --version).tar.gz
- . .drone/update-pip-package.sh
###
### Checkpoint step that waits for all the package update

43
.drone/build-ui.sh Executable file
View File

@ -0,0 +1,43 @@
#!/bin/sh
export SKIPCI="$PWD/.skipci"
rm -rf "$SKIPCI"
. .drone/macros/configure-git.sh
cd platypush/backend/http/webapp
if [ $(git log --pretty=oneline $DRONE_COMMIT_AFTER...$DRONE_COMMIT_BEFORE . | wc -l) -eq 0 ]; then
echo "No UI changes detected, skipping build"
exit 0
fi
if [ "$(git log --pretty=format:%s HEAD...HEAD~1 | head -1)" == "[Automatic] Updated UI files" ]; then
echo "UI changes have already been committed, skipping build"
exit 0
fi
rm -rf dist node_modules
npm install
npm run build
if [ $(git status --porcelain dist | wc -l) -eq 0 ]; then
echo "No build files have been changed"
exit 0
fi
# Create a .skipci file to mark the fact that the next steps should be skipped
# (we're going to do another push anyway, so another pipeline will be triggered)
touch "$SKIPCI"
. .drone/macros/configure-ssh.sh
. .drone/macros/configure-gpg.sh
git add dist
git commit dist -S -m "[Automatic] Updated UI files" --no-verify
git remote rm origin
git remote add origin git@git.platypush.tech:platypush/platypush.git
git push -f origin master
# Restore the original git configuration
mv "$TMP_GIT_CONF" "$GIT_CONF"

13
.drone/github-mirror.sh Executable file
View File

@ -0,0 +1,13 @@
#!/bin/sh
. .drone/macros/configure-git.sh
. .drone/macros/configure-ssh.sh
ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null
# Clone the repository
git remote add github git@github.com:/BlackLight/platypush.git
git pull --rebase github "$(git branch | head -1 | awk '{print $2}')" || echo "No such branch on Github"
# Push the changes to the GitHub mirror
git push --all -v github

29
.drone/macros/configure-git.sh Executable file
View File

@ -0,0 +1,29 @@
#!/bin/sh
# Install git
if [ -z "$(which git)" ]; then
if [ -n "$(which apt-get)" ]; then
apt-get update
apt-get install -y git
elif [ -n "$(which apk)" ]; then
apk add --update --no-cache git
elif [ -n "$(which yum)" ]; then
yum install -y git
elif [ -n "$(which dnf)" ]; then
dnf install -y git
elif [ -n "$(which pacman)" ]; then
pacman -Sy --noconfirm git
else
echo "Could not find a package manager to install git"
exit 1
fi
fi
# Backup the original git configuration before changing attributes
export GIT_CONF="$PWD/.git/config"
export TMP_GIT_CONF=/tmp/git.config.orig
cp "$GIT_CONF" "$TMP_GIT_CONF"
git config --global --add safe.directory "$PWD"
git config user.name "Platypush CI/CD Automation"
git config user.email "admin@platypush.tech"

30
.drone/macros/configure-gpg.sh Executable file
View File

@ -0,0 +1,30 @@
#!/bin/sh
[ -z "$PGP_KEY" ] && echo "PGP_KEY is not set" && exit 1
[ -z "$PGP_KEY_ID" ] && echo "PGP_KEY_ID is not set" && exit 1
# Install gpg
if [ -z "$(which gpg)" ]; then
if [ -n "$(which apt-get)" ]; then
apt-get update
apt-get install -y gnupg
elif [ -n "$(which apk)" ]; then
apk add --update --no-cache bash gnupg
elif [ -n "$(which yum)" ]; then
yum install -y gnupg
elif [ -n "$(which dnf)" ]; then
dnf install -y gnupg
elif [ -n "$(which pacman)" ]; then
pacman -Sy --noconfirm gnupg
else
echo "Could not find a package manager to install gnupg"
exit 1
fi
fi
cat <<EOF | gpg --import --armor
$PGP_KEY
EOF
git config commit.gpgsign true
git config user.signingkey "$PGP_KEY_ID"

35
.drone/macros/configure-ssh.sh Executable file
View File

@ -0,0 +1,35 @@
#!/bin/sh
if [ -z "$SSH_PUBKEY" ] || [ -z "$SSH_PRIVKEY" ]; then
echo "SSH_PUBKEY and SSH_PRIVKEY environment variables must be set"
exit 1
fi
# Install ssh
if [ -z "$(which ssh)" ]; then
if [ -n "$(which apt-get)" ]; then
apt-get update
apt-get install -y openssh
elif [ -n "$(which apk)" ]; then
apk add --update --no-cache openssh
elif [ -n "$(which yum)" ]; then
yum install -y openssh
elif [ -n "$(which dnf)" ]; then
dnf install -y openssh
elif [ -n "$(which pacman)" ]; then
pacman -Sy --noconfirm openssh
else
echo "Could not find a package manager to install openssh"
exit 1
fi
fi
mkdir -p ~/.ssh
echo $SSH_PUBKEY > ~/.ssh/id_rsa.pub
cat <<EOF > ~/.ssh/id_rsa
$SSH_PRIVKEY
EOF
chmod 0600 ~/.ssh/id_rsa
ssh-keyscan git.platypush.tech >> ~/.ssh/known_hosts 2>/dev/null

28
.drone/rebuild-docs.sh Executable file
View File

@ -0,0 +1,28 @@
#!/bin/sh
echo "Installing required build dependencies"
apk add --update --no-cache git make py3-sphinx py3-myst-parser py3-pip $(cat platypush/install/requirements/alpine.txt)
pip install -U sphinx-rtd-theme sphinx-book-theme --break-system-packages
pip install . --break-system-packages
mkdir -p /docs/current
export APPDIR="$PWD"
rm -rf "$APPDIR/docs/build"
echo "Building the updated documentation"
cd "$APPDIR/docs/source"
git clone 'https://git.platypush.tech/platypush/platypush.wiki.git' wiki
echo "Linking the wiki to the Sphinx index"
cd wiki
ln -s Home.md index.md
cd "$APPDIR/docs"
make html
rm -f config*.yaml
cd "$APPDIR"
echo "Copying the new documentation files to the target folder"
mv -v "$APPDIR/docs/build" /docs/new
cd /docs
mv current old
mv new current
rm -rf old

6
.drone/run-tests.sh Executable file
View File

@ -0,0 +1,6 @@
#!/bin/sh
apk add --update --no-cache $(cat platypush/install/requirements/alpine.txt)
pip install . --break-system-packages
pip install -r requirements-tests.txt --break-system-packages
pytest tests

18
.drone/sync-stable-branch.sh Executable file
View File

@ -0,0 +1,18 @@
#!/bin/sh
. .drone/macros/configure-git.sh
. .drone/macros/configure-ssh.sh
. .drone/macros/configure-gpg.sh
# Git configuration
git remote rm origin
git remote add origin git@git.platypush.tech:platypush/platypush.git
# Merge and push to the `stable` branch
git checkout stable
git rebase master
git push -u origin stable
git checkout master
# Restore the original git configuration
mv "$TMP_GIT_CONF" "$GIT_CONF"

166
.drone/update-apt-repo.sh Executable file
View File

@ -0,0 +1,166 @@
#!/bin/sh
[ -f .skipci ] && exit 0
echo "-- Installing dependencies"
apt update
apt install -y dpkg-dev gpg
echo "-- Creating a new apt root folder"
export TMP_APT_ROOT="/tmp/apt"
cp -r "$APT_ROOT" "$TMP_APT_ROOT"
echo "-- Cleaning up older apt releases"
find "$TMP_APT_ROOT/pool" -mindepth 2 -maxdepth 2 -type d | while read reldir; do
pkg_to_remove=$(( $(ls "$reldir"/*.deb | wc -l) - 1 ))
[ $pkg_to_remove -le 0 ] && continue
ls "$reldir"/*.deb | sort -V | head -n$pkg_to_remove | xargs rm -f
done
echo "-- Updating Packages files"
echo "stable\noldstable" | while read distro; do
echo "main\ndev" | while read branch; do
branch_dir="$TMP_APT_ROOT/pool/$distro/$branch"
echo "Checking pool folder: $branch_dir"
[ -d "$branch_dir" ] || mkdir -p "$branch_dir"
dist_dir="$TMP_APT_ROOT/dists/$distro/$branch/all"
mkdir -p "$dist_dir"
pkg_file="$dist_dir/Packages"
dpkg-scanpackages --arch all "$branch_dir" > "$pkg_file"
sed -i "$pkg_file" -re "s|^Filename: $TMP_APT_ROOT/|Filename: |"
cat "$pkg_file" | gzip -9 > "$pkg_file.gz"
echo "Generated Packages file: $pkg_file"
cat "$pkg_file"
done
done
echo "-- Updating Release files"
add_hashes() {
dist_dir=$1
hash_cmd=$2
hash_label=$3
echo "$hash_label:"
find "$dist_dir" -name 'Packages*' | while read file; do
basename="$(echo "$file" | sed -r -e "s|^$dist_dir/||")"
hash="$($hash_cmd "$file" | cut -d" " -f1)"
size="$(wc -c < $file)"
echo " $hash $size $basename"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-i386/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-amd64/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armel/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-armhf/|')"
echo " $hash $size $(echo $basename | sed -re 's|/all/|/binary-arm64/|')"
done
}
echo "stable\noldstable" | while read distro; do
dist_dir="$TMP_APT_ROOT/dists/$distro"
components=$(find "$dist_dir" -name Packages | awk -F '/' '{print $(NF-2)}' | uniq | tr '\n' ' ')
release_file="$dist_dir/Release"
cat <<EOF > "$release_file"
Origin: Platypush repository
Label: Platypush
Suite: $distro
Codename: $distro
Architectures: i386 amd64 armel armhf arm64
Components: $components
Description: The official APT repository for Platypush
Date: $(date -Ru)
EOF
add_hashes "$dist_dir" "md5sum" "MD5Sum" >> "$release_file"
add_hashes "$dist_dir" "sha1sum" "SHA1" >> "$release_file"
add_hashes "$dist_dir" "sha256sum" "SHA256" >> "$release_file"
done
echo "-- Generating list files"
mkdir -p "$TMP_APT_ROOT/lists"
for distro in stable oldstable; do
for branch in main dev; do
echo "deb https://apt.platypush.tech/ $distro $branch" > "$TMP_APT_ROOT/lists/platypush-$distro-$branch.list"
done
done
echo "-- Updating index file"
cat <<EOF > "$TMP_APT_ROOT/index.txt"
Welcome to the Platypush APT repository!
Project homepage: https://platypush.tech
Source code: https://git.platypush.tech/platypush/platypush
Documentation / API reference: https://docs.platypush.tech
You can use this APT repository to install Platypush on Debian, Ubuntu or any
Debian-based distro.
Steps:
1. Add this repository's PGP key to your apt keyring
====================================================
$ sudo wget -q -O \\\
/etc/apt/trusted.gpg.d/platypush.asc \\\
https://apt.platypush.tech/pubkey.txt
2. Add the repository to your sources
=====================================
$ sudo wget -q -O \\\
/etc/apt/sources.list.d/platypush.list \\\
https://apt.platypush.tech/lists/platypush-<deb_version>-<branch>.list
Where:
- deb_version can be either *stable* (for the current Debian stable version) or
*oldstable* (for the previous Debian stable version)
- branch can be either *main* (for the latest releases) or *dev* (for a package
that is always in sync with the git version)
For example, to install the latest stable tags on Debian stable:
$ sudo wget -q -O \\\
/etc/apt/sources.list.d/platypush.list \\\
https://apt.platypush.tech/lists/platypush-stable-main.list
3. Update your repos
====================
$ sudo apt update
4. Install Platypush
====================
$ sudo apt install platypush
EOF
echo "-- Importing and refreshing PGP key"
echo "$PGP_PUBKEY" > "$TMP_APT_ROOT/pubkey.txt"
export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
cat <<EOF | gpg --import --armor
$PGP_PRIVKEY
EOF
echo "-- Signing Release files"
find "$TMP_APT_ROOT/dists" -type f -name Release | while read file; do
dirname="$(dirname "$file")"
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs > "$file.gpg"
cat "$file" | gpg -q --default-key "$PGP_KEYID" -abs --clearsign > "$dirname/InRelease"
done
echo "-- Updating the apt repo root"
export OLD_APT_ROOT="$REPOS_ROOT/oldapt"
rm -rf "$OLD_APT_ROOT"
mv "$APT_ROOT" "$OLD_APT_ROOT"
mv "$TMP_APT_ROOT" "$APT_ROOT"
chmod -R a+r "$APT_ROOT"
chmod a+x "$APT_ROOT"

67
.drone/update-arch-packages.sh Executable file
View File

@ -0,0 +1,67 @@
#!/bin/sh
[ -f .skipci ] && exit 0
apk add --update --no-cache curl pacman sudo
. .drone/macros/configure-ssh.sh
. .drone/macros/configure-git.sh
git pull --rebase origin master --tags
export VERSION=$(python setup.py --version)
export HEAD=$(git log --pretty=format:%h HEAD...HEAD~1 | head -1)
export GIT_VERSION="$VERSION.r$(git log --pretty=oneline HEAD...v$VERSION | wc -l).g${HEAD}"
export TAG_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
ssh-keyscan aur.archlinux.org >> ~/.ssh/known_hosts 2>/dev/null
adduser -u 1000 -D build
mkdir -p "$WORKDIR"
echo "--- Updating Arch git version"
export PKGDIR=$WORKDIR/git
git clone ssh://aur@aur.archlinux.org/platypush-git.git "$PKGDIR"
git config --global --add safe.directory "$PKGDIR"
chown -R build "$PKGDIR"
cd "$PKGDIR"
sed -i 'PKGBUILD' -r \
-e "s/^pkgver=.*/pkgver=$GIT_VERSION/" \
-e "s/^pkgrel=.*/pkgrel=1/" \
sudo -u build makepkg --printsrcinfo > .SRCINFO
export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
if [ $FILES_CHANGED -gt 0 ]; then
echo "--- Pushing git package version $GIT_VERSION"
git commit -a -m '[Automatic] Package update'
git push origin master
fi
echo "--- Updating Arch stable version"
export PKGDIR="$WORKDIR/stable"
git clone ssh://aur@aur.archlinux.org/platypush.git "$PKGDIR"
git config --global --add safe.directory "$PKGDIR"
chown -R build "$PKGDIR"
cd "$PKGDIR"
export RELEASED_VERSION=$(grep -e '^pkgver=' PKGBUILD | sed -r -e 's/^pkgver=(.*)\s*/\1/')
if [ "$RELEASED_VERSION" == "$VERSION" ]; then
exit 0
fi
export TAG_CHECKSUM=$(curl --silent "$TAG_URL" | sha512sum | awk '{print $1}')
sed -i 'PKGBUILD' -r \
-e "s/^pkgver=.*/pkgver=$VERSION/" \
-e "s/^pkgrel=.*/pkgrel=1/" \
-e "s/^sha512sums=.*/sha512sums=('$TAG_CHECKSUM')/"
sudo -u build makepkg --printsrcinfo > .SRCINFO
export FILES_CHANGED=$(git status --porcelain --untracked-files=no | wc -l)
if [ $FILES_CHANGED -gt 0 ]; then
echo "--- Pushing stable package version $VERSION"
git commit -a -m '[Automatic] Package update'
git push origin master
fi

View File

@ -0,0 +1,46 @@
#!/bin/sh
export SKIPCI="$PWD/.skipci"
export CACHEFILE="$PWD/platypush/components.json.gz"
[ -f "$SKIPCI" ] && exit 0
# Backup the original git configuration before changing attributes
export GIT_CONF="$PWD/.git/config"
export TMP_GIT_CONF="/tmp/git.config.orig"
cp "$GIT_CONF" "$TMP_GIT_CONF"
. .drone/macros/configure-git.sh
# Only regenerate the components cache if either the plugins, backends,
# events or schemas folders have some changes (excluding the webapp files).
if [ -z "$(git log --pretty=oneline $DRONE_COMMIT_AFTER...$DRONE_COMMIT_BEFORE -- platypush/backend platypush/plugins platypush/schemas platypush/message/event ':(exclude)platypush/backend/http/webapp')" ]; then
echo 'No changes to the components file'
exit 0
fi
. .drone/macros/configure-ssh.sh
. .drone/macros/configure-gpg.sh
echo 'Updating components cache'
apk add --update --no-cache $(cat platypush/install/requirements/alpine.txt)
pip install . --break-system-packages
python - <<EOF
from platypush import get_plugin
get_plugin('inspect').refresh_cache(force=True)
EOF
# Create a .skipci file to mark the fact that the next steps should be skipped
# (we're going to do another push anyway, so another pipeline will be triggered)
touch "$SKIPCI"
git add "$CACHEFILE"
git commit "$CACHEFILE" -S -m "[Automatic] Updated components cache" --no-verify
git remote rm origin
git remote add origin git@git.platypush.tech:platypush/platypush.git
git push -f origin master
# Restore the original git configuration
mv "$TMP_GIT_CONF" "$GIT_CONF"

102
.drone/update-deb-packages.sh Executable file
View File

@ -0,0 +1,102 @@
#!/bin/sh
[ -f .skipci ] && exit 0
echo "-- Copying source directory"
mkdir -p "$WORKDIR/src"
export SRCDIR="$WORKDIR/src/$DEB_VERSION"
cp -r "$PWD" "$SRCDIR"
cd "$SRCDIR"
echo "-- Installing dependencies"
apt update
apt install -y curl dpkg-dev gpg git python3 python3-pip python3-setuptools
echo "--- Parsing metadata"
git config --global --add safe.directory "$PWD"
git pull --rebase origin master --tags
export VERSION=$(python3 setup.py --version)
export GIT_VERSION="$VERSION-$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
export GIT_BUILD_DIR="$WORKDIR/${PKG_NAME}_${GIT_VERSION}_all"
export GIT_DEB="$WORKDIR/${PKG_NAME}_${GIT_VERSION}_all.deb"
export POOL_PATH="$APT_ROOT/pool/$DEB_VERSION/dev"
echo "--- Building git package"
pip install --prefix="$GIT_BUILD_DIR/usr" --no-cache --no-deps .
find "$GIT_BUILD_DIR" -name "site-packages" | while read dir; do
base="$(dirname "$dir")"
mv "$dir" "$base/dist-packages"
done
install -m755 -d "${GIT_BUILD_DIR}/usr/lib/systemd/system"
install -m755 -d "${GIT_BUILD_DIR}/usr/lib/systemd/user"
install -m750 -d "${GIT_BUILD_DIR}/var/lib/platypush"
install -m750 -d "${GIT_BUILD_DIR}/etc/platypush/scripts"
install -m644 "${SRCDIR}/platypush/config/config.yaml" "${GIT_BUILD_DIR}/etc/platypush/config.yaml"
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${GIT_BUILD_DIR}/usr/lib/systemd/user/platypush.service"
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${GIT_BUILD_DIR}/usr/lib/systemd/system/platypush.service"
sed -i "${GIT_BUILD_DIR}/usr/lib/systemd/system/platypush.service" -r \
-e 's/^#\s*Requires=(.*)/Requires=\1/' \
-e 's/^\[Service\]$/\[Service\]\
User=platypush\
Group=platypush\
WorkingDirectory=\/var\/lib\/platypush\
Environment="PLATYPUSH_CONFIG=\/etc\/platypush\/config.yaml"\
Environment="PLATYPUSH_WORKDIR=\/var\/lib\/platypush"/'
mkdir -p "$GIT_BUILD_DIR/DEBIAN"
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/control"
Package: $PKG_NAME
Version: $GIT_VERSION
Maintainer: Fabio Manganiello <fabio@platypush.tech>
Depends: $(cat platypush/install/requirements/debian.txt | tr '\n' ',' | sed -re 's/,$//' -e 's/,/, /g')
Architecture: all
Homepage: https://platypush.tech
Description: Universal command executor and automation hub.
EOF
cat <<EOF > "$GIT_BUILD_DIR/DEBIAN/postinst" && chmod +x "$GIT_BUILD_DIR/DEBIAN/postinst"
#!/bin/sh
set -e
if [ "\$1" = "configure" ]; then
grep -e '^platypush:' /etc/passwd 2>/dev/null || useradd -U -r -s /bin/false -d /var/lib/platypush platypush
mkdir -p /var/lib/platypush
chown -R platypush:platypush /var/lib/platypush
chown -R platypush:platypush /etc/platypush
if which systemctl; then systemctl daemon-reload; fi
fi
EOF
mkdir -p "$POOL_PATH"
rm -f "$POOL_PATH/"*.deb
dpkg --build "$GIT_BUILD_DIR"
echo "--- Copying $GIT_DEB to $POOL_PATH"
cp "$GIT_DEB" "$POOL_PATH"
# If main/all/Packages doesn't exist, then we should create the first main release
[ $(ls "$APT_ROOT/pool/$DEB_VERSION/main/${PKG_NAME}_${VERSION}-"*"_all.deb" 2>/dev/null | wc -l) -eq 0 ] && export UPDATE_STABLE_PKG=1
export PKGURL="https://apt.platypush.tech/dists/$DEB_VERSION/main/all/Packages"
[ -z "$UPDATE_STABLE_PKG" ] &&
curl -ILs -o /dev/null -w "%{http_code}" "$PKGURL" |
grep -e '^4' >/dev/null && export UPDATE_STABLE_PKG=1
# If the published release version differs from the current one, then we should publish a new main release
if [ -z "$UPDATE_STABLE_PKG" ]; then
RELEASED_VERSION=$(curl -s "$PKGURL" | grep -e '^Version: ' | head -1 | awk '{print $2}' | cut -d- -f 1)
[ "$RELEASED_VERSION" != "$VERSION" ] && export UPDATE_STABLE_PKG=1
fi
# Proceed and update the main release if the version number has changed
if [ -n "$UPDATE_STABLE_PKG" ]; then
echo "--- Updating main package"
mkdir -p "$APT_ROOT/pool/$DEB_VERSION/main"
cp "$GIT_DEB" "$APT_ROOT/pool/$DEB_VERSION/main/${PKG_NAME}_${VERSION}-1_all.deb"
fi

5
.drone/update-pip-package.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
apk add --update --no-cache py3-twine
python setup.py sdist bdist_wheel
twine upload dist/platypush-$(python setup.py --version).tar.gz

261
.drone/update-rpm-repo.sh Executable file
View File

@ -0,0 +1,261 @@
#!/bin/sh
[ -f .skipci ] && exit 0
echo "-- Installing dependencies"
yum install -y \
createrepo \
git \
gpg \
python \
python-pip \
python-setuptools \
rpm-build \
rpm-sign \
systemd-rpm-macros \
wget \
yum-utils \
echo "-- Copying source directory"
mkdir -p "$WORKDIR"
export SRCDIR="$WORKDIR/src"
cp -r "$PWD" "$SRCDIR"
cd "$SRCDIR"
mkdir -p "$RPM_ROOT"
echo "--- Parsing metadata"
git config --global --add safe.directory $PWD
git pull --rebase origin master --tags
export VERSION=$(python3 setup.py --version)
export RELNUM="$(git log --pretty=oneline HEAD...v$VERSION | wc -l)"
export SPECFILE="$WORKDIR/$PKG_NAME.spec"
export BUILD_DIR="$WORKDIR/build"
export TMP_RPM_ROOT="$WORKDIR/repo"
export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/master.tar.gz"
echo "--- Creating git package spec"
cat <<EOF > $SPECFILE
Summary: Universal command executor and automation hub.
Name: $PKG_NAME-git
Version: $VERSION
Release: $RELNUM
URL: https://platypush.tech
Group: System
License: MIT
Packager: Fabio Manganiello <fabio@platypush.tech>
Source: $SRC_URL
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
Conflicts: $PKG_NAME
Prefix: %{_prefix}
BuildRoot: %{_tmppath}/%{name}-root
BuildRequires: systemd-rpm-macros
%{?sysusers_requires_compat}
%description
Universal command executor and automation hub.
%install
mkdir -p %{buildroot}/
cp -r "$BUILD_DIR"/* %{buildroot}/
install -p -Dm0644 "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf" %{buildroot}%{_sysusersdir}/platypush.conf
%pre
%sysusers_create_compat "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf"
%clean
%files
%defattr(750,platypush,platypush,750)
%dir /etc/platypush
/etc/platypush/*
/usr/bin/*
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
/usr/lib/systemd/system/*
/usr/lib/systemd/user/*
%defattr(750,platypush,platypush,750)
%dir /var/lib/platypush
%{_sysusersdir}/platypush.conf
%changelog
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
- [Automatic] Release $VERSION-$RELNUM
EOF
echo "--- Building git package"
mkdir -p "$BUILD_DIR"
pip install --prefix="$BUILD_DIR/usr" --no-cache --no-deps .
install -m755 -d "${BUILD_DIR}/usr/lib/systemd/system"
install -m755 -d "${BUILD_DIR}/usr/lib/systemd/user"
install -m755 -d "${BUILD_DIR}/usr/lib/sysusers.d"
install -m750 -d "${BUILD_DIR}/var/lib/platypush"
install -m750 -d "${BUILD_DIR}/etc/platypush/scripts"
install -m644 "${SRCDIR}/platypush/config/config.yaml" "${BUILD_DIR}/etc/platypush/config.yaml"
install -Dm644 "${SRCDIR}/platypush/config/systemd/platypush-sysusers.conf" "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf"
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${BUILD_DIR}/usr/lib/systemd/user/platypush.service"
install -m644 "${SRCDIR}/platypush/config/systemd/platypush.service" "${BUILD_DIR}/usr/lib/systemd/system/platypush.service"
sed -i "${BUILD_DIR}/usr/lib/systemd/system/platypush.service" -r \
-e 's/^#\s*Requires=(.*)/Requires=\1/' \
-e 's/^\[Service\]$/\[Service\]\
User=platypush\
Group=platypush\
WorkingDirectory=\/var\/lib\/platypush\
Environment="PLATYPUSH_CONFIG=\/etc\/platypush\/config.yaml"\
Environment="PLATYPUSH_WORKDIR=\/var\/lib\/platypush"/'
rpmbuild --target "noarch" -bb "$SPECFILE"
echo "--- Copying the new RPM package"
mkdir -p "$TMP_RPM_ROOT"
cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-git-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
echo "--- Checking the latest released stable version"
export LATEST_STABLE_PKG=$(ls -rt "$RPM_ROOT/$PKG_NAME"*.rpm 2>/dev/null | grep -v "$PKG_NAME-git" | tail -1)
if [ -z "$LATEST_STABLE_PKG" ]; then
# If not stable release is available, then create one
export UPDATE_STABLE_PKG=1
else
# Otherwise, create a new release if the reported version on the repo is different
# from the latest released version.
export LATEST_STABLE_VERSION=$(basename $LATEST_STABLE_PKG | cut -d- -f 2)
if [ "$VERSION" != "$LATEST_STABLE_VERSION" ]; then
export UPDATE_STABLE_PKG=1
else
# If the version has remained the same, then simply copy the existing RPM to the
# new repository directory.
echo "Copying the existing release $LATEST_STABLE_VERSION to the new repository"
cp "$LATEST_STABLE_PKG" "$TMP_RPM_ROOT"
fi
fi
# If a new stable release is required, build another RPM
if [ -n "$UPDATE_STABLE_PKG" ]; then
export RELNUM=1
export SRC_URL="https://git.platypush.tech/platypush/platypush/archive/v$VERSION.tar.gz"
cat <<EOF > $SPECFILE
Summary: Universal command executor and automation hub.
Name: $PKG_NAME
Version: $VERSION
Release: $RELNUM
URL: https://platypush.tech
Group: System
License: MIT
Packager: Fabio Manganiello <fabio@platypush.tech>
Source: $SRC_URL
Requires: $(cat platypush/install/requirements/fedora.txt | tr '\n' ' ')
Conflicts: $PKG_NAME-git
Prefix: %{_prefix}
BuildRoot: %{_tmppath}/%{name}-root
BuildRequires: systemd-rpm-macros
%{?sysusers_requires_compat}
%description
Universal command executor and automation hub.
%install
mkdir -p %{buildroot}/
cp -r "$BUILD_DIR"/* %{buildroot}/
install -p -Dm0644 "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf" %{buildroot}%{_sysusersdir}/platypush.conf
%pre
%sysusers_create_compat "${BUILD_DIR}/usr/lib/sysusers.d/platypush.conf"
%clean
%files
%defattr(750,platypush,platypush,750)
%dir /etc/platypush
/etc/platypush/*
/usr/bin/*
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush
/usr/lib/python$(python3 --version | awk '{print $2}' | cut -d. -f 1,2)/site-packages/platypush-$VERSION.dist-info
/usr/lib/systemd/system/*
/usr/lib/systemd/user/*
%defattr(750,platypush,platypush,750)
%dir /var/lib/platypush
%{_sysusersdir}/platypush.conf
%changelog
* $(date +'%a %b %d %Y') admin <admin@platypush.tech>
- [Automatic] Release $VERSION-$RELNUM
EOF
echo "--- Building package for stable release $VERSION"
rpmbuild --target "noarch" -bb "$SPECFILE"
cp "$HOME/rpmbuild/RPMS/noarch/$PKG_NAME-$VERSION-$RELNUM.noarch.rpm" "$TMP_RPM_ROOT"
fi
echo "--- Importing the repository keys"
cat <<EOF | gpg --import --armor
$PGP_PRIVKEY
EOF
export PGP_KEYID=$(echo "$PGP_PUBKEY" | gpg --with-colons --import-options show-only --import --fingerprint | grep -e '^fpr:' | head -1 | awk -F ':' '{print $(NF - 1)}')
cat <<EOF > $HOME/.rpmmacros
%signature gpg
%_gpg_name $PGP_KEYID
EOF
echo "--- Signing the new RPM packages"
rpm --addsign "$TMP_RPM_ROOT"/*.rpm
echo "--- Creating a new copy of the RPM repository"
createrepo "$TMP_RPM_ROOT"
gpg --detach-sign --armor "$TMP_RPM_ROOT/repodata/repomd.xml"
cat <<EOF > "$TMP_RPM_ROOT/platypush.repo"
[platypush]
name=Platypush repository
baseurl=https://rpm.platypush.tech
enabled=1
type=rpm
gpgcheck=1
gpgkey=https://rpm.platypush.tech/pubkey.txt
EOF
cat <<EOF > "$TMP_RPM_ROOT/index.txt"
Welcome to the Platypush RPM repository!
Project homepage: https://platypush.tech
Source code: https://git.platypush.tech/platypush/platypush
Documentation / API reference: https://docs.platypush.tech
You can use this RPM repository to install Platypush on Fedora or other
RPM-based distros - as long as they are compatible with the latest Fedora
release.
Steps:
1. Add the repository to your sources
=====================================
$ sudo yum config-manager --add-repo https://rpm.platypush.tech/platypush.repo
2. Install Platypush
====================
$ sudo yum install platypush
Or, if you want to install a version always up-to-date with the git repo:
$ sudo yum install platypush-git
EOF
cat <<EOF > "$TMP_RPM_ROOT/pubkey.txt"
$PGP_PUBKEY
EOF
echo "--- Updating the repository"
export NEW_RPM_ROOT="$REPOS_ROOT/rpm_new"
export OLD_RPM_ROOT="$REPOS_ROOT/rpm_old"
cp -r "$TMP_RPM_ROOT" "$NEW_RPM_ROOT"
rm -rf "$TMP_RPM_ROOT"
mv "$RPM_ROOT" "$OLD_RPM_ROOT"
mv "$NEW_RPM_ROOT" "$RPM_ROOT"
rm -rf "$OLD_RPM_ROOT"

1
.gitignore vendored
View File

@ -27,3 +27,4 @@ Session.vim
/Dockerfile
/docs/source/wiki
/.skipci
dump.rdb

View File

@ -27,13 +27,9 @@ Guidelines:
you are changing some of the core entities (e.g. requests, events, procedures, hooks, crons
or the bus) then make sure to add tests and not to break the existing tests.
- If the feature requires an optional dependency then make sure to document it:
- In the class docstring (see other plugins and backends for examples).
- In [`setup.py`](https://git.platypush.tech/platypush/platypush/-/blob/master/setup.py#L72) as
an `extras_require` entry.
- In the plugin/backend class pydoc string.
- In the `manifest.yaml` - refer to the Wiki (how to write
[plugins](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-plugins)
and [backends](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-backends))
for examples on how to write an extension manifest file.
- If the feature requires an optional dependency then make sure to document it
in the `manifest.json` - refer to the Wiki (how to write
[plugins](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-plugins)
and
[backends](https://git.platypush.tech/platypush/platypush/wiki/Writing-your-own-backends))
for examples on how to write an extension manifest file.

View File

@ -2,4 +2,6 @@ recursive-include platypush/backend/http/webapp/dist *
recursive-include platypush/install *
include platypush/plugins/http/webpage/mercury-parser.js
include platypush/config/*.yaml
global-include manifest.yaml
include platypush/config/systemd/*
global-include manifest.json
global-include components.json.gz

View File

@ -22,7 +22,7 @@ Platypush
* [Install from sources](#install-from-sources)
* [Installing the dependencies for your extensions](#installing-the-dependencies-for-your-extensions)
+ [Install via `extras` name](#install-via-extras-name)
+ [Install via `manifest.yaml`](#install-via-manifestyaml)
+ [Install via `manifest.json`](#install-via-manifestjson)
+ [Check the instructions reported in the documentation](#check-the-instructions-reported-in-the-documentation)
* [Virtual environment installation](#virtual-environment-installation)
* [Docker installation](#docker-installation-1)
@ -216,16 +216,27 @@ ways to check the dependencies required by an extension:
#### Install via `extras` name
All the extensions that require extra dependencies are listed in the
[`extras_require` section under
`setup.py`](https://git.platypush.tech/platypush/platypush/src/branch/master/setup.py#L84).
You can install extra dependencies via pip extras:
#### Install via `manifest.yaml`
```shell
pip install 'platypush[plugin1,plugin2,...]'
```
All the plugins and backends have a `manifest.yaml` file in their source folder.
For example:
```shell
pip install 'platypush[light.hue,music.mpd,rss]'
```
Will install Platypush with the dependencies for the `light.hue`, `music.mpd`
and `rss` plugins.
#### Install via `manifest.json`
All the plugins and backends have a `manifest.json` file in their source folder.
Any extra dependencies are listed there
If you followed the `extras` or `manifest.yaml` way to discover the
If you followed the `extras` or `manifest.json` way to discover the
dependencies, then you can install them in two ways:
1. `pip` installation:
@ -419,9 +430,7 @@ backend](https://docs.platypush.tech/en/latest/platypush/backend/http.html), an
[MQTT
instance](https://docs.platypush.tech/en/latest/platypush/backend/mqtt.html), a
[Kafka
instance](https://docs.platypush.tech/en/latest/platypush/backend/kafka.html),
[Pushbullet](https://docs.platypush.tech/en/latest/platypush/backend/pushbullet.html)
etc.).
instance](https://docs.platypush.tech/en/latest/platypush/backend/kafka.html).
If a backend supports the execution of requests (e.g. HTTP, MQTT, Kafka,
Websocket and TCP) then you can send requests to these services in JSON format.
@ -507,11 +516,10 @@ event.hook.SearchSongVoiceCommand:
[Example](https://git.platypush.tech/platypush/platypush/src/branch/master/examples/conf/hook.py):
```python
from platypush.event.hook import hook
from platypush.utils import run
from platypush import run, when
from platypush.message.event.assistant import SpeechRecognizedEvent
@hook(SpeechRecognizedEvent, phrase='play ${title} by ${artist}')
@when(SpeechRecognizedEvent, phrase='play ${title} by ${artist}')
def on_music_play_command(event, title=None, artist=None, **context):
results = run('music.mpd.search', filter={
'artist': artist,
@ -529,22 +537,22 @@ against partial event arguments are also possible, and relational operators are
supported as well. For example:
```python
from platypush.event.hook import hook
from platypush import when
from platypush.message.event.sensor import SensorDataChangeEvent
@hook(SensorDataChangeEvent, data=1):
@when(SensorDataChangeEvent, data=1):
def hook_1(event):
"""
Triggered when event.data == 1
"""
@hook(SensorDataChangeEvent, data={'state': 1}):
@when(SensorDataChangeEvent, data={'state': 1}):
def hook_2(event):
"""
Triggered when event.data['state'] == 1
"""
@hook(SensorDataChangeEvent, data={
@when(SensorDataChangeEvent, data={
'temperature': {'$gt': 25},
'humidity': {'$le': 15}
}):
@ -565,9 +573,7 @@ Procedures are pieces of custom logic that can be executed as atomic actions
using `procedure.<name>` as an action name.
They can be defined either in the `config.yaml` or as Python scripts stored
under `~/.config/platypush/scripts` - provided that the procedure is also
imported in `~/.config/platypush/scripts/__init__.py` so it can be discovered
by the service.
under `~/.config/platypush/scripts`.
YAML example for a procedure that can be executed when we arrive home and turns
on the lights if the luminosity is lower that a certain thresholds, says a
@ -707,8 +713,6 @@ groups together the controls for most of the plugins - e.g. sensors, switches,
music controls and search, media library and torrent management, lights,
Zigbee/Z-Wave devices and so on. The UI is responsive and mobile-friendly.
Some screenshots:
#### The main web panel
This is the default panel available at `http://<host>:<port>` after

View File

@ -159,7 +159,7 @@ class IntegrationEnricher:
base_path,
*doc.split(os.sep)[:-1],
*doc.split(os.sep)[-1].split('.'),
'manifest.yaml',
'manifest.json',
)
if not os.path.isfile(manifest_file):

View File

@ -188,9 +188,62 @@ const renderActionsList = () => {
})
}
const createFilterBar = () => {
const input = document.createElement('input')
const referenceSection = document.getElementById('reference')
input.type = 'text'
input.placeholder = 'Filter'
input.classList.add('filter-bar')
input.addEventListener('input', (event) => {
const filter = event.target.value.toLowerCase()
referenceSection.querySelectorAll('ul.grid li').forEach((li) => {
if (li.innerText.toLowerCase().includes(filter)) {
li.style.display = 'flex'
} else {
li.style.display = 'none'
}
})
})
return input
}
const addFilterBar = () => {
const container = document.querySelector('.bd-main')
if (!container)
return
const referenceSection = document.getElementById('reference')
if (!referenceSection)
return
const header = referenceSection.querySelector('h2')
if (!header)
return
const origInnerHTML = header.innerHTML
header.innerHTML = '<span class="header-content">' + origInnerHTML + '</span>'
const input = createFilterBar()
header.appendChild(input)
const headerOffsetTop = header.offsetTop
// Apply the fixed class if the header is above the viewport
document.addEventListener('scroll', () => {
if (headerOffsetTop < window.scrollY) {
header.classList.add('fixed')
} else {
header.classList.remove('fixed')
}
})
}
document.addEventListener("DOMContentLoaded", function() {
generateComponentsGrid()
convertDepsToTabs()
addClipboardToCodeBlocks()
renderActionsList()
addFilterBar()
})

View File

@ -29,15 +29,18 @@ a.grid-title {
ul.grid li {
display: flex;
background: linear-gradient(0deg, #fff, #f9f9f9);
align-items: center;
justify-content: space-between;
margin: 0 10px 10px 0;
padding: 10px;
padding: 20px;
border: 1px solid #ccc;
border-radius: 15px;
flex-direction: column;
}
ul.grid img {
width: 32px;
width: 48px;
margin-right: 5px;
}
@ -52,13 +55,19 @@ ul.grid li code .pre {
}
ul.grid li:hover {
background: linear-gradient(0deg, #e0ffe8, #e3ffff);
background: linear-gradient(0deg, #157765, #cbffd8) !important;
}
ul.grid li a {
width: calc(100% - 35px);
width: 100%;
display: flex;
justify-content: center;
text-align: center;
margin-top: 0.5em;
}
ul.grid li:hover a {
color: white !important;
}
ul.grid li a code {
@ -128,3 +137,51 @@ ul.grid .icon {
border-radius: 0 0 0.75em 0.75em;
}
.bd-article-container {
position: relative;
}
.filter-bar {
width: 100%;
display: block;
font-size: 0.6em;
border: 1px solid #ccc;
border-radius: 0.75em;
margin: 0.5em 0;
padding: 0.25em;
}
#reference h2.fixed {
position: fixed;
top: 0;
background: white;
z-index: 1;
}
#reference h2.fixed .header-content {
display: none;
}
@media screen and (max-width: 768px) {
#reference h2.fixed {
width: 100%;
margin-left: -0.5em;
padding: 0.5em 0.5em 0 0.5em;
}
}
@media screen and (max-width: 959px) {
#reference h2.fixed {
width: 100%;
margin-left: -1em;
padding: 0.5em 0.5em 0 0.5em;
}
}
@media screen and (min-width: 960px) {
#reference h2.fixed {
width: 75%;
max-width: 800px;
padding-top: 0.5em;
}
}

View File

@ -6,30 +6,7 @@ Backends
:maxdepth: 1
:caption: Backends:
platypush/backend/adafruit.io.rst
platypush/backend/button.flic.rst
platypush/backend/camera.pi.rst
platypush/backend/chat.telegram.rst
platypush/backend/google.fit.rst
platypush/backend/google.pubsub.rst
platypush/backend/gps.rst
platypush/backend/http.rst
platypush/backend/kafka.rst
platypush/backend/mail.rst
platypush/backend/midi.rst
platypush/backend/music.mopidy.rst
platypush/backend/music.mpd.rst
platypush/backend/music.spotify.rst
platypush/backend/nextcloud.rst
platypush/backend/nfc.rst
platypush/backend/nodered.rst
platypush/backend/pushbullet.rst
platypush/backend/redis.rst
platypush/backend/scard.rst
platypush/backend/sensor.ir.zeroborg.rst
platypush/backend/sensor.leap.rst
platypush/backend/stt.deepspeech.rst
platypush/backend/stt.picovoice.hotword.rst
platypush/backend/stt.picovoice.speech.rst
platypush/backend/tcp.rst
platypush/backend/wiimote.rst

View File

@ -11,21 +11,19 @@ Events
platypush/events/application.rst
platypush/events/assistant.rst
platypush/events/bluetooth.rst
platypush/events/button.flic.rst
platypush/events/camera.rst
platypush/events/chat.slack.rst
platypush/events/chat.telegram.rst
platypush/events/clipboard.rst
platypush/events/custom.rst
platypush/events/dbus.rst
platypush/events/distance.rst
platypush/events/entities.rst
platypush/events/file.rst
platypush/events/flic.rst
platypush/events/foursquare.rst
platypush/events/geo.rst
platypush/events/github.rst
platypush/events/google.rst
platypush/events/google.fit.rst
platypush/events/google.pubsub.rst
platypush/events/gotify.rst
platypush/events/gpio.rst
@ -66,6 +64,7 @@ Events
platypush/events/sound.rst
platypush/events/stt.rst
platypush/events/sun.rst
platypush/events/telegram.rst
platypush/events/tensorflow.rst
platypush/events/torrent.rst
platypush/events/trello.rst
@ -74,7 +73,6 @@ Events
platypush/events/web.rst
platypush/events/web.widget.rst
platypush/events/websocket.rst
platypush/events/wiimote.rst
platypush/events/xmpp.rst
platypush/events/zeroborg.rst
platypush/events/zeroconf.rst

View File

@ -39,6 +39,7 @@ Wiki
wiki/Configuration
wiki/Installing-extensions
wiki/A-configuration-example
wiki/The-Web-interface
Reference
=========
@ -49,7 +50,6 @@ Reference
backends
plugins
events
responses
Indices and tables
==================

View File

@ -1,6 +0,0 @@
``adafruit.io``
=================================
.. automodule:: platypush.backend.adafruit.io
:members:

View File

@ -1,6 +0,0 @@
``button.flic``
=================================
.. automodule:: platypush.backend.button.flic
:members:

View File

@ -1,6 +0,0 @@
``camera.pi``
===============================
.. automodule:: platypush.backend.camera.pi
:members:

View File

@ -1,5 +0,0 @@
``chat.telegram``
===================================
.. automodule:: platypush.backend.chat.telegram
:members:

View File

@ -1,6 +0,0 @@
``google.fit``
================================
.. automodule:: platypush.backend.google.fit
:members:

View File

@ -1,5 +0,0 @@
``google.pubsub``
===================================
.. automodule:: platypush.backend.google.pubsub
:members:

View File

@ -1,6 +0,0 @@
``gps``
=========================
.. automodule:: platypush.backend.gps
:members:

View File

@ -1,6 +0,0 @@
``kafka``
===========================
.. automodule:: platypush.backend.kafka
:members:

View File

@ -1,5 +0,0 @@
``mail``
==========================
.. automodule:: platypush.backend.mail
:members:

View File

@ -1,6 +0,0 @@
``midi``
==========================
.. automodule:: platypush.backend.midi
:members:

View File

@ -1,6 +0,0 @@
``music.mopidy``
==================================
.. automodule:: platypush.backend.music.mopidy
:members:

View File

@ -1,6 +0,0 @@
``music.mpd``
===============================
.. automodule:: platypush.backend.music.mpd
:members:

View File

@ -1,5 +0,0 @@
``music.spotify``
===================================
.. automodule:: platypush.backend.music.spotify
:members:

View File

@ -1,5 +0,0 @@
``nextcloud``
===============================
.. automodule:: platypush.backend.nextcloud
:members:

View File

@ -1,6 +0,0 @@
``nfc``
=========================
.. automodule:: platypush.backend.nfc
:members:

View File

@ -1,6 +0,0 @@
``pushbullet``
================================
.. automodule:: platypush.backend.pushbullet
:members:

View File

@ -1,6 +0,0 @@
``scard``
===========================
.. automodule:: platypush.backend.scard
:members:

View File

@ -1,6 +0,0 @@
``sensor.ir.zeroborg``
========================================
.. automodule:: platypush.backend.sensor.ir.zeroborg
:members:

View File

@ -1,7 +0,0 @@
``sensor.leap``
=================================
.. automodule:: platypush.backend.sensor.leap
:members:

View File

@ -1,5 +0,0 @@
``stt.deepspeech``
====================================
.. automodule:: platypush.backend.stt.deepspeech
:members:

View File

@ -1,5 +0,0 @@
``stt.picovoice.hotword``
===========================================
.. automodule:: platypush.backend.stt.picovoice.hotword
:members:

View File

@ -1,5 +0,0 @@
``stt.picovoice.speech``
==========================================
.. automodule:: platypush.backend.stt.picovoice.speech
:members:

View File

@ -1,6 +0,0 @@
``wiimote``
=============================
.. automodule:: platypush.backend.wiimote
:members:

View File

@ -1,6 +0,0 @@
``button.flic``
=======================================
.. automodule:: platypush.message.event.button.flic
:members:

View File

@ -1,5 +0,0 @@
``chat.telegram``
=========================================
.. automodule:: platypush.message.event.chat.telegram
:members:

View File

@ -0,0 +1,5 @@
``flic``
========
.. automodule:: platypush.message.event.flic
:members:

View File

@ -1,6 +0,0 @@
``google.fit``
======================================
.. automodule:: platypush.message.event.google.fit
:members:

View File

@ -0,0 +1,5 @@
``telegram``
============
.. automodule:: platypush.message.event.telegram
:members:

View File

@ -1,6 +0,0 @@
``wiimote``
===================================
.. automodule:: platypush.message.event.wiimote
:members:

View File

@ -0,0 +1,5 @@
``assistant.picovoice``
=======================
.. automodule:: platypush.plugins.assistant.picovoice
:members:

View File

@ -0,0 +1,5 @@
``camera.pi.legacy``
====================
.. automodule:: platypush.plugins.camera.pi.legacy
:members:

View File

@ -1,5 +0,0 @@
``chat.irc``
============
.. automodule:: platypush.plugins.chat.irc
:members:

View File

@ -1,5 +0,0 @@
``chat.telegram``
===================================
.. automodule:: platypush.plugins.chat.telegram
:members:

View File

@ -0,0 +1,5 @@
``cups``
========
.. automodule:: platypush.plugins.cups
:members:

View File

@ -0,0 +1,5 @@
``flic``
========
.. automodule:: platypush.plugins.flic
:members:

View File

@ -1,6 +0,0 @@
``google.fit``
================================
.. automodule:: platypush.plugins.google.fit
:members:

View File

@ -0,0 +1,5 @@
``gps``
=======
.. automodule:: platypush.plugins.gps
:members:

View File

@ -1,7 +0,0 @@
``http.request``
==================================
.. automodule:: platypush.plugins.http.request
:members:

View File

@ -0,0 +1,5 @@
``http``
========
.. automodule:: platypush.plugins.http
:members:

View File

@ -0,0 +1,5 @@
``irc``
=======
.. automodule:: platypush.plugins.irc
:members:

View File

@ -0,0 +1,5 @@
``leap``
========
.. automodule:: platypush.plugins.leap
:members:

View File

@ -1,5 +0,0 @@
``mail.imap``
===============================
.. automodule:: platypush.plugins.mail.imap
:members:

View File

@ -0,0 +1,5 @@
``mail``
========
.. automodule:: platypush.plugins.mail
:members:

View File

@ -1,5 +0,0 @@
``mail.smtp``
===============================
.. automodule:: platypush.plugins.mail.smtp
:members:

View File

@ -0,0 +1,5 @@
``music.mopidy``
================
.. automodule:: platypush.plugins.music.mopidy
:members:

View File

@ -0,0 +1,5 @@
``nfc``
=======
.. automodule:: platypush.plugins.nfc
:members:

View File

@ -0,0 +1,5 @@
``openai``
==========
.. automodule:: platypush.plugins.openai
:members:

View File

@ -1,5 +0,0 @@
``printer.cups``
==================================
.. automodule:: platypush.plugins.printer.cups
:members:

View File

@ -1,5 +0,0 @@
``stt.deepspeech``
====================================
.. automodule:: platypush.plugins.stt.deepspeech
:members:

View File

@ -1,5 +0,0 @@
``stt.picovoice.hotword``
===========================================
.. automodule:: platypush.plugins.stt.picovoice.hotword
:members:

View File

@ -1,5 +0,0 @@
``stt.picovoice.speech``
==========================================
.. automodule:: platypush.plugins.stt.picovoice.speech
:members:

View File

@ -0,0 +1,5 @@
``telegram``
============
.. automodule:: platypush.plugins.telegram
:members:

View File

@ -0,0 +1,5 @@
``tts.picovoice``
=================
.. automodule:: platypush.plugins.tts.picovoice
:members:

View File

@ -1,6 +0,0 @@
``wiimote``
=============================
.. automodule:: platypush.plugins.wiimote
:members:

View File

@ -1,5 +0,0 @@
``camera.android``
=============================================
.. automodule:: platypush.message.response.camera.android
:members:

View File

@ -1,5 +0,0 @@
``camera``
=====================================
.. automodule:: platypush.message.response.camera
:members:

View File

@ -1,5 +0,0 @@
``chat.telegram``
============================================
.. automodule:: platypush.message.response.chat.telegram
:members:

View File

@ -1,5 +0,0 @@
``google.drive``
===========================================
.. automodule:: platypush.message.response.google.drive
:members:

View File

@ -1,5 +0,0 @@
``pihole``
=====================================
.. automodule:: platypush.message.response.pihole
:members:

View File

@ -1,5 +0,0 @@
``printer.cups``
===========================================
.. automodule:: platypush.message.response.printer.cups
:members:

View File

@ -1,5 +0,0 @@
``qrcode``
=====================================
.. automodule:: platypush.message.response.qrcode
:members:

View File

@ -1,5 +0,0 @@
``ssh``
==================================
.. automodule:: platypush.message.response.ssh
:members:

View File

@ -1,5 +0,0 @@
``stt``
==================================
.. automodule:: platypush.message.response.stt
:members:

View File

@ -1,5 +0,0 @@
``tensorflow``
=========================================
.. automodule:: platypush.message.response.tensorflow
:members:

View File

@ -1,5 +0,0 @@
``translate``
========================================
.. automodule:: platypush.message.response.translate
:members:

View File

@ -11,6 +11,7 @@ Plugins
platypush/plugins/application.rst
platypush/plugins/arduino.rst
platypush/plugins/assistant.google.rst
platypush/plugins/assistant.picovoice.rst
platypush/plugins/autoremote.rst
platypush/plugins/bluetooth.rst
platypush/plugins/calendar.rst
@ -21,11 +22,11 @@ Plugins
platypush/plugins/camera.gstreamer.rst
platypush/plugins/camera.ir.mlx90640.rst
platypush/plugins/camera.pi.rst
platypush/plugins/chat.irc.rst
platypush/plugins/chat.telegram.rst
platypush/plugins/camera.pi.legacy.rst
platypush/plugins/clipboard.rst
platypush/plugins/config.rst
platypush/plugins/csv.rst
platypush/plugins/cups.rst
platypush/plugins/db.rst
platypush/plugins/dbus.rst
platypush/plugins/dropbox.rst
@ -34,11 +35,11 @@ Plugins
platypush/plugins/ffmpeg.rst
platypush/plugins/file.rst
platypush/plugins/file.monitor.rst
platypush/plugins/flic.rst
platypush/plugins/foursquare.rst
platypush/plugins/github.rst
platypush/plugins/google.calendar.rst
platypush/plugins/google.drive.rst
platypush/plugins/google.fit.rst
platypush/plugins/google.mail.rst
platypush/plugins/google.maps.rst
platypush/plugins/google.pubsub.rst
@ -46,24 +47,26 @@ Plugins
platypush/plugins/gotify.rst
platypush/plugins/gpio.rst
platypush/plugins/gpio.zeroborg.rst
platypush/plugins/gps.rst
platypush/plugins/graphite.rst
platypush/plugins/hid.rst
platypush/plugins/http.request.rst
platypush/plugins/http.rst
platypush/plugins/http.webpage.rst
platypush/plugins/ifttt.rst
platypush/plugins/inspect.rst
platypush/plugins/irc.rst
platypush/plugins/joystick.rst
platypush/plugins/kafka.rst
platypush/plugins/lastfm.rst
platypush/plugins/lcd.gpio.rst
platypush/plugins/lcd.i2c.rst
platypush/plugins/leap.rst
platypush/plugins/light.hue.rst
platypush/plugins/linode.rst
platypush/plugins/log.http.rst
platypush/plugins/logger.rst
platypush/plugins/luma.oled.rst
platypush/plugins/mail.imap.rst
platypush/plugins/mail.smtp.rst
platypush/plugins/mail.rst
platypush/plugins/mailgun.rst
platypush/plugins/mastodon.rst
platypush/plugins/matrix.rst
@ -82,18 +85,20 @@ Plugins
platypush/plugins/ml.cv.rst
platypush/plugins/mobile.join.rst
platypush/plugins/mqtt.rst
platypush/plugins/music.mopidy.rst
platypush/plugins/music.mpd.rst
platypush/plugins/music.snapcast.rst
platypush/plugins/music.spotify.rst
platypush/plugins/music.tidal.rst
platypush/plugins/nextcloud.rst
platypush/plugins/nfc.rst
platypush/plugins/ngrok.rst
platypush/plugins/nmap.rst
platypush/plugins/ntfy.rst
platypush/plugins/openai.rst
platypush/plugins/otp.rst
platypush/plugins/pihole.rst
platypush/plugins/ping.rst
platypush/plugins/printer.cups.rst
platypush/plugins/pushbullet.rst
platypush/plugins/pwm.pca9685.rst
platypush/plugins/qrcode.rst
@ -115,15 +120,13 @@ Plugins
platypush/plugins/smartthings.rst
platypush/plugins/sound.rst
platypush/plugins/ssh.rst
platypush/plugins/stt.deepspeech.rst
platypush/plugins/stt.picovoice.hotword.rst
platypush/plugins/stt.picovoice.speech.rst
platypush/plugins/sun.rst
platypush/plugins/switch.tplink.rst
platypush/plugins/switch.wemo.rst
platypush/plugins/switchbot.rst
platypush/plugins/system.rst
platypush/plugins/tcp.rst
platypush/plugins/telegram.rst
platypush/plugins/tensorflow.rst
platypush/plugins/todoist.rst
platypush/plugins/torrent.rst
@ -131,6 +134,7 @@ Plugins
platypush/plugins/tts.rst
platypush/plugins/tts.google.rst
platypush/plugins/tts.mimic3.rst
platypush/plugins/tts.picovoice.rst
platypush/plugins/tv.samsung.ws.rst
platypush/plugins/twilio.rst
platypush/plugins/udp.rst
@ -141,7 +145,6 @@ Plugins
platypush/plugins/weather.buienradar.rst
platypush/plugins/weather.openweathermap.rst
platypush/plugins/websocket.rst
platypush/plugins/wiimote.rst
platypush/plugins/xmpp.rst
platypush/plugins/youtube.rst
platypush/plugins/zeroconf.rst

View File

@ -1,19 +0,0 @@
Responses
=========
.. toctree::
:maxdepth: 1
:caption: Responses:
platypush/responses/camera.rst
platypush/responses/camera.android.rst
platypush/responses/chat.telegram.rst
platypush/responses/google.drive.rst
platypush/responses/pihole.rst
platypush/responses/printer.cups.rst
platypush/responses/qrcode.rst
platypush/responses/ssh.rst
platypush/responses/stt.rst
platypush/responses/tensorflow.rst
platypush/responses/translate.rst

View File

@ -1,15 +1,16 @@
# A more versatile way to define event hooks than the YAML format of `config.yaml` is through native Python scripts.
# You can define hooks as simple Python functions that use the `platypush.event.hook.hook` decorator to specify on
# which event type they should be called, and optionally on which event attribute values.
# A more versatile way to define event hooks than the YAML format of
# `config.yaml` is through native Python scripts. You can define hooks as simple
# Python functions that use the `platypush.event.hook.hook` decorator to specify
# on which event type they should be called, and optionally on which event
# attribute values.
#
# Event hooks should be stored in Python files under `~/.config/platypush/scripts`. All the functions that use the
# @hook decorator will automatically be discovered and imported as event hooks into the platform at runtime.
# Event hooks should be stored in Python files under
# `~/.config/platypush/scripts`. All the functions that use the @when decorator
# will automatically be discovered and imported as event hooks into the platform
# at runtime.
# `run` is a utility function that runs a request by name (e.g. `light.hue.on`).
from platypush.utils import run
# @hook decorator
from platypush.event.hook import hook
from platypush import when, run
# Event types that you want to react to
from platypush.message.event.assistant import (
@ -18,13 +19,15 @@ from platypush.message.event.assistant import (
)
@hook(SpeechRecognizedEvent, phrase='play ${title} by ${artist}')
def on_music_play_command(event, title=None, artist=None, **context):
@when(SpeechRecognizedEvent, phrase='play ${title} by ${artist}')
def on_music_play_command(event, title=None, artist=None):
"""
This function will be executed when a SpeechRecognizedEvent with `phrase="play the music"` is triggered.
`event` contains the event object and `context` any key-value info from the running context.
Note that in this specific case we can leverage the token-extraction feature of SpeechRecognizedEvent through
${} that operates on regex-like principles to extract any text that matches the pattern into context variables.
This function will be executed when a SpeechRecognizedEvent with
`phrase="play the music"` is triggered. `event` contains the event object
and `context` any key-value info from the running context. Note that in this
specific case we can leverage the token-extraction feature of
SpeechRecognizedEvent through ${} that operates on regex-like principles to
extract any text that matches the pattern into context variables.
"""
results = run(
'music.mpd.search',
@ -34,16 +37,17 @@ def on_music_play_command(event, title=None, artist=None, **context):
},
)
if results:
if results and results[0]:
run('music.mpd.play', results[0]['file'])
else:
run('tts.say', "I can't find any music matching your query")
@hook(ConversationStartEvent)
def on_conversation_start(event, **context):
@when(ConversationStartEvent)
def on_conversation_start():
"""
A simple hook that gets invoked when a new conversation starts with a voice assistant and simply pauses the music
to make sure that your speech is properly detected.
A simple hook that gets invoked when a new conversation starts with a voice
assistant and simply pauses the music to make sure that your speech is
properly detected.
"""
run('music.mpd.pause_if_playing')

View File

@ -1,22 +0,0 @@
# platypush systemd service example.
# Edit and copy this file to your systemd folder. It's usually
# /usr/lib/systemd/user for global installation or
# ~/.config/systemd/user for user installation. You can
# then control and monitor the service through
# systemd [--user] [start|stop|restart|status] platypush.service
[Unit]
Description=Platypush daemon
After=network.target redis.service
[Service]
# platypush installation path
ExecStart=/usr/bin/platypush
Restart=always
# How long should be waited before restarting the service
# in case of failure.
RestartSec=10
[Install]
WantedBy=default.target

View File

@ -0,0 +1 @@
../../platypush/config/systemd/platypush.service

View File

@ -8,7 +8,6 @@ import pkgutil
from platypush.backend import Backend
from platypush.message.event import Event
from platypush.message.response import Response
from platypush.plugins import Plugin
from platypush.utils.manifest import Manifests
from platypush.utils.mock import auto_mocks
@ -26,10 +25,6 @@ def get_all_events():
return _get_modules(Event)
def get_all_responses():
return _get_modules(Response)
def _get_modules(base_type: type):
ret = set()
base_dir = os.path.dirname(inspect.getfile(base_type))
@ -151,20 +146,11 @@ def generate_events_doc():
)
def generate_responses_doc():
_generate_components_doc(
index_name='responses',
package_name='message.response',
components=sorted(response for response in get_all_responses() if response),
)
def main():
with auto_mocks():
generate_plugins_doc()
generate_backends_doc()
generate_events_doc()
generate_responses_doc()
if __name__ == '__main__':

View File

@ -5,29 +5,42 @@ Platypush
.. license: MIT
"""
from .app import Application
from .app import Application, app
from .config import Config
from .context import get_backend, get_bus, get_plugin
from .context import Variable, get_backend, get_bus, get_plugin
from .cron import cron
from .event.hook import hook
from .message.event import Event
from .message.request import Request
from .message.response import Response
from .procedure import procedure
from .runner import main
from .utils import run
# Alias for platypush.event.hook.hook,
# see https://git.platypush.tech/platypush/platypush/issues/399
when = hook
__author__ = 'Fabio Manganiello <fabio@manganiello.tech>'
__version__ = '0.50.3'
__all__ = [
'Application',
'Variable',
'Config',
'Event',
'Request',
'Response',
'app',
'cron',
'get_backend',
'get_bus',
'get_plugin',
'hook',
'main',
'procedure',
'run',
'when',
]

View File

@ -1,4 +1,4 @@
from ._app import Application, main
from ._app import Application, app, main
__all__ = ["Application", "main"]
__all__ = ["Application", "app", "main"]

View File

@ -1,5 +1,6 @@
from contextlib import contextmanager
import logging
import pathlib
import os
import signal
import subprocess
@ -41,6 +42,7 @@ class Application:
self,
config_file: Optional[str] = None,
workdir: Optional[str] = None,
db: Optional[str] = None,
logsdir: Optional[str] = None,
cachedir: Optional[str] = None,
device_id: Optional[str] = None,
@ -56,30 +58,87 @@ class Application:
ctrl_sock: Optional[str] = None,
):
"""
:param config_file: Configuration file override (default: None).
:param workdir: Overrides the ``workdir`` setting in the configuration
file (default: None).
:param logsdir: Set logging directory. If not specified, the
``filename`` setting under the ``logging`` section of the
configuration file is used. If not set, logging will be sent to
stdout and stderr.
:param cachedir: Overrides the ``cachedir`` setting in the configuration
file (default: None).
:param device_id: Override the device ID used to identify this
instance. If not passed here, it is inferred from the configuration
(device_id field). If not present there either, it is inferred from
the hostname.
:param config_file: Configuration file. The order of precedence is:
- The ``config_file`` parameter (or the ``-c``/``--config`` command
line argument).
- The ``PLATYPUSH_CONFIG`` environment variable.
- ``./config.yaml``
- ``~/.config/platypush/config.yaml``
- ``/etc/platypush/config.yaml``
:param workdir: Working directory where the application will store its
data and integration plugins will store their data. The order of
precedence is:
- The ``workdir`` parameter (or the ``-w``/``--workdir`` command
line argument).
- The ``PLATYPUSH_WORKDIR`` environment variable.
- The ``workdir`` field in the configuration file.
- ``~/.local/share/platypush``
:param db: Main database engine for the application. Supports SQLAlchemy
engine strings. The order of precedence is:
- The ``db`` parameter (or the ``--main-db``/``--db`` command
line argument).
- The ``PLATYPUSH_DB`` environment variable.
- The ``db`` field in the configuration file.
- ``sqlite:///<workdir>/main.db``
:param logsdir: Logs directory where the application will store its logs.
The order of precedence is:
- The ``logsdir`` parameter (or the ``-l``/``--logsdir`` command
line argument).
- The ``PLATYPUSH_LOGSDIR`` environment variable.
- The ``logging`` -> ``filename`` field in the configuration
file (the ``format`` and ``level`` fields can be set as well
using Python logging configuration).
- stdout and stderr
:param cachedir: Directory where the application and the plugins will store
their cache data. The order of precedence is:
- The ``cachedir`` parameter (or the ``--cachedir`` command line
argument).
- The ``PLATYPUSH_CACHEDIR`` environment variable.
- The ``cachedir`` field in the configuration file.
- ``~/.cache/platypush``
:param device_id: Device ID used to identify this instance. The order
of precedence is:
- The ``device_id`` parameter (or the ``--device-id`` command
line argument).
- The ``PLATYPUSH_DEVICE_ID`` environment variable.
- The ``device_id`` field in the configuration file.
- The hostname of the machine.
:param pidfile: File where platypush will store its PID upon launch,
useful if you're planning to integrate the application within a
service or a launcher script (default: None).
service or a launcher script. Order of precedence:
- The ``pidfile`` parameter (or the ``-P``/``--pidfile`` command
line argument).
- The ``PLATYPUSH_PIDFILE`` environment variable.
- No PID file.
:param requests_to_process: Exit after processing the specified
number of requests (default: None, loop forever).
number of requests (default: None, loop forever). This is usually
useful for testing purposes.
:param no_capture_stdout: Set to true if you want to disable the
stdout capture by the logging system (default: False).
:param no_capture_stderr: Set to true if you want to disable the
stderr capture by the logging system (default: False).
:param redis_queue: Name of the (Redis) queue used for dispatching
messages (default: platypush/bus).
messages. Order of precedence:
- The ``redis_queue`` parameter (or the ``--redis-queue`` command
line argument).
- The ``PLATYPUSH_REDIS_QUEUE`` environment variable.
- ``platypush/bus``
:param verbose: Enable debug/verbose logging, overriding the stored
configuration (default: False).
:param start_redis: If set, it starts a managed Redis instance upon
@ -87,34 +146,57 @@ class Application:
server). This is particularly useful when running the application
inside of Docker containers, without relying on ``docker-compose``
to start multiple containers, and in tests (default: False).
:param redis_host: Host of the Redis server to be used. It overrides
the settings in the ``redis`` section of the configuration file.
:param redis_port: Port of the local Redis server. It overrides the
settings in the ``redis`` section of the configuration file.
:param redis_host: Host of the Redis server to be used. The order of
precedence is:
- The ``redis_host`` parameter (or the ``--redis-host`` command
line argument).
- The ``PLATYPUSH_REDIS_HOST`` environment variable.
- The ``redis`` -> ``host`` field in the configuration file.
- The ``backend.redis`` -> ``redis_args`` -> ``host`` field in
the configuration file.
- ``localhost``
:param redis_port: Port of the Redis server to be used. The order of
precedence is:
- The ``redis_port`` parameter (or the ``--redis-port`` command
line argument).
- The ``PLATYPUSH_REDIS_PORT`` environment variable.
- The ``redis`` -> ``port`` field in the configuration file.
- The ``backend.redis`` -> ``redis_args`` -> ``port`` field in
the configuration file.
- ``6379``
:param ctrl_sock: If set, it identifies a path to a UNIX domain socket
that the application can use to send control messages (e.g. STOP
and RESTART) to its parent.
"""
self.pidfile = pidfile
self.pidfile = pidfile or os.environ.get('PLATYPUSH_PIDFILE')
self.bus: Optional[Bus] = None
self.redis_queue = redis_queue or RedisBus.DEFAULT_REDIS_QUEUE
self.config_file = config_file
self._verbose = verbose
self._logsdir = (
os.path.abspath(os.path.expanduser(logsdir)) if logsdir else None
self.redis_queue = (
redis_queue
or os.environ.get('PLATYPUSH_REDIS_QUEUE')
or RedisBus.DEFAULT_REDIS_QUEUE
)
self.config_file = config_file or os.environ.get('PLATYPUSH_CONFIG')
self.verbose = verbose
self.db_engine = db or os.environ.get('PLATYPUSH_DB')
self.device_id = device_id or os.environ.get('PLATYPUSH_DEVICE_ID')
self.logsdir = self.expand_path(logsdir or os.environ.get('PLATYPUSH_LOGSDIR'))
self.workdir = self.expand_path(workdir or os.environ.get('PLATYPUSH_WORKDIR'))
self.cachedir = self.expand_path(
cachedir or os.environ.get('PLATYPUSH_CACHEDIR')
)
Config.init(
self.config_file,
device_id=device_id,
workdir=os.path.abspath(os.path.expanduser(workdir)) if workdir else None,
cachedir=os.path.abspath(os.path.expanduser(cachedir))
if cachedir
else None,
ctrl_sock=os.path.abspath(os.path.expanduser(ctrl_sock))
if ctrl_sock
else None,
device_id=self.device_id,
workdir=self.workdir,
db=self.db_engine,
cachedir=self.cachedir,
ctrl_sock=self.expand_path(ctrl_sock),
)
self.no_capture_stdout = no_capture_stdout
@ -125,24 +207,25 @@ class Application:
self.processed_requests = 0
self.cron_scheduler = None
self.start_redis = start_redis
self.redis_host = redis_host
self.redis_port = redis_port
self.redis_conf = {}
self.redis_host = redis_host or os.environ.get('PLATYPUSH_REDIS_HOST')
self.redis_port = redis_port or os.environ.get('PLATYPUSH_REDIS_PORT')
self._redis_conf = {
'host': self.redis_host or 'localhost',
'port': self.redis_port or self._default_redis_port,
}
self._redis_proc: Optional[subprocess.Popen] = None
self.cmd_stream = CommandStream(ctrl_sock)
self._init_bus()
self._init_logging()
@staticmethod
def expand_path(path: Optional[str]) -> Optional[str]:
return os.path.abspath(os.path.expanduser(path)) if path else None
def _init_bus(self):
self._redis_conf = get_redis_conf()
self._redis_conf['port'] = self.redis_port or self._redis_conf.get(
'port', self._default_redis_port
)
if self.redis_host:
self._redis_conf['host'] = self.redis_host
self._redis_conf = {**self._redis_conf, **get_redis_conf()}
Config.set('redis', self._redis_conf)
self.bus = RedisBus(
redis_queue=self.redis_queue,
@ -152,12 +235,18 @@ class Application:
def _init_logging(self):
logging_conf = Config.get('logging') or {}
if self._verbose:
if self.verbose:
logging_conf['level'] = logging.DEBUG
if self._logsdir:
logging_conf['filename'] = os.path.join(self._logsdir, 'platypush.log')
if self.logsdir:
logging_conf['filename'] = os.path.join(self.logsdir, 'platypush.log')
logging_conf.pop('stream', None)
if logging_conf.get('filename'):
pathlib.Path(os.path.dirname(logging_conf['filename'])).mkdir(
parents=True, exist_ok=True
)
Config.set('logging', logging_conf)
logging.basicConfig(**logging_conf)
@ -214,6 +303,7 @@ class Application:
workdir=opts.workdir,
cachedir=opts.cachedir,
logsdir=opts.logsdir,
db=opts.db_engine,
device_id=opts.device_id,
pidfile=opts.pidfile,
no_capture_stdout=opts.no_capture_stdout,
@ -274,6 +364,10 @@ class Application:
backend.stop()
for plugin in runnable_plugins:
# This is required because some plugins may redefine the `stop` method.
# In that case, at the very least the _should_stop event should be
# set to notify the plugin to stop.
plugin._should_stop.set() # pylint: disable=protected-access
plugin.stop()
for backend in backends:
@ -370,10 +464,15 @@ class Application:
self._run()
app: Optional[Application] = None
def main(*args: str):
"""
Application entry point.
"""
global app
app = Application.from_cmdline(args)
try:

View File

@ -402,6 +402,13 @@ class Backend(Thread, EventGenerator, ExtensionWithManifest):
)
return
if self.zeroconf:
self.logger.info(
'Zeroconf service already registered for %s, removing the previous instance',
self.__class__.__name__,
)
self.unregister_service()
self.zeroconf = Zeroconf()
srv_desc = {
'name': 'Platypush',

Some files were not shown because too many files have changed in this diff Show More