parent
741a021ef5
commit
a5c9039fee
25
README.md
25
README.md
@ -51,6 +51,31 @@ Note: You can specify the host and port to listen on using the
|
|||||||
`COZYWEBOOB_HOST` and `COZYWEBOOB_PORT` environment variables.
|
`COZYWEBOOB_HOST` and `COZYWEBOOB_PORT` environment variables.
|
||||||
|
|
||||||
|
|
||||||
|
## Conversation script
|
||||||
|
|
||||||
|
There is another command-line script available if you would rather communicate
|
||||||
|
with it in a conversation manner, using `stdin` and `stdout` (typically to
|
||||||
|
integrate it with Node modules using
|
||||||
|
[Python-shell](https://github.com/extrabacon/python-shell)). To run it, use:
|
||||||
|
```bash
|
||||||
|
./stdin_conversation.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, you can write on `stdin` and fetch the responses from `stdout`.
|
||||||
|
Available commands are:
|
||||||
|
* `GET /list` to list all available modules.
|
||||||
|
* `GET /fetch JSON_PARAMS` where `JSON_PARAMS` is an input JSON for module
|
||||||
|
parameters.
|
||||||
|
* `exit` to quit the script and end the conversation.
|
||||||
|
|
||||||
|
JSON responses are the same one as from the HTTP server script. It is
|
||||||
|
basically the same script without HTTP encapsulation.
|
||||||
|
|
||||||
|
_Note_: To simplify the script, note that it only supports single line
|
||||||
|
commands. Then, your `JSON_PARAMS` should be the same single `stdin` line as
|
||||||
|
the `GET /fetch` part.
|
||||||
|
|
||||||
|
|
||||||
## Notes concerning all the available scripts
|
## Notes concerning all the available scripts
|
||||||
|
|
||||||
Using `COZYWEBOOB_ENV=debug`, you can enable debug features for all of these
|
Using `COZYWEBOOB_ENV=debug`, you can enable debug features for all of these
|
||||||
|
2
cozyweboob/__init__.py
Normal file
2
cozyweboob/__init__.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
from .cozyweboob import WeboobProxy, main_fetch, main
|
||||||
|
__all__ = ["WeboobProxy", "main_fetch", "main"]
|
@ -27,7 +27,7 @@ import tools.weboob_tools as weboob_tools
|
|||||||
|
|
||||||
# Dynamically load capabilities conversion modules
|
# Dynamically load capabilities conversion modules
|
||||||
# Dynamic loading is required to be able to call them programatically.
|
# Dynamic loading is required to be able to call them programatically.
|
||||||
CAPABILITIES_CONVERSION_MODULES = importlib.import_module("capabilities")
|
CAPABILITIES_CONVERSION_MODULES = importlib.import_module("cozyweboob.capabilities")
|
||||||
|
|
||||||
# Module specific logger
|
# Module specific logger
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
21
server.py
21
server.py
@ -9,17 +9,17 @@ from bottle import post, request, response, route, run
|
|||||||
|
|
||||||
from cozyweboob import main as cozyweboob
|
from cozyweboob import main as cozyweboob
|
||||||
from cozyweboob import WeboobProxy
|
from cozyweboob import WeboobProxy
|
||||||
from tools.env import is_in_debug_mode
|
from cozyweboob.tools.env import is_in_debug_mode
|
||||||
from tools.jsonwriter import pretty_json
|
from cozyweboob.tools.jsonwriter import pretty_json
|
||||||
|
|
||||||
# Module specific logger
|
# Module specific logger
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@post("/")
|
@post("/fetch")
|
||||||
def index():
|
def fetch_view():
|
||||||
"""
|
"""
|
||||||
Main view, fetch from weboob modules.
|
Fetch from weboob modules.
|
||||||
"""
|
"""
|
||||||
params = request.forms.get("params")
|
params = request.forms.get("params")
|
||||||
response.content_type = "application/json"
|
response.content_type = "application/json"
|
||||||
@ -36,9 +36,9 @@ def list_view():
|
|||||||
return pretty_json(proxy.list_modules())
|
return pretty_json(proxy.list_modules())
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def init():
|
||||||
"""
|
"""
|
||||||
Main function
|
Init function
|
||||||
"""
|
"""
|
||||||
# Debug only: Set logging level and format
|
# Debug only: Set logging level and format
|
||||||
if is_in_debug_mode():
|
if is_in_debug_mode():
|
||||||
@ -52,6 +52,13 @@ def main():
|
|||||||
proxy = WeboobProxy()
|
proxy = WeboobProxy()
|
||||||
proxy.install_modules()
|
proxy.install_modules()
|
||||||
logger.info("Starting server.")
|
logger.info("Starting server.")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Main function
|
||||||
|
"""
|
||||||
|
init()
|
||||||
# Get host to listen on
|
# Get host to listen on
|
||||||
HOST = os.environ.get("COZYWEBOOB_HOST", "localhost")
|
HOST = os.environ.get("COZYWEBOOB_HOST", "localhost")
|
||||||
PORT = os.environ.get("COZYWEBOOB_PORT", 8080)
|
PORT = os.environ.get("COZYWEBOOB_PORT", 8080)
|
||||||
|
95
stdin_conversation.py
Executable file
95
stdin_conversation.py
Executable file
@ -0,0 +1,95 @@
|
|||||||
|
#!/usr/bin/env python2
|
||||||
|
"""
|
||||||
|
Wrapper around weboob to be called from mode, in a conversation way, similar to
|
||||||
|
the
|
||||||
|
[Python-shell](https://github.com/Birch-san/python-shell/blob/9d8641dc1e55e808ba82d029f9920413ab63206f/test/python/conversation.py)
|
||||||
|
conversation example.
|
||||||
|
"""
|
||||||
|
import logging
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from cozyweboob import main as cozyweboob
|
||||||
|
from cozyweboob import WeboobProxy
|
||||||
|
from cozyweboob.tools.env import is_in_debug_mode
|
||||||
|
from cozyweboob.tools.jsonwriter import pretty_json
|
||||||
|
|
||||||
|
# Module specific logger
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_view(params):
|
||||||
|
"""
|
||||||
|
Fetch from weboob modules.
|
||||||
|
"""
|
||||||
|
return pretty_json(cozyweboob(params))
|
||||||
|
|
||||||
|
|
||||||
|
def list_view():
|
||||||
|
"""
|
||||||
|
List all available weboob modules and their configuration options.
|
||||||
|
"""
|
||||||
|
proxy = WeboobProxy()
|
||||||
|
return pretty_json(proxy.list_modules())
|
||||||
|
|
||||||
|
|
||||||
|
def process_query(query):
|
||||||
|
"""
|
||||||
|
Process input query on the command-line.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
query: The query received on stdin.
|
||||||
|
Returns:
|
||||||
|
- A JSON response if a valid query is received.
|
||||||
|
- False if should exit.
|
||||||
|
- None if invalid query is received.
|
||||||
|
"""
|
||||||
|
query = query.strip()
|
||||||
|
if query == "GET /list":
|
||||||
|
# List modules view
|
||||||
|
logger.info("Calling /list view.")
|
||||||
|
return list_view()
|
||||||
|
elif query.startswith("GET /fetch"):
|
||||||
|
# Fetch modules view
|
||||||
|
logger.info("Calling /list view.")
|
||||||
|
params = query.split()[2]
|
||||||
|
return fetch_view(params)
|
||||||
|
elif query == "exit":
|
||||||
|
# Exit command
|
||||||
|
logger.info("Exiting.")
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
# Invalid query
|
||||||
|
logger.error("Invalid query, exiting: %s" % query)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Main function
|
||||||
|
"""
|
||||||
|
# Debug only: Set logging level and format
|
||||||
|
if is_in_debug_mode():
|
||||||
|
logging.basicConfig(
|
||||||
|
format='%(levelname)s: %(message)s',
|
||||||
|
level=logging.INFO
|
||||||
|
)
|
||||||
|
# Ensure all modules are installed and up to date before starting the
|
||||||
|
# server
|
||||||
|
logger.info("Ensuring all modules are installed and up to date.")
|
||||||
|
proxy = WeboobProxy()
|
||||||
|
proxy.install_modules()
|
||||||
|
logger.info("Starting server.")
|
||||||
|
while True:
|
||||||
|
line = sys.stdin.readline()
|
||||||
|
if not line:
|
||||||
|
break
|
||||||
|
response = process_query(line)
|
||||||
|
if response:
|
||||||
|
print(response)
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in New Issue
Block a user