Compare commits

...

10 Commits

Author SHA1 Message Date
1e62814108 Add note and drop logging [ci skip] 2021-06-16 20:47:55 +02:00
bc7f51098e Fix bad typo
All checks were successful
continuous-integration/drone/push Build is passing
2021-06-16 17:04:41 +02:00
6256260057 Ignore test files
All checks were successful
continuous-integration/drone/push Build is passing
2021-06-16 17:02:46 +02:00
f677e27282 Attempt to log more and find correct paths 2021-06-16 17:02:34 +02:00
c1b25603a8 Ignore more stuff 2021-06-16 17:02:29 +02:00
f66c2e0396 More info from the script 2021-06-16 17:02:23 +02:00
b61342b576 Fix logging
All checks were successful
continuous-integration/drone/push Build is passing
2021-06-16 16:14:07 +02:00
0aa5c1b625 Pass env vars, push does build now 2021-06-16 15:54:32 +02:00
5b4fe5fc54 Support shares from NC side
All checks were successful
continuous-integration/drone/push Build is passing
2021-06-16 15:26:04 +02:00
f84c65fab8 Use patched pyocclient 2021-06-16 15:03:05 +02:00
11 changed files with 88 additions and 8 deletions

View File

@ -1,4 +1,5 @@
.envrc
.git
.mypy_cache
.venv
__pycache__
.mypy_cache

View File

@ -2,9 +2,13 @@
export MASTODON_ACCESS_TOKEN=foobar
export MASTODON_API_BASE_URL=social.lumbung.space
export APP_LOG_LEVEL=info
export NEXTCLOUD_API_BASE_URL=cloud.lumbung.space
export NEXTCLOUD_USER=decentral1se
export NEXTCLOUD_APP_PASSWORD=barfoo
# Deployment
export STACK_NAME=publish_lumbung_space
export DOMAIN=publish.lumbung.space
export ENTRYPOINT_CONF_VERSION=v1
export SECRET_MASTODON_ACCESS_TOKEN=v1
export SECRET_NEXTCLOUD_APP_PASSWORD=v1

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
*.pyc
/__pycache__/
test.py

View File

