forked from platypush/platypush
Merge branch 'master' into 191-support-for-general-entities-backend-and-plugin
This commit is contained in:
commit
30dfdeecb0
3 changed files with 99 additions and 39 deletions
30
README.md
30
README.md
|
@ -6,6 +6,7 @@ Platypush
|
||||||
[![pip version](https://img.shields.io/pypi/v/platypush.svg?style=flat)](https://pypi.python.org/pypi/platypush/)
|
[![pip version](https://img.shields.io/pypi/v/platypush.svg?style=flat)](https://pypi.python.org/pypi/platypush/)
|
||||||
[![License](https://img.shields.io/github/license/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/blob/master/LICENSE.txt)
|
[![License](https://img.shields.io/github/license/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/blob/master/LICENSE.txt)
|
||||||
[![Last Commit](https://img.shields.io/github/last-commit/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/commits/master/)
|
[![Last Commit](https://img.shields.io/github/last-commit/BlackLight/platypush.svg)](https://git.platypush.tech/platypush/platypush/-/commits/master/)
|
||||||
|
[![Join chat on Matrix](https://img.shields.io/matrix/:platypush?server_fqdn=matrix.platypush.tech)](https://matrix.to/#/#platypush:matrix.platypush.tech)
|
||||||
[![Contributions](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://git.platypush.tech/platypush/platypush/-/blob/master/CONTRIBUTING.md)
|
[![Contributions](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://git.platypush.tech/platypush/platypush/-/blob/master/CONTRIBUTING.md)
|
||||||
[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:python)
|
[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:python)
|
||||||
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:javascript)
|
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/BlackLight/platypush.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/BlackLight/platypush/context:javascript)
|
||||||
|
@ -23,6 +24,9 @@ Platypush
|
||||||
* [The web interface](#the-web-interface)
|
* [The web interface](#the-web-interface)
|
||||||
- [Installation](#installation)
|
- [Installation](#installation)
|
||||||
* [System installation](#system-installation)
|
* [System installation](#system-installation)
|
||||||
|
+ [Install through `pip`](#install-through-pip)
|
||||||
|
+ [Install through a system package manager](#install-through-a-system-package-manager)
|
||||||
|
+ [Install from sources](#install-from-sources)
|
||||||
* [Installing the dependencies for your extensions](#installing-the-dependencies-for-your-extensions)
|
* [Installing the dependencies for your extensions](#installing-the-dependencies-for-your-extensions)
|
||||||
+ [Install via `extras` name](#install-via-extras-name)
|
+ [Install via `extras` name](#install-via-extras-name)
|
||||||
+ [Install via `manifest.yaml`](#install-via-manifestyaml)
|
+ [Install via `manifest.yaml`](#install-via-manifestyaml)
|
||||||
|
@ -440,15 +444,33 @@ Platypush uses Redis to deliver and store requests and temporary messages:
|
||||||
[sudo] systemctl start redis
|
[sudo] systemctl start redis
|
||||||
```
|
```
|
||||||
|
|
||||||
To install the core platform:
|
#### Install through `pip`
|
||||||
|
|
||||||
- The `pip` way:
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
[sudo] pip3 install platypush
|
[sudo] pip3 install platypush
|
||||||
```
|
```
|
||||||
|
|
||||||
- The sources way:
|
#### Install through a system package manager
|
||||||
|
|
||||||
|
Note: currently only Arch Linux and derived distributions are supported.
|
||||||
|
|
||||||
|
You can either install the
|
||||||
|
[`platypush`](https://aur.archlinux.org/packages/platypush) package (for the
|
||||||
|
latest stable version) or the
|
||||||
|
[`platypush-git`](https://aur.archlinux.org/packages/platypush-git) package
|
||||||
|
(for the latest git version) through your favourite AUR package manager. For
|
||||||
|
example, using `yay`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
yay platypush
|
||||||
|
# Or
|
||||||
|
yay platypush-git
|
||||||
|
```
|
||||||
|
|
||||||
|
The Arch Linux packages on AUR are automatically updated upon new git commits
|
||||||
|
or tags.
|
||||||
|
|
||||||
|
#### Install from sources
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git clone https://git.platypush.tech/platypush/platypush.git
|
git clone https://git.platypush.tech/platypush/platypush.git
|
||||||
|
|
|
@ -31,7 +31,7 @@ logger = logging.getLogger('platypush')
|
||||||
|
|
||||||
|
|
||||||
class Daemon:
|
class Daemon:
|
||||||
""" Main class for the Platypush daemon """
|
"""Main class for the Platypush daemon"""
|
||||||
|
|
||||||
# Configuration file (default: either ~/.config/platypush/config.yaml or
|
# Configuration file (default: either ~/.config/platypush/config.yaml or
|
||||||
# /etc/platypush/config.yaml
|
# /etc/platypush/config.yaml
|
||||||
|
@ -53,8 +53,15 @@ class Daemon:
|
||||||
# number of executions retries before a request fails
|
# number of executions retries before a request fails
|
||||||
n_tries = 2
|
n_tries = 2
|
||||||
|
|
||||||
def __init__(self, config_file=None, pidfile=None, requests_to_process=None,
|
def __init__(
|
||||||
no_capture_stdout=False, no_capture_stderr=False, redis_queue=None):
|
self,
|
||||||
|
config_file=None,
|
||||||
|
pidfile=None,
|
||||||
|
requests_to_process=None,
|
||||||
|
no_capture_stdout=False,
|
||||||
|
no_capture_stderr=False,
|
||||||
|
redis_queue=None,
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Constructor
|
Constructor
|
||||||
Params:
|
Params:
|
||||||
|
@ -82,8 +89,11 @@ class Daemon:
|
||||||
logging.basicConfig(**Config.get('logging'))
|
logging.basicConfig(**Config.get('logging'))
|
||||||
|
|
||||||
redis_conf = Config.get('backend.redis') or {}
|
redis_conf = Config.get('backend.redis') or {}
|
||||||
self.bus = RedisBus(redis_queue=self.redis_queue, on_message=self.on_message(),
|
self.bus = RedisBus(
|
||||||
**redis_conf.get('redis_args', {}))
|
redis_queue=self.redis_queue,
|
||||||
|
on_message=self.on_message(),
|
||||||
|
**redis_conf.get('redis_args', {})
|
||||||
|
)
|
||||||
|
|
||||||
self.no_capture_stdout = no_capture_stdout
|
self.no_capture_stdout = no_capture_stdout
|
||||||
self.no_capture_stderr = no_capture_stderr
|
self.no_capture_stderr = no_capture_stderr
|
||||||
|
@ -101,33 +111,59 @@ class Daemon:
|
||||||
args -- Your sys.argv[1:] [List of strings]
|
args -- Your sys.argv[1:] [List of strings]
|
||||||
"""
|
"""
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument('--config', '-c', dest='config', required=False,
|
parser.add_argument(
|
||||||
default=None, help=cls.config_file.__doc__)
|
'--config',
|
||||||
parser.add_argument('--pidfile', '-P', dest='pidfile', required=False,
|
'-c',
|
||||||
default=None, help="File where platypush will " +
|
dest='config',
|
||||||
"store its PID, useful if you're planning to " +
|
required=False,
|
||||||
"integrate it in a service")
|
default=None,
|
||||||
parser.add_argument('--no-capture-stdout', dest='no_capture_stdout',
|
help=cls.config_file.__doc__,
|
||||||
required=False, action='store_true',
|
)
|
||||||
help="Set this flag if you have max stack depth " +
|
parser.add_argument(
|
||||||
"exceeded errors so stdout won't be captured by " +
|
'--pidfile',
|
||||||
"the logging system")
|
'-P',
|
||||||
parser.add_argument('--no-capture-stderr', dest='no_capture_stderr',
|
dest='pidfile',
|
||||||
required=False, action='store_true',
|
required=False,
|
||||||
help="Set this flag if you have max stack depth " +
|
default=None,
|
||||||
"exceeded errors so stderr won't be captured by " +
|
help="File where platypush will "
|
||||||
"the logging system")
|
+ "store its PID, useful if you're planning to "
|
||||||
parser.add_argument('--redis-queue', dest='redis_queue',
|
+ "integrate it in a service",
|
||||||
required=False, action='store_true',
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--no-capture-stdout',
|
||||||
|
dest='no_capture_stdout',
|
||||||
|
required=False,
|
||||||
|
action='store_true',
|
||||||
|
help="Set this flag if you have max stack depth "
|
||||||
|
+ "exceeded errors so stdout won't be captured by "
|
||||||
|
+ "the logging system",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--no-capture-stderr',
|
||||||
|
dest='no_capture_stderr',
|
||||||
|
required=False,
|
||||||
|
action='store_true',
|
||||||
|
help="Set this flag if you have max stack depth "
|
||||||
|
+ "exceeded errors so stderr won't be captured by "
|
||||||
|
+ "the logging system",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--redis-queue',
|
||||||
|
dest='redis_queue',
|
||||||
|
required=False,
|
||||||
default=cls._default_redis_queue,
|
default=cls._default_redis_queue,
|
||||||
help="Name of the Redis queue to be used to internally deliver messages "
|
help="Name of the Redis queue to be used to internally deliver messages "
|
||||||
"(default: platypush/bus)")
|
"(default: platypush/bus)",
|
||||||
|
)
|
||||||
|
|
||||||
opts, args = parser.parse_known_args(args)
|
opts, args = parser.parse_known_args(args)
|
||||||
return cls(config_file=opts.config, pidfile=opts.pidfile,
|
return cls(
|
||||||
|
config_file=opts.config,
|
||||||
|
pidfile=opts.pidfile,
|
||||||
no_capture_stdout=opts.no_capture_stdout,
|
no_capture_stdout=opts.no_capture_stdout,
|
||||||
no_capture_stderr=opts.no_capture_stderr,
|
no_capture_stderr=opts.no_capture_stderr,
|
||||||
redis_queue=opts.redis_queue)
|
redis_queue=opts.redis_queue,
|
||||||
|
)
|
||||||
|
|
||||||
def on_message(self):
|
def on_message(self):
|
||||||
"""
|
"""
|
||||||
|
@ -148,8 +184,10 @@ class Daemon:
|
||||||
logger.info('Dropped unauthorized request: {}'.format(msg))
|
logger.info('Dropped unauthorized request: {}'.format(msg))
|
||||||
|
|
||||||
self.processed_requests += 1
|
self.processed_requests += 1
|
||||||
if self.requests_to_process \
|
if (
|
||||||
and self.processed_requests >= self.requests_to_process:
|
self.requests_to_process
|
||||||
|
and self.processed_requests >= self.requests_to_process
|
||||||
|
):
|
||||||
self.stop_app()
|
self.stop_app()
|
||||||
elif isinstance(msg, Response):
|
elif isinstance(msg, Response):
|
||||||
logger.info('Received response: {}'.format(msg))
|
logger.info('Received response: {}'.format(msg))
|
||||||
|
@ -161,7 +199,7 @@ class Daemon:
|
||||||
return _f
|
return _f
|
||||||
|
|
||||||
def stop_app(self):
|
def stop_app(self):
|
||||||
""" Stops the backends and the bus """
|
"""Stops the backends and the bus"""
|
||||||
from .plugins import RunnablePlugin
|
from .plugins import RunnablePlugin
|
||||||
|
|
||||||
if self.backends:
|
if self.backends:
|
||||||
|
@ -185,7 +223,7 @@ class Daemon:
|
||||||
self.entities_engine = None
|
self.entities_engine = None
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
""" Start the daemon """
|
"""Start the daemon"""
|
||||||
if not self.no_capture_stdout:
|
if not self.no_capture_stdout:
|
||||||
sys.stdout = Logger(logger.info)
|
sys.stdout = Logger(logger.info)
|
||||||
if not self.no_capture_stderr:
|
if not self.no_capture_stderr:
|
||||||
|
|
|
@ -102,7 +102,7 @@ class RssPlugin(RunnablePlugin):
|
||||||
{
|
{
|
||||||
'feed_url': url,
|
'feed_url': url,
|
||||||
'feed_title': getattr(feed.feed, 'title', None),
|
'feed_title': getattr(feed.feed, 'title', None),
|
||||||
'id': entry.id,
|
'id': getattr(entry, 'id', None),
|
||||||
'url': entry.link,
|
'url': entry.link,
|
||||||
'published': datetime.datetime.fromtimestamp(time.mktime(entry.published_parsed)),
|
'published': datetime.datetime.fromtimestamp(time.mktime(entry.published_parsed)),
|
||||||
'title': entry.title,
|
'title': entry.title,
|
||||||
|
|
Loading…
Reference in a new issue