Source code for nefelibata.publishers.ipfs
import logging
import re
import subprocess
import urllib.parse
from pathlib import Path
from typing import Any
from typing import Dict
from typing import Optional
import requests
from nefelibata.publishers import Publisher
_logger = logging.getLogger(__name__)
[docs]class IPFSPublisher(Publisher):
"""A publisher that uploads the weblog to IPFS through a remote host."""
def __init__(
self,
root: Path,
config: Dict[str, Any],
username: Optional[str] = None,
host: Optional[str] = None,
):
super().__init__(root, config)
self.username = username
self.host = host
[docs] def publish(self, force: bool = False) -> None:
build_dir = self.root / "build"
remote_dir = urllib.parse.urlparse(self.config["url"]).netloc
_logger.info("Syncing content")
subprocess.run(
[
"rsync",
"-rL",
str(build_dir) + "/", # ensure trailing slash for rsync
f"{self.username}@{self.host}:{remote_dir}/",
],
)
_logger.info("Adding to IPFS")
output = subprocess.check_output(
["ssh", f"{self.username}@{self.host}", "ipfs", "add", "-r", remote_dir],
text=True,
)
for line in output.split("\n"):
match = re.match(f"^added (\\w+) {remote_dir}$", line)
if match:
new_hash = match.group(1)
break
else:
_logger.error("Couldn't find hash for blog directory!")
return
_logger.info("Publishing to ipns")
subprocess.run(
[
"ssh",
f"{self.username}@{self.host}",
"ipfs",
"name",
"publish",
new_hash,
],
)
# update last published
last_published_file = self.root / "last_published"
last_published_file.touch()