Automate installation process;
Add command line prompt to set configurations; Update document README.
This commit is contained in:
parent
2cdba527f6
commit
5fd6a6c710
8 changed files with 136 additions and 22 deletions
16
README.md
16
README.md
|
@ -15,8 +15,9 @@ PubSub nodes into static XHTML journal sites.
|
||||||
Rivista was inspired from Tigase and was motivated by Movim.
|
Rivista was inspired from Tigase and was motivated by Movim.
|
||||||
|
|
||||||
## Home site
|
## Home site
|
||||||
- https://schapps.woodpeckersnest.eu/rivista/
|
|
||||||
- gemini://woodpeckersnest.space/~schapps/rivista.gmi
|
- gemini://woodpeckersnest.space/~schapps/rivista.gmi
|
||||||
|
- https://schapps.woodpeckersnest.eu/rivista/
|
||||||
|
|
||||||
## Instances
|
## Instances
|
||||||
|
|
||||||
|
@ -92,23 +93,14 @@ $ pipx uninstall rivista
|
||||||
$ pipx install git+https://git.xmpp-it.net/sch/Rivista
|
$ pipx install git+https://git.xmpp-it.net/sch/Rivista
|
||||||
```
|
```
|
||||||
|
|
||||||
### Configure
|
|
||||||
|
|
||||||
Add account credentials to file `settings.toml`.
|
|
||||||
|
|
||||||
Copy file`settings.toml` to `~/.config/rivista/`.
|
|
||||||
|
|
||||||
Copy directories `css`, `graphics`, `img`, `script`, and `xsl` to
|
|
||||||
`~/.local/share/rivista/`.
|
|
||||||
|
|
||||||
Copy directory `json` to `~/.cache/rivista/`.
|
|
||||||
|
|
||||||
### Start
|
### Start
|
||||||
|
|
||||||
```
|
```
|
||||||
$ rivista
|
$ rivista
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Open URL http://localhost:8000
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
It is possible to view a complete node and even a single item, which means, that
|
It is possible to view a complete node and even a single item, which means, that
|
||||||
|
|
|
@ -37,6 +37,7 @@ keywords = [
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"beautifulsoup4",
|
"beautifulsoup4",
|
||||||
"fastapi",
|
"fastapi",
|
||||||
|
"gmcapsule",
|
||||||
"lxml",
|
"lxml",
|
||||||
"markdown",
|
"markdown",
|
||||||
# "markdown-text-clean",
|
# "markdown-text-clean",
|
||||||
|
@ -59,4 +60,4 @@ rivista = "rivista.__main__:main"
|
||||||
platforms = ["any"]
|
platforms = ["any"]
|
||||||
|
|
||||||
[tool.setuptools.package-data]
|
[tool.setuptools.package-data]
|
||||||
"*" = ["*.toml"]
|
"*" = ["*.css", "*.js", "*.ico", "*.png", "*.svg", "*.toml", "*.xsl"]
|
||||||
|
|
|
@ -3,12 +3,112 @@
|
||||||
|
|
||||||
#import importlib.resources
|
#import importlib.resources
|
||||||
|
|
||||||
|
import os
|
||||||
|
from rivista.config import Cache, Data, Settings
|
||||||
|
from rivista.utilities import Toml
|
||||||
from rivista.http.instance import HttpInstance
|
from rivista.http.instance import HttpInstance
|
||||||
|
import shutil
|
||||||
import uvicorn
|
import uvicorn
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
http_instance = HttpInstance()
|
http_instance = HttpInstance()
|
||||||
return http_instance.app
|
return http_instance.app
|
||||||
|
|
||||||
|
if __name__ == 'rivista.__main__':
|
||||||
|
|
||||||
|
directory = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
# Copy data files
|
||||||
|
# FIXME File settins.toml is copied too.
|
||||||
|
directory_data = Data.get_directory()
|
||||||
|
if not os.path.exists(directory_data):
|
||||||
|
directory_assets = os.path.join(directory, 'assets')
|
||||||
|
directory_assets_new = shutil.copytree(directory_assets, directory_data)
|
||||||
|
print(f'Data directory {directory_assets_new} has been created and populated.')
|
||||||
|
|
||||||
|
# Copy settings files
|
||||||
|
directory_settings = Settings.get_directory()
|
||||||
|
if not os.path.exists(directory_settings):
|
||||||
|
directory_configs = os.path.join(directory, 'configs')
|
||||||
|
directory_settings_new = shutil.copytree(directory_configs, directory_settings)
|
||||||
|
print(f'Settings directory {directory_settings_new} has been created and populated.')
|
||||||
|
|
||||||
|
# Create cache directories
|
||||||
|
directory_cache = Cache.get_directory()
|
||||||
|
if not os.path.exists(directory_cache):
|
||||||
|
print(f'Creating a cache directory at {directory_cache}.')
|
||||||
|
os.mkdir(directory_cache)
|
||||||
|
# TODO Add more cache directories (see JabberCard).
|
||||||
|
# TODO Remove json (indices is the new name)
|
||||||
|
for subdirectory in ('json', 'indices', 'pubsub'):
|
||||||
|
subdirectory_cache = os.path.join(directory_cache, subdirectory)
|
||||||
|
if not os.path.exists(subdirectory_cache):
|
||||||
|
print(f'Creating a cache subdirectory at {subdirectory_cache}.')
|
||||||
|
os.mkdir(subdirectory_cache)
|
||||||
|
|
||||||
|
# Configure settings file
|
||||||
|
file_settings = os.path.join(directory_settings, 'settings.toml')
|
||||||
|
if not os.path.exists(file_settings):
|
||||||
|
directory_configs = os.path.join(directory, 'configs')
|
||||||
|
file_settings_empty = os.path.join(directory_configs, 'settings.toml')
|
||||||
|
shutil.copyfile(file_settings_empty, file_settings)
|
||||||
|
data_settings = Toml.open_file_toml(file_settings)
|
||||||
|
|
||||||
|
# Configure account
|
||||||
|
data_settings_account = data_settings['account']
|
||||||
|
|
||||||
|
settings_account = {
|
||||||
|
'xmpp': 'Set a Jabber ID',
|
||||||
|
'pass': 'Input Password'
|
||||||
|
}
|
||||||
|
|
||||||
|
for key in settings_account:
|
||||||
|
data_settings_account_value = data_settings_account[key]
|
||||||
|
if not data_settings_account_value:
|
||||||
|
settings_account_message = settings_account[key]
|
||||||
|
while not data_settings_account_value:
|
||||||
|
data_settings_account_value = input(f'{settings_account_message}: ')
|
||||||
|
data_settings_account[key] = data_settings_account_value
|
||||||
|
|
||||||
|
# Configure default PubSub Service and Node Name
|
||||||
|
data_settings_default = data_settings['default']
|
||||||
|
|
||||||
|
settings_default_default = {
|
||||||
|
'pubsub': 'pubsub.woodpeckersnest.space',
|
||||||
|
'nodeid': 'PlanetJabber'
|
||||||
|
}
|
||||||
|
|
||||||
|
for key in settings_default_default:
|
||||||
|
data_settings_default_value = data_settings_default[key]
|
||||||
|
if not data_settings_default_value:
|
||||||
|
settings_default_default_value = settings_default_default[key]
|
||||||
|
data_settings_default_value = input(f'Set brand {key} (default: "{settings_default_default_value}"): ')
|
||||||
|
if not data_settings_default_value: data_settings_default_value = settings_default_default_value
|
||||||
|
data_settings_default[key] = data_settings_default_value
|
||||||
|
|
||||||
|
# Configure Settings
|
||||||
|
data_settings_settings = data_settings['settings']
|
||||||
|
|
||||||
|
data_settings_settings_service = data_settings_settings['service']
|
||||||
|
if data_settings_settings_service is '':
|
||||||
|
while data_settings_settings_service not in ('n', 'N', 'no', 'No', 'y', 'Y', 'yes', 'Yes'):
|
||||||
|
data_settings_settings_service = input(f'Run as service? [Y/n] ')
|
||||||
|
if data_settings_settings_service in ('y', 'Y', 'yes', 'Yes'):
|
||||||
|
data_settings_settings['service'] = 1
|
||||||
|
else:
|
||||||
|
data_settings_settings['service'] = 0
|
||||||
|
|
||||||
|
data_settings_settings_include = data_settings_settings['include']
|
||||||
|
if data_settings_settings_include is '':
|
||||||
|
data_settings_settings_include = input(f'Limit service to included domains? (comma separated. remain empty for no limit) ')
|
||||||
|
data_settings_settings['include'] = data_settings_settings_include if data_settings_settings_include else 0
|
||||||
|
|
||||||
|
data_settings_settings_operator = data_settings_settings['operator']
|
||||||
|
if data_settings_settings_operator is '':
|
||||||
|
data_settings_settings['operator'] = input(f'Set a Jabber ID of an operator to contact with: ')
|
||||||
|
|
||||||
|
Toml.save_to_toml(file_settings, data_settings)
|
||||||
|
|
||||||
|
# Start JabberCard
|
||||||
app = main()
|
app = main()
|
||||||
uvicorn.run(app, host='localhost', port=8000, reload=False)
|
uvicorn.run(app, host='localhost', port=8000, reload=False)
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
This directory caches lists of PubSub nodes.
|
|
|
@ -239,7 +239,7 @@ window.onload = async function(){
|
||||||
elementDiv.appendChild(elementP2);
|
elementDiv.appendChild(elementP2);
|
||||||
let elementSpan = document.createElement('span');
|
let elementSpan = document.createElement('span');
|
||||||
elementSpan.id = 'return';
|
elementSpan.id = 'return';
|
||||||
elementSpan.textContent = 'Return';
|
elementSpan.textContent = 'Continue Reading';
|
||||||
elementSpan.addEventListener ('click', function() {
|
elementSpan.addEventListener ('click', function() {
|
||||||
document.querySelector('#selection-page').remove();
|
document.querySelector('#selection-page').remove();
|
||||||
});
|
});
|
||||||
|
|
|
@ -5,11 +5,11 @@ pass = "" # Password.
|
||||||
|
|
||||||
# A default node, when no arguments are set.
|
# A default node, when no arguments are set.
|
||||||
[default]
|
[default]
|
||||||
pubsub = "pubsub.woodpeckersnest.space" # Jabber ID.
|
pubsub = "" # Jabber ID.
|
||||||
nodeid = "PlanetJabber" # Node ID.
|
nodeid = "" # Node ID.
|
||||||
|
|
||||||
# Settings
|
# Settings
|
||||||
[settings]
|
[settings]
|
||||||
service = 1 # Enable server as a service.
|
service = "" # Enable server as a service.
|
||||||
include = "" # Limit service to a given domain.
|
include = "" # Limit service to a given domain.
|
||||||
operator = "" # A Jabber ID to contact with, in case of an error.
|
operator = "" # A Jabber ID to contact with, in case of an error.
|
22
rivista/utilities.py
Normal file
22
rivista/utilities.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import tomli_w
|
||||||
|
|
||||||
|
try:
|
||||||
|
import tomllib
|
||||||
|
except:
|
||||||
|
import tomli as tomllib
|
||||||
|
|
||||||
|
|
||||||
|
class Toml:
|
||||||
|
|
||||||
|
def open_file_toml(filename: str) -> dict:
|
||||||
|
with open(filename, mode="rb") as fn:
|
||||||
|
data = tomllib.load(fn)
|
||||||
|
return data
|
||||||
|
|
||||||
|
def save_to_toml(filename: str, data: dict) -> None:
|
||||||
|
with open(filename, 'w') as fn:
|
||||||
|
data_as_string = tomli_w.dumps(data)
|
||||||
|
fn.write(data_as_string)
|
|
@ -1,2 +1,2 @@
|
||||||
__version__ = '1.0'
|
__version__ = '0.1'
|
||||||
__version_info__ = (1, 0)
|
__version_info__ = (0, 1)
|
||||||
|
|
Loading…
Reference in a new issue