@ -1,5 +1,11 @@
# pubspace
> **WARNING**: this was an experimental prototype to understand if an
> "always-on" intermediary service could facilitate digital publishing
> practices in the lumbung.space. We have since moved to the idea of a
> slow and not real-time mode of publishing which will happen in another
> repository.
[![Build Status](https://drone.autonomic.zone/api/badges/ruangrupa/pubspace/status.svg?ref=refs/heads/main)](https://drone.autonomic.zone/ruangrupa/pubspace)
A service to facilitate collective digital publishing practices.
@ -44,6 +50,7 @@ to generate a share for that file. The Nextcloud crontab runs the script.
```
$ printf $YOURMASTODONACCESSTOKEN | docker secret create publish_lumbung_space_access_token_v1 -
$ printf $YOURNEXTCLOUDAPPPASSWORD | docker secret create publish_lumbung_space_app_password_v1 -
$ cp .env.sample .env # and update the values to match the environment
$ set -a && source .env && set +a
$ docker stack deploy -c compose.yml publish_lumbung_space

View File

@ -5,11 +5,15 @@ services:
app:
image: "decentral1se/pubspace:latest"
environment:
- APP_LOG_LEVEL
- MASTODON_ACCESS_TOKEN_FILE=/run/secrets/access_token
- MASTODON_API_BASE_URL
- APP_LOG_LEVEL
- NEXTCLOUD_API_BASE_URL
- NEXTCLOUD_APP_PASSWORD_FILE=/run/secrets/app_password
- NEXTCLOUD_USER
secrets:
- access_token
- app_password
networks:
- proxy
configs:
@ -50,3 +54,6 @@ secrets:
access_token:
external: true
name: ${STACK_NAME}_access_token_${SECRET_MASTODON_ACCESS_TOKEN}
app_password:
external: true
name: ${STACK_NAME}_app_password_${SECRET_NEXTCLOUD_APP_PASSWORD}

View File

@ -24,6 +24,7 @@ file_env() {
}
file_env "MASTODON_ACCESS_TOKEN"
file_env "NEXTCLOUD_APP_PASSWORD"
echo "Passing it back to the upstream ENTRYPOINT/CMD..."
exec "$@"

View File

@ -12,5 +12,5 @@ run:
build:
@docker build -t decentral1se/pubspace .
push:
push: build
@docker push decentral1se/pubspace

22
poetry.lock generated
View File

@ -258,6 +258,25 @@ category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[[package]]
name = "pyocclient"
version = "0.4"
description = ""
category = "main"
optional = false
python-versions = "*"
develop = false
[package.dependencies]
requests = ">=2.0.1"
six = "*"
[package.source]
type = "git"
url = "https://github.com/decentral1se/pyocclient.git"
reference = "patched-madcap-branch"
resolved_reference = "be63a32f520b887948f20ae57ca887d85555f720"
[[package]]
name = "python-dateutil"
version = "2.8.1"
@ -433,7 +452,7 @@ python-versions = ">=3.6.1"
[metadata]
lock-version = "1.1"
python-versions = "^3.9"
content-hash = "85c658e333aaf6d368f65e4fdaec48b721db82160dc31f5bdadfad7d3ca36da0"
content-hash = "2f8f656acf6e4dca956d207427e94a3d7ab2054ec1109e52ee895e5fe833215d"
[metadata.files]
appdirs = [
@ -582,6 +601,7 @@ pyflakes = [
{file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"},
{file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"},
]
pyocclient = []
python-dateutil = [
{file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"},
{file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"},

View File

@ -1,12 +1,18 @@
import logging
from os import environ
from os.path import basename
import owncloud
from fastapi import FastAPI, Request
from mastodon import Mastodon, StreamListener
MASTODON_ACCESS_TOKEN = environ.get("MASTODON_ACCESS_TOKEN")
MASTODON_API_BASE_URL = environ.get("MASTODON_API_BASE_URL")
NEXTCLOUD_API_BASE_URL = environ.get("NEXTCLOUD_API_BASE_URL")
NEXTCLOUD_USER = environ.get("NEXTCLOUD_USER")
NEXTCLOUD_APP_PASSWORD = environ.get("NEXTCLOUD_APP_PASSWORD")
APP_LOG_LEVEL = environ.get("APP_LOG_LEVEL")
if APP_LOG_LEVEL == "info":
APP_LOG_LEVEL = logging.INFO
@ -19,6 +25,7 @@ mastodon = Mastodon(
access_token=MASTODON_ACCESS_TOKEN,
api_base_url=f"https://{MASTODON_API_BASE_URL}",
)
nextcloud = owncloud.Client(f"https://{NEXTCLOUD_API_BASE_URL}")
log = logging.getLogger("uvicorn")
log.setLevel(APP_LOG_LEVEL)
@ -33,14 +40,40 @@ class PubspaceListener(StreamListener):
mastodon.stream_hashtag("pubspace", PubspaceListener(), run_async=True)
nextcloud.login(NEXTCLOUD_USER, NEXTCLOUD_APP_PASSWORD)
def create_share(fpath):
fname = basname(fpath)
fpaths = nextcloud.list("/", depth="infinity")
matching = [f.path for f in fpaths if fname in f.path][0]
if not nextcloud.is_shared(matching):
info = nextcloud.share_file_with_link(matching)
return info.get_link()
return None
@app.get("/")
async def home(request: Request):
try:
app.state.log.info(await request.json())
payload = await request.json()
except Exception:
return {}
request.app.state.log.info("Unable to parse request, bailing out")
return {"detail": "unknown request"}
request.app.state.log.info(f"Received: {payload}")
try:
file = payload["rel_path"]
link = create_share(file)
except Exception:
request.app.state.log.info(f"Failed to share {file}")
return {"detail": "failed to create share"}
if link:
request.app.state.log.info(f"Shared {file} on {link}")
else:
request.app.state.log.info(f"{file} already shared or failure!")
@app.get("/healthz")

View File

@ -1,9 +1,14 @@
#!/bin/bash
FILE="$1"
set -e
ACTORS_USER_ID="$1"
OWNER_USER_ID="$2"
NEXTCLOUD_RELATIVE_PATH="$3"
LOCALLY_AVAILABLE_FILE="$4"
/usr/bin/curl \
-H "Content-Type: application/json" \
-X GET \
-d "{\"file\":\"${FILE}\"}" \
-d "{\"actor_id\":\"${ACTORS_USER_ID}\", \"owner_id\":\"${OWNER_USER_ID}\", \"rel_path\":\"${NEXTCLOUD_RELATIVE_PATH}\", \"local_path\":\"${LOCALLY_AVAILABLE_PATH}\"}" \
https://publish.lumbung.space

View File

@ -10,6 +10,7 @@ python = "^3.9"
fastapi = "^0.65.2"
uvicorn = {extras = ["standard"], version = "^0.14.0"}
"Mastodon.py" = "^1.5.1"
pyocclient = { git = "https://github.com/decentral1se/pyocclient.git", branch = "patched-madcap-branch" }
[tool.poetry.dev-dependencies]
black = "^21.6b0